From 82b61a6063676ea047b65fb60eba0fdbf2ffb7b5 Mon Sep 17 00:00:00 2001 From: shehab khaled <89648315+shehab299@users.noreply.github.com> Date: Thu, 22 Aug 2024 11:50:12 +0300 Subject: [PATCH] Fix publishing github workflow and remove the static site generated from the root branch (#3) --- docs/.nojekyll | 0 docs/404.html | 181 - docs/about/index.html | 245 -- docs/community/index.html | 322 -- docs/contributing/index.html | 406 -- .../faust/aanl.lib/1.3.0/doc/index.html | 665 ---- .../faust/aanl.lib/overview/index.html | 199 - .../faust/all.lib/1.0.0/doc/index.html | 195 - .../faust/all.lib/overview/index.html | 199 - .../faust/analyzers.lib/1.2.0/doc/index.html | 777 ---- .../faust/analyzers.lib/overview/index.html | 199 - .../faust/basics.lib/1.19.1/doc/index.html | 2038 ---------- .../faust/basics.lib/overview/index.html | 199 - .../compressors.lib/1.6.0/doc/index.html | 1222 ------ .../faust/compressors.lib/overview/index.html | 199 - .../faust/delays.lib/1.1.0/doc/index.html | 358 -- .../faust/delays.lib/overview/index.html | 199 - .../faust/demos.lib/1.2.0/doc/index.html | 689 ---- .../faust/demos.lib/overview/index.html | 199 - .../faust/dx7.lib/1.1.0/doc/index.html | 425 -- .../faust/dx7.lib/overview/index.html | 199 - .../faust/envelopes.lib/1.3.0/doc/index.html | 490 --- .../faust/envelopes.lib/overview/index.html | 199 - .../faust/fds.lib/1.1.0/doc/index.html | 604 --- .../faust/fds.lib/overview/index.html | 199 - .../faust/filters.lib/1.3.0/doc/index.html | 2157 ---------- .../faust/filters.lib/overview/index.html | 199 - .../faust/hoa.lib/1.4.0/doc/index.html | 758 ---- .../faust/hoa.lib/overview/index.html | 199 - .../instruments.lib/1.0.0/doc/index.html | 372 -- .../faust/instruments.lib/overview/index.html | 199 - .../interpolators.lib/1.3.1/doc/index.html | 614 --- .../interpolators.lib/overview/index.html | 199 - .../faust/maths.lib/2.8.0/doc/index.html | 816 ---- .../faust/maths.lib/overview/index.html | 199 - .../faust/maxmsp.lib/1.1.0/doc/index.html | 198 - .../faust/maxmsp.lib/overview/index.html | 199 - .../faust/mi.lib/1.1.0/doc/index.html | 564 --- .../faust/mi.lib/overview/index.html | 199 - .../misceffects.lib/2.5.0/doc/index.html | 755 ---- .../faust/misceffects.lib/overview/index.html | 199 - .../faust/noises.lib/1.4.1/doc/index.html | 489 --- .../faust/noises.lib/overview/index.html | 199 - .../oscillators.lib/1.5.1/doc/index.html | 1576 -------- .../faust/oscillators.lib/overview/index.html | 199 - docs/contributors/faust/overview/index.html | 401 -- .../phaflangers.lib/1.1.0/doc/index.html | 311 -- .../faust/phaflangers.lib/overview/index.html | 199 - .../faust/physmodels.lib/1.1.0/doc/index.html | 2806 ------------- .../faust/physmodels.lib/overview/index.html | 199 - .../faust/platform.lib/1.3.0/doc/index.html | 225 -- .../faust/platform.lib/overview/index.html | 199 - .../faust/quantizers.lib/1.1.0/doc/index.html | 418 -- .../faust/quantizers.lib/overview/index.html | 199 - .../faust/reducemaps.lib/1.2.0/doc/index.html | 325 -- .../faust/reducemaps.lib/overview/index.html | 199 - .../faust/reverbs.lib/1.3.0/doc/index.html | 518 --- .../faust/reverbs.lib/overview/index.html | 199 - .../faust/routes.lib/1.2.0/doc/index.html | 372 -- .../faust/routes.lib/overview/index.html | 199 - .../faust/sf.lib/1.0.0/doc/index.html | 208 - .../faust/sf.lib/overview/index.html | 199 - .../faust/signals.lib/1.6.0/doc/index.html | 617 --- .../faust/signals.lib/overview/index.html | 199 - .../faust/soundfiles.lib/1.7.0/doc/index.html | 254 -- .../faust/soundfiles.lib/overview/index.html | 199 - .../faust/spats.lib/1.1.0/doc/index.html | 264 -- .../faust/spats.lib/overview/index.html | 199 - .../faust/stdfaust.lib/1.0.0/doc/index.html | 195 - .../faust/stdfaust.lib/overview/index.html | 199 - .../faust/synths.lib/1.1.0/doc/index.html | 388 -- .../faust/synths.lib/overview/index.html | 199 - .../tonestacks.lib/1.28.0/doc/index.html | 188 - .../faust/tonestacks.lib/overview/index.html | 199 - .../faust/tubes.lib/1.0.0/doc/index.html | 188 - .../faust/tubes.lib/overview/index.html | 199 - .../faust/vaeffects.lib/1.2.1/doc/index.html | 721 ---- .../faust/vaeffects.lib/overview/index.html | 199 - .../faust/version.lib/1.0.0/doc/index.html | 208 - .../faust/version.lib/overview/index.html | 199 - .../faust/wdmodels.lib/1.2.1/doc/index.html | 1357 ------- .../faust/wdmodels.lib/overview/index.html | 199 - .../faust/webaudio.lib/1.1.0/doc/index.html | 366 -- .../faust/webaudio.lib/overview/index.html | 199 - docs/css/base.css | 366 -- docs/css/bootstrap.min.css | 12 - docs/css/bootstrap.min.css.map | 1 - docs/css/brands.min.css | 6 - docs/css/extra.css | 11 - docs/css/fontawesome.min.css | 9 - docs/css/solid.min.css | 6 - docs/css/v4-font-face.min.css | 6 - docs/img/favicon.ico | Bin 1150 -> 0 bytes docs/img/grid.png | Bin 1458 -> 0 bytes docs/index.html | 270 -- docs/js/base.js | 278 -- docs/js/bootstrap.bundle.min.js | 7 - docs/js/bootstrap.bundle.min.js.map | 1 - docs/js/darkmode.js | 65 - docs/libs/aanl/index.html | 665 ---- docs/libs/analyzers/index.html | 777 ---- docs/libs/basics/index.html | 2038 ---------- docs/libs/compressors/index.html | 1222 ------ docs/libs/delays/index.html | 358 -- docs/libs/demos/index.html | 689 ---- docs/libs/dx7/index.html | 425 -- docs/libs/envelopes/index.html | 490 --- docs/libs/fds/index.html | 604 --- docs/libs/filters/index.html | 2157 ---------- docs/libs/hoa/index.html | 758 ---- docs/libs/index.html | 1242 ------ docs/libs/interpolators/index.html | 614 --- docs/libs/maths/index.html | 816 ---- docs/libs/mi/index.html | 564 --- docs/libs/misceffects/index.html | 755 ---- docs/libs/noises/index.html | 489 --- docs/libs/oscillators/index.html | 1576 -------- docs/libs/phaflangers/index.html | 311 -- docs/libs/physmodels/index.html | 2806 ------------- docs/libs/quantizers/index.html | 418 -- docs/libs/reducemaps/index.html | 325 -- docs/libs/reverbs/index.html | 518 --- docs/libs/routes/index.html | 372 -- docs/libs/signals/index.html | 617 --- docs/libs/soundfiles/index.html | 254 -- docs/libs/spats/index.html | 264 -- docs/libs/synths/index.html | 388 -- docs/libs/vaeffects/index.html | 721 ---- docs/libs/version/index.html | 208 - docs/libs/wdmodels/index.html | 1357 ------- docs/libs/webaudio/index.html | 366 -- docs/organization/index.html | 254 -- docs/search/lunr.js | 3475 ----------------- docs/search/main.js | 109 - docs/search/search_index.json | 1 - docs/search/worker.js | 133 - docs/sitemap.xml | 3 - docs/sitemap.xml.gz | Bin 127 -> 0 bytes docs/standardFunctions/index.html | 853 ---- docs/webfonts/fa-brands-400.ttf | Bin 207972 -> 0 bytes docs/webfonts/fa-brands-400.woff2 | Bin 117372 -> 0 bytes docs/webfonts/fa-regular-400.ttf | Bin 68004 -> 0 bytes docs/webfonts/fa-regular-400.woff2 | Bin 25452 -> 0 bytes docs/webfonts/fa-solid-900.ttf | Bin 419720 -> 0 bytes docs/webfonts/fa-solid-900.woff2 | Bin 156496 -> 0 bytes docs/webfonts/fa-v4compatibility.ttf | Bin 10832 -> 0 bytes docs/webfonts/fa-v4compatibility.woff2 | Bin 4792 -> 0 bytes .../docs/contributors/docs/about/overview.md | 4 - .../contributors/docs/community/overview.md | 4 - .../docs/contributing/overview.md | 4 - .../docs/contributors/faust/doc.md | 0 .../docs/contributors/overview.md | 5 - .../docs/contributors/docs/css/overview.md | 4 - .../docs/contributors/docs/img/overview.md | 4 - .../doc/docs/contributors/docs/js/overview.md | 4 - .../docs/contributors/docs/libs/aanl/doc.md | 0 .../contributors/docs/libs/analyzers/doc.md | 0 .../docs/contributors/docs/libs/basics/doc.md | 0 .../contributors/docs/libs/compressors/doc.md | 0 .../docs/contributors/docs/libs/delays/doc.md | 0 .../docs/contributors/docs/libs/demos/doc.md | 0 .../docs/contributors/docs/libs/dx7/doc.md | 0 .../contributors/docs/libs/envelopes/doc.md | 0 .../docs/contributors/docs/libs/fds/doc.md | 0 .../contributors/docs/libs/filters/doc.md | 0 .../docs/contributors/docs/libs/hoa/doc.md | 0 .../docs/libs/interpolators/doc.md | 0 .../docs/contributors/docs/libs/maths/doc.md | 0 .../doc/docs/contributors/docs/libs/mi/doc.md | 0 .../contributors/docs/libs/misceffects/doc.md | 0 .../docs/contributors/docs/libs/noises/doc.md | 0 .../contributors/docs/libs/oscillators/doc.md | 0 .../docs/contributors/docs/libs/overview.md | 35 - .../contributors/docs/libs/phaflangers/doc.md | 0 .../contributors/docs/libs/physmodels/doc.md | 0 .../contributors/docs/libs/quantizers/doc.md | 0 .../contributors/docs/libs/reducemaps/doc.md | 0 .../contributors/docs/libs/reverbs/doc.md | 0 .../docs/contributors/docs/libs/routes/doc.md | 0 .../contributors/docs/libs/signals/doc.md | 0 .../contributors/docs/libs/soundfiles/doc.md | 0 .../docs/contributors/docs/libs/spats/doc.md | 0 .../docs/contributors/docs/libs/synths/doc.md | 0 .../contributors/docs/libs/vaeffects/doc.md | 0 .../contributors/docs/libs/version/doc.md | 0 .../contributors/docs/libs/wdmodels/doc.md | 0 .../contributors/docs/libs/webaudio/doc.md | 0 .../docs/organization/overview.md | 4 - .../doc/docs/contributors/docs/overview.md | 19 - .../docs/contributors/docs/search/overview.md | 4 - .../docs/standardFunctions/overview.md | 4 - .../contributors/docs/webfonts/overview.md | 4 - documentation/doc/mkdocs.yml | 3 +- documentation/doc/scripts/make_md.py | 8 +- documentation/docs/404.html | 181 - documentation/docs/about/index.html | 234 -- documentation/docs/community/index.html | 311 -- documentation/docs/contributing/index.html | 395 -- .../docs/about/overview/index.html | 193 - .../docs/community/overview/index.html | 193 - .../docs/contributing/overview/index.html | 193 - .../docs/contributors/faust/doc/index.html | 187 - .../docs/contributors/overview/index.html | 198 - .../contributors/docs/css/overview/index.html | 193 - .../contributors/docs/img/overview/index.html | 193 - .../contributors/docs/js/overview/index.html | 193 - .../docs/libs/aanl/doc/index.html | 187 - .../docs/libs/analyzers/doc/index.html | 187 - .../docs/libs/basics/doc/index.html | 187 - .../docs/libs/compressors/doc/index.html | 187 - .../docs/libs/delays/doc/index.html | 187 - .../docs/libs/demos/doc/index.html | 187 - .../contributors/docs/libs/dx7/doc/index.html | 187 - .../docs/libs/envelopes/doc/index.html | 187 - .../contributors/docs/libs/fds/doc/index.html | 187 - .../docs/libs/filters/doc/index.html | 187 - .../contributors/docs/libs/hoa/doc/index.html | 187 - .../docs/libs/interpolators/doc/index.html | 187 - .../docs/libs/maths/doc/index.html | 187 - .../contributors/docs/libs/mi/doc/index.html | 187 - .../docs/libs/misceffects/doc/index.html | 187 - .../docs/libs/noises/doc/index.html | 187 - .../docs/libs/oscillators/doc/index.html | 187 - .../docs/libs/overview/index.html | 348 -- .../docs/libs/phaflangers/doc/index.html | 187 - .../docs/libs/physmodels/doc/index.html | 187 - .../docs/libs/quantizers/doc/index.html | 187 - .../docs/libs/reducemaps/doc/index.html | 187 - .../docs/libs/reverbs/doc/index.html | 187 - .../docs/libs/routes/doc/index.html | 187 - .../docs/libs/signals/doc/index.html | 187 - .../docs/libs/soundfiles/doc/index.html | 187 - .../docs/libs/spats/doc/index.html | 187 - .../docs/libs/synths/doc/index.html | 187 - .../docs/libs/vaeffects/doc/index.html | 187 - .../docs/libs/version/doc/index.html | 187 - .../docs/libs/wdmodels/doc/index.html | 187 - .../docs/libs/webaudio/doc/index.html | 187 - .../docs/organization/overview/index.html | 193 - .../contributors/docs/overview/index.html | 255 -- .../docs/search/overview/index.html | 193 - .../standardFunctions/overview/index.html | 193 - .../docs/webfonts/overview/index.html | 193 - .../faust/aanl.lib/1.3.0/doc/index.html | 664 ---- .../faust/aanl.lib/overview/index.html | 198 - .../faust/all.lib/1.0.0/doc/index.html | 194 - .../faust/all.lib/overview/index.html | 198 - .../faust/analyzers.lib/1.2.0/doc/index.html | 776 ---- .../faust/analyzers.lib/overview/index.html | 198 - .../faust/basics.lib/1.19.1/doc/index.html | 2037 ---------- .../faust/basics.lib/overview/index.html | 198 - .../compressors.lib/1.6.0/doc/index.html | 1221 ------ .../faust/compressors.lib/overview/index.html | 198 - .../faust/delays.lib/1.1.0/doc/index.html | 357 -- .../faust/delays.lib/overview/index.html | 198 - .../faust/demos.lib/1.2.0/doc/index.html | 688 ---- .../faust/demos.lib/overview/index.html | 198 - .../faust/dx7.lib/1.1.0/doc/index.html | 424 -- .../faust/dx7.lib/overview/index.html | 198 - .../faust/envelopes.lib/1.3.0/doc/index.html | 489 --- .../faust/envelopes.lib/overview/index.html | 198 - .../faust/fds.lib/1.1.0/doc/index.html | 603 --- .../faust/fds.lib/overview/index.html | 198 - .../faust/filters.lib/1.3.0/doc/index.html | 2156 ---------- .../faust/filters.lib/overview/index.html | 198 - .../faust/hoa.lib/1.4.0/doc/index.html | 757 ---- .../faust/hoa.lib/overview/index.html | 198 - .../instruments.lib/1.0.0/doc/index.html | 371 -- .../faust/instruments.lib/overview/index.html | 198 - .../interpolators.lib/1.3.1/doc/index.html | 613 --- .../interpolators.lib/overview/index.html | 198 - .../faust/maths.lib/2.8.0/doc/index.html | 815 ---- .../faust/maths.lib/overview/index.html | 198 - .../faust/maxmsp.lib/1.1.0/doc/index.html | 197 - .../faust/maxmsp.lib/overview/index.html | 198 - .../faust/mi.lib/1.1.0/doc/index.html | 563 --- .../faust/mi.lib/overview/index.html | 198 - .../misceffects.lib/2.5.0/doc/index.html | 754 ---- .../faust/misceffects.lib/overview/index.html | 198 - .../faust/noises.lib/1.4.1/doc/index.html | 488 --- .../faust/noises.lib/overview/index.html | 198 - .../oscillators.lib/1.5.1/doc/index.html | 1575 -------- .../faust/oscillators.lib/overview/index.html | 198 - .../contributors/faust/overview/index.html | 390 -- .../phaflangers.lib/1.1.0/doc/index.html | 310 -- .../faust/phaflangers.lib/overview/index.html | 198 - .../faust/physmodels.lib/1.1.0/doc/index.html | 2805 ------------- .../faust/physmodels.lib/overview/index.html | 198 - .../faust/platform.lib/1.3.0/doc/index.html | 224 -- .../faust/platform.lib/overview/index.html | 198 - .../faust/quantizers.lib/1.1.0/doc/index.html | 417 -- .../faust/quantizers.lib/overview/index.html | 198 - .../faust/reducemaps.lib/1.2.0/doc/index.html | 324 -- .../faust/reducemaps.lib/overview/index.html | 198 - .../faust/reverbs.lib/1.3.0/doc/index.html | 517 --- .../faust/reverbs.lib/overview/index.html | 198 - .../faust/routes.lib/1.2.0/doc/index.html | 371 -- .../faust/routes.lib/overview/index.html | 198 - .../faust/sf.lib/1.0.0/doc/index.html | 207 - .../faust/sf.lib/overview/index.html | 198 - .../faust/signals.lib/1.6.0/doc/index.html | 616 --- .../faust/signals.lib/overview/index.html | 198 - .../faust/soundfiles.lib/1.7.0/doc/index.html | 253 -- .../faust/soundfiles.lib/overview/index.html | 198 - .../faust/spats.lib/1.1.0/doc/index.html | 263 -- .../faust/spats.lib/overview/index.html | 198 - .../faust/stdfaust.lib/1.0.0/doc/index.html | 194 - .../faust/stdfaust.lib/overview/index.html | 198 - .../faust/synths.lib/1.1.0/doc/index.html | 387 -- .../faust/synths.lib/overview/index.html | 198 - .../tonestacks.lib/1.28.0/doc/index.html | 187 - .../faust/tonestacks.lib/overview/index.html | 198 - .../faust/tubes.lib/1.0.0/doc/index.html | 187 - .../faust/tubes.lib/overview/index.html | 198 - .../faust/vaeffects.lib/1.2.1/doc/index.html | 720 ---- .../faust/vaeffects.lib/overview/index.html | 198 - .../faust/version.lib/1.0.0/doc/index.html | 207 - .../faust/version.lib/overview/index.html | 198 - .../faust/wdmodels.lib/1.2.1/doc/index.html | 1356 ------- .../faust/wdmodels.lib/overview/index.html | 198 - .../faust/webaudio.lib/1.1.0/doc/index.html | 365 -- .../faust/webaudio.lib/overview/index.html | 198 - documentation/docs/css/base.css | 408 -- documentation/docs/css/bootstrap.min.css | 12 - documentation/docs/css/bootstrap.min.css.map | 1 - documentation/docs/css/brands.min.css | 6 - documentation/docs/css/extra.css | 11 - documentation/docs/css/fontawesome.min.css | 9 - documentation/docs/css/solid.min.css | 6 - documentation/docs/css/v4-font-face.min.css | 6 - documentation/docs/img/faustCode.jpg | Bin 245809 -> 0 bytes documentation/docs/img/faustText.svg | 35 - documentation/docs/img/favicon.ico | Bin 1150 -> 0 bytes documentation/docs/img/grid.png | Bin 1458 -> 0 bytes documentation/docs/index.html | 269 -- documentation/docs/js/base.js | 278 -- documentation/docs/js/bootstrap.bundle.min.js | 7 - .../docs/js/bootstrap.bundle.min.js.map | 1 - documentation/docs/js/darkmode.js | 65 - documentation/docs/libs/aanl/index.html | 664 ---- documentation/docs/libs/analyzers/index.html | 776 ---- documentation/docs/libs/basics/index.html | 2037 ---------- .../docs/libs/compressors/index.html | 1221 ------ documentation/docs/libs/delays/index.html | 357 -- documentation/docs/libs/demos/index.html | 688 ---- documentation/docs/libs/dx7/index.html | 424 -- documentation/docs/libs/envelopes/index.html | 489 --- documentation/docs/libs/fds/index.html | 603 --- documentation/docs/libs/filters/index.html | 2156 ---------- documentation/docs/libs/hoa/index.html | 757 ---- documentation/docs/libs/index.html | 1231 ------ .../docs/libs/interpolators/index.html | 613 --- documentation/docs/libs/maths/index.html | 815 ---- documentation/docs/libs/mi/index.html | 563 --- .../docs/libs/misceffects/index.html | 754 ---- documentation/docs/libs/noises/index.html | 488 --- .../docs/libs/oscillators/index.html | 1575 -------- .../docs/libs/phaflangers/index.html | 310 -- documentation/docs/libs/physmodels/index.html | 2805 ------------- documentation/docs/libs/quantizers/index.html | 417 -- documentation/docs/libs/reducemaps/index.html | 324 -- documentation/docs/libs/reverbs/index.html | 517 --- documentation/docs/libs/routes/index.html | 371 -- documentation/docs/libs/signals/index.html | 616 --- documentation/docs/libs/soundfiles/index.html | 253 -- documentation/docs/libs/spats/index.html | 263 -- documentation/docs/libs/synths/index.html | 387 -- documentation/docs/libs/vaeffects/index.html | 720 ---- documentation/docs/libs/version/index.html | 207 - documentation/docs/libs/wdmodels/index.html | 1356 ------- documentation/docs/libs/webaudio/index.html | 365 -- documentation/docs/organization/index.html | 243 -- documentation/docs/search/lunr.js | 3475 ----------------- documentation/docs/search/main.js | 109 - documentation/docs/search/search_index.json | 1 - documentation/docs/search/worker.js | 133 - documentation/docs/sitemap.xml | 3 - documentation/docs/sitemap.xml.gz | Bin 127 -> 0 bytes .../docs/standardFunctions/index.html | 842 ---- documentation/docs/webfonts/fa-brands-400.ttf | Bin 207972 -> 0 bytes .../docs/webfonts/fa-brands-400.woff2 | Bin 117372 -> 0 bytes .../docs/webfonts/fa-regular-400.ttf | Bin 68004 -> 0 bytes .../docs/webfonts/fa-regular-400.woff2 | Bin 25452 -> 0 bytes documentation/docs/webfonts/fa-solid-900.ttf | Bin 419720 -> 0 bytes .../docs/webfonts/fa-solid-900.woff2 | Bin 156496 -> 0 bytes .../docs/webfonts/fa-v4compatibility.ttf | Bin 10832 -> 0 bytes .../docs/webfonts/fa-v4compatibility.woff2 | Bin 4792 -> 0 bytes 387 files changed, 8 insertions(+), 140781 deletions(-) delete mode 100644 docs/.nojekyll delete mode 100644 docs/404.html delete mode 100644 docs/about/index.html delete mode 100644 docs/community/index.html delete mode 100644 docs/contributing/index.html delete mode 100644 docs/contributors/faust/aanl.lib/1.3.0/doc/index.html delete mode 100644 docs/contributors/faust/aanl.lib/overview/index.html delete mode 100644 docs/contributors/faust/all.lib/1.0.0/doc/index.html delete mode 100644 docs/contributors/faust/all.lib/overview/index.html delete mode 100644 docs/contributors/faust/analyzers.lib/1.2.0/doc/index.html delete mode 100644 docs/contributors/faust/analyzers.lib/overview/index.html delete mode 100644 docs/contributors/faust/basics.lib/1.19.1/doc/index.html delete mode 100644 docs/contributors/faust/basics.lib/overview/index.html delete mode 100644 docs/contributors/faust/compressors.lib/1.6.0/doc/index.html delete mode 100644 docs/contributors/faust/compressors.lib/overview/index.html delete mode 100644 docs/contributors/faust/delays.lib/1.1.0/doc/index.html delete mode 100644 docs/contributors/faust/delays.lib/overview/index.html delete mode 100644 docs/contributors/faust/demos.lib/1.2.0/doc/index.html delete mode 100644 docs/contributors/faust/demos.lib/overview/index.html delete mode 100644 docs/contributors/faust/dx7.lib/1.1.0/doc/index.html delete mode 100644 docs/contributors/faust/dx7.lib/overview/index.html delete mode 100644 docs/contributors/faust/envelopes.lib/1.3.0/doc/index.html delete mode 100644 docs/contributors/faust/envelopes.lib/overview/index.html delete mode 100644 docs/contributors/faust/fds.lib/1.1.0/doc/index.html delete mode 100644 docs/contributors/faust/fds.lib/overview/index.html delete mode 100644 docs/contributors/faust/filters.lib/1.3.0/doc/index.html delete mode 100644 docs/contributors/faust/filters.lib/overview/index.html delete mode 100644 docs/contributors/faust/hoa.lib/1.4.0/doc/index.html delete mode 100644 docs/contributors/faust/hoa.lib/overview/index.html delete mode 100644 docs/contributors/faust/instruments.lib/1.0.0/doc/index.html delete mode 100644 docs/contributors/faust/instruments.lib/overview/index.html delete mode 100644 docs/contributors/faust/interpolators.lib/1.3.1/doc/index.html delete mode 100644 docs/contributors/faust/interpolators.lib/overview/index.html delete mode 100644 docs/contributors/faust/maths.lib/2.8.0/doc/index.html delete mode 100644 docs/contributors/faust/maths.lib/overview/index.html delete mode 100644 docs/contributors/faust/maxmsp.lib/1.1.0/doc/index.html delete mode 100644 docs/contributors/faust/maxmsp.lib/overview/index.html delete mode 100644 docs/contributors/faust/mi.lib/1.1.0/doc/index.html delete mode 100644 docs/contributors/faust/mi.lib/overview/index.html delete mode 100644 docs/contributors/faust/misceffects.lib/2.5.0/doc/index.html delete mode 100644 docs/contributors/faust/misceffects.lib/overview/index.html delete mode 100644 docs/contributors/faust/noises.lib/1.4.1/doc/index.html delete mode 100644 docs/contributors/faust/noises.lib/overview/index.html delete mode 100644 docs/contributors/faust/oscillators.lib/1.5.1/doc/index.html delete mode 100644 docs/contributors/faust/oscillators.lib/overview/index.html delete mode 100644 docs/contributors/faust/overview/index.html delete mode 100644 docs/contributors/faust/phaflangers.lib/1.1.0/doc/index.html delete mode 100644 docs/contributors/faust/phaflangers.lib/overview/index.html delete mode 100644 docs/contributors/faust/physmodels.lib/1.1.0/doc/index.html delete mode 100644 docs/contributors/faust/physmodels.lib/overview/index.html delete mode 100644 docs/contributors/faust/platform.lib/1.3.0/doc/index.html delete mode 100644 docs/contributors/faust/platform.lib/overview/index.html delete mode 100644 docs/contributors/faust/quantizers.lib/1.1.0/doc/index.html delete mode 100644 docs/contributors/faust/quantizers.lib/overview/index.html delete mode 100644 docs/contributors/faust/reducemaps.lib/1.2.0/doc/index.html delete mode 100644 docs/contributors/faust/reducemaps.lib/overview/index.html delete mode 100644 docs/contributors/faust/reverbs.lib/1.3.0/doc/index.html delete mode 100644 docs/contributors/faust/reverbs.lib/overview/index.html delete mode 100644 docs/contributors/faust/routes.lib/1.2.0/doc/index.html delete mode 100644 docs/contributors/faust/routes.lib/overview/index.html delete mode 100644 docs/contributors/faust/sf.lib/1.0.0/doc/index.html delete mode 100644 docs/contributors/faust/sf.lib/overview/index.html delete mode 100644 docs/contributors/faust/signals.lib/1.6.0/doc/index.html delete mode 100644 docs/contributors/faust/signals.lib/overview/index.html delete mode 100644 docs/contributors/faust/soundfiles.lib/1.7.0/doc/index.html delete mode 100644 docs/contributors/faust/soundfiles.lib/overview/index.html delete mode 100644 docs/contributors/faust/spats.lib/1.1.0/doc/index.html delete mode 100644 docs/contributors/faust/spats.lib/overview/index.html delete mode 100644 docs/contributors/faust/stdfaust.lib/1.0.0/doc/index.html delete mode 100644 docs/contributors/faust/stdfaust.lib/overview/index.html delete mode 100644 docs/contributors/faust/synths.lib/1.1.0/doc/index.html delete mode 100644 docs/contributors/faust/synths.lib/overview/index.html delete mode 100644 docs/contributors/faust/tonestacks.lib/1.28.0/doc/index.html delete mode 100644 docs/contributors/faust/tonestacks.lib/overview/index.html delete mode 100644 docs/contributors/faust/tubes.lib/1.0.0/doc/index.html delete mode 100644 docs/contributors/faust/tubes.lib/overview/index.html delete mode 100644 docs/contributors/faust/vaeffects.lib/1.2.1/doc/index.html delete mode 100644 docs/contributors/faust/vaeffects.lib/overview/index.html delete mode 100644 docs/contributors/faust/version.lib/1.0.0/doc/index.html delete mode 100644 docs/contributors/faust/version.lib/overview/index.html delete mode 100644 docs/contributors/faust/wdmodels.lib/1.2.1/doc/index.html delete mode 100644 docs/contributors/faust/wdmodels.lib/overview/index.html delete mode 100644 docs/contributors/faust/webaudio.lib/1.1.0/doc/index.html delete mode 100644 docs/contributors/faust/webaudio.lib/overview/index.html delete mode 100644 docs/css/base.css delete mode 100644 docs/css/bootstrap.min.css delete mode 100644 docs/css/bootstrap.min.css.map delete mode 100644 docs/css/brands.min.css delete mode 100644 docs/css/extra.css delete mode 100644 docs/css/fontawesome.min.css delete mode 100644 docs/css/solid.min.css delete mode 100644 docs/css/v4-font-face.min.css delete mode 100644 docs/img/favicon.ico delete mode 100644 docs/img/grid.png delete mode 100644 docs/index.html delete mode 100644 docs/js/base.js delete mode 100644 docs/js/bootstrap.bundle.min.js delete mode 100644 docs/js/bootstrap.bundle.min.js.map delete mode 100644 docs/js/darkmode.js delete mode 100644 docs/libs/aanl/index.html delete mode 100644 docs/libs/analyzers/index.html delete mode 100644 docs/libs/basics/index.html delete mode 100644 docs/libs/compressors/index.html delete mode 100644 docs/libs/delays/index.html delete mode 100644 docs/libs/demos/index.html delete mode 100644 docs/libs/dx7/index.html delete mode 100644 docs/libs/envelopes/index.html delete mode 100644 docs/libs/fds/index.html delete mode 100644 docs/libs/filters/index.html delete mode 100644 docs/libs/hoa/index.html delete mode 100644 docs/libs/index.html delete mode 100644 docs/libs/interpolators/index.html delete mode 100644 docs/libs/maths/index.html delete mode 100644 docs/libs/mi/index.html delete mode 100644 docs/libs/misceffects/index.html delete mode 100644 docs/libs/noises/index.html delete mode 100644 docs/libs/oscillators/index.html delete mode 100644 docs/libs/phaflangers/index.html delete mode 100644 docs/libs/physmodels/index.html delete mode 100644 docs/libs/quantizers/index.html delete mode 100644 docs/libs/reducemaps/index.html delete mode 100644 docs/libs/reverbs/index.html delete mode 100644 docs/libs/routes/index.html delete mode 100644 docs/libs/signals/index.html delete mode 100644 docs/libs/soundfiles/index.html delete mode 100644 docs/libs/spats/index.html delete mode 100644 docs/libs/synths/index.html delete mode 100644 docs/libs/vaeffects/index.html delete mode 100644 docs/libs/version/index.html delete mode 100644 docs/libs/wdmodels/index.html delete mode 100644 docs/libs/webaudio/index.html delete mode 100644 docs/organization/index.html delete mode 100644 docs/search/lunr.js delete mode 100644 docs/search/main.js delete mode 100644 docs/search/search_index.json delete mode 100644 docs/search/worker.js delete mode 100644 docs/sitemap.xml delete mode 100644 docs/sitemap.xml.gz delete mode 100644 docs/standardFunctions/index.html delete mode 100644 docs/webfonts/fa-brands-400.ttf delete mode 100644 docs/webfonts/fa-brands-400.woff2 delete mode 100644 docs/webfonts/fa-regular-400.ttf delete mode 100644 docs/webfonts/fa-regular-400.woff2 delete mode 100644 docs/webfonts/fa-solid-900.ttf delete mode 100644 docs/webfonts/fa-solid-900.woff2 delete mode 100644 docs/webfonts/fa-v4compatibility.ttf delete mode 100644 docs/webfonts/fa-v4compatibility.woff2 delete mode 100644 documentation/doc/docs/contributors/docs/about/overview.md delete mode 100644 documentation/doc/docs/contributors/docs/community/overview.md delete mode 100644 documentation/doc/docs/contributors/docs/contributing/overview.md delete mode 100644 documentation/doc/docs/contributors/docs/contributors/faust/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/contributors/overview.md delete mode 100644 documentation/doc/docs/contributors/docs/css/overview.md delete mode 100644 documentation/doc/docs/contributors/docs/img/overview.md delete mode 100644 documentation/doc/docs/contributors/docs/js/overview.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/aanl/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/analyzers/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/basics/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/compressors/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/delays/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/demos/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/dx7/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/envelopes/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/fds/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/filters/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/hoa/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/interpolators/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/maths/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/mi/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/misceffects/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/noises/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/oscillators/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/overview.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/phaflangers/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/physmodels/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/quantizers/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/reducemaps/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/reverbs/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/routes/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/signals/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/soundfiles/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/spats/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/synths/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/vaeffects/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/version/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/wdmodels/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/libs/webaudio/doc.md delete mode 100644 documentation/doc/docs/contributors/docs/organization/overview.md delete mode 100644 documentation/doc/docs/contributors/docs/overview.md delete mode 100644 documentation/doc/docs/contributors/docs/search/overview.md delete mode 100644 documentation/doc/docs/contributors/docs/standardFunctions/overview.md delete mode 100644 documentation/doc/docs/contributors/docs/webfonts/overview.md delete mode 100644 documentation/docs/404.html delete mode 100644 documentation/docs/about/index.html delete mode 100644 documentation/docs/community/index.html delete mode 100644 documentation/docs/contributing/index.html delete mode 100644 documentation/docs/contributors/docs/about/overview/index.html delete mode 100644 documentation/docs/contributors/docs/community/overview/index.html delete mode 100644 documentation/docs/contributors/docs/contributing/overview/index.html delete mode 100644 documentation/docs/contributors/docs/contributors/faust/doc/index.html delete mode 100644 documentation/docs/contributors/docs/contributors/overview/index.html delete mode 100644 documentation/docs/contributors/docs/css/overview/index.html delete mode 100644 documentation/docs/contributors/docs/img/overview/index.html delete mode 100644 documentation/docs/contributors/docs/js/overview/index.html delete mode 100644 documentation/docs/contributors/docs/libs/aanl/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/analyzers/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/basics/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/compressors/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/delays/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/demos/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/dx7/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/envelopes/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/fds/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/filters/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/hoa/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/interpolators/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/maths/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/mi/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/misceffects/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/noises/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/oscillators/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/overview/index.html delete mode 100644 documentation/docs/contributors/docs/libs/phaflangers/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/physmodels/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/quantizers/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/reducemaps/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/reverbs/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/routes/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/signals/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/soundfiles/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/spats/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/synths/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/vaeffects/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/version/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/wdmodels/doc/index.html delete mode 100644 documentation/docs/contributors/docs/libs/webaudio/doc/index.html delete mode 100644 documentation/docs/contributors/docs/organization/overview/index.html delete mode 100644 documentation/docs/contributors/docs/overview/index.html delete mode 100644 documentation/docs/contributors/docs/search/overview/index.html delete mode 100644 documentation/docs/contributors/docs/standardFunctions/overview/index.html delete mode 100644 documentation/docs/contributors/docs/webfonts/overview/index.html delete mode 100644 documentation/docs/contributors/faust/aanl.lib/1.3.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/aanl.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/all.lib/1.0.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/all.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/analyzers.lib/1.2.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/analyzers.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/basics.lib/1.19.1/doc/index.html delete mode 100644 documentation/docs/contributors/faust/basics.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/compressors.lib/1.6.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/compressors.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/delays.lib/1.1.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/delays.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/demos.lib/1.2.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/demos.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/dx7.lib/1.1.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/dx7.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/envelopes.lib/1.3.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/envelopes.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/fds.lib/1.1.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/fds.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/filters.lib/1.3.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/filters.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/hoa.lib/1.4.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/hoa.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/instruments.lib/1.0.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/instruments.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/interpolators.lib/1.3.1/doc/index.html delete mode 100644 documentation/docs/contributors/faust/interpolators.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/maths.lib/2.8.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/maths.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/maxmsp.lib/1.1.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/maxmsp.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/mi.lib/1.1.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/mi.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/misceffects.lib/2.5.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/misceffects.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/noises.lib/1.4.1/doc/index.html delete mode 100644 documentation/docs/contributors/faust/noises.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/oscillators.lib/1.5.1/doc/index.html delete mode 100644 documentation/docs/contributors/faust/oscillators.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/overview/index.html delete mode 100644 documentation/docs/contributors/faust/phaflangers.lib/1.1.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/phaflangers.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/physmodels.lib/1.1.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/physmodels.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/platform.lib/1.3.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/platform.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/quantizers.lib/1.1.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/quantizers.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/reducemaps.lib/1.2.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/reducemaps.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/reverbs.lib/1.3.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/reverbs.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/routes.lib/1.2.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/routes.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/sf.lib/1.0.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/sf.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/signals.lib/1.6.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/signals.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/soundfiles.lib/1.7.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/soundfiles.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/spats.lib/1.1.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/spats.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/stdfaust.lib/1.0.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/stdfaust.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/synths.lib/1.1.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/synths.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/tonestacks.lib/1.28.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/tonestacks.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/tubes.lib/1.0.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/tubes.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/vaeffects.lib/1.2.1/doc/index.html delete mode 100644 documentation/docs/contributors/faust/vaeffects.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/version.lib/1.0.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/version.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/wdmodels.lib/1.2.1/doc/index.html delete mode 100644 documentation/docs/contributors/faust/wdmodels.lib/overview/index.html delete mode 100644 documentation/docs/contributors/faust/webaudio.lib/1.1.0/doc/index.html delete mode 100644 documentation/docs/contributors/faust/webaudio.lib/overview/index.html delete mode 100644 documentation/docs/css/base.css delete mode 100644 documentation/docs/css/bootstrap.min.css delete mode 100644 documentation/docs/css/bootstrap.min.css.map delete mode 100644 documentation/docs/css/brands.min.css delete mode 100644 documentation/docs/css/extra.css delete mode 100644 documentation/docs/css/fontawesome.min.css delete mode 100644 documentation/docs/css/solid.min.css delete mode 100644 documentation/docs/css/v4-font-face.min.css delete mode 100644 documentation/docs/img/faustCode.jpg delete mode 100644 documentation/docs/img/faustText.svg delete mode 100644 documentation/docs/img/favicon.ico delete mode 100644 documentation/docs/img/grid.png delete mode 100644 documentation/docs/index.html delete mode 100644 documentation/docs/js/base.js delete mode 100644 documentation/docs/js/bootstrap.bundle.min.js delete mode 100644 documentation/docs/js/bootstrap.bundle.min.js.map delete mode 100644 documentation/docs/js/darkmode.js delete mode 100644 documentation/docs/libs/aanl/index.html delete mode 100644 documentation/docs/libs/analyzers/index.html delete mode 100644 documentation/docs/libs/basics/index.html delete mode 100644 documentation/docs/libs/compressors/index.html delete mode 100644 documentation/docs/libs/delays/index.html delete mode 100644 documentation/docs/libs/demos/index.html delete mode 100644 documentation/docs/libs/dx7/index.html delete mode 100644 documentation/docs/libs/envelopes/index.html delete mode 100644 documentation/docs/libs/fds/index.html delete mode 100644 documentation/docs/libs/filters/index.html delete mode 100644 documentation/docs/libs/hoa/index.html delete mode 100644 documentation/docs/libs/index.html delete mode 100644 documentation/docs/libs/interpolators/index.html delete mode 100644 documentation/docs/libs/maths/index.html delete mode 100644 documentation/docs/libs/mi/index.html delete mode 100644 documentation/docs/libs/misceffects/index.html delete mode 100644 documentation/docs/libs/noises/index.html delete mode 100644 documentation/docs/libs/oscillators/index.html delete mode 100644 documentation/docs/libs/phaflangers/index.html delete mode 100644 documentation/docs/libs/physmodels/index.html delete mode 100644 documentation/docs/libs/quantizers/index.html delete mode 100644 documentation/docs/libs/reducemaps/index.html delete mode 100644 documentation/docs/libs/reverbs/index.html delete mode 100644 documentation/docs/libs/routes/index.html delete mode 100644 documentation/docs/libs/signals/index.html delete mode 100644 documentation/docs/libs/soundfiles/index.html delete mode 100644 documentation/docs/libs/spats/index.html delete mode 100644 documentation/docs/libs/synths/index.html delete mode 100644 documentation/docs/libs/vaeffects/index.html delete mode 100644 documentation/docs/libs/version/index.html delete mode 100644 documentation/docs/libs/wdmodels/index.html delete mode 100644 documentation/docs/libs/webaudio/index.html delete mode 100644 documentation/docs/organization/index.html delete mode 100644 documentation/docs/search/lunr.js delete mode 100644 documentation/docs/search/main.js delete mode 100644 documentation/docs/search/search_index.json delete mode 100644 documentation/docs/search/worker.js delete mode 100644 documentation/docs/sitemap.xml delete mode 100644 documentation/docs/sitemap.xml.gz delete mode 100644 documentation/docs/standardFunctions/index.html delete mode 100644 documentation/docs/webfonts/fa-brands-400.ttf delete mode 100644 documentation/docs/webfonts/fa-brands-400.woff2 delete mode 100644 documentation/docs/webfonts/fa-regular-400.ttf delete mode 100644 documentation/docs/webfonts/fa-regular-400.woff2 delete mode 100644 documentation/docs/webfonts/fa-solid-900.ttf delete mode 100644 documentation/docs/webfonts/fa-solid-900.woff2 delete mode 100644 documentation/docs/webfonts/fa-v4compatibility.ttf delete mode 100644 documentation/docs/webfonts/fa-v4compatibility.woff2 diff --git a/docs/.nojekyll b/docs/.nojekyll deleted file mode 100644 index e69de29..0000000 diff --git a/docs/404.html b/docs/404.html deleted file mode 100644 index 439baf0..0000000 --- a/docs/404.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - Faust Libraries - - - - - - - - - - - - - - - - -
-
- -
-
-

404

-

Page not found

-
-
- - -
-
- - - - - - - - - - - - diff --git a/docs/about/index.html b/docs/about/index.html deleted file mode 100644 index bdb3269..0000000 --- a/docs/about/index.html +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - - - - - Copyright/License - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

The Faust Project

-

The Faust Project has started in 2002. It is actively developed by the GRAME-CNCM Research Department.

-

Many persons are contributing to the Faust project, by providing code for the -compiler, architecture files, libraries, examples, documentation, scripts, bug -reports, ideas, etc. We would like in particular to thank:

-
    -Fons Adriaensen, Karim Barkati, -Jérôme Barthélemy, Tim Blechmann, -Tiziano Bole, Alain Bonardi, -Thomas Charbonnel, Raffaele Ciavarella, -Julien Colafrancesco, Damien Cramet, -Sarah Denoux, Étienne Gaudrin, -Olivier Guillerminet, Pierre Guillot, -Albert Gräf, Pierre Jouvelot, -Stefan Kersten, Victor Lazzarini, -Matthieu Leberre, Mathieu Leroi, -Fernando Lopez-Lezcano, Kjetil Matheussen, -Hermann Meyer, Rémy Muller, -Raphael Panis, Eliott Paris, -Reza Payami, Laurent Pottier, -Sampo Savolainen, Nicolas Scaringella, -Anne Sedes, Priyanka Shekar, -Stephen Sinclair, Travis Skare, -Julius Smith, Mike Solomon, -Michael Wilson, Bart Brouns, Dirk Roosenburg, -Riccardo Russo. -
- -

as well as our colleagues at GRAME:

-
    -
  • Dominique Fober
  • -
  • Christophe Lebreton
  • -
  • Stéphane Letz
  • -
  • Romain Michon
  • -
  • Yann Orlarey
  • -
-

We would like also to thank for their financial support:

-
-
-
- - - - - - - - - - - - diff --git a/docs/community/index.html b/docs/community/index.html deleted file mode 100644 index 7938caa..0000000 --- a/docs/community/index.html +++ /dev/null @@ -1,322 +0,0 @@ - - - - - - - - - - - Community - Faust Libraries - - - - - - - - - - - - - - - - -
-
- -
- -

Libraries from the community

-

A lot of libraries have been developed by the community. They can be used when developing DSP programs:

-
    -
  • when used in Faust IDE, by adding them in the project files section
  • -
  • when used in a local Faust installation on macOS or Linux, by adding them in the /usr/share/faust, or /usr/local/share/faust folders
  • -
-

They are presented in the following sections.

-

abclib library

-

20 years of research, teaching and creation in mixed music using Faust language.

-

abclib library is released by the CICM / MUSIDANSE (Centre de Recherches Informatique et Création Musicale, Paris 8 University) and is the result of 20 years of research, teaching and creation in mixed music, expressed as a set of codes in Faust language. The main topics addressed are: spatial sound processing and synthesis using ambisonics, multi-channel sound processing, utility objects for mixed music.

-

Edge of Chaos

-

This repository contains libraries including some essential building blocks for the implementation of musical complex adaptive systems in Faust programming.

-

It includes a set of time-domain algorithms, some of which are original, for the processing of low-level and high-level information as well as the processing of sound using standard and non-conventional techniques. It also includes functions for the realisation of networks with different topologies, linear and nonlinear mapping strategies to render positive and negative feedback relationships, and different kinds of energy-preserving techniques for the stability of self-oscillating systems.

-

realfaust

-

This library contains a set of functions representing domain-limited versions of all Faust primitives and math functions that can potentially generate INF or NaN values. The goal of the library is to be able to implement DSP networks that, structurally, are free from INF and NaN values. Hence, the resulting programs should be rock-solid during real-time performance and virtually immune to crashes regardless of how mercilessly a network is modulated or how unstable a recursive system is made.

-

bitDSP-faust

-

BitDSP is a set of Faust library functions aimed to help explore and research artistic possibilities of bit-based algorithms. BitDSP currently includes implementations of bit-based functions ranging from simple bit operations over classic delta-sigma modulations to more experimental approaches like cellular automata, recursive Boolean networks, and linear feedback shift registers.

-

A detailed overview of the functionality is in the paper "Creative use of bit-stream DSP in Faust" presented at IFC 2020.

-

SEAM library

-

Sustained Electro-Acoustic Music is a project inspired by Alvise Vidolin and Nicola Bernardini. The SEAM libraries have been developed for this project.

-

Ambitools library

-

Ambitools is an implementation of several Ambisonic tools with the FAUST language. The code is designed to be scalable and flexible, offering tools working at various Ambisonic order and compiled for various architectures. The implementation of the spherical harmonics for an efficient computation is detailed. See the Ambitools : Tools For Sound Field Synthesis With Higher Order Ambisonic - V1.0 paper.

-

Faust Tap Library

-

Tap a complicated expression to pull out specific outputs, without having to manually route those outputs, just like how named function parameters remove the need to manually route inputs.

-

MoreFilters library

-

A Faust library implementing following highpass/lowpass filters using fi.svf:

-
    -
  • Biquad
  • -
  • Butterworth (2nd, 4th, 6th, 8th order)
  • -
  • Bessel (2nd, 4th, 6th, 8th order)
  • -
  • Linkwitz Riley (4th, 8th, 12th and 16th order)
  • -
-

Awesome library

-

Feel free to contribute by forking this project and creating a pull request, or by mailing the library description here.

-

Additional DSP resources

-

Heres is a list of additional DSP resources.

-

Granulation

- - -

Material in the abclib library

-
-
-
- - - - - - - - - - - - diff --git a/docs/contributing/index.html b/docs/contributing/index.html deleted file mode 100644 index f67204f..0000000 --- a/docs/contributing/index.html +++ /dev/null @@ -1,406 +0,0 @@ - - - - - - - - - - - Contributing - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

Contributing

-

In general, libraries are organised in a stacked manner: the base ones define functions or constants without any dependancies, and additional ones are gradually built on top of simpler ones, layer by layer. Dependency loops must be avoided as much as possible. The resources folder contains tools to build and visualise the libraries dependencies graphs.

-

If you wish to add a function to any of these libraries or if you plan to add a new library, make sure that you observe the following conventions:

-

New Functions

-
    -
  • All functions must be preceded by a markdown documentation header respecting the following format (open the source code of any of the libraries for an example):
  • -
-
//-----------------functionName--------------------
-// Description
-//
-// #### Usage
-//
-// ```
-// Usage Example
-// ```
-//
-// Where:
-//
-// * argument1: argument 1 description
-//-------------------------------------------------
-
-
    -
  • Every time a new function is added, the documentation should be updated simply by running make doclib.
  • -
  • The environment system (e.g. os.osc) should be used when calling a function declared in another library (see the section on Library Import).
  • -
  • Try to reuse existing functions as much as possible.
  • -
  • The Usage line must show the input/output shape (the number of inputs and outputs) of the function, like gen: _ for a mono generator, _ : filter : _ for a mono effect, etc.
  • -
  • Some functions use parameters that are constant numerical expressions. The convention is to label them in capital letters and document them preferably to be constant numerical expressions (or known at compile time in existing libraries).
  • -
  • Functions with several parameters should better be written by putting the more constant parameters (like control, setup...) at the beginning of the parameter list, and audio signals to be processed at the end. This allows to do partial-application. So prefer the following clip(low, high, x) = min(max(x, low), high); form where clip(-1, 1) partially applied version can be used later on in different contexts, better than clip(x, low, high) = min(max(x, low), high); version.
  • -
-

New Libraries

-
    -
  • Any new "standard" library should be declared in stdfaust.lib with its own environment (2 letters - see stdfaust.lib).
  • -
  • Any new "standard" library must be added to generateDoc.
  • -
  • Functions must be organized by sections.
  • -
  • Any new library should at least declare a name and a version.
  • -
  • Any new library has to use a prefix declared in the header section with the following kind of syntax: Its official prefix is 'qu' (look at an existing library to follow the exact syntax).
  • -
  • Be sure to add the appropriate kind of ma = library("maths.lib"); import library line, for each external library function used in the new library (for instance ma.foo that would be used somewhre in the code).
  • -
  • The comment based markdown documentation of each library must respect the following format (open the source code of any of the libraries for an example):
  • -
-
//############### libraryName ##################
-// Description
-//
-// * Section Name 1
-// * Section Name 2
-// * ...
-//
-// It should be used using the `[...]` environment:
-//
-// ```
-// [...] = library("libraryName");
-// process = [...].functionCall;
-// ```
-//
-// Another option is to import `stdfaust.lib` which already contains the `[...]`
-// environment:
-//
-// ```
-// import("stdfaust.lib");
-// process = [...].functionCall;
-// ```
-//##############################################
-
-//================= Section Name ===============
-// Description
-//==============================================
-
-

Coding Conventions

-

In order to have a uniformized library system, we established the following conventions (that hopefully will be followed by others when making modifications to them).

-

Function Naming

-

[WIP]

-

JOS proposal: using terms used in the field of digital signal processing, as follows:

-
    -
  • impulse: ...,0,1,0,...
  • -
  • pulse: ...,0,1,1,0,... or longer
  • -
  • impulse_train
  • -
  • pulse_train
  • -
  • gate = pulse controlled externally (e.g., by NoteOn,NoteOff)
  • -
  • trigger = impulse controlled externally (gate - gate' > 0) == gate rising edge
  • -
-

[/WIP]

-

Variable Argument List

-

Strictly speaking, there are no lists in Faust. But list operations can be simulated (in part) using the parallel binary composition operation , and pattern matching.

-

Thus functions expecting a variable number of arguments can use this mechanism, like a foo function that would be used this way: foo((a,b,c,d)). See fi.iir and fi.fir examples.

-

Documentation

-
    -
  • All the functions that we want to be "public" are documented.
  • -
  • We used the faust2md "standards" for each library: //### for main title (library name - equivalent to # in markdown), //=== for section declarations (equivalent to ## in markdown) and //--- for function declarations (equivalent to #### in markdown - see basics.lib for an example).
  • -
  • Sections in function documentation should be declared as #### markdown title.
  • -
  • Each function documentation provides a "Usage" section (see basics.lib).
  • -
  • The full documentation can be generated using the doc/Makefile script. Use make help to see all possible commands. If you plan to create a pull-request, do not commit the full generated code but only the modified .lib files.
  • -
  • Each function can have declare author "name";, declare copyright "XXX"; and declare licence "YYY"; declarations.
  • -
  • Each library has a declare version "xx.yy.zz"; semantic version number to be raised each time a modification is done. The global version number in version.lib also has to be adapted according to the change.
  • -
-

Library Import

-

To prevent cross-references between libraries, we generalized the use of the library("") system for function calls in all the libraries. This means that everytime a function declared in another library is called, the environment corresponding to this library needs to be called too. To make things easier, a stdfaust.lib library was created and is imported by all the libraries:

-
aa = library("aanl.lib");
-sf = library("all.lib");
-an = library("analyzers.lib");
-ba = library("basics.lib");
-co = library("compressors.lib");
-de = library("delays.lib");
-dm = library("demos.lib");
-dx = library("dx7.lib");
-en = library("envelopes.lib");
-fd = library("fds.lib");
-fi = library("filters.lib");
-ho = library("hoa.lib");
-it = library("interpolators.lib");
-ma = library("maths.lib");
-mi = library("mi.lib");
-ef = library("misceffects.lib");
-os = library("oscillators.lib");
-no = library("noises.lib");
-pf = library("phaflangers.lib");
-pm = library("physmodels.lib");
-qu = library("quantizers.lib");
-rm = library("reducemaps.lib");
-re = library("reverbs.lib");
-ro = library("routes.lib");
-si = library("signals.lib");
-so = library("soundfiles.lib");
-sp = library("spats.lib");
-sy = library("synths.lib");
-ve = library("vaeffects.lib");
-vl = library("version.lib");
-wa = library("webaudio.lib");
-wd = library("wdmodels.lib");
-
-

For example, if we wanted to use the smooth function which is now declared in signals.lib, we would do the following:

-
import("stdfaust.lib");
-
-process = si.smooth(0.999);
-
-

This standard is only used within the libraries: nothing prevents coders to still import signals.lib directly and call smooth without ro., etc. It means symbols and function names defined within a library have to be unique to not collide with symbols of any other libraries.

-

"Demo" Functions

-

"Demo" functions are placed in demos.lib and have a built-in user interface (UI). Their name ends with the _demo suffix. Each of these function have a .dsp file associated to them in the /examples folder.

-

Any function containing UI elements should be placed in this library and respect these standards.

-

"Standard" Functions

-

"Standard" functions are here to simplify the life of new (or not so new) Faust coders. They are declared in /libraries/doc/standardFunctions.md and allow to point programmers to preferred functions to carry out a specific task. For example, there are many different types of lowpass filters declared in filters.lib and only one of them is considered to be standard, etc.

-

Testing the library

-

Before preparing a pull-request, the new library must be carefully tested:

-
    -
  • all functions defined in the library must be tested by preparing a DSP test program
  • -
  • the compatibilty library all.lib imports all libraries in a same namespace, so check functions names collisions using the following test program:
  • -
-
import("all.lib");
-process = _;
-
-

Library deployment

-

For GRAME maintainers:

-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/aanl.lib/1.3.0/doc/index.html b/docs/contributors/faust/aanl.lib/1.3.0/doc/index.html deleted file mode 100644 index 6010fc3..0000000 --- a/docs/contributors/faust/aanl.lib/1.3.0/doc/index.html +++ /dev/null @@ -1,665 +0,0 @@ - - - - - - - - - - - aanl.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

aanl.lib

-

A library for antialiased nonlinearities. Its official prefix is aa.

-

This library provides aliasing-suppressed nonlinearities through first-order -and second-order approximations of continuous-time signals, functions, -and convolution based on antiderivatives. This technique is particularly -effective if combined with low-factor oversampling, for example, operating -at 96 kHz or 192 kHz sample-rate.

-

The library contains trigonometric functions as well as other nonlinear -functions such as bounded and unbounded saturators.

-

Due to their limited domains or ranges, some of these functions may not -suitable for audio nonlinear processing or waveshaping, although -they have been included for completeness. Some other functions, -for example, tan() and tanh(), are only available with first-order -antialiasing due to the complexity of the antiderivative of the -x * f(x) term, particularly because of the necessity of the dilogarithm -function, which requires special implementation.

-

Future improvements to this library may include an adaptive -mechanism to set the ill-conditioned cases threshold to improve -performance in varying cases.

-

Note that the antialiasing functions introduce a delay in the path, -respectively half and one-sample delay for first and second-order functions.

-

Also note that due to division by differences, it is vital to use -double-precision or more to reduce errors.

-

The environment identifier for this library is aa. After importing -the standard libraries in Faust, the functions below can be called as aa.function_name.

-

References

- -

Auxiliary Functions

-
-

(aa.)clip

-

Clipping function.

-
-

(aa.)Rsqrt

-

Real-valued sqrt().

-
-

(aa.)Rlog

-

Real-valued log().

-
-

(aa.)Rtan

-

Real-valued tan().

-
-

(aa.)Racos

-

Real-valued acos().

-
-

(aa.)Rasin

-

Real-valued asin().

-
-

(aa.)Racosh

-

Real-valued acosh()

-
-

(aa.)Rcosh

-

Real-valued cosh().

-
-

(aa.)Rsinh

-

Real-valued sinh().

-
-

(aa.)Ratanh

-

Real-valued atanh().

-
-

(aa.)ADAA1

-

Generalised first-order ADAA function.

-

Usage

-
_ : ADAA1(EPS, f, F1) : _
-
-

Where:

-
    -
  • EPS: a threshold to handle ill-conditioned cases
  • -
  • f: a function that we want to process with ADAA
  • -
  • F1: f's first antiderivative
  • -
-
-

(aa.)ADAA2

-

Generalised second-order ADAA function.

-

Usage

-
_ : ADAA2(EPS, f, F1, F2) : _
-
-

Where:

-
    -
  • EPS: a threshold to handle ill-conditioned cases
  • -
  • f: a function that we want to process with ADAA
  • -
  • F1: f's first antiderivative
  • -
  • F2: f's second antiderivative
  • -
-

Main functions

-

Saturators

-

These antialiased saturators perform best with high-amplitude input -signals. If the input is only slightly saturated, hence producing -negligible aliasing, the trivial saturator may result in a better -overall output, as noise can be introduced by first and second ADAA -at low amplitudes.

-

Once determining the lowest saturation level for which the antialiased -functions perform adequately, it might be sensible to cross-fade -between the trivial and the antialiased saturators according to the -amplitude profile of the input signal.

-
-

(aa.)hardclip

-

First-order ADAA hard-clip.

-

The domain of this function is ℝ; its theoretical range is [-1.0; 1.0].

-

Usage

-
_ : aa.hardclip : _
-
-
-

(aa.)hardclip2

-

Second-order ADAA hard-clip.

-

The domain of this function is ℝ; its theoretical range is [-1.0; 1.0].

-

Usage

-
_ : aa.hardclip2 : _
-
-
-

(aa.)cubic1

-

First-order ADAA cubic saturator.

-

The domain of this function is ℝ; its theoretical range is -[-2.0/3.0; 2.0/3.0].

-

Usage

-
_ : aa.cubic1 : _
-
-
-

(aa.)parabolic

-

First-order ADAA parabolic saturator.

-

The domain of this function is ℝ; its theoretical range is [-1.0; 1.0].

-

Usage

-
_ : aa.parabolic : _
-
-
-

(aa.)parabolic2

-

Second-order ADAA parabolic saturator.

-

The domain of this function is ℝ; its theoretical range is [-1.0; 1.0].

-

Usage

-
_ : aa.parabolic : _
-
-
-

(aa.)hyperbolic

-

First-order ADAA hyperbolic saturator.

-

The domain of this function is ℝ; its theoretical range is ]-1.0; 1.0[.

-

Usage

-
_ : aa.hyperbolic : _
-
-
-

(aa.)hyperbolic2

-

Second-order ADAA hyperbolic saturator.

-

The domain of this function is ℝ; its theoretical range is ]-1.0; 1.0[.

-

Usage

-
_ : aa.hyperbolic2 : _
-
-
-

(aa.)sinarctan

-

First-order ADAA sin(atan()) saturator.

-

The domain of this function is ℝ; its theoretical range is ]-1.0; 1.0[.

-

Usage

-
_ : aa.sinatan : _
-
-
-

(aa.)sinarctan2

-

Second-order ADAA sin(atan()) saturator.

-

The domain of this function is ℝ; its theoretical range is ]-1.0; 1.0[.

-

Usage

-
_ : aa.sinarctan2 : _
-
-
-

(aa.)tanh1

-

First-order ADAA tanh() saturator.

-

The domain of this function is ℝ; its theoretical range is ]-1.0; 1.0[.

-

Usage

-
_ : aa.tanh1 : _
-
-
-

(aa.)arctan

-

First-order ADAA atan().

-

The domain of this function is ℝ; its theoretical range is ]-π/2.0; π/2.0[.

-

Usage

-
_ : aa.arctan : _
-
-
-

(aa.)arctan2

-

Second-order ADAA atan().

-

The domain of this function is ℝ; its theoretical range is ]-π/2.0; π/2.0[.

-

Usage

-
_ : aa.arctan2 : _
-
-
-

(aa.)asinh1

-

First-order ADAA asinh() saturator (unbounded).

-

The domain of this function is ℝ; its theoretical range is ℝ.

-

Usage

-
_ : aa.asinh1 : _
-
-
-

(aa.)asinh2

-

Second-order ADAA asinh() saturator (unbounded).

-

The domain of this function is ℝ; its theoretical range is ℝ.

-

Usage

-
_ : aa.asinh2 : _
-
-

Trigonometry

-

These functions are reliable if input signals are within their domains.

-
-

(aa.)cosine1

-

First-order ADAA cos().

-

The domain of this function is ℝ; its theoretical range is [-1.0; 1.0].

-

Usage

-
_ : aa.cosine1 : _
-
-
-

(aa.)cosine2

-

Second-order ADAA cos().

-

The domain of this function is ℝ; its theoretical range is [-1.0; 1.0].

-

Usage

-
_ : aa.cosine2 : _
-
-
-

(aa.)arccos

-

First-order ADAA acos().

-

The domain of this function is [-1.0; 1.0]; its theoretical range is -[π; 0.0].

-

Usage

-
_ : aa.arccos : _
-
-
-

(aa.)arccos2

-

Second-order ADAA acos().

-

The domain of this function is [-1.0; 1.0]; its theoretical range is -[π; 0.0].

-

Note that this function is not accurate for low-amplitude or low-frequency -input signals. In that case, the first-order ADAA arccos() can be used.

-

Usage

-
_ : aa.arccos2 : _
-
-
-

(aa.)acosh1

-

First-order ADAA acosh().

-

The domain of this function is ℝ >= 1.0; its theoretical range is ℝ >= 0.0.

-

Usage

-
_ : aa.acosh1 : _
-
-
-

(aa.)acosh2

-

Second-order ADAA acosh().

-

The domain of this function is ℝ >= 1.0; its theoretical range is ℝ >= 0.0.

-

Note that this function is not accurate for low-frequency input signals. -In that case, the first-order ADAA acosh() can be used.

-

Usage

-
_ : aa.acosh2 : _
-
-
-

(aa.)sine

-

First-order ADAA sin().

-

The domain of this function is ℝ; its theoretical range is ℝ.

-

Usage

-
_ : aa.sine : _
-
-
-

(aa.)sine2

-

Second-order ADAA sin().

-

The domain of this function is ℝ; its theoretical range is ℝ.

-

Usage

-
_ : aa.sine2 : _
-
-
-

(aa.)arcsin

-

First-order ADAA asin().

-

The domain of this function is [-1.0, 1.0]; its theoretical range is -[-π/2.0; π/2.0].

-

Usage

-
_ : aa.arcsin : _
-
-
-

(aa.)arcsin2

-

Second-order ADAA asin().

-

The domain of this function is [-1.0, 1.0]; its theoretical range is -[-π/2.0; π/2.0].

-

Note that this function is not accurate for low-frequency input signals. -In that case, the first-order ADAA asin() can be used.

-

Usage

-
_ : aa.arcsin2 : _
-
-
-

(aa.)tangent

-

First-order ADAA tan().

-

The domain of this function is [-π/2.0; π/2.0]; its theoretical range is ℝ.

-

Usage

-
_ : aa.tangent : _
-
-
-

(aa.)atanh1

-

First-order ADAA atanh().

-

The domain of this function is ]-1.0; 1.0[; its theoretical range is ℝ.

-

Usage

-
_ : aa.atanh1 : _
-
-
-

(aa.)atanh2

-

Second-order ADAA atanh().

-

The domain of this function is ]-1.0; 1.0[; its theoretical range is ℝ.

-

Usage

-
_ : aa.atanh2 : _
-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/aanl.lib/overview/index.html b/docs/contributors/faust/aanl.lib/overview/index.html deleted file mode 100644 index d91961f..0000000 --- a/docs/contributors/faust/aanl.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - aanl.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

aanl.lib Documentation

-

Welcome to the documentation for aanl.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.3.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/all.lib/1.0.0/doc/index.html b/docs/contributors/faust/all.lib/1.0.0/doc/index.html deleted file mode 100644 index 179758c..0000000 --- a/docs/contributors/faust/all.lib/1.0.0/doc/index.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - all.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

all.lib

-

The purpose of this library is to give access to all the Faust standard libraries -from a single point.

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/all.lib/overview/index.html b/docs/contributors/faust/all.lib/overview/index.html deleted file mode 100644 index 4c5df96..0000000 --- a/docs/contributors/faust/all.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - all.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

all.lib Documentation

-

Welcome to the documentation for all.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.0.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/analyzers.lib/1.2.0/doc/index.html b/docs/contributors/faust/analyzers.lib/1.2.0/doc/index.html deleted file mode 100644 index 25891d6..0000000 --- a/docs/contributors/faust/analyzers.lib/1.2.0/doc/index.html +++ /dev/null @@ -1,777 +0,0 @@ - - - - - - - - - - - analyzers.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
- -
- -

analyzers.lib

-

Analyzers library. Its official prefix is an.

-

References

- -

Amplitude Tracking

-
-

(an.)abs_envelope_rect

-

Absolute value average with moving-average algorithm.

-

Usage

-
_ : abs_envelope_rect(period) : _
-
-

Where:

-
    -
  • period: sets the averaging frame in seconds
  • -
-
-

(an.)abs_envelope_tau

-

Absolute value average with one-pole lowpass and tau response -(see filters.lib).

-

Usage

-
_ : abs_envelope_tau(period) : _
-
-

Where:

-
    -
  • period: (time to decay by 1/e) sets the averaging frame in secs
  • -
-
-

(an.)abs_envelope_t60

-

Absolute value average with one-pole lowpass and t60 response -(see filters.lib).

-

Usage

-
_ : abs_envelope_t60(period) : _
-
-

Where:

-
    -
  • period: (time to decay by 60 dB) sets the averaging frame in secs
  • -
-
-

(an.)abs_envelope_t19

-

Absolute value average with one-pole lowpass and t19 response -(see filters.lib).

-

Usage

-
_ : abs_envelope_t19(period) : _
-
-

Where:

-
    -
  • period: (time to decay by 1/e^2.2) sets the averaging frame in secs
  • -
-
-

(an.)amp_follower

-

Classic analog audio envelope follower with infinitely fast rise and -exponential decay. The amplitude envelope instantaneously follows -the absolute value going up, but then floats down exponentially.

-

amp_follower is a standard Faust function.

-

Usage

-
_ : amp_follower(rel) : _
-
-

Where:

-
    -
  • rel: release time = amplitude-envelope time-constant (sec) going down
  • -
-

References

-
    -
  • Musical Engineer's Handbook, Bernie Hutchins, Ithaca NY
  • -
  • 1975 Electronotes Newsletter, Bernie Hutchins
  • -
-
-

(an.)amp_follower_ud

-

Envelope follower with different up and down time-constants -(also called a "peak detector").

-

Usage

-
   _ : amp_follower_ud(att,rel) : _
-
-

Where:

-
    -
  • att: attack time = amplitude-envelope time constant (sec) going up
  • -
  • rel: release time = amplitude-envelope time constant (sec) going down
  • -
-

Note

-

We assume rel >> att. Otherwise, consider rel ~ max(rel,att). -For audio, att is normally faster (smaller) than rel (e.g., 0.001 and 0.01). -Use amp_follower_ar below to remove this restriction.

-

Reference

- -
-

(an.)amp_follower_ar

-

Envelope follower with independent attack and release times. The -release can be shorter than the attack (unlike in amp_follower_ud -above).

-

Usage

-
_ : amp_follower_ar(att,rel) : _
-
-

Where:

-
    -
  • att: attack time = amplitude-envelope time constant (sec) going up
  • -
  • rel: release time = amplitude-envelope time constant (sec) going down
  • -
-
-

(an.)ms_envelope_rect

-

Mean square with moving-average algorithm.

-

Usage

-
_ : ms_envelope_rect(period) : _
-
-

Where:

-
    -
  • period: sets the averaging frame in secs
  • -
-
-

(an.)ms_envelope_tau

-

Mean square average with one-pole lowpass and tau response -(see filters.lib).

-

Usage

-
_ : ms_envelope_tau(period) : _
-
-

Where:

-
    -
  • period: (time to decay by 1/e) sets the averaging frame in secs
  • -
-
-

(an.)ms_envelope_t60

-

Mean square with one-pole lowpass and t60 response -(see filters.lib).

-

Usage

-
_ : ms_envelope_t60(period) : _
-
-

Where:

-
    -
  • period: (time to decay by 60 dB) sets the averaging frame in secs
  • -
-
-

(an.)ms_envelope_t19

-

Mean square with one-pole lowpass and t19 response -(see filters.lib).

-

Usage

-
_ : ms_envelope_t19(period) : _
-
-

Where:

-
    -
  • period: (time to decay by 1/e^2.2) sets the averaging frame in secs
  • -
-
-

(an.)rms_envelope_rect

-

Root mean square with moving-average algorithm.

-

Usage

-
_ : rms_envelope_rect(period) : _
-
-

Where:

-
    -
  • period: sets the averaging frame in secs
  • -
-
-

(an.)rms_envelope_tau

-

Root mean square with one-pole lowpass and tau response -(see filters.lib).

-

Usage

-
_ : rms_envelope_tau(period) : _
-
-

Where:

-
    -
  • period: (time to decay by 1/e) sets the averaging frame in secs
  • -
-
-

(an.)rms_envelope_t60

-

Root mean square with one-pole lowpass and t60 response -(see filters.lib).

-

Usage

-
_ : rms_envelope_t60(period) : _
-
-

Where:

-
    -
  • period: (time to decay by 60 dB) sets the averaging frame in secs
  • -
-
-

(an.)rms_envelope_t19

-

Root mean square with one-pole lowpass and t19 response -(see filters.lib).

-

Usage

-
_ : rms_envelope_t19(period) : _
-
-

Where:

-
    -
  • period: (time to decay by 1/e^2.2) sets the averaging frame in secs
  • -
-
-

(an.)zcr

-

Zero-crossing rate (ZCR) with one-pole lowpass averaging based on the tau -constant. It outputs an index between 0 and 1 at a desired analysis frame. -The ZCR of a signal correlates with the noisiness [Gouyon et al. 2000] and -the spectral centroid [Herrera-Boyer et al. 2006] of a signal. -For sinusoidal signals, the ZCR can be multiplied by ma.SR/2 and used -as a frequency detector. For example, it can be deployed as a -computationally efficient adaptive mechanism for automatic Larsen -suppression.

-

Usage

-
_ : zcr(tau) : _
-
-

Where:

-
    -
  • tau: (time to decay by e^-1) sets the averaging frame in seconds.
  • -
-

Adaptive Frequency Analysis

-
-

(an.)pitchTracker

-

This function implements a pitch-tracking algorithm by means of -zero-crossing rate analysis and adaptive low-pass filtering. The design -is based on the algorithm described in this tutorial (section 2.2).

-

Usage

-
_ : pitchTracker(N, tau) : _
-
-

Where:

-
    -
  • N: a constant numerical expression, sets the order of the low-pass filter, which - determines the sensitivity of the algorithm for signals where partials are - stronger than the fundamental frequency.
  • -
  • tau: response time in seconds based on exponentially-weighted averaging with tau time-constant. See https://ccrma.stanford.edu/~jos/st/Exponentials.html.
  • -
-
-

(an.)spectralCentroid

-

This function implements a time-domain spectral centroid by means of RMS -measurements and adaptive crossover filtering. The weight difference of the -upper and lower spectral powers are used to recursively adjust the crossover -cutoff so that the system (minimally) oscillates around a balancing point.

-

Unlike block processing techniques such as FFT, this algorithm provides -continuous measurements and fast response times. Furthermore, when providing -input signals that are spectrally sparse, the algorithm will output a -logarithmic measure of the centroid, which is perceptually desirable for -musical applications. For example, if the input signal is the combination -of three tones at 1000, 2000, and 4000 Hz, the centroid will be the middle -octave.

-

Usage

-
_ : spectralCentroid(nonlinearity, tau) : _
-
-

Where:

-
    -
  • nonlinearity: a boolean to activate or deactivate nonlinear integration. The - nonlinear function is useful to improve stability with very short response times - such as .001 <= tau <= .005 , otherwise, the nonlinearity may reduce precision.
  • -
  • tau: response time in seconds based on exponentially-weighted averaging with tau time-constant. See https://ccrma.stanford.edu/~jos/st/Exponentials.html.
  • -
-

Reference:

-

Sanfilippo, D. (2021). Time-Domain Adaptive Algorithms for Low- and High-Level - Audio Information Processing. Computer Music Journal, 45(1), 24-38.

-

Example:

-

process = os.osc(500) + os.osc(1000) + os.osc(2000) + os.osc(4000) + os.osc(8000) : an.spectralCentroid(1, .001);

-

Spectrum-Analyzers

-

Spectrum-analyzers split the input signal into a bank of parallel signals, one for -each spectral band. They are related to the Mth-Octave Filter-Banks in filters.lib. -The documentation of this library contains more details about the implementation. -The parameters are:

-
    -
  • M: number of band-slices per octave (>1)
  • -
  • N: total number of bands (>2)
  • -
  • ftop = upper bandlimit of the Mth-octave bands (<SR/2)
  • -
-

In addition to the Mth-octave output signals, there is a highpass signal -containing frequencies from ftop to SR/2, and a "dc band" lowpass signal -containing frequencies from 0 (dc) up to the start of the Mth-octave bands. -Thus, the N output signals are:

-
highpass(ftop), MthOctaveBands(M,N-2,ftop), dcBand(ftop*2^(-M*(N-1)))
-
-

A Spectrum-Analyzer is defined here as any band-split whose bands span -the relevant spectrum, but whose band-signals do not -necessarily sum to the original signal, either exactly or to within an -allpass filtering. Spectrum analyzer outputs are normally at least nearly -"power complementary", i.e., the power spectra of the individual bands -sum to the original power spectrum (to within some negligible tolerance).

-

Increasing Channel Isolation

-

Go to higher filter orders - see Regalia et al. or Vaidyanathan (cited -below) regarding the construction of more aggressive recursive -filter-banks using elliptic or Chebyshev prototype filters.

-

References

-
    -
  • "Tree-structured complementary filter banks using all-pass sections", - Regalia et al., IEEE Trans. Circuits & Systems, CAS-34:1470-1484, Dec. 1987
  • -
  • "Multirate Systems and Filter Banks", P. Vaidyanathan, Prentice-Hall, 1993
  • -
  • Elementary filter theory: https://ccrma.stanford.edu/~jos/filters/
  • -
-
-

(an.)mth_octave_analyzer

-

Octave analyzer. -mth_octave_analyzer[N] are standard Faust functions.

-

Usage

-
_ : mth_octave_analyzer(O,M,ftop,N) : par(i,N,_) // Oth-order Butterworth
-_ : mth_octave_analyzer6e(M,ftop,N) : par(i,N,_) // 6th-order elliptic
-
-

Also for convenience:

-
_ : mth_octave_analyzer3(M,ftop,N) : par(i,N,_) // 3d-order Butterworth
-_ : mth_octave_analyzer5(M,ftop,N) : par(i,N,_) // 5th-order Butterworth
-mth_octave_analyzer_default = mth_octave_analyzer6e;
-
-

Where:

-
    -
  • O: (odd) order of filter used to split each frequency band into two
  • -
  • M: number of band-slices per octave
  • -
  • ftop: highest band-split crossover frequency (e.g., 20 kHz)
  • -
  • N: total number of bands (including dc and Nyquist)
  • -
-

Mth-Octave Spectral Level

-

Spectral Level: display (in bargraphs) the average signal level in each spectral band.

-
-

(an.)mth_octave_spectral_level6e

-

Spectral level display.

-

Usage:

-
_ : mth_octave_spectral_level6e(M,ftop,NBands,tau,dB_offset) : _
-
-

Where:

-
    -
  • M: bands per octave
  • -
  • ftop: lower edge frequency of top band
  • -
  • NBands: number of passbands (including highpass and dc bands),
  • -
  • tau: spectral display averaging-time (time constant) in seconds,
  • -
  • dB_offset: constant dB offset in all band level meters.
  • -
-

Also for convenience:

-
mth_octave_spectral_level_default = mth_octave_spectral_level6e;
-spectral_level = mth_octave_spectral_level(2,10000,20);
-
-
-

(an.)[third|half]_octave_[analyzer|filterbank]

-

A bunch of special cases based on the different analyzer functions described above:

-
third_octave_analyzer(N) = mth_octave_analyzer_default(3,10000,N);
-third_octave_filterbank(N) = mth_octave_filterbank_default(3,10000,N);
-half_octave_analyzer(N) = mth_octave_analyzer_default(2,10000,N);
-half_octave_filterbank(N) = mth_octave_filterbank_default(2,10000,N);
-octave_filterbank(N) = mth_octave_filterbank_default(1,10000,N);
-octave_analyzer(N) = mth_octave_analyzer_default(1,10000,N);
-
-

Usage

-

See mth_octave_spectral_level_demo in demos.lib.

-

Arbritary-Crossover Filter-Banks and Spectrum Analyzers

-

These are similar to the Mth-octave analyzers above, except that the -band-split frequencies are passed explicitly as arguments.

-
-

(an.)analyzer

-

Analyzer.

-

Usage

-
_ : analyzer(O,freqs) : par(i,N,_) // No delay equalizer
-
-

Where:

-
    -
  • O: band-split filter order (ODD integer required for filterbank[i])
  • -
  • freqs: (fc1,fc2,...,fcNs) [in numerically ascending order], where - Ns=N-1 is the number of octave band-splits - (total number of bands N=Ns+1).
  • -
-

If frequencies are listed explicitly as arguments, enclose them in parens:

-
_ : analyzer(3,(fc1,fc2)) : _,_,_
-
-

Fast Fourier Transform (fft) and its Inverse (ifft)

-

Sliding FFTs that compute a rectangularly windowed FFT each sample.

-
-

(an.)goertzelOpt

-

Optimized Goertzel filter.

-

Usage

-
_ : goertzelOpt(freq,n) : _
-
-

Where:

-
    -
  • freq: frequency to be analyzed
  • -
  • n: the Goertzel block size
  • -
-

Reference

- -
-

(an.)goertzelComp

-

Complex Goertzel filter.

-

Usage

-
_ : goertzelComp(freq,n) : _
-
-

Where:

-
    -
  • freq: frequency to be analyzed
  • -
  • n: the Goertzel block size
  • -
-

Reference

- -
-

(an.)goertzel

-

Same as goertzelOpt.

-

Usage

-
_ : goertzel(freq,n) : _
-
-

Where:

-
    -
  • freq: frequency to be analyzed
  • -
  • n: the Goertzel block size
  • -
-

Reference

- -
-

(an.)fft

-

Fast Fourier Transform (FFT).

-

Usage

-
si.cbus(N) : fft(N) : si.cbus(N)
-
-

Where:

-
    -
  • si.cbus(N) is a bus of N complex signals, each specified by real and imaginary parts: - (r0,i0), (r1,i1), (r2,i2), ...
  • -
  • N is the FFT size (must be a power of 2: 2,4,8,16,... known at compile time)
  • -
  • fft(N) performs a length N FFT for complex signals (radix 2)
  • -
  • The output is a bank of N complex signals containing the complex spectrum over time: - (R0, I0), (R1,I1), ...
  • -
  • The dc component is (R0,I0), where I0=0 for real input signals.
  • -
-

FFTs of Real Signals:

-
    -
  • To perform a sliding FFT over a real input signal, you can say
  • -
-
process = signal : an.rtocv(N) : an.fft(N);
-
-

where an.rtocv converts a real (scalar) signal to a complex vector signal having a zero imaginary part.

-
    -
  • -

    See an.rfft_analyzer_c (in analyzers.lib) and related functions for more detailed usage examples.

    -
  • -
  • -

    Use an.rfft_spectral_level(N,tau,dB_offset) to display the power spectrum of a real signal.

    -
  • -
  • -

    See dm.fft_spectral_level_demo(N) in demos.lib for an example GUI driving an.rfft_spectral_level().

    -
  • -
-

Reference

- -
-

(an.)ifft

-

Inverse Fast Fourier Transform (IFFT).

-

Usage

-
si.cbus(N) : ifft(N) : si.cbus(N)
-
-

Where:

-
    -
  • N is the IFFT size (power of 2)
  • -
  • Input is a complex spectrum represented as interleaved real and imaginary parts: - (R0, I0), (R1,I1), (R2,I2), ...
  • -
  • Output is a bank of N complex signals giving the complex signal in the time domain: - (r0, i0), (r1,i1), (r2,i2), ...
  • -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/analyzers.lib/overview/index.html b/docs/contributors/faust/analyzers.lib/overview/index.html deleted file mode 100644 index 77f08c6..0000000 --- a/docs/contributors/faust/analyzers.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - analyzers.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

analyzers.lib Documentation

-

Welcome to the documentation for analyzers.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.2.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/basics.lib/1.19.1/doc/index.html b/docs/contributors/faust/basics.lib/1.19.1/doc/index.html deleted file mode 100644 index 3670fdb..0000000 --- a/docs/contributors/faust/basics.lib/1.19.1/doc/index.html +++ /dev/null @@ -1,2038 +0,0 @@ - - - - - - - - - - - basics.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

basics.lib

-

A library of basic elements. Its official prefix is ba.

-

References

- -

Conversion Tools

-
-

(ba.)samp2sec

-

Converts a number of samples to a duration in seconds at the current sampling rate (see ma.SR). -samp2sec is a standard Faust function.

-

Usage

-
samp2sec(n) : _
-
-

Where:

-
    -
  • n: number of samples
  • -
-
-

(ba.)sec2samp

-

Converts a duration in seconds to a number of samples at the current sampling rate (see ma.SR). -samp2sec is a standard Faust function.

-

Usage

-
sec2samp(d) : _
-
-

Where:

-
    -
  • d: duration in seconds
  • -
-
-

(ba.)db2linear

-

dB-to-linear value converter. It can be used to convert an amplitude in dB to a linear gain ]0-N]. -db2linear is a standard Faust function.

-

Usage

-
db2linear(l) : _
-
-

Where:

-
    -
  • l: amplitude in dB
  • -
-
-

(ba.)linear2db

-

linea-to-dB value converter. It can be used to convert a linear gain ]0-N] to an amplitude in dB. -linear2db is a standard Faust function.

-

Usage

-
linear2db(g) : _
-
-

Where:

-
    -
  • g: a linear gain
  • -
-
-

(ba.)lin2LogGain

-

Converts a linear gain (0-1) to a log gain (0-1).

-

Usage

-
lin2LogGain(n) : _
-
-

Where:

-
    -
  • n: the linear gain
  • -
-
-

(ba.)log2LinGain

-

Converts a log gain (0-1) to a linear gain (0-1).

-

Usage

-
log2LinGain(n) : _
-
-

Where:

-
    -
  • n: the log gain
  • -
-
-

(ba.)tau2pole

-

Returns a real pole giving exponential decay. -Note that t60 (time to decay 60 dB) is ~6.91 time constants. -tau2pole is a standard Faust function.

-

Usage

-
_ : smooth(tau2pole(tau)) : _
-
-

Where:

-
    -
  • tau: time-constant in seconds
  • -
-
-

(ba.)pole2tau

-

Returns the time-constant, in seconds, corresponding to the given real, -positive pole in (0-1). -pole2tau is a standard Faust function.

-

Usage

-
pole2tau(pole) : _
-
-

Where:

-
    -
  • pole: the pole
  • -
-
-

(ba.)midikey2hz

-

Converts a MIDI key number to a frequency in Hz (MIDI key 69 = A440). -midikey2hz is a standard Faust function.

-

Usage

-
midikey2hz(mk) : _
-
-

Where:

-
    -
  • mk: the MIDI key number
  • -
-
-

(ba.)hz2midikey

-

Converts a frequency in Hz to a MIDI key number (MIDI key 69 = A440). -hz2midikey is a standard Faust function.

-

Usage

-
hz2midikey(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-
-

(ba.)semi2ratio

-

Converts semitones in a frequency multiplicative ratio. -semi2ratio is a standard Faust function.

-

Usage

-
semi2ratio(semi) : _
-
-

Where:

-
    -
  • semi: number of semitone
  • -
-
-

(ba.)ratio2semi

-

Converts a frequency multiplicative ratio in semitones. -ratio2semi is a standard Faust function.

-

Usage

-
ratio2semi(ratio) : _
-
-

Where:

-
    -
  • ratio: frequency multiplicative ratio
  • -
-
-

(ba.)cent2ratio

-

Converts cents in a frequency multiplicative ratio.

-

Usage

-
cent2ratio(cent) : _
-
-

Where:

-
    -
  • cent: number of cents
  • -
-
-

(ba.)ratio2cent

-

Converts a frequency multiplicative ratio in cents.

-

Usage

-
ratio2cent(ratio) : _
-
-

Where:

-
    -
  • ratio: frequency multiplicative ratio
  • -
-
-

(ba.)pianokey2hz

-

Converts a piano key number to a frequency in Hz (piano key 49 = A440).

-

Usage

-
pianokey2hz(pk) : _
-
-

Where:

-
    -
  • pk: the piano key number
  • -
-
-

(ba.)hz2pianokey

-

Converts a frequency in Hz to a piano key number (piano key 49 = A440).

-

Usage

-
hz2pianokey(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-

Counters and Time/Tempo Tools

-
-

(ba.)counter

-

Starts counting 0, 1, 2, 3..., and raise the current integer value -at each upfront of the trigger.

-

Usage

-
counter(trig) : _
-
-

Where:

-
    -
  • trig: the trigger signal, each upfront will move the counter to the next integer
  • -
-
-

(ba.)countdown

-

Starts counting down from n included to 0. While trig is 1 the output is n. -The countdown starts with the transition of trig from 1 to 0. At the end -of the countdown the output value will remain at 0 until the next trig. -countdown is a standard Faust function.

-

Usage

-
countdown(n,trig) : _
-
-

Where:

-
    -
  • n: the starting point of the countdown
  • -
  • trig: the trigger signal (1: start at n; 0: decrease until 0)
  • -
-
-

(ba.)countup

-

Starts counting up from 0 to n included. While trig is 1 the output is 0. -The countup starts with the transition of trig from 1 to 0. At the end -of the countup the output value will remain at n until the next trig. -countup is a standard Faust function.

-

Usage

-
countup(n,trig) : _
-
-

Where:

-
    -
  • n: the maximum count value
  • -
  • trig: the trigger signal (1: start at 0; 0: increase until n)
  • -
-
-

(ba.)sweep

-

Counts from 0 to period-1 repeatedly, generating a -sawtooth waveform, like os.lf_rawsaw, -starting at 1 when run transitions from 0 to 1. -Outputs zero while run is 0.

-

Usage

-
sweep(period,run) : _
-
-
-

(ba.)time

-

A simple timer that counts every samples from the beginning of the process. -time is a standard Faust function.

-

Usage

-
time : _
-
-
-

(ba.)ramp

-

A linear ramp with a slope of '(+/-)1/n' samples to reach the next target value.

-

Usage

-
_ : ramp(n) : _
-
-

Where:

-
    -
  • n: number of samples to increment/decrement the value by one
  • -
-
-

(ba.)line

-

A ramp interpolator that generates a linear transition to reach a target value:

-
    -
  • the interpolation process restarts each time a new and distinct input value is received
  • -
  • it utilizes 'n' samples to achieve the transition to the target value
  • -
  • after reaching the target value, the output value is maintained.
  • -
-

Usage

-
_ : line(n) : _
-
-

Where:

-
    -
  • n: number of samples to reach the new target received at its input
  • -
-
-

(ba.)tempo

-

Converts a tempo in BPM into a number of samples.

-

Usage

-
tempo(t) : _
-
-

Where:

-
    -
  • t: tempo in BPM
  • -
-
-

(ba.)period

-

Basic sawtooth wave of period p.

-

Usage

-
period(p) : _
-
-

Where:

-
    -
  • p: period as a number of samples
  • -
-
-

(ba.)spulse

-

Produces a single pulse of n samples when trig goes from 0 to 1.

-

Usage

-
spulse(n,trig) : _
-
-

Where:

-
    -
  • n: pulse length as a number of samples
  • -
  • trig: the trigger signal (1: start the pulse)
  • -
-
-

(ba.)pulse

-

Pulses (like 10000) generated at period p.

-

Usage

-
pulse(p) : _
-
-

Where:

-
    -
  • p: period as a number of samples
  • -
-
-

(ba.)pulsen

-

Pulses (like 11110000) of length n generated at period p.

-

Usage

-
pulsen(n,p) : _
-
-

Where:

-
    -
  • n: pulse length as a number of samples
  • -
  • p: period as a number of samples
  • -
-
-

(ba.)cycle

-

Split nonzero input values into n cycles.

-

Usage

-
_ : cycle(n) : si.bus(n)
-
-

Where:

-
    -
  • n: the number of cycles/output signals
  • -
-
-

(ba.)beat

-

Pulses at tempo t. -beat is a standard Faust function.

-

Usage

-
beat(t) : _
-
-

Where:

-
    -
  • t: tempo in BPM
  • -
-
-

(ba.)pulse_countup

-

Starts counting up pulses. While trig is 1 the output is -counting up, while trig is 0 the counter is reset to 0.

-

Usage

-
_ : pulse_countup(trig) : _
-
-

Where:

-
    -
  • trig: the trigger signal (1: start at next pulse; 0: reset to 0)
  • -
-
-

(ba.)pulse_countdown

-

Starts counting down pulses. While trig is 1 the output is -counting down, while trig is 0 the counter is reset to 0.

-

Usage

-
_ : pulse_countdown(trig) : _
-
-

Where:

-
    -
  • trig: the trigger signal (1: start at next pulse; 0: reset to 0)
  • -
-
-

(ba.)pulse_countup_loop

-

Starts counting up pulses from 0 to n included. While trig is 1 the output is -counting up, while trig is 0 the counter is reset to 0. At the end -of the countup (n) the output value will be reset to 0.

-

Usage

-
_ : pulse_countup_loop(n,trig) : _
-
-

Where:

-
    -
  • n: the highest number of the countup (included) before reset to 0
  • -
  • trig: the trigger signal (1: start at next pulse; 0: reset to 0)
  • -
-
-

(ba.)pulse_countdown_loop

-

Starts counting down pulses from 0 to n included. While trig is 1 the output -is counting down, while trig is 0 the counter is reset to 0. At the end -of the countdown (n) the output value will be reset to 0.

-

Usage

-
_ : pulse_countdown_loop(n,trig) : _
-
-

Where:

-
    -
  • n: the highest number of the countup (included) before reset to 0
  • -
  • trig: the trigger signal (1: start at next pulse; 0: reset to 0)
  • -
-
-

(ba.)resetCtr

-

Function that lets through the mth impulse out of -each consecutive group of n impulses.

-

Usage

-
_ : resetCtr(n,m) : _
-
-

Where:

-
    -
  • n: the total number of impulses being split
  • -
  • m: index of impulse to allow to be output
  • -
-

Array Processing/Pattern Matching

-
-

(ba.)count

-

Count the number of elements of list l. -count is a standard Faust function.

-

Usage

-
count(l)
-count((10,20,30,40)) -> 4
-
-

Where:

-
    -
  • l: list of elements
  • -
-
-

(ba.)take

-

Take an element from a list. -take is a standard Faust function.

-

Usage

-
take(P,l)
-take(3,(10,20,30,40)) -> 30
-
-

Where:

-
    -
  • P: position (int, known at compile time, P > 0)
  • -
  • l: list of elements
  • -
-
-

(ba.)subseq

-

Extract a part of a list.

-

Usage

-
subseq(l, P, N)
-subseq((10,20,30,40,50,60), 1, 3) -> (20,30,40)
-subseq((10,20,30,40,50,60), 4, 1) -> 50
-
-

Where:

-
    -
  • l: list
  • -
  • P: start point (int, known at compile time, 0: begin of list)
  • -
  • N: number of elements (int, known at compile time)
  • -
-

Note:

-

Faust doesn't have proper lists. Lists are simulated with parallel -compositions and there is no empty list.

-

Function tabulation

-

The purpose of function tabulation is to speed up the computation of heavy functions over an interval, -so that the computation at runtime can be faster than directly using the function. -Two techniques are implemented:

-
    -
  • -

    tabulate computes the function in a table and read the points using interpolation. tabulateNd is the N dimensions version of tabulate

    -
  • -
  • -

    tabulate_chebychev uses Chebyshev polynomial approximation

    -
  • -
-

Comparison program example

-
process = line(50000, r0, r1) <: FX-tb,FX-ch : par(i, 2, maxerr)
-with {
-   C = 0;
-   FX = sin; 
-   NX = 50; 
-   CD = 3;
-   r0 = 0;
-   r1 = ma.PI;
-   tb(x) = ba.tabulate(C, FX, NX*(CD+1), r0, r1, x).cub;
-   ch(x) = ba.tabulate_chebychev(C, FX, NX, CD, r0, r1, x);
-   maxerr = abs : max ~ _;
-   line(n, x0, x1) = x0 + (ba.time%n)/n * (x1-x0);
-};
-
-
-

(ba.)tabulate

-

Tabulate a 1D function over the range [r0, r1] for access via nearest-value, linear, cubic interpolation. -In other words, the uniformly tabulated function can be evaluated using interpolation of order 0 (none), 1 (linear), or 3 (cubic).

-

Usage

-
tabulate(C, FX, S, r0, r1, x).(val|lin|cub) : _
-
-
    -
  • C: whether to dynamically force the x value to the range [r0, r1]: 1 forces the check, 0 deactivates it (constant numerical expression)
  • -
  • FX: unary function Y=F(X) with one output (scalar function of one variable)
  • -
  • S: size of the table in samples (constant numerical expression)
  • -
  • r0: minimum value of argument x
  • -
  • r1: maximum value of argument x
  • -
-
tabulate(C, FX, S, r0, r1, x).val uses the value in the table closest to x
-
-
tabulate(C, FX, S, r0, r1, x).lin evaluates at x using linear interpolation between the closest stored values
-
-
tabulate(C, FX, S, r0, r1, x).cub evaluates at x using cubic interpolation between the closest stored values
-
-

Example test program

-
midikey2hz(mk) = ba.tabulate(1, ba.midikey2hz, 512, 0, 127, mk).lin;
-process = midikey2hz(ba.time), ba.midikey2hz(ba.time);
-
-
-

(ba.)tabulate_chebychev

-

Tabulate a 1D function over the range [r0, r1] for access via Chebyshev polynomial approximation. -In contrast to (ba.)tabulate, which interpolates only between tabulated samples, (ba.)tabulate_chebychev -stores coefficients of Chebyshev polynomials that are evaluated to provide better approximations in many cases. -Two new arguments controlling this are NX, the number of segments into which [r0, r1] is divided, and CD, -the maximum Chebyshev polynomial degree to use for each segment. A rdtable of size NX*(CD+1) is internally used.

-

Note that processing r1 the last point in the interval is not safe. So either be sure the input stays in [r0, r1[ -or use C = 1.

-

Usage

-
_ : tabulate_chebychev(C, FX, NX, CD, r0, r1) : _
-
-
    -
  • C: whether to dynamically force the value to the range [r0, r1]: 1 forces the check, 0 deactivates it (constant numerical expression)
  • -
  • FX: unary function Y=F(X) with one output (scalar function of one variable)
  • -
  • NX: number of segments for uniformly partitioning [r0, r1] (constant numerical expression)
  • -
  • CD: maximum polynomial degree for each Chebyshev polynomial (constant numerical expression)
  • -
  • r0: minimum value of argument x
  • -
  • r1: maximum value of argument x
  • -
-

Example test program

-
midikey2hz_chebychev(mk) = ba.tabulate_chebychev(1, ba.midikey2hz, 100, 4, 0, 127, mk);
-process = midikey2hz_chebychev(ba.time), ba.midikey2hz(ba.time);
-
-
-

(ba.)tabulateNd

-

Tabulate an nD function for access via nearest-value or linear or cubic interpolation. In other words, the tabulated function can be evaluated using interpolation of order 0 (none), 1 (linear), or 3 (cubic).

-

The table size and parameter range of each dimension can and must be separately specified. You can use it anywhere you have an expensive function with multiple parameters with known ranges. You could use it to build a wavetable synth, for example.

-

The number of dimensions is deduced from the number of parameters you give, see below.

-

Note that processing the last point in each interval is not safe. So either be sure the inputs stay in their respective ranges, or use C = 1. Similarly for the first point when doing cubic interpolation.

-

Usage

-
tabulateNd(C, function, (parameters) ).(val|lin|cub) : _
-
-
    -
  • C: whether to dynamically force the parameter values for each dimension to the ranges specified in parameters: 1 forces the check, 0 deactivates it (constant numerical expression)
  • -
  • function: the function we want to tabulate. Can have any number of inputs, but needs to have just one output.
  • -
  • (parameters): sizes, ranges and read values. Note: these need to be in brackets, to make them one entity.
  • -
-

If N is the number of dimensions, we need:

-
    -
  • N times S: number of values to store for this dimension (constant numerical expression)
  • -
  • N times r0: minimum value of this dimension
  • -
  • N times r1: maximum value of this dimension
  • -
  • N times x: read value of this dimension
  • -
-

By providing these parameters, you indirectly specify the number of dimensions; it's the number of parameters divided by 4.

-

The user facing functions are:

-
tabulateNd(C, function, S, parameters).val
-
-
    -
  • Uses the value in the table closest to x.
  • -
-
tabulateNd(C, function, S, parameters).lin
-
-
    -
  • Evaluates at x using linear interpolation between the closest stored values.
  • -
-
tabulateNd(C, function, S, parameters).cub
-
-
    -
  • Evaluates at x using cubic interpolation between the closest stored values.
  • -
-

Example test program

-
powSin(x,y) = sin(pow(x,y)); // The function we want to tabulate
-powSinTable(x,y) = ba.tabulateNd(1, powSin, (sizeX,sizeY, rx0,ry0, rx1,ry1, x,y) ).lin;
-sizeX = 512; // table size of the first parameter
-sizeY = 512; // table size of the second parameter
-rx0 = 2; // start of the range of the first parameter
-ry0 = 2; // start of the range of the second parameter
-rx1 = 10; // end of the range of the first parameter
-ry1 = 10; // end of the range of the second parameter
-x = hslider("x", rx0, rx0, rx1, 0.001):si.smoo;
-y = hslider("y", ry0, ry0, ry1, 0.001):si.smoo;
-process = powSinTable(x,y), powSin(x,y);
-
-

Working principle

-

The .val function just outputs the closest stored value. -The .lin and .cub functions interpolate in N dimensions.

-
Multi dimensional interpolation
-

To understand what it means to interpolate in N dimensions, here's a quick reminder on the general principle of 2D linear interpolation:

-
    -
  • We have a grid of values, and we want to find the value at a point (x, y) within this grid.
  • -
  • We first find the four closest points (A, B, C, D) in the grid surrounding the point (x, y).
  • -
-

Then, we perform linear interpolation in the x-direction between points A and B, and between points C and D. This gives us two new points E and F. Finally, we perform linear interpolation in the y-direction between points E and F to get our value.

-

To implement this in Faust, we need N sequential groups of interpolators, where N is the number of dimensions.
-Each group feeds into the next, with the last "group" being a single interpolator, and the group before it containing one interpolator for each input of the group it's feeding.

-

Some examples:

-
    -
  • Our 2D linear example has two interpolators feeding into one.
  • -
  • A 3D linear interpolator has four interpolators feeding into two, feeding into one.
  • -
  • A 2D cubic interpolater has four interpolators feeding into one.
  • -
  • A 3D cubic interpolator has sixteen interpolators feeding into four, feeding into one.
  • -
-

To understand which values we need to look up, let's consider the 2D linear example again. -The four values going into the first group represent the four closest points (A, B, C, D) mentioned above.

-

1) The first interpolator gets:

-
    -
  • The closest value that is stored (A)
  • -
  • The next value in the x dimension, keeping y fixed (B)
  • -
-

2) The second interpolator gets:

-
    -
  • One step over in the y dimension, keeping x fixed (C)
  • -
  • One step over in both the x dimension and the y dimension (D)
  • -
-

The outputs of these two interpolators are points E and F. -In other words: the interpolated x values and, respectively, the following y values:

-
    -
  • The closest stored value of the y dimension
  • -
  • One step forward in the y dimension
  • -
-

The last interpolator takes these two values and interpolates them in the y dimension.

-

To generalize for N dimensions and linear interpolation:

-
    -
  • The first group has 2^(n-1) parallel interpolators interpolating in the first dimension.
  • -
  • The second group has 2^(n-2) parallel interpolators interpolating in the second dimension.
  • -
  • The process continues until the n-th group, which has a single interpolator interpolating in the n-th dimension.
  • -
-

The same principle applies to the cubic interpolation in nD. The only difference is that there would be 4^(n-1) parallel interpolators in the first group, compared to 2^(n-1) for linear interpolation.

-

This is what the mixers function does.

-

Besides the values, each interpolator also needs to know the weight of each value in it's output.
-Let's call this d, like in ba.interpolate. It is the same for each group of interpolators, since it correlates to a dimension.
-It's value is calculated the similarly to ba.interpolate:

-
    -
  • First we prepare a "float table read-index" for that dimension (id in ba.tabulate)
  • -
  • If the table only had that dimension and it could read a float index, what would it be.
  • -
  • Then we int the float index to get the value we have stored that is closest to, but lower than the input value; the actual index for that dimension. -Our d is the difference between the float index and the actual index.
  • -
-

The ids function calculates the id for each dimension and inside the mixer function they get turned into ds.

-
Storage method
-

The elephant in the room is: how do we get these indexes? For that we need to know how the values are stored. -We use one big table to store everything.

-

To understand the concept, let's look at the 2D example again, and then we'll extend it to 3d and the general nD case.

-

Let's say we have a 2D table with dimensions A and B where: -A has 3 values between 0 and 5 and B has 4 values between 0 and 1. -The 1D array representation of this 2D table will have a size of 3 * 4 = 12.

-

The values are stored in the following way:

-
    -
  • First 3 values: A is 0, then 3, then 5 while B is at 0.
  • -
  • Next 3 values: A changes from 0 to 5 while B is at 1/3.
  • -
  • Next 3 values: A changes from 0 to 5 while B is at 2/3.
  • -
  • Last 3 values: A changes from 0 to 5 while B is at 1.
  • -
-

For the 3D example, let's extend the 2D example with an additional dimension C having 2 values between 0 and 2. -The total size will be 3 * 4 * 2 = 24.

-

The values are stored like so:

-
    -
  • First 3 values: A changes from 0 to 5, B is at 0, and C is at 0.
  • -
  • Next 3 values: A changes from 0 to 5, B is at 1/3, and C is at 0.
  • -
  • Next 3 values: A changes from 0 to 5, B is at 2/3, and C is at 0.
  • -
  • Next 3 values: A changes from 0 to 5, B is at 1, and C is at 0.
  • -
-

The last 12 values are the same as the first 12, but with C at 2.

-

For the general n-dimensional case, we iterate through all dimensions, changing the values of the innermost dimension first, then moving towards the outer dimensions.

-
Read indexes
-

To get the float read index (id) corresponding to a particular dimension, we scale the function input value to be between 0 and 1, and multiply it by the size of that dimension minus one.

-

To understand how we get the readIndexfor .val, let's work trough how we'd do it in our 2D linear example.
-For simplicity's sake, the ranges of the inputs to our function are both 0 to 1.
-Say we wanted to read the value closest to x=0.5 and y=0, so the id of x is 1 (the second value) and the id of y is 0 (first value). In this case, the read index is just the id of x, rounded to the nearest integer, just like in ba.tabulate.

-

If we want to read the value belonging to x=0.5 and y=2/3, things get more complicated. The id for y is now 2, the third value. For each step in the y direction, we need to increase the index by 3, the number of values that are stored for x. So the influence of the y is: the size of x times the rounded id of y. The final read index is the rounded id of x plus the influence of y.

-

For the general nD case, we need to do the same operation N times, each feeding into the next. This operation is the riN function. We take four parameters: the size of the dimension before it prevSize, the index of the previous dimension prevIX, the current size sizeX and the current id idX. riN has 2 outputs, the size, for feeding into the next dimension's prevSize, and the read index feeding into the next dimension's prevIX.
-The size is the sizeX times prevSize. The read index is the rounded idX times prevSize added to the prevIX. Our final readIndex is the read index output of the last dimension.

-

To get the read values for the interpolators need a pattern of offsets in each dimension, since we are looking for the read indexes surrounding the point of interest. These offsets are best explained by looking at the code of tabulate2d, the hardcoded 2D version:

-
tabulate2d(C,function, sizeX,sizeY, rx0,ry0, rx1,ry1, x,y) =
-  environment {
-    size = sizeX*sizeY;
-    // Maximum X index to access
-    midX = sizeX-1;
-    // Maximum Y index to access
-    midY = sizeY-1;
-    // Maximum total index to access
-    mid = size-1;
-    // Create the table
-    wf = function(wfX,wfY);
-    // Prepare the 'float' table read index for X
-    idX = (x-rx0)/(rx1-rx0)*midX;
-    // Prepare the 'float' table read index for Y
-    idY = ((y-ry0)/(ry1-ry0))*midY;
-    // table creation X:
-    wfX =
-      rx0+float(ba.time%sizeX)*(rx1-rx0)
-      /float(midX);
-    // table creation Y:
-    wfY =
-      ry0+
-      ((float(ba.time-(ba.time%sizeX))
-        /float(sizeX))
-       *(ry1-ry0))
-      /float(midY);
-
-    // Limit the table read index in [0, mid] if C = 1
-    rid(x,mid, 0) = x;
-    rid(x,mid, 1) = max(0, min(x, mid));
-
-    // Tabulate a binary 'FX' function on a range [rx0, rx1] [ry0, ry1]
-    val(x,y) =
-      rdtable(size, wf, readIndex);
-    readIndex =
-      rid(
-        rid(int(idX+0.5),midX, C)
-        +yOffset
-      , mid, C);
-    yOffset = sizeX*rid(int(idY),midY,C);
-
-    // Tabulate a binary 'FX' function over the range [rx0, rx1] [ry0, ry1] with linear interpolation
-    lin =
-      it.interpolate_linear(
-        dy
-      , it.interpolate_linear(dx,v0,v1)
-      , it.interpolate_linear(dx,v2,v3))
-    with {
-      i0 = rid(int(idX), midX, C)+yOffset;
-      i1 = i0+1;
-      i2 = i0+sizeX;
-      i3 = i1+sizeX;
-      dx  = idX-int(idX);
-      dy  = idY-int(idY);
-      v0 = rdtable(size, wf, rid(i0, mid, C));
-      v1 = rdtable(size, wf, rid(i1, mid, C));
-      v2 = rdtable(size, wf, rid(i2, mid, C));
-      v3 = rdtable(size, wf, rid(i3, mid, C));
-    };
-
-    // Tabulate a binary 'FX' function over the range [rx0, rx1] [ry0, ry1] with cubic interpolation
-    cub =
-      it.interpolate_cubic(
-        dy
-      , it.interpolate_cubic(dx,v0,v1,v2,v3)
-      , it.interpolate_cubic(dx,v4,v5,v6,v7)
-      , it.interpolate_cubic(dx,v8,v9,v10,v11)
-      , it.interpolate_cubic(dx,v12,v13,v14,v15)
-      )
-    with {
-      i0  = i4-sizeX;
-      i1  = i5-sizeX;
-      i2  = i6-sizeX;
-      i3  = i7-sizeX;
-
-      i4  = i5-1;
-      i5  = rid(int(idX), midX, C)+yOffset;
-      i6  = i5+1;
-      i7  = i6+1;
-
-      i8  = i4+sizeX;
-      i9  = i5+sizeX;
-      i10 = i6+sizeX;
-      i11 = i7+sizeX;
-
-      i12 = i4+(2*sizeX);
-      i13 = i5+(2*sizeX);
-      i14 = i6+(2*sizeX);
-      i15 = i7+(2*sizeX);
-
-      dx  = idX-int(idX);
-      dy  = idY-int(idY);
-      v0  = rdtable(size, wf, rid(i0 , mid, C));
-      v1  = rdtable(size, wf, rid(i1 , mid, C));
-      v2  = rdtable(size, wf, rid(i2 , mid, C));
-      v3  = rdtable(size, wf, rid(i3 , mid, C));
-      v4  = rdtable(size, wf, rid(i4 , mid, C));
-      v5  = rdtable(size, wf, rid(i5 , mid, C));
-      v6  = rdtable(size, wf, rid(i6 , mid, C));
-      v7  = rdtable(size, wf, rid(i7 , mid, C));
-      v8  = rdtable(size, wf, rid(i8 , mid, C));
-      v9  = rdtable(size, wf, rid(i9 , mid, C));
-      v10 = rdtable(size, wf, rid(i10, mid, C));
-      v11 = rdtable(size, wf, rid(i11, mid, C));
-      v12 = rdtable(size, wf, rid(i12, mid, C));
-      v13 = rdtable(size, wf, rid(i13, mid, C));
-      v14 = rdtable(size, wf, rid(i14, mid, C));
-      v15 = rdtable(size, wf, rid(i15, mid, C));
-    };
-  };
-
-

In the interest of brevity, we'll stop explaining here. If you have any more questions, feel free to open an issue on faustlibraries and tag @magnetophon.

-

Selectors (Conditions)

-
-

(ba.)if

-

if-then-else implemented with a select2. WARNING: since select2 is strict (always evaluating both branches), -the resulting if does not have the usual "lazy" semantic of the C if form, and thus cannot be used to -protect against forbidden computations like division-by-zero for instance.

-

Usage

-
    -
  • if(cond, then, else) : _
  • -
-

Where:

-
    -
  • cond: condition
  • -
  • then: signal selected while cond is true
  • -
  • else: signal selected while cond is false
  • -
-
-

(ba.)ifNc

-

if-then-elseif-then-...elsif-then-else implemented on top of ba.if.

-

Usage

-
   ifNc((cond1,then1, cond2,then2, ... condN,thenN, else)) : _
-or
-   ifNc(Nc, cond1,then1, cond2,then2, ... condN,thenN, else) : _
-or
-   cond1,then1, cond2,then2, ... condN,thenN, else : ifNc(Nc) : _
-
-

Where:

-
    -
  • Nc : number of branches/conditions (constant numerical expression)
  • -
  • condX: condition
  • -
  • thenX: signal selected if condX is the 1st true condition
  • -
  • else: signal selected if all the cond1-condN conditions are false
  • -
-

Example test program

-
   process(x,y) = ifNc((x<y,-1, x>y,+1, 0));
-or
-   process(x,y) = ifNc(2, x<y,-1, x>y,+1, 0);
-or
-   process(x,y) = x<y,-1, x>y,+1, 0 : ifNc(2);
-
-

outputs -1 if x<y, +1 if x>y, 0 otherwise.

-
-

(ba.)ifNcNo

-

ifNcNo(Nc,No) is similar to ifNc(Nc) above but then/else branches have No outputs.

-

Usage

-
   ifNcNo(Nc,No, cond1,then1, cond2,then2, ... condN,thenN, else) : sig.bus(No)
-
-

Where:

-
    -
  • Nc : number of branches/conditions (constant numerical expression)
  • -
  • No : number of outputs (constant numerical expression)
  • -
  • condX: condition
  • -
  • thenX: list of No signals selected if condX is the 1st true condition
  • -
  • else: list of No signals selected if all the cond1-condN conditions are false
  • -
-

Example test program

-
   process(x) = ifNcNo(2,3, x<0, -1,-1,-1, x>0, 1,1,1, 0,0,0);
-
-

outputs -1,-1,-1 if x<0, 1,1,1 if x>0, 0,0,0 otherwise.

-
-

(ba.)selector

-

Selects the ith input among n at compile time.

-

Usage

-
selector(I,N)
-_,_,_,_ : selector(2,4) : _ // selects the 3rd input among 4
-
-

Where:

-
    -
  • I: input to select (int, numbered from 0, known at compile time)
  • -
  • N: number of inputs (int, known at compile time, N > I)
  • -
-

There is also cselector for selecting among complex input signals of the form (real,imag).

-
-

(ba.)select2stereo

-

Select between 2 stereo signals.

-

Usage

-
_,_,_,_ : select2stereo(bpc) : _,_
-
-

Where:

-
    -
  • bpc: the selector switch (0/1)
  • -
-
-

(ba.)selectn

-

Selects the ith input among N at run time.

-

Usage

-
selectn(N,i)
-_,_,_,_ : selectn(4,2) : _ // selects the 3rd input among 4
-
-

Where:

-
    -
  • N: number of inputs (int, known at compile time, N > 0)
  • -
  • i: input to select (int, numbered from 0)
  • -
-

Example test program

-
N = 64;
-process = par(n, N, (par(i,N,i) : selectn(N,n)));
-
-
-

(ba.)selectbus

-

Select a bus among NUM_BUSES buses, where each bus has BUS_SIZE outputs. -The order of the signal inputs should be the signals of the first bus, the -signals of the second bus, and so on.

-

Usage

-
process = si.bus(BUS_SIZE*NUM_BUSES) : selectbus(BUS_SIZE, NUM_BUSES, id) : si.bus(BUS_SIZE);
-
-

Where:

-
    -
  • BUS_SIZE: number of outputs from each bus (int, known at compile time).
  • -
  • NUM_BUSES: number of buses (int, known at compile time).
  • -
  • id: index of the bus to select (int, 0<=id<NUM_BUSES)
  • -
-
-

(ba.)selectxbus

-

Like ba.selectbus, but with a cross-fade when selecting the bus using the same -technique than ba.selectmulti.

-

Usage

-
process = si.bus(BUS_SIZE*NUM_BUSES) : selectbus(BUS_SIZE, NUM_BUSES, FADE, id) : si.bus(BUS_SIZE);
-
-

Where:

-
    -
  • BUS_SIZE: number of outputs from each bus (int, known at compile time).
  • -
  • NUM_BUSES: number of buses (int, known at compile time).
  • -
  • fade: number of samples for the crossfade.
  • -
  • id: index of the bus to select (int, 0<=id<NUM_BUSES)
  • -
-
-

(ba.)selectmulti

-

Selects the ith circuit among N at run time (all should have the same number of inputs and outputs) -with a crossfade.

-

Usage

-
selectmulti(n,lgen,id)
-
-

Where:

-
    -
  • n: crossfade in samples
  • -
  • lgen: list of circuits
  • -
  • id: circuit to select (int, numbered from 0)
  • -
-

Example test program

-
process = selectmulti(ma.SR/10, ((3,9),(2,8),(5,7)), nentry("choice", 0, 0, 2, 1));
-process = selectmulti(ma.SR/10, ((_*3,_*9),(_*2,_*8),(_*5,_*7)), nentry("choice", 0, 0, 2, 1));
-
-
-

(ba.)selectoutn

-

Route input to the output among N at run time.

-

Usage

-
_ : selectoutn(N, i) : si.bus(N)
-
-

Where:

-
    -
  • N: number of outputs (int, known at compile time, N > 0)
  • -
  • i: output number to route to (int, numbered from 0) (i.e. slider)
  • -
-

Example test program

-
process = 1 : selectoutn(3, sel) : par(i, 3, vbargraph("v.bargraph %i", 0, 1));
-sel = hslider("volume", 0, 0, 2, 1) : int;
-
-

Other

-
-

(ba.)latch

-

Latch input on positive-going transition of trig: "records" the input when trig -switches from 0 to 1, outputs a frozen values everytime else.

-

Usage

-
_ : latch(trig) : _
-
-

Where:

-
    -
  • trig: hold trigger (0 for hold, 1 for bypass)
  • -
-
-

(ba.)sAndH

-

Sample And Hold: "records" the input when trig is 1, outputs a frozen value when trig is 0. -sAndH is a standard Faust function.

-

Usage

-
_ : sAndH(trig) : _
-
-

Where:

-
    -
  • trig: hold trigger (0 for hold, 1 for bypass)
  • -
-
-

(ba.)downSample

-

Down sample a signal. WARNING: this function doesn't change the -rate of a signal, it just holds samples... -downSample is a standard Faust function.

-

Usage

-
_ : downSample(freq) : _
-
-

Where:

-
    -
  • freq: new rate in Hz
  • -
-
-

(ba.)downSampleCV

-

A version of ba.downSample where the frequency parameter has -been replaced by an amount parameter that is in the range zero -to one. WARNING: this function doesn't change the rate of a -signal, it just holds samples...

-

Usage

-
_ : downSampleCV(amount) : _
-
-

Where:

-
    -
  • amount: The amount of down-sampling to perform [0..1]
  • -
-
-

(ba.)peakhold

-

Outputs current max value above zero.

-

Usage

-
_ : peakhold(mode) : _
-
-

Where:

-

mode means:

-

0 - Pass through. A single sample 0 trigger will work as a reset.

-

1 - Track and hold max value.

-
-

(ba.)peakholder

-

While peak-holder functions are scarcely discussed in the literature -(please do send me an email if you know otherwise), common sense -tells that the expected behaviour should be as follows: the absolute -value of the input signal is compared with the output of the peak-holder; -if the input is greater or equal to the output, a new peak is detected -and sent to the output; otherwise, a timer starts and the current peak -is held for N samples; once the timer is out and no new peaks have been -detected, the absolute value of the current input becomes the new peak.

-

Usage

-
_ : peakholder(holdTime) : _
-
-

Where:

-
    -
  • holdTime: hold time in samples
  • -
-
-

(ba.)kr2ar

-

Force a control rate signal to be used as an audio rate signal.

-

Usage

-
hslider("freq", 200, 200, 2000, 0.1) : kr2ar;
-
-
-

(ba.)impulsify

-

Turns a signal into an impulse with the value of the current sample -(0.3,0.2,0.1 becomes 0.3,0.0,0.0). This function is typically used with a -button to turn its output into an impulse. impulsify is a standard Faust -function.

-

Usage

-
button("gate") : impulsify;
-
-
-

(ba.)automat

-

Record and replay in a loop the successives values of the input signal.

-

Usage

-
hslider(...) : automat(t, size, init) : _
-
-

Where:

-
    -
  • t: tempo in BPM
  • -
  • size: number of items in the loop
  • -
  • init: init value in the loop
  • -
-
-

(ba.)bpf

-

bpf is an environment (a group of related definitions) that can be used to -create break-point functions. It contains three functions:

-
    -
  • start(x,y) to start a break-point function
  • -
  • end(x,y) to end a break-point function
  • -
  • point(x,y) to add intermediate points to a break-point function, using linear interpolation
  • -
-

A minimal break-point function must contain at least a start and an end point:

-
f = bpf.start(x0,y0) : bpf.end(x1,y1);
-
-

A more involved break-point function can contains any number of intermediate -points:

-
f = bpf.start(x0,y0) : bpf.point(x1,y1) : bpf.point(x2,y2) : bpf.end(x3,y3);
-
-

In any case the x_{i} must be in increasing order (for all i, x_{i} < x_{i+1}). -For example the following definition:

-
f = bpf.start(x0,y0) : ... : bpf.point(xi,yi) : ... : bpf.end(xn,yn);
-
-

implements a break-point function f such that:

-
    -
  • f(x) = y_{0} when x < x_{0}
  • -
  • f(x) = y_{n} when x > x_{n}
  • -
  • f(x) = y_{i} + (y_{i+1}-y_{i})*(x-x_{i})/(x_{i+1}-x_{i}) when x_{i} <= x -and x < x_{i+1}
  • -
-

In addition to bpf.point, there are also step and curve functions:

-
    -
  • step(x,y) to add a flat section
  • -
  • step_end(x,y) to end with a flat section
  • -
  • curve(B,x,y) to add a curved section
  • -
  • curve_end(B,x,y) to end with a curved section
  • -
-

These functions can be combined with the other bpf functions.

-

Here's an example using bpf.step:

-

f(x) = x : bpf.start(0,0) : bpf.step(.2,.3) : bpf.step(.4,.6) : bpf.step_end(1,1);

-

For x < 0.0, the output is 0.0. -For 0.0 <= x < 0.2, the output is 0.0. -For 0.2 <= x < 0.4, the output is 0.3. -For 0.4 <= x < 1.0, the output is 0.6. -For 1.0 <= x, the output is 1.0

-

For the curve functions, B (compile-time constant) -is a "bias" value strictly greater than zero and less than or equal to 1. When B is 0.5, the -output curve is exactly linear and equivalent to bpf.point. When B is less than 0.5, the -output is biased towards the y value of the previous breakpoint. When B is greater than 0.5, -the output is biased towards the y value of the curve breakpoint. Here's an example:

-

f = bpf.start(0,0) : bpf.curve(.15,.5,.5) : bpf.curve_end(.85,1,1);

-

In the following example, the output is biased towards zero (the latter y value) instead of -being a linear ramp from 1 to 0.

-

f = bpf.start(0,1) : bpf.curve_end(.9,1,0);

-

bpf is a standard Faust function.

-
-

(ba.)listInterp

-

Linearly interpolates between the elements of a list.

-

Usage

-
index = 1.69; // range is 0-4
-process = listInterp((800,400,350,450,325),index);
-
-

Where:

-
    -
  • index: the index (float) to interpolate between the different values. -The range of index depends on the size of the list.
  • -
-
-

(ba.)bypass1

-

Takes a mono input signal, route it to e and bypass it if bpc = 1. -When bypassed, e is feed with zeros so that its state is cleanup up. -bypass1 is a standard Faust function.

-

Usage

-
_ : bypass1(bpc,e) : _
-
-

Where:

-
    -
  • bpc: bypass switch (0/1)
  • -
  • e: a mono effect
  • -
-
-

(ba.)bypass2

-

Takes a stereo input signal, route it to e and bypass it if bpc = 1. -When bypassed, e is feed with zeros so that its state is cleanup up. -bypass2 is a standard Faust function.

-

Usage

-
_,_ : bypass2(bpc,e) : _,_
-
-

Where:

-
    -
  • bpc: bypass switch (0/1)
  • -
  • e: a stereo effect
  • -
-
-

(ba.)bypass1to2

-

Bypass switch for effect e having mono input signal and stereo output. -Effect e is bypassed if bpc = 1.When bypassed, e is feed with zeros -so that its state is cleanup up. -bypass1to2 is a standard Faust function.

-

Usage

-
_ : bypass1to2(bpc,e) : _,_
-
-

Where:

-
    -
  • bpc: bypass switch (0/1)
  • -
  • e: a mono-to-stereo effect
  • -
-
-

(ba.)bypass_fade

-

Bypass an arbitrary (N x N) circuit with 'n' samples crossfade. -Inputs and outputs signals are faded out when 'e' is bypassed, -so that 'e' state is cleanup up. -Once bypassed the effect is replaced by par(i,N,_). -Bypassed circuits can be chained.

-

Usage

-
_ : bypass_fade(n,b,e) : _
-or
-_,_ : bypass_fade(n,b,e) : _,_
-
-
    -
  • n: number of samples for the crossfade
  • -
  • b: bypass switch (0/1)
  • -
  • e: N x N circuit
  • -
-

Example test program

-
process = bypass_fade(ma.SR/10, checkbox("bypass echo"), echo);
-process = bypass_fade(ma.SR/10, checkbox("bypass reverb"), freeverb);
-
-
-

(ba.)toggle

-

Triggered by the change of 0 to 1, it toggles the output value -between 0 and 1.

-

Usage

-
_ : toggle : _
-
-

Example test program

-
button("toggle") : toggle : vbargraph("output", 0, 1)
-(an.amp_follower(0.1) > 0.01) : toggle : vbargraph("output", 0, 1) // takes audio input
-
-
-

(ba.)on_and_off

-

The first channel set the output to 1, the second channel to 0.

-

Usage

-
_,_ : on_and_off : _
-
-

Example test program

-
button("on"), button("off") : on_and_off : vbargraph("output", 0, 1)
-
-
-

(ba.)bitcrusher

-

Produce distortion by reduction of the signal resolution.

-

Usage

-
_ : bitcrusher(nbits) : _
-
-

Where:

-
    -
  • nbits: the number of bits of the wanted resolution
  • -
-

Sliding Reduce

-

Provides various operations on the last n samples using a high order -slidingReduce(op,n,maxN,disabledVal,x) fold-like function:

-
    -
  • slidingSum(n): the sliding sum of the last n input samples, CPU-light
  • -
  • slidingSump(n,maxN): the sliding sum of the last n input samples, numerically stable "forever"
  • -
  • slidingMax(n,maxN): the sliding max of the last n input samples
  • -
  • slidingMin(n,maxN): the sliding min of the last n input samples
  • -
  • slidingMean(n): the sliding mean of the last n input samples, CPU-light
  • -
  • slidingMeanp(n,maxN): the sliding mean of the last n input samples, numerically stable "forever"
  • -
  • slidingRMS(n): the sliding RMS of the last n input samples, CPU-light
  • -
  • slidingRMSp(n,maxN): the sliding RMS of the last n input samples, numerically stable "forever"
  • -
-

Working Principle

-

If we want the maximum of the last 8 values, we can do that as:

-
simpleMax(x) =
- (
-   (
-     max(x@0,x@1),
-     max(x@2,x@3)
-   ) :max
- ),
- (
-   (
-     max(x@4,x@5),
-     max(x@6,x@7)
-   ) :max
- )
- :max;
-
-

max(x@2,x@3) is the same as max(x@0,x@1)@2 but the latter re-uses a -value we already computed,so is more efficient. Using the same trick for -values 4 trough 7, we can write:

-
efficientMax(x)=
- (
-   (
-     max(x@0,x@1),
-     max(x@0,x@1)@2
-   ) :max
- ),
- (
-   (
-     max(x@0,x@1),
-     max(x@0,x@1)@2
-   ) :max@4
- )
- :max;
-
-

We can rewrite it recursively, so it becomes possible to get the maximum at -have any number of values, as long as it's a power of 2.

-
recursiveMax =
- case {
-   (1,x) => x;
-   (N,x) => max(recursiveMax(N/2,x), recursiveMax(N/2,x)@(N/2));
- };
-
-

What if we want to look at a number of values that's not a power of 2? -For each value, we will have to decide whether to use it or not. -If n is bigger than the index of the value, we use it, otherwise we replace -it with (0-(ma.MAX)):

-
variableMax(n,x) =
- max(
-   max(
-     (
-       (x@0 : useVal(0)),
-       (x@1 : useVal(1))
-     ):max,
-     (
-       (x@2 : useVal(2)),
-       (x@3 : useVal(3))
-     ):max
-   ),
-   max(
-     (
-       (x@4 : useVal(4)),
-       (x@5 : useVal(5))
-     ):max,
-     (
-       (x@6 : useVal(6)),
-       (x@7 : useVal(7))
-     ):max
-   )
- )
-with {
- useVal(i) = select2((n>=i) , (0-(ma.MAX)),_);
-};
-
-

Now it becomes impossible to re-use any values. To fix that let's first look -at how we'd implement it using recursiveMax, but with a fixed n that is not -a power of 2. For example, this is how you'd do it with n=3:

-
binaryMaxThree(x) =
- (
-   recursiveMax(1,x)@0, // the first x
-   recursiveMax(2,x)@1  // the second and third x
- ):max;
-
-

n=6

-
binaryMaxSix(x) =
- (
-   recursiveMax(2,x)@0, // first two
-   recursiveMax(4,x)@2  // third trough sixth
- ):max;
-
-

Note that recursiveMax(2,x) is used at a different delay then in -binaryMaxThree, since it represents 1 and 2, not 2 and 3. Each block is -delayed the combined size of the previous blocks.

-

n=7

-
binaryMaxSeven(x) =
- (
-   (
-     recursiveMax(1,x)@0, // first x
-     recursiveMax(2,x)@1  // second and third
-   ):max,
-   (
-     recursiveMax(4,x)@3  // fourth trough seventh
-   )
- ):max;
-
-

To make a variable version, we need to know which powers of two are used, -and at which delay time.

-

Then it becomes a matter of:

-
    -
  • lining up all the different block sizes in parallel: sequentialOperatorParOut()
  • -
  • delaying each the appropriate amount: sumOfPrevBlockSizes()
  • -
  • turning it on or off: useVal()
  • -
  • getting the maximum of all of them: parallelOp()
  • -
-

In Faust, we can only do that for a fixed maximum number of values: maxN, known at compile time.

-
-

(ba.)slidingReduce

-

Fold-like high order function. Apply a commutative binary operation op to -the last n consecutive samples of a signal x. For example : -slidingReduce(max,128,128,0-(ma.MAX)) will compute the maximum of the last -128 samples. The output is updated each sample, unlike reduce, where the -output is constant for the duration of a block.

-

Usage

-
_ : slidingReduce(op,n,maxN,disabledVal) : _
-
-

Where:

-
    -
  • n: the number of values to process
  • -
  • maxN: the maximum number of values to process (int, known at compile time, maxN > 0)
  • -
  • op: the operator. Needs to be a commutative one.
  • -
  • disabledVal: the value to use when we want to ignore a value.
  • -
-

In other words, op(x,disabledVal) should equal to x. For example, -+(x,0) equals x and min(x,ma.MAX) equals x. So if we want to -calculate the sum, we need to give 0 as disabledVal, and if we want the -minimum, we need to give ma.MAX as disabledVal.

-
-

(ba.)slidingSum

-

The sliding sum of the last n input samples.

-

It will eventually run into numerical trouble when there is a persistent dc component. -If that matters in your application, use the more CPU-intensive ba.slidingSump.

-

Usage

-
_ : slidingSum(n) : _
-
-

Where:

-
    -
  • n: the number of values to process
  • -
-
-

(ba.)slidingSump

-

The sliding sum of the last n input samples.

-

It uses a lot more CPU than ba.slidingSum, but is numerically stable "forever" in return.

-

Usage

-
_ : slidingSump(n,maxN) : _
-
-

Where:

-
    -
  • n: the number of values to process
  • -
  • maxN: the maximum number of values to process (int, known at compile time, maxN > 0)
  • -
-
-

(ba.)slidingMax

-

The sliding maximum of the last n input samples.

-

Usage

-
_ : slidingMax(n,maxN) : _
-
-

Where:

-
    -
  • n: the number of values to process
  • -
  • maxN: the maximum number of values to process (int, known at compile time, maxN > 0)
  • -
-
-

(ba.)slidingMin

-

The sliding minimum of the last n input samples.

-

Usage

-
_ : slidingMin(n,maxN) : _
-
-

Where:

-
    -
  • n: the number of values to process
  • -
  • maxN: the maximum number of values to process (int, known at compile time, maxN > 0)
  • -
-
-

(ba.)slidingMean

-

The sliding mean of the last n input samples.

-

It will eventually run into numerical trouble when there is a persistent dc component. -If that matters in your application, use the more CPU-intensive ba.slidingMeanp.

-

Usage

-
_ : slidingMean(n) : _
-
-

Where:

-
    -
  • n: the number of values to process
  • -
-
-

(ba.)slidingMeanp

-

The sliding mean of the last n input samples.

-

It uses a lot more CPU than ba.slidingMean, but is numerically stable "forever" in return.

-

Usage

-
_ : slidingMeanp(n,maxN) : _
-
-

Where:

-
    -
  • n: the number of values to process
  • -
  • maxN: the maximum number of values to process (int, known at compile time, maxN > 0)
  • -
-
-

(ba.)slidingRMS

-

The root mean square of the last n input samples.

-

It will eventually run into numerical trouble when there is a persistent dc component. -If that matters in your application, use the more CPU-intensive ba.slidingRMSp.

-

Usage

-
_ : slidingRMS(n) : _
-
-

Where:

-
    -
  • n: the number of values to process
  • -
-
-

(ba.)slidingRMSp

-

The root mean square of the last n input samples.

-

It uses a lot more CPU than ba.slidingRMS, but is numerically stable "forever" in return.

-

Usage

-
_ : slidingRMSp(n,maxN) : _
-
-

Where:

-
    -
  • n: the number of values to process
  • -
  • maxN: the maximum number of values to process (int, known at compile time, maxN > 0)
  • -
-

Parallel Operators

-

Provides various operations on N parallel inputs using a high order -parallelOp(op,N,x) function:

-
    -
  • parallelMax(N): the max of n parallel inputs
  • -
  • parallelMin(N): the min of n parallel inputs
  • -
  • parallelMean(N): the mean of n parallel inputs
  • -
  • parallelRMS(N): the RMS of n parallel inputs
  • -
-
-

(ba.)parallelOp

-

Apply a commutative binary operation op to N parallel inputs.

-

usage

-
si.bus(N) : parallelOp(op,N) : _
-
-

where:

-
    -
  • N: the number of parallel inputs known at compile time
  • -
  • op: the operator which needs to be commutative
  • -
-
-

(ba.)parallelMax

-

The maximum of N parallel inputs.

-

Usage

-
si.bus(N) : parallelMax(N) : _
-
-

Where:

-
    -
  • N: the number of parallel inputs known at compile time
  • -
-
-

(ba.)parallelMin

-

The minimum of N parallel inputs.

-

Usage

-
si.bus(N) : parallelMin(N) : _
-
-

Where:

-
    -
  • N: the number of parallel inputs known at compile time
  • -
-
-

(ba.)parallelMean

-

The mean of N parallel inputs.

-

Usage

-
si.bus(N) : parallelMean(N) : _
-
-

Where:

-
    -
  • N: the number of parallel inputs known at compile time
  • -
-
-

(ba.)parallelRMS

-

The RMS of N parallel inputs.

-

Usage

-
si.bus(N) : parallelRMS(N) : _
-
-

Where:

-
    -
  • N: the number of parallel inputs known at compile time
  • -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/basics.lib/overview/index.html b/docs/contributors/faust/basics.lib/overview/index.html deleted file mode 100644 index 2c41176..0000000 --- a/docs/contributors/faust/basics.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - basics.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

basics.lib Documentation

-

Welcome to the documentation for basics.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.19.1

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/compressors.lib/1.6.0/doc/index.html b/docs/contributors/faust/compressors.lib/1.6.0/doc/index.html deleted file mode 100644 index 47c892c..0000000 --- a/docs/contributors/faust/compressors.lib/1.6.0/doc/index.html +++ /dev/null @@ -1,1222 +0,0 @@ - - - - - - - - - - - compressors.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
- -
- -

compressors.lib

-

A library of compressor effects. Its official prefix is co.

-

References

- -

Conversion Tools

-

Useful conversion tools for compressors.

-
-

(co.)ratio2strength

-

Most compressors have a ratio parameter to define the amount of compression. -A ratio of 1 means no compression, a ratio of 2 means that for every dB the input goes above the threshold, -the output gets turned down half a dB. -To use a compressor as a brick wall limiter, the ratio needs to be infinity. -This is hard to express in a faust UI element, and overcompression can not be expressed at all, -therefore most compressors in this library use a strength parameter instead, where -0 means no compression, 1 means hard limiting and bigger than 1 means over-compression.

-

This utility converts a ratio to a strength.

-

Usage

-
ratio2strength(ratio) : _
-
-

Where:

-
    -
  • ratio: compression ratio, between 1 and infinity (1=no compression, infinity means hard limiting)
  • -
-
-

(co.)strength2ratio

-

Most compressors have a ratio parameter to define the amount of compression. -A ratio of 1 means no compression, a ratio of 2 means that for every dB the input goes above the threshold, -the output gets turned down half a dB. -To use a compressor as a brick wall limiter, the ratio needs to be infinity. -This is hard to express in a faust UI element, and overcompression can not be expressed at all, -therefore most compressors in this library use a strength parameter instead, where -0 means no compression, 1 means hard limiting and bigger than 1 means over-compression.

-

This utility converts a strength to a ratio.

-

Usage

-
strength2ratio(strength) : _
-
-

Where:

-
    -
  • strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
  • -
-

Functions Reference

-
-

(co.)peak_compression_gain_mono_db

-

Mono dynamic range compressor gain computer with dB output. -peak_compression_gain_mono_db is a standard Faust function.

-

Usage

-
_ : peak_compression_gain_mono_db(strength,thresh,att,rel,knee,prePost) : _
-
-

Where:

-
    -
  • strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
  • -
  • thresh: dB level threshold above which compression kicks in
  • -
  • att: attack time = time constant (sec) when level & compression going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
  • knee: a gradual increase in gain reduction around the threshold: -below thresh-(knee/2) there is no gain reduction, -above thresh+(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
  • -
-

It uses a strength parameter instead of the traditional ratio, in order to be able to -function as a hard limiter. -For that you'd need a ratio of infinity:1, and you cannot express that in Faust.

-

Sometimes even bigger ratios are useful: -for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

-

References

- -
-

(co.)peak_compression_gain_N_chan_db

-

N channels dynamic range compressor gain computer with dB output. -peak_compression_gain_N_chan_db is a standard Faust function.

-

Usage

-
si.bus(N) : peak_compression_gain_N_chan_db(strength,thresh,att,rel,knee,prePost,link,N) : si.bus(N)
-
-

Where:

-
    -
  • strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
  • -
  • thresh: dB level threshold above which compression kicks in
  • -
  • att: attack time = time constant (sec) when level & compression going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
  • knee: a gradual increase in gain reduction around the threshold: -below thresh-(knee/2) there is no gain reduction, -above thresh+(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
  • -
  • link: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
  • -
  • N: the number of channels of the compressor, known at compile time
  • -
-

It uses a strength parameter instead of the traditional ratio, in order to be able to -function as a hard limiter. -For that you'd need a ratio of infinity:1, and you cannot express that in Faust.

-

Sometimes even bigger ratios are useful: -for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

-

References

- -
-

(co.)FFcompressor_N_chan

-

Feed forward N channels dynamic range compressor. -FFcompressor_N_chan is a standard Faust function.

-

Usage

-
si.bus(N) : FFcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,meter,N) : si.bus(N)
-
-

Where:

-
    -
  • strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
  • -
  • thresh: dB level threshold above which compression kicks in
  • -
  • att: attack time = time constant (sec) when level & compression going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
  • knee: a gradual increase in gain reduction around the threshold: -below thresh-(knee/2) there is no gain reduction, -above thresh+(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
  • -
  • link: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
  • -
  • meter: a gain reduction meter. It can be implemented like so: -meter = _<:(_, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;
  • -
  • N: the number of channels of the compressor, known at compile time
  • -
-

It uses a strength parameter instead of the traditional ratio, in order to be able to -function as a hard limiter. -For that you'd need a ratio of infinity:1, and you cannot express that in Faust.

-

Sometimes even bigger ratios are useful: -for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

-

References

- -
-

(co.)FBcompressor_N_chan

-

Feed back N channels dynamic range compressor. -FBcompressor_N_chan is a standard Faust function.

-

Usage

-
si.bus(N) : FBcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,meter,N) : si.bus(N)
-
-

Where:

-
    -
  • strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
  • -
  • thresh: dB level threshold above which compression kicks in
  • -
  • att: attack time = time constant (sec) when level & compression going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
  • knee: a gradual increase in gain reduction around the threshold: -below thresh-(knee/2) there is no gain reduction, -above thresh+(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
  • -
  • link: the amount of linkage between the channels. 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
  • -
  • meter: a gain reduction meter. It can be implemented with: -meter = _ <: (_,(ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach; -or it can be omitted by defining meter = _;.
  • -
  • N: the number of channels of the compressor, known at compile time
  • -
-

It uses a strength parameter instead of the traditional ratio, in order to be able to -function as a hard limiter. -For that you'd need a ratio of infinity:1, and you cannot express that in Faust.

-

Sometimes even bigger ratios are useful: -for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

-

References

- -
-

(co.)FBFFcompressor_N_chan

-

Feed forward / feed back N channels dynamic range compressor. -The feedback part has a much higher strength, so they end up sounding similar. -FBFFcompressor_N_chan is a standard Faust function.

-

Usage

-
si.bus(N) : FBFFcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,FBFF,meter,N) : si.bus(N)
-
-

Where:

-
    -
  • strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
  • -
  • thresh: dB level threshold above which compression kicks in
  • -
  • att: attack time = time constant (sec) when level & compression going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
  • knee: a gradual increase in gain reduction around the threshold: -below thresh-(knee/2) there is no gain reduction, -above thresh+(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
  • -
  • link: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
  • -
  • FBFF: fade between feed forward (0) and feed back (1) compression
  • -
  • meter: a gain reduction meter. It can be implemented like so: -meter = _<:(_,(max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;
  • -
  • N: the number of channels of the compressor, known at compile time
  • -
-

It uses a strength parameter instead of the traditional ratio, in order to be able to -function as a hard limiter. -For that you'd need a ratio of infinity:1, and you cannot express that in Faust.

-

Sometimes even bigger ratios are useful: -for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

-

References

- -
-

(co.)RMS_compression_gain_mono_db

-

Mono RMS dynamic range compressor gain computer with dB output. -RMS_compression_gain_mono_db is a standard Faust function.

-

Usage

-
_ : RMS_compression_gain_mono_db(strength,thresh,att,rel,knee,prePost) : _
-
-

Where:

-
    -
  • strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
  • -
  • thresh: dB level threshold above which compression kicks in
  • -
  • att: attack time = time constant (sec) when level & compression going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
  • knee: a gradual increase in gain reduction around the threshold: -below thresh-(knee/2) there is no gain reduction, -above thresh+(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
  • -
-

It uses a strength parameter instead of the traditional ratio, in order to be able to -function as a hard limiter. -For that you'd need a ratio of infinity:1, and you cannot express that in Faust.

-

Sometimes even bigger ratios are useful: -for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

-

References

- -
-

(co.)RMS_compression_gain_N_chan_db

-

RMS N channels dynamic range compressor gain computer with dB output. -RMS_compression_gain_N_chan_db is a standard Faust function.

-

Usage

-
si.bus(N) : RMS_compression_gain_N_chan_db(strength,thresh,att,rel,knee,prePost,link,N) : si.bus(N)
-
-

Where:

-
    -
  • strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
  • -
  • thresh: dB level threshold above which compression kicks in
  • -
  • att: attack time = time constant (sec) when level & compression going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
  • knee: a gradual increase in gain reduction around the threshold: -below thresh-(knee/2) there is no gain reduction, -above thresh+(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
  • -
  • link: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
  • -
  • N: the number of channels of the compressor
  • -
-

It uses a strength parameter instead of the traditional ratio, in order to be able to -function as a hard limiter. -For that you'd need a ratio of infinity:1, and you cannot express that in Faust.

-

Sometimes even bigger ratios are useful: -for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

-

References

- -
-

(co.)RMS_FBFFcompressor_N_chan

-

RMS feed forward / feed back N channels dynamic range compressor. -The feedback part has a much higher strength, so they end up sounding similar. -RMS_FBFFcompressor_N_chan is a standard Faust function.

-

Usage

-
si.bus(N) : RMS_FBFFcompressor_N_chan(strength,thresh,att,rel,knee,prePost,link,FBFF,meter,N) : si.bus(N)
-
-

Where:

-
    -
  • strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
  • -
  • thresh: dB level threshold above which compression kicks in
  • -
  • att: attack time = time constant (sec) when level & compression going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
  • knee: a gradual increase in gain reduction around the threshold: -below thresh-(knee/2) there is no gain reduction, -above thresh+(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
  • -
  • link: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
  • -
  • FBFF: fade between feed forward (0) and feed back (1) compression.
  • -
  • meter: a gain reduction meter. It can be implemented with: -meter = _<:(_,(max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;
  • -
  • N: the number of channels of the compressor, known at compile time
  • -
-

It uses a strength parameter instead of the traditional ratio, in order to be able to -function as a hard limiter. -For that you'd need a ratio of infinity:1, and you cannot express that in Faust.

-

Sometimes even bigger ratios are useful: -for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

-

To save CPU we cheat a bit, in a similar way as in the original libs: -instead of crosfading between two sets of gain calculators as above, -we take the abs of the audio from both the FF and FB, and crossfade between those, -and feed that into one set of gain calculators -again the strength is much higher when in FB mode, but implemented differently.

-

References

- -
-

(co.)RMS_FBcompressor_peak_limiter_N_chan

-

N channel RMS feed back compressor into peak limiter feeding back into the FB compressor. -By combining them this way, they complement each other optimally: -the RMS compressor doesn't have to deal with the peaks, -and the peak limiter get's spared from the steady state signal. -The feedback part has a much higher strength, so they end up sounding similar. -RMS_FBcompressor_peak_limiter_N_chan is a standard Faust function.

-

Usage

-
si.bus(N) : RMS_FBcompressor_peak_limiter_N_chan(strength,thresh,threshLim,att,rel,knee,link,meter,meterLim,N) : si.bus(N)
-
-

Where:

-
    -
  • strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
  • -
  • thresh: dB level threshold above which compression kicks in
  • -
  • threshLim: dB level threshold above which the brickwall limiter kicks in
  • -
  • att: attack time = time constant (sec) when level & compression going up -this is also used as the release time of the limiter
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
  • knee: a gradual increase in gain reduction around the threshold: -below thresh-(knee/2) there is no gain reduction, -above thresh+(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction -the limiter uses a knee half this size
  • -
  • link: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
  • -
  • meter: compressor gain reduction meter. It can be implemented with: -meter = _<:(_,(max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;
  • -
  • meterLim: brickwall limiter gain reduction meter. It can be implemented with: -meterLim = _<:(_,(max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;
  • -
  • N: the number of channels of the compressor, known at compile time
  • -
-

It uses a strength parameter instead of the traditional ratio, in order to be able to -function as a hard limiter. -For that you'd need a ratio of infinity:1, and you cannot express that in Faust.

-

Sometimes even bigger ratios are useful: -for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

-

References

- -

Linear gain computer section

-

The gain computer functions in this section have been replaced by a version that outputs dBs, -but we retain the linear output version for backward compatibility.

-
-

(co.)peak_compression_gain_mono

-

Mono dynamic range compressor gain computer with linear output. -peak_compression_gain_mono is a standard Faust function.

-

Usage

-
_ : peak_compression_gain_mono(strength,thresh,att,rel,knee,prePost) : _
-
-

Where:

-
    -
  • strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
  • -
  • thresh: dB level threshold above which compression kicks in
  • -
  • att: attack time = time constant (sec) when level & compression going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
  • knee: a gradual increase in gain reduction around the threshold: -below thresh-(knee/2) there is no gain reduction, -above thresh+(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
  • -
-

It uses a strength parameter instead of the traditional ratio, in order to be able to -function as a hard limiter. -For that you'd need a ratio of infinity:1, and you cannot express that in Faust.

-

Sometimes even bigger ratios are useful: -for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

-

References

- -
-

(co.)peak_compression_gain_N_chan

-

N channels dynamic range compressor gain computer with linear output. -peak_compression_gain_N_chan is a standard Faust function.

-

Usage

-
si.bus(N) : peak_compression_gain_N_chan(strength,thresh,att,rel,knee,prePost,link,N) : si.bus(N)
-
-

Where:

-
    -
  • strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
  • -
  • thresh: dB level threshold above which compression kicks in
  • -
  • att: attack time = time constant (sec) when level & compression going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
  • knee: a gradual increase in gain reduction around the threshold: -below thresh-(knee/2) there is no gain reduction, -above thresh+(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
  • -
  • link: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
  • -
  • N: the number of channels of the compressor, known at compile time
  • -
-

It uses a strength parameter instead of the traditional ratio, in order to be able to -function as a hard limiter. -For that you'd need a ratio of infinity:1, and you cannot express that in Faust.

-

Sometimes even bigger ratios are useful: -for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

-

References

- -
-

(co.)RMS_compression_gain_mono

-

Mono RMS dynamic range compressor gain computer with linear output. -RMS_compression_gain_mono is a standard Faust function.

-

Usage

-
_ : RMS_compression_gain_mono(strength,thresh,att,rel,knee,prePost) : _
-
-

Where:

-
    -
  • strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
  • -
  • thresh: dB level threshold above which compression kicks in
  • -
  • att: attack time = time constant (sec) when level & compression going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
  • knee: a gradual increase in gain reduction around the threshold: -below thresh-(knee/2) there is no gain reduction, -above thresh+(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
  • -
-

It uses a strength parameter instead of the traditional ratio, in order to be able to -function as a hard limiter. -For that you'd need a ratio of infinity:1, and you cannot express that in Faust.

-

Sometimes even bigger ratios are useful: -for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

-

References

- -
-

(co.)RMS_compression_gain_N_chan

-

RMS N channels dynamic range compressor gain computer with linear output. -RMS_compression_gain_N_chan is a standard Faust function.

-

Usage

-
si.bus(N) : RMS_compression_gain_N_chan(strength,thresh,att,rel,knee,prePost,link,N) : si.bus(N)
-
-

Where:

-
    -
  • strength: strength of the compression (0 = no compression, 1 means hard limiting, >1 means over-compression)
  • -
  • thresh: dB level threshold above which compression kicks in
  • -
  • att: attack time = time constant (sec) when level & compression going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
  • knee: a gradual increase in gain reduction around the threshold: -below thresh-(knee/2) there is no gain reduction, -above thresh+(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-threshold detector
  • -
  • link: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
  • -
  • N: the number of channels of the compressor, known at compile time
  • -
-

It uses a strength parameter instead of the traditional ratio, in order to be able to -function as a hard limiter. -For that you'd need a ratio of infinity:1, and you cannot express that in Faust.

-

Sometimes even bigger ratios are useful: -for example a group recording where one instrument is recorded with both a close microphone and a room microphone, -and the instrument is loud enough in the room mic when playing loud, but you want to boost it when it is playing soft.

-

References

- -

Original versions section

-

The functions in this section are largely superseded by the limiters above, but we -retain them for backward compatibility and for situations in which a more permissive, -MIT-style license is required.

-
-

(co.)compressor_lad_mono

-

Mono dynamic range compressor with lookahead delay. -compressor_lad_mono is a standard Faust function.

-

Usage

-
_ : compressor_lad_mono(lad,ratio,thresh,att,rel) : _
-
-

Where:

-
    -
  • lad: lookahead delay in seconds (nonnegative) - gets rounded to nearest sample. - The effective attack time is a good setting
  • -
  • ratio: compression ratio (1 = no compression, >1 means compression) - Ratios: 4 is moderate compression, 8 is strong compression, - 12 is mild limiting, and 20 is pretty hard limiting at the threshold
  • -
  • thresh: dB level threshold above which compression kicks in (0 dB = max level)
  • -
  • att: attack time = time constant (sec) when level & compression are going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
-

References

- -
-

(co.)compressor_mono

-

Mono dynamic range compressors. -compressor_mono is a standard Faust function.

-

Usage

-
_ : compressor_mono(ratio,thresh,att,rel) : _
-
-

Where:

-
    -
  • ratio: compression ratio (1 = no compression, >1 means compression) - Ratios: 4 is moderate compression, 8 is strong compression, - 12 is mild limiting, and 20 is pretty hard limiting at the threshold
  • -
  • thresh: dB level threshold above which compression kicks in (0 dB = max level)
  • -
  • att: attack time = time constant (sec) when level & compression are going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
-

References

- -
-

(co.)compressor_stereo

-

Stereo dynamic range compressors.

-

Usage

-
_,_ : compressor_stereo(ratio,thresh,att,rel) : _,_
-
-

Where:

-
    -
  • ratio: compression ratio (1 = no compression, >1 means compression)
  • -
  • thresh: dB level threshold above which compression kicks in (0 dB = max level)
  • -
  • att: attack time = time constant (sec) when level & compression going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
-

References

- -
-

(co.)compression_gain_mono

-

Compression-gain calculation for dynamic range compressors.

-

Usage

-
_ : compression_gain_mono(ratio,thresh,att,rel) : _
-
-

Where:

-
    -
  • ratio: compression ratio (1 = no compression, >1 means compression)
  • -
  • thresh: dB level threshold above which compression kicks in (0 dB = max level)
  • -
  • att: attack time = time constant (sec) when level & compression going up
  • -
  • rel: release time = time constant (sec) coming out of compression
  • -
-

References

- -
-

(co.)limiter_1176_R4_mono

-

A limiter guards against hard-clipping. It can be -implemented as a compressor having a high threshold (near the -clipping level), fast attack, and high ratio. Since -the compression ratio is so high, some knee smoothing is -desirable (for softer limiting). This example is intended -to get you started using compressors as limiters, so all -parameters are hardwired here to nominal values.

-

ratio: 4 (moderate compression). - See compressor_mono comments for a guide to other choices. - Mike Shipley likes this (lowest) setting on the 1176. - (Grammy award-winning mixer for Queen, Tom Petty, etc.).

-

thresh: -6 dB, meaning 4:1 compression begins at amplitude 1/2.

-

att: 800 MICROseconds (Note: scaled by ratio in the 1176) - The 1176 range is said to be 20-800 microseconds. - Faster attack gives "more bite" (e.g. on vocals), - and makes hard-clipping less likely on fast overloads.

-

rel: 0.5 s (Note: scaled by ratio in the 1176) - The 1176 range is said to be 50-1100 ms.

-

The 1176 also has a "bright, clear eq effect" (use filters.lib if desired). -limiter_1176_R4_mono is a standard Faust function.

-

Usage

-
 _ : limiter_1176_R4_mono : _
-
-

Reference:

- -
-

(co.)limiter_1176_R4_stereo

-

A limiter guards against hard-clipping. It can be -implemented as a compressor having a high threshold (near the -clipping level), fast attack and release, and high ratio. Since -the ratio is so high, some knee smoothing is -desirable ("soft limiting"). This example is intended -to get you started using compressor_* as a limiter, so all -parameters are hardwired to nominal values here.

-

ratio: 4 (moderate compression), 8 (severe compression), - 12 (mild limiting), or 20 to 1 (hard limiting).

-

att: 20-800 MICROseconds (Note: scaled by ratio in the 1176).

-

rel: 50-1100 ms (Note: scaled by ratio in the 1176).

-

Mike Shipley likes 4:1 (Grammy-winning mixer for Queen, Tom Petty, etc.) -Faster attack gives "more bite" (e.g. on vocals). -He hears a bright, clear eq effect as well (not implemented here).

-

Usage

-
 _,_ : limiter_1176_R4_stereo : _,_
-
-

Reference:

- -

Expanders

-
-

(co.)peak_expansion_gain_N_chan_db

-

N channels dynamic range expander gain computer. -peak_expansion_gain_N_chan_db is a standard Faust function.

-

Usage

-
si.bus(N) : peak_expansion_gain_N_chan_db(strength,thresh,range,att,hold,rel,knee,prePost,link,maxHold,N) : si.bus(N)
-
-

Where:

-
    -
  • strength: strength of the expansion (0 = no expansion, 100 means gating, <1 means upward compression)
  • -
  • thresh: dB level threshold below which expansion kicks in
  • -
  • range: maximum amount of expansion in dB
  • -
  • att: attack time = time constant (sec) coming out of expansion
  • -
  • hold : hold time (sec)
  • -
  • rel: release time = time constant (sec) going into expansion
  • -
  • knee: a gradual increase in gain reduction around the threshold: -above thresh+(knee/2) there is no gain reduction, -below thresh-(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-range detector
  • -
  • link: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
  • -
  • maxHold: the maximum hold time in samples, known at compile time
  • -
  • N: the number of channels of the gain computer, known at compile time
  • -
-
-

(co.)expander_N_chan

-

Feed forward N channels dynamic range expander. -expander_N_chan is a standard Faust function.

-

Usage

-
si.bus(N) : expander_N_chan(strength,thresh,range,att,hold,rel,knee,prePost,link,meter,maxHold,N) : si.bus(N)
-
-

Where:

-
    -
  • strength: strength of the expansion (0 = no expansion, 100 means gating, <1 means upward compression)
  • -
  • thresh: dB level threshold below which expansion kicks in
  • -
  • range: maximum amount of expansion in dB
  • -
  • att: attack time = time constant (sec) coming out of expansion
  • -
  • hold : hold time
  • -
  • rel: release time = time constant (sec) going into expansion
  • -
  • knee: a gradual increase in gain reduction around the threshold: -above thresh+(knee/2) there is no gain reduction, -below thresh-(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-range detector
  • -
  • link: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
  • -
  • meter: a gain reduction meter. It can be implemented like so: -meter = _<:(_, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;
  • -
  • maxHold: the maximum hold time in samples, known at compile time
  • -
  • N: the number of channels of the expander, known at compile time
  • -
-
-

(co.)expanderSC_N_chan

-

Feed forward N channels dynamic range expander with sidechain. -expanderSC_N_chan is a standard Faust function.

-

Usage

-
si.bus(N) : expanderSC_N_chan(strength,thresh,range,att,hold,rel,knee,prePost,link,meter,maxHold,N,SCfunction,SCswitch,SCsignal) : si.bus(N)
-
-

Where:

-
    -
  • strength: strength of the expansion (0 = no expansion, 100 means gating, <1 means upward compression)
  • -
  • thresh: dB level threshold below which expansion kicks in
  • -
  • range: maximum amount of expansion in dB
  • -
  • att: attack time = time constant (sec) coming out of expansion
  • -
  • hold : hold time
  • -
  • rel: release time = time constant (sec) going into expansion
  • -
  • knee: a gradual increase in gain reduction around the threshold: -above thresh+(knee/2) there is no gain reduction, -below thresh-(knee/2) there is the same gain reduction as without a knee, -and in between there is a gradual increase in gain reduction
  • -
  • prePost: places the level detector either at the input or after the gain computer; -this turns it from a linear return-to-zero detector into a log domain return-to-range detector
  • -
  • link: the amount of linkage between the channels: 0 = each channel is independent, 1 = all channels have the same amount of gain reduction
  • -
  • meter: a gain reduction meter. It can be implemented like so: -meter = _<:(_, (ba.linear2db:max(maxGR):meter_group((hbargraph("[1][unit:dB][tooltip: gain reduction in dB]", maxGR, 0))))):attach;
  • -
  • maxHold: the maximum hold time in samples, known at compile time
  • -
  • N: the number of channels of the expander, known at compile time
  • -
  • SCfunction : a function that get's placed before the level-detector, needs to have a single input and output
  • -
  • SCswitch : use either the regular audio input or the SCsignal as the input for the level detector
  • -
  • SCsignal : an audio signal, to be used as the input for the level detector when SCswitch is 1
  • -
-

Lookahead Limiters

-
-

(co.)limiter_lad_N

-

N-channels lookahead limiter inspired by IOhannes Zmölnig's post, which is -in turn based on the thesis by Peter Falkner "Entwicklung eines digitalen -Stereo-Limiters mit Hilfe des Signalprozessors DSP56001". -This version of the limiter uses a peak-holder with smoothed -attack and release based on tau time constant filters.

-

It is also possible to use a time constant that is 2PI*tau by dividing -the attack and release times by 2PI. This time constant allows for -the amplitude profile to reach 1 - e^(-2PI) of the final -peak after the attack time. The input path can be delayed by the same -amount as the attack time to synchronise input and amplitude profile, -realising a system that is particularly effective as a colourless -(ideally) brickwall limiter.

-

Note that the effectiveness of the ceiling settings are dependent on -the other parameters, especially the time constant used for the -smoothing filters and the lookahead delay.

-

Similarly, the colourless characteristics are also dependent on attack, -hold, and release times. Since fluctuations above ~15 Hz are -perceived as timbral effects, [Vassilakis and Kendall 2010] it is -reasonable to set the attack time to 1/15 seconds for a smooth amplitude -modulation. On the other hand, the hold time can be set to the -peak-to-peak period of the expected lowest frequency in the signal, -which allows for minimal distortion of the low frequencies. The -release time can then provide a perceptually linear and gradual gain -increase determined by the user for any specific application.

-

The scaling factor for all the channels is determined by the loudest peak -between them all, so that amplitude ratios between the signals are kept.

-

Usage

-
si.bus(N) : limiter_lad_N(N, LD, ceiling, attack, hold, release) : si.bus(N)
-
-

Where:

-
    -
  • N: is the number of channels, known at compile-time
  • -
  • LD: is the lookahead delay in seconds, known at compile-time
  • -
  • ceiling: is the linear amplitude output limit
  • -
  • attack: is the attack time in seconds
  • -
  • hold: is the hold time in seconds
  • -
  • release: is the release time in seconds
  • -
-

Example for a stereo limiter: limiter_lad_N(2, .01, 1, .01, .1, 1);

-

Reference:

- -
-

(co.)limiter_lad_mono

-

Specialised case of limiter_lad_N mono limiter.

-

Usage

-
_ : limiter_lad_mono(LD, ceiling, attack, hold, release) : _
-
-

Where:

-
    -
  • LD: is the lookahead delay in seconds, known at compile-time
  • -
  • ceiling: is the linear amplitude output limit
  • -
  • attack: is the attack time in seconds
  • -
  • hold: is the hold time in seconds
  • -
  • release: is the release time in seconds
  • -
-

Reference:

- -
-

(co.)limiter_lad_stereo

-

Specialised case of limiter_lad_N stereo limiter.

-

Usage

-
_,_ : limiter_lad_stereo(LD, ceiling, attack, hold, release) : _,_
-
-

Where:

-
    -
  • LD: is the lookahead delay in seconds, known at compile-time
  • -
  • ceiling: is the linear amplitude output limit
  • -
  • attack: is the attack time in seconds
  • -
  • hold: is the hold time in seconds
  • -
  • release: is the release time in seconds
  • -
-

Reference:

- -
-

(co.)limiter_lad_quad

-

Specialised case of limiter_lad_N quadraphonic limiter.

-

Usage

-
si.bus(4) : limiter_lad_quad(LD, ceiling, attack, hold, release) : si.bus(4)
-
-

Where:

-
    -
  • LD: is the lookahead delay in seconds, known at compile-time
  • -
  • ceiling: is the linear amplitude output limit
  • -
  • attack: is the attack time in seconds
  • -
  • hold: is the hold time in seconds
  • -
  • release: is the release time in seconds
  • -
-

Reference:

- -
-

(co.)limiter_lad_bw

-

Specialised case of limiter_lad_N and ready-to-use unit-amplitude mono -limiting function. This implementation, in particular, uses 2PI*tau -time constant filters for attack and release smoothing with -synchronised input and gain signals.

-

This function's best application is to be used as a brickwall limiter with -the least colouring artefacts while keeping a not-so-slow release curve. -Tests have shown that, given a pop song with 60 dB of amplification -and a 0-dB-ceiling, the loudest peak recorded was ~0.38 dB.

-

Usage

-
_ : limiter_lad_bw : _
-
-

Reference:

-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/compressors.lib/overview/index.html b/docs/contributors/faust/compressors.lib/overview/index.html deleted file mode 100644 index 73d51dd..0000000 --- a/docs/contributors/faust/compressors.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - compressors.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

compressors.lib Documentation

-

Welcome to the documentation for compressors.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.6.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/delays.lib/1.1.0/doc/index.html b/docs/contributors/faust/delays.lib/1.1.0/doc/index.html deleted file mode 100644 index 015ce0c..0000000 --- a/docs/contributors/faust/delays.lib/1.1.0/doc/index.html +++ /dev/null @@ -1,358 +0,0 @@ - - - - - - - - - - - delays.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
- -
- -

delays.lib

-

This library contains a collection of delay functions. Its official prefix is de.

-

References

- -

Basic Delay Functions

-
-

(de.)delay

-

Simple d samples delay where n is the maximum delay length as a number of -samples. Unlike the @ delay operator, here the delay signal d is explicitly -bounded to the interval [0..n]. The consequence is that delay will compile even -if the interval of d can't be computed by the compiler. -delay is a standard Faust function.

-

Usage

-
_ : delay(n,d) : _
-
-

Where:

-
    -
  • n: the max delay length in samples
  • -
  • d: the delay length in samples (integer)
  • -
-
-

(de.)fdelay

-

Simple d samples fractional delay based on 2 interpolated delay lines where n is -the maximum delay length as a number of samples. -fdelay is a standard Faust function.

-

Usage

-
_ : fdelay(n,d) : _
-
-

Where:

-
    -
  • n: the max delay length in samples
  • -
  • d: the delay length in samples (float)
  • -
-
-

(de.)sdelay

-

s(mooth)delay: a mono delay that doesn't click and doesn't -transpose when the delay time is changed.

-

Usage

-
_ : sdelay(n,it,d) : _
-
-

Where:

-
    -
  • n: the max delay length in samples
  • -
  • it: interpolation time (in samples), for example 1024
  • -
  • d: the delay length in samples (float)
  • -
-
-

(de.)prime_power_delays

-

Prime Power Delay Line Lengths.

-

Usage

-
si.bus(N) : prime_power_delays(N,pathmin,pathmax) : si.bus(N);
-
-

Where:

-
    -
  • N: positive integer up to 16 (for higher powers of 2, extend 'primes' array below)
  • -
  • pathmin: minimum acoustic ray length in the reverberator (in meters)
  • -
  • pathmax: maximum acoustic ray length (meters) - think "room size"
  • -
-

Reference

- -

Lagrange Interpolation

-
-

(de.)fdelaylti and (de.)fdelayltv

-

Fractional delay line using Lagrange interpolation.

-

Usage

-
_ : fdelaylt[i|v](N, n, d) : _
-
-

Where:

-
    -
  • N=1,2,3,... is the order of the Lagrange interpolation polynomial (constant numerical expression)
  • -
  • n: the max delay length in samples
  • -
  • d: the delay length in samples
  • -
-

fdelaylti is most efficient, but designed for constant/slowly-varying delay. -fdelayltv is more expensive and more robust when the delay varies rapidly.

-

Note: the requested delay should not be less than (N-1)/2.

-

References

- -
-

(de.)fdelay[N]

-

For convenience, fdelay1, fdelay2, fdelay3, fdelay4, fdelay5 -are also available where N is the order of the interpolation, built using fdelayltv.

-

Thiran Allpass Interpolation

-

Thiran Allpass Interpolation.

-

Reference

- -
-

(de.)fdelay[N]a

-

Delay lines interpolated using Thiran allpass interpolation.

-

Usage

-
_ : fdelay[N]a(n, d) : _
-
-

(exactly like fdelay)

-

Where:

-
    -
  • N=1,2,3, or 4 is the order of the Thiran interpolation filter (constant numerical expression), - and the delay argument is at least N-1/2. First-order: d at least 0.5, second-order: d at least 1.5, - third-order: d at least 2.5, fourth-order: d at least 3.5.
  • -
  • n: the max delay length in samples
  • -
  • d: the delay length in samples
  • -
-

Note

-

The interpolated delay should not be less than N-1/2. -(The allpass delay ranges from N-1/2 to N+1/2). -This constraint can be alleviated by altering the code, -but be aware that allpass filters approach zero delay -by means of pole-zero cancellations.

-

Delay arguments too small will produce an UNSTABLE allpass!

-

Because allpass interpolation is recursive, it is not as robust -as Lagrange interpolation under time-varying conditions -(you may hear clicks when changing the delay rapidly).

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/delays.lib/overview/index.html b/docs/contributors/faust/delays.lib/overview/index.html deleted file mode 100644 index aee6bbf..0000000 --- a/docs/contributors/faust/delays.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - delays.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

delays.lib Documentation

-

Welcome to the documentation for delays.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.1.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/demos.lib/1.2.0/doc/index.html b/docs/contributors/faust/demos.lib/1.2.0/doc/index.html deleted file mode 100644 index 6836c1e..0000000 --- a/docs/contributors/faust/demos.lib/1.2.0/doc/index.html +++ /dev/null @@ -1,689 +0,0 @@ - - - - - - - - - - - demos.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
- -
- -

demos.lib

-

This library contains a set of demo functions based on examples located in the -/examples folder. Its official prefix is dm.

-

References

- -

Analyzers

-
-

(dm.)mth_octave_spectral_level_demo

-

Demonstrate mth_octave_spectral_level in a standalone GUI.

-

Usage

-
_ : mth_octave_spectral_level_demo(BandsPerOctave) : _
-_ : spectral_level_demo : _ // 2/3 octave
-
-

Filters

-
-

(dm.)parametric_eq_demo

-

A parametric equalizer application.

-

Usage:

-
_ : parametric_eq_demo : _
-
-
-

(dm.)spectral_tilt_demo

-

A spectral tilt application.

-

Usage

-
_ : spectral_tilt_demo(N) : _ 
-
-

Where:

-
    -
  • N: filter order (integer)
  • -
-

All other parameters interactive

-
-

(dm.)mth_octave_filterbank_demo and (dm.)filterbank_demo

-

Graphic Equalizer: each filter-bank output signal routes through a fader.

-

Usage

-
_ : mth_octave_filterbank_demo(M) : _
-_ : filterbank_demo : _
-
-

Where:

-
    -
  • M: number of bands per octave
  • -
-

Effects

-
-

(dm.)cubicnl_demo

-

Distortion demo application.

-

Usage:

-
_ : cubicnl_demo : _
-
-
-

(dm.)gate_demo

-

Gate demo application.

-

Usage

-
_,_ : gate_demo : _,_
-
-
-

(dm.)compressor_demo

-

Compressor demo application.

-

Usage

-
_,_ : compressor_demo : _,_
-
-
-

(dm.)moog_vcf_demo

-

Illustrate and compare all three Moog VCF implementations above.

-

Usage

-
_ : moog_vcf_demo : _
-
-
-

(dm.)wah4_demo

-

Wah pedal application.

-

Usage

-
_ : wah4_demo : _
-
-
-

(dm.)crybaby_demo

-

Crybaby effect application.

-

Usage

-
_ : crybaby_demo : _
-
-
-

(dm.)flanger_demo

-

Flanger effect application.

-

Usage

-
_,_ : flanger_demo : _,_
-
-
-

(dm.)phaser2_demo

-

Phaser effect demo application.

-

Usage

-
_,_ : phaser2_demo : _,_
-
-
-

(dm.)tapeStop_demo

-

Stereo tape-stop effect.

-

Usage

-
_,_ : tapeStop_demo : _,_
-
-

Reverbs

-
-

(dm.)freeverb_demo

-

Freeverb demo application.

-

Usage

-
_,_ : freeverb_demo : _,_
-
-
-

(dm.)stereo_reverb_tester

-

Handy test inputs for reverberator demos below.

-

Usage

-
_,_ : stereo_reverb_tester(gui_group) : _,_
-
-

For suppressing the gui_group input, pass it as !. -(See (dm.)fdnrev0_demo for an example of its use).

-
-

(dm.)fdnrev0_demo

-

A reverb application using fdnrev0.

-

Usage

-
_,_,_,_ : fdnrev0_demo(N,NB,BBSO) : _,_
-
-

Where:

-
    -
  • N: feedback Delay Network (FDN) order / number of delay lines used = - order of feedback matrix / 2, 4, 8, or 16 [extend primes array below for - 32, 64, ...]
  • -
  • NB: number of frequency bands / Number of (nearly) independent T60 controls - / Integer 3 or greater
  • -
  • BBSO : butterworth band-split order / order of lowpass/highpass bandsplit - used at each crossover freq / odd positive integer
  • -
-
-

(dm.)zita_rev_fdn_demo

-

Reverb demo application based on zita_rev_fdn.

-

Usage

-
si.bus(8) : zita_rev_fdn_demo : si.bus(8)
-
-
-

(dm.)zita_light

-

Light version of dm.zita_rev1 with only 2 UI elements.

-

Usage

-
_,_ : zita_light : _,_
-
-
-

(dm.)zita_rev1

-

Example GUI for zita_rev1_stereo (mostly following the Linux zita-rev1 GUI).

-

Only the dry/wet and output level parameters are "dezippered" here. If -parameters are to be varied in real time, use smooth(0.999) or the like -in the same way.

-

Usage

-
_,_ : zita_rev1 : _,_
-
-

Reference

- -
-

(dm.)vital_rev_demo

-

Example GUI for vital_rev with all parameters exposed.

-

Usage

-
_,_ : vital_rev_demo : _,_
-
-
-

(dm.)reverbTank_demo

-

This is a stereo reverb following the "ReverbTank" example in [1], -although some parameter ranges and scaling have been adjusted. -It is an unofficial version of the Spin Semiconductor® Reverb. -Other relevant instructional material can be found in [2-4].

-

Usage

-
_,_ : reverbTank_demo : _,_
-
-

References

- -
-

(dm.)dattorro_rev_demo

-

Example GUI for dattorro_rev with all parameters exposed and additional -dry/wet and output gain control.

-

Usage

-
_,_ : dattorro_rev_demo : _,_
-
-
-

(dm.)jprev_demo

-

Example GUI for jprev with all parameters exposed.

-

Usage

-
_,_ : jprev_demo : _,_
-
-
-

(dm.)greyhole_demo

-

Example GUI for greyhole with all parameters exposed.

-

Usage

-
_,_ : greyhole_demo : _,_
-
-

Generators

-
-

(dm.)sawtooth_demo

-

An application demonstrating the different sawtooth oscillators of Faust.

-

Usage

-
sawtooth_demo : _
-
-
-

(dm.)virtual_analog_oscillator_demo

-

Virtual analog oscillator demo application.

-

Usage

-
virtual_analog_oscillator_demo : _
-
-
-

(dm.)oscrs_demo

-

Simple application demoing filter based oscillators.

-

Usage

-
oscrs_demo : _
-
-
-

(dm.)velvet_noise_demo

-

Listen to velvet_noise!

-

Usage

-
velvet_noise_demo : _
-
-
-

(dm.)latch_demo

-

Illustrate latch operation.

-

Usage

-
echo 'import("pkg:faust/faust/stdfaust.lib@1.0.0");' > latch_demo.dsp
-echo 'process = dm.latch_demo;' >> latch_demo.dsp
-faust2octave latch_demo.dsp
-Octave:1> plot(faustout);
-
-
-

(dm.)envelopes_demo

-

Illustrate various envelopes overlaid, including their gate * 1.1.

-

Usage

-
echo 'import("pkg:faust/faust/stdfaust.lib@1.0.0");' > envelopes_demo.dsp
-echo 'process = dm.envelopes_demo;' >> envelopes_demo.dsp
-faust2octave envelopes_demo.dsp
-Octave:1> plot(faustout);
-
-
-

(dm.)fft_spectral_level_demo

-

Make a real-time spectrum analyzer using FFT from analyzers.lib.

-

Usage

-
echo 'import("pkg:faust/faust/stdfaust.lib@1.0.0");' > fft_spectral_level_demo.dsp
-echo 'process = dm.fft_spectral_level_demo;' >> fft_spectral_level_demo.dsp
-Mac:
-  faust2caqt fft_spectral_level_demo.dsp
-  open fft_spectral_level_demo.app
-Linux GTK:
-  faust2jack fft_spectral_level_demo.dsp
-  ./fft_spectral_level_demo
-Linux QT:
-  faust2jaqt fft_spectral_level_demo.dsp
-  ./fft_spectral_level_demo
-
-
-

(dm.)reverse_echo_demo(nChans)

-

Multichannel echo effect with reverse delays.

-

Usage

-
echo 'import("pkg:faust/faust/stdfaust.lib@1.0.0");' > reverse_echo_demo.dsp
-echo 'nChans = 3; // Any integer > 1 should work here' >> reverse_echo_demo.dsp
-echo 'process = dm.reverse_echo_demo(nChans);' >> reverse_echo_demo.dsp
-Mac:
-  faust2caqt reverse_echo_demo.dsp
-  open reverse_echo_demo.app
-Linux GTK:
-  faust2jack reverse_echo_demo.dsp
-  ./reverse_echo_demo
-Linux QT:
-  faust2jaqt reverse_echo_demo.dsp
-  ./reverse_echo_demo
-Etc.
-
-
-

(dm.)pospass_demo

-

Use Positive-Pass Filter pospass() to frequency-shift a sine tone. -First, a real sinusoid is converted to its analytic-signal form -using pospass() to filter out its negative frequency component. -Next, it is multiplied by a modulating complex sinusoid at the -shifting frequency to create the frequency-shifted result. -The real and imaginary parts are output to channels 1 & 2. -For a more interesting frequency-shifting example, check the -"Use Mic" checkbox to replace the input sinusoid by mic input. -Note that frequency shifting is not the same as frequency scaling. -A frequency-shifted harmonic signal is usually not harmonic. -Very small frequency shifts give interesting chirp effects when -there is feedback around the frequency shifter.

-

Usage

-
echo 'import("pkg:faust/faust/stdfaust.lib@1.0.0");' > pospass_demo.dsp
-echo 'process = dm.pospass_demo;' >> pospass_demo.dsp
-Mac:
-  faust2caqt pospass_demo.dsp
-  open pospass_demo.app
-Linux GTK:
-  faust2jack pospass_demo.dsp
-  ./pospass_demo
-Linux QT:
-  faust2jaqt pospass_demo.dsp
-  ./pospass_demo
-Etc.
-
-
-

(dm.)exciter

-

Psychoacoustic harmonic exciter, with GUI.

-

Usage

-
_ : exciter : _
-
-

References

- -
-

(dm.)vocoder_demo

-

Use example of the vocoder function where an impulse train is used -as excitation.

-

Usage

-
_ : vocoder_demo : _
-
-
-

(dm.)colored_noise_demo

-

A coloured noise signal generator.

-

Usage

-
colored_noise_demo : _
-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/demos.lib/overview/index.html b/docs/contributors/faust/demos.lib/overview/index.html deleted file mode 100644 index 41e2a71..0000000 --- a/docs/contributors/faust/demos.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - demos.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

demos.lib Documentation

-

Welcome to the documentation for demos.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.2.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/dx7.lib/1.1.0/doc/index.html b/docs/contributors/faust/dx7.lib/1.1.0/doc/index.html deleted file mode 100644 index 2710060..0000000 --- a/docs/contributors/faust/dx7.lib/1.1.0/doc/index.html +++ /dev/null @@ -1,425 +0,0 @@ - - - - - - - - - - - dx7.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

dx7.lib

-

Yamaha DX7 emulation library. Its official prefix is dx.

-

References

- -
-

(dx.)dx7_ampf

-

DX7 amplitude conversion function. 3 versions of this function -are available:

-
    -
  • dx7_amp_bpf: BPF version (same as in the CSOUND toolkit)
  • -
  • dx7_amp_func: estimated mathematical equivalent of dx7_amp_bpf
  • -
  • dx7_ampf: default (sugar for dx7_amp_func)
  • -
-

Usage:

-
dx7AmpPreset : dx7_ampf_bpf : _
-
-

Where:

-
    -
  • dx7AmpPreset: DX7 amplitude value (0-99)
  • -
-
-

(dx.)dx7_egraterisef

-

DX7 envelope generator rise conversion function. 3 versions of this function -are available:

-
    -
  • dx7_egraterise_bpf: BPF version (same as in the CSOUND toolkit)
  • -
  • dx7_egraterise_func: estimated mathematical equivalent of dx7_egraterise_bpf
  • -
  • dx7_egraterisef: default (sugar for dx7_egraterise_func)
  • -
-

Usage:

-
dx7envelopeRise : dx7_egraterisef : _
-
-

Where:

-
    -
  • dx7envelopeRise: DX7 envelope rise value (0-99)
  • -
-
-

(dx.)dx7_egraterisepercf

-

DX7 envelope generator percussive rise conversion function. 3 versions of -this function are available:

-
    -
  • dx7_egrateriseperc_bpf: BPF version (same as in the CSOUND toolkit)
  • -
  • dx7_egrateriseperc_func: estimated mathematical equivalent of dx7_egrateriseperc_bpf
  • -
  • dx7_egraterisepercf: default (sugar for dx7_egrateriseperc_func)
  • -
-

Usage:

-
dx7envelopePercRise : dx7_egraterisepercf : _
-
-

Where:

-
    -
  • dx7envelopePercRise: DX7 envelope percussive rise value (0-99)
  • -
-
-

(dx.)dx7_egratedecayf

-

DX7 envelope generator decay conversion function. 3 versions of -this function are available:

-
    -
  • dx7_egratedecay_bpf: BPF version (same as in the CSOUND toolkit)
  • -
  • dx7_egratedecay_func: estimated mathematical equivalent of dx7_egratedecay_bpf
  • -
  • dx7_egratedecayf: default (sugar for dx7_egratedecay_func)
  • -
-

Usage:

-
dx7envelopeDecay : dx7_egratedecayf : _
-
-

Where:

-
    -
  • dx7envelopeDecay: DX7 envelope decay value (0-99)
  • -
-
-

(dx.)dx7_egratedecaypercf

-

DX7 envelope generator percussive decay conversion function. 3 versions of -this function are available:

-
    -
  • dx7_egratedecayperc_bpf: BPF version (same as in the CSOUND toolkit)
  • -
  • dx7_egratedecayperc_func: estimated mathematical equivalent of dx7_egratedecayperc_bpf
  • -
  • dx7_egratedecaypercf: default (sugar for dx7_egratedecayperc_func)
  • -
-

Usage:

-
dx7envelopePercDecay : dx7_egratedecaypercf : _
-
-

Where:

-
    -
  • dx7envelopePercDecay: DX7 envelope decay value (0-99)
  • -
-
-

(dx.)dx7_eglv2peakf

-

DX7 envelope level to peak conversion function. 3 versions of -this function are available:

-
    -
  • dx7_eglv2peak_bpf: BPF version (same as in the CSOUND toolkit)
  • -
  • dx7_eglv2peak_func: estimated mathematical equivalent of dx7_eglv2peak_bpf
  • -
  • dx7_eglv2peakf: default (sugar for dx7_eglv2peak_func)
  • -
-

Usage:

-
dx7Level : dx7_eglv2peakf : _
-
-

Where:

-
    -
  • dx7Level: DX7 level value (0-99)
  • -
-
-

(dx.)dx7_velsensf

-

DX7 velocity sensitivity conversion function.

-

Usage:

-
dx7Velocity  : dx7_velsensf : _
-
-

Where:

-
    -
  • dx7Velocity: DX7 level value (0-8)
  • -
-
-

(dx.)dx7_fdbkscalef

-

DX7 feedback scaling conversion function.

-

Usage:

-
dx7Feedback  : dx7_fdbkscalef : _
-
-

Where:

-
    -
  • dx7Feedback: DX7 feedback value
  • -
-
-

(dx.)dx7_op

-

DX7 Operator. Implements a phase-modulable sine wave oscillator connected -to a DX7 envelope generator.

-

Usage:

-
dx7_op(freq,phaseMod,outLev,R1,R2,R3,R4,L1,L2,L3,L4,keyVel,rateScale,type,gain,gate) : _
-
-

Where:

-
    -
  • freq: frequency of the oscillator
  • -
  • phaseMod: phase deviation (-1 - 1)
  • -
  • outLev: preset output level (0-99)
  • -
  • R1: preset envelope rate 1 (0-99)
  • -
  • R2: preset envelope rate 2 (0-99)
  • -
  • R3: preset envelope rate 3 (0-99)
  • -
  • R4: preset envelope rate 4 (0-99)
  • -
  • L1: preset envelope level 1 (0-99)
  • -
  • L2: preset envelope level 2 (0-99)
  • -
  • L3: preset envelope level 3 (0-99)
  • -
  • L4: preset envelope level 4 (0-99)
  • -
  • keyVel: preset key velocity sensitivity (0-99)
  • -
  • rateScale: preset envelope rate scale
  • -
  • type: preset operator type
  • -
  • gain: general gain
  • -
  • gate: trigger signal
  • -
-
-

(dx.)dx7_algo

-

DX7 algorithms. Implements the 32 DX7 algorithms (a quick Google search -should give your more details on this). Each algorithm uses 6 operators.

-

Usage:

-
dx7_algo(algN,egR1,egR2,egR3,egR4,egL1,egL2,egL3,egL4,outLevel,keyVelSens,ampModSens,opMode,opFreq,opDetune,opRateScale,feedback,lfoDelay,lfoDepth,lfoSpeed,freq,gain,gate) : _
-
-

Where:

-
    -
  • algN: algorithm number (0-31, should be an int...)
  • -
  • egR1: preset envelope rates 1 (a list of 6 values between 0-99)
  • -
  • egR2: preset envelope rates 2 (a list of 6 values between 0-99)
  • -
  • egR3: preset envelope rates 3 (a list of 6 values between 0-99)
  • -
  • egR4: preset envelope rates 4 (a list of 6 values between 0-99)
  • -
  • egL1: preset envelope levels 1 (a list of 6 values between 0-99)
  • -
  • egL2: preset envelope levels 2 (a list of 6 values between 0-99)
  • -
  • egL3: preset envelope levels 3 (a list of 6 values between 0-99)
  • -
  • egL4: preset envelope levels 4 (a list of 6 values between 0-99)
  • -
  • outLev: preset output levels (a list of 6 values between 0-99)
  • -
  • keyVel: preset key velocity sensitivities (a list of 6 values between 0-99)
  • -
  • ampModSens: preset amplitude sensitivities (a list of 6 values between 0-99)
  • -
  • opMode: preset operator mode (a list of 6 values between 0-1)
  • -
  • opFreq: preset operator frequencies (a list of 6 values between 0-99)
  • -
  • opDetune: preset operator detuning (a list of 6 values between 0-99)
  • -
  • opRateScale: preset operator rate scale (a list of 6 values between 0-99)
  • -
  • feedback: preset operator feedback (a list of 6 values between 0-99)
  • -
  • lfoDelay: preset LFO delay (a list of 6 values between 0-99)
  • -
  • lfoDepth: preset LFO depth (a list of 6 values between 0-99)
  • -
  • lfoSpeed: preset LFO speed (a list of 6 values between 0-99)
  • -
  • freq: fundamental frequency
  • -
  • gain: general gain
  • -
  • gate: trigger signal
  • -
-
-

(dx.)dx7_ui

-

Generic DX7 function where all parameters are controllable using UI elements. -The master-with-mute branch must be used for this function to work... -This function is MIDI-compatible.

-

Usage

-
dx7_ui : _
-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/dx7.lib/overview/index.html b/docs/contributors/faust/dx7.lib/overview/index.html deleted file mode 100644 index 84fabab..0000000 --- a/docs/contributors/faust/dx7.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - dx7.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

dx7.lib Documentation

-

Welcome to the documentation for dx7.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.1.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/envelopes.lib/1.3.0/doc/index.html b/docs/contributors/faust/envelopes.lib/1.3.0/doc/index.html deleted file mode 100644 index f9f8a03..0000000 --- a/docs/contributors/faust/envelopes.lib/1.3.0/doc/index.html +++ /dev/null @@ -1,490 +0,0 @@ - - - - - - - - - - - envelopes.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

envelopes.lib

-

This library contains a collection of envelope generators. Its official prefix is en.

-

References

- -

Functions Reference

-
-

(en.)ar

-

AR (Attack, Release) envelope generator (useful to create percussion envelopes). -ar is a standard Faust function.

-

Usage

-
ar(at,rt,t) : _
-
-

Where:

-
    -
  • at: attack (sec)
  • -
  • rt: release (sec)
  • -
  • t: trigger signal (attack is triggered when t>0, release is triggered -when t=0)
  • -
-
-

(en.)asr

-

ASR (Attack, Sustain, Release) envelope generator. -asr is a standard Faust function.

-

Usage

-
asr(at,sl,rt,t) : _
-
-

Where:

-
    -
  • at: attack (sec)
  • -
  • sl: sustain level (between 0..1)
  • -
  • rt: release (sec)
  • -
  • t: trigger signal (attack is triggered when t>0, release is triggered -when t=0)
  • -
-
-

(en.)adsr

-

ADSR (Attack, Decay, Sustain, Release) envelope generator. -adsr is a standard Faust function.

-

Usage

-
adsr(at,dt,sl,rt,t) : _
-
-

Where:

-
    -
  • at: attack time (sec)
  • -
  • dt: decay time (sec)
  • -
  • sl: sustain level (between 0..1)
  • -
  • rt: release time (sec)
  • -
  • t: trigger signal (attack is triggered when t>0, release is triggered -when t=0)
  • -
-
-

(en.)adsrf_bias

-

ADSR (Attack, Decay, Sustain, Release, Final) envelope generator with -control over bias on each segment, and toggle for legato.

-

Usage

-
adsrf_bias(at,dt,sl,rt,final,b_att,b_dec,b_rel,legato,t) : _
-
-

Where:

-
    -
  • at: attack time (sec)
  • -
  • dt: decay time (sec)
  • -
  • sl: sustain level (between 0..1)
  • -
  • rt: release time (sec)
  • -
  • final: final level (between 0..1) but less than or equal to sl
  • -
  • b_att: bias during attack (between 0..1) where 0.5 is no bias.
  • -
  • b_dec: bias during decay (between 0..1) where 0.5 is no bias.
  • -
  • b_rel: bias during release (between 0..1) where 0.5 is no bias.
  • -
  • legato: toggle for legato. If disabled, envelopes "re-trigger" from zero.
  • -
  • t: trigger signal (attack is triggered when t>0, release is triggered -when t=0)
  • -
-
-

(en.)adsr_bias

-

ADSR (Attack, Decay, Sustain, Release) envelope generator with -control over bias on each segment, and toggle for legato.

-

Usage

-
adsr_bias(at,dt,sl,rt,b_att,b_dec,b_rel,legato,t) : _
-
-

Where:

-
    -
  • at: attack time (sec)
  • -
  • dt: decay time (sec)
  • -
  • sl: sustain level (between 0..1)
  • -
  • rt: release time (sec)
  • -
  • b_att: bias during attack (between 0..1) where 0.5 is no bias.
  • -
  • b_dec: bias during decay (between 0..1) where 0.5 is no bias.
  • -
  • b_rel: bias during release (between 0..1) where 0.5 is no bias.
  • -
  • legato: toggle for legato. If disabled, envelopes "re-trigger" from zero.
  • -
  • t: trigger signal (attack is triggered when t>0, release is triggered -when t=0)
  • -
-
-

(en.)ahdsrf_bias

-

AHDSR (Attack, Hold, Decay, Sustain, Release, Final) envelope generator -with control over bias on each segment, and toggle for legato.

-

Usage

-
ahdsrf_bias(at,ht,dt,sl,rt,final,b_att,b_dec,b_rel,legato,t) : _
-
-

Where:

-
    -
  • at: attack time (sec)
  • -
  • ht: hold time (sec)
  • -
  • dt: decay time (sec)
  • -
  • sl: sustain level (between 0..1)
  • -
  • rt: release time (sec)
  • -
  • final: final level (between 0..1) but less than or equal to sl
  • -
  • b_att: bias during attack (between 0..1) where 0.5 is no bias.
  • -
  • b_dec: bias during decay (between 0..1) where 0.5 is no bias.
  • -
  • b_rel: bias during release (between 0..1) where 0.5 is no bias.
  • -
  • legato: toggle for legato. If disabled, envelopes "re-trigger" from zero.
  • -
  • t: trigger signal (attack is triggered when t>0, release is triggered -when t=0)
  • -
-
-

(en.)ahdsr_bias

-

AHDSR (Attack, Hold, Decay, Sustain, Release) envelope generator -with control over bias on each segment, and toggle for legato.

-

Usage

-
ahdsr_bias(at,ht,dt,sl,rt,final,b_att,b_dec,b_rel,legato,t) : _
-
-

Where:

-
    -
  • at: attack time (sec)
  • -
  • ht: hold time (sec)
  • -
  • dt: decay time (sec)
  • -
  • sl: sustain level (between 0..1)
  • -
  • rt: release time (sec)
  • -
  • final: final level (between 0..1) but less than or equal to sl
  • -
  • b_att: bias during attack (between 0..1) where 0.5 is no bias.
  • -
  • b_dec: bias during decay (between 0..1) where 0.5 is no bias.
  • -
  • b_rel: bias during release (between 0..1) where 0.5 is no bias.
  • -
  • legato: toggle for legato. If disabled, envelopes "re-trigger" from zero.
  • -
  • t: trigger signal (attack is triggered when t>0, release is triggered -when t=0)
  • -
-
-

(en.)smoothEnvelope

-

An envelope with an exponential attack and release. -smoothEnvelope is a standard Faust function.

-

Usage

-
smoothEnvelope(ar,t) : _
-
-
    -
  • ar: attack and release duration (sec)
  • -
  • t: trigger signal (attack is triggered when t>0, release is triggered -when t=0)
  • -
-
-

(en.)arfe

-

ARFE (Attack and Release-to-Final-value Exponentially) envelope generator. -Approximately equal to smoothEnvelope(Attack/6.91) when Attack == Release.

-

Usage

-
arfe(at,rt,fl,t) : _
-
-

Where:

-
    -
  • at: attack (sec)
  • -
  • rt: release (sec)
  • -
  • fl: final level to approach upon release (such as 0)
  • -
  • t: trigger signal (attack is triggered when t>0, release is triggered -when t=0)
  • -
-
-

(en.)are

-

ARE (Attack, Release) envelope generator with Exponential segments. -Approximately equal to smoothEnvelope(Attack/6.91) when Attack == Release.

-

Usage

-
are(at,rt,t) : _
-
-

Where:

-
    -
  • at: attack (sec)
  • -
  • rt: release (sec)
  • -
  • t: trigger signal (attack is triggered when t>0, release is triggered -when t=0)
  • -
-
-

(en.)asre

-

ASRE (Attack, Sustain, Release) envelope generator with Exponential segments.

-

Usage

-
asre(at,sl,rt,t) : _
-
-

Where:

-
    -
  • at: attack (sec)
  • -
  • sl: sustain level (between 0..1)
  • -
  • rt: release (sec)
  • -
  • t: trigger signal (attack is triggered when t>0, release is triggered -when t=0)
  • -
-
-

(en.)adsre

-

ADSRE (Attack, Decay, Sustain, Release) envelope generator with Exponential -segments.

-

Usage

-
adsre(at,dt,sl,rt,t) : _
-
-

Where:

-
    -
  • at: attack (sec)
  • -
  • dt: decay (sec)
  • -
  • sl: sustain level (between 0..1)
  • -
  • rt: release (sec)
  • -
  • t: trigger signal (attack is triggered when t>0, release is triggered -when t=0)
  • -
-
-

(en.)ahdsre

-

AHDSRE (Attack, Hold, Decay, Sustain, Release) envelope generator with Exponential -segments.

-

Usage

-
ahdsre(at,ht,dt,sl,rt,t) : _
-
-

Where:

-
    -
  • at: attack (sec)
  • -
  • ht: hold (sec)
  • -
  • dt: decay (sec)
  • -
  • sl: sustain level (between 0..1)
  • -
  • rt: release (sec)
  • -
  • t: trigger signal (attack is triggered when t>0, release is triggered -when t=0)
  • -
-
-

(en.)dx7envelope

-

DX7 operator envelope generator with 4 independent rates and levels. It is -essentially a 4 points BPF.

-

Usage

-
dx7_envelope(R1,R2,R3,R4,L1,L2,L3,L4,t) : _
-
-

Where:

-
    -
  • RN: rates in seconds
  • -
  • LN: levels (0-1)
  • -
  • t: trigger signal
  • -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/envelopes.lib/overview/index.html b/docs/contributors/faust/envelopes.lib/overview/index.html deleted file mode 100644 index 8571d9e..0000000 --- a/docs/contributors/faust/envelopes.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - envelopes.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

envelopes.lib Documentation

-

Welcome to the documentation for envelopes.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.3.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/fds.lib/1.1.0/doc/index.html b/docs/contributors/faust/fds.lib/1.1.0/doc/index.html deleted file mode 100644 index 5f58c1f..0000000 --- a/docs/contributors/faust/fds.lib/1.1.0/doc/index.html +++ /dev/null @@ -1,604 +0,0 @@ - - - - - - - - - - - fds.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

fds.lib

-

This library allows to build linear, explicit finite difference schemes -physical models in 1 or 2 dimensions using an approach based on the cellular -automata formalism. Its official prefix is fd.

-

In order to use the library, one needs to discretize the linear partial -differential equation of the desired system both at boundaries and in-between -them, thus obtaining a set of explicit recursion relations. Each one -of these will provide, for each spatial point the scalar coefficients to be -multiplied by the states of the current and past neighbour points.

-

Coefficients need to be stacked in parallel in order to form a coefficients -matrix for each point in the mesh. It is necessary to provide one matrix for -coefficients matrices are defined, they need to be placed in parallel and -ordered following the desired mesh structure (i.e., coefficients for the top -left boundaries will come first, while bottom right boundaries will come -last), to form a coefficients scheme, which can be used with the library -functions.

-

Sources

-

Here are listed some works on finite difference schemes and cellular -automata thet were the basis for the implementation of this library

-
    -
  • S. Bilbao, Numerical Sound Synthesis.Chichester, UK: John Wiley Sons, -Ltd, 2009
  • -
  • P. Narbel, "Qualitative and quantitative cellular automata from -differential equations," Lecture Notes in Computer Science, vol. 4173, -pp. 112–121, 10 2006
  • -
  • X.-S. Yang and Y. Young, Cellular Automata, PDEs, and Pattern Formation. -Chapman & Hall/CRC, 092005, ch. 18, pp. 271–282.
  • -
-

References

- -

Model Construction

-

Once the coefficients scheme is defined, the user can simply call one of -these functions to obtain a fully working physical model. They expect to -receive a force input signal for each mesh point and output the state of each -point. Interpolation operators can be used to drive external forces to the -desired points, and to get the signal only from a certain area of the mesh.

-
-

(fd.)model1D

-

This function can be used to obtain a physical model in 1 dimension. -Takes a force input signal for each point and outputs the state of each -point.

-

Usage

-
si.bus(points) : model1D(points,R,T,scheme) : si.bus(points)
-
-

Where:

-
    -
  • points: size of the mesh in points
  • -
  • R: neighbourhood radius, indicates how many side points are needed (i.e. - if R=1 the mesh depends on one point on the left and one on the right)
  • -
  • T: time coefficient, indicates how much steps back in time are needed (i. - e. if T=1 the maximum delay needed for a neighbour state is 1 sample)
  • -
  • scheme: coefficients scheme
  • -
-
-

(fd.)model2D

-

This function can be used to obtain a physical model in 2 dimension. -Takes a force input signal for each point and outputs the state of each -point. -IMPORTANT: 2D models with more than 30x20 points might crash the c++ -compiler. 2D models need to be compiled with the command line compiler, -the online one presents some issues.

-

Usage

-
si.bus(pointsX*pointsY) : model2D(pointsX,pointsY,R,T,scheme) :
-   si.bus(pointsX*pointsY)
-
-

Where:

-
    -
  • pointsX: horizontal size of the mesh in points
  • -
  • pointsY: vertical size of the mesh in points
  • -
  • R: neighbourhood radius, indicates how many side points are needed (i.e. - if R=1 the mesh depends on one point on the left and one on the right)
  • -
  • T: time coefficient, indicates how much steps back in time are needed (i. - e. if T=1 the maximum delay needed for a neighbour state is 1 sample)
  • -
  • scheme: coefficients scheme
  • -
-

Interpolation

-

Interpolation functions can be used to drive the input signals to the -correct mesh points, or to get the output signal from the -desired points. All the interpolation functions allow to change the -input/output points at run time. In general, all these functions get in -input a number of connections, and output the same number of connections, -where each signal is multiplied by zero except the ones specified by the -arguments.

-
-

(fd.)stairsInterp1D

-

Stairs interpolator in 1 dimension. Takes a number of signals and outputs -the same number of signals, where each one is multiplied by zero except the -one specified by the argument. This can vary at run time (i.e. a slider), -but must be an integer.

-

Usage

-
si.bus(points) : stairsInterp1D(points,point) : si.bus(points)
-
-

Where:

-
    -
  • points: total number of points in the mesh
  • -
  • point: number of the desired nonzero signal
  • -
-
-

(fd.)stairsInterp2D

-

Stairs interpolator in 2 dimensions. Similar to the 1-D version.

-

Usage

-
si.bus(pointsX*pointsY) : stairsInterp2D(pointsX,pointsY,pointX,pointY) :
-   si.bus(pointsX*pointsY)
-
-

Where:

-
    -
  • pointsX: total number of points in the X direction
  • -
  • pointsY: total number of points in the Y direction
  • -
  • pointX: horizontal index of the desired nonzero signal
  • -
  • pointY: vertical index of the desired nonzero signal
  • -
-
-

(fd.)linInterp1D

-

Linear interpolator in 1 dimension. Takes a number of signals and outputs -the same number of signals, where each one is multiplied by zero except two -signals around a floating point index. This is essentially a Faust -implementation of the $J(x_i)$ operator, not scaled by the spatial step. -(see Stefan Bilbao's book, Numerical Sound Synthesis). The index can vary -at run time.

-

Usage

-
si.bus(points) : linInterp1D(points,point) : si.bus(points)
-
-

Where:

-
    -
  • points: total number of points in the mesh
  • -
  • point: floating point index
  • -
-
-

(fd.)linInterp2D

-

Linear interpolator in 2 dimensions. Similar to the 1 D version.

-

Usage

-
si.bus(pointsX*pointsY) : linInterp2D(pointsX,pointsY,pointX,pointY) :
-   si.bus(pointsX*pointsY)
-
-

Where:

-
    -
  • pointsX: total number of points in the X direction
  • -
  • pointsY: total number of points in the Y direction
  • -
  • pointX: horizontal float index
  • -
  • pointY: vertical float index
  • -
-
-

(fd.)stairsInterp1DOut

-

Stairs interpolator in 1 dimension. Similar to stairsInterp1D, except it -outputs only the desired signal.

-

Usage

-
si.bus(points) : stairsInterp1DOut(points,point) : _
-
-

Where:

-
    -
  • points: total number of points in the mesh
  • -
  • point: number of the desired nonzero signal
  • -
-
-

(fd.)stairsInterp2DOut

-

Stairs interpolator in 2 dimensions which outputs only one signal.

-

Usage

-
si.bus(pointsX*pointsY) : stairsInterp2DOut(pointsX,pointsY,pointX,pointY) : _
-
-

Where:

-
    -
  • pointsX: total number of points in the X direction
  • -
  • pointsY: total number of points in the Y direction
  • -
  • pointX: horizontal index of the desired nonzero signal
  • -
  • pointY: vertical index of the desired nonzero signal
  • -
-
-

(fd.)linInterp1DOut

-

Linear interpolator in 1 dimension. Similar to stairsInterp1D, except it -sums each output signal and provides only one output value.

-

Usage

-
si.bus(points) : linInterp1DOut(points,point) : _
-
-

Where:

-
    -
  • points: total number of points in the mesh
  • -
  • point: floating point index
  • -
-
-

(fd.)stairsInterp2DOut

-

Linear interpolator in 2 dimensions which outputs only one signal.

-

Usage

-
si.bus(pointsX*pointsY) : linInterp2DOut(pointsX,pointsY,pointX,pointY) : _
-
-

Where:

-
    -
  • pointsX: total number of points in the X direction
  • -
  • pointsY: total number of points in the Y direction
  • -
  • pointX: horizontal float index
  • -
  • pointY: vertical float index
  • -
-

Routing

-

The routing functions are used internally by the model building functions, -but can also be taken separately. These functions route the forces, the -coefficients scheme and the neighbours’ signals into the correct scheme -points and take as input, in this order: the coefficients block, the -feedback signals and the forces. In output they provide, in order, for each -scheme point: the force signal, the coefficient matrices and the neighbours’ -signals. These functions are based on the Faust route primitive.

-
-

(fd.)route1D

-

Routing function for 1 dimensional schemes.

-

Usage

-
si.bus((2*R+1)*(T+1)*points),si.bus(points*2) : route1D(points, R, T) :
-   si.bus((1 + ((2*R+1)*(T+1)) + (2*R+1))*points)
-
-

Where:

-
    -
  • points: total number of points in the mesh
  • -
  • R: neighbourhood radius
  • -
  • T: time coefficient
  • -
-
-

(fd.)route2D

-

Routing function for 2 dimensional schemes.

-

Usage

-
si.bus((2*R+1)^2*(T+1)*pointsX*pointsY),si.bus(pointsX*pointsY*2) :
-   route2D(pointsX, pointsY, R, T) :
-       si.bus((1 + ((2*R+1)^2*(T+1)) + (2*R+1)^2)*pointsX*pointsY)
-
-

Where:

-
    -
  • pointsX: total number of points in the X direction
  • -
  • pointsY: total number of points in the Y direction
  • -
  • R: neighbourhood radius
  • -
  • T: time coefficient
  • -
-

Scheme Operations

-

The scheme operation functions are used internally by the model building -functions but can also be taken separately. The schemePoint function is -where the update equation is actually calculated. The buildScheme functions -are used to stack in parallel several schemePoint blocks, according to the -choosed mesh size.

-
-

(fd.)schemePoint

-

This function calculates the next state for each mesh point, in order to -form a scheme, several of these blocks need to be stacked in parallel. -This function takes in input, in order, the force, the coefficient matrices -and the neighbours’ signals and outputs the next point state.

-

Usage

-
_,si.bus((2*R+1)^D*(T+1)),si.bus((2*R+1)^D) : schemePoint(R,T,D) : _
-
-

Where:

-
    -
  • R: neighbourhood radius
  • -
  • T: time coefficient
  • -
  • D: scheme spatial dimensions (i.e. 1 if 1-D, 2 if 2-D)
  • -
-
-

(fd.)buildScheme1D

-

This function is used to stack in parallel several schemePoint functions in -1 dimension, according to the number of points.

-

Usage

-
si.bus((1 + ((2*R+1)*(T+1)) + (2*R+1))*points) : buildScheme1D(points,R,T) :
-   si.bus(points)
-
-

Where:

-
    -
  • points: total number of points in the mesh
  • -
  • R: neighbourhood radius
  • -
  • T: time coefficient
  • -
-
-

(fd.)buildScheme2D

-

This function is used to stack in parallel several schemePoint functions in -2 dimensions, according to the number of points in the X and Y directions.

-

Usage

-
si.bus((1 + ((2*R+1)^2*(T+1)) + (2*R+1)^2)*pointsX*pointsY) :
-   buildScheme2D(pointsX,pointsY,R,T) : si.bus(pointsX*pointsY)
-
-

Where:

-
    -
  • pointsX: total number of points in the X direction
  • -
  • pointsY: total number of points in the Y direction
  • -
  • R: neighbourhood radius
  • -
  • T: time coefficient
  • -
-

Interaction Models

-

Here are defined two physically based interaction algorithms: a hammer and -a bow. These functions need to be coupled to the mesh pde, in the point -where the interaction happens: to do so, the mesh output signals can be fed -back and driven into the force block using the interpolation operators. -The latters can be also used to drive the single force output signal to the -correct scheme points.

-
-

(fd.)hammer

-

Implementation of a nonlinear collision model. The hammer is essentially a -finite difference scheme of a linear damped oscillator, which is coupled -with the mesh through the collision model (see Stefan Bilbao's book, -Numerical Sound Synthesis).

-

Usage

-
_ :hammer(coeff,omega0Sqr,sigma0,kH,alpha,k,offset,fIn) : _
-
-

Where:

-
    -
  • coeff: output force scaling coefficient
  • -
  • omega0Sqr: squared angular frequency of the hammer oscillator
  • -
  • sigma0: damping coefficient of the hammer oscillator
  • -
  • kH: hammer stiffness coefficient
  • -
  • alpha: nonlinearity parameter
  • -
  • k: time sampling step (the same as for the mesh)
  • -
  • offset: distance between the string and the hammer at rest in meters
  • -
  • fIn: hammer excitation signal (i.e. a button)
  • -
-
-

(fd.)bow

-

Implementation of a nonlinear friction based interaction model that induces -Helmholtz motion. (see Stefan Bilbao's book, Numerical Sound Synthesis).

-

Usage

-
_ :bow(coeff,alpha,k,vb) : _
-
-

Where:

-
    -
  • coeff: output force scaling coefficient
  • -
  • alpha: nonlinearity parameter
  • -
  • k: time sampling step (the same as for the mesh)
  • -
  • vb: bow velocity [m/s]
  • -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/fds.lib/overview/index.html b/docs/contributors/faust/fds.lib/overview/index.html deleted file mode 100644 index 9c819ea..0000000 --- a/docs/contributors/faust/fds.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - fds.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

fds.lib Documentation

-

Welcome to the documentation for fds.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.1.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/filters.lib/1.3.0/doc/index.html b/docs/contributors/faust/filters.lib/1.3.0/doc/index.html deleted file mode 100644 index c79cfaf..0000000 --- a/docs/contributors/faust/filters.lib/1.3.0/doc/index.html +++ /dev/null @@ -1,2157 +0,0 @@ - - - - - - - - - - - filters.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

filters.lib

-

Filters library. Its official prefix is fi.

-

The Filters library is organized into 22 sections:

- -

References

- -

Basic Filters

-
-

(fi.)zero

-

One zero filter. Difference equation: .

-

Usage

-
_ : zero(z) : _
-
-

Where:

-
    -
  • z: location of zero along real axis in z-plane
  • -
-

Reference

- -
-

(fi.)pole

-

One pole filter. Could also be called a "leaky integrator". -Difference equation: .

-

Usage

-
_ : pole(p) : _
-
-

Where:

-
    -
  • p: pole location = feedback coefficient
  • -
-

Reference

- -
-

(fi.)integrator

-

Same as pole(1) [implemented separately for block-diagram clarity].

-
-

(fi.)dcblockerat

-

DC blocker with configurable "break frequency". -The amplitude response is substantially flat above fb, -and sloped at about +6 dB/octave below fb. -Derived from the analog transfer function: - -(which can be seen as a 1st-order Butterworth highpass filter) -by the low-frequency-matching bilinear transform method -(i.e., using the typical frequency-scaling constant 2*SR).

-

Usage

-
_ : dcblockerat(fb) : _
-
-

Where:

-
    -
  • fb: "break frequency" in Hz, i.e., -3 dB gain frequency (see 2nd reference below)
  • -
-

References

- -
-

(fi.)dcblocker

-

DC blocker. Default dc blocker has -3dB point near 35 Hz (at 44.1 kHz) -and high-frequency gain near 1.0025 (due to no scaling). -dcblocker is as standard Faust function.

-

Usage

-
_ : dcblocker : _
-
-
-

(fi.)lptN

-

One-pole lowpass filter with arbitrary dis/charging factors set in dB and -times set in seconds.

-

Usage

-
_ : lptN(N, tN) : _
-
-

Where:

-
    -
  • N: is the attenuation factor in dB
  • -
  • tN: is the filter period in seconds, that is, the time for the -impulse response to decay by N dB
  • -
-

Reference

- -

Comb Filters

-
-

(fi.)ff_comb

-

Feed-Forward Comb Filter. Note that ff_comb requires integer delays -(uses delay internally). -ff_comb is a standard Faust function.

-

Usage

-
_ : ff_comb(maxdel,intdel,b0,bM) : _
-
-

Where:

-
    -
  • maxdel: maximum delay (a power of 2)
  • -
  • intdel: current (integer) comb-filter delay between 0 and maxdel
  • -
  • del: current (float) comb-filter delay between 0 and maxdel
  • -
  • b0: gain applied to delay-line input
  • -
  • bM: gain applied to delay-line output and then summed with input
  • -
-

Reference

- -
-

(fi.)ff_fcomb

-

Feed-Forward Comb Filter. Note that ff_fcomb takes floating-point delays -(uses fdelay internally). -ff_fcomb is a standard Faust function.

-

Usage

-
_ : ff_fcomb(maxdel,del,b0,bM) : _
-
-

Where:

-
    -
  • maxdel: maximum delay (a power of 2)
  • -
  • intdel: current (integer) comb-filter delay between 0 and maxdel
  • -
  • del: current (float) comb-filter delay between 0 and maxdel
  • -
  • b0: gain applied to delay-line input
  • -
  • bM: gain applied to delay-line output and then summed with input
  • -
-

Reference

- -
-

(fi.)ffcombfilter

-

Typical special case of ff_comb() where: b0 = 1.

-
-

(fi.)fb_comb

-

Feed-Back Comb Filter (integer delay).

-

Usage

-
_ : fb_comb(maxdel,intdel,b0,aN) : _
-
-

Where:

-
    -
  • maxdel: maximum delay (a power of 2)
  • -
  • intdel: current (integer) comb-filter delay between 0 and maxdel
  • -
  • del: current (float) comb-filter delay between 0 and maxdel
  • -
  • b0: gain applied to delay-line input and forwarded to output
  • -
  • aN: minus the gain applied to delay-line output before summing with the input - and feeding to the delay line
  • -
-

Reference

- -
-

(fi.)fb_fcomb

-

Feed-Back Comb Filter (floating point delay).

-

Usage

-
_ : fb_fcomb(maxdel,del,b0,aN) : _
-
-

Where:

-
    -
  • maxdel: maximum delay (a power of 2)
  • -
  • intdel: current (integer) comb-filter delay between 0 and maxdel
  • -
  • del: current (float) comb-filter delay between 0 and maxdel
  • -
  • b0: gain applied to delay-line input and forwarded to output
  • -
  • aN: minus the gain applied to delay-line output before summing with the input - and feeding to the delay line
  • -
-

Reference

- -
-

(fi.)rev1

-

Special case of fb_comb (rev1(maxdel,N,g)). -The "rev1 section" dates back to the 1960s in computer-music reverberation. -See the jcrev and brassrev in reverbs.lib for usage examples.

-
-

(fi.)fbcombfilter and (fi.)ffbcombfilter

-

Other special cases of Feed-Back Comb Filter.

-

Usage

-
_ : fbcombfilter(maxdel,intdel,g) : _
-_ : ffbcombfilter(maxdel,del,g) : _
-
-

Where:

-
    -
  • maxdel: maximum delay (a power of 2)
  • -
  • intdel: current (integer) comb-filter delay between 0 and maxdel
  • -
  • del: current (float) comb-filter delay between 0 and maxdel
  • -
  • g: feedback gain
  • -
-

Reference

- -
-

(fi.)allpass_comb

-

Schroeder Allpass Comb Filter. Note that:

-
allpass_comb(maxlen,len,aN) = ff_comb(maxlen,len,aN,1) : fb_comb(maxlen,len-1,1,aN);
-
-

which is a direct-form-1 implementation, requiring two delay lines. -The implementation here is direct-form-2 requiring only one delay line.

-

Usage

-
_ : allpass_comb(maxdel,intdel,aN) : _
-
-

Where:

-
    -
  • maxdel: maximum delay (a power of 2)
  • -
  • intdel: current (integer) comb-filter delay between 0 and maxdel
  • -
  • del: current (float) comb-filter delay between 0 and maxdel
  • -
  • aN: minus the feedback gain
  • -
-

References

- -
-

(fi.)allpass_fcomb

-

Schroeder Allpass Comb Filter. Note that:

-
allpass_comb(maxlen,len,aN) = ff_comb(maxlen,len,aN,1) : fb_comb(maxlen,len-1,1,aN);
-
-

which is a direct-form-1 implementation, requiring two delay lines. -The implementation here is direct-form-2 requiring only one delay line.

-

allpass_fcomb is a standard Faust library.

-

Usage

-
_ : allpass_comb(maxdel,intdel,aN) : _
-_ : allpass_fcomb(maxdel,del,aN) : _
-
-

Where:

-
    -
  • maxdel: maximum delay (a power of 2)
  • -
  • intdel: current (float) comb-filter delay between 0 and maxdel
  • -
  • del: current (float) comb-filter delay between 0 and maxdel
  • -
  • aN: minus the feedback gain
  • -
-

References

- -
-

(fi.)rev2

-

Special case of allpass_comb (rev2(maxlen,len,g)). -The "rev2 section" dates back to the 1960s in computer-music reverberation. -See the jcrev and brassrev in reverbs.lib for usage examples.

-
-

(fi.)allpass_fcomb5 and (fi.)allpass_fcomb1a

-

Same as allpass_fcomb but use fdelay5 and fdelay1a internally -(Interpolation helps - look at an fft of faust2octave on

-
`1-1' <: allpass_fcomb(1024,10.5,0.95), allpass_fcomb5(1024,10.5,0.95);`).
-
-

Direct-Form Digital Filter Sections

-
-

(fi.)iir

-

Nth-order Infinite-Impulse-Response (IIR) digital filter, -implemented in terms of the Transfer-Function (TF) coefficients. -Such filter structures are termed "direct form".

-

iir is a standard Faust function.

-

Usage

-
_ : iir(bcoeffs,acoeffs) : _
-
-

Where:

-
    -
  • bcoeffs: (b0,b1,...,b_order) = TF numerator coefficients
  • -
  • acoeffs: (a1,...,a_order) = TF denominator coeffs (a0=1)
  • -
-

Reference

- -
-

(fi.)fir

-

FIR filter (convolution of FIR filter coefficients with a signal). fir is standard Faust function.

-

Usage

-
_ : fir(bv) : _
-
-

Where:

-
    -
  • bv = b0,b1,...,bn is a parallel bank of coefficient signals.
  • -
-

Note

-

bv is processed using pattern-matching at compile time, - so it must have this normal form (parallel signals).

-

Example test program

-

Smoothing white noise with a five-point moving average:

-
bv = .2,.2,.2,.2,.2;
-process = noise : fir(bv);
-
-

Equivalent (note double parens):

-
process = noise : fir((.2,.2,.2,.2,.2));
-
-
-

(fi.)conv and (fi.)convN

-

Convolution of input signal with given coefficients.

-

Usage

-
_ : conv((k1,k2,k3,...,kN)) : _ // Argument = one signal bank
-_ : convN(N,(k1,k2,k3,...)) : _ // Useful when N < count((k1,...))
-
-
-

(fi.)tf1, (fi.)tf2 and (fi.)tf3

-

tfN = N'th-order direct-form digital filter.

-

Usage

-
_ : tf1(b0,b1,a1) : _
-_ : tf2(b0,b1,b2,a1,a2) : _
-_ : tf3(b0,b1,b2,b3,a1,a2,a3) : _
-
-

Where:

-
    -
  • b: transfer-function numerator
  • -
  • a: transfer-function denominator (monic)
  • -
-

Reference

- -
-

(fi.)notchw

-

Simple notch filter based on a biquad (tf2). -notchw is a standard Faust function.

-

Usage:

-
_ : notchw(width,freq) : _
-
-

Where:

-
    -
  • width: "notch width" in Hz (approximate)
  • -
  • freq: "notch frequency" in Hz
  • -
-

Reference

- -

Direct-Form Second-Order Biquad Sections

-

Direct-Form Second-Order Biquad Sections

-

Reference

- -
-

(fi.)tf21, (fi.)tf22, (fi.)tf22t and (fi.)tf21t

-

tfN = N'th-order direct-form digital filter where:

-
    -
  • tf21 is tf2, direct-form 1
  • -
  • tf22 is tf2, direct-form 2
  • -
  • tf22t is tf2, direct-form 2 transposed
  • -
  • tf21t is tf2, direct-form 1 transposed
  • -
-

Usage

-
_ : tf21(b0,b1,b2,a1,a2) : _
-_ : tf22(b0,b1,b2,a1,a2) : _
-_ : tf22t(b0,b1,b2,a1,a2) : _
-_ : tf21t(b0,b1,b2,a1,a2) : _
-
-

Where:

-
    -
  • b: transfer-function numerator
  • -
  • a: transfer-function denominator (monic)
  • -
-

Reference

- -

Ladder/Lattice Digital Filters

-

Ladder and lattice digital filters generally have superior numerical -properties relative to direct-form digital filters. They can be derived -from digital waveguide filters, which gives them a physical interpretation.

-

Reference

- -
-

(fi.)av2sv

-

Compute reflection coefficients sv from transfer-function denominator av.

-

Usage

-
sv = av2sv(av)
-
-

Where:

-
    -
  • av: parallel signal bank a1,...,aN
  • -
  • sv: parallel signal bank s1,...,sN
  • -
-

where ro = ith reflection coefficient, and - ai = coefficient of z^(-i) in the filter - transfer-function denominator A(z).

-

Reference

- -
-

(fi.)bvav2nuv

-

Compute lattice tap coefficients from transfer-function coefficients.

-

Usage

-
nuv = bvav2nuv(bv,av)
-
-

Where:

-
    -
  • av: parallel signal bank a1,...,aN
  • -
  • bv: parallel signal bank b0,b1,...,aN
  • -
  • nuv: parallel signal bank nu1,...,nuN
  • -
-

where nui is the i'th tap coefficient, - bi is the coefficient of z^(-i) in the filter numerator, - ai is the coefficient of z^(-i) in the filter denominator

-
-

(fi.)iir_lat2

-

Two-multiply lattice IIR filter of arbitrary order.

-

Usage

-
_ : iir_lat2(bv,av) : _
-
-

Where:

-
    -
  • bv: transfer-function numerator
  • -
  • av: transfer-function denominator (monic)
  • -
-
-

(fi.)allpassnt

-

Two-multiply lattice allpass (nested order-1 direct-form-ii allpasses), with taps.

-

Usage

-
_ : allpassnt(n,sv) : si.bus(n+1)
-
-

Where:

-
    -
  • n: the order of the filter
  • -
  • sv: the reflection coefficients (-1 1)
  • -
-

The first output is the n-th order allpass output, -while the remaining outputs are taps taken from the -input of each delay element from the input to the output. -See (fi.)allpassn for the single-output case.

-
-

(fi.)iir_kl

-

Kelly-Lochbaum ladder IIR filter of arbitrary order.

-

Usage

-
_ : iir_kl(bv,av) : _
-
-

Where:

-
    -
  • bv: transfer-function numerator
  • -
  • av: transfer-function denominator (monic)
  • -
-
-

(fi.)allpassnklt

-

Kelly-Lochbaum ladder allpass.

-

Usage:

-
_ : allpassnklt(n,sv) : _
-
-

Where:

-
    -
  • n: the order of the filter
  • -
  • sv: the reflection coefficients (-1 1)
  • -
-
-

(fi.)iir_lat1

-

One-multiply lattice IIR filter of arbitrary order.

-

Usage

-
_ : iir_lat1(bv,av) : _
-
-

Where:

-
    -
  • bv: transfer-function numerator as a bank of parallel signals
  • -
  • av: transfer-function denominator as a bank of parallel signals
  • -
-
-

(fi.)allpassn1mt

-

One-multiply lattice allpass with tap lines.

-

Usage

-
_ : allpassn1mt(N,sv) : _
-
-

Where:

-
    -
  • N: the order of the filter (fixed at compile time)
  • -
  • sv: the reflection coefficients (-1 1)
  • -
-
-

(fi.)iir_nl

-

Normalized ladder filter of arbitrary order.

-

Usage

-
_ : iir_nl(bv,av) : _
-
-

Where:

-
    -
  • bv: transfer-function numerator
  • -
  • av: transfer-function denominator (monic)
  • -
-

References

- -
-

(fi.)allpassnnlt

-

Normalized ladder allpass filter of arbitrary order.

-

Usage:

-
_ : allpassnnlt(N,sv) : _
-
-

Where:

-
    -
  • N: the order of the filter (fixed at compile time)
  • -
  • sv: the reflection coefficients (-1,1)
  • -
-

References

- -

Useful Special Cases

-
-

(fi.)tf2np

-

Biquad based on a stable second-order Normalized Ladder Filter -(more robust to modulation than tf2 and protected against instability).

-

Usage

-
_ : tf2np(b0,b1,b2,a1,a2) : _
-
-

Where:

-
    -
  • b: transfer-function numerator
  • -
  • a: transfer-function denominator (monic)
  • -
-
-

(fi.)wgr

-

Second-order transformer-normalized digital waveguide resonator.

-

Usage

-
_ : wgr(f,r) : _
-
-

Where:

-
    -
  • f: resonance frequency (Hz)
  • -
  • r: loss factor for exponential decay (set to 1 to make a numerically stable oscillator)
  • -
-

References

- -
-

(fi.)nlf2

-

Second order normalized digital waveguide resonator.

-

Usage

-
_ : nlf2(f,r) : _
-
-

Where:

-
    -
  • f: resonance frequency (Hz)
  • -
  • r: loss factor for exponential decay (set to 1 to make a sinusoidal oscillator)
  • -
-

Reference

- -
-

(fi.)apnl

-

Passive Nonlinear Allpass based on Pierce switching springs idea. -Switch between allpass coefficient a1 and a2 at signal zero crossings.

-

Usage

-
_ : apnl(a1,a2) : _
-
-

Where:

-
    -
  • a1 and a2: allpass coefficients
  • -
-

Reference

-
    -
  • "A Passive Nonlinear Digital Filter Design ..." by John R. Pierce and Scott -A. Van Duyne, JASA, vol. 101, no. 2, pp. 1120-1126, 1997
  • -
-

Ladder/Lattice Allpass Filters

-

An allpass filter has gain 1 at every frequency, but variable phase. -Ladder/lattice allpass filters are specified by reflection coefficients. -They are defined here as nested allpass filters, hence the names allpassn*.

-

References

- -
-

(fi.)scatN

-

N-port scattering junction.

-

Usage

-
si.bus(N) : scatN(N,av,filter) : si.bus(N)
-
-

Where:

- -

With no filter:

-
    -
  • The junction is lossless when the alpha parameters sum to 2 ("allpass").
  • -
  • The junction is passive but lossy when the alpha parameters sum to less than 2 ("resistive loss").
  • -
  • Dynamic and reactive junctions are obtained using the filter argument. - For guaranteed stability, the filter should be positive real. (See 2nd ref. below).
  • -
-

For (two-port scattering), the reflection coefficient corresponds -to alpha parameters .

-

Example: Whacky echo chamber made of 16 lossless "acoustic tubes":

-
process = _ : *(1.0/sqrt(N)) <: daisyRev(16,2,0.9999) :> _,_ with { 
-  daisyRev(N,Dp2,G) = si.bus(N) : (si.bus(2*N) :> si.bus(N)
-    : fi.scatN(N, par(i,N,2*G/float(N)), fi.lowpass(1,5000.0))
-    : par(i,N,de.delay(DS(i),DS(i)-1))) ~ si.bus(N) with { DS(i) = 2^(Dp2+i); };
-};
-
-

References

- -
-

(fi.)scat

-

Scatter off of reflectance r with reflection coefficient s.

-

Usage:

-
_ : scat(s,r) : _
-
-

Where:

-
    -
  • s: reflection coefficient between -1 and 1 for stability
  • -
  • r: single-input, single-output block diagram, - having gain less than 1 at all frequencies for stability.
  • -
-

Example: The following program should produce all zeros:

-
process = fi.allpassn(3,(.3,.2,.1)), fi.scat(.1, fi.scat(.2, fi.scat(.3, _)))
-          :> - : ^(2) : +~_;
-
-

Reference:

- -
-

(fi.)allpassn

-

Two-multiply lattice filter.

-

Usage:

-
_ : allpassn(n,sv) : _
-
-

Where:

-
    -
  • n: the order of the filter
  • -
  • sv: the reflection coefficients (-1 1)
  • -
  • sv: the reflection coefficients (s1,s2,...,sN), each between -1 and 1.
  • -
-

Equivalent to fi.allpassnt(n,sv) : _, par(i,n,!); -Equivalent to fi.scat( s(n), fi.scat( s(n-1), ..., fi.scat( s(1), _ ))) - with { s(k) = ba.take(k,sv); } ; -Identical to allpassn in old/filter.lib.

-

References

- -
-

(fi.)allpassnn

-

Normalized form - four multiplies and two adds per section, -but coefficients can be time varying and nonlinear without -"parametric amplification" (modulation of signal energy).

-

Usage:

-
_ : allpassnn(n,tv) : _
-
-

Where:

-
    -
  • n: the order of the filter
  • -
  • tv: the reflection coefficients (-PI PI)
  • -
-
-

(fi.)allpassnkl

-

Kelly-Lochbaum form - four multiplies and two adds per -section, but all signals have an immediate physical -interpretation as traveling pressure waves, etc.

-

Usage:

-
_ : allpassnkl(n,sv) : _
-
-

Where:

-
    -
  • n: the order of the filter
  • -
  • sv: the reflection coefficients (-1 1)
  • -
-
-

(fi.)allpass1m

-

One-multiply form - one multiply and three adds per section. -Normally the most efficient in special-purpose hardware.

-

Usage:

-
_ : allpassn1m(n,sv) : _
-
-

Where:

-
    -
  • n: the order of the filter
  • -
  • sv: the reflection coefficients (-1 1)
  • -
-

Digital Filter Sections Specified as Analog Filter Sections

-
-

(fi.)tf2s and (fi.)tf2snp

-

Second-order direct-form digital filter, -specified by ANALOG transfer-function polynomials B(s)/A(s), -and a frequency-scaling parameter. Digitization via the -bilinear transform is built in.

-

Usage

-
_ : tf2s(b2,b1,b0,a1,a0,w1) : _
-
-

Where:

-
        b2 s^2 + b1 s + b0
-H(s) = --------------------
-           s^2 + a1 s + a0
-
-

and w1 is the desired digital frequency (in radians/second) -corresponding to analog frequency 1 rad/sec (i.e., s = j).

-

Example test program

-

A second-order ANALOG Butterworth lowpass filter, -normalized to have cutoff frequency at 1 rad/sec, -has transfer function:

-
             1
-H(s) = -----------------
-        s^2 + a1 s + 1
-
-

where a1 = sqrt(2). Therefore, a DIGITAL Butterworth lowpass -cutting off at SR/4 is specified as tf2s(0,0,1,sqrt(2),1,PI*SR/2);

-

Method

-

Bilinear transform scaled for exact mapping of w1.

-

Reference

- -
-

(fi.)tf1snp

-

First-order special case of tf2snp above.

-

Usage

-
_ : tf1snp(b1,b0,a0) : _
-
-
-

(fi.)tf3slf

-

Analogous to tf2s above, but third order, and using the typical -low-frequency-matching bilinear-transform constant 2/T ("lf" series) -instead of the specific-frequency-matching value used in tf2s and tf1s. -Note the lack of a "w1" argument.

-

Usage

-
_ : tf3slf(b3,b2,b1,b0,a3,a2,a1,a0) : _
-
-
-

(fi.)tf1s

-

First-order direct-form digital filter, -specified by ANALOG transfer-function polynomials B(s)/A(s), -and a frequency-scaling parameter.

-

Usage

-
_ : tf1s(b1,b0,a0,w1) : _
-
-

Where:

-
   b1 s + b0
-
-

H(s) = ---------- - s + a0

-

and w1 is the desired digital frequency (in radians/second) -corresponding to analog frequency 1 rad/sec (i.e., s = j).

-

Example test program

-

A first-order ANALOG Butterworth lowpass filter, -normalized to have cutoff frequency at 1 rad/sec, -has transfer function:

-
      1
-
-

H(s) = ------- - s + 1

-

so b0 = a0 = 1 and b1 = 0. Therefore, a DIGITAL first-order -Butterworth lowpass with gain -3dB at SR/4 is specified as

-
tf1s(0,1,1,PI*SR/2); // digital half-band order 1 Butterworth
-
-

Method

-

Bilinear transform scaled for exact mapping of w1.

-

Reference

- -
-

(fi.)tf2sb

-

Bandpass mapping of tf2s: In addition to a frequency-scaling parameter -w1 (set to HALF the desired passband width in rad/sec), -there is a desired center-frequency parameter wc (also in rad/s). -Thus, tf2sb implements a fourth-order digital bandpass filter section -specified by the coefficients of a second-order analog lowpass prototype -section. Such sections can be combined in series for higher orders. -The order of mappings is (1) frequency scaling (to set lowpass cutoff w1), -(2) bandpass mapping to wc, then (3) the bilinear transform, with the -usual scale parameter 2*SR. Algebra carried out in maxima and pasted here.

-

Usage

-
_ : tf2sb(b2,b1,b0,a1,a0,w1,wc) : _
-
-
-

(fi.)tf1sb

-

First-to-second-order lowpass-to-bandpass section mapping, -analogous to tf2sb above.

-

Usage

-
_ : tf1sb(b1,b0,a0,w1,wc) : _
-
-

Simple Resonator Filters

-
-

(fi.)resonlp

-

Simple resonant lowpass filter based on tf2s (virtual analog). -resonlp is a standard Faust function.

-

Usage

-
_ : resonlp(fc,Q,gain) : _
-_ : resonhp(fc,Q,gain) : _
-_ : resonbp(fc,Q,gain) : _
-
-
-

Where:

-
    -
  • fc: center frequency (Hz)
  • -
  • Q: q
  • -
  • gain: gain (0-1)
  • -
-
-

(fi.)resonhp

-

Simple resonant highpass filters based on tf2s (virtual analog). -resonhp is a standard Faust function.

-

Usage

-
_ : resonlp(fc,Q,gain) : _
-_ : resonhp(fc,Q,gain) : _
-_ : resonbp(fc,Q,gain) : _
-
-
-

Where:

-
    -
  • fc: center frequency (Hz)
  • -
  • Q: q
  • -
  • gain: gain (0-1)
  • -
-
-

(fi.)resonbp

-

Simple resonant bandpass filters based on tf2s (virtual analog). -resonbp is a standard Faust function.

-

Usage

-
_ : resonlp(fc,Q,gain) : _
-_ : resonhp(fc,Q,gain) : _
-_ : resonbp(fc,Q,gain) : _
-
-
-

Where:

-
    -
  • fc: center frequency (Hz)
  • -
  • Q: q
  • -
  • gain: gain (0-1)
  • -
-

Butterworth Lowpass/Highpass Filters

-
-

(fi.)lowpass

-

Nth-order Butterworth lowpass filter. -lowpass is a standard Faust function.

-

Usage

-
_ : lowpass(N,fc) : _
-
-

Where:

-
    -
  • N: filter order (number of poles), nonnegative constant numerical expression
  • -
  • fc: desired cut-off frequency (-3dB frequency) in Hz
  • -
-

References

- -
-

(fi.)highpass

-

Nth-order Butterworth highpass filter. -highpass is a standard Faust function.

-

Usage

-
_ : highpass(N,fc) : _
-
-

Where:

-
    -
  • N: filter order (number of poles), nonnegative constant numerical expression
  • -
  • fc: desired cut-off frequency (-3dB frequency) in Hz
  • -
-

References

- -
-

(fi.)lowpass0_highpass1

-

Special Filter-Bank Delay-Equalizing Allpass Filters

-

These special allpass filters are needed by filterbank et al. below. -They are equivalent to (lowpass(N,fc) +|- highpass(N,fc))/2, but with -canceling pole-zero pairs removed (which occurs for odd N).

-
-

(fi.)lowpass_plus|minus_highpass

-

Catch-all definitions for generality - even order is done: -Catch-all definitions for generality - even order is done: -FIXME: Rewrite the following, as for orders 3 and 5 above, - to eliminate pole-zero cancellations: -FIXME: Rewrite the following, as for orders 3 and 5 above, - to eliminate pole-zero cancellations:

-

Elliptic (Cauer) Lowpass Filters

-

Elliptic (Cauer) Lowpass Filters

-

References

- -
-

(fi.)lowpass3e

-

Third-order Elliptic (Cauer) lowpass filter.

-

Usage

-
_ : lowpass3e(fc) : _
-
-

Where:

-
    -
  • fc: -3dB frequency in Hz
  • -
-

Design

-

For spectral band-slice level display (see octave_analyzer3e):

-
[z,p,g] = ncauer(Rp,Rs,3);  % analog zeros, poles, and gain, where
-Rp = 60  % dB ripple in stopband
-Rs = 0.2 % dB ripple in passband
-
-
-

(fi.)lowpass6e

-

Sixth-order Elliptic/Cauer lowpass filter.

-

Usage

-
_ : lowpass6e(fc) : _
-
-

Where:

-
    -
  • fc: -3dB frequency in Hz
  • -
-

Design

-

For spectral band-slice level display (see octave_analyzer6e):

-
[z,p,g] = ncauer(Rp,Rs,6);  % analog zeros, poles, and gain, where
- Rp = 80  % dB ripple in stopband
- Rs = 0.2 % dB ripple in passband
-
-

Elliptic Highpass Filters

-
-

(fi.)highpass3e

-

Third-order Elliptic (Cauer) highpass filter. Inversion of lowpass3e wrt unit -circle in s plane (s <- 1/s).

-

Usage

-
_ : highpass3e(fc) : _
-
-

Where:

-
    -
  • fc: -3dB frequency in Hz
  • -
-
-

(fi.)highpass6e

-

Sixth-order Elliptic/Cauer highpass filter. Inversion of lowpass3e wrt unit -circle in s plane (s <- 1/s).

-

Usage

-
_ : highpass6e(fc) : _
-
-

Where:

-
    -
  • fc: -3dB frequency in Hz
  • -
-

Butterworth Bandpass/Bandstop Filters

-
-

(fi.)bandpass

-

Order 2*Nh Butterworth bandpass filter made using the transformation -s <- s + wc^2/s on lowpass(Nh), where wc is the desired bandpass center -frequency. The lowpass(Nh) cutoff w1 is half the desired bandpass width. -bandpass is a standard Faust function.

-

Usage

-
_ : bandpass(Nh,fl,fu) : _
-
-

Where:

-
    -
  • Nh: HALF the desired bandpass order (which is therefore even)
  • -
  • fl: lower -3dB frequency in Hz
  • -
  • fu: upper -3dB frequency in Hz -Thus, the passband width is fu-fl, - and its center frequency is (fl+fu)/2.
  • -
-

Reference

- -
-

(fi.)bandstop

-

Order 2*Nh Butterworth bandstop filter made using the transformation -s <- s + wc^2/s on highpass(Nh), where wc is the desired bandpass center -frequency. The highpass(Nh) cutoff w1 is half the desired bandpass width. -bandstop is a standard Faust function.

-

Usage

-
_ : bandstop(Nh,fl,fu) : _
-
-

Where:

-
    -
  • Nh: HALF the desired bandstop order (which is therefore even)
  • -
  • fl: lower -3dB frequency in Hz
  • -
  • fu: upper -3dB frequency in Hz -Thus, the passband (stopband) width is fu-fl, - and its center frequency is (fl+fu)/2.
  • -
-

Reference

- -

Elliptic Bandpass Filters

-
-

(fi.)bandpass6e

-

Order 12 elliptic bandpass filter analogous to bandpass(6).

-
-

(fi.)bandpass12e

-

Order 24 elliptic bandpass filter analogous to bandpass(6).

-
-

(fi.)pospass

-

Positive-Pass Filter (single-side-band filter).

-

Usage

-
_ : pospass(N,fc) : _,_
-
-

where

-
    -
  • N: filter order (Butterworth bandpass for positive frequencies).
  • -
  • fc: lower bandpass cutoff frequency in Hz.
  • -
  • Highpass cutoff frequency at ma.SR/2 - fc Hz.
  • -
-

Example test program

-
    -
  • See dm.pospass_demo
  • -
  • Look at frequency response
  • -
-

Method

-

A filter passing only positive frequencies can be made from a -half-band lowpass by modulating it up to the positive-frequency range. -Equivalently, down-modulate the input signal using a complex sinusoid at -SR/4 Hz, -lowpass it with a half-band filter, and modulate back up by SR/4 Hz. -In Faust/math notation: - -

-

An approximation to the Hilbert transform is given by the -imaginary output signal:

-
hilbert(N) = pospass(N) : !,*(2);
-
-

References

- -

Parametric Equalizers (Shelf, Peaking)

-

Parametric Equalizers (Shelf, Peaking).

-

References

- -
-

(fi.)low_shelf

-

First-order "low shelf" filter (gain boost|cut between dc and some frequency) -low_shelf is a standard Faust function.

-

Usage

-
_ : lowshelf(N,L0,fx) : _
-_ : low_shelf(L0,fx) : _ // default case (order 3)
-_ : lowshelf_other_freq(N,L0,fx) : _
-
-

Where: -* N: filter order 1, 3, 5, ... (odd only, default should be 3, a constant numerical expression) -* L0: desired level (dB) between dc and fx (boost L0>0 or cut L0<0) -* fx: -3dB frequency of lowpass band (L0>0) or upper band (L0<0) - (see "SHELF SHAPE" below).

-

The gain at SR/2 is constrained to be 1. -The generalization to arbitrary odd orders is based on the well known -fact that odd-order Butterworth band-splits are allpass-complementary -(see filterbank documentation below for references).

-

Shelf Shape

-

The magnitude frequency response is approximately piecewise-linear -on a log-log plot ("BODE PLOT"). The Bode "stick diagram" approximation -L(lf) is easy to state in dB versus dB-frequency lf = dB(f):

-
    -
  • L0 > 0:
      -
    • L(lf) = L0, f between 0 and fx = 1st corner frequency;
    • -
    • L(lf) = L0 - N * (lf - lfx), f between fx and f2 = 2nd corner frequency;
    • -
    • L(lf) = 0, lf > lf2.
    • -
    • lf2 = lfx + L0/N = dB-frequency at which level gets back to 0 dB.
    • -
    -
  • -
  • L0 < 0:
      -
    • L(lf) = L0, f between 0 and f1 = 1st corner frequency;
    • -
    • L(lf) = - N * (lfx - lf), f between f1 and lfx = 2nd corner frequency;
    • -
    • L(lf) = 0, lf > lfx.
    • -
    • lf1 = lfx + L0/N = dB-frequency at which level goes up from L0.
    • -
    -
  • -
-

See lowshelf_other_freq.

-

References

-

See "Parametric Equalizers" above for references regarding -low_shelf, high_shelf, and peak_eq.

-
-

(fi.)high_shelf

-

First-order "high shelf" filter (gain boost|cut above some frequency). -high_shelf is a standard Faust function.

-

Usage

-
_ : highshelf(N,Lpi,fx) : _
-_ : high_shelf(L0,fx) : _ // default case (order 3)
-_ : highshelf_other_freq(N,Lpi,fx) : _
-
-

Where:

-
    -
  • N: filter order 1, 3, 5, ... (odd only, a constant numerical expression).
  • -
  • Lpi: desired level (dB) between fx and SR/2 (boost Lpi>0 or cut Lpi<0)
  • -
  • fx: -3dB frequency of highpass band (L0>0) or lower band (L0<0) - (Use highshelf_other_freq() below to find the other one.)
  • -
-

The gain at dc is constrained to be 1. -See lowshelf documentation above for more details on shelf shape.

-

References

-

See "Parametric Equalizers" above for references regarding -low_shelf, high_shelf, and peak_eq.

-
-

(fi.)peak_eq

-

Second order "peaking equalizer" section (gain boost or cut near some frequency) -Also called a "parametric equalizer" section. -peak_eq is a standard Faust function.

-

Usage

-
_ : peak_eq(Lfx,fx,B) : _
-
-

Where:

-
    -
  • Lfx: level (dB) at fx (boost Lfx>0 or cut Lfx<0)
  • -
  • fx: peak frequency (Hz)
  • -
  • B: bandwidth (B) of peak in Hz
  • -
-

References

-

See "Parametric Equalizers" above for references regarding -low_shelf, high_shelf, and peak_eq.

-
-

(fi.)peak_eq_cq

-

Constant-Q second order peaking equalizer section.

-

Usage

-
_ : peak_eq_cq(Lfx,fx,Q) : _
-
-

Where:

-
    -
  • Lfx: level (dB) at fx
  • -
  • fx: boost or cut frequency (Hz)
  • -
  • Q: "Quality factor" = fx/B where B = bandwidth of peak in Hz
  • -
-

References

-

See "Parametric Equalizers" above for references regarding -low_shelf, high_shelf, and peak_eq.

-
-

(fi.)peak_eq_rm

-

Regalia-Mitra second order peaking equalizer section.

-

Usage

-
_ : peak_eq_rm(Lfx,fx,tanPiBT) : _
-
-

Where:

-
    -
  • Lfx: level (dB) at fx
  • -
  • fx: boost or cut frequency (Hz)
  • -
  • tanPiBT: tan(PI*B/SR), where B = -3dB bandwidth (Hz) when 10^(Lfx/20) = 0 - ~ PI*B/SR for narrow bandwidths B
  • -
-

Reference

-

P.A. Regalia, S.K. Mitra, and P.P. Vaidyanathan, -"The Digital All-Pass Filter: A Versatile Signal Processing Building Block" -Proceedings of the IEEE, 76(1):19-37, Jan. 1988. (See pp. 29-30.) -See also "Parametric Equalizers" above for references on shelf -and peaking equalizers in general.

-
-

(fi.)spectral_tilt

-

Spectral tilt filter, providing an arbitrary spectral rolloff factor -alpha in (-1,1), where - -1 corresponds to one pole (-6 dB per octave), and - +1 corresponds to one zero (+6 dB per octave). -In other words, alpha is the slope of the ln magnitude versus ln frequency. -For a "pinking filter" (e.g., to generate 1/f noise from white noise), -set alpha to -1/2.

-

Usage

-
_ : spectral_tilt(N,f0,bw,alpha) : _
-
-

Where:

-
    -
  • N: desired integer filter order (fixed at compile time)
  • -
  • f0: lower frequency limit for desired roll-off band > 0
  • -
  • bw: bandwidth of desired roll-off band
  • -
  • alpha: slope of roll-off desired in nepers per neper, - between -1 and 1 (ln mag / ln radian freq)
  • -
-

Example test program

-

See dm.spectral_tilt_demo and the documentation for no.pink_noise.

-

Reference

-

J.O. Smith and H.F. Smith, -"Closed Form Fractional Integration and Differentiation via Real Exponentially Spaced Pole-Zero Pairs", -arXiv.org publication arXiv:1606.06154 [cs.CE], June 7, 2016, -* http://arxiv.org/abs/1606.06154

-
-

(fi.)levelfilter

-

Dynamic level lowpass filter. -levelfilter is a standard Faust function.

-

Usage

-
_ : levelfilter(L,freq) : _
-
-

Where:

-
    -
  • L: desired level (in dB) at Nyquist limit (SR/2), e.g., -60
  • -
  • freq: corner frequency (-3dB point) usually set to fundamental freq
  • -
  • N: Number of filters in series where L = L/N
  • -
-

Reference

- -
-

(fi.)levelfilterN

-

Dynamic level lowpass filter.

-

Usage

-
_ : levelfilterN(N,freq,L) : _
-
-

Where:

-
    -
  • N: Number of filters in series where L = L/N, a constant numerical expression
  • -
  • freq: corner frequency (-3dB point) usually set to fundamental freq
  • -
  • L: desired level (in dB) at Nyquist limit (SR/2), e.g., -60
  • -
-

Reference

- -

Mth-Octave Filter-Banks

-

Mth-octave filter-banks split the input signal into a bank of parallel signals, one -for each spectral band. They are related to the Mth-Octave Spectrum-Analyzers in -analysis.lib. -The documentation of this library contains more details about the implementation. -The parameters are:

-
    -
  • M: number of band-slices per octave (>1), a constant numerical expression
  • -
  • N: total number of bands (>2), a constant numerical expression
  • -
  • ftop: upper bandlimit of the Mth-octave bands (<SR/2)
  • -
-

In addition to the Mth-octave output signals, there is a highpass signal -containing frequencies from ftop to SR/2, and a "dc band" lowpass signal -containing frequencies from 0 (dc) up to the start of the Mth-octave bands. -Thus, the N output signals are

-
highpass(ftop), MthOctaveBands(M,N-2,ftop), dcBand(ftop*2^(-M*(N-1)))
-
-

A Filter-Bank is defined here as a signal bandsplitter having the -property that summing its output signals gives an allpass-filtered -version of the filter-bank input signal. A more conventional term for -this is an "allpass-complementary filter bank". If the allpass filter -is a pure delay (and possible scaling), the filter bank is said to be -a "perfect-reconstruction filter bank" (see Vaidyanathan-1993 cited -below for details). A "graphic equalizer", in which band signals -are scaled by gains and summed, should be based on a filter bank.

-

The filter-banks below are implemented as Butterworth or Elliptic -spectrum-analyzers followed by delay equalizers that make them -allpass-complementary.

-

Increasing Channel Isolation

-

Go to higher filter orders - see Regalia et al. or Vaidyanathan (cited -below) regarding the construction of more aggressive recursive -filter-banks using elliptic or Chebyshev prototype filters.

-

References

-
    -
  • "Tree-structured complementary filter banks using all-pass sections", - Regalia et al., IEEE Trans. Circuits & Systems, CAS-34:1470-1484, Dec. 1987
  • -
  • "Multirate Systems and Filter Banks", P. Vaidyanathan, Prentice-Hall, 1993
  • -
  • Elementary filter theory: https://ccrma.stanford.edu/~jos/filters/
  • -
-
-

(fi.)mth_octave_filterbank[n]

-

Allpass-complementary filter banks based on Butterworth band-splitting. -For Butterworth band-splits, the needed delay equalizer is easily found.

-

Usage

-
_ : mth_octave_filterbank(O,M,ftop,N) : par(i,N,_)     // Oth-order
-_ : mth_octave_filterbank_alt(O,M,ftop,N) : par(i,N,_) // dc-inverted version
-
-

Also for convenience:

-
_ : mth_octave_filterbank3(M,ftop,N) : par(i,N,_) // 3rd-order Butterworth
-_ : mth_octave_filterbank5(M,ftop,N) : par(i,N,_) // 5th-order Butterworth
-mth_octave_filterbank_default = mth_octave_filterbank5;
-
-

Where:

-
    -
  • O: order of filter used to split each frequency band into two, a constant numerical expression
  • -
  • M: number of band-slices per octave, a constant numerical expression
  • -
  • ftop: highest band-split crossover frequency (e.g., 20 kHz)
  • -
  • N: total number of bands (including dc and Nyquist), a constant numerical expression
  • -
-

Arbitrary-Crossover Filter-Banks and Spectrum Analyzers

-

These are similar to the Mth-octave analyzers above, except that the -band-split frequencies are passed explicitly as arguments.

-
-

(fi.)filterbank

-

Filter bank. -filterbank is a standard Faust function.

-

Usage

-
_ : filterbank (O,freqs) : par(i,N,_) // Butterworth band-splits
-
-

Where:

-
    -
  • O: band-split filter order (odd integer required for filterbank[i], a constant numerical expression)
  • -
  • freqs: (fc1,fc2,...,fcNs) [in numerically ascending order], where - Ns=N-1 is the number of octave band-splits - (total number of bands N=Ns+1).
  • -
-

If frequencies are listed explicitly as arguments, enclose them in parens:

-
_ : filterbank(3,(fc1,fc2)) : _,_,_
-
-
-

(fi.)filterbanki

-

Inverted-dc filter bank.

-

Usage

-
_ : filterbanki(O,freqs) : par(i,N,_) // Inverted-dc version
-
-

Where:

-
    -
  • O: band-split filter order (odd integer required for filterbank[i], a constant numerical expression)
  • -
  • freqs: (fc1,fc2,...,fcNs) [in numerically ascending order], where - Ns=N-1 is the number of octave band-splits - (total number of bands N=Ns+1).
  • -
-

If frequencies are listed explicitly as arguments, enclose them in parens:

-
_ : filterbanki(3,(fc1,fc2)) : _,_,_
-
-

State Variable Filters

-

References

-

Solving the continuous SVF equations using trapezoidal integration

- -
-

(fi.)svf

-

An environment with lp, bp, hp, notch, peak, ap, bell, ls, hs SVF based filters. -All filters have freq and Q parameters, the bell, ls, hs ones also have a gain third parameter.

-

Usage

-
_ : svf.xx(freq, Q, [gain]) : _
-
-

Where:

-
    -
  • freq: cut frequency
  • -
  • Q: quality factor
  • -
  • [gain]: gain in dB
  • -
-

Linkwitz-Riley 4th-order 2-way, 3-way, and 4-way crossovers

-

The Linkwitz-Riley (LR) crossovers are designed to produce a fully-flat -magnitude response when their outputs are combined. The 4th-order -LR filters (LR4) have a 24dB/octave slope and they are rather popular audio -crossovers used in multi-band processing.

-

The LR4 can be constructed by cascading two second-order Butterworth -filters. For the second-order Butterworth filters, we will use the SVF -filter implemented above by setting the Q-factor to 1.0 / sqrt(2.0). -These will be cascaded in pairs to build the LR4 highpass and lowpass. -For the phase correction, we will use the 2nd-order Butterworth allpass.

-

Reference

-

Zavalishin, Vadim. "The art of VA filter design." Native Instruments, Berlin, Germany (2012).

-
-

(fi.)lowpassLR4

-

4th-order Linkwitz-Riley lowpass.

-

Usage

-
_ : lowpassLR4(cf) : _
-
-

Where:

-
    -
  • cf is the lowpass cutoff in Hz
  • -
-
-

(fi.)highpassLR4

-

4th-order Linkwitz-Riley highpass.

-

Usage

-
_ : highpassLR4(cf) : _
-
-

Where:

-
    -
  • cf is the highpass cutoff in Hz
  • -
-
-

(fi.)crossover2LR4

-

Two-way 4th-order Linkwitz-Riley crossover.

-

Usage

-
_ : crossover2LR4(cf) : si.bus(2)
-
-

Where:

-
    -
  • cf is the crossover split cutoff in Hz
  • -
-
-

(fi.)crossover3LR4

-

Three-way 4th-order Linkwitz-Riley crossover.

-

Usage

-
_ : crossover3LR4(cf1, cf2) : si.bus(3)
-
-

Where:

-
    -
  • cf1 is the crossover lower split cutoff in Hz
  • -
  • cf2 is the crossover upper split cutoff in Hz
  • -
-
-

(fi.)crossover4LR4

-

Four-way 4th-order Linkwitz-Riley crossover.

-

Usage

-
_ : crossover4LR4(cf1, cf2, cf3) : si.bus(4)
-
-

Where:

-
    -
  • cf1 is the crossover lower split cutoff in Hz
  • -
  • cf2 is the crossover mid split cutoff in Hz
  • -
  • cf3 is the crossover upper split cutoff in Hz
  • -
-
-

(fi.)crossover8LR4

-

Eight-way 4th-order Linkwitz-Riley crossover.

-

Usage

-
_ : crossover8LR4(cf1, cf2, cf3, cf4, cf5, cf6, cf7) : si.bus(8)
-
-

Where:

-
    -
  • cf1-cf7 are the crossover cutoff frequencies in Hz
  • -
-

Standardized Filters

-
-

(fi.)itu_r_bs_1770_4_kfilter

-

The prefilter from Recommendation ITU-R BS.1770-4 for loudness -measurement. Also known as "K-filter". The recommendation defines -biquad filter coefficients for a fixed sample rate of 48kHz (page -4-5). Here, we construct biquads for arbitrary samplerates. The -resulting filter is normalized, such that the magnitude at 997Hz is -unity gain 1.0.

-

Please note, the ITU-recommendation handles the normalization in -equation (2) by subtracting 0.691dB, which is not needed with -itu_r_bs_1770_4_kfilter.

-

One option for future improvement might be, to round those filter -coefficients, that are almost equal to one. Second, the maximum -magnitude difference at 48kHz between the ITU-defined filter and -itu_r_bs_1770_4_kfilter is 0.001dB, which obviously could be -less.

-

Usage

-
_ : itu_r_bs_1770_4_kfilter : _
-
-

Reference

- -

Averaging Functions

-
-

(fi.)avg_rect

-

Moving average.

-

Usage

-
_ : avg_rect(period) : _
-
-

Where:

-
    -
  • period is the averaging frame in seconds
  • -
-
-

(fi.)avg_tau

-

Averaging function based on a one-pole filter and the tau response time. -Tau represents the effective length of the one-pole impulse response, -that is, tau is the integral of the filter's impulse response. This -response is slower to reach the final value but has less ripples in -non-steady signals.

-

Usage

-
_ : avg_tau(period) : _
-
-

Where:

-
    -
  • period is the time, in seconds, for the system to decay by 1/e, -or to reach 1-1/e of its final value.
  • -
-

Reference

- -
-

(fi.)avg_t60

-

Averaging function based on a one-pole filter and the t60 response time. -This response is particularly useful when the system is required to -reach the final value after about period seconds.

-

Usage

-
_ : avg_t60(period) : _
-
-

Where:

-
    -
  • period is the time, in seconds, for the system to decay by 1/1000, -or to reach 1-1/1000 of its final value.
  • -
-

Reference

- -
-

(fi.)avg_t19

-

Averaging function based on a one-pole filter and the t19 response time. -This response is close to the moving-average algorithm as it roughly reaches -the final value after period seconds and shows about the same -oscillations for non-steady signals.

-

Usage

-
_ : avg_t19(period) : _
-
-

Where:

-
    -
  • period is the time, in seconds, for the system to decay by 1/e^2.2, -or to reach 1-1/e^2.2 of its final value.
  • -
-

Reference

-

Zölzer, U. (2008). Digital audio signal processing (Vol. 9). New York: Wiley.

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/filters.lib/overview/index.html b/docs/contributors/faust/filters.lib/overview/index.html deleted file mode 100644 index 66b9205..0000000 --- a/docs/contributors/faust/filters.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - filters.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

filters.lib Documentation

-

Welcome to the documentation for filters.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.3.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/hoa.lib/1.4.0/doc/index.html b/docs/contributors/faust/hoa.lib/1.4.0/doc/index.html deleted file mode 100644 index fdd0c99..0000000 --- a/docs/contributors/faust/hoa.lib/1.4.0/doc/index.html +++ /dev/null @@ -1,758 +0,0 @@ - - - - - - - - - - - hoa.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
- -
- -

hoa.lib

-

Faust library for high order ambisonic. Its official prefix is ho.

-

References

- -

Encoding/decoding Functions

-
-

(ho.)encoder

-

Ambisonic encoder. Encodes a signal in the circular harmonics domain -depending on an order of decomposition and an angle.

-

Usage

-
encoder(N, x, a) : _
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • x: the signal
  • -
  • a: the angle
  • -
-
-

(ho.)rEncoder

-

Ambisonic encoder in 2D including source rotation. A mono signal is encoded at a certain ambisonic order -with two possible modes: either rotation with an angular speed, or static with a fixed angle (when speed is zero).

-

Usage

-
_ : rEncoder(N, sp, a, it) : _,_, ...
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • sp: the azimuth speed expressed as angular speed (2PI/sec), positive or negative
  • -
  • a: the fixed azimuth when the rotation stops (sp = 0) in radians
  • -
  • it : interpolation time (in milliseconds) between the rotation and the fixed modes
  • -
-
-

(ho.)stereoEncoder

-

Encoding of a stereo pair of channels with symetric angles (a/2, -a/2).

-

Usage

-
_,_ : stereoEncoder(N, a) : _,_, ...
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • a : opening angle in radians, left channel at a/2 angle, right channel at -a/2 angle
  • -
-
-

(ho.)multiEncoder

-

Encoding of a set of P signals distributed on the unit circle according to a list of P speeds and P angles.

-

Usage

-
_,_, ... : multiEncoder(N, lspeed, langle, it) : _,_, ...
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • lspeed : a list of P speeds in turns by second (one speed per input signal, positive or negative)
  • -
  • langle : a list of P angles in radians on the unit circle to localize the sources (one angle per input signal)
  • -
  • it : interpolation time (in milliseconds) between the rotation and the fixed modes.
  • -
-
-

(ho.)decoder

-

Decodes an ambisonics sound field for a circular array of loudspeakers.

-

Usage

-
_ : decoder(N, P) : _
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • P: the number of speakers (constant numerical expression)
  • -
-

Note

-

The number of loudspeakers must be greater or equal to 2n+1. -It's preferable to use 2n+2 loudspeakers.

-
-

(ho.)decoderStereo

-

Decodes an ambisonic sound field for stereophonic configuration. -An "home made" ambisonic decoder for stereophonic restitution -(30° - 330°): Sound field lose energy around 180°. You should -use inPhase optimization with ponctual sources.

-

Usage

-
_ : decoderStereo(N) : _
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
-
-

(ho.)iBasicDecoder

-

The irregular basic decoder is a simple decoder that projects the incoming ambisonic situation -to the loudspeaker situation (P loudspeakers) whatever it is, without compensation. -When there is a strong irregularity, there can be some discontinuity in the sound field.

-

Usage

-
_,_, ... : iBasicDecoder(N,la, direct, shift) : _,_, ...
-
-

Where:

-
    -
  • N: the ambisonic order (there are 2*N+1 inputs to this function)
  • -
  • la : the list of P angles in degrees, for instance (0, 85, 182, 263) for four loudspeakers
  • -
  • direct: 1 for direct mode, -1 for the indirect mode (changes the rotation direction)
  • -
  • shift : angular shift in degrees to easily adjust angles
  • -
-
-

(ho.)circularScaledVBAP

-

The function provides a circular scaled VBAP with all loudspeakers and the virtual source on the unit-circle.

-

Usage

-
_ : circularScaledVBAP(l, t) : _,_, ...
-
-

Where:

-
    -
  • l : the list of angles of the loudspeakers in degrees, for instance (0, 85, 182, 263) for four loudspeakers
  • -
  • t : the current angle of the virtual source in degrees
  • -
-
-

(ho.)imlsDecoder

-

Irregular decoder in 2D for an irregular configuration of P loudspeakers -using 2D VBAP for compensation.

-

Usage

-
_,_, ... : imlsDecoder(N,la, direct, shift) : _,_, ...
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • la : the list of P angles in degrees, for instance (0, 85, 182, 263) for four loudspeakers
  • -
  • direct: 1 for direct mode, -1 for the indirect mode (changes the rotation direction)
  • -
  • shift : angular shift in degrees to easily adjust angles
  • -
-
-

(ho.)iDecoder

-

General decoder in 2D enabling an irregular multi-loudspeaker configuration -and to switch between multi-channel and stereo.

-

Usage

-
_,_, ... : iDecoder(N, la, direct, st, g) : _,_, ...
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • la: the list of angles in degrees
  • -
  • direct: 1 for direct mode, -1 for the indirect mode (changes the rotation direction)
  • -
  • shift : angular shift in degrees to easily adjust angles
  • -
  • st: 1 for stereo, 0 for multi-loudspeaker configuration. When 1, stereo sounds goes through the first two channels
  • -
  • g : gain between 0 and 1
  • -
-

Optimization Functions

-

Functions to weight the circular harmonics signals depending to the -ambisonics optimization. -It can be basic for no optimization, maxRe or inPhase.

-
-

(ho.)optimBasic

-

The basic optimization has no effect and should be used for a perfect -circle of loudspeakers with one listener at the perfect center loudspeakers -array.

-

Usage

-
_ : optimBasic(N) : _
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
-
-

(ho.)optimMaxRe

-

The maxRe optimization optimizes energy vector. It should be used for an -auditory confined in the center of the loudspeakers array.

-

Usage

-
_ : optimMaxRe(N) : _
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
-
-

(ho.)optimInPhase

-

The inPhase optimization optimizes energy vector and put all loudspeakers signals -in phase. It should be used for an auditory.

-

Usage

-
_ : optimInPhase(N) : _
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
-
-

(ho.)optim

-

Ambisonic optimizer including the three elementary optimizers: -(ho).optimBasic, (ho).optimMaxRe and (ho.)optimInPhase.

-

Usage

-
_,_, ... : optim(N, ot) : _,_, ...
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • ot : optimization type (0 for optimBasic, 1 for optimMaxRe, 2 for optimInPhase)
  • -
-
-

(ho.)wider

-

Can be used to wide the diffusion of a localized sound. The order -depending signals are weighted and appear in a logarithmic way to -have linear changes.

-

Usage

-
_ : wider(N,w) : _
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • w: the width value between 0 - 1
  • -
-
-

(ho.)mirror

-

Mirroring effect on the sound field.

-

Usage

-
_,_, ... : mirror(N, fa) : _,_, ...
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • fa : mirroring type (1 = original sound field, 0 = original+mirrored sound field, -1 = mirrored sound field)
  • -
-
-

(ho.)map

-

It simulates the distance of the source by applying a gain -on the signal and a wider processing on the soundfield.

-

Usage

-
map(N, x, r, a)
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • x: the signal
  • -
  • r: the radius
  • -
  • a: the angle in radian
  • -
-
-

(ho.)rotate

-

Rotates the sound field.

-

Usage

-
_ : rotate(N, a) : _
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • a: the angle in radian
  • -
-
-

(ho.)scope

-

Produces an XY pair of signals representing the ambisonic sound field.

-

Usage

-
_,_, ... : scope(N, rt) : _,_
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • rt : refreshment time in milliseconds
  • -
-

Spatial Sound Processes

-

We propose implementations of processes intricated to the ambisonic model. -The process is implemented using as many instances as the number of harmonics at at certain order. -The key control parameters of these instances are computed thanks to distribution functions -(th functions below) and to a global driving factor.

-
-

(ho.).fxDecorrelation

-

Spatial ambisonic decorrelation in fx mode.

-

fxDecorrelation applies decorrelations to spatial components already created. -The decorrelation is defined for each #i spatial component among P=2*N+1 at the ambisonic order N -as a delay of 0 if factor fa is under a certain value 1-(i+1)/P and d*F((i+1)/p) in the contrary case, -where d is the maximum delay applied (in samples) and F is a distribution function for durations. -The user can choose this delay time distribution among 22 different ones. -The delay increases according to the index of ambisonic components. -But it increases at each step and it is modulated by a threshold. -Therefore, delays are progressively revealed when the factor increases:

-
    -
  • when the factor is close to 0, only upper components are delayed;
  • -
  • when the factor increases, more and more components are delayed.
  • -
-

Usage

-
_,_, ... : fxDecorrelation(N, d, wf, fa, fd, tf) : _,_, ...
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • d: the maximum delay applied (in samples)
  • -
  • wf: window frequency (in Hz) for the overlapped delay
  • -
  • fa: decorrelation factor (between 0 and 1)
  • -
  • fd: feedback / level of reinjection (between 0 and 1)
  • -
  • tf: type of function of delay distribution (integer, between 0 and 21)
  • -
-
-

(ho.).synDecorrelation

-

Spatial ambisonic decorrelation in syn mode.

-

synDecorrelation generates spatial decorrelated components in ambisonics from one mono signal. -The decorrelation is defined for each #i spatial component among P=2*N+1 at the ambisonic order N -as a delay of 0 if factor fa is under a certain value 1-(i+1)/P and d*F((i+1)/p) in the contrary case, -where d is the maximum delay applied (in samples) and F is a distribution function for durations. -The user can choose this delay time distribution among 22 different ones. -The delay increases according to the index of ambisonic components. -But it increases at each step and it is modulated by a threshold. -Therefore, delays are progressively revealed when the factor increases:

-
    -
  • when the factor is close to 0, only upper components are delayed;
  • -
  • when the factor increases, more and more components are delayed.
  • -
-

When the factor is between [0; 1/P], upper harmonics are progressively faded and the level of the H0 component is compensated -to avoid source localization and to produce a large mono.

-

Usage

-
_,_, ... : synDecorrelation(N, d, wf, fa, fd, tf) : _,_, ...
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • d: the maximum delay applied (in samples)
  • -
  • wf: window frequency (in Hz) for the overlapped delay
  • -
  • fa: decorrelation factor (between 0 and 1)
  • -
  • fd: feedback / level of reinjection (between 0 and 1)
  • -
  • tf: type of function of delay distribution (integer, between 0 and 21)
  • -
-
-

(ho.).fxRingMod

-

Spatial ring modulation in syn mode.

-

fxRingMod applies ring modulation to spatial components already created. -The ring modulation is defined for each spatial component among P=2*n+1 at the ambisonic order N. -For each spatial component #i, the result is either the original signal or a ring modulated signal -according to a threshold that is i/P.

-

The general process is drive by a factor fa between 0 and 1 and a modulation frequency f0. -If fa is greater than theshold (P-i-1)/P, the ith ring modulator is on with carrier frequency of f0*(i+1)/P. -On the contrary, it provides the original signal.

-

Therefore ring modulators are progressively revealed when fa increases.

-

Usage

-
_,_, ... : fxRingMod(N, f0, fa, tf) : _,_, ...
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • f0: the maximum delay applied (in samples)
  • -
  • fa: decorrelation factor (between 0 and 1)
  • -
  • tf: type of function of delay distribution (integer, between 0 and 21)
  • -
-
-

(ho.).synRingMod

-

Spatial ring modulation in syn mode.

-

synRingMod generates spatial components in ambisonics from one mono signal thanks to ring modulation. -The ring modulation is defined for each spatial component among P=2*n+1 at the ambisonic order N. -For each spatial component #i, the result is either the original signal or a ring modulated signal -according to a threshold that is i/P.

-

The general process is drive by a factor fa between 0 and 1 and a modulation frequency f0. -If fa is greater than theshold (P-i-1)/P, the ith ring modulator is on with carrier frequency of f0*(i+1)/P. -On the contrary, it provides the original signal.

-

Therefore ring modulators are progressively revealed when fa increases. -When the factor is between [0; 1/P], upper harmonics are progressively faded and the level of the H0 component is compensated -to avoid source localization and to produce a large mono.

-

Usage

-
_,_, ... : synRingMod(N, f0, fa, tf) : _,_, ...
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • f0: the maximum delay applied (in samples)
  • -
  • fa: decorrelation factor (between 0 and 1)
  • -
  • tf: type of function of delay distribution (integer, between 0 and 21)
  • -
-

3D Functions

-
-

(ho.)encoder3D

-

Ambisonic encoder. Encodes a signal in the circular harmonics domain -depending on an order of decomposition, an angle and an elevation.

-

Usage

-
encoder3D(N, x, a, e) : _
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • x: the signal
  • -
  • a: the angle
  • -
  • e: the elevation
  • -
-
-

(ho.)rEncoder3D

-

Ambisonic encoder in 3D including source rotation. A mono signal is encoded at at certain ambisonic order -with two possible modes: either rotation with 2 angular speeds (azimuth and elevation), or static with a fixed pair of angles.

-

rEncoder3D is a standard Faust function.

-

Usage

-
_ : rEncoder3D(N, azsp, elsp, az, el, it) : _,_, ...
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • azsp: the azimuth speed expressed as angular speed (2PI/sec), positive or negative
  • -
  • elsp: the elevation speed expressed as angular speed (2PI/sec), positive or negative
  • -
  • az: the fixed azimuth when the azimuth rotation stops (azsp = 0) in radians
  • -
  • el: the fixed elevation when the elevation rotation stops (elsp = 0) in radians
  • -
  • it : interpolation time (in milliseconds) between the rotation and the fixed modes
  • -
-
-

(ho.)optimBasic3D

-

The basic optimization has no effect and should be used for a perfect -sphere of loudspeakers with one listener at the perfect center loudspeakers -array.

-

Usage

-
_ : optimBasic3D(N) : _
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
-
-

(ho.)optimMaxRe3D

-

The maxRe optimization optimize energy vector. It should be used for an -auditory confined in the center of the loudspeakers array.

-

Usage

-
_ : optimMaxRe3D(N) : _
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
-
-

(ho.)optimInPhase3D

-

The inPhase Optimization optimizes energy vector and put all loudspeakers signals -in phase. It should be used for an auditory.

-

Usage

-
_ : optimInPhase3D(N) : _
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
-
-

(ho.)optim3D

-

Ambisonic optimizer including the three elementary optimizers: -(ho).optimBasic3D, (ho).optimMaxRe3D and (ho.)optimInPhase3D.

-

Usage

-
_,_, ... : optim3D(N, ot) : _,_, ...
-
-

Where:

-
    -
  • N: the ambisonic order (constant numerical expression)
  • -
  • ot : optimization type (0 for optimBasic, 1 for optimMaxRe, 2 for optimInPhase)
  • -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/hoa.lib/overview/index.html b/docs/contributors/faust/hoa.lib/overview/index.html deleted file mode 100644 index c9b0ac8..0000000 --- a/docs/contributors/faust/hoa.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - hoa.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

hoa.lib Documentation

-

Welcome to the documentation for hoa.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.4.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/instruments.lib/1.0.0/doc/index.html b/docs/contributors/faust/instruments.lib/1.0.0/doc/index.html deleted file mode 100644 index 554396d..0000000 --- a/docs/contributors/faust/instruments.lib/1.0.0/doc/index.html +++ /dev/null @@ -1,372 +0,0 @@ - - - - - - - - - - - Doc - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

ENVELOPE GENERATORS

-
-

VIBRATO ENVELOPE

-

4 phases envelope to control vibrato gain

-

USAGE: - _ : *(envVibrato(b,a,s,r,t)) : _ -where - b = beginning duration (silence) in seconds - a = attack duration in seconds - s = sustain as a percentage of the amplitude to be modified - r = release duration in seconds - t = trigger signal

-
-

ASYMPT60

-

Envelope generator which asymptotically approaches a target value.

-

USAGE: - asympT60(value,trgt,T60,trig) : _ -where - value = starting value - trgt = target value - T60 = ramping time - trig = trigger signal

-

TABLES

-
-

CLIPPING FUNCTION

-

Positive and negative clipping functions.

-

USAGE: - _ : saturationPos : _ - _ : saturationNeg : _ - _ : saturationPos : saturationNeg : _

-
-

BOW TABLE

-

Simple bow table.

-

USAGE: - index : bow(offset,slope) : _ -where - 0 <= index <= 1

-
-

REED TABLE

-

Simple reed table to be used with waveguide models of clarinet, saxophone, etc.

-

USAGE: - _ : reed(offset,slope) : _ -where - offset = offset between 0 and 1 - slope = slope between 0 and 1 -REFERENCE: -* https://ccrma.stanford.edu/~jos/pasp/View_Single_Reed_Oscillation.html

-

FILTERS

-
-

ONE POLE

-
-

ONE POLE SWEPT

-
-

POLE ZERO

-
-

ONE ZEROS

-

Simple One zero and One zero recursive filters

-

USAGE: - _ : oneZero0(b0,b1) : _ - _ : oneZero1(b0,b1) : _ -REFERENCE: -* https://ccrma.stanford.edu/~jos/fp2/One_Zero.html

-
-

BANDPASS FILTER WITH CONSTANT UNITY PEAK GAIN BASED ON A BIQUAD

-
-

BANDPASS FILTER BASED ON A BIQUAD

-

Band pass filter using a biquad (TF2 is declared in filter.lib)

-

USAGE: - _ : bandPassH(resonance,radius) : _ -where - resonance = center frequency - radius = radius

-
-

FLUE JET NONLINEAR FUNCTION

-

Jet Table: flue jet non-linear function, computed by a polynomial calculation

-
-

NON LINEAR MODULATOR

- -

USAGE: - _ : nonLinearModulator(nonlinearity,env,freq,typeMod,freqMod,order) : _ -where - nonlinearity = nonlinearity coefficient between 0 and 1 - env = input to connect any kind of envelope - freq = current tone frequency - typeMod = if 0: theta is modulated by the incoming signal; - freqMod = frequency of the sine wave modulation - order = order of the filter

-

TOOLS

-
-

STEREOIZER

-

This function takes a mono input signal and spacialize it in stereo -in function of the period duration of the tone being played.

-

USAGE: - _ : stereo(periodDuration) : , -where - periodDuration = period duration of the tone being played in number of samples -REFERENCE: -* https://ccrma.stanford.edu/realsimple/faust_strings/

-
-

INSTRREVERB

-

GUI for zita_rev1_stereo from reverbs.lib

-

USAGE: - , : instrRerveb

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/instruments.lib/overview/index.html b/docs/contributors/faust/instruments.lib/overview/index.html deleted file mode 100644 index 0b26cc3..0000000 --- a/docs/contributors/faust/instruments.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - instruments.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

instruments.lib Documentation

-

Welcome to the documentation for instruments.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.0.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/interpolators.lib/1.3.1/doc/index.html b/docs/contributors/faust/interpolators.lib/1.3.1/doc/index.html deleted file mode 100644 index d5fadbd..0000000 --- a/docs/contributors/faust/interpolators.lib/1.3.1/doc/index.html +++ /dev/null @@ -1,614 +0,0 @@ - - - - - - - - - - - interpolators.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
- -
- -

interpolators.lib

-

A library to handle interpolation. Its official prefix is it.

-

This library provides several basic interpolation functions, as well as interpolators -taking a gen circuit of N outputs producing values to be interpolated, triggered -by a idv read index signal. Two points and four points interpolations are implemented.

-

The idv parameter is to be used as a read index. In -single (= singleprecision) mode, -a technique based on 2 signals with the pure integer index and a fractional part in the [0,1] -range is used to avoid accumulating errors. In -double (= doubleprecision) or -quad (= quadprecision) modes, -a standard implementation with a single fractional index signal is used. Three functions int_part, frac_part and mak_idv are available to manipulate the read index signal.

-

Here is a use-case with waveform. Here the signal given to interpolator_XXX uses the idv model.

-
waveform_interpolator(wf, step, interp) = interp(gen, idv)
-with {
-   gen(idx) = wf, (idx:max(0):min(size-1)) : rdtable with { size = wf:(_,!); };   /* waveform size */
-   index = (+(step)~_)-step;  /* starting from 0 */
-   idv = it.make_idv(index);  /* build the signal for interpolation in a generic way */
-};
-
-waveform_linear(wf, step) = waveform_interpolator(wf, step, it.interpolator_linear);
-waveform_cosine(wf, step) = waveform_interpolator(wf, step, it.interpolator_cosine);
-waveform_cubic(wf, step) = waveform_interpolator(wf, step, it.interpolator_cubic);
-
-waveform_interp(wf, step, selector) = waveform_interpolator(wf, step, interp_select(selector))
-with {
-   /* adapts the argument order */
-   interp_select(sel, gen, idv) = it.interpolator_select(gen, idv, sel);
-};
-
-waveform and index 
-waveform_interpolator1(wf, idv, interp) = interp(gen, idv)
-with {
-   gen(idx) = wf, (idx:max(0):min(size-1)) : rdtable with { size = wf:(_,!); };   /* waveform size */
-};
-
-waveform_linear1(wf, idv) = waveform_interpolator1(wf, idv, it.interpolator_linear);
-waveform_cosine1(wf, idv) = waveform_interpolator1(wf, idv, it.interpolator_cosine);
-waveform_cubic1(wf, idv) = waveform_interpolator1(wf, idv, it.interpolator_cubic);
-
-waveform_interp1(wf, idv, selector) = waveform_interpolator1(wf, idv, interp_select(selector))
-with {
-   /* adapts the argument order */
-   interp_select(sel, gen, idv) = it.interpolator_select(gen, idv, sel);
-};
-
-

Some tests here:

-
wf = waveform {0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 50.0, 40.0, 30.0, 20.0, 10.0, 0.0};
-
-process = waveform_linear(wf, step), waveform_cosine(wf, step), waveform_cubic(wf, step) with { step = 0.25; };
-
-process = waveform_interp(wf, 0.25, nentry("algo", 0, 0, 3, 1));
-
-process = waveform_interp1(wf, idv, nentry("algo", 0, 0, 3, 1))
-with {
-   step = 0.1;
-   idv_aux = (+(step)~_)-step;  /* starting from 0 */
-   idv = it.make_idv(idv_aux);  /* build the signal for interpolation in a generic way */
-};
-
-/* Test linear interpolation between 2 samples with a `(idx,dv)` signal built using a waveform */
-linear_test = (idx,dv), it.interpolator_linear(gen, (idx,dv))
-with {
-   /* signal to interpolate (only 2 points here) */
-   gen(id) = waveform {3.0, -1.0}, (id:max(0)) : rdtable;
-   dv = waveform {0.0, 0.25, 0.50, 0.75, 1.0}, index : rdtable;
-   idx = 0; 
-   /* test index signal */
-   index = (+(1)~_)-1;   /* starting from 0 */
-};
-
-/* Test cosine interpolation between 2 samples with a `(idx,dv)` signal built using a waveform */
-cosine_test = (idx,dv), it.interpolator_cosine(gen, (idx,dv))
-with {
-   /* signal to interpolate (only 2 points here) */
-   gen(id) = waveform {3.0, -1.0}, (id:max(0)) : rdtable;
-   dv = waveform {0.0, 0.25, 0.50, 0.75, 1.0}, index : rdtable;
-   idx = 0;
-   /* test index signal */
-   index = (+(1)~_)-1;   /* starting from 0 */
-};
-
-/* Test cubic interpolation between 4 samples with a `(idx,dv)` signal built using a waveform */
-cubic_test = (idx,dv), it.interpolator_cubic(gen, (idx,dv))
-with {
-   /* signal to interpolate (only 4 points here) */
-   gen(id) = waveform {-1.0, 2.0, 1.0, 4.0}, (id:max(0)) : rdtable;
-   dv = waveform {0.0, 0.25, 0.50, 0.75, 1.0}, index : rdtable;
-   idx = 0;
-   /* test index signal */
-   index = (+(1)~_)-1;   /* starting from 0 */
-};
-
-

References

- -

Two points interpolation functions

-
-

(it.)interpolate_linear

-

Linear interpolation between 2 values.

-

Usage

-
interpolate_linear(dv,v0,v1) : _
-
-

Where:

-
    -
  • dv: in the fractional value in [0..1] range
  • -
  • v0: is the first value
  • -
  • v1: is the second value
  • -
-

Reference:

- -
-

(it.)interpolate_cosine

-

Cosine interpolation between 2 values.

-

Usage

-
interpolate_cosine(dv,v0,v1) : _
-
-

Where:

-
    -
  • dv: in the fractional value in [0..1] range
  • -
  • v0: is the first value
  • -
  • v1: is the second value
  • -
-

Reference:

- -

Four points interpolation functions

-
-

(it.)interpolate_cubic

-

Cubic interpolation between 4 values.

-

Usage

-
interpolate_cubic(dv,v0,v1,v2,v3) : _
-
-

Where:

-
    -
  • dv: in the fractional value in [0..1] range
  • -
  • v0: is the first value
  • -
  • v1: is the second value
  • -
  • v2: is the third value
  • -
  • v3: is the fourth value
  • -
-

Reference:

- -

Two points interpolators

-
-

(it.)interpolator_two_points

-

Generic interpolator on two points (current and next index), assuming an increasing index.

-

Usage

-
interpolator_two_points(gen, idv, interpolate_two_points) : si.bus(outputs(gen))
-
-

Where:

-
    -
  • gen: a circuit with an 'idv' reader input that produces N outputs
  • -
  • idv: a fractional read index expressed as a float value, or a (int,frac) pair
  • -
  • interpolate_two_points: a two points interpolation function
  • -
-
-

(it.)interpolator_linear

-

Linear interpolator for a 'gen' circuit triggered by an 'idv' input to generate values.

-

Usage

-
interpolator_linear(gen, idv) : si.bus(outputs(gen))
-
-

Where:

-
    -
  • gen: a circuit with an 'idv' reader input that produces N outputs
  • -
  • idv: a fractional read index expressed as a float value, or a (int,frac) pair
  • -
-
-

(it.)interpolator_cosine

-

Cosine interpolator for a 'gen' circuit triggered by an 'idv' input to generate values.

-

Usage

-
interpolator_cosine(gen, idv) : si.bus(outputs(gen))
-
-

Where:

-
    -
  • gen: a circuit with an 'idv' reader input that produces N outputs
  • -
  • idv: a fractional read index expressed as a float value, or a (int,frac) pair
  • -
-

Four points interpolators

-
-

(it.)interpolator_four_points

-

Generic interpolator on interpolator_four_points points (previous, current and two next indexes), assuming an increasing index.

-

Usage

-
interpolator_four_points(gen, idv, interpolate_four_points) : si.bus(outputs(gen))
-
-

Where:

-
    -
  • gen: a circuit with an 'idv' reader input that produces N outputs
  • -
  • idv: a fractional read index expressed as a float value, or a (int,frac) pair
  • -
  • interpolate_four_points: a four points interpolation function
  • -
-
-

(it.)interpolator_cubic

-

Cubic interpolator for a 'gen' circuit triggered by an 'idv' input to generate values

-

Usage

-
interpolator_cubic(gen, idv) : si.bus(outputs(gen))
-
-

Where:

-
    -
  • gen: a circuit with an 'idv' reader input that produces N outputs
  • -
  • idv: a fractional read index expressed as a float value, or a (int,frac) pair
  • -
-
-

(it.)interpolator_select

-

Generic configurable interpolator (with selector between in [0..3]). The value 3 is used for no interpolation.

-

Usage

-
interpolator_select(gen, idv, sel) : _,_... (equal to N = outputs(gen))
-
-

Where:

-
    -
  • gen: a circuit with an 'idv' reader input that produces N outputs
  • -
  • idv: a fractional read index expressed as a float value, or a (int,frac) pair
  • -
  • sel: an interpolation algorithm selector in [0..3] (0 = linear, 1 = cosine, 2 = cubic, 3 = nointerp)
  • -
-

Lagrange based interpolators

-
-

(it.)lagrangeCoeffs(N, xCoordsList)

-

This is a function to generate N + 1 coefficients for an Nth-order Lagrange -basis polynomial with arbitrary spacing of the points.

-

Usage

-
lagrangeCoeffs(N, xCoordsList, x) : si.bus(N + 1)
-
-

Where:

-
    -
  • N: order of the interpolation filter, known at compile-time
  • -
  • xCoordsList: a list of N + 1 elements determining the x-axis coordinates of N + 1 values, known at compile-time
  • -
  • x: a fractional position on the x-axis to obtain the interpolated y-value
  • -
-

Reference

- -
-

(it.)lagrangeInterpolation(N, xCoordsList)

-

Nth-order Lagrange interpolator to interpolate between a set of arbitrarily spaced N + 1 points.

-

Usage

-
x , yCoords : lagrangeInterpolation(N, xCoordsList) : _
-
-

Where:

-
    -
  • N: order of the interpolator, known at compile-time
  • -
  • xCoordsList: a list of N + 1 elements determining the x-axis spacing of the points, known at compile-time
  • -
  • x: an x-axis position to interpolate between the y-values
  • -
  • yCoords: N + 1 elements determining the values of the interpolation points
  • -
-

Example: find the centre position of a four-point set using an order-3 -Lagrange function fitting the equally-spaced points [2, 5, -1, 3]:

-
N = 3;
-xCoordsList = (0, 1, 2, 3);
-x = N / 2.0;
-yCoords = 2, 5, -1, 3;
-process = x, yCoords : lagrangeInterpolation(N, xCoordsList);
-
-

which outputs ~1.938.

-

Example: output the dashed curve showed on the Wikipedia page (top figure, https://en.wikipedia.org/wiki/Lagrange_polynomial):

-
N = 3;
-xCoordsList = (-9, -4, -1, 7);
-x = os.phasor(16, 1) - 9;
-yCoords = 5, 2, -2, 9;
-process = x, yCoords : lagrangeInterpolation(N, xCoordsList);
-
-

Reference

- -
-

(it.)frdtable(N, S)

-

Look-up circular table with Nth-order Lagrange interpolation for fractional -indexes. The index is wrapped-around and the table is cycles for an index -span of size S, which is the table size in samples.

-

Usage

-
frdtable(N, S, init, idx) : _
-
-

Where:

-
    -
  • N: Lagrange interpolation order, known at compile-time
  • -
  • S: table size in samples, known at compile-time
  • -
  • init: signal for table initialisation
  • -
  • idx: fractional index wrapped-around 0 and S
  • -
-

Example test program

-

Test the effectiveness of the 5th-order interpolation scheme by -creating a table look-up oscillator using only 16 points of a sinewave; -compare the result with a non-interpolated version:

-
N = 5;
-S = 16;
-index = os.phasor(S, 1000);
-process = rdtable(S, os.sinwaveform(S), int(index)) ,
-          it.frdtable(N, S, os.sinwaveform(S), index);
-
-
-

(it.)frwtable(N, S)

-

Look-up updatable circular table with Nth-order Lagrange interpolation for -fractional indexes. The index is wrapped-around and the table is circular -indexes ranging from 0 to S, which is the table size in samples.

-

Usage

-
frwtable(N, S, init, w_idx, x, r_idx) : _
-
-

Where:

-
    -
  • N: Lagrange interpolation order, known at compile-time
  • -
  • S: table size in samples, known at compile-time
  • -
  • init: constant for table initialisation, known at compile-time
  • -
  • w_idx: it should be an INT between 0 and S - 1
  • -
  • x: input signal written on the w_idx positions
  • -
  • r_idx: fractional index wrapped-around 0 and S
  • -
-

Example test program

-

Test the effectiveness of the 5th-order interpolation scheme by -creating a table look-up oscillator using only 16 points of a sinewave; -compare the result with a non-interpolated version:

-
N = 5;
-S = 16;
-rIdx = os.phasor(S, 300);
-wIdx = ba.period(S);
-process = rwtable(S, os.sinwaveform(S), wIdx, os.sinwaveform(S), int(rIdx)) ,
-          frwtable(N, S, os.sinwaveform(S), wIdx, os.sinwaveform(S), rIdx);
-
-

Misc functions

-
-

(it.)remap

-

Linearly map from an input domain to an output range.

-

Usage

-
_ : remap(from1, from2, to1, to2) : _
-
-

Where:

-
    -
  • from1: the domain's lower bound.
  • -
  • from2: the domain's upper bound.
  • -
  • to1: the range's lower bound.
  • -
  • to2: the range's upper bound.
  • -
-

Note that having from1 == from2 in the mapping will cause a division by zero that has to be taken in account.

-

Example: An oscillator remapped from [-1., 1.] to [100., 1000.]

-
os.osc(440) : it.remap(-1., 1., 100., 1000.)
-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/interpolators.lib/overview/index.html b/docs/contributors/faust/interpolators.lib/overview/index.html deleted file mode 100644 index 2091398..0000000 --- a/docs/contributors/faust/interpolators.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - interpolators.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

interpolators.lib Documentation

-

Welcome to the documentation for interpolators.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.3.1

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/maths.lib/2.8.0/doc/index.html b/docs/contributors/faust/maths.lib/2.8.0/doc/index.html deleted file mode 100644 index 131c6a3..0000000 --- a/docs/contributors/faust/maths.lib/2.8.0/doc/index.html +++ /dev/null @@ -1,816 +0,0 @@ - - - - - - - - - - - maths.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

maths.lib

-

Mathematic library for Faust. Its official prefix is ma.

-

References

- -

Functions Reference

-
-

(ma.)SR

-

Current sampling rate given at init time. Constant during program execution.

-

Usage

-
SR : _
-
-
-

(ma.)T

-

Current sample duration in seconds computed from the sampling rate given at init time. Constant during program execution.

-

Usage

-
T : _
-
-
-

(ma.)BS

-

Current block-size. Can change during the execution at each block.

-

Usage

-
BS : _
-
-
-

(ma.)PI

-

Constant PI in double precision.

-

Usage

-
PI : _
-
-
-

(ma.)deg2rad

-

Convert degrees to radians.

-

Usage

-
45. : deg2rad
-
-
-

(ma.)rad2deg

-

Convert radians to degrees.

-

Usage

-
ma.PI : rad2deg
-
-
-

(ma.)E

-

Constant e in double precision.

-

Usage

-
E : _
-
-
-

(ma.)EPSILON

-

Constant EPSILON available in simple/double/quad precision, -as defined in the floating-point standard -and machine epsilon, -that is smallest positive number such that 1.0 + EPSILON != 1.0.

-

Usage

-
EPSILON : _
-
-
-

(ma.)MIN

-

Constant MIN available in simple/double/quad precision (minimal positive value).

-

Usage

-
MIN : _
-
-
-

(ma.)MAX

-

Constant MAX available in simple/double/quad precision (maximal positive value).

-

Usage

-
MAX : _
-
-
-

(ma.)FTZ

-

Flush to zero: force samples under the "maximum subnormal number" -to be zero. Usually not needed in C++ because the architecture -file take care of this, but can be useful in JavaScript for instance.

-

Usage

-
_ : FTZ : _
-
-

Reference

- -
-

(ma.)copysign

-

Changes the sign of x (first input) to that of y (second input).

-

Usage

-
_,_ : copysign : _
-
-
-

(ma.)neg

-

Invert the sign (-x) of a signal.

-

Usage

-
_ : neg : _
-
-
-

(ma.)not

-

Bitwise not implemented with xor as not(x) = x xor -1;. -So working regardless of the size of the integer, assuming negative numbers in two's complement.

-

Usage

-
_ : not : _
-
-
-

(ma.)sub(x,y)

-

Subtract x and y.

-

Usage

-
_,_ : sub : _
-
-
-

(ma.)inv

-

Compute the inverse (1/x) of the input signal.

-

Usage

-
_ : inv : _
-
-
-

(ma.)cbrt

-

Computes the cube root of of the input signal.

-

Usage

-
_ : cbrt : _
-
-
-

(ma.)hypot

-

Computes the euclidian distance of the two input signals -sqrt(xx+yy) without undue overflow or underflow.

-

Usage

-
_,_ : hypot : _
-
-
-

(ma.)ldexp

-

Takes two input signals: x and n, and multiplies x by 2 to the power n.

-

Usage

-
_,_ : ldexp : _
-
-
-

(ma.)scalb

-

Takes two input signals: x and n, and multiplies x by 2 to the power n.

-

Usage

-
_,_ : scalb : _
-
-
-

(ma.)log1p

-

Computes log(1 + x) without undue loss of accuracy when x is nearly zero.

-

Usage

-
_ : log1p : _
-
-
-

(ma.)logb

-

Return exponent of the input signal as a floating-point number.

-

Usage

-
_ : logb : _
-
-
-

(ma.)ilogb

-

Return exponent of the input signal as an integer number.

-

Usage

-
_ : ilogb : _
-
-
-

(ma.)log2

-

Returns the base 2 logarithm of x.

-

Usage

-
_ : log2 : _
-
-
-

(ma.)expm1

-

Return exponent of the input signal minus 1 with better precision.

-

Usage

-
_ : expm1 : _
-
-
-

(ma.)acosh

-

Computes the principle value of the inverse hyperbolic cosine -of the input signal.

-

Usage

-
_ : acosh : _
-
-
-

(ma.)asinh

-

Computes the inverse hyperbolic sine of the input signal.

-

Usage

-
_ : asinh : _
-
-
-

(ma.)atanh

-

Computes the inverse hyperbolic tangent of the input signal.

-

Usage

-
_ : atanh : _
-
-
-

(ma.)sinh

-

Computes the hyperbolic sine of the input signal.

-

Usage

-
_ : sinh : _
-
-
-

(ma.)cosh

-

Computes the hyperbolic cosine of the input signal.

-

Usage

-
_ : cosh : _
-
-
-

(ma.)tanh

-

Computes the hyperbolic tangent of the input signal.

-

Usage

-
_ : tanh : _
-
-
-

(ma.)erf

-

Computes the error function of the input signal.

-

Usage

-
_ : erf : _
-
-
-

(ma.)erfc

-

Computes the complementary error function of the input signal.

-

Usage

-
_ : erfc : _
-
-
-

(ma.)gamma

-

Computes the gamma function of the input signal.

-

Usage

-
_ : gamma : _
-
-
-

(ma.)lgamma

-

Calculates the natural logorithm of the absolute value of -the gamma function of the input signal.

-

Usage

-
_ : lgamma : _
-
-
-

(ma.)J0

-

Computes the Bessel function of the first kind of order 0 -of the input signal.

-

Usage

-
_ : J0 : _
-
-
-

(ma.)J1

-

Computes the Bessel function of the first kind of order 1 -of the input signal.

-

Usage

-
_ : J1 : _
-
-
-

(ma.)Jn

-

Computes the Bessel function of the first kind of order n -(first input signal) of the second input signal.

-

Usage

-
_,_ : Jn : _
-
-
-

(ma.)Y0

-

Computes the linearly independent Bessel function of the second kind -of order 0 of the input signal.

-

Usage

-
_ : Y0 : _
-
-
-

(ma.)Y1

-

Computes the linearly independent Bessel function of the second kind -of order 1 of the input signal.

-

Usage

-
_ : Y0 : _
-
-
-

(ma.)Yn

-

Computes the linearly independent Bessel function of the second kind -of order n (first input signal) of the second input signal.

-

Usage

-
_,_ : Yn : _
-
-
-

(ma.)fabs, (ma.)fmax, (ma.)fmin

-

Just for compatibility...

-
fabs = abs
-fmax = max
-fmin = min
-
-
-

(ma.)np2

-

Gives the next power of 2 of x.

-

Usage

-
np2(n) : _
-
-

Where:

-
    -
  • n: an integer
  • -
-
-

(ma.)frac

-

Gives the fractional part of n.

-

Usage

-
frac(n) : _
-
-

Where:

-
    -
  • n: a decimal number
  • -
-
-

(ma.)modulo

-

Modulus operation.

-

Usage

-
modulo(x,y) : _
-
-

Where:

-
    -
  • x: the numerator
  • -
  • y: the denominator
  • -
-
-

(ma.)isnan

-

Return non-zero if x is a NaN.

-

Usage

-
isnan(x)
-_ : isnan : _
-
-

Where:

-
    -
  • x: signal to analyse
  • -
-
-

(ma.)isinf

-

Return non-zero if x is a positive or negative infinity.

-

Usage

-
isinf(x)
-_ : isinf : _
-
-

Where:

-
    -
  • x: signal to analyse
  • -
-
-

(ma.)chebychev

-

Chebychev transformation of order N.

-

Usage

-
_ : chebychev(N) : _
-
-

Where:

-
    -
  • N: the order of the polynomial, a constant numerical expression
  • -
-

Semantics

-
T[0](x) = 1,
-T[1](x) = x,
-T[n](x) = 2x*T[n-1](x) - T[n-2](x)
-
-

Reference

- -
-

(ma.)chebychevpoly

-

Linear combination of the first Chebyshev polynomials.

-

Usage

-
_ : chebychevpoly((c0,c1,...,cn)) : _
-
-

Where:

-
    -
  • cn: the different Chebychevs polynomials such that: - chebychevpoly((c0,c1,...,cn)) = Sum of chebychev(i)*ci
  • -
-

Reference

- -
-

(ma.)diffn

-

Negated first-order difference.

-

Usage

-
_ : diffn : _
-
-
-

(ma.)signum

-

The signum function signum(x) is defined as --1 for x<0, 0 for x==0, and 1 for x>0.

-

Usage

-
_ : signum : _
-
-
-

(ma.)nextpow2

-

The nextpow2(x) returns the lowest integer m such that -2^m >= x.

-

Usage

-
2^nextpow2(n) : _
-
-

Useful for allocating delay lines, e.g.,

-
delay(2^nextpow2(maxDelayNeeded), currentDelay);
-
-
-

(ma.)zc

-

Indicator function for zero-crossing: it returns 1 if a zero-crossing -occurs, 0 otherwise.

-

Usage

-
_ : zc : _
-
-
-

(ma.)primes

-

Return the n-th prime using a waveform primitive. Note that primes(0) is 2, -primes(1) is 3, and so on. The waveform is length 2048, so the largest -precomputed prime is primes(2047) which is 17863.

-

Usage

-
_ : primes : _
-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/maths.lib/overview/index.html b/docs/contributors/faust/maths.lib/overview/index.html deleted file mode 100644 index 590b0d8..0000000 --- a/docs/contributors/faust/maths.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - maths.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

maths.lib Documentation

-

Welcome to the documentation for maths.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

2.8.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/maxmsp.lib/1.1.0/doc/index.html b/docs/contributors/faust/maxmsp.lib/1.1.0/doc/index.html deleted file mode 100644 index e85c6d1..0000000 --- a/docs/contributors/faust/maxmsp.lib/1.1.0/doc/index.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - - - - - maxmsp.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

maxmsp.lib

-

MaxMSP compatibility Library.

-

References

-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/maxmsp.lib/overview/index.html b/docs/contributors/faust/maxmsp.lib/overview/index.html deleted file mode 100644 index a443d09..0000000 --- a/docs/contributors/faust/maxmsp.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - maxmsp.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

maxmsp.lib Documentation

-

Welcome to the documentation for maxmsp.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.1.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/mi.lib/1.1.0/doc/index.html b/docs/contributors/faust/mi.lib/1.1.0/doc/index.html deleted file mode 100644 index 039f01f..0000000 --- a/docs/contributors/faust/mi.lib/1.1.0/doc/index.html +++ /dev/null @@ -1,564 +0,0 @@ - - - - - - - - - - - mi.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

mi.lib

-

This ongoing work is the fruit of a collaboration between GRAME-CNCM and -the ANIS (Arts Numériques et Immersions Sensorielles) research group from -GIPSA-Lab (Université Grenoble Alpes).

-

This library implements basic 1-DoF mass-interaction physics algorithms, -allowing to declare and connect physical elements (masses, springs, non -linear interactions, etc.) together to form topological networks. -Models can be assembled by hand, however in more complex scenarios it is -recommended to use a scripting tool (such as MIMS) to generate the FAUST -signal routing for a given physical network. Its official prefix is mi.

- -

Sources

-

The core mass-interaction algorithms implemented in this library are in the public -domain and are disclosed in the following scientific publications:

-
    -
  • Claude Cadoz, Annie Luciani, Jean-Loup Florens, Curtis Roads and Françoise -Chabade. Responsive Input Devices and Sound Synthesis by Stimulation of -Instrumental Mechanisms: The Cordis System. Computer Music Journal, Vol 8. -No. 3, 1984.
  • -
  • Claude Cadoz, Annie Luciani and Jean Loup Florens. CORDIS-ANIMA: A Modeling -and Simulation System for Sound and Image Synthesis: The General Formalism. -Computer Music Journal. Vol. 17, No. 1, 1993.
  • -
  • Alexandros Kontogeorgakopoulos and Claude Cadoz. Cordis Anima Physical -Modeling and Simulation System Analysis. In Proceedings of the Sound and Music -Computing Conference (SMC-07), Lefkada, Greece, 2007.
  • -
  • Nicolas Castagne, Claude Cadoz, Ali Allaoui and Olivier Tache. G3: Genesis -Software Environment Update. In Proceedings of the International Computer -Music Conference (ICMC-09), Montreal, Canada, 2009.
  • -
  • Nicolas Castagné and Claude Cadoz. Genesis 3: Plate-forme pour la création -musicale à l'aide des modèles physiques Cordis-Anima. In Proceedings of the -Journée de l'Informatique Musicale, Grenoble, France, 2009.
  • -
  • Edgar Berdahl and Julius O. Smith. An Introduction to the Synth-A-Modeler -Compiler: Modular and Open-Source Sound Synthesis using Physical Models. In -Proceedings of the Linux Audio Conference (LAC-12), Stanford, USA, 2012.
  • -
  • James Leonard and Claude Cadoz. Physical Modelling Concepts for a Collection -of Multisensory Virtual Musical Instruments. In Proceedings of the New -Interfaces for Musical Expression (NIME-15) Conference, Baton Rouge, USA, 2015.
  • -
-

References

- -

Utility Functions

-

These utility functions are used to help certain operations (e.g. define initial -positions and velocities for physical elements).

-
-

(mi.)initState

-

Used to set initial delayed position values that must be initialised -at step 0 of the physics simulation.

-

If you develop any of your own modules, you will need to use this (see -mass and springDamper algorithm codes for examples).

-

Usage

-
x : initState(x0) : _
-
-

Where:

-
    -
  • x: position value signal
  • -
  • x0: initial value for position
  • -
-

Mass Algorithms

-

All mass-type physical element functions are declared here. They all expect to receive -a force input signal and produce a position signal. -All physical parameters are expressed in sample-rate dependant values.

-
-

(mi.)mass

-

Implementation of a punctual mass element. -Takes an input force and produces output position.

-

Usage

-
mass(m, grav, x0, xr0),_ : _
-
-

Where:

-
    -
  • m: mass value
  • -
  • grav: gravity force value
  • -
  • x0: initial position
  • -
  • xr0: initial delayed position (inferred from initial velocity)
  • -
-
-

(mi.)oscil

-

Implementation of a simple linear harmonic oscillator. -Takes an input force and produces output position.

-

Usage

-
oscil(m, k, z, grav, x0, xr0),_ : _
-
-

Where:

-
    -
  • m: mass value
  • -
  • k: stiffness value
  • -
  • z: damping value
  • -
  • grav: gravity force value
  • -
  • x0: initial position
  • -
  • xr0: initial delayed position (inferred from initial velocity)
  • -
-
-

(mi.)ground

-

Implementation of a fixed point element. -The position output produced by this module never changes, however -it still expects a force input signal (for compliance with connection -rules).

-

Usage

-
ground(x0),_ : _
-
-

Where:

-
    -
  • x0: initial position
  • -
-
-

(mi.)posInput

-

Implementation of a position input module (driven by an outside -signal). Takes two signal inputs: incoming force (which doesn't -affect position) and the driving position signal.

-

Usage

-
posInput(x0),_,_ : _
-
-

Where:

-
    -
  • x0: initial position
  • -
-

Interaction Algorithms

-

All interaction-type physical element functions are declared here. They each expect to -receive two position signals (coming from the two mass-elements that they connect) and -produce two equal and opposite force signals that must be routed back to the mass -elements' inputs. -All physical parameters are expressed in sample-rate dependant values.

-
-

(mi.)spring

-

Implementation of a linear elastic spring interaction.

-

Usage

-
spring(k, x1r, x2r),_,_ : _,_
-
-

Where:

-
    -
  • k: stiffness value
  • -
  • x1r: initial delayed position of mass 1 (unused here)
  • -
  • x2r: initial delayed position of mass 2 (unused here)
  • -
-
-

(mi.)damper

-

Implementation of a linear damper interaction. -Beware: in 32bit precision mode, damping forces can become -truncated if position values are not centered around zero!

-

Usage

-
damper(z, x1r, x2r),_,_ : _,_
-
-

Where:

-
    -
  • z: damping value
  • -
  • x1r: initial delayed position of mass 1
  • -
  • x2r: initial delayed position of mass 2
  • -
-
-

(mi.)springDamper

-

Implementation of a linear viscoelastic spring-damper interaction -(a combination of the spring and damper modules).

-

Usage

-
springDamper(k, z, x1r, x2r),_,_ : _,_
-
-

Where:

-
    -
  • k: stiffness value
  • -
  • z: damping value
  • -
  • x1r: initial delayed position of mass 1
  • -
  • x2r: initial delayed position of mass 2
  • -
-
-

(mi.)nlSpringDamper2

-

Implementation of a non-linear viscoelastic spring-damper interaction -containing a quadratic term (function of squared distance). -Beware: at high displacements, this interaction will break numerical -stability conditions ! The nlSpringDamperClipped is a safer option.

-

Usage

-
nlSpringDamper2(k, q, z, x1r, x2r),_,_ : _,_
-
-

Where:

-
    -
  • k: linear stiffness value
  • -
  • q: quadratic stiffness value
  • -
  • z: damping value
  • -
  • x1r: initial delayed position of mass 1
  • -
  • x2r: initial delayed position of mass 2
  • -
-
-

(mi.)nlSpringDamper3

-

Implementation of a non-linear viscoelastic spring-damper interaction -containing a cubic term (function of distance^3). -Beware: at high displacements, this interaction will break numerical -stability conditions ! The nlSpringDamperClipped is a safer option.

-

Usage

-
nlSpringDamper3(k, q, z, x1r, x2r),_,_ : _,_
-
-

Where:

-
    -
  • k: linear stiffness value
  • -
  • q: cubic stiffness value
  • -
  • z: damping value
  • -
  • x1r: initial delayed position of mass 1
  • -
  • x2r: initial delayed position of mass 2
  • -
-
-

(mi.)nlSpringDamperClipped

-

Implementation of a non-linear viscoelastic spring-damper interaction -containing a cubic term (function of distance^3), bound by an -upper linear stiffness (hard-clipping).

-

This bounding means that when faced with strong displacements, the -interaction profile will "clip" at a given point and never produce -forces higher than the bounding equivalent linear spring, stopping models -from becoming unstable.

-

So far the interaction clips "hard" (with no soft-knee spline -interpolation, etc.)

-

Usage

-
nlSpringDamperClipped(s, c, k, z, x1r, x2r),_,_ : _,_
-
-

Where:

-
    -
  • s: linear stiffness value
  • -
  • c: cubic stiffness value
  • -
  • k: upper-bound linear stiffness value
  • -
  • z: (linear) damping value
  • -
  • x1r: initial delayed position of mass 1
  • -
  • x2r: initial delayed position of mass 2
  • -
-
-

(mi.)nlPluck

-

Implementation of a piecewise linear plucking interaction. -The symmetric function provides a repulsive viscoelastic interaction -upon contact, until a tipping point is reached (when the plucking occurs). -The tipping point depends both on the stiffness and the distance scaling -of the interaction.

-

Usage

-
nlPluck(knl, scale, z, x1r, x2r),_,_ : _,_
-
-

Where:

-
    -
  • knl: stiffness scaling parameter (vertical stretch of the NL function)
  • -
  • scale: distance scaling parameter (horizontal stretch of the NL function)
  • -
  • z: (linear) damping value
  • -
  • x1r: initial delayed position of mass 1
  • -
  • x2r: initial delayed position of mass 2
  • -
-
-

(mi.)nlBow

-

Implementation of a non-linear friction based interaction -that allows for stick-slip bowing behaviour. -Two versions are proposed : a piecewise linear function (very -similar to the nlPluck) or a mathematical approximation (see -Stefan Bilbao's book, Numerical Sound Synthesis).

-

Usage

-
nlBow(znl, scale, type, x1r, x2r),_,_ : _,_
-
-

Where:

-
    -
  • znl: friction scaling parameter (vertical stretch of the NL function)
  • -
  • scale: velocity scaling parameter (horizontal stretch of the NL function)
  • -
  • type: interaction profile (0 = piecewise linear, 1 = smooth function)
  • -
  • x1r: initial delayed position of mass 1
  • -
  • x2r: initial delayed position of mass 2
  • -
-
-

(mi.)collision

-

Implementation of a collision interaction, producing linear visco-elastic -repulsion forces when two mass elements are interpenetrating.

-

Usage

-
collision(k, z, thres, x1r, x2r),_,_ : _,_
-
-

Where:

-
    -
  • k: collision stiffness parameter
  • -
  • z: collision damping parameter
  • -
  • thres: threshold distance for the contact between elements
  • -
  • x1r: initial delayed position of mass 1
  • -
  • x2r: initial delayed position of mass 2
  • -
-
-

(mi.)nlCollisionClipped

-

Implementation of a collision interaction, producing non-linear -visco-elastic repulsion forces when two mass elements are interpenetrating. -Bound by an upper stiffness value to maintain stability. -This interaction is particularly useful for more realistic contact dynamics -(greater difference in velocity provides sharper contacts, and reciprocally).

-

Usage

-
nlCollisionClipped(s, c, k, z, thres, x1r, x2r),_,_ : _,_
-
-

Where:

-
    -
  • s: collision linear stiffness parameter
  • -
  • c: collision cubic stiffness parameter
  • -
  • k: collision upper-bounding stiffness parameter
  • -
  • z: collision damping parameter
  • -
  • thres: threshold distance for the contact between elements
  • -
  • x1r: initial delayed position of mass 1
  • -
  • x2r: initial delayed position of mass 2
  • -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/mi.lib/overview/index.html b/docs/contributors/faust/mi.lib/overview/index.html deleted file mode 100644 index 1b0baf4..0000000 --- a/docs/contributors/faust/mi.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - mi.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

mi.lib Documentation

-

Welcome to the documentation for mi.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.1.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/misceffects.lib/2.5.0/doc/index.html b/docs/contributors/faust/misceffects.lib/2.5.0/doc/index.html deleted file mode 100644 index f52e9b4..0000000 --- a/docs/contributors/faust/misceffects.lib/2.5.0/doc/index.html +++ /dev/null @@ -1,755 +0,0 @@ - - - - - - - - - - - misceffects.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
- -
- -

misceffects.lib

-

Collection of audio effects library. Its official prefix is ef.

-

The library is organized into 7 sections:

- -

References

- -

Dynamic

-
-

(ef.)cubicnl

-

Cubic nonlinearity distortion. -cubicnl is a standard Faust function.

-

Usage:

-
_ : cubicnl(drive,offset) : _
-_ : cubicnl_nodc(drive,offset) : _
-
-

Where:

-
    -
  • drive: distortion amount, between 0 and 1
  • -
  • offset: constant added before nonlinearity to give even harmonics. Note: offset - can introduce a nonzero mean - feed cubicnl output to dcblocker to remove this.
  • -
-

References:

- -
-

(ef.)gate_mono

-

Mono signal gate. -gate_mono is a standard Faust function.

-

Usage

-
_ : gate_mono(thresh,att,hold,rel) : _
-
-

Where:

-
    -
  • thresh: dB level threshold above which gate opens (e.g., -60 dB)
  • -
  • att: attack time = time constant (sec) for gate to open (e.g., 0.0001 s = 0.1 ms)
  • -
  • hold: hold time = time (sec) gate stays open after signal level < thresh (e.g., 0.1 s)
  • -
  • rel: release time = time constant (sec) for gate to close (e.g., 0.020 s = 20 ms)
  • -
-

References

- -
-

(ef.)gate_stereo

-

Stereo signal gates. -gate_stereo is a standard Faust function.

-

Usage

-
 _,_ : gate_stereo(thresh,att,hold,rel) : _,_
-
-

Where:

-
    -
  • thresh: dB level threshold above which gate opens (e.g., -60 dB)
  • -
  • att: attack time = time constant (sec) for gate to open (e.g., 0.0001 s = 0.1 ms)
  • -
  • hold: hold time = time (sec) gate stays open after signal level < thresh (e.g., 0.1 s)
  • -
  • rel: release time = time constant (sec) for gate to close (e.g., 0.020 s = 20 ms)
  • -
-

References

- -

Fibonacci

-
-

(ef.)fibonacci

-

Fibonacci system where the current output is the current -input plus the sum of the previous N outputs.

-

Usage

-
_ : fibonacci(N) : _
-
-

Where:

-
    -
  • N: the Fibonacci system's order, where 2 is standard
  • -
-

Example

-

Generate the famous series: [1, 1, 2, 3, 5, 8, 13, ...]

-
1. : ba.impulsify : fibonacci(2)
-
-
-

(ef.)fibonacciGeneral

-

Fibonacci system with customizable coefficients. -The order of the system is inferred from the number of coefficients.

-

Usage

-
_ : fibonacciGeneral(wave) : _
-
-

Where:

-
    -
  • wave: a waveform such as waveform{1, 1}
  • -
-

Example:

-

Use the update equation y = 2*y' + 3*y'' + 4*y'''

-
1. : ba.impulsify : fibonacciGeneral(waveform{2, 3, 4})
-
-
-

(ef.)fibonacciSeq

-

First N numbers of the Fibonacci sequence [1, 1, 2, 3, 5, 8, ...] -as parallel channels.

-

Usage

-
fibonacciSeq(N) : si.bus(N)
-
-

Where:

-
    -
  • N: The number of Fibonacci numbers to generate as channels.
  • -
-

Filtering

-
-

(ef.)speakerbp

-

Dirt-simple speaker simulator (overall bandpass eq with observed -roll-offs above and below the passband). speakerbp is a standard Faust function.

-

Low-frequency speaker model = +12 dB/octave slope breaking to -flat near f1. Implemented using two dc blockers in series.

-

High-frequency model = -24 dB/octave slope implemented using a -fourth-order Butterworth lowpass.

-

Usage

-
_ : speakerbp(f1,f2) : _
-
-

Example

-

Based on measured Celestion G12 (12" speaker):

-
speakerbp(130,5000)
-
-
-

(ef.)piano_dispersion_filter

-

Piano dispersion allpass filter in closed form.

-

Usage

-
piano_dispersion_filter(M,B,f0)
-_ : piano_dispersion_filter(1,B,f0) : +(totalDelay),_ : fdelay(maxDelay) : _
-
-

Where:

-
    -
  • M: number of first-order allpass sections (compile-time only) - Keep below 20. 8 is typical for medium-sized piano strings.
  • -
  • B: string inharmonicity coefficient (0.0001 is typical)
  • -
  • f0: fundamental frequency in Hz
  • -
-

Outputs

-
    -
  • MINUS the estimated delay at f0 of allpass chain in samples, - provided in negative form to facilitate subtraction - from delay-line length.
  • -
  • Output signal from allpass chain
  • -
-

Reference

- -
-

(ef.)stereo_width

-

Stereo Width effect using the Blumlein Shuffler technique. -stereo_width is a standard Faust function.

-

Usage

-
_,_ : stereo_width(w) : _,_
-
-

Where:

-
    -
  • w: stereo width between 0 and 1
  • -
-

At w=0, the output signal is mono ((left+right)/2 in both channels). -At w=1, there is no effect (original stereo image). -Thus, w between 0 and 1 varies stereo width from 0 to "original".

-

Reference

-
    -
  • "Applications of Blumlein Shuffling to Stereo Microphone Techniques" -Michael A. Gerzon, JAES vol. 42, no. 6, June 1994
  • -
-

Meshes

-
-

(ef.)mesh_square

-

Square Rectangular Digital Waveguide Mesh.

-

Usage

-
bus(4*N) : mesh_square(N) : bus(4*N)
-
-

Where:

-
    -
  • N: number of nodes along each edge - a power of two (1,2,4,8,...)
  • -
-

Reference

- -

Signal Order In and Out

-

The mesh is constructed recursively using 2x2 embeddings. Thus, -the top level of mesh_square(M) is a block 2x2 mesh, where each -block is a mesh(M/2). Let these blocks be numbered 1,2,3,4 in the -geometry NW,NE,SW,SE, i.e., as:

-
    1 2
-    3 4
-
-

Each block has four vector inputs and four vector outputs, where the -length of each vector is M/2. Label the input vectors as Ni,Ei,Wi,Si, -i.e., as the inputs from the North, East South, and West, -and similarly for the outputs. Then, for example, the upper -left input block of M/2 signals is labeled 1Ni. Most of the -connections are internal, such as 1Eo -> 2Wi. The 8*(M/2) input -signals are grouped in the order:

-
   1Ni 2Ni
-   3Si 4Si
-   1Wi 3Wi
-   2Ei 4Ei
-
-

and the output signals are:

-
   1No 1Wo
-   2No 2Eo
-   3So 3Wo
-   4So 4Eo
-
-

or:

-
   In: 1No 1Wo 2No 2Eo 3So 3Wo 4So 4Eo
-   Out: 1Ni 2Ni 3Si 4Si 1Wi 3Wi 2Ei 4Ei
-
-

Thus, the inputs are grouped by direction N,S,W,E, while the -outputs are grouped by block number 1,2,3,4, which can also be -interpreted as directions NW, NE, SW, SE. A simple program -illustrating these orderings is process = mesh_square(2);.

-

Example

-

Reflectively terminated mesh impulsed at one corner:

-
mesh_square_test(N,x) = mesh_square(N)~(busi(4*N,x)) // input to corner
-with { 
-    busi(N,x) = bus(N) : par(i,N,*(-1)) : par(i,N-1,_), +(x); 
-};
-process = 1-1' : mesh_square_test(4); // all modes excited forever
-
-

In this simple example, the mesh edges are connected as follows:

-
   1No -> 1Ni, 1Wo -> 2Ni, 2No -> 3Si, 2Eo -> 4Si,
-   3So -> 1Wi, 3Wo -> 3Wi, 4So -> 2Ei, 4Eo -> 4Ei
-
-

A routing matrix can be used to obtain other connection geometries.

-

Mixing

-
-

(ef.)dryWetMixer

-

Linear dry-wet mixer for a N inputs and N outputs effect.

-

Usage

-
si.bus(inputs(FX)) : dryWetMixer(wetAmount, FX) : si.bus(inputs(FX))
-
-

Where:

-
    -
  • wetAmount: the wet amount (0-1). 0 produces only the dry signal and 1 produces only the wet signal
  • -
  • FX: an arbitrary effect (N inputs and N outputs) to apply to the input bus
  • -
-
-

(ef.)dryWetMixerConstantPower

-

Constant-power dry-wet mixer for a N inputs and N outputs effect.

-

Usage

-
si.bus(inputs(FX)) : dryWetMixerConstantPower(wetAmount, FX) :si.bus(inputs(FX))
-
-

Where:

-
    -
  • wetAmount: the wet amount (0-1). 0 produces only the dry signal and 1 produces only the wet signal
  • -
  • FX: an arbitrary effect (N inputs and N outputs) to apply to the input bus
  • -
-
-

(ef.)mixLinearClamp

-

Linear mixer for N buses, each with C channels. The output will be a sum of 2 buses -determined by the mixing index mix. 0 produces the first bus, 1 produces the -second, and so on. mix is clamped automatically. For example, mixLinearClamp(4, 1, 1) -will weight its 4 inputs by (0, 1, 0, 0). Similarly, mixLinearClamp(4, 1, 1.1) -will weight its 4 inputs by (0,.9,.1,0).

-

Usage

-
si.bus(N*C) : mixLinearClamp(N, C, mix) : si.bus(C)
-
-

Where:

-
    -
  • N: the number of input buses
  • -
  • C: the number of channels in each bus
  • -
  • mix: the mixing index, continuous in [0;N-1].
  • -
-
-

(ef.)mixLinearLoop

-

Linear mixer for N buses, each with C channels. Refer to mixLinearClamp. mix -will loop for multiples of N. For example, mixLinearLoop(4, 1, 0) has the same -effect as mixLinearLoop(4, 1, -4) and mixLinearLoop(4, 1, 4).

-

Usage

-
si.bus(N*C) : mixLinearLoop(N, C, mix) : si.bus(C)
-
-

Where:

-
    -
  • N: the number of input buses
  • -
  • C: the number of channels in each bus
  • -
  • mix: the mixing index (N-1) selects the last bus, and 0 or N selects the 0th bus.
  • -
-
-

(ef.)mixPowerClamp

-

Constant-power mixer for N buses, each with C channels. The output will be a sum of 2 buses -determined by the mixing index mix. 0 produces the first bus, 1 produces the -second, and so on. mix is clamped automatically. mixPowerClamp(4, 1, 1) -will weight its 4 inputs by (0, 1./sqrt(2), 0, 0). Similarly, mixPowerClamp(4, 1, 1.5) -will weight its 4 inputs by (0,.5,.5,0).

-

Usage

-
si.bus(N*C) : mixPowerClamp(N, C, mix) : si.bus(C)
-
-

Where:

-
    -
  • N: the number of input buses
  • -
  • C: the number of channels in each bus
  • -
  • mix: the mixing index, continuous in [0;N-1].
  • -
-
-

(ef.)mixPowerLoop

-

Constant-power mixer for N buses, each with C channels. Refer to mixPowerClamp. mix -will loop for multiples of N. For example, mixPowerLoop(4, 1, 0) has the same effect -as mixPowerLoop(4, 1, -4) and mixPowerLoop(4, 1, 4).

-

Usage

-
si.bus(N*C) : mixPowerLoop(N, C, mix) : si.bus(C)
-
-

Where:

-
    -
  • N: the number of input buses
  • -
  • C: the number of channels in each bus
  • -
  • mix: the mixing index (N-1) selects the last bus, and 0 or N selects the 0th bus.
  • -
-

Time Based

-
-

(ef.)echo

-

A simple echo effect. -echo is a standard Faust function.

-

Usage

-
_ : echo(maxDuration,duration,feedback) : _
-
-

Where:

-
    -
  • maxDuration: the max echo duration in seconds
  • -
  • duration: the echo duration in seconds
  • -
  • feedback: the feedback coefficient
  • -
-
-

(ef.)reverseEchoN(nChans,delay)

-

Reverse echo effect.

-

Usage

-
_ : ef.reverseEchoN(N,delay) : si.bus(N)
-
-

Where:

-
    -
  • N: Number of output channels desired (1 or more), a constant numerical expression
  • -
  • delay: echo delay (integer power of 2)
  • -
-

Demo

-
_ : dm.reverseEchoN(N) : _,_
-
-

Description

-

The effect uses N instances of reverseDelayRamped at different phases.

-
-

(ef.)reverseDelayRamped(delay,phase)

-

Reverse delay with amplitude ramp.

-

Usage

-
_ : ef.reverseDelayRamped(delay,phase) : _
-
-

Where:

-
    -
  • delay: echo delay (integer power of 2)
  • -
  • phase: float between 0 and 1 giving ramp delay phase*delay
  • -
-

Demo

-
_ : ef.reverseDelayRamped(32,0.6) : _,_
-
-
-

(ef.)uniformPanToStereo(nChans)

-

Pan nChans channels to the stereo field, spread uniformly left to right.

-

Usage

-
si.bus(N) : ef.uniformPanToStereo(N) : _,_
-
-

Where:

-
    -
  • N: Number of input channels to pan down to stereo, a constant numerical expression
  • -
-

Demo

-
_,_,_ : ef.uniformPanToStereo(3) : _,_
-
-
-

(ef.)tapeStop

-

A tape-stop effect, like putting a finger on a vinyl record player.

-

Usage:

-
_,_ : tapeStop(2, LAGRANGE_ORDER, MAX_TIME_SAMP, crossfade, gainAlpha, stopAlpha, stopTime, stop) : _,_
-_ : tapeStop(1, LAGRANGE_ORDER, MAX_TIME_SAMP, crossfade, gainAlpha, stopAlpha, stopTime, stop) : _
-
-

Where:

-
    -
  • C: The number of input and output channels.
  • -
  • LAGRANGE_ORDER: The order of the Lagrange interpolation on the delay line. [2-3] recommended.
  • -
  • MAX_TIME_SAMP: Maximum stop time in samples
  • -
  • crossfade: A crossfade in samples to apply when resuming normal playback. Crossfade is not applied during the enabling of the tape-stop.
  • -
  • gainAlpha: During the tape-stop, lower alpha stays louder longer. Safe values are in the range [.01,2].
  • -
  • stopAlpha: stopAlpha==1 represents a linear deceleration (constant force). stopAlpha<1 represents an initially weaker, then stronger force. stopAlpha>1 represents an initially stronger, then weaker force. Safe values are in the range [.01,2].
  • -
  • stopTime: Desired duration of the stop time, in samples.
  • -
  • stop: When stop becomes positive, the tape-stop effect will start. When stop becomes zero, normal audio will resume via crossfade.
  • -
-

Pitch Shifting

-
-

(ef.)transpose

-

A simple pitch shifter based on 2 delay lines. -transpose is a standard Faust function.

-

Usage

-
_ : transpose(w, x, s) : _
-
-

Where:

-
    -
  • w: the window length (samples)
  • -
  • x: crossfade duration duration (samples)
  • -
  • s: shift (semitones)
  • -
-

Saturators

-
-

(ef.)softclipQuadratic

-

Quadratic softclip nonlinearity.

-

Usage

-
_ : softclipQuadratic : _;
-
-
-

(ef.)wavefold

-

Wavefolding nonlinearity.

-

Usage

-
_ : wavefold(width) : _;
-
-

Where:

-
    -
  • width: The width of the folded section [0..1] (float).
  • -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/misceffects.lib/overview/index.html b/docs/contributors/faust/misceffects.lib/overview/index.html deleted file mode 100644 index bfd235a..0000000 --- a/docs/contributors/faust/misceffects.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - misceffects.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

misceffects.lib Documentation

-

Welcome to the documentation for misceffects.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

2.5.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/noises.lib/1.4.1/doc/index.html b/docs/contributors/faust/noises.lib/1.4.1/doc/index.html deleted file mode 100644 index 9d743a4..0000000 --- a/docs/contributors/faust/noises.lib/1.4.1/doc/index.html +++ /dev/null @@ -1,489 +0,0 @@ - - - - - - - - - - - noises.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
- -
- -

noises.lib

-

Faust Noise Generator Library. Its official prefix is no.

-

References

- -

Functions Reference

-
-

(no.)noise

-

White noise generator (outputs random number between -1 and 1). -noise is a standard Faust function.

-

Usage

-
noise : _
-
-
-

(no.)multirandom

-

Generates multiple decorrelated random numbers in parallel.

-

Usage

-
multirandom(N) : si.bus(N)
-
-

Where:

-
    -
  • N: the number of decorrelated random numbers in parallel, a constant numerical expression
  • -
-
-

(no.)multinoise

-

Generates multiple decorrelated noises in parallel.

-

Usage

-
multinoise(N) : si.bus(N)
-
-

Where:

-
    -
  • N: the number of decorrelated random numbers in parallel, a constant numerical expression
  • -
-
-

(no.)noises

-

A convenient wrapper around multinoise.

-

Usage

-
noises(N,i) : _
-
-

Where:

-
    -
  • N: the number of decorrelated random numbers in parallel, a constant numerical expression
  • -
  • i: the selected random number (i in [0..N[)
  • -
-
-

(no.)randomseed

-

A random seed based on the foreign function arc4random -(see man arc4random). Used in rnoise, rmultirandom, etc. to -avoid having the same pseudo random sequence at each run.

-

WARNING: using the foreign function arc4random, so only available in C/C++ and LLVM backends.

-

Usage

-
randomseed : _
-
-
-

(no.)rnoise

-

A randomized white noise generator (outputs random number between -1 and 1).

-

WARNING: using the foreign function arc4random, so only available in C/C++ and LLVM backends.

-

Usage

-
rnoise : _
-
-
-

(no.)rmultirandom

-

Generates multiple decorrelated random numbers in parallel.

-

WARNING: using the foreign function arc4random, so only available in C/C++ and LLVM backends.

-

Usage

-
rmultirandom(N) : _
-
-

Where:

-
    -
  • N: the number of decorrelated random numbers in parallel, a constant numerical expression
  • -
-
-

(no.)rmultinoise

-

Generates multiple decorrelated noises in parallel.

-

WARNING: using the foreign function arc4random, so only available in C/C++ and LLVM backends.

-

Usage

-
rmultinoise(N) : _
-
-

Where:

-
    -
  • N: the number of decorrelated random numbers in parallel, a constant numerical expression
  • -
-
-

(no.)rnoises

-

A convenient wrapper around rmultinoise.

-

WARNING: using the foreign function arc4random, so only available in C/C++ and LLVM backends.

-

Usage

-
rnoises(N,i) : _
-
-

Where:

-
    -
  • N: the number of decorrelated random numbers in parallel
  • -
  • i: the selected random number (i in [0..N[)
  • -
-
-

(no.)pink_noise

-

Pink noise (1/f noise) generator (third-order approximation covering the audio band well). -pink_noise is a standard Faust function.

-

Usage

-
pink_noise : _
-
-

Reference

- -

Alternatives

-

Higher-order approximations covering any frequency band can be obtained using

-
no.noise : fi.spectral_tilt(order,lowerBandLimit,Bandwidth,p)
-
-

where p=-0.5 means filter rolloff f^(-1/2) which gives 1/f rolloff in the -power spectral density, and can be changed to other real values.

-

Example

-

// pink_noise_compare.dsp - compare three pinking filters

-
process = pink_noises with {
-    f0 = 35; // Lower bandlimit in Hz
-    bw3 = 0.7 * ma.SR/2.0 - f0; // Bandwidth in Hz, 3rd order case
-    bw9 = 0.8 * ma.SR/2.0 - f0; // Bandwidth in Hz, 9th order case
-    pink_tilt_3 = fi.spectral_tilt(3,f0,bw3,-0.5);
-    pink_tilt_9 = fi.spectral_tilt(9,f0,bw9,-0.5);
-    pink_noises = 1-1' <:
-      no.pink_filter, // original designed by invfreqz in Octave
-      pink_tilt_3,    // newer method using the same filter order
-      pink_tilt_9;    // newer method using a higher filter order
-};
-
-

Output of Example

-
faust2octave pink_noise_compare.dsp
-Octave:1> semilogx(20*log10(abs(fft(faustout,8192))(1:4096,:)));
-...
-
-

pink_noise_demo figure

-
-

(no.)pink_noise_vm

-

Multi pink noise generator.

-

Usage

-
pink_noise_vm(N) : _
-
-

Where:

-
    -
  • N: number of latched white-noise processes to sum, - not to exceed sizeof(int) in C++ (typically 32).
  • -
-

References

- -
-

(no.)lfnoise, (no.)lfnoise0 and (no.)lfnoiseN

-

Low-frequency noise generators (Butterworth-filtered downsampled white noise).

-

Usage

-
lfnoise0(rate) : _   // new random number every int(SR/rate) samples or so
-lfnoiseN(N,rate) : _ // same as "lfnoise0(rate) : lowpass(N,rate)" [see filters.lib]
-lfnoise(rate) : _    // same as "lfnoise0(rate) : seq(i,5,lowpass(N,rate))" (no overshoot)
-
-

Example

-

(view waveforms in faust2octave):

-
rate = SR/100.0; // new random value every 100 samples (SR from music.lib)
-process = lfnoise0(rate),   // sampled/held noise (piecewise constant)
-          lfnoiseN(3,rate), // lfnoise0 smoothed by 3rd order Butterworth LPF
-          lfnoise(rate);    // lfnoise0 smoothed with no overshoot
-
-
-

(no.)sparse_noise

-

Sparse noise generator.

-

Usage

-
sparse_noise(f0) : _
-
-

Where:

-
    -
  • f0: average frequency of noise impulses per second
  • -
-

Random impulses in the amplitude range -1 to 1 are generated -at an average rate of f0 impulses per second.

-

Reference

-
    -
  • See velvet_noise
  • -
-
-

(no.)velvet_noise_vm

-

Velvet noise generator.

-

Usage

-
velvet_noise(amp, f0) : _
-
-

Where:

-
    -
  • amp: amplitude of noise impulses (positive and negative)
  • -
  • f0: average frequency of noise impulses per second
  • -
-

Reference

-
    -
  • Matti Karjalainen and Hanna Jarvelainen, - "Reverberation Modeling Using Velvet Noise", - in Proc. 30th Int. Conf. Intelligent Audio Environments (AES07), - March 2007.
  • -
-
-

(no.)gnoise

-

Approximate zero-mean, unit-variance Gaussian white noise generator.

-

Usage

-
gnoise(N) : _
-
-

Where:

-
    -
  • N: number of uniform random numbers added to approximate Gaussian white noise
  • -
-

Reference

-
    -
  • See Central Limit Theorem
  • -
-
-

(no.)colored_noise

-

Generates a colored noise signal with an arbitrary spectral -roll-off factor (alpha) over the entire audible frequency range -(20-20000 Hz). The output is normalized so that an equal RMS -level is maintained for different values of alpha.

-

Usage

-
colored_noise(N,alpha) : _
-
-

Where:

-
    -
  • N: desired integer filter order (constant numerical expression)
  • -
  • alpha: slope of roll-off, between -1 and 1. -1 corresponds to -brown/red noise, -1/2 pink noise, 0 white noise, 1/2 blue noise, -and 1 violet/azure noise.
  • -
-

Examples

-

See dm.colored_noise_demo.

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/noises.lib/overview/index.html b/docs/contributors/faust/noises.lib/overview/index.html deleted file mode 100644 index 0fa1273..0000000 --- a/docs/contributors/faust/noises.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - noises.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

noises.lib Documentation

-

Welcome to the documentation for noises.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.4.1

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/oscillators.lib/1.5.1/doc/index.html b/docs/contributors/faust/oscillators.lib/1.5.1/doc/index.html deleted file mode 100644 index 1bbcec5..0000000 --- a/docs/contributors/faust/oscillators.lib/1.5.1/doc/index.html +++ /dev/null @@ -1,1576 +0,0 @@ - - - - - - - - - - - oscillators.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

oscillators.lib

-

This library contains a collection of sound generators. Its official prefix is os.

-

The oscillators library is organized into 9 sections:

- -

References

- -

Oscillators based on mathematical functions

-

Note that there is a numerical problem with several phasor functions built using the internal -phasor_imp. The reason is that the incremental step is smaller than ma.EPSILON, which happens with very small frequencies, -so it will have no effect when summed to 1, but it will be enough to make the fractional function wrap -around when summed to 0. An example of this problem can be observed when running the following code:

-

process = os.phasor(1.0, -.001);

-

The output of this program is the sequence 1, 0, 1, 0, 1... This happens because the negative incremental -step is greater than -ma.EPSILON, which will have no effect when summed to 1, but it will be significant -enough to make the fractional function wrap around when summed to 0.

-

The incremental step can be clipped to guarantee that the phasor will -always run correctly for its full cycle, otherwise, for increments smaller than ma.EPSILON, -phasor would initially run but it'd eventually get stuck once the output gets big enough.

-

All functions using phasor_imp are affected by this problem, but a safer -version is implemented, and can be used alternatively by setting SAFE=1 in the environment using -explicit sustitution syntax.

-

For example: process = os[SAFE=1;].phasor(1.0, -.001); will use the safer implementation of phasor_imp.

-

Wave-Table-Based Oscillators

-

Oscillators using tables. The table size is set by the -pl.tablesize constant.

-
-

(os.)sinwaveform

-

Sine waveform ready to use with a rdtable.

-

Usage

-
sinwaveform(tablesize) : _
-
-

Where:

-
    -
  • tablesize: the table size
  • -
-
-

(os.)coswaveform

-

Cosine waveform ready to use with a rdtable.

-

Usage

-
coswaveform(tablesize) : _
-
-

Where:

-
    -
  • tablesize: the table size
  • -
-
-

(os.)phasor

-

A simple phasor to be used with a rdtable. -phasor is a standard Faust function.

-

Usage

-
phasor(tablesize,freq) : _
-
-

Where:

-
    -
  • tablesize: the table size
  • -
  • freq: the frequency in Hz
  • -
-

Note that tablesize is just a multiplier for the output of a unit-amp phasor -so phasor(1.0, freq) can be used to generate a phasor output in the range [0, 1[.

-
-

(os.)hs_phasor

-

Hardsyncing phasor to be used with a rdtable.

-

Usage

-
hs_phasor(tablesize,freq,reset) :  _
-
-

Where:

-
    -
  • tablesize: the table size
  • -
  • freq: the frequency in Hz
  • -
  • reset: a reset signal, reset phase to 0 when equal to 1
  • -
-
-

(os.)hsp_phasor

-

Hardsyncing phasor with selectable phase to be used with a rdtable.

-

Usage

-
hsp_phasor(tablesize,freq,reset,phase)
-
-

Where:

-
    -
  • tablesize: the table size
  • -
  • freq: the frequency in Hz
  • -
  • reset: reset the oscillator to phase when equal to 1
  • -
  • phase: phase between 0 and 1
  • -
-
-

(os.)oscsin

-

Sine wave oscillator. -oscsin is a standard Faust function.

-

Usage

-
oscsin(freq) : _
-
-

Where:

-
    -
  • freq: the frequency in Hz
  • -
-
-

(os.)hs_oscsin

-

Sin lookup table with hardsyncing phase.

-

Usage

-
hs_oscsin(freq,reset) : _
-
-

Where:

-
    -
  • freq: the frequency in Hz
  • -
  • reset: reset the oscillator to 0 when equal to 1
  • -
-
-

(os.)osccos

-

Cosine wave oscillator.

-

Usage

-
osccos(freq) : _
-
-

Where:

-
    -
  • freq: the frequency in Hz
  • -
-
-

(os.)hs_osccos

-

Cos lookup table with hardsyncing phase.

-

Usage

-
hs_osccos(freq,reset) : _
-
-

Where:

-
    -
  • freq: the frequency in Hz
  • -
  • reset: reset the oscillator to 0 when equal to 1
  • -
-
-

(os.)oscp

-

A sine wave generator with controllable phase.

-

Usage

-
oscp(freq,phase) : _
-
-

Where:

-
    -
  • freq: the frequency in Hz
  • -
  • phase: the phase in radian
  • -
-
-

(os.)osci

-

Interpolated phase sine wave oscillator.

-

Usage

-
osci(freq) : _
-
-

Where:

-
    -
  • freq: the frequency in Hz
  • -
-
-

(os.)osc

-

Default sine wave oscillator (same as oscsin). -osc is a standard Faust function.

-

Usage

-
osc(freq) : _
-
-

Where:

-
    -
  • freq: the frequency in Hz
  • -
-
-

(os.)m_oscsin

-

Sine wave oscillator based on the sin mathematical function.

-

Usage

-
m_oscsin(freq) : _
-
-

Where:

-
    -
  • freq: the frequency in Hz
  • -
-
-

(os.)m_osccos

-

Sine wave oscillator based on the cos mathematical function.

-

Usage

-
m_osccos(freq) : _
-
-

Where:

-
    -
  • freq: the frequency in Hz
  • -
-

Low Frequency Oscillators

-

Low Frequency Oscillators (LFOs) have prefix lf_ -(no aliasing suppression, since it is inaudible at LF). -Use sawN and its derivatives for audio oscillators with suppressed aliasing.

-
-

(os.)lf_imptrain

-

Unit-amplitude low-frequency impulse train. -lf_imptrain is a standard Faust function.

-

Usage

-
lf_imptrain(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-
-

(os.)lf_pulsetrainpos

-

Unit-amplitude nonnegative LF pulse train, duty cycle between 0 and 1.

-

Usage

-
lf_pulsetrainpos(freq, duty) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
  • duty: duty cycle between 0 and 1
  • -
-
-

(os.)lf_pulsetrain

-

Unit-amplitude zero-mean LF pulse train, duty cycle between 0 and 1.

-

Usage

-
lf_pulsetrain(freq,duty) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
  • duty: duty cycle between 0 and 1
  • -
-
-

(os.)lf_squarewavepos

-

Positive LF square wave in [0,1]

-

Usage

-
lf_squarewavepos(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-
-

(os.)lf_squarewave

-

Zero-mean unit-amplitude LF square wave. -lf_squarewave is a standard Faust function.

-

Usage

-
lf_squarewave(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-
-

(os.)lf_trianglepos

-

Positive unit-amplitude LF positive triangle wave.

-

Usage

-
lf_trianglepos(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-
-

(os.)lf_triangle

-

Zero-mean unit-amplitude LF triangle wave. -lf_triangle is a standard Faust function.

-

Usage

-
lf_triangle(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-

Low Frequency Sawtooths

-

Sawtooth waveform oscillators for virtual analog synthesis et al. -The 'simple' versions (lf_rawsaw, lf_sawpos and saw1), are mere samplings of -the ideal continuous-time ("analog") waveforms. While simple, the -aliasing due to sampling is quite audible. The differentiated -polynomial waveform family (saw2, sawN, and derived functions) -do some extra processing to suppress aliasing (not audible for -very low fundamental frequencies). According to Lehtonen et al. -(JASA 2012), the aliasing of saw2 should be inaudible at fundamental -frequencies below 2 kHz or so, for a 44.1 kHz sampling rate and 60 dB SPL -presentation level; fundamentals 415 and below required no aliasing -suppression (i.e., saw1 is ok).

-
-

(os.)lf_rawsaw

-

Simple sawtooth waveform oscillator between 0 and period in samples.

-

Usage

-
lf_rawsaw(periodsamps) : _
-
-

Where:

-
    -
  • periodsamps: number of periods per samples
  • -
-
-

(os.)lf_sawpos

-

Simple sawtooth waveform oscillator between 0 and 1.

-

Usage

-
lf_sawpos(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-
-

(os.)lf_sawpos_phase

-

Simple sawtooth waveform oscillator between 0 and 1 -with phase control.

-

Usage

-
lf_sawpos_phase(freq, phase) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
  • phase: phase between 0 and 1
  • -
-
-

(os.)lf_sawpos_reset

-

Simple sawtooth waveform oscillator between 0 and 1 -with reset.

-

Usage

-
lf_sawpos_reset(freq,reset) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
  • reset: reset the oscillator to 0 when equal to 1
  • -
-
-

(os.)lf_sawpos_phase_reset

-

Simple sawtooth waveform oscillator between 0 and 1 -with phase control and reset.

-

Usage

-
lf_sawpos_phase_reset(freq,phase,reset) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
  • phase: phase between 0 and 1
  • -
  • reset: reset the oscillator to phase when equal to 1
  • -
-
-

(os.)lf_saw

-

Simple sawtooth waveform oscillator between -1 and 1. -lf_saw is a standard Faust function.

-

Usage

-
lf_saw(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-

Alias-Suppressed Sawtooth

-
-

(os.)sawN

-

Alias-Suppressed Sawtooth Audio-Frequency Oscillator using Nth-order polynomial transitions -to reduce aliasing.

-

sawN(N,freq), sawNp(N,freq,phase), saw2dpw(freq), saw2(freq), saw3(freq), -saw4(freq), sawtooth(freq), saw2f2(freq), saw2f4(freq)

-

Usage

-
sawN(N,freq) : _        // Nth-order aliasing-suppressed sawtooth using DPW method (see below)
-sawNp(N,freq,phase) : _ // sawN with phase offset feature
-saw2dpw(freq) : _       // saw2 using DPW
-saw2ptr(freq) : _       // saw2 using the faster, stateless PTR method
-saw2(freq) : _          // DPW method, but subject to change if a better method emerges
-saw3(freq) : _          // sawN(3)
-saw4(freq) : _          // sawN(4)
-sawtooth(freq) : _      // saw2
-saw2f2(freq) : _        // saw2dpw with 2nd-order droop-correction filtering
-saw2f4(freq) : _        // saw2dpw with 4th-order droop-correction filtering
-
-

Where:

-
    -
  • N: polynomial order, a constant numerical expression between 1 and 4
  • -
  • freq: frequency in Hz
  • -
  • phase: phase between 0 and 1
  • -
-

Method

-

Differentiated Polynomial Wave (DPW).

-
Reference
-

"Alias-Suppressed Oscillators based on Differentiated Polynomial Waveforms", -Vesa Valimaki, Juhan Nam, Julius Smith, and Jonathan Abel, -IEEE Tr. Audio, Speech, and Language Processing (IEEE-ASLP), -Vol. 18, no. 5, pp 786-798, May 2010. -10.1109/TASL.2009.2026507.

-

Notes

-

The polynomial order N is limited to 4 because noise has been -observed at very low freq values. (LFO sawtooths should of course -be generated using lf_sawpos instead.)

-
-

(os.)sawNp

-

Same as (os.)sawN but with a controllable waveform phase.

-

Usage

-
sawNp(N,freq,phase) : _
-
-

where

-
    -
  • N: waveform interpolation polynomial order 1 to 4 (constant integer expression)
  • -
  • freq: frequency in Hz
  • -
  • phase: waveform phase as a fraction of one period (rounded to nearest sample)
  • -
-

Implementation Notes

-

The phase offset is implemented by delaying sawN(N,freq) by -round(phase*ma.SR/freq) samples, for up to 8191 samples. -The minimum sawtooth frequency that can be delayed a whole period -is therefore ma.SR/8191, which is well below audibility for normal -audio sampling rates.

-
-

(os.)saw2, (os.)saw3, (os.)saw4

-

Alias-Suppressed Sawtooth Audio-Frequency Oscillators of order 2, 3, 4.

-

Usage

-
saw2(freq) : _
-saw3(freq) : _
-saw4(freq) : _
-
-

where

-
    -
  • freq: frequency in Hz
  • -
-
References
-

See sawN above.

-

Implementation Notes

-

Presently, only saw2 uses the PTR method, while saw3 and saw4 use DPW. -This is because PTR has been implemented and tested for the 2nd-order case only.

-
-

(os.)saw2ptr

-

Alias-Suppressed Sawtooth Audio-Frequency Oscillator -using Polynomial Transition Regions (PTR) for order 2.

-

Usage

-
saw2ptr(freq) : _
-
-

where

-
    -
  • freq: frequency in Hz
  • -
-
Implementation
-

Polynomial Transition Regions (PTR) method for aliasing suppression.

-
References
- -
Notes
-

Method PTR may be preferred because it requires less -computation and is stateless which means that the frequency freq -can be modulated arbitrarily fast over time without filtering -artifacts. For this reason, saw2 is presently defined as saw2ptr.

-
-

(os.)saw2dpw

-

Alias-Suppressed Sawtooth Audio-Frequency Oscillator -using the Differentiated Polynomial Waveform (DWP) method.

-

Usage

-
saw2dpw(freq) : _
-
-

where

-
    -
  • freq: frequency in Hz
  • -
-

This is the original Faust saw2 function using the DPW method. -Since saw2 is now defined as saw2ptr, the DPW version -is now available as saw2dwp.

-
-

(os.)sawtooth

-

Alias-suppressed aliasing-suppressed sawtooth oscillator, presently defined as saw2. -sawtooth is a standard Faust function.

-

Usage

-
sawtooth(freq) : _
-
-

with

-
    -
  • freq: frequency in Hz
  • -
-
-

(os.)saw2f2, (os.)saw2f4

-

Alias-Suppressed Sawtooth Audio-Frequency Oscillator with Order 2 or 4 Droop Correction Filtering.

-

Usage

-
saw2f2(freq) : _
-saw2f4(freq) : _
-
-

with

-
    -
  • freq: frequency in Hz
  • -
-

In return for aliasing suppression, there is some attenuation near half the sampling rate. -This can be considered as beneficial, or it can be compensated with a high-frequency boost. -The boost filter is second-order for saw2f2 and fourth-order for saw2f4, and both are designed -for the DWP case and therefore use saw2dpw. -See Figure 4(b) in the DPW reference for a plot of the slight droop in the DPW case.

-

Alias-Suppressed Pulse, Square, and Impulse Trains

-

Alias-Suppressed Pulse, Square and Impulse Trains.

-

pulsetrainN, pulsetrain, squareN, square, imptrainN, imptrain, -triangleN, triangle

-

All are zero-mean and meant to oscillate in the audio frequency range. -Use simpler sample-rounded lf_* versions above for LFOs.

-

Usage

-
pulsetrainN(N,freq,duty) : _
-pulsetrain(freq, duty) : _ // = pulsetrainN(2)
-
-squareN(N,freq) : _
-square : _ // = squareN(2)
-
-imptrainN(N,freq) : _
-imptrain : _ // = imptrainN(2)
-
-triangleN(N,freq) : _
-triangle : _ // = triangleN(2)
-
-

Where:

-
    -
  • N: polynomial order, a constant numerical expression
  • -
  • freq: frequency in Hz
  • -
-
-

(os.)impulse

-

One-time impulse generated when the Faust process is started. -impulse is a standard Faust function.

-

Usage

-
impulse : _
-
-
-

(os.)pulsetrainN

-

Alias-suppressed pulse train oscillator.

-

Usage

-
pulsetrainN(N,freq,duty) : _
-
-

Where:

-
    -
  • N: order, as a constant numerical expression
  • -
  • freq: frequency in Hz
  • -
  • duty: duty cycle between 0 and 1
  • -
-
-

(os.)pulsetrain

-

Alias-suppressed pulse train oscillator. Based on pulsetrainN(2). -pulsetrain is a standard Faust function.

-

Usage

-
pulsetrain(freq,duty) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
  • duty: duty cycle between 0 and 1
  • -
-
-

(os.)squareN

-

Alias-suppressed square wave oscillator.

-

Usage

-
squareN(N,freq) : _
-
-

Where:

-
    -
  • N: order, as a constant numerical expression
  • -
  • freq: frequency in Hz
  • -
-
-

(os.)square

-

Alias-suppressed square wave oscillator. Based on squareN(2). -square is a standard Faust function.

-

Usage

-
square(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-
-

(os.)imptrainN

-

Alias-suppressed impulse train generator.

-

Usage

-
imptrainN(N,freq) : _
-
-

Where:

-
    -
  • N: order, as a constant numerical expression
  • -
  • freq: frequency in Hz
  • -
-
-

(os.)imptrain

-

Alias-suppressed impulse train generator. Based on imptrainN(2). -imptrain is a standard Faust function.

-

Usage

-
imptrain(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-
-

(os.)triangleN

-

Alias-suppressed triangle wave oscillator.

-

Usage

-
triangleN(N,freq) : _
-
-

Where:

-
    -
  • N: order, as a constant numerical expression
  • -
  • freq: frequency in Hz
  • -
-
-

(os.)triangle

-

Alias-suppressed triangle wave oscillator. Based on triangleN(2). -triangle is a standard Faust function.

-

Usage

-
triangle(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-

Filter-Based Oscillators

-

Filter-Based Oscillators.

-

Usage

-
osc[b|rq|rs|rc|s](freq), where freq = frequency in Hz.
-
-

References

- -
-

(os.)oscb

-

Sinusoidal oscillator based on the biquad.

-

Usage

-
oscb(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-
-

(os.)oscrq

-

Sinusoidal (sine and cosine) oscillator based on 2D vector rotation, - = undamped "coupled-form" resonator - = lossless 2nd-order normalized ladder filter.

-

Usage

-
oscrq(freq) : _,_
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-

Reference

- -
-

(os.)oscrs

-

Sinusoidal (sine) oscillator based on 2D vector rotation, - = undamped "coupled-form" resonator - = lossless 2nd-order normalized ladder filter.

-

Usage

-
oscrs(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-

Reference

- -
-

(os.)oscrc

-

Sinusoidal (cosine) oscillator based on 2D vector rotation, - = undamped "coupled-form" resonator - = lossless 2nd-order normalized ladder filter.

-

Usage

-
oscrc(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-

Reference

- -
-

(os.)oscs

-

Sinusoidal oscillator based on the state variable filter -= undamped "modified-coupled-form" resonator -= "magic circle" algorithm used in graphics.

-

Usage

-
oscs(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-
-

(os.)quadosc

-

Quadrature (cosine and sine) oscillator based on QuadOsc by Martin Vicanek.

-

Usage

-
quadosc(freq) : _,_
-
-

where

-
    -
  • freq: frequency in Hz
  • -
-

Reference

- -
-

(os.)sidebands

-

Adds harmonics to quad oscillator.

-

Usage

-
   cos(x),sin(x) : sidebands(vs) : _,_
-
-

Where:

-
    -
  • vs : list of amplitudes
  • -
-

Example test program

-
   cos(x),sin(x) : sidebands((10,20,30))
-
-

outputs:

-
   10*cos(x) + 20*cos(2*x) + 30*cos(3*x),
-   10*sin(x) + 20*sin(2*x) + 30*sin(3*x);
-
-

The following:

-
   process = os.quadosc(F) : sidebands((10,20,30))
-
-

is (modulo floating point issues) the same as:

-
   c = os.quadosc : _,!;
-   s = os.quadosc : !,_;
-   process =
-       10*c(F) + 20*c(2*F) + 30*c(F),
-       10*s(F) + 20*s(2*F) + 30*s(F);
-
-

but much more efficient.

-

Implementation Notes

-

This is based on the trivial trigonometric identities:

-
   cos((n + 1) x) = 2 cos(x) cos(n x) - cos((n - 1) x)
-   sin((n + 1) x) = 2 cos(x) sin(n x) - sin((n - 1) x)
-
-

Note that the calculation of the cosine/sine parts do not depend -on each other, so if you only need the sine part you can do:

-
   process = os.quadosc(F) : sidebands(vs) : !,_;
-
-

and the compiler will discard the half of the calculations.

-
-

(os.)sidebands_list

-

Creates the list of complex harmonics from quad oscillator.

-

Similar to sidebands but doesn't sum the harmonics, so it is more -generic but less convenient for immediate usage.

-

Usage

-
   cos(x),sin(x) : sidebands_list(N) : si.bus(2*N)
-
-

Where:

-
    -
  • N : number of harmonics, compile time constant > 1
  • -
-

Example test program

-
   cos(x),sin(x) : sidebands_list(3)
-
-

outputs:

-
   cos(x),sin(x), cos(2*x),sin(2*x), cos(3*x),sin(3*x);
-
-

The following:

-
   process = os.quadosc(F) : sidebands_list(3)
-
-

is (modulo floating point issues) the same as:

-
   process = os.quadosc(F), os.quadosc(2*F), os.quadosc(3*F);
-
-

but much more efficient.

-

Waveguide-Resonator-Based Oscillators

-

Sinusoidal oscillator based on the waveguide resonator wgr.

-
-

(os.)oscwc

-

Sinusoidal oscillator based on the waveguide resonator wgr. Unit-amplitude -cosine oscillator.

-

Usage

-
oscwc(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-

Reference

- -
-

(os.)oscws

-

Sinusoidal oscillator based on the waveguide resonator wgr. Unit-amplitude -sine oscillator.

-

Usage

-
oscws(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-

Reference

- -
-

(os.)oscq

-

Sinusoidal oscillator based on the waveguide resonator wgr. -Unit-amplitude cosine and sine (quadrature) oscillator.

-

Usage

-
oscq(freq) : _,_
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-

Reference

- -
-

(os.)oscw

-

Sinusoidal oscillator based on the waveguide resonator wgr. -Unit-amplitude cosine oscillator (default).

-

Usage

-
oscw(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-

Reference

- -

Casio CZ Oscillators

-

Oscillators that mimic some of the Casio CZ oscillators.

-

There are two sets:

-
    -
  • -

    a set with an index parameter

    -
  • -
  • -

    a set with a res parameter

    -
  • -
-

The "index oscillators" outputs a sine wave at index=0 and gets brighter with a higher index. -There are two versions of the "index oscillators":

-
    -
  • -

    with P appended to the name: is phase aligned with fund:sin

    -
  • -
  • -

    without P appended to the name: has the phase of the original CZ oscillators

    -
  • -
-

The "res oscillators" have a resonant frequency. -"res" is the frequency of resonance as a factor of the fundamental pitch.

-

For the fund waveform, use a low-frequency oscillator without anti-aliasing such as os.lf_saw.

-
-

(os.)CZsaw

-

Oscillator that mimics the Casio CZ saw oscillator. -CZsaw is a standard Faust function.

-

Usage

-
CZsaw(fund,index) : _
-
-

Where:

-
    -
  • fund: a saw-tooth waveform between 0 and 1 that the oscillator slaves to
  • -
  • index: the brightness of the oscillator, 0 to 1. 0 = sine-wave, 1 = saw-wave
  • -
-
-

(os.)CZsawP

-

Oscillator that mimics the Casio CZ saw oscillator, -with it's phase aligned to fund:sin. -CZsawP is a standard Faust function.

-

Usage

-
CZsawP(fund,index) : _
-
-

Where:

-
    -
  • fund: a saw-tooth waveform between 0 and 1 that the oscillator slaves to
  • -
  • index: the brightness of the oscillator, 0 to 1. 0 = sine-wave, 1 = saw-wave
  • -
-
-

(os.)CZsquare

-

Oscillator that mimics the Casio CZ square oscillator -CZsquare is a standard Faust function.

-

Usage

-
CZsquare(fund,index) : _
-
-

Where:

-
    -
  • fund: a saw-tooth waveform between 0 and 1 that the oscillator slaves to
  • -
  • index: the brightness of the oscillator, 0 to 1. 0 = sine-wave, 1 = square-wave
  • -
-
-

(os.)CZsquareP

-

Oscillator that mimics the Casio CZ square oscillator, -with it's phase aligned to fund:sin. -CZsquareP is a standard Faust function.

-

Usage

-
CZsquareP(fund,index) : _
-
-

Where:

-
    -
  • fund: a saw-tooth waveform between 0 and 1 that the oscillator slaves to
  • -
  • index: the brightness of the oscillator, 0 to 1. 0 = sine-wave, 1 = square-wave
  • -
-
-

(os.)CZpulse

-

Oscillator that mimics the Casio CZ pulse oscillator. -CZpulse is a standard Faust function.

-

Usage

-
CZpulse(fund,index) : _
-
-

Where:

-
    -
  • fund: a saw-tooth waveform between 0 and 1 that the oscillator slaves to
  • -
  • index: the brightness of the oscillator, 0 gives a sine-wave, 1 is closer to a pulse
  • -
-
-

(os.)CZpulseP

-

Oscillator that mimics the Casio CZ pulse oscillator, -with it's phase aligned to fund:sin. -CZpulseP is a standard Faust function.

-

Usage

-
CZpulseP(fund,index) : _
-
-

Where:

-
    -
  • fund: a saw-tooth waveform between 0 and 1 that the oscillator slaves to
  • -
  • index: the brightness of the oscillator, 0 gives a sine-wave, 1 is closer to a pulse
  • -
-
-

(os.)CZsinePulse

-

Oscillator that mimics the Casio CZ sine/pulse oscillator. -CZsinePulse is a standard Faust function.

-

Usage

-
CZsinePulse(fund,index) : _
-
-

Where:

-
    -
  • fund: a saw-tooth waveform between 0 and 1 that the oscillator slaves to
  • -
  • index: the brightness of the oscillator, 0 gives a sine-wave, 1 is a sine minus a pulse
  • -
-
-

(os.)CZsinePulseP

-

Oscillator that mimics the Casio CZ sine/pulse oscillator, -with it's phase aligned to fund:sin. -CZsinePulseP is a standard Faust function.

-

Usage

-
CZsinePulseP(fund,index) : _
-
-

Where:

-
    -
  • fund: a saw-tooth waveform between 0 and 1 that the oscillator slaves to
  • -
  • index: the brightness of the oscillator, 0 gives a sine-wave, 1 is a sine minus a pulse
  • -
-
-

(os.)CZhalfSine

-

Oscillator that mimics the Casio CZ half sine oscillator. -CZhalfSine is a standard Faust function.

-

Usage

-
CZhalfSine(fund,index) : _
-
-

Where:

-
    -
  • fund: a saw-tooth waveform between 0 and 1 that the oscillator slaves to
  • -
  • index: the brightness of the oscillator, 0 gives a sine-wave, 1 is somewhere between a saw and a square
  • -
-
-

(os.)CZhalfSineP

-

Oscillator that mimics the Casio CZ half sine oscillator, -with it's phase aligned to fund:sin. -CZhalfSineP is a standard Faust function.

-

Usage

-
CZhalfSineP(fund,index) : _
-
-

Where:

-
    -
  • fund: a saw-tooth waveform between 0 and 1 that the oscillator slaves to
  • -
  • index: the brightness of the oscillator, 0 gives a sine-wave, 1 is somewhere between a saw and a square
  • -
-
-

(os.)CZresSaw

-

Oscillator that mimics the Casio CZ resonant sawtooth oscillator. -CZresSaw is a standard Faust function.

-

Usage

-
CZresSaw(fund,res) : _
-
-

Where:

-
    -
  • fund: a saw-tooth waveform between 0 and 1 that the oscillator slaves to
  • -
  • res: the frequency of resonance as a factor of the fundamental pitch.
  • -
-
-

(os.)CZresTriangle

-

Oscillator that mimics the Casio CZ resonant triangle oscillator. -CZresTriangle is a standard Faust function.

-

Usage

-
CZresTriangle(fund,res) : _
-
-

Where:

-
    -
  • fund: a saw-tooth waveform between 0 and 1 that the oscillator slaves to
  • -
  • res: the frequency of resonance as a factor of the fundamental pitch.
  • -
-
-

(os.)CZresTrap

-

Oscillator that mimics the Casio CZ resonant trapeze oscillator -CZresTrap is a standard Faust function.

-

Usage

-
CZresTrap(fund,res) : _
-
-

Where:

-
    -
  • fund: a saw-tooth waveform between 0 and 1 that the oscillator slaves to
  • -
  • res: the frequency of resonance as a factor of the fundamental pitch.
  • -
-

PolyBLEP-Based Oscillators

-
-

(os.)polyblep

-

PolyBLEP residual function, used for smoothing steps in the audio signal.

-

Usage

-
polyblep(Q,phase) : _
-
-

Where:

-
    -
  • Q: smoothing factor between 0 and 0.5. Determines how far from the ends of the phase interval the quadratic function is used.
  • -
  • phase: normalised phase (between 0 and 1)
  • -
-
-

(os.)polyblep_saw

-

Sawtooth oscillator with suppressed aliasing (using polyblep).

-

Usage

-
polyblep_saw(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-
-

(os.)polyblep_square

-

Square wave oscillator with suppressed aliasing (using polyblep).

-

Usage

-
polyblep_square(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-
-

(os.)polyblep_triangle

-

Triangle wave oscillator with suppressed aliasing (using polyblep).

-

Usage

-
polyblep_triangle(freq) : _
-
-

Where:

-
    -
  • freq: frequency in Hz
  • -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/oscillators.lib/overview/index.html b/docs/contributors/faust/oscillators.lib/overview/index.html deleted file mode 100644 index 9d5efa4..0000000 --- a/docs/contributors/faust/oscillators.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - oscillators.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

oscillators.lib Documentation

-

Welcome to the documentation for oscillators.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.5.1

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/overview/index.html b/docs/contributors/faust/overview/index.html deleted file mode 100644 index f518bbd..0000000 --- a/docs/contributors/faust/overview/index.html +++ /dev/null @@ -1,401 +0,0 @@ - - - - - - - - - - - faust - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

faust Documentation

-

Welcome to the documentation page for faust. Below you will find a list of libraries contributed by this user, along with links to their respective documentation.

-

oscillators.lib

-

maths.lib

-

phaflangers.lib

-

delays.lib

-

dx7.lib

-

fds.lib

-

signals.lib

-

tubes.lib

-

wdmodels.lib

-

compressors.lib

-

physmodels.lib

-

sf.lib

-

interpolators.lib

-

mi.lib

-

quantizers.lib

-

stdfaust.lib

-

maxmsp.lib

-

reducemaps.lib

-

reverbs.lib

-

noises.lib

-

soundfiles.lib

-

analyzers.lib

-

filters.lib

-

envelopes.lib

-

all.lib

-

webaudio.lib

-

misceffects.lib

-

platform.lib

-

hoa.lib

-

instruments.lib

-

basics.lib

-

synths.lib

-

aanl.lib

-

routes.lib

-

vaeffects.lib

-

tonestacks.lib

-

version.lib

-

demos.lib

-

spats.lib

-
-

If you have any questions or need further assistance, feel free to reach out to us.

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/phaflangers.lib/1.1.0/doc/index.html b/docs/contributors/faust/phaflangers.lib/1.1.0/doc/index.html deleted file mode 100644 index c1e42b1..0000000 --- a/docs/contributors/faust/phaflangers.lib/1.1.0/doc/index.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - - - - - - - phaflangers.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

phaflangers.lib

-

A library of phasor and flanger effects. Its official prefix is pf.

-

References

- -

Functions Reference

-
-

(pf.)flanger_mono

-

Mono flanging effect.

-

Usage:

-
_ : flanger_mono(dmax,curdel,depth,fb,invert) : _
-
-

Where:

-
    -
  • dmax: maximum delay-line length (power of 2) - 10 ms typical
  • -
  • curdel: current dynamic delay (not to exceed dmax)
  • -
  • depth: effect strength between 0 and 1 (1 typical)
  • -
  • fb: feedback gain between 0 and 1 (0 typical)
  • -
  • invert: 0 for normal, 1 to invert sign of flanging sum
  • -
-

Reference

- -
-

(pf.)flanger_stereo

-

Stereo flanging effect. -flanger_stereo is a standard Faust function.

-

Usage:

-
_,_ : flanger_stereo(dmax,curdel1,curdel2,depth,fb,invert) : _,_
-
-

Where:

-
    -
  • dmax: maximum delay-line length (power of 2) - 10 ms typical
  • -
  • curdel1: current dynamic delay for the left channel (not to exceed dmax)
  • -
  • curdel2: current dynamic delay for the right channel (not to exceed dmax)
  • -
  • depth: effect strength between 0 and 1 (1 typical)
  • -
  • fb: feedback gain between 0 and 1 (0 typical)
  • -
  • invert: 0 for normal, 1 to invert sign of flanging sum
  • -
-

Reference

- -
-

(pf.)phaser2_mono

-

Mono phasing effect.

-

Phaser

-
_ : phaser2_mono(Notches,phase,width,frqmin,fratio,frqmax,speed,depth,fb,invert) : _
-
-

Where:

-
    -
  • Notches: number of spectral notches (MACRO ARGUMENT - not a signal)
  • -
  • phase: phase of the oscillator (0-1)
  • -
  • width: approximate width of spectral notches in Hz
  • -
  • frqmin: approximate minimum frequency of first spectral notch in Hz
  • -
  • fratio: ratio of adjacent notch frequencies
  • -
  • frqmax: approximate maximum frequency of first spectral notch in Hz
  • -
  • speed: LFO frequency in Hz (rate of periodic notch sweep cycles)
  • -
  • depth: effect strength between 0 and 1 (1 typical) (aka "intensity") - when depth=2, "vibrato mode" is obtained (pure allpass chain)
  • -
  • fb: feedback gain between -1 and 1 (0 typical)
  • -
  • invert: 0 for normal, 1 to invert sign of flanging sum
  • -
-

Reference:

- -
-

(pf.)phaser2_stereo

-

Stereo phasing effect. -phaser2_stereo is a standard Faust function.

-

Phaser

-
_,_ : phaser2_stereo(Notches,width,frqmin,fratio,frqmax,speed,depth,fb,invert) : _,_
-
-

Where:

-
    -
  • Notches: number of spectral notches (MACRO ARGUMENT - not a signal)
  • -
  • width: approximate width of spectral notches in Hz
  • -
  • frqmin: approximate minimum frequency of first spectral notch in Hz
  • -
  • fratio: ratio of adjacent notch frequencies
  • -
  • frqmax: approximate maximum frequency of first spectral notch in Hz
  • -
  • speed: LFO frequency in Hz (rate of periodic notch sweep cycles)
  • -
  • depth: effect strength between 0 and 1 (1 typical) (aka "intensity") - when depth=2, "vibrato mode" is obtained (pure allpass chain)
  • -
  • fb: feedback gain between -1 and 1 (0 typical)
  • -
  • invert: 0 for normal, 1 to invert sign of flanging sum
  • -
-

Reference:

-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/phaflangers.lib/overview/index.html b/docs/contributors/faust/phaflangers.lib/overview/index.html deleted file mode 100644 index 00f3667..0000000 --- a/docs/contributors/faust/phaflangers.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - phaflangers.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

phaflangers.lib Documentation

-

Welcome to the documentation for phaflangers.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.1.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/physmodels.lib/1.1.0/doc/index.html b/docs/contributors/faust/physmodels.lib/1.1.0/doc/index.html deleted file mode 100644 index 3356c0d..0000000 --- a/docs/contributors/faust/physmodels.lib/1.1.0/doc/index.html +++ /dev/null @@ -1,2806 +0,0 @@ - - - - - - - - - - - physmodels.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

physmodels.lib

-

Faust physical modeling library. Its official prefix is pm.

-

This library provides an environment to facilitate physical modeling of musical -instruments. It contains dozens of functions implementing low and high level -elements going from a simple waveguide to fully operational models with -built-in UI, etc.

-

It is organized as follows:

-
    -
  • Global Variables: useful pre-defined variables for -physical modeling (e.g., speed of sound, etc.).
  • -
  • Conversion Tools: conversion functions specific -to physical modeling (e.g., length to frequency, etc.).
  • -
  • Bidirectional Utilities: functions to create -bidirectional block diagrams for physical modeling.
  • -
  • Basic Elements: waveguides, specific types of filters, etc.
  • -
  • String Instruments: various types of strings -(e.g., steel, nylon, etc.), bridges, guitars, etc.
  • -
  • Bowed String Instruments: parts and models -specific to bowed string instruments (e.g., bows, bridges, violins, etc.).
  • -
  • Wind Instrument: parts and models specific to wind -instruments (e.g., reeds, mouthpieces, flutes, clarinets, etc.).
  • -
  • Exciters: pluck generators, "blowers", etc.
  • -
  • Modal Percussions: percussion instruments based on -modal models.
  • -
  • Vocal Synthesis: functions for various vocal synthesis -techniques (e.g., fof, source/filter, etc.) and vocal synthesizers.
  • -
  • Misc Functions: any other functions that don't fit in -the previous category (e.g., nonlinear filters, etc.).
  • -
-

This library is part of the Faust Physical Modeling ToolKit. -More information on how to use this library can be found on this page or this video. Tutorials on how to make -physical models of musical instruments using Faust can be found -here as well.

-

References

- -

Global Variables

-

Useful pre-defined variables for physical modeling.

-
-

(pm.)speedOfSound

-

Speed of sound in meters per second (340m/s).

-
-

(pm.)maxLength

-

The default maximum length (3) in meters of strings and tubes used in this -library. This variable should be overriden to allow longer strings or tubes.

-

Conversion Tools

-

Useful conversion tools for physical modeling.

-
-

(pm.)f2l

-

Frequency to length in meters.

-

Usage

-
f2l(freq) : distanceInMeters
-
-

Where:

-
    -
  • freq: the frequency
  • -
-
-

(pm.)l2f

-

Length in meters to frequency.

-

Usage

-
l2f(length) : freq
-
-

Where:

-
    -
  • length: length/distance in meters
  • -
-
-

(pm.)l2s

-

Length in meters to number of samples.

-

Usage

-
l2s(l) : numberOfSamples
-
-

Where:

-
    -
  • l: length in meters
  • -
-

Bidirectional Utilities

-

Set of fundamental functions to create bi-directional block diagrams in Faust. -These elements are used as the basis of this library to connect high level -elements (e.g., mouthpieces, strings, bridge, instrument body, etc.). Each -block has 3 inputs and 3 outputs. The first input/output carry left going -waves, the second input/output carry right going waves, and the third -input/output is used to carry any potential output signal to the end of the -algorithm.

-
-

(pm.)basicBlock

-

Empty bidirectional block to be used with chain: 3 signals ins -and 3 signals out.

-

Usage

-
chain(basicBlock : basicBlock : etc.)
-
-
-

(pm.)chain

-

Creates a chain of bidirectional blocks. -Blocks must have 3 inputs and outputs. The first input/output carry left -going waves, the second input/output carry right going waves, and the third -input/output is used to carry any potential output signal to the end of the -algorithm. The implied one sample delay created by the ~ operator is -generalized to the left and right going waves. Thus, n blocks in chain() -will add an n samples delay to both left and right going waves.

-

Usage

-
leftGoingWaves,rightGoingWaves,mixedOutput : chain( A : B ) : leftGoingWaves,rightGoingWaves,mixedOutput
-with{
-        A = _,_,_;
-};
-
-
-

(pm.)inLeftWave

-

Adds a signal to left going waves anywhere in a chain of blocks.

-

Usage

-
model(x) = chain(A : inLeftWave(x) : B)
-
-

Where A and B are bidirectional blocks and x is the signal added to left -going waves in that chain.

-
-

(pm.)inRightWave

-

Adds a signal to right going waves anywhere in a chain of blocks.

-

Usage

-
model(x) = chain(A : inRightWave(x) : B)
-
-

Where A and B are bidirectional blocks and x is the signal added to right -going waves in that chain.

-
-

(pm.)in

-

Adds a signal to left and right going waves anywhere in a chain -of blocks.

-

Usage

-
model(x) = chain(A : in(x) : B)
-
-

Where A and B are bidirectional blocks and x is the signal added to -left and right going waves in that chain.

-
-

(pm.)outLeftWave

-

Sends the signal of left going waves to the output channel of the chain.

-

Usage

-
chain(A : outLeftWave : B)
-
-

Where A and B are bidirectional blocks.

-
-

(pm.)outRightWave

-

Sends the signal of right going waves to the output channel of the chain.

-

Usage

-
chain(A : outRightWave : B)
-
-

Where A and B are bidirectional blocks.

-
-

(pm.)out

-

Sends the signal of right and left going waves to the output channel of the -chain.

-

Usage

-
chain(A : out : B)
-
-

Where A and B are bidirectional blocks.

-
-

(pm.)terminations

-

Creates terminations on both sides of a chain without closing -the inputs and outputs of the bidirectional signals chain. As for -chain, this function adds a 1 sample delay to the bidirectional -signal, both ways. Of course, this function can be nested within a -chain.

-

Usage

-
terminations(a,b,c)
-with{
-};
-
-
-

(pm.)lTermination

-

Creates a termination on the left side of a chain without -closing the inputs and outputs of the bidirectional signals chain. This -function adds a 1 sample delay near the termination and can be nested -within another chain.

-

Usage

-
lTerminations(a,b)
-with{
-};
-
-
-

(pm.)rTermination

-

Creates a termination on the right side of a chain without -closing the inputs and outputs of the bidirectional signals chain. This -function adds a 1 sample delay near the termination and can be nested -within another chain.

-

Usage

-
rTerminations(b,c)
-with{
-};
-
-
-

(pm.)closeIns

-

Closes the inputs of a bidirectional chain in all directions.

-

Usage

-
closeIns : chain(...) : _,_,_
-
-
-

(pm.)closeOuts

-

Closes the outputs of a bidirectional chain in all directions except for the -main signal output (3d output).

-

Usage

-
_,_,_ : chain(...) : _
-
-
-

(pm.)endChain

-

Closes the inputs and outputs of a bidirectional chain in all directions -except for the main signal output (3d output).

-

Usage

-
endChain(chain(...)) : _
-
-

Basic Elements

-

Basic elements for physical modeling (e.g., waveguides, specific filters, -etc.).

-
-

(pm.)waveguideN

-

A series of waveguide functions based on various types of delays (see -fdelay[n]).

-

List of functions

-
    -
  • waveguideUd: unit delay waveguide
  • -
  • waveguideFd: fractional delay waveguide
  • -
  • waveguideFd2: second order fractional delay waveguide
  • -
  • waveguideFd4: fourth order fractional delay waveguide
  • -
-

Usage

-
chain(A : waveguideUd(nMax,n) : B)
-
-

Where:

-
    -
  • nMax: the maximum length of the delays in the waveguide
  • -
  • n: the length of the delay lines in samples.
  • -
-
-

(pm.)waveguide

-

Standard pm.lib waveguide (based on waveguideFd4).

-

Usage

-
chain(A : waveguide(nMax,n) : B)
-
-

Where:

-
    -
  • nMax: the maximum length of the delays in the waveguide
  • -
  • n: the length of the delay lines in samples.
  • -
-
-

(pm.)bridgeFilter

-

Generic two zeros bridge FIR filter (as implemented in the -STK) that can be used to -implement the reflectance violin, guitar, etc. bridges.

-

Usage

-
_ : bridge(brightness,absorption) : _
-
-

Where:

-
    -
  • brightness: controls the damping of high frequencies (0-1)
  • -
  • absorption: controls the absorption of the brige and thus the t60 of -the string plugged to it (0-1) (1 = 20 seconds)
  • -
-
-

(pm.)modeFilter

-

Resonant bandpass filter that can be used to implement a single resonance -(mode).

-

Usage

-
_ : modeFilter(freq,t60,gain) : _
-
-

Where:

-
    -
  • freq: mode frequency
  • -
  • t60: mode resonance duration (in seconds)
  • -
  • gain: mode gain (0-1)
  • -
-

String Instruments

-

Low and high level string instruments parts. Most of the elements in -this section can be used in a bidirectional chain.

-
-

(pm.)stringSegment

-

A string segment without terminations (just a simple waveguide).

-

Usage

-
chain(A : stringSegment(maxLength,length) : B)
-
-

Where:

-
    -
  • maxLength: the maximum length of the string in meters (should be static)
  • -
  • length: the length of the string in meters
  • -
-
-

(pm.)openString

-

A bidirectional block implementing a basic "generic" string with a -selectable excitation position. Lowpass filters are built-in and -allow to simulate the effect of dispersion on the sound and thus -to change the "stiffness" of the string.

-

Usage

-
chain(... : openString(length,stiffness,pluckPosition,excitation) : ...)
-
-

Where:

-
    -
  • length: the length of the string in meters
  • -
  • stiffness: the stiffness of the string (0-1) (1 for max stiffness)
  • -
  • pluckPosition: excitation position (0-1) (1 is bottom)
  • -
  • excitation: the excitation signal
  • -
-
-

(pm.)nylonString

-

A bidirectional block implementing a basic nylon string with selectable -excitation position. This element is based on openString -and has a fix stiffness corresponding to that of a nylon string.

-

Usage

-
chain(... : nylonString(length,pluckPosition,excitation) : ...)
-
-

Where:

-
    -
  • length: the length of the string in meters
  • -
  • pluckPosition: excitation position (0-1) (1 is bottom)
  • -
  • excitation: the excitation signal
  • -
-
-

(pm.)steelString

-

A bidirectional block implementing a basic steel string with selectable -excitation position. This element is based on openString -and has a fix stiffness corresponding to that of a steel string.

-

Usage

-
chain(... : steelString(length,pluckPosition,excitation) : ...)
-
-

Where:

-
    -
  • length: the length of the string in meters
  • -
  • pluckPosition: excitation position (0-1) (1 is bottom)
  • -
  • excitation: the excitation signal
  • -
-
-

(pm.)openStringPick

-

A bidirectional block implementing a "generic" string with selectable -excitation position. It also has a built-in pickup whose position is the -same as the excitation position. Thus, moving the excitation position -will also move the pickup.

-

Usage

-
chain(... : openStringPick(length,stiffness,pluckPosition,excitation) : ...)
-
-

Where:

-
    -
  • length: the length of the string in meters
  • -
  • stiffness: the stiffness of the string (0-1) (1 for max stiffness)
  • -
  • pluckPosition: excitation position (0-1) (1 is bottom)
  • -
  • excitation: the excitation signal
  • -
-
-

(pm.)openStringPickUp

-

A bidirectional block implementing a "generic" string with selectable -excitation position and stiffness. It also has a built-in pickup whose -position can be independenly selected. The only constraint is that the -pickup has to be placed after the excitation position.

-

Usage

-
chain(... : openStringPickUp(length,stiffness,pluckPosition,excitation) : ...)
-
-

Where:

-
    -
  • length: the length of the string in meters
  • -
  • stiffness: the stiffness of the string (0-1) (1 for max stiffness)
  • -
  • pluckPosition: pluck position between the top of the string and the -pickup (0-1) (1 for same as pickup position)
  • -
  • pickupPosition: position of the pickup on the string (0-1) (1 is bottom)
  • -
  • excitation: the excitation signal
  • -
-
-

(pm.)openStringPickDown

-

A bidirectional block implementing a "generic" string with selectable -excitation position and stiffness. It also has a built-in pickup whose -position can be independenly selected. The only constraint is that the -pickup has to be placed before the excitation position.

-

Usage

-
chain(... : openStringPickDown(length,stiffness,pluckPosition,excitation) : ...)
-
-

Where:

-
    -
  • length: the length of the string in meters
  • -
  • stiffness: the stiffness of the string (0-1) (1 for max stiffness)
  • -
  • pluckPosition: pluck position on the string (0-1) (1 is bottom)
  • -
  • pickupPosition: position of the pickup between the top of the string -and the excitation position (0-1) (1 is excitation position)
  • -
  • excitation: the excitation signal
  • -
-
-

(pm.)ksReflexionFilter

-

The "typical" one-zero Karplus-strong feedforward reflexion filter. This -filter will be typically used in a termination (see below).

-

Usage

-
terminations(_,chain(...),ksReflexionFilter)
-
-
-

(pm.)rStringRigidTermination

-

Bidirectional block implementing a right rigid string termination (no damping, -just phase inversion).

-

Usage

-
chain(rStringRigidTermination : stringSegment : ...)
-
-
-

(pm.)lStringRigidTermination

-

Bidirectional block implementing a left rigid string termination (no damping, -just phase inversion).

-

Usage

-
chain(... : stringSegment : lStringRigidTermination)
-
-
-

(pm.)elecGuitarBridge

-

Bidirectional block implementing a simple electric guitar bridge. This -block is based on bridgeFilter. The bridge doesn't -implement transmittance since it is not meant to be connected to a -body (unlike acoustic guitar). It also partially sets the resonance -duration of the string with the nuts used on the other side.

-

Usage

-
chain(... : stringSegment : elecGuitarBridge)
-
-
-

(pm.)elecGuitarNuts

-

Bidirectional block implementing a simple electric guitar nuts. This -block is based on bridgeFilter and does essentially -the same thing as elecGuitarBridge, but on the -other side of the chain. It also partially sets the resonance duration of -the string with the bridge used on the other side.

-

Usage

-
chain(elecGuitarNuts : stringSegment : ...)
-
-
-

(pm.)guitarBridge

-

Bidirectional block implementing a simple acoustic guitar bridge. This -bridge damps more hight frequencies than -elecGuitarBridge and implements a transmittance -filter. It also partially sets the resonance duration of the string with -the nuts used on the other side.

-

Usage

-
chain(... : stringSegment : guitarBridge)
-
-
-

(pm.)guitarNuts

-

Bidirectional block implementing a simple acoustic guitar nuts. This -nuts damps more hight frequencies than -elecGuitarNuts and implements a transmittance -filter. It also partially sets the resonance duration of the string with -the bridge used on the other side.

-

Usage

-
chain(guitarNuts : stringSegment : ...)
-
-
-

(pm.)idealString

-

An "ideal" string with rigid terminations and where the plucking position -and the pick-up position are the same. Since terminations are rigid, this -string will ring forever.

-

Usage

-
1-1' : idealString(length,reflexion,xPosition,excitation)
-
-

With: -* length: the length of the string in meters -* pluckPosition: the plucking position (0.001-0.999) -* excitation: the input signal for the excitation.

-
-

(pm.)ks

-

A Karplus-Strong string (in that case, the string is implemented as a -one dimension waveguide).

-

Usage

-
ks(length,damping,excitation) : _
-
-

Where:

-
    -
  • length: the length of the string in meters
  • -
  • damping: string damping (0-1)
  • -
  • excitation: excitation signal
  • -
-
-

(pm.)ks_ui_MIDI

-

Ready-to-use, MIDI-enabled Karplus-Strong string with buil-in UI.

-

Usage

-
ks_ui_MIDI : _
-
-
-

(pm.)elecGuitarModel

-

A simple electric guitar model (without audio effects, of course) with -selectable pluck position. -This model implements a single string. Additional strings should be created -by making a polyphonic application out of this function. Pitch is changed by -changing the length of the string and not through a finger model.

-

Usage

-
elecGuitarModel(length,pluckPosition,mute,excitation) : _
-
-

Where:

-
    -
  • length: the length of the string in meters
  • -
  • pluckPosition: pluck position (0-1) (1 is on the bridge)
  • -
  • mute: mute coefficient (1 for no mute and 0 for instant mute)
  • -
  • excitation: excitation signal
  • -
-
-

(pm.)elecGuitar

-

A simple electric guitar model with steel strings (based on -elecGuitarModel) implementing an excitation -model. -This model implements a single string. Additional strings should be created -by making a polyphonic application out of this function.

-

Usage

-
elecGuitar(length,pluckPosition,trigger) : _
-
-

Where:

-
    -
  • length: the length of the string in meters
  • -
  • pluckPosition: pluck position (0-1) (1 is on the bridge)
  • -
  • mute: mute coefficient (1 for no mute and 0 for instant mute)
  • -
  • gain: gain of the pluck (0-1)
  • -
  • trigger: trigger signal (1 for on, 0 for off)
  • -
-
-

(pm.)elecGuitar_ui_MIDI

-

Ready-to-use MIDI-enabled electric guitar physical model with built-in UI.

-

Usage

-
elecGuitar_ui_MIDI : _
-
-
-

(pm.)guitarBody

-

WARNING: not implemented yet! -Bidirectional block implementing a simple acoustic guitar body.

-

Usage

-
chain(... : guitarBody)
-
-
-

(pm.)guitarModel

-

A simple acoustic guitar model with steel strings and selectable excitation -position. This model implements a single string. Additional strings should be created -by making a polyphonic application out of this function. Pitch is changed by -changing the length of the string and not through a finger model. -WARNING: this function doesn't currently implement a body (just strings and -bridge).

-

Usage

-
guitarModel(length,pluckPosition,excitation) : _
-
-

Where:

-
    -
  • length: the length of the string in meters
  • -
  • pluckPosition: pluck position (0-1) (1 is on the bridge)
  • -
  • excitation: excitation signal
  • -
-
-

(pm.)guitar

-

A simple acoustic guitar model with steel strings (based on -guitarModel) implementing an excitation model. -This model implements a single string. Additional strings should be created -by making a polyphonic application out of this function.

-

Usage

-
guitar(length,pluckPosition,trigger) : _
-
-

Where:

-
    -
  • length: the length of the string in meters
  • -
  • pluckPosition: pluck position (0-1) (1 is on the bridge)
  • -
  • gain: gain of the excitation
  • -
  • trigger: trigger signal (1 for on, 0 for off)
  • -
-
-

(pm.)guitar_ui_MIDI

-

Ready-to-use MIDI-enabled steel strings acoustic guitar physical model with -built-in UI.

-

Usage

-
guitar_ui_MIDI : _
-
-
-

(pm.)nylonGuitarModel

-

A simple acoustic guitar model with nylon strings and selectable excitation -position. This model implements a single string. Additional strings should be created -by making a polyphonic application out of this function. Pitch is changed by -changing the length of the string and not through a finger model. -WARNING: this function doesn't currently implement a body (just strings and -bridge).

-

Usage

-
nylonGuitarModel(length,pluckPosition,excitation) : _
-
-

Where:

-
    -
  • length: the length of the string in meters
  • -
  • pluckPosition: pluck position (0-1) (1 is on the bridge)
  • -
  • excitation: excitation signal
  • -
-
-

(pm.)nylonGuitar

-

A simple acoustic guitar model with nylon strings (based on -nylonGuitarModel) implementing an excitation model. -This model implements a single string. Additional strings should be created -by making a polyphonic application out of this function.

-

Usage

-
nylonGuitar(length,pluckPosition,trigger) : _
-
-

Where:

-
    -
  • length: the length of the string in meters
  • -
  • pluckPosition: pluck position (0-1) (1 is on the bridge)
  • -
  • gain: gain of the excitation (0-1)
  • -
  • trigger: trigger signal (1 for on, 0 for off)
  • -
-
-

(pm.)nylonGuitar_ui_MIDI

-

Ready-to-use MIDI-enabled nylon strings acoustic guitar physical model with -built-in UI.

-

Usage

-
nylonGuitar_ui_MIDI : _
-
-
-

(pm.)modeInterpRes

-

Modular string instrument resonator based on IR measurements made on 3D -printed models. The 2D space allowing for the control of the shape and the -scale of the model is enabled by interpolating between modes parameters. -More information about this technique/project can be found here: -* https://ccrma.stanford.edu/~rmichon/3dPrintingModeling/.

-

Usage

-
_ : modeInterpRes(nModes,x,y) : _
-
-

Where:

-
    -
  • nModes: number of modeled modes (40 max)
  • -
  • x: shape of the resonator (0: square, 1: square with rounded corners, 2: round)
  • -
  • y: scale of the resonator (0: small, 1: medium, 2: large)
  • -
-
-

(pm.)modularInterpBody

-

Bidirectional block implementing a modular string instrument resonator -(see modeInterpRes).

-

Usage

-
chain(... : modularInterpBody(nModes,shape,scale) : ...)
-
-

Where:

-
    -
  • nModes: number of modeled modes (40 max)
  • -
  • shape: shape of the resonator (0: square, 1: square with rounded corners, 2: round)
  • -
  • scale: scale of the resonator (0: small, 1: medium, 2: large)
  • -
-
-

(pm.)modularInterpStringModel

-

String instrument model with a modular body (see -modeInterpRes and -* https://ccrma.stanford.edu/~rmichon/3dPrintingModeling/).

-

Usage

-
modularInterpStringModel(length,pluckPosition,shape,scale,bodyExcitation,stringExcitation) : _
-
-

Where:

-
    -
  • stringLength: the length of the string in meters
  • -
  • pluckPosition: pluck position (0-1) (1 is on the bridge)
  • -
  • shape: shape of the resonator (0: square, 1: square with rounded corners, 2: round)
  • -
  • scale: scale of the resonator (0: small, 1: medium, 2: large)
  • -
  • bodyExcitation: excitation signal for the body
  • -
  • stringExcitation: excitation signal for the string
  • -
-
-

(pm.)modularInterpInstr

-

String instrument with a modular body (see -modeInterpRes and -* https://ccrma.stanford.edu/~rmichon/3dPrintingModeling/).

-

Usage

-
modularInterpInstr(stringLength,pluckPosition,shape,scale,gain,tapBody,triggerString) : _
-
-

Where:

-
    -
  • stringLength: the length of the string in meters
  • -
  • pluckPosition: pluck position (0-1) (1 is on the bridge)
  • -
  • shape: shape of the resonator (0: square, 1: square with rounded corners, 2: round)
  • -
  • scale: scale of the resonator (0: small, 1: medium, 2: large)
  • -
  • gain: of the string excitation
  • -
  • tapBody: send an impulse in the body of the instrument where the string is connected (1 for on, 0 for off)
  • -
  • triggerString: trigger signal for the string (1 for on, 0 for off)
  • -
-
-

(pm.)modularInterpInstr_ui_MIDI

-

Ready-to-use MIDI-enabled string instrument with a modular body (see -modeInterpRes and -* https://ccrma.stanford.edu/~rmichon/3dPrintingModeling/) -with built-in UI.

-

Usage

-
modularInterpInstr_ui_MIDI : _
-
-

Bowed String Instruments

-

Low and high level basic string instruments parts. Most of the elements in -this section can be used in a bidirectional chain.

-
-

(pm.)bowTable

-

Extremely basic bow table that can be used to implement a wide range of -bow types for many different bowed string instruments (violin, cello, etc.).

-

Usage

-
excitation : bowTable(offeset,slope) : _
-
-

Where:

-
    -
  • excitation: an excitation signal
  • -
  • offset: table offset
  • -
  • slope: table slope
  • -
-
-

(pm.)violinBowTable

-

Violin bow table based on bowTable.

-

Usage

-
bowVelocity : violinBowTable(bowPressure) : _
-
-

Where:

-
    -
  • bowVelocity: velocity of the bow/excitation signal (0-1)
  • -
  • bowPressure: bow pressure on the string (0-1)
  • -
-
-

(pm.)bowInteraction

-

Bidirectional block implementing the interaction of a bow in a -chain.

-

Usage

-
chain(... : stringSegment : bowInteraction(bowTable) : stringSegment : ...)
-
-

Where:

-
    -
  • bowTable: the bow table
  • -
-
-

(pm.)violinBow

-

Bidirectional block implementing a violin bow and its interaction with -a string.

-

Usage

-
chain(... : stringSegment : violinBow(bowPressure,bowVelocity) : stringSegment : ...)
-
-

Where:

-
    -
  • bowVelocity: velocity of the bow / excitation signal (0-1)
  • -
  • bowPressure: bow pressure on the string (0-1)
  • -
-
-

(pm.)violinBowedString

-

Violin bowed string bidirectional block with controllable bow position. -Terminations are not implemented in this model.

-

Usage

-
chain(nuts : violinBowedString(stringLength,bowPressure,bowVelocity,bowPosition) : bridge)
-
-

Where:

-
    -
  • stringLength: the length of the string in meters
  • -
  • bowVelocity: velocity of the bow / excitation signal (0-1)
  • -
  • bowPressure: bow pressure on the string (0-1)
  • -
  • bowPosition: the position of the bow on the string (0-1)
  • -
-
-

(pm.)violinNuts

-

Bidirectional block implementing simple violin nuts. This function is -based on bridgeFilter.

-

Usage

-
chain(violinNuts : stringSegment : ...)
-
-
-

(pm.)violinBridge

-

Bidirectional block implementing a simple violin bridge. This function is -based on bridgeFilter.

-

Usage

-
chain(... : stringSegment : violinBridge
-
-
-

(pm.)violinBody

-

Bidirectional block implementing a simple violin body (just a simple -resonant lowpass filter).

-

Usage

-
chain(... : stringSegment : violinBridge : violinBody)
-
-
-

(pm.)violinModel

-

Ready-to-use simple violin physical model. This model implements a single -string. Additional strings should be created -by making a polyphonic application out of this function. Pitch is changed -by changing the length of the string (and not through a finger model).

-

Usage

-
violinModel(stringLength,bowPressure,bowVelocity,bridgeReflexion,
-bridgeAbsorption,bowPosition) : _
-
-

Where:

-
    -
  • stringLength: the length of the string in meters
  • -
  • bowVelocity: velocity of the bow / excitation signal (0-1)
  • -
  • bowPressure: bow pressure on the string (0-1))
  • -
  • bowPosition: the position of the bow on the string (0-1)
  • -
-
-

(pm.)violin_ui

-

Ready-to-use violin physical model with built-in UI.

-

Usage

-
violinModel_ui : _
-
-
-

(pm.)violin_ui_MIDI

-

Ready-to-use MIDI-enabled violin physical model with built-in UI.

-

Usage

-
violin_ui_MIDI : _
-
-

Wind Instruments

-

Low and high level basic wind instruments parts. Most of the elements in -this section can be used in a bidirectional chain.

-
-

(pm.)openTube

-

A tube segment without terminations (same as stringSegment).

-

Usage

-
chain(A : openTube(maxLength,length) : B)
-
-

Where:

-
    -
  • maxLength: the maximum length of the tube in meters (should be static)
  • -
  • length: the length of the tube in meters
  • -
-
-

(pm.)reedTable

-

Extremely basic reed table that can be used to implement a wide range of -single reed types for many different instruments (saxophone, clarinet, etc.).

-

Usage

-
excitation : reedTable(offeset,slope) : _
-
-

Where:

-
    -
  • excitation: an excitation signal
  • -
  • offset: table offset
  • -
  • slope: table slope
  • -
-
-

(pm.)fluteJetTable

-

Extremely basic flute jet table.

-

Usage

-
excitation : fluteJetTable : _
-
-

Where:

-
    -
  • excitation: an excitation signal
  • -
-
-

(pm.)brassLipsTable

-

Simple brass lips/mouthpiece table. Since this implementation is very basic -and that the lips and tube of the instrument are coupled to each other, the -length of that tube must be provided here.

-

Usage

-
excitation : brassLipsTable(tubeLength,lipsTension) : _
-
-

Where:

-
    -
  • excitation: an excitation signal (can be DC)
  • -
  • tubeLength: length in meters of the tube connected to the mouthpiece
  • -
  • lipsTension: tension of the lips (0-1) (default: 0.5)
  • -
-
-

(pm.)clarinetReed

-

Clarinet reed based on reedTable with controllable -stiffness.

-

Usage

-
excitation : clarinetReed(stiffness) : _
-
-

Where:

-
    -
  • excitation: an excitation signal
  • -
  • stiffness: reed stiffness (0-1)
  • -
-
-

(pm.)clarinetMouthPiece

-

Bidirectional block implementing a clarinet mouthpiece as well as the various -interactions happening with traveling waves. This element is ready to be -plugged to a tube...

-

Usage

-
chain(clarinetMouthPiece(reedStiffness,pressure) : tube : etc.)
-
-

Where:

-
    -
  • pressure: the pressure of the air flow (DC) created by the virtual performer (0-1). -This can also be any kind of signal that will directly injected in the mouthpiece -(e.g., breath noise, etc.).
  • -
  • reedStiffness: reed stiffness (0-1)
  • -
-
-

(pm.)brassLips

-

Bidirectional block implementing a brass mouthpiece as well as the various -interactions happening with traveling waves. This element is ready to be -plugged to a tube...

-

Usage

-
chain(brassLips(tubeLength,lipsTension,pressure) : tube : etc.)
-
-

Where:

-
    -
  • tubeLength: length in meters of the tube connected to the mouthpiece
  • -
  • lipsTension: tension of the lips (0-1) (default: 0.5)
  • -
  • pressure: the pressure of the air flow (DC) created by the virtual performer (0-1). -This can also be any kind of signal that will directly injected in the mouthpiece -(e.g., breath noise, etc.).
  • -
-
-

(pm.)fluteEmbouchure

-

Bidirectional block implementing a flute embouchure as well as the various -interactions happening with traveling waves. This element is ready to be -plugged between tubes segments...

-

Usage

-
chain(... : tube : fluteEmbouchure(pressure) : tube : etc.)
-
-

Where:

-
    -
  • pressure: the pressure of the air flow (DC) created by the virtual -performer (0-1). -This can also be any kind of signal that will directly injected in the -mouthpiece (e.g., breath noise, etc.).
  • -
-
-

(pm.)wBell

-

Generic wind instrument bell bidirectional block that should be placed at -the end of a chain.

-

Usage

-
chain(... : wBell(opening))
-
-

Where:

-
    -
  • opening: the "opening" of bell (0-1)
  • -
-
-

(pm.)fluteHead

-

Simple flute head implementing waves reflexion.

-

Usage

-
chain(fluteHead : tube : ...)
-
-
-

(pm.)fluteFoot

-

Simple flute foot implementing waves reflexion and dispersion.

-

Usage

-
chain(... : tube : fluteFoot)
-
-
-

(pm.)clarinetModel

-

A simple clarinet physical model without tone holes (pitch is changed by -changing the length of the tube of the instrument).

-

Usage

-
clarinetModel(length,pressure,reedStiffness,bellOpening) : _
-
-

Where:

-
    -
  • tubeLength: the length of the tube in meters
  • -
  • pressure: the pressure of the air flow created by the virtual performer (0-1). -This can also be any kind of signal that will directly injected in the mouthpiece -(e.g., breath noise, etc.).
  • -
  • reedStiffness: reed stiffness (0-1)
  • -
  • bellOpening: the opening of bell (0-1)
  • -
-
-

(pm.)clarinetModel_ui

-

Same as clarinetModel but with a built-in UI. This function -doesn't implement a virtual "blower", thus pressure remains an argument here.

-

Usage

-
clarinetModel_ui(pressure) : _
-
-

Where:

-
    -
  • pressure: the pressure of the air flow created by the virtual performer (0-1). -This can also be any kind of signal that will be directly injected in the mouthpiece -(e.g., breath noise, etc.).
  • -
-
-

(pm.)clarinet_ui

-

Ready-to-use clarinet physical model with built-in UI based on -clarinetModel.

-

Usage

-
clarinet_ui : _
-
-
-

(pm.)clarinet_ui_MIDI

-

Ready-to-use MIDI compliant clarinet physical model with built-in UI.

-

Usage

-
clarinet_ui_MIDI : _
-
-
-

(pm.)brassModel

-

A simple generic brass instrument physical model without pistons -(pitch is changed by changing the length of the tube of the instrument). -This model is kind of hard to control and might not sound very good if -bad parameters are given to it...

-

Usage

-
brassModel(tubeLength,lipsTension,mute,pressure) : _
-
-

Where:

-
    -
  • tubeLength: the length of the tube in meters
  • -
  • lipsTension: tension of the lips (0-1) (default: 0.5)
  • -
  • mute: mute opening at the end of the instrument (0-1) (default: 0.5)
  • -
  • pressure: the pressure of the air flow created by the virtual performer (0-1). -This can also be any kind of signal that will directly injected in the mouthpiece -(e.g., breath noise, etc.).
  • -
-
-

(pm.)brassModel_ui

-

Same as brassModel but with a built-in UI. This function -doesn't implement a virtual "blower", thus pressure remains an argument here.

-

Usage

-
brassModel_ui(pressure) : _
-
-

Where:

-
    -
  • pressure: the pressure of the air flow created by the virtual performer (0-1). -This can also be any kind of signal that will be directly injected in the mouthpiece -(e.g., breath noise, etc.).
  • -
-
-

(pm.)brass_ui

-

Ready-to-use brass instrument physical model with built-in UI based on -brassModel.

-

Usage

-
brass_ui : _
-
-
-

(pm.)brass_ui_MIDI

-

Ready-to-use MIDI-controllable brass instrument physical model with built-in UI.

-

Usage

-
brass_ui_MIDI : _
-
-
-

(pm.)fluteModel

-

A simple generic flute instrument physical model without tone holes -(pitch is changed by changing the length of the tube of the instrument).

-

Usage

-
fluteModel(tubeLength,mouthPosition,pressure) : _
-
-

Where:

-
    -
  • tubeLength: the length of the tube in meters
  • -
  • mouthPosition: position of the mouth on the embouchure (0-1) (default: 0.5)
  • -
  • pressure: the pressure of the air flow created by the virtual performer (0-1). -This can also be any kind of signal that will directly injected in the mouthpiece -(e.g., breath noise, etc.).
  • -
-
-

(pm.)fluteModel_ui

-

Same as fluteModel but with a built-in UI. This function -doesn't implement a virtual "blower", thus pressure remains an argument here.

-

Usage

-
fluteModel_ui(pressure) : _
-
-

Where:

-
    -
  • pressure: the pressure of the air flow created by the virtual performer (0-1). -This can also be any kind of signal that will be directly injected in the mouthpiece -(e.g., breath noise, etc.).
  • -
-
-

(pm.)flute_ui

-

Ready-to-use flute physical model with built-in UI based on -fluteModel.

-

Usage

-
flute_ui : _
-
-
-

(pm.)flute_ui_MIDI

-

Ready-to-use MIDI-controllable flute physical model with built-in UI.

-

Usage

-
flute_ui_MIDI : _
-
-

Exciters

-

Various kind of excitation signal generators.

-
-

(pm.)impulseExcitation

-

Creates an impulse excitation of one sample.

-

Usage

-
gate = button('gate');
-impulseExcitation(gate) : chain;
-
-

Where:

-
    -
  • gate: a gate button
  • -
-
-

(pm.)strikeModel

-

Creates a filtered noise excitation.

-

Usage

-
gate = button('gate');
-strikeModel(LPcutoff,HPcutoff,sharpness,gain,gate) : chain;
-
-

Where:

-
    -
  • HPcutoff: highpass cutoff frequency
  • -
  • LPcutoff: lowpass cutoff frequency
  • -
  • sharpness: sharpness of the attack and release (0-1)
  • -
  • gain: gain of the excitation
  • -
  • gate: a gate button/trigger signal (0/1)
  • -
-
-

(pm.)strike

-

Strikes generator with controllable excitation position.

-

Usage

-
gate = button('gate');
-strike(exPos,sharpness,gain,gate) : chain;
-
-

Where:

-
    -
  • exPos: excitation position wiht 0: for max low freqs and 1: for max high -freqs. So, on membrane for example, 0 would be the middle and 1 the edge
  • -
  • sharpness: sharpness of the attack and release (0-1)
  • -
  • gain: gain of the excitation
  • -
  • gate: a gate button/trigger signal (0/1)
  • -
-
-

(pm.)pluckString

-

Creates a plucking excitation signal.

-

Usage

-
trigger = button('gate');
-pluckString(stringLength,cutoff,maxFreq,sharpness,trigger)
-
-

Where:

-
    -
  • stringLength: length of the string to pluck
  • -
  • cutoff: cutoff ratio (1 for default)
  • -
  • maxFreq: max frequency ratio (1 for default)
  • -
  • sharpness: sharpness of the attack and release (1 for default)
  • -
  • gain: gain of the excitation (0-1)
  • -
  • trigger: trigger signal (1 for on, 0 for off)
  • -
-
-

(pm.)blower

-

A virtual blower creating a DC signal with some breath noise in it.

-

Usage

-
blower(pressure,breathGain,breathCutoff) : _
-
-

Where:

-
    -
  • pressure: pressure (0-1)
  • -
  • breathGain: breath noise gain (0-1) (recommended: 0.005)
  • -
  • breathCutoff: breath cuttoff frequency (Hz) (recommended: 2000)
  • -
-
-

(pm.)blower_ui

-

Same as blower but with a built-in UI.

-

Usage

-
blower : somethingToBeBlown
-
- -

High and low level functions for modal synthesis of percussion instruments.

-
-

(pm.)djembeModel

-

Dirt-simple djembe modal physical model. Mode parameters are empirically -calculated and don't correspond to any measurements or 3D model. They -kind of sound good though :).

-

Usage

-
excitation : djembeModel(freq)
-
-

Where:

-
    -
  • excitation: excitation signal
  • -
  • freq: fundamental frequency of the bar
  • -
-
-

(pm.)djembe

-

Dirt-simple djembe modal physical model. Mode parameters are empirically -calculated and don't correspond to any measurements or 3D model. They -kind of sound good though :).

-

This model also implements a virtual "exciter".

-

Usage

-
djembe(freq,strikePosition,strikeSharpness,gain,trigger)
-
-

Where:

-
    -
  • freq: fundamental frequency of the model
  • -
  • strikePosition: strike position (0 for the middle of the membrane and -1 for the edge)
  • -
  • strikeSharpness: sharpness of the strike (0-1, default: 0.5)
  • -
  • gain: gain of the strike
  • -
  • trigger: trigger signal (0: off, 1: on)
  • -
-
-

(pm.)djembe_ui_MIDI

-

Simple MIDI controllable djembe physical model with built-in UI.

-

Usage

-
djembe_ui_MIDI : _
-
-
-

(pm.)marimbaBarModel

-

Generic marimba tone bar modal model.

-

This model was generated using -mesh2faust from a 3D CAD model of a marimba tone bar -(libraries/modalmodels/marimbaBar). The corresponding CAD model is that -of a C2 tone bar (original fundamental frequency: ~65Hz). While -marimbaBarModel allows to translate the harmonic content of the generated -sound by providing a frequency (freq), mode transposition has limits and -the model will sound less and less like a marimba tone bar as it -diverges from C2. To make an accurate model of a marimba, we'd want to have -an independent model for each bar...

-

This model contains 5 excitation positions going linearly from the center -bottom to the center top of the bar. Obviously, a model with more excitation -position could be regenerated using mesh2faust.

-

Usage

-
excitation : marimbaBarModel(freq,exPos,t60,t60DecayRatio,t60DecaySlope)
-
-

Where:

-
    -
  • excitation: excitation signal
  • -
  • freq: fundamental frequency of the bar
  • -
  • exPos: excitation position (0-4)
  • -
  • t60: T60 in seconds (recommended value: 0.1)
  • -
  • t60DecayRatio: T60 decay ratio (recommended value: 1)
  • -
  • t60DecaySlope: T60 decay slope (recommended value: 5)
  • -
-
-

(pm.)marimbaResTube

-

Simple marimba resonance tube.

-

Usage

-
marimbaResTube(tubeLength,excitation)
-
-

Where:

-
    -
  • tubeLength: the length of the tube in meters
  • -
  • excitation: the excitation signal (audio in)
  • -
-
-

(pm.)marimbaModel

-

Simple marimba physical model implementing a single tone bar connected to -tube. This model is scalable and can be adapted to any size of bar/tube -(see marimbaBarModel to know more about the -limitations of this type of system).

-

Usage

-
excitation : marimbaModel(freq,exPos) : _
-
-

Where:

-
    -
  • freq: the frequency of the bar/tube couple
  • -
  • exPos: excitation position (0-4)
  • -
-
-

(pm.)marimba

-

Simple marimba physical model implementing a single tone bar connected to -tube. This model is scalable and can be adapted to any size of bar/tube -(see marimbaBarModel to know more about the -limitations of this type of system).

-

This function also implement a virtual exciter to drive the model.

-

Usage

-
excitation : marimba(freq,strikePosition,strikeCutoff,strikeSharpness,gain,trigger) : _
-
-

Where:

-
    -
  • excitation: the excitation signal
  • -
  • freq: the frequency of the bar/tube couple
  • -
  • strikePosition: strike position (0-4)
  • -
  • strikeCutoff: cuttoff frequency of the strike genarator (recommended: ~7000Hz)
  • -
  • strikeSharpness: sharpness of the strike (recommended: ~0.25)
  • -
  • gain: gain of the strike (0-1)
  • -
  • trigger signal (0: off, 1: on)
  • -
-
-

(pm.)marimba_ui_MIDI

-

Simple MIDI controllable marimba physical model with built-in UI -implementing a single tone bar connected to -tube. This model is scalable and can be adapted to any size of bar/tube -(see marimbaBarModel to know more about the -limitations of this type of system).

-

Usage

-
marimba_ui_MIDI : _
-
-
-

(pm.)churchBellModel

-

Generic church bell modal model generated by mesh2faust from -libraries/modalmodels/churchBell.

-

Modeled after T. Rossing and R. Perrin, Vibrations of Bells, Applied -Acoustics 2, 1987.

-

Model height is 301 mm.

-

This model contains 7 excitation positions going linearly from the -bottom to the top of the bell. Obviously, a model with more excitation -position could be regenerated using mesh2faust.

-

Usage

-
excitation : churchBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope)
-
-

Where:

-
    -
  • excitation: the excitation signal
  • -
  • nModes: number of synthesized modes (max: 50)
  • -
  • exPos: excitation position (0-6)
  • -
  • t60: T60 in seconds (recommended value: 0.1)
  • -
  • t60DecayRatio: T60 decay ratio (recommended value: 1)
  • -
  • t60DecaySlope: T60 decay slope (recommended value: 5)
  • -
-
-

(pm.)churchBell

-

Generic church bell modal model.

-

Modeled after T. Rossing and R. Perrin, Vibrations of Bells, Applied -Acoustics 2, 1987.

-

Model height is 301 mm.

-

This model contains 7 excitation positions going linearly from the -bottom to the top of the bell. Obviously, a model with more excitation -position could be regenerated using mesh2faust.

-

This function also implement a virtual exciter to drive the model.

-

Usage

-
excitation : churchBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) : _
-
-

Where:

-
    -
  • excitation: the excitation signal
  • -
  • strikePosition: strike position (0-6)
  • -
  • strikeCutoff: cuttoff frequency of the strike genarator (recommended: ~7000Hz)
  • -
  • strikeSharpness: sharpness of the strike (recommended: ~0.25)
  • -
  • gain: gain of the strike (0-1)
  • -
  • trigger signal (0: off, 1: on)
  • -
-
-

(pm.)churchBell_ui

-

Church bell physical model based on churchBell with -built-in UI.

-

Usage

-
churchBell_ui : _
-
-
-

(pm.)englishBellModel

-

English church bell modal model generated by mesh2faust from -libraries/modalmodels/englishBell.

-

Modeled after D.Bartocha and Baron, Influence of Tin Bronze Melting and -Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -Engineering, 2016.

-

Model height is 1 m.

-

This model contains 7 excitation positions going linearly from the -bottom to the top of the bell. Obviously, a model with more excitation -position could be regenerated using mesh2faust.

-

Usage

-
excitation : englishBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope)
-
-

Where:

-
    -
  • excitation: the excitation signal
  • -
  • nModes: number of synthesized modes (max: 50)
  • -
  • exPos: excitation position (0-6)
  • -
  • t60: T60 in seconds (recommended value: 0.1)
  • -
  • t60DecayRatio: T60 decay ratio (recommended value: 1)
  • -
  • t60DecaySlope: T60 decay slope (recommended value: 5)
  • -
-
-

(pm.)englishBell

-

English church bell modal model.

-

Modeled after D.Bartocha and Baron, Influence of Tin Bronze Melting and -Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -Engineering, 2016.

-

Model height is 1 m.

-

This model contains 7 excitation positions going linearly from the -bottom to the top of the bell. Obviously, a model with more excitation -position could be regenerated using mesh2faust.

-

This function also implement a virtual exciter to drive the model.

-

Usage

-
excitation : englishBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) : _
-
-

Where:

-
    -
  • excitation: the excitation signal
  • -
  • strikePosition: strike position (0-6)
  • -
  • strikeCutoff: cuttoff frequency of the strike genarator (recommended: ~7000Hz)
  • -
  • strikeSharpness: sharpness of the strike (recommended: ~0.25)
  • -
  • gain: gain of the strike (0-1)
  • -
  • trigger signal (0: off, 1: on)
  • -
-
-

(pm.)englishBell_ui

-

English church bell physical model based on englishBell with -built-in UI.

-

Usage

-
englishBell_ui : _
-
-
-

(pm.)frenchBellModel

-

French church bell modal model generated by mesh2faust from -libraries/modalmodels/frenchBell.

-

Modeled after D.Bartocha and Baron, Influence of Tin Bronze Melting and -Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -Engineering, 2016.

-

Model height is 1 m.

-

This model contains 7 excitation positions going linearly from the -bottom to the top of the bell. Obviously, a model with more excitation -position could be regenerated using mesh2faust.

-

Usage

-
excitation : frenchBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope)
-
-

Where:

-
    -
  • excitation: the excitation signal
  • -
  • nModes: number of synthesized modes (max: 50)
  • -
  • exPos: excitation position (0-6)
  • -
  • t60: T60 in seconds (recommended value: 0.1)
  • -
  • t60DecayRatio: T60 decay ratio (recommended value: 1)
  • -
  • t60DecaySlope: T60 decay slope (recommended value: 5)
  • -
-
-

(pm.)frenchBell

-

French church bell modal model.

-

Modeled after D.Bartocha and Baron, Influence of Tin Bronze Melting and -Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -Engineering, 2016.

-

Model height is 1 m.

-

This model contains 7 excitation positions going linearly from the -bottom to the top of the bell. Obviously, a model with more excitation -position could be regenerated using mesh2faust.

-

This function also implement a virtual exciter to drive the model.

-

Usage

-
excitation : frenchBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) : _
-
-

Where:

-
    -
  • excitation: the excitation signal
  • -
  • strikePosition: strike position (0-6)
  • -
  • strikeCutoff: cuttoff frequency of the strike genarator (recommended: ~7000Hz)
  • -
  • strikeSharpness: sharpness of the strike (recommended: ~0.25)
  • -
  • gain: gain of the strike (0-1)
  • -
  • trigger signal (0: off, 1: on)
  • -
-
-

(pm.)frenchBell_ui

-

French church bell physical model based on frenchBell with -built-in UI.

-

Usage

-
frenchBell_ui : _
-
-
-

(pm.)germanBellModel

-

German church bell modal model generated by mesh2faust from -libraries/modalmodels/germanBell.

-

Modeled after D.Bartocha and Baron, Influence of Tin Bronze Melting and -Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -Engineering, 2016.

-

Model height is 1 m.

-

This model contains 7 excitation positions going linearly from the -bottom to the top of the bell. Obviously, a model with more excitation -position could be regenerated using mesh2faust.

-

Usage

-
excitation : germanBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope)
-
-

Where:

-
    -
  • excitation: the excitation signal
  • -
  • nModes: number of synthesized modes (max: 50)
  • -
  • exPos: excitation position (0-6)
  • -
  • t60: T60 in seconds (recommended value: 0.1)
  • -
  • t60DecayRatio: T60 decay ratio (recommended value: 1)
  • -
  • t60DecaySlope: T60 decay slope (recommended value: 5)
  • -
-
-

(pm.)germanBell

-

German church bell modal model.

-

Modeled after D.Bartocha and Baron, Influence of Tin Bronze Melting and -Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -Engineering, 2016.

-

Model height is 1 m.

-

This model contains 7 excitation positions going linearly from the -bottom to the top of the bell. Obviously, a model with more excitation -position could be regenerated using mesh2faust.

-

This function also implement a virtual exciter to drive the model.

-

Usage

-
excitation : germanBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) : _
-
-

Where:

-
    -
  • excitation: the excitation signal
  • -
  • strikePosition: strike position (0-6)
  • -
  • strikeCutoff: cuttoff frequency of the strike genarator (recommended: ~7000Hz)
  • -
  • strikeSharpness: sharpness of the strike (recommended: ~0.25)
  • -
  • gain: gain of the strike (0-1)
  • -
  • trigger signal (0: off, 1: on)
  • -
-
-

(pm.)germanBell_ui

-

German church bell physical model based on germanBell with -built-in UI.

-

Usage

-
germanBell_ui : _
-
-
-

(pm.)russianBellModel

-

Russian church bell modal model generated by mesh2faust from -libraries/modalmodels/russianBell.

-

Modeled after D.Bartocha and Baron, Influence of Tin Bronze Melting and -Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -Engineering, 2016.

-

Model height is 2 m.

-

This model contains 7 excitation positions going linearly from the -bottom to the top of the bell. Obviously, a model with more excitation -position could be regenerated using mesh2faust.

-

Usage

-
excitation : russianBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope)
-
-

Where:

-
    -
  • excitation: the excitation signal
  • -
  • nModes: number of synthesized modes (max: 50)
  • -
  • exPos: excitation position (0-6)
  • -
  • t60: T60 in seconds (recommended value: 0.1)
  • -
  • t60DecayRatio: T60 decay ratio (recommended value: 1)
  • -
  • t60DecaySlope: T60 decay slope (recommended value: 5)
  • -
-
-

(pm.)russianBell

-

Russian church bell modal model.

-

Modeled after D.Bartocha and Baron, Influence of Tin Bronze Melting and -Pouring Parameters on Its Properties and Bell' Tone, Archives of Foundry -Engineering, 2016.

-

Model height is 2 m.

-

This model contains 7 excitation positions going linearly from the -bottom to the top of the bell. Obviously, a model with more excitation -position could be regenerated using mesh2faust.

-

This function also implement a virtual exciter to drive the model.

-

Usage

-
excitation : russianBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) : _
-
-

Where:

-
    -
  • excitation: the excitation signal
  • -
  • strikePosition: strike position (0-6)
  • -
  • strikeCutoff: cuttoff frequency of the strike genarator (recommended: ~7000Hz)
  • -
  • strikeSharpness: sharpness of the strike (recommended: ~0.25)
  • -
  • gain: gain of the strike (0-1)
  • -
  • trigger signal (0: off, 1: on)
  • -
-
-

(pm.)russianBell_ui

-

Russian church bell physical model based on russianBell with -built-in UI.

-

Usage

-
russianBell_ui : _
-
-
-

(pm.)standardBellModel

-

Standard church bell modal model generated by mesh2faust from -libraries/modalmodels/standardBell.

-

Modeled after T. Rossing and R. Perrin, Vibrations of Bells, Applied -Acoustics 2, 1987.

-

Model height is 1.8 m.

-

This model contains 7 excitation positions going linearly from the -bottom to the top of the bell. Obviously, a model with more excitation -position could be regenerated using mesh2faust.

-

Usage

-
excitation : standardBellModel(nModes,exPos,t60,t60DecayRatio,t60DecaySlope)
-
-

Where:

-
    -
  • excitation: the excitation signal
  • -
  • nModes: number of synthesized modes (max: 50)
  • -
  • exPos: excitation position (0-6)
  • -
  • t60: T60 in seconds (recommended value: 0.1)
  • -
  • t60DecayRatio: T60 decay ratio (recommended value: 1)
  • -
  • t60DecaySlope: T60 decay slope (recommended value: 5)
  • -
-
-

(pm.)standardBell

-

Standard church bell modal model.

-

Modeled after T. Rossing and R. Perrin, Vibrations of Bells, Applied -Acoustics 2, 1987.

-

Model height is 1.8 m.

-

This model contains 7 excitation positions going linearly from the -bottom to the top of the bell. Obviously, a model with more excitation -position could be regenerated using mesh2faust.

-

This function also implement a virtual exciter to drive the model.

-

Usage

-
excitation : standardBell(strikePosition,strikeCutoff,strikeSharpness,gain,trigger) : _
-
-

Where:

-
    -
  • excitation: the excitation signal
  • -
  • strikePosition: strike position (0-6)
  • -
  • strikeCutoff: cuttoff frequency of the strike genarator (recommended: ~7000Hz)
  • -
  • strikeSharpness: sharpness of the strike (recommended: ~0.25)
  • -
  • gain: gain of the strike (0-1)
  • -
  • trigger signal (0: off, 1: on)
  • -
-
-

(pm.)standardBell_ui

-

Standard church bell physical model based on standardBell with -built-in UI.

-

Usage

-
standardBell_ui : _
-
-

Vocal Synthesis

-

Vocal synthesizer functions (source/filter, fof, etc.).

-
-

(pm.)formantValues

-

Formant data values.

-

The formant data used here come from the CSOUND manual -* http://www.csounds.com/manual/html/.

-

Usage

-
ba.take(j+1,formantValues.f(i)) : _
-ba.take(j+1,formantValues.g(i)) : _
-ba.take(j+1,formantValues.bw(i)) : _
-
-

Where:

-
    -
  • i: formant number
  • -
  • j: (voiceType*nFormants)+vowel
  • -
  • voiceType: the voice type (0: alto, 1: bass, 2: countertenor, 3: -soprano, 4: tenor)
  • -
  • vowel: the vowel (0: a, 1: e, 2: i, 3: o, 4: u)
  • -
-
-

(pm.)voiceGender

-

Calculate the gender for the provided voiceType value. (0: male, 1: female)

-

Usage

-
voiceGender(voiceType) : _
-
-

Where:

-
    -
  • voiceType: the voice type (0: alto, 1: bass, 2: countertenor, 3: soprano, 4: tenor)
  • -
-
-

(pm.)skirtWidthMultiplier

-

Calculates value to multiply bandwidth to obtain skirtwidth -for a Fof filter.

-

Usage

-
skirtWidthMultiplier(vowel,freq,gender) : _
-
-

Where:

-
    -
  • vowel: the vowel (0: a, 1: e, 2: i, 3: o, 4: u)
  • -
  • freq: the fundamental frequency of the excitation signal
  • -
  • gender: gender of the voice used in the fof filter (0: male, 1: female)
  • -
-
-

(pm.)autobendFreq

-

Autobends the center frequencies of formants 1 and 2 based on -the fundamental frequency of the excitation signal and leaves -all other formant frequencies unchanged. Ported from chant-lib.

-

Reference

- -

Usage

-
_ : autobendFreq(n,freq,voiceType) : _
-
-

Where:

-
    -
  • n: formant index
  • -
  • freq: the fundamental frequency of the excitation signal
  • -
  • voiceType: the voice type (0: alto, 1: bass, 2: countertenor, 3: soprano, 4: tenor)
  • -
  • input is the center frequency of the corresponding formant
  • -
-
-

(pm.)vocalEffort

-

Changes the gains of the formants based on the fundamental -frequency of the excitation signal. Higher formants are -reinforced for higher fundamental frequencies. -Ported from chant-lib.

-

Reference

- -

Usage

-
_ : vocalEffort(freq,gender) : _
-
-

Where:

-
    -
  • freq: the fundamental frequency of the excitation signal
  • -
  • gender: the gender of the voice type (0: male, 1: female)
  • -
  • input is the linear amplitude of the formant
  • -
-
-

(pm.)fof

-

Function to generate a single Formant-Wave-Function.

-

Reference

- -

Usage

-
_ : fof(fc,bw,a,g) : _
-
-

Where:

-
    -
  • fc: formant center frequency,
  • -
  • bw: formant bandwidth (Hz),
  • -
  • sw: formant skirtwidth (Hz)
  • -
  • g: linear scale factor (g=1 gives 0dB amplitude response at fc)
  • -
  • input is an impulse signal to excite filter
  • -
-
-

(pm.)fofSH

-

FOF with sample and hold used on bw and a parameter -used in the filter-cycling FOF function fofCycle.

-

Reference

- -

Usage

-
_ : fofSH(fc,bw,a,g) : _
-
-

Where: all parameters same as for fof

-
-

(pm.)fofCycle

-

FOF implementation where time-varying filter parameter noise is -mitigated by using a cycle of n sample and hold FOF filters.

-

Reference

- -

Usage

-
_ : fofCycle(fc,bw,a,g,n) : _
-
-

Where:

-
    -
  • n: the number of FOF filters to cycle through
  • -
  • all other parameters are same as for fof
  • -
-
-

(pm.)fofSmooth

-

FOF implementation where time-varying filter parameter -noise is mitigated by lowpass filtering the filter -parameters bw and a with smooth.

-

Usage

-
_ : fofSmooth(fc,bw,sw,g,tau) : _
-
-

Where:

-
    -
  • tau: the desired smoothing time constant in seconds
  • -
  • all other parameters are same as for fof
  • -
-
-

(pm.)formantFilterFofCycle

-

Formant filter based on a single FOF filter. -Formant parameters are linearly interpolated allowing to go smoothly from -one vowel to another. A cycle of n fof filters with sample-and-hold is -used so that the fof filter parameters can be varied in realtime. -This technique is more robust but more computationally expensive than -formantFilterFofSmooth.Voice type can be -selected but must correspond to -the frequency range of the provided source to be realistic.

-

Usage

-
_ : formantFilterFofCycle(voiceType,vowel,nFormants,i,freq) : _
-
-

Where:

-
    -
  • voiceType: the voice type (0: alto, 1: bass, 2: countertenor, - 3: soprano, 4: tenor)
  • -
  • vowel: the vowel (0: a, 1: e, 2: i, 3: o, 4: u)
  • -
  • nFormants: number of formant regions in frequency domain, typically 5
  • -
  • i: formant number (i.e. 0 - 4) used to index formant data value arrays
  • -
  • freq: fundamental frequency of excitation signal. Used to calculate - rise time of envelope
  • -
-
-

(pm.)formantFilterFofSmooth

-

Formant filter based on a single FOF filter. -Formant parameters are linearly interpolated allowing to go smoothly from -one vowel to another. Fof filter parameters are lowpass filtered -to mitigate possible noise from varying them in realtime. -Voice type can be selected but must correspond to -the frequency range of the provided source to be realistic.

-

Usage

-
_ : formantFilterFofSmooth(voiceType,vowel,nFormants,i,freq) : _
-
-

Where:

-
    -
  • voiceType: the voice type (0: alto, 1: bass, 2: countertenor, - 3: soprano, 4: tenor)
  • -
  • vowel: the vowel (0: a, 1: e, 2: i, 3: o, 4: u)
  • -
  • nFormants: number of formant regions in frequency domain, typically 5
  • -
  • i: formant number (i.e. 1 - 5) used to index formant data value arrays
  • -
  • freq: fundamental frequency of excitation signal. Used to calculate - rise time of envelope
  • -
-
-

(pm.)formantFilterBP

-

Formant filter based on a single resonant bandpass filter. -Formant parameters are linearly interpolated allowing to go smoothly from -one vowel to another. Voice type can be selected but must correspond to -the frequency range of the provided source to be realistic.

-

Usage

-
_ : formantFilterBP(voiceType,vowel,nFormants,i,freq) : _
-
-

Where:

-
    -
  • voiceType: the voice type (0: alto, 1: bass, 2: countertenor, 3: soprano, 4: tenor)
  • -
  • vowel: the vowel (0: a, 1: e, 2: i, 3: o, 4: u)
  • -
  • nFormants: number of formant regions in frequency domain, typically 5
  • -
  • i: formant index used to index formant data value arrays
  • -
  • freq: fundamental frequency of excitation signal.
  • -
-
-

(pm.)formantFilterbank

-

Formant filterbank which can use different types of filterbank -functions and different excitation signals. Formant parameters are -linearly interpolated allowing to go smoothly from one vowel to another. -Voice type can be selected but must correspond to the frequency range -of the provided source to be realistic.

-

Usage

-
_ : formantFilterbank(voiceType,vowel,formantGen,freq) : _
-
-

Where:

-
    -
  • voiceType: the voice type (0: alto, 1: bass, 2: countertenor, 3: soprano, 4: tenor)
  • -
  • vowel: the vowel (0: a, 1: e, 2: i, 3: o, 4: u)
  • -
  • formantGen: the specific formant filterbank function - (i.e. FormantFilterbankBP, FormantFilterbankFof,...)
  • -
  • freq: fundamental frequency of excitation signal. Needed for FOF - version to calculate rise time of envelope
  • -
-
-

(pm.)formantFilterbankFofCycle

-

Formant filterbank based on a bank of fof filters. -Formant parameters are linearly interpolated allowing to go smoothly from -one vowel to another. Voice type can be selected but must correspond to -the frequency range of the provided source to be realistic.

-

Usage

-
_ : formantFilterbankFofCycle(voiceType,vowel,freq) : _
-
-

Where:

-
    -
  • voiceType: the voice type (0: alto, 1: bass, 2: countertenor, 3: soprano, 4: tenor)
  • -
  • vowel: the vowel (0: a, 1: e, 2: i, 3: o, 4: u)
  • -
  • freq: the fundamental frequency of the excitation signal. Needed to calculate the skirtwidth -of the FOF envelopes and for the autobendFreq and vocalEffort functions
  • -
-
-

(pm.)formantFilterbankFofSmooth

-

Formant filterbank based on a bank of fof filters. -Formant parameters are linearly interpolated allowing to go smoothly from -one vowel to another. Voice type can be selected but must correspond to -the frequency range of the provided source to be realistic.

-

Usage

-
_ : formantFilterbankFofSmooth(voiceType,vowel,freq) : _
-
-

Where:

-
    -
  • voiceType: the voice type (0: alto, 1: bass, 2: countertenor, 3: soprano, 4: tenor)
  • -
  • vowel: the vowel (0: a, 1: e, 2: i, 3: o, 4: u)
  • -
  • freq: the fundamental frequency of the excitation signal. Needed to -calculate the skirtwidth of the FOF envelopes and for the -autobendFreq and vocalEffort functions
  • -
-
-

(pm.)formantFilterbankBP

-

Formant filterbank based on a bank of resonant bandpass filters. -Formant parameters are linearly interpolated allowing to go smoothly from -one vowel to another. Voice type can be selected but must correspond to -the frequency range of the provided source to be realistic.

-

Usage

-
_ : formantFilterbankBP(voiceType,vowel,freq) : _
-
-

Where:

-
    -
  • voiceType: the voice type (0: alto, 1: bass, 2: countertenor, 3: soprano, 4: tenor)
  • -
  • vowel: the vowel (0: a, 1: e, 2: i, 3: o, 4: u)
  • -
  • freq: the fundamental frequency of the excitation signal. Needed for the autobendFreq and vocalEffort functions
  • -
-
-

(pm.)SFFormantModel

-

Simple formant/vocal synthesizer based on a source/filter model. The source -and filterbank must be specified by the user. filterbank must take the same -input parameters as formantFilterbank (BP/FofCycle -/FofSmooth). -Formant parameters are linearly interpolated allowing to go smoothly from -one vowel to another. Voice type can be selected but must correspond to -the frequency range of the synthesized voice to be realistic.

-

Usage

-
SFFormantModel(voiceType,vowel,exType,freq,gain,source,filterbank,isFof) : _
-
-

Where:

-
    -
  • voiceType: the voice type (0: alto, 1: bass, 2: countertenor, 3: soprano, 4: tenor)
  • -
  • vowel: the vowel (0: a, 1: e, 2: i, 3: o, 4: u
  • -
  • exType: voice vs. fricative sound ratio (0-1 where 1 is 100% fricative)
  • -
  • freq: the fundamental frequency of the source signal
  • -
  • gain: linear gain multiplier to multiply the source by
  • -
  • isFof: whether model is FOF based (0: no, 1: yes)
  • -
-
-

(pm.)SFFormantModelFofCycle

-

Simple formant/vocal synthesizer based on a source/filter model. The source -is just a periodic impulse and the "filter" is a bank of FOF filters. -Formant parameters are linearly interpolated allowing to go smoothly from -one vowel to another. Voice type can be selected but must correspond to -the frequency range of the synthesized voice to be realistic. This model -does not work with noise in the source signal so exType has been removed -and model does not depend on SFFormantModel function.

-

Usage

-
SFFormantModelFofCycle(voiceType,vowel,freq,gain) : _
-
-

Where:

-
    -
  • voiceType: the voice type (0: alto, 1: bass, 2: countertenor, 3: soprano, 4: tenor)
  • -
  • vowel: the vowel (0: a, 1: e, 2: i, 3: o, 4: u
  • -
  • freq: the fundamental frequency of the source signal
  • -
  • gain: linear gain multiplier to multiply the source by
  • -
-
-

(pm.)SFFormantModelFofSmooth

-

Simple formant/vocal synthesizer based on a source/filter model. The source -is just a periodic impulse and the "filter" is a bank of FOF filters. -Formant parameters are linearly interpolated allowing to go smoothly from -one vowel to another. Voice type can be selected but must correspond to -the frequency range of the synthesized voice to be realistic.

-

Usage

-
SFFormantModelFofSmooth(voiceType,vowel,freq,gain) : _
-
-

Where:

-
    -
  • voiceType: the voice type (0: alto, 1: bass, 2: countertenor, 3: soprano, 4: tenor)
  • -
  • vowel: the vowel (0: a, 1: e, 2: i, 3: o, 4: u
  • -
  • freq: the fundamental frequency of the source signal
  • -
  • gain: linear gain multiplier to multiply the source by
  • -
-
-

(pm.)SFFormantModelBP

-

Simple formant/vocal synthesizer based on a source/filter model. The source -is just a sawtooth wave and the "filter" is a bank of resonant bandpass filters. -Formant parameters are linearly interpolated allowing to go smoothly from -one vowel to another. Voice type can be selected but must correspond to -the frequency range of the synthesized voice to be realistic.

-

The formant data used here come from the CSOUND manual -* http://www.csounds.com/manual/html/.

-

Usage

-
SFFormantModelBP(voiceType,vowel,exType,freq,gain) : _
-
-

Where:

-
    -
  • voiceType: the voice type (0: alto, 1: bass, 2: countertenor, 3: soprano, 4: tenor)
  • -
  • vowel: the vowel (0: a, 1: e, 2: i, 3: o, 4: u
  • -
  • exType: voice vs. fricative sound ratio (0-1 where 1 is 100% fricative)
  • -
  • freq: the fundamental frequency of the source signal
  • -
  • gain: linear gain multiplier to multiply the source by
  • -
-
-

(pm.)SFFormantModelFofCycle_ui

-

Ready-to-use source-filter vocal synthesizer with built-in user interface.

-

Usage

-
SFFormantModelFofCycle_ui : _
-
-
-

(pm.)SFFormantModelFofSmooth_ui

-

Ready-to-use source-filter vocal synthesizer with built-in user interface.

-

Usage

-
SFFormantModelFofSmooth_ui : _
-
-
-

(pm.)SFFormantModelBP_ui

-

Ready-to-use source-filter vocal synthesizer with built-in user interface.

-

Usage

-
SFFormantModelBP_ui : _
-
-
-

(pm.)SFFormantModelFofCycle_ui_MIDI

-

Ready-to-use MIDI-controllable source-filter vocal synthesizer.

-

Usage

-
SFFormantModelFofCycle_ui_MIDI : _
-
-
-

(pm.)SFFormantModelFofSmooth_ui_MIDI

-

Ready-to-use MIDI-controllable source-filter vocal synthesizer.

-

Usage

-
SFFormantModelFofSmooth_ui_MIDI : _
-
-
-

(pm.)SFFormantModelBP_ui_MIDI

-

Ready-to-use MIDI-controllable source-filter vocal synthesizer.

-

Usage

-
SFFormantModelBP_ui_MIDI : _
-
-

Misc Functions

-

Various miscellaneous functions.

-
-

(pm.)allpassNL

-

Bidirectional block adding nonlinearities in both directions in a chain. -Nonlinearities are created by modulating the coefficients of a passive -allpass filter by the signal it is processing.

-

Usage

-
chain(... : allpassNL(nonlinearity) : ...)
-
-

Where:

-
    -
  • nonlinearity: amount of nonlinearity to be added (0-1)
  • -
-
-

(pm).modalModel

-

Implement multiple resonance modes using resonant bandpass filters.

-

Usage

-
_ : modalModel(n, freqs, t60s, gains) : _
-
-

Where:

-
    -
  • n: number of given modes
  • -
  • freqs : list of filter center freqencies
  • -
  • t60s : list of mode resonance durations (in seconds)
  • -
  • gains : list of mode gains (0-1)
  • -
-

For example, to generate a model with 2 modes (440 Hz and 660 Hz, a -fifth) where the higher one decays faster and is attenuated:

-
os.impulse : modalModel(2, (440, 660),
-                           (0.5, 0.25),
-                           (ba.db2linear(-1), ba.db2linear(-6)) : _
-
-

Further reading: Grumiaux et. al., 2017: -Impulse-Response and CAD-Model-Based Physical Modeling in -Faust

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/physmodels.lib/overview/index.html b/docs/contributors/faust/physmodels.lib/overview/index.html deleted file mode 100644 index e224b8e..0000000 --- a/docs/contributors/faust/physmodels.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - physmodels.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

physmodels.lib Documentation

-

Welcome to the documentation for physmodels.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.1.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/platform.lib/1.3.0/doc/index.html b/docs/contributors/faust/platform.lib/1.3.0/doc/index.html deleted file mode 100644 index 3c92121..0000000 --- a/docs/contributors/faust/platform.lib/1.3.0/doc/index.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - - - - - platform.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

platform.lib

-

A library to handle platform specific code in Faust. Its official prefix is pl.

-

References

- -
-

(pl.)SR

-

Current sampling rate (between 1 and 192000Hz). Constant during -program execution. Setting this value to a constant will allow the -compiler to optimize the code by computing constant expressions at -compile time, and can be valuable for performance, especially on -embedded systems.

-
-

(pl.)BS

-

Current block-size (between 1 and 16384 frames). Can change during the execution.

-
-

(pl.)tablesize

-

Oscillator table size. This value is used to define the size of the -table used by the oscillators. It is usually a power of 2 and can be lowered -to save memory. The default value is 65536.

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/platform.lib/overview/index.html b/docs/contributors/faust/platform.lib/overview/index.html deleted file mode 100644 index 1667c43..0000000 --- a/docs/contributors/faust/platform.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - platform.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

platform.lib Documentation

-

Welcome to the documentation for platform.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.3.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/quantizers.lib/1.1.0/doc/index.html b/docs/contributors/faust/quantizers.lib/1.1.0/doc/index.html deleted file mode 100644 index cf44ab8..0000000 --- a/docs/contributors/faust/quantizers.lib/1.1.0/doc/index.html +++ /dev/null @@ -1,418 +0,0 @@ - - - - - - - - - - - quantizers.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

quantizers.lib

-

Faust Frequency Quantization Library. Its official prefix is qu.

-

References

- -

Functions Reference

-
-

(qu.)quantize

-

Configurable frequency quantization tool. Output only the frequencies that are part of the specified scale. -Works for positive audio frequencies.

-

Usage

-
_ : quantize(rf,nl) : _
-
-

Where :

-
    -
  • rf : frequency of the root note of the scale
  • -
  • nl : list of the ratio of the frequencies of each note in relation to the root frequency
  • -
-
-

(qu.)quantizeSmoothed

-

Configurable frequency quantization tool. Output frequencies that are closer to the frequencies of the specified scale notes. -Works for positive audio frequencies.

-

Usage

-
_ : quantizeSmoothed(rf,nl) : _
-nl = (1,1.2,1.4,1.7);
-
-

Where :

-
    -
  • rf : frequency of the root note of the scale
  • -
  • nl : list of the ratio of the frequencies of each note in relation to the root frequency
  • -
-
-

(qu.)ionian

-

List of the frequency ratios of the notes of the ionian mode.

-

Usage

-
_ : quantize(rf,ionian) : _
-
-

Where:

-
    -
  • rf: frequency of the root note of the scale
  • -
-
-

(qu.)dorian

-

List of the frequency ratios of the notes of the dorian mode.

-

Usage

-
_ : quantize(rf,dorian) : _
-
-

Where:

-
    -
  • rf: frequency of the root note of the scale
  • -
-
-

(qu.)phrygian

-

List of the frequency ratios of the notes of the phrygian mode.

-

Usage

-
_ : quantize(rf,phrygian) : _
-
-

Where:

-
    -
  • rf: frequency of the root note of the scale
  • -
-
-

(qu.)lydian

-

List of the frequency ratios of the notes of the lydian mode.

-

Usage

-
_ : quantize(rf,lydian) : _
-
-

Where:

-
    -
  • rf: frequency of the root note of the scale
  • -
-
-

(qu.)mixo

-

List of the frequency ratios of the notes of the mixolydian mode.

-

Usage

-
_ : quantize(rf,mixo) : _
-
-

Where:

-
    -
  • rf: frequency of the root note of the scale
  • -
-
-

(qu.)eolian

-

List of the frequency ratios of the notes of the eolian mode.

-

Usage

-
_ : quantize(rf,eolian) : _
-
-

Where:

-
    -
  • rf: frequency of the root note of the scale
  • -
-
-

(qu.)locrian

-

List of the frequency ratios of the notes of the locrian mode.

-

Usage

-
_ : quantize(rf,locrian) : _
-
-

Where:

-
    -
  • rf: frequency of the root note of the scale
  • -
-
-

(qu.)pentanat

-

List of the frequency ratios of the notes of the pythagorean tuning for the minor pentatonic scale.

-

Usage

-
_ : quantize(rf,pentanat) : _
-
-

Where:

-
    -
  • rf: frequency of the root note of the scale
  • -
-
-

(qu.)kumoi

-

List of the frequency ratios of the notes of the kumoijoshi, the japanese pentatonic scale.

-

Usage

-
_ : quantize(rf,kumoi) : _
-
-

Where:

-
    -
  • rf: frequency of the root note of the scale
  • -
-
-

(qu.)natural

-

List of the frequency ratios of the notes of the natural major scale.

-

Usage

-
_ : quantize(rf,natural) : _
-
-

Where:

-
    -
  • rf: frequency of the root note of the scale
  • -
-
-

(qu.)dodeca

-

List of the frequency ratios of the notes of the dodecaphonic scale.

-

Usage

-
_ : quantize(rf,dodeca) : _
-
-

Where:

-
    -
  • rf: frequency of the root note of the scale
  • -
-
-

(qu.)dimin

-

List of the frequency ratios of the notes of the diminished scale.

-

Usage

-
_ : quantize(rf,dimin) : _
-
-

Where:

-
    -
  • rf: frequency of the root note of the scale
  • -
-
-

(qu.)penta

-

List of the frequency ratios of the notes of the minor pentatonic scale.

-

Usage

-
_ : quantize(rf,penta) : _
-
-

Where:

-
    -
  • rf: frequency of the root note of the scale
  • -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/quantizers.lib/overview/index.html b/docs/contributors/faust/quantizers.lib/overview/index.html deleted file mode 100644 index 672e1e4..0000000 --- a/docs/contributors/faust/quantizers.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - quantizers.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

quantizers.lib Documentation

-

Welcome to the documentation for quantizers.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.1.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/reducemaps.lib/1.2.0/doc/index.html b/docs/contributors/faust/reducemaps.lib/1.2.0/doc/index.html deleted file mode 100644 index 3e87a7a..0000000 --- a/docs/contributors/faust/reducemaps.lib/1.2.0/doc/index.html +++ /dev/null @@ -1,325 +0,0 @@ - - - - - - - - - - - reducemaps.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

reducemaps.lib

-

A library providing reduce/map operations in Faust. Its official prefix is -rm. The basic idea behind reduce operations is to combine several values -into a single one by repeatedly applying a binary operation. A typical -example is finding the maximum of a set of values by repeatedly applying the -binary operation max.

-

In this reducemaps library, you'll find two types of reduce, depending on -whether you want to reduce n consecutive samples of the same signal or a set -of n parallel signals.

-

References

- -
-

(rm.)parReduce

-

parReduce(op,N) combines a set of N parallel signals into a single one -using a binary operation op.

-

With parReduce, this reduction process simultaneously occurs on each half -of the incoming signals. In other words, parReduce(max,256) is equivalent -to parReduce(max,128),parReduce(max,128) : max.

-

To be used with parReduce, binary operation op must be associative. -Additionally, the concept of a binary operation extends to operations -that have 2*n inputs and n outputs. For example, complex signals can be -simulated using two signals for the real and imaginary parts. In -such case, a binary operation would have 4 inputs and 2 outputs.

-

Please note also that parReduce is faster than topReduce or botReduce -for large number of signals. It is therefore the recommended operation -whenever op is associative.

-

Usage

-
_,...,_ : parReduce(op, N) : _
-
-

Where:

-
    -
  • op: is a binary operation
  • -
  • N: is the number of incomming signals (N>0). We use a capital letter -here to indicate that the number of incomming signals must be constant and -known at compile time.
  • -
-
-

(rm.)topReduce

-

topReduce(op,N) involves combining a set of N parallel signals into a -single one using a binary operation op. With topReduce, the reduction -process starts from the top two incoming signals, down to the bottom. In -other words, topReduce(max,256) is equivalent to topReduce(max,255),_ : max.

-

Contrary to parReduce, the binary operation op doesn't have to be -associative here. Like with parReduce the concept of a binary operation can be -extended to operations that have 2*n inputs and n outputs. For example, -complex signals can be simulated using two signals representing the real and -imaginary parts. In such cases, a binary operation would have 4 inputs and 2 -outputs.

-

Usage

-
 _,...,_ : topReduce(op, N) : _
-
-

Where:

-
    -
  • op: is a binary operation
  • -
  • N: is the number of incomming signals (N>0). We use a capital letter -here to indicate that the number of incomming signals must be constant and -known at compile time.
  • -
-
-

(rm.)botReduce

-

botReduce(op,N) combines a set of N parallel signals into a single one -using a binary operation op. With botReduce, the reduction process starts -from the bottom two incoming signals, up to the top. In other words, -botReduce(max,256) is equivalent to _,botReduce(max,255): max.

-

Contrary to parReduce, the binary operation op doesn't have to be -associative here. Like with parReduce the concept of a binary operation can be -extended to operations that have 2*n inputs and n outputs. For example, -complex signals can be simulated using two signals representing the real and -imaginary parts. In such cases, a binary operation would have 4 inputs and 2 -outputs.

-

Usage

-
 _,...,_ : botReduce(op, N) : _
-
-

Where:

-
    -
  • op: is a binary operation
  • -
  • N: is the number of incomming signals (N>0). We use a capital letter -here to indicate that the number of incomming signals must be constant and -known at compile time.
  • -
-
-

(rm.)reduce

-

Reduce a block of n consecutive samples of the incomming signal using a -binary operation op. For example: reduce(max,128) will compute the -maximun value of each block of 128 samples. Please note that the resulting -value, while computed continuously, will be constant for the duration of a -block. A new value is only produced at the end of a block. Note also that -blocks should be of at least one sample (n>0).

-

Usage

-
_ : reduce(op, n) : _
-
-

Where:

-
    -
  • op: is a binary operation
  • -
  • n: is the number of consecutive samples in a block.
  • -
-
-

(rm.)reducemap

-

Like reduce but a foo function is applied to the result. From -a mathematical point of view: -reducemap(op,foo,n) is equivalent to reduce(op,n):foo -but more efficient.

-

Usage

-
_ : reducemap(op, foo, n) : _
-
-

Where:

-
    -
  • op: is a binary operation
  • -
  • foo: is a function applied to the result of the reduction
  • -
  • n: is the number of consecutive samples in a block.
  • -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/reducemaps.lib/overview/index.html b/docs/contributors/faust/reducemaps.lib/overview/index.html deleted file mode 100644 index 442c0fd..0000000 --- a/docs/contributors/faust/reducemaps.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - reducemaps.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

reducemaps.lib Documentation

-

Welcome to the documentation for reducemaps.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.2.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/reverbs.lib/1.3.0/doc/index.html b/docs/contributors/faust/reverbs.lib/1.3.0/doc/index.html deleted file mode 100644 index f8a5737..0000000 --- a/docs/contributors/faust/reverbs.lib/1.3.0/doc/index.html +++ /dev/null @@ -1,518 +0,0 @@ - - - - - - - - - - - reverbs.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
- -
- -

reverbs.lib

-

A library of reverb effects. Its official prefix is re.

-

References

- -

Schroeder Reverberators

-
-

(re.)jcrev

-

This artificial reverberator take a mono signal and output stereo -(satrev) and quad (jcrev). They were implemented by John Chowning -in the MUS10 computer-music language (descended from Music V by Max -Mathews). They are Schroeder Reverberators, well tuned for their size. -Nowadays, the more expensive freeverb is more commonly used (see the -Faust examples directory).

-

jcrev reverb below was made from a listing of "RV", dated April 14, 1972, -which was recovered from an old SAIL DART backup tape. -John Chowning thinks this might be the one that became the -well known and often copied JCREV.

-

jcrev is a standard Faust function.

-

Usage

-
_ : jcrev : _,_,_,_
-
-
-

(re.)satrev

-

This artificial reverberator take a mono signal and output stereo -(satrev) and quad (jcrev). They were implemented by John Chowning -in the MUS10 computer-music language (descended from Music V by Max -Mathews). They are Schroeder Reverberators, well tuned for their size. -Nowadays, the more expensive freeverb is more commonly used (see the -Faust examples directory).

-

satrev was made from a listing of "SATREV", dated May 15, 1971, -which was recovered from an old SAIL DART backup tape. -John Chowning thinks this might be the one used on his -often-heard brass canon sound examples, one of which can be found at -* https://ccrma.stanford.edu/~jos/wav/FM-BrassCanon2.wav.

-

Usage

-
_ : satrev : _,_
-
-

Feedback Delay Network (FDN) Reverberators

-
-

(re.)fdnrev0

-

Pure Feedback Delay Network Reverberator (generalized for easy scaling). -fdnrev0 is a standard Faust function.

-

Usage

-
<1,2,4,...,N signals> <:
-fdnrev0(MAXDELAY,delays,BBSO,freqs,durs,loopgainmax,nonl) :>
-<1,2,4,...,N signals>
-
-

Where:

-
    -
  • N: 2, 4, 8, ... (power of 2)
  • -
  • MAXDELAY: power of 2 at least as large as longest delay-line length
  • -
  • delays: N delay lines, N a power of 2, lengths preferably coprime
  • -
  • BBSO: odd positive integer = order of bandsplit desired at freqs
  • -
  • freqs: NB-1 crossover frequencies separating desired frequency bands
  • -
  • durs: NB decay times (t60) desired for the various bands
  • -
  • loopgainmax: scalar gain between 0 and 1 used to "squelch" the reverb
  • -
  • nonl: nonlinearity (0 to 0.999..., 0 being linear)
  • -
-

Reference

- -
-

(re.)zita_rev_fdn

-

Internal 8x8 late-reverberation FDN used in the FOSS Linux reverb zita-rev1 -by Fons Adriaensen fons@linuxaudio.org. This is an FDN reverb with -allpass comb filters in each feedback delay in addition to the -damping filters.

-

Usage

-
si.bus(8) : zita_rev_fdn(f1,f2,t60dc,t60m,fsmax) : si.bus(8)
-
-

Where:

-
    -
  • f1: crossover frequency (Hz) separating dc and midrange frequencies
  • -
  • f2: frequency (Hz) above f1 where T60 = t60m/2 (see below)
  • -
  • t60dc: desired decay time (t60) at frequency 0 (sec)
  • -
  • t60m: desired decay time (t60) at midrange frequencies (sec)
  • -
  • fsmax: maximum sampling rate to be used (Hz)
  • -
-

Reference

- -
-

(re.)zita_rev1_stereo

-

Extend zita_rev_fdn to include zita_rev1 input/output mapping in stereo mode. -zita_rev1_stereo is a standard Faust function.

-

Usage

-
_,_ : zita_rev1_stereo(rdel,f1,f2,t60dc,t60m,fsmax) : _,_
-
-

Where:

-

rdel = delay (in ms) before reverberation begins (e.g., 0 to ~100 ms) -(remaining args and refs as for zita_rev_fdn above)

-
-

(re.)zita_rev1_ambi

-

Extend zita_rev_fdn to include zita_rev1 input/output mapping in -"ambisonics mode", as provided in the Linux C++ version.

-

Usage

-
_,_ : zita_rev1_ambi(rgxyz,rdel,f1,f2,t60dc,t60m,fsmax) : _,_,_,_
-
-

Where:

-

rgxyz = relative gain of lanes 1,4,2 to lane 0 in output (e.g., -9 to 9) - (remaining args and references as for zita_rev1_stereo above)

-
-

(re.)vital_rev

-

A port of the reverb from the Vital synthesizer. All input parameters -have been normalized to a continuous [0,1] range, making them easy to modulate. -The scaling of the parameters happens inside the function.

-

Usage

-
_,_ : vital_rev(prelow, prehigh, lowcutoff, highcutoff, lowgain, highgain, chorus_amt, chorus_freq, predelay, time, size, mix) : _,_ 
-
-

Where:

-
    -
  • prelow: In the pre-filter, this is the cutoff frequency of a high-pass filter (hence a low value).
  • -
  • prehigh: In the pre-filter, this is the cutoff frequency of a low-pass filter (hence a high value).
  • -
  • lowcutoff: In the feedback filter stage, this is the cutoff frequency of a low-shelf filter.
  • -
  • highcutoff: In the feedback filter stage, this is the cutoff frequency of a high-shelf filter.
  • -
  • lowgain: In the feedback filter stage, this is the gain of a low-shelf filter.
  • -
  • highgain: In the feedback filter stage, this is the gain of a high-shelf filter.
  • -
  • chorus_amt: The amount of chorus modulation in the main delay lines.
  • -
  • chorus_freq: The LFO rate of chorus modulation in the main delay lines.
  • -
  • predelay: The amount of pre-delay time.
  • -
  • time: The decay time of the reverb.
  • -
  • size: The size of the room.
  • -
  • mix: A wetness value to use in a final dry/wet mixer.
  • -
-

Freeverb

-
-

(re.)mono_freeverb

-

A simple Schroeder reverberator primarily developed by "Jezar at Dreampoint" that -is extensively used in the free-software world. It uses four Schroeder allpasses in -series and eight parallel Schroeder-Moorer filtered-feedback comb-filters for each -audio channel, and is said to be especially well tuned.

-

mono_freeverb is a standard Faust function.

-

Usage

-
_ : mono_freeverb(fb1, fb2, damp, spread) : _
-
-

Where:

-
    -
  • fb1: coefficient of the lowpass comb filters (0-1)
  • -
  • fb2: coefficient of the allpass comb filters (0-1)
  • -
  • damp: damping of the lowpass comb filter (0-1)
  • -
  • spread: spatial spread in number of samples (for stereo)
  • -
-

License

-

While this version is licensed LGPL (with exception) along with other GRAME -library functions, the file freeverb.dsp in the examples directory of older -Faust distributions, such as faust-0.9.85, was released under the BSD license, -which is less restrictive.

-
-

(re.)stereo_freeverb

-

A simple Schroeder reverberator primarily developed by "Jezar at Dreampoint" that -is extensively used in the free-software world. It uses four Schroeder allpasses in -series and eight parallel Schroeder-Moorer filtered-feedback comb-filters for each -audio channel, and is said to be especially well tuned.

-

Usage

-
_,_ : stereo_freeverb(fb1, fb2, damp, spread) : _,_
-
-

Where:

-
    -
  • fb1: coefficient of the lowpass comb filters (0-1)
  • -
  • fb2: coefficient of the allpass comb filters (0-1)
  • -
  • damp: damping of the lowpass comb filter (0-1)
  • -
  • spread: spatial spread in number of samples (for stereo)
  • -
-

Dattorro Reverb

-
-

(re.)dattorro_rev

-

Reverberator based on the Dattorro reverb topology. This implementation does -not use modulated delay lengths (excursion).

-

Usage

-
_,_ : dattorro_rev(pre_delay, bw, i_diff1, i_diff2, decay, d_diff1, d_diff2, damping) : _,_
-
-

Where:

-
    -
  • pre_delay: pre-delay in samples (fixed at compile time)
  • -
  • bw: band-width filter (pre filtering); (0 - 1)
  • -
  • i_diff1: input diffusion factor 1; (0 - 1)
  • -
  • i_diff2: input diffusion factor 2;
  • -
  • decay: decay rate; (0 - 1); infinite decay = 1.0
  • -
  • d_diff1: decay diffusion factor 1; (0 - 1)
  • -
  • d_diff2: decay diffusion factor 2;
  • -
  • damping: high-frequency damping; no damping = 0.0
  • -
-

Reference

- -
-

(re.)dattorro_rev_default

-

Reverberator based on the Dattorro reverb topology with reverb parameters from the -original paper. -This implementation does not use modulated delay lengths (excursion) and -uses zero length pre-delay.

-

Usage

-
_,_ : dattorro_rev_default : _,_
-
-

Reference

- -

JPverb and Greyhole Reverbs

-
-

(re.)jpverb

-

An algorithmic reverb (stereo in/out), inspired by the lush chorused sound -of certain vintage Lexicon and Alesis reverberation units. -Designed to sound great with synthetic sound sources, rather than sound like a realistic space.

-

Usage

-
_,_ : jpverb(t60, damp, size, early_diff, mod_depth, mod_freq, low, mid, high, low_cutoff, high_cutoff) : _,_
-
-

Where:

-
    -
  • t60: approximate reverberation time in seconds ([0.1..60] sec) (T60 - the time for the reverb to decay by 60db when damp == 0 ). Does not effect early reflections
  • -
  • damp: controls damping of high-frequencies as the reverb decays. 0 is no damping, 1 is very strong damping. Values should be in the range ([0..1])
  • -
  • size: scales size of delay-lines within the reverberator, producing the impression of a larger or smaller space. Values below 1 can sound metallic. Values should be in the range [0.5..5]
  • -
  • early_diff: controls shape of early reflections. Values of 0.707 or more produce smooth exponential decay. Lower values produce a slower build-up of echoes. Values should be in the range ([0..1])
  • -
  • mod_depth: depth ([0..1]) of delay-line modulation. Use in combination with mod_freq to set amount of chorusing within the structure
  • -
  • mod_freq: frequency ([0..10] Hz) of delay-line modulation. Use in combination with mod_depth to set amount of chorusing within the structure
  • -
  • low: multiplier ([0..1]) for the reverberation time within the low band
  • -
  • mid: multiplier ([0..1]) for the reverberation time within the mid band
  • -
  • high: multiplier ([0..1]) for the reverberation time within the high band
  • -
  • low_cutoff: frequency (100..6000 Hz) at which the crossover between the low and mid bands of the reverb occurs
  • -
  • high_cutoff: frequency (1000..10000 Hz) at which the crossover between the mid and high bands of the reverb occurs
  • -
-

Reference

- -
-

(re.)greyhole

-

A complex echo-like effect (stereo in/out), inspired by the classic Eventide effect of a similar name. -The effect consists of a diffuser (like a mini-reverb, structurally similar to the one used in jpverb) -connected in a feedback system with a long, modulated delay-line. -Excels at producing spacey washes of sound.

-

Usage

-
_,_ : greyhole(dt, damp, size, early_diff, feedback, mod_depth, mod_freq) : _,_
-
-

Where:

-
    -
  • dt: approximate reverberation time in seconds ([0.1..60 sec])
  • -
  • damp: controls damping of high-frequencies as the reverb decays. 0 is no damping, 1 is very strong damping. Values should be between ([0..1])
  • -
  • size: control of relative "room size" roughly in the range ([0.5..3])
  • -
  • early_diff: controls pattern of echoes produced by the diffuser. At very low values, the diffuser acts like a delay-line whose length is controlled by the 'size' parameter. Medium values produce a slow build-up of echoes, giving the sound a reversed-like quality. Values of 0.707 or greater than produce smooth exponentially decaying echoes. Values should be in the range ([0..1])
  • -
  • feedback: amount of feedback through the system. Sets the number of repeating echoes. A setting of 1.0 produces infinite sustain. Values should be in the range ([0..1])
  • -
  • mod_depth: depth ([0..1]) of delay-line modulation. Use in combination with mod_freq to produce chorus and pitch-variations in the echoes
  • -
  • mod_freq: frequency ([0..10] Hz) of delay-line modulation. Use in combination with mod_depth to produce chorus and pitch-variations in the echoes
  • -
-

Reference

-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/reverbs.lib/overview/index.html b/docs/contributors/faust/reverbs.lib/overview/index.html deleted file mode 100644 index 76111b1..0000000 --- a/docs/contributors/faust/reverbs.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - reverbs.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

reverbs.lib Documentation

-

Welcome to the documentation for reverbs.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.3.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/routes.lib/1.2.0/doc/index.html b/docs/contributors/faust/routes.lib/1.2.0/doc/index.html deleted file mode 100644 index 68cf54a..0000000 --- a/docs/contributors/faust/routes.lib/1.2.0/doc/index.html +++ /dev/null @@ -1,372 +0,0 @@ - - - - - - - - - - - routes.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

routes.lib

-

A library to handle signal routing in Faust. Its official prefix is ro.

-

References

- -

Functions Reference

-
-

(ro.)cross

-

Cross N signals: (x1,x2,..,xn) -> (xn,..,x2,x1). -cross is a standard Faust function.

-

Usage

-
cross(N)
-_,_,_ : cross(3) : _,_,_
-
-

Where:

-
    -
  • N: number of signals (int, as a constant numerical expression)
  • -
-

Note

-

Special case: cross2:

-
cross2 = _,cross(2),_;
-
-
-

(ro.)crossnn

-

Cross two bus(N)s.

-

Usage

-
(si.bus(2*N)) : crossnn(N) : (si.bus(2*N))
-
-

Where:

-
    -
  • N: the number of signals in the bus (int, as a constant numerical expression)
  • -
-
-

(ro.)crossn1

-

Cross bus(N) and bus(1).

-

Usage

-
(si.bus(N),_) : crossn1(N) : (_,si.bus(N))
-
-

Where:

-
    -
  • N: the number of signals in the first bus (int, as a constant numerical expression)
  • -
-
-

(ro.)cross1n

-

Cross bus(1) and bus(N).

-

Usage

-
(_,si.bus(N)) : crossn1(N) : (si.bus(N),_)
-
-

Where:

-
    -
  • N: the number of signals in the second bus (int, as a constant numerical expression)
  • -
-
-

(ro.)crossNM

-

Cross bus(N) and bus(M).

-

Usage

-
(si.bus(N),si.bus(M)) : crossNM(N,M) : (si.bus(M),si.bus(N))
-
-

Where:

-
    -
  • N: the number of signals in the first bus (int, as a constant numerical expression)
  • -
  • M: the number of signals in the second bus (int, as a constant numerical expression)
  • -
-
-

(ro.)interleave

-

Interleave R x C cables from column order to row order. -input : x(0), x(1), x(2) ..., x(rowcol-1) -output: x(0+0row), x(0+1row), x(0+2row), ..., x(1+0row), x(1+1row), x(1+2*row), ...

-

Usage

-
si.bus(R*C) : interleave(R,C) : si.bus(R*C)
-
-

Where:

-
    -
  • R: the number of row (int, as a constant numerical expression)
  • -
  • C: the number of column (int, as a constant numerical expression)
  • -
-
-

(ro.)butterfly

-

Addition (first half) then substraction (second half) of interleaved signals.

-

Usage

-
si.bus(N) : butterfly(N) : si.bus(N)
-
-

Where:

-
    -
  • N: size of the butterfly (N is int, even and as a constant numerical expression)
  • -
-
-

(ro.)hadamard

-

Hadamard matrix function of size N = 2^k.

-

Usage

-
si.bus(N) : hadamard(N) : si.bus(N)
-
-

Where:

-
    -
  • N: 2^k, size of the matrix (int, as a constant numerical expression)
  • -
-
-

(ro.)recursivize

-

Create a recursion from two arbitrary processors p and q.

-

Usage

-
_,_ : recursivize(p,q) : _,_
-
-
-

Where:

-
    -
  • p: the forward arbitrary processor
  • -
  • q: the feedback arbitrary processor
  • -
-
-

(ro.)bubbleSort

-

Sort a set of N parallel signals in ascending order on-the-fly through -the Bubble Sort algorithm.

-

Mechanism: having a set of N parallel signals indexed from 0 to N - 1, -compare the first pair of signals and swap them if sig[0] > sig[1]; -repeat the pair comparison for the signals sig[1] and sig[2], then again -recursively until reaching the signals sig[N - 2] and sig[N - 1]; by the end, -the largest element in the set will be placed last; repeat the process for -the remaining N - 1 signals until there is a single pair left.

-

Note that this implementation will always perform the worst-case -computation, O(n^2).

-

Even though the Bubble Sort algorithm is one of the least efficient ones, -it is a useful example of how automatic sorting can be implemented at the -signal level.

-

Usage

-
si.bus(N) : bubbleSort(N) : si.bus(N)
-
-
-

Where:

-
    -
  • N: the number of signals to be sorted (must be an int >= 0, as a constant numerical expression)
  • -
-

Reference

-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/routes.lib/overview/index.html b/docs/contributors/faust/routes.lib/overview/index.html deleted file mode 100644 index 75eaff3..0000000 --- a/docs/contributors/faust/routes.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - routes.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

routes.lib Documentation

-

Welcome to the documentation for routes.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.2.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/sf.lib/1.0.0/doc/index.html b/docs/contributors/faust/sf.lib/1.0.0/doc/index.html deleted file mode 100644 index b23e0c2..0000000 --- a/docs/contributors/faust/sf.lib/1.0.0/doc/index.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - Doc - Faust Libraries - - - - - - - - - - - - - - - - -
-
- -
- -
-

use old library prefixes using old libraries

-
-

use old library prefixes using new libraries

-
-

new library prefixes

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/sf.lib/overview/index.html b/docs/contributors/faust/sf.lib/overview/index.html deleted file mode 100644 index 9c159f9..0000000 --- a/docs/contributors/faust/sf.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - sf.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

sf.lib Documentation

-

Welcome to the documentation for sf.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.0.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/signals.lib/1.6.0/doc/index.html b/docs/contributors/faust/signals.lib/1.6.0/doc/index.html deleted file mode 100644 index a584470..0000000 --- a/docs/contributors/faust/signals.lib/1.6.0/doc/index.html +++ /dev/null @@ -1,617 +0,0 @@ - - - - - - - - - - - signals.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

signals.lib

-

A library of basic elements to handle signals in Faust. Its official prefix is si.

-

References

- -

Functions Reference

-
-

(si.)bus

-

Put N cables in parallel. -bus is a standard Faust function.

-

Usage

-
bus(N)
-bus(4) : _,_,_,_
-
-

Where:

-
    -
  • N: is an integer known at compile time that indicates the number of parallel cables
  • -
-
-

(si.)block

-

Block - terminate N signals. -block is a standard Faust function.

-

Usage

-
si.bus(N) : block(N)
-
-

Where:

-
    -
  • N: the number of signals to be blocked known at compile time
  • -
-
-

(si.)interpolate

-

Linear interpolation between two signals.

-

Usage

-
_,_ : interpolate(i) : _
-
-

Where:

-
    -
  • i: interpolation control between 0 and 1 (0: first input; 1: second input)
  • -
-
-

(si.)repeat

-

Repeat an effect N time(s) and take the parallel sum of all -intermediate buses.

-

References

- -

Usage

-
si.bus(inputs(FX)) : repeat(N, FX) : si.bus(outputs(FX))
-
-

Where:

-
    -
  • N: Number of repetitions, minimum of 1, a constant numerical expression
  • -
  • FX: an arbitrary effect (N inputs and N outputs) that will be repeated
  • -
-

Example 1:

-
process = repeat(2, dm.zita_light) : _*.5,_*.5;
-
-

Example 2:

-
N = 4;
-C = 2;
-fx(i) = i+1, par(j, C, @(i*5000));
-process = 0, si.bus(C) : repeat(N, fx) : !, par(i, C, _*.2/N);
-
-
-

(si.)smoo

-

Smoothing function based on smooth ideal to smooth UI signals -(sliders, etc.) down. Approximately, this is a 7 Hz one-pole -low-pass considering the coefficient calculation: - exp(-2pi*CF/SR).

-

smoo is a standard Faust function.

-

Usage

-
hslider(...) : smoo;
-
-
-

(si.)polySmooth

-

A smoothing function based on smooth that doesn't smooth when a -trigger signal is given. This is very useful when making -polyphonic synthesizer to make sure that the value of the parameter -is the right one when the note is started.

-

Usage

-
hslider(...) : polySmooth(g,s,d) : _
-
-

Where:

-
    -
  • g: the gate/trigger signal used when making polyphonic synths
  • -
  • s: the smoothness (see smooth)
  • -
  • d: the number of samples to wait before the signal start being - smoothed after g switched to 1
  • -
-
-

(si.)smoothAndH

-

A smoothing function based on smooth that holds its output -signal when a trigger is sent to it. This feature is convenient -when implementing polyphonic instruments to prevent some -smoothed parameter to change when a note-off event is sent.

-

Usage

-
hslider(...) : smoothAndH(g,s) : _
-
-

Where:

-
    -
  • g: the hold signal (0 for hold, 1 for bypass)
  • -
  • s: the smoothness (see smooth)
  • -
-
-

(si.)bsmooth

-

Block smooth linear interpolation during a block of samples (given by the ma.BS value).

-

Usage

-
hslider(...) : bsmooth : _
-
-
-

(si.)dot

-

Dot product for two vectors of size N.

-

Usage

-
si.bus(N), si.bus(N) : dot(N) : _
-
-

Where:

-
    -
  • N: size of the vectors (int, must be known at compile time)
  • -
-
-

(si.)smooth

-

Exponential smoothing by a unity-dc-gain one-pole lowpass. -smooth is a standard Faust function.

-

Usage:

-
_ : si.smooth(ba.tau2pole(tau)) : _
-
-

Where:

-
    -
  • tau: desired smoothing time constant in seconds, or
  • -
-
hslider(...) : smooth(s) : _
-
-

Where:

-
    -
  • s: smoothness between 0 and 1. s=0 for no smoothing, s=0.999 is "very smooth", -s>1 is unstable, and s=1 yields the zero signal for all inputs. -The exponential time-constant is approximately 1/(1-s) samples, when s is close to -(but less than) 1.
  • -
-

References:

- -
-

(si.)smoothq

-

Smoothing with continuously variable curves from Exponential to Linear, with a constant time.

-

Usage

-
_ : smoothq(time, q) : _;
-
-

Where:

-
    -
  • time: seconds to reach target
  • -
  • q: curve shape (between 0..1, 0 is Exponential, 1 is Linear)
  • -
-
-

(si.)cbus

-

N parallel cables for complex signals. -cbus is a standard Faust function.

-

Usage

-
cbus(N)
-cbus(4) : (r0,i0), (r1,i1), (r2,i2), (r3,i3)
-
-

Where:

-
    -
  • N: is an integer known at compile time that indicates the number of parallel cables.
  • -
  • each complex number is represented by two real signals as (real,imag)
  • -
-
-

(si.)cmul

-

Multiply two complex signals pointwise. -cmul is a standard Faust function.

-

Usage

-
(r1,i1) : cmul(r2,i2) : (_,_)
-
-

Where:

-
    -
  • Each complex number is represented by two real signals as (real,imag), so
  • -
  • (r1,i1) = real and imaginary parts of signal 1
  • -
  • (r2,i2) = real and imaginary parts of signal 2
  • -
-
-

(si.)cconj

-

Complex conjugation of a (complex) signal. -cconj is a standard Faust function.

-

Usage

-
(r1,i1) : cconj : (_,_)
-
-

Where:

-
    -
  • Each complex number is represented by two real signals as (real,imag), so
  • -
  • (r1,i1) = real and imaginary parts of the input signal
  • -
  • (r1,-i1) = real and imaginary parts of the output signal
  • -
-
-

(si.)onePoleSwitching

-

One pole filter with independent attack and release times.

-

Usage

-
_ : onePoleSwitching(att,rel) : _
-
-

Where:

-
    -
  • att: the attack tau time constant in second
  • -
  • rel: the release tau time constant in second
  • -
-
-

(si.)rev

-

Reverse the input signal by blocks of n>0 samples. rev(1) is the indentity -function. rev(n) has a latency of n-1 samples.

-

Usage

-
_ : rev(n) : _
-
-

Where:

-
    -
  • n: the block size in samples
  • -
-
-

(si.)vecOp

-

This function is a generalisation of Faust's iterators such as prod and -sum, and it allows to perform operations on an arbitrary number of -vectors, provided that they all have the same length. Unlike Faust's -iterators prod and sum where the vector size is equal to one and the -vector space dimension must be specified by the user, this function will -infer the vector space dimension and vector size based on the vectors list -that we provide.

-

The outputs of the function are equal to the vector size, whereas the -number of inputs is dependent on whether the elements of the vectors -provided expect an incoming signal themselves or not. We will see a -clarifying example later; in general, the number of total inputs will -be the sum of the inputs in each input vector.

-

Note that we must provide a list of at least two vectors, each with a size -that is greater or equal to one.

-

Usage

-
     si.bus(inputs(vectorsList)) : vecOp((vectorsList), op) : si.bus(outputs(ba.take(1, vectorsList)));
-
-

Where

-
    -
  • vectorsList: is a list of vectors
  • -
  • op: is a two-input, one-output operator
  • -
-

For example, consider the following vectors lists:

-
 v0 = (0 , 1 , 2 , 3);
- v1 = (4 , 5 , 6 , 7);
- v2 = (8 , 9 , 10 , 11);
- v3 = (12 , 13 , 14 , 15);
- v4 = (+(16) , _ , 18 , *(19));
- vv = (v0 , v1 , v2 , v3);
-
-

Although Faust has limitations for list processing, these vectors can be -combined or processed individually.

-

If we do:

-
 process = vecOp(v0, +);
-
-

the function will deduce a vector space of dimension equal to four and -a vector length equal to one. Note that this is equivalent to writing:

-
 process = v0 : sum(i, 4, _);
-
-

Similarly, we can write:

-
 process = vecOp((v0 , v1), *) :> _;
-
-

and we have a dimension-two space and length-four vectors. This is the dot -product between vectors v0 and v1, which is equivalent to writing:

-
 process = v0 , v1 : dot(4);
-
-

The examples above have no inputs, as none of the elements of the vectors -expect inputs. On the other hand, we can write:

-
 process = vecOp((v4 , v4), +);
-
-

and the function will have six inputs and four outputs, as each vector -has three of the four elements expecting an input, times two, as the two -input vectors are identical.

-

Finally, we can write:

-
 process = vecOp(vv, &);
-
-

to perform the bitwise AND on all the elements at the same position in -each vector, having dimension equal to the vector length equal to four.

-

Or even:

-
 process = vecOp((vv , vv), &);
-
-

which gives us a dimension equal to two, and a vector size equal to sixteen.

-

For a more practical use-case, this is how we can implement a time-invariant -feedback delay network with Hadamard matrix:

-
 N = 4;
- normalisation = 1.0 / sqrt(N);
- coeffVec = par(i, N, .99 * normalisation);
- delVec = par(i, N, (i + 1) * 3);
- process = vecOp((si.bus(N) , si.bus(N)), +) ~ 
-     vecOp((vecOp((ro.hadamard(N) , coeffVec), *) , delVec), @);
-
-
-

(si.)bpar

-

Balanced par where the repeated expression doesn't depend on a variable. -The built-in par is implemented as an unbalanced tree, and also has -to substitute the variable into the repeated expression, which is expensive -even when the variable doesn't appear. This version is implemented as a -balanced tree (which allows node reuse during tree traversal) and also -doesn't search for the variable. This can be much faster than par to compile.

-

Usage

-
si.bus(N * inputs(f)) : bpar(N, f) : si.bus(N * outputs(f))
-
-

Where:

-
    -
  • N: number of repetitions, minimum 1, a constant numerical expression
  • -
  • f: an arbitrary expression
  • -
-

Example:

-
// square each of 4000 inputs
-process = si.bpar(4000, (_ <: _, _ : *));
-
-
-

(si.)bsum

-

Balanced sum, see si.bpar.

-

Usage

-
si.bus(N * inputs(f)) : bsum(N, f) : _
-
-

Where:

-
    -
  • N: number of repetitions, minimum 1, a constant numerical expression
  • -
  • f: an arbitrary expression with 1 output.
  • -
-

Example:

-
// square each of 1000 inputs and add the results
-process = si.bsum(1000, (_ <: _, _ : *));
-
-
-

(si.)bprod

-

Balanced prod, see si.bpar.

-

Usage

-
si.bus(N * inputs(f)) : bprod(N, f) : _
-
-

Where:

-
    -
  • N: number of repetitions, minimum 1, a constant numerical expression
  • -
  • f: an arbitrary expression with 1 output.
  • -
-

Example:

-
// Add 8000 consecutive inputs (in pairs) and multiply the results
-process = si.bprod(4000, +);
-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/signals.lib/overview/index.html b/docs/contributors/faust/signals.lib/overview/index.html deleted file mode 100644 index 4a935a4..0000000 --- a/docs/contributors/faust/signals.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - signals.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

signals.lib Documentation

-

Welcome to the documentation for signals.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.6.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/soundfiles.lib/1.7.0/doc/index.html b/docs/contributors/faust/soundfiles.lib/1.7.0/doc/index.html deleted file mode 100644 index f8718ca..0000000 --- a/docs/contributors/faust/soundfiles.lib/1.7.0/doc/index.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - - - - - - soundfiles.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

soundfiles.lib

-

A library to handle soundfiles in Faust. Its official prefix is so.

-

References

- -

Functions Reference

-
-

(so.)loop

-

Play a soundfile in a loop taking into account its sampling rate. -loop is a standard Faust function.

-

Usage

-
loop(sf, part) : si.bus(outputs(sf))
-
-

Where:

-
    -
  • sf: the soundfile
  • -
  • part: the part in the soundfile list of sounds
  • -
-
-

(so.)loop_speed

-

Play a soundfile in a loop taking into account its sampling rate, with speed control. -loop_speed is a standard Faust function.

-

Usage

-
loop_speed(sf, part, speed) : si.bus(outputs(sf))
-
-

Where:

-
    -
  • sf: the soundfile
  • -
  • part: the part in the soundfile list of sounds
  • -
  • speed: the speed between 0 and n
  • -
-
-

(so.)loop_speed_level

-

Play a soundfile in a loop taking into account its sampling rate, with speed and level controls. -loop_speed_level is a standard Faust function.

-

Usage

-
loop_speed_level(sf, part, speed, level) : si.bus(outputs(sf))
-
-

Where:

-
    -
  • sf: the soundfile
  • -
  • part: the part in the soundfile list of sounds
  • -
  • speed: the speed between 0 and n
  • -
  • level: the volume between 0 and n
  • -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/soundfiles.lib/overview/index.html b/docs/contributors/faust/soundfiles.lib/overview/index.html deleted file mode 100644 index 0cfc372..0000000 --- a/docs/contributors/faust/soundfiles.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - soundfiles.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

soundfiles.lib Documentation

-

Welcome to the documentation for soundfiles.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.7.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/spats.lib/1.1.0/doc/index.html b/docs/contributors/faust/spats.lib/1.1.0/doc/index.html deleted file mode 100644 index 61ab63e..0000000 --- a/docs/contributors/faust/spats.lib/1.1.0/doc/index.html +++ /dev/null @@ -1,264 +0,0 @@ - - - - - - - - - - - spats.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

spats.lib

-

This library contains a collection of tools for sound spatialization. -Its official prefix is sp.

-

References

- -
-

(sp.)panner

-

A simple linear stereo panner. -panner is a standard Faust function.

-

Usage

-
_ : panner(g) : _,_
-
-

Where:

-
    -
  • g: the panning (0-1)
  • -
-
-

(sp.)constantPowerPan

-

Apply the constant power pan rule to a stereo signal. -The channels are not respatialized. Their gains are simply -adjusted. A pan of 0 preserves the left channel and silences -the right channel. A pan of 1 has the opposite effect. -A pan value of 0.5 applies a gain of 0.5 to both channels.

-

Usage

-
_,_ : constantPowerPan(p) : _,_
-
-

Where:

-
    -
  • p: the panning (0-1)
  • -
-
-

(sp.)spat

-

GMEM SPAT: n-outputs spatializer. -spat is a standard Faust function.

-

Usage

-
_ : spat(N,r,d) : si.bus(N)
-
-

Where:

-
    -
  • N: number of outputs (a constant numerical expression)
  • -
  • r: rotation (between 0 et 1)
  • -
  • d: distance of the source (between 0 et 1)
  • -
-
-

(sp.)stereoize

-

Transform an arbitrary processor p into a stereo processor with 2 inputs -and 2 outputs.

-

Usage

-
_,_ : stereoize(p) : _,_
-
-

Where:

-
    -
  • p: the arbitrary processor
  • -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/spats.lib/overview/index.html b/docs/contributors/faust/spats.lib/overview/index.html deleted file mode 100644 index 4fa61ca..0000000 --- a/docs/contributors/faust/spats.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - spats.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

spats.lib Documentation

-

Welcome to the documentation for spats.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.1.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/stdfaust.lib/1.0.0/doc/index.html b/docs/contributors/faust/stdfaust.lib/1.0.0/doc/index.html deleted file mode 100644 index 0907416..0000000 --- a/docs/contributors/faust/stdfaust.lib/1.0.0/doc/index.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - stdfaust.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

stdfaust.lib

-

The purpose of this library is to give access to all the Faust standard libraries -through a series of environments.

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/stdfaust.lib/overview/index.html b/docs/contributors/faust/stdfaust.lib/overview/index.html deleted file mode 100644 index 6a26532..0000000 --- a/docs/contributors/faust/stdfaust.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - stdfaust.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

stdfaust.lib Documentation

-

Welcome to the documentation for stdfaust.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.0.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/synths.lib/1.1.0/doc/index.html b/docs/contributors/faust/synths.lib/1.1.0/doc/index.html deleted file mode 100644 index 2fc6f68..0000000 --- a/docs/contributors/faust/synths.lib/1.1.0/doc/index.html +++ /dev/null @@ -1,388 +0,0 @@ - - - - - - - - - - - synths.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

synths.lib

-

This library contains a collection of synthesizers. Its official prefix is sy.

-

References

- -
-

(sy.)popFilterDrum

-

A simple percussion instrument based on a "popped" resonant bandpass filter. -popFilterDrum is a standard Faust function.

-

Usage

-
popFilterDrum(freq,q,gate) : _
-
-

Where:

-
    -
  • freq: the resonance frequency of the instrument in Hz
  • -
  • q: the q of the res filter (typically, 5 is a good value)
  • -
  • gate: the trigger signal (0 or 1)
  • -
-
-

(sy.)dubDub

-

A simple synth based on a sawtooth wave filtered by a resonant lowpass. -dubDub is a standard Faust function.

-

Usage

-
dubDub(freq,ctFreq,q,gate) : _
-
-

Where:

-
    -
  • freq: frequency of the sawtooth in Hz
  • -
  • ctFreq: cutoff frequency of the filter
  • -
  • q: Q of the filter
  • -
  • gate: the trigger signal (0 or 1)
  • -
-
-

(sy.)sawTrombone

-

A simple trombone based on a lowpassed sawtooth wave. -sawTrombone is a standard Faust function.

-

Usage

-
sawTrombone(freq,gain,gate) : _
-
-

Where:

-
    -
  • freq: the frequency in Hz
  • -
  • gain: the gain (0-1)
  • -
  • gate: the gate (0 or 1)
  • -
-
-

(sy.)combString

-

Simplest string physical model ever based on a comb filter. -combString is a standard Faust function.

-

Usage

-
combString(freq,res,gate) : _
-
-

Where:

-
    -
  • freq: the frequency of the string in Hz
  • -
  • res: string T60 (resonance time) in second
  • -
  • gate: trigger signal (0 or 1)
  • -
-
-

(sy.)additiveDrum

-

A simple drum using additive synthesis. -additiveDrum is a standard Faust function.

-

Usage

-
additiveDrum(freq,freqRatio,gain,harmDec,att,rel,gate) : _
-
-

Where:

-
    -
  • freq: the resonance frequency of the drum in Hz
  • -
  • freqRatio: a list of ratio to choose the frequency of the mode in - function of freq e.g.(1 1.2 1.5 ...). The first element should always - be one (fundamental).
  • -
  • gain: the gain of each mode as a list (1 0.9 0.8 ...). The first element - is the gain of the fundamental.
  • -
  • harmDec: harmonic decay ratio (0-1): configure the speed at which - higher modes decay compare to lower modes.
  • -
  • att: attack duration in second
  • -
  • rel: release duration in second
  • -
  • gate: trigger signal (0 or 1)
  • -
-
-

(sy.)fm

-

An FM synthesizer with an arbitrary number of modulators connected as a sequence. -fm is a standard Faust function.

-

Usage

-
freqs = (300,400,...);
-indices = (20,...);
-fm(freqs,indices) : _
-
-

Where:

-
    -
  • freqs: a list of frequencies where the first one is the frequency of the carrier - and the others, the frequency of the modulator(s)
  • -
  • indices: the indices of modulation (Nfreqs-1)
  • -
-

Drum Synthesis

-

Drum Synthesis ported in Faust from a version written in Elementary -and JavaScript by Nick Thompson.

-

Reference

- -
-

(sy.)kick

-

Kick drum synthesis via a pitched sine sweep.

-

Usage

-
kick(pitch, click, attack, decay, drive, gate) : _
-
-

Where:

-
    -
  • pitch: the base frequency of the kick drum in Hz
  • -
  • click: the speed of the pitch envelope, tuned for [0.005s, 1s]
  • -
  • attack: attack time in seconds, tuned for [0.005s, 0.4s]
  • -
  • decay: decay time in seconds, tuned for [0.005s, 4.0s]
  • -
  • drive: a gain multiplier going into the saturator. Tuned for [1, 10]
  • -
  • gate: the gate which triggers the amp envelope
  • -
-

Reference

- -
-

(sy.)clap

-

Clap synthesis via filtered white noise.

-

Usage

-
clap(tone, attack, decay, gate) : _
-
-

Where:

-
    -
  • tone: bandpass filter cutoff frequency, tuned for [400Hz, 3500Hz]
  • -
  • attack: attack time in seconds, tuned for [0s, 0.2s]
  • -
  • decay: decay time in seconds, tuned for [0s, 4.0s]
  • -
  • gate: the gate which triggers the amp envelope
  • -
-

Reference

- -
-

(sy.)hat

-

Hi hat drum synthesis via phase modulation.

-

Usage

-
hat(pitch, tone, attack, decay, gate): _
-
-

Where:

-
    -
  • pitch: base frequency in the range [317Hz, 3170Hz]
  • -
  • tone: bandpass filter cutoff frequency, tuned for [800Hz, 18kHz]
  • -
  • attack: attack time in seconds, tuned for [0.005s, 0.2s]
  • -
  • decay: decay time in seconds, tuned for [0.005s, 4.0s]
  • -
  • gate: the gate which triggers the amp envelope
  • -
-

Reference

-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/synths.lib/overview/index.html b/docs/contributors/faust/synths.lib/overview/index.html deleted file mode 100644 index ebcc54c..0000000 --- a/docs/contributors/faust/synths.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - synths.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

synths.lib Documentation

-

Welcome to the documentation for synths.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.1.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/tonestacks.lib/1.28.0/doc/index.html b/docs/contributors/faust/tonestacks.lib/1.28.0/doc/index.html deleted file mode 100644 index 815ada9..0000000 --- a/docs/contributors/faust/tonestacks.lib/1.28.0/doc/index.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - - - - Doc - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/tonestacks.lib/overview/index.html b/docs/contributors/faust/tonestacks.lib/overview/index.html deleted file mode 100644 index 190e7b5..0000000 --- a/docs/contributors/faust/tonestacks.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - tonestacks.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

tonestacks.lib Documentation

-

Welcome to the documentation for tonestacks.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.28.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/tubes.lib/1.0.0/doc/index.html b/docs/contributors/faust/tubes.lib/1.0.0/doc/index.html deleted file mode 100644 index 815ada9..0000000 --- a/docs/contributors/faust/tubes.lib/1.0.0/doc/index.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - - - - - - - Doc - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/tubes.lib/overview/index.html b/docs/contributors/faust/tubes.lib/overview/index.html deleted file mode 100644 index e6e700d..0000000 --- a/docs/contributors/faust/tubes.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - tubes.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

tubes.lib Documentation

-

Welcome to the documentation for tubes.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.0.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/vaeffects.lib/1.2.1/doc/index.html b/docs/contributors/faust/vaeffects.lib/1.2.1/doc/index.html deleted file mode 100644 index cdc7aeb..0000000 --- a/docs/contributors/faust/vaeffects.lib/1.2.1/doc/index.html +++ /dev/null @@ -1,721 +0,0 @@ - - - - - - - - - - - vaeffects.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
- -
- -

vaeffects.lib

-

A library of virtual analog filter effects. Its official prefix is ve.

-

References

- -

Moog Filters

-
-

(ve.)moog_vcf

-

Moog "Voltage Controlled Filter" (VCF) in "analog" form. Moog VCF -implemented using the same logical block diagram as the classic -analog circuit. As such, it neglects the one-sample delay associated -with the feedback path around the four one-poles. -This extra delay alters the response, especially at high frequencies -(see reference [1] for details). -See moog_vcf_2b below for a more accurate implementation.

-

Usage

-
_ : moog_vcf(res,fr) : _
-
-

Where:

-
    -
  • res: normalized amount of corner-resonance between 0 and 1 -(0 is no resonance, 1 is maximum)
  • -
  • fr: corner-resonance frequency in Hz (less than SR/6.3 or so)
  • -
-

References

- -
-

(ve.)moog_vcf_2b[n]

-

Moog "Voltage Controlled Filter" (VCF) as two biquads. Implementation -of the ideal Moog VCF transfer function factored into second-order -sections. As a result, it is more accurate than moog_vcf above, but -its coefficient formulas are more complex when one or both parameters -are varied. Here, res is the fourth root of that in moog_vcf, so, as -the sampling rate approaches infinity, moog_vcf(res,fr) becomes equivalent -to moog_vcf_2b[n](res^4,fr) (when res and fr are constant). -moog_vcf_2b uses two direct-form biquads (tf2). -moog_vcf_2bn uses two protected normalized-ladder biquads (tf2np).

-

Usage

-
_ : moog_vcf_2b(res,fr) : _
-_ : moog_vcf_2bn(res,fr) : _
-
-

Where:

-
    -
  • res: normalized amount of corner-resonance between 0 and 1 - (0 is min resonance, 1 is maximum)
  • -
  • fr: corner-resonance frequency in Hz
  • -
-
-

(ve.)moogLadder

-

Virtual analog model of the 4th-order Moog Ladder, which is arguably the -most well-known ladder filter in analog synthesizers. Several -1st-order filters are cascaded in series. Feedback is then used, in part, to -control the cut-off frequency and the resonance.

-

References

-

[Zavalishin 2012] (revision 2.1.2, February 2020):

- -

This fix is based on Lorenzo Della Cioppa's correction to Pirkle's implementation; see this post: -https://www.kvraudio.com/forum/viewtopic.php?f=33&t=571909

-

Usage

-
_ : moogLadder(normFreq,Q) : _
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
  • Q: quality factor between .707 (0 feedback coefficient) to 25 (feedback = 4, which is the self-oscillating threshold).
  • -
-
-

(ve.)moogHalfLadder

-

Virtual analog model of the 2nd-order Moog Half Ladder (simplified version of -(ve.)moogLadder). Several 1st-order filters are cascaded in series. -Feedback is then used, in part, to control the cut-off frequency and the -resonance.

-

This filter was implemented in Faust by Eric Tarr during the -2019 Embedded DSP With Faust Workshop.

-

References

- -

Usage

-
_ : moogHalfLadder(normFreq,Q) : _
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
  • Q: q
  • -
-
-

(ve.)diodeLadder

-

4th order virtual analog diode ladder filter. In addition to the individual -states used within each independent 1st-order filter, there are also additional -feedback paths found in the block diagram. These feedback paths are labeled -as connecting states. Rather than separately storing these connecting states -in the Faust implementation, they are simply implicitly calculated by -tracing back to the other states (s1,s2,s3,s4) each recursive step.

-

This filter was implemented in Faust by Eric Tarr during the -2019 Embedded DSP With Faust Workshop.

-

References

- -

Usage

-
_ : diodeLadder(normFreq,Q) : _
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
  • Q: q
  • -
-

Korg 35 Filters

-

The following filters are virtual analog models of the Korg 35 low-pass -filter and high-pass filter found in the MS-10 and MS-20 synthesizers. -The virtual analog models for the LPF and HPF are different, making these -filters more interesting than simply tapping different states of the same -circuit.

-

These filters were implemented in Faust by Eric Tarr during the -2019 Embedded DSP With Faust Workshop.

-

Filter history:

- -
-

(ve.)korg35LPF

-

Virtual analog models of the Korg 35 low-pass filter found in the MS-10 and -MS-20 synthesizers.

-

Usage

-
_ : korg35LPF(normFreq,Q) : _
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
  • Q: q
  • -
-
-

(ve.)korg35HPF

-

Virtual analog models of the Korg 35 high-pass filter found in the MS-10 and -MS-20 synthesizers.

-

Usage

-
_ : korg35HPF(normFreq,Q) : _
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
  • Q: q
  • -
-

Oberheim Filters

-

The following filter (4 types) is an implementation of the virtual analog -model described in Section 7.2 of the Will Pirkle book, "Designing Software -Synthesizer Plug-ins in C++". It is based on the block diagram in Figure 7.5.

-

The Oberheim filter is a state-variable filter with soft-clipping distortion -within the circuit.

-

In many VA filters, distortion is accomplished using the "tanh" function. -For this Faust implementation, that distortion function was replaced with -the (ef.)cubicnl function.

-
-

(ve.)oberheim

-

Generic multi-outputs Oberheim filter that produces the BSF, BPF, HPF and LPF outputs (see description above).

-

Usage

-
_ : oberheim(normFreq,Q) : _,_,_,_
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
  • Q: q
  • -
-
-

(ve.)oberheimBSF

-

Band-Stop Oberheim filter (see description above). -Specialize the generic implementation: keep the first BSF output, -the compiler will only generate the needed code.

-

Usage

-
_ : oberheimBSF(normFreq,Q) : _
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
  • Q: q
  • -
-
-

(ve.)oberheimBPF

-

Band-Pass Oberheim filter (see description above). -Specialize the generic implementation: keep the second BPF output, -the compiler will only generate the needed code.

-

Usage

-
_ : oberheimBPF(normFreq,Q) : _
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
  • Q: q
  • -
-
-

(ve.)oberheimHPF

-

High-Pass Oberheim filter (see description above). -Specialize the generic implementation: keep the third HPF output, -the compiler will only generate the needed code.

-

Usage

-
_ : oberheimHPF(normFreq,Q) : _
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
  • Q: q
  • -
-
-

(ve.)oberheimLPF

-

Low-Pass Oberheim filter (see description above). -Specialize the generic implementation: keep the fourth LPF output, -the compiler will only generate the needed code.

-

Usage

-
_ : oberheimLPF(normFreq,Q) : _
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
  • Q: q
  • -
-

Sallen Key Filters

-

The following filters were implemented based on VA models of synthesizer -filters.

-

The modeling approach is based on a Topology Preserving Transform (TPT) to -resolve the delay-free feedback loop in the corresponding analog filters.

-

The primary processing block used to build other filters (Moog, Korg, etc.) is -based on a 1st-order Sallen-Key filter.

-

The filters included in this script are 1st-order LPF/HPF and 2nd-order -state-variable filters capable of LPF, HPF, and BPF.

-

Resources:

- -
-

(ve.)sallenKeyOnePole

-

Sallen-Key generic One Pole filter that produces the LPF and HPF outputs (see description above).

-

For the Faust implementation of this filter, recursion (letrec) is used -for storing filter "states". The output (e.g. y) is calculated by using -the input signal and the previous states of the filter. -During the current recursive step, the states of the filter (e.g. s) for -the next step are also calculated. -Admittedly, this is not an efficient way to implement a filter because it -requires independently calculating the output and each state during each -recursive step. However, it works as a way to store and use "states" -within the constraints of Faust. -The simplest example is the 1st-order LPF (shown on the cover of Zavalishin -* 2018 and Fig 4.3 of https://www.willpirkle.com/706-2/). Here, the input -signal is split in parallel for the calculation of the output signal, y, and -the state s. The value of the state is only used for feedback to the next -step of recursion. It is blocked (!) from also being routed to the output. -A trick used for calculating the state s is to observe that the input to -the delay block is the sum of two signal: what appears to be a feedforward -path and a feedback path. In reality, the signals being summed are identical -(signal*2) plus the value of the current state.

-

Usage

-
_ : sallenKeyOnePole(normFreq) : _,_
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
-
-

(ve.)sallenKeyOnePoleLPF

-

Sallen-Key One Pole lowpass filter (see description above). -Specialize the generic implementation: keep the first LPF output, -the compiler will only generate the needed code.

-

Usage

-
_ : sallenKeyOnePoleLPF(normFreq) : _
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
-
-

(ve.)sallenKeyOnePoleHPF

-

Sallen-Key One Pole Highpass filter (see description above). The dry input -signal is routed in parallel to the output. The LPF'd signal is subtracted -from the input so that the HPF remains. -Specialize the generic implementation: keep the second HPF output, -the compiler will only generate the needed code.

-

Usage

-
_ : sallenKeyOnePoleHPF(normFreq) : _
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
-
-

(ve.)sallenKey2ndOrder

-

Sallen-Key generic 2nd order filter that produces the LPF, BPF and HPF outputs.

-

This is a 2nd-order Sallen-Key state-variable filter. The idea is that by -"tapping" into different points in the circuit, different filters -(LPF,BPF,HPF) can be achieved. See Figure 4.6 of -* https://www.willpirkle.com/706-2/

-

This is also a good example of the next step for generalizing the Faust -programming approach used for all these VA filters. In this case, there are -three things to calculate each recursive step (y,s1,s2). For each thing, the -circuit is only calculated up to that point.

-

Comparing the LPF to BPF, the output signal (y) is calculated similarly. -Except, the output of the BPF stops earlier in the circuit. Similarly, the -states (s1 and s2) only differ in that s2 includes a couple more terms -beyond what is used for s1.

-

Usage

-
_ : sallenKey2ndOrder(normFreq,Q) : _,_,_
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
  • Q: q
  • -
-
-

(ve.)sallenKey2ndOrderLPF

-

Sallen-Key 2nd order lowpass filter (see description above). -Specialize the generic implementation: keep the first LPF output, -the compiler will only generate the needed code.

-

Usage

-
_ : sallenKey2ndOrderLPF(normFreq,Q) : _
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
  • Q: q
  • -
-
-

(ve.)sallenKey2ndOrderBPF

-

Sallen-Key 2nd order bandpass filter (see description above). -Specialize the generic implementation: keep the second BPF output, -the compiler will only generate the needed code.

-

Usage

-
_ : sallenKey2ndOrderBPF(normFreq,Q) : _
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
  • Q: q
  • -
-
-

(ve.)sallenKey2ndOrderHPF

-

Sallen-Key 2nd order highpass filter (see description above). -Specialize the generic implementation: keep the third HPF output, -the compiler will only generate the needed code.

-

Usage

-
_ : sallenKey2ndOrderHPF(normFreq,Q) : _
-
-

Where:

-
    -
  • normFreq: normalized frequency (0-1)
  • -
  • Q: q
  • -
-

Effects

-
-

(ve.)wah4

-

Wah effect, 4th order. -wah4 is a standard Faust function.

-

Usage

-
_ : wah4(fr) : _
-
-

Where:

-
    -
  • fr: resonance frequency in Hz
  • -
-

Reference

- -
-

(ve.)autowah

-

Auto-wah effect. -autowah is a standard Faust function.

-

Usage

-
_ : autowah(level) : _
-
-

Where:

-
    -
  • level: amount of effect desired (0 to 1).
  • -
-
-

(ve.)crybaby

-

Digitized CryBaby wah pedal. -crybaby is a standard Faust function.

-

Usage

-
_ : crybaby(wah) : _
-
-

Where:

-
    -
  • wah: "pedal angle" from 0 to 1
  • -
-

Reference

- -
-

(ve.)vocoder

-

A very simple vocoder where the spectrum of the modulation signal -is analyzed using a filter bank. -vocoder is a standard Faust function.

-

Usage

-
_ : vocoder(nBands,att,rel,BWRatio,source,excitation) : _
-
-

Where:

-
    -
  • nBands: Number of vocoder bands
  • -
  • att: Attack time in seconds
  • -
  • rel: Release time in seconds
  • -
  • BWRatio: Coefficient to adjust the bandwidth of each band (0.1 - 2)
  • -
  • source: Modulation signal
  • -
  • excitation: Excitation/Carrier signal
  • -
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/vaeffects.lib/overview/index.html b/docs/contributors/faust/vaeffects.lib/overview/index.html deleted file mode 100644 index 2e9e095..0000000 --- a/docs/contributors/faust/vaeffects.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - vaeffects.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

vaeffects.lib Documentation

-

Welcome to the documentation for vaeffects.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.2.1

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/version.lib/1.0.0/doc/index.html b/docs/contributors/faust/version.lib/1.0.0/doc/index.html deleted file mode 100644 index 41deb63..0000000 --- a/docs/contributors/faust/version.lib/1.0.0/doc/index.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - version.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

version.lib

-

Semantic versioning for the Faust libraries. Its official prefix is vl.

-

References

- -
-

(vl.)version

-

Return the version number of the Faust standard libraries as a MAJOR, MINOR, PATCH versioning triplet.

-

Usage

-
version : _,_,_
-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/version.lib/overview/index.html b/docs/contributors/faust/version.lib/overview/index.html deleted file mode 100644 index e4fd2ab..0000000 --- a/docs/contributors/faust/version.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - version.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

version.lib Documentation

-

Welcome to the documentation for version.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.0.0

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/wdmodels.lib/1.2.1/doc/index.html b/docs/contributors/faust/wdmodels.lib/1.2.1/doc/index.html deleted file mode 100644 index b258e01..0000000 --- a/docs/contributors/faust/wdmodels.lib/1.2.1/doc/index.html +++ /dev/null @@ -1,1357 +0,0 @@ - - - - - - - - - - - wdmodels.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

wdmodels.lib

-

A library of basic adaptors and methods to help construct Wave Digital Filter models in Faust. Its official prefix is wd.

-

Library Readme

-

This library is intended for use for creating Wave Digital (WD) based models of audio circuitry for real-time audio processing within the Faust programming language. The goal is to provide a framework to create real-time virtual-analog audio effects and synthesizers using WD models without the use of C++. Furthermore, we seek to provide access to the technique of WD modeling to those without extensive knowledge of advanced digital signal processing techniques. Finally, we hope to provide a library which can integrate with all aspects of Faust, thus creating a platform for virtual circuit bending. -The library itself is written in Faust to maintain portability.

-

This library is heavily based on Kurt Werner's Dissertation, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters." I have tried to maintain consistent notation between the adaptors appearing within thesis and my adaptor code. The majority of the adaptors found in chapter 1 and chapter 3 are currently supported.

-

For inquires about use of this library in a commercial product, please contact dirk [dot] roosenburg [dot] 30 [at] gmail [dot] com. -This documentation is taken directly from the readme. Please refer to it for a more updated version.

-

Many of the more in depth comments within the library include jargon. I plan to create videos detailing the theory of WD models. -For now I recommend Kurt Werner's PhD, Virtual analog modeling of Audio circuitry using Wave Digital Filters.
-I have tried to maintain consistent syntax and notation to the thesis. -This library currently includes the majority of the adaptors covered in chapter 1 and some from chapter 3.

-

Using this Library

-

Use of this library expects some level of familiarity with WDF techniques, especially simplification and decomposition of electronic circuits into WDF connection trees. I plan to create video to cover both these techniques and use of the library.

-

Quick Start

-

To get a quick overview of the library, start with the secondOrderFilters.dsp code found in examples. -Note that the wdmodels.lib library is now embedded in the online Faust IDE.

-

A Simple RC Filter Model

-

Creating a model using this library consists fo three steps. First, declare a set of components. -Second, model the relationship between them using a tree. Finally, build the tree using the libraries build functions.

-

First, a set of components is declared using adaptors from the library. -This list of components is created based on analysis of the circuit using WDF techniques, -though generally each circuit element (resistor, capacitor, diode, etc.) can be expected to appear -within the component set. For example, first order RC lowpass filter would require an unadapted voltage source, -a 47k resistor, and a 10nF capacitor which outputs the voltage across itself. These can be declared with:

-
vs1(i) = wd.u_voltage(i, no.noise);
-r1(i) = wd.resistor(i, 47*10^3);
-c1(i) = wd.capacitor_Vout(i, 10*10^-9);
-
-

Note that the first argument, i, is left un-parametrized. Components must be declared in this form, as the build algorithm expects to receive adaptors which have exactly one parameter.

-

Also note that we have chosen to declare a white noise function as the input to our voltage source. -We could potentially declare this as a direct input to our model, but to do so is more complicated -process which cannot be covered within this tutorial. For information on how to do this see -Declaring Model Parameters as Inputs or see various implementations -in examples.

-

Second, the declared components and interconnection/structural adaptors (i.e. series, parallel, etc) are arranged -into the connection tree which is produced from performing WD analysis on the modeled circuit. -For example, to produce our first order RC lowpass circuit model, the following tree is declared:

-

tree_lowpass = vs1 : wd.series : (r1, c1);

-

For more information on how to represent trees in Faust, see Trees in Faust.

-

Finally, the tree is built using the the buildtree function. To build and compute our first order -RC lowpass circuit model, we use:

-

process = wd.buildtree(tree_lowpass);

-

More information about build functions, see Model Building Functions.

-

Building a Model

-

After creating a connection tree which consists of WD adaptors, the connection tree must be passed -to a build function in order to build the model.

-
Automatic model building
-

buildtree(connection_tree)

-

The simplest build function for use with basic models. This automatically implements buildup, builddown, -and buildout to create a working model. However, it gives minimum control to the user and cannot -currently be used on trees which have parameters declared as inputs.

-
Manual model building
-

Wave Digital Filters are an explicit state-space model, meaning they use a previous system state -in order to calculate the current output. This is achieved in Faust by using a single global feedback operator. -The models feed-forward terms are generated using builddown and the models feedback terms are generated -using buildup. Thus, the most common model implementation (the method used by buildtree) is:

-

builddown(connection_tree)~buildup(connection_tree) : buildout(connection_tree)

-

Since the ~ operator in Faust will leave feedback terms hanging as outputs, buildout is a function provided for convenience. -It automatically truncates the hanging outputs by identifying leaf components which have an intended output -and generating an output matrix.

-

Building the model manually allows for greater user control and is often very helpful in testing. -Also provided for testing are the getres and parres functions, which can be used to determine -the upward-facing port resistance of an element.

-

Declaring Model Parameters as Inputs

-

When possible, parameters of components should be declared explicitly, meaning they are dependent on a function with no inputs. -This might be something as simple as integer(declaring a static component), a function dependent on a UI input (declaring a component with variable value), -or even a time-dependent function like an oscillator (declaring an audio input or circuit bending).

-

However, it is often necessary to declare parameters as input. To achieve this there are two possible methods. -The first and recommended option is to create a separate model function and declare parameters which will later -be implemented as inputs. This allows inputs to be explicitly declared as component parameters. -For example, one might use:

-
model(in1) = buildtree(tree)
-with {
-   ...
-   vin(i) = wd.u_voltage(i, in1);
-   ...
-   tree = vin : ...; 
-};
-
-

In order to simulate an audio input to the circuit.

-

Note that the tree and components must be declared inside a with {...} statement, or the model's parameters will not be accessible.

-
The Empty Signal Operator
-

The Empty signal operator, _ should NEVER be used to declare a parameter as in input in a wave-digital model.

-

Using it will result on breaking the internal routing of the model and thus breaks the model. -Instead, use explicit declaration as shown directly above.

-

Trees in Faust

-

Since WD models use connection trees to represent relationships of elements, a comprehensive way to represent trees is critical. - As there is no current convention for creating trees in Faust, I've developed a method using the existing series and parallel/list -methods in Faust.

-

The series operator : is used to separate parent and child elements. For example the tree:

-
   A
-   |
-   B
-
-

is represented by A : B in Faust.

-

To denote a parent element with multiple child elements, simply use a list (a1, a2, ... an) of children connected to a single parent. ` -For example the tree:

-
   A
-  / \
- B   C
-
-
-

is represented by:

-

A : (B, C)

-

Finally, for a tree with many levels, simply break the tree into subtrees following the above rules and connect -the subtree as if it was an individual node. For example the tree:

-
      A
-     / \
-    B   C
-   /   / \
-  X   Y   Z
-
-

can be represented by:

-
B_sub = B : X; //B subtree
-C_sub = C : (Y, Z); //C subtree
-tree = A : (B_sub, C_sub); //full tree
-
-

or more simply, using parentheses:

-

A : ((B : X), (C : (Y, Z)))

-

How Adaptors are Structured

-

In wave digital filters, adaptors can be described by the form b = Sa where b is a vector of output waves b = (b0, b1, b2, ... bn), a is a vector of input wavesa = (a0, a1, a2, ... an), and S is an n x n scattering matrix. -S is dependent on R, a list of port resistances (R0, R1, R2, ... Rn).

-

The output wave vector b can be divided into downward-going and upward-going waves -(downward-going waves travel down the connection tree, upward-going waves travel up). -For adapted adaptors, with the zeroth port being the upward-facing port, the downward-going wave vector is (b1, b2, ... bn) and the upward-going wave vector is (b0). -For unadapted adaptors, there are no upward-going waves, so the downward-going wave vector is simply b = (b0, b1, b2, ... bn).

-

In order for adaptors to be interpretable by the compiler, they must be structured in a specific way. -Each adaptor is divided into three cases by their first parameter. This parameter, while accessible by the user, should only be set by the compiler/builder.

-

All other parameters are value declarations (for components), inputs (for voltage or current ins), or parameter controls (for potentiometers/variable capacitors/variable inductors).

-
First case - downward going waves
-

(0, params) => downward-going(R1, ... Rn, a0, a1, ... an) -outputs: (b1, b2, ... bn) -this function takes any number of port resistances, the downward going wave, and any number of upward going waves as inputs. -These values/waves are used to calculate the downward going waves coming from this adaptor.

-
Second case
-

(1, params) => upward-going(R1, ... Rn, a1, ... an) -outputs : (b0) -this function takes any number of port resistances and any number of upward going waves as inputs. -These values/waves are used to calculate the upward going wave coming from this adaptor.

-
Third case
-

(2, params) => port-resistance(R1, ... Rn) -outputs: (R0) -this function takes any number of port resistances as inputs. -These values are used to calculate the upward going port resistance of the element.

-
Unadapted Adaptors
-

Unadapted adaptor's names will always begin u_ -An unadapted adaptor MUST be used as the root of the WD connection tree. -Unadapted adaptors can ONLY be used as a root of the WD connection tree. -While unadapted adaptors contain all three cases, the second and third are purely structural. -Only the first case should contain computational information.

-

How the Build Functions Work

-

Expect this section to be added soon! It's currently in progress.

-

Acknowledgements

-

Many thanks to Kurt Werner for helping me to understand wave digital filter models. Without his publications and consultations, the library would not exist. -Thanks also to my advisors, Rob Owen and Eli Stine whose input was critical to the development of the library. -Finally, thanks to Romain Michon, Stephane Letz, and the Faust Slack for contributing to testing, development, and inspiration when creating the library.

-

References

- -

Algebraic One Port Adaptors

-
-

(wd.)resistor

-

Adapted Resistor.

-

A basic node implementing a resistor for use within Wave Digital Filter connection trees.

-

It should be used as a leaf/terminating element of the connection tree.

-

Usage

-
r1(i) = resistor(i, R);
-buildtree( A : r1 );
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared.
  • -
  • R : Resistance/Impedance of the resistor being modeled in Ohms.
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.1

-
-

(wd.)resistor_Vout

-

Adapted Resistor + voltage Out.

-

A basic adaptor implementing a resistor for use within Wave Digital Filter connection trees.

-

It should be used as a leaf/terminating element of the connection tree. -The resistor will also pass the voltage across itself as an output of the model.

-

Usage

-
rout(i) = resistor_Vout(i, R);
-buildtree( A : rout ) : _
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared.
  • -
  • R : Resistance/Impedance of the resistor being modeled in Ohms.
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.1

-
-

(wd.)resistor_Iout

-

Resistor + current Out.

-

A basic adaptor implementing a resistor for use within Wave Digital Filter connection trees.

-

It should be used as a leaf/terminating element of the connection tree. -The resistor will also pass the current through itself as an output of the model.

-

Usage

-
rout(i) = resistor_Iout(i, R);
-buildtree( A : rout ) : _
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared.
  • -
  • R : Resistance/Impedance of the resistor being modeled in Ohms.
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.1

-
-

(wd.)u_voltage

-

Unadapted Ideal Voltage Source.

-

An adaptor implementing an ideal voltage source within Wave Digital Filter connection trees.

-

It should be used as the root/top element of the connection tree. -Can be used for either DC (constant) or AC (signal) voltage sources.

-

Usage

-
v1(i) = u_Voltage(i, ein);
-buildtree( v1 : B );
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared.
  • -
  • ein : Voltage/Potential across ideal voltage source in Volts
  • -
-

Note: only usable as the root of a tree. -The adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.2

-
-

(wd.)u_current

-

Unadapted Ideal Current Source.

-

An unadapted adaptor implementing an ideal current source within Wave Digital Filter connection trees.

-

It should be used as the root/top element of the connection tree. -Can be used for either DC (constant) or AC (signal) current sources.

-

Usage

-
i1(i) = u_current(i, jin);
-buildtree( i1 : B );
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared.
  • -
  • jin : Current through the ideal current source in Amps
  • -
-

Note: only usable as the root of a tree. -The adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.3

-
-

(wd.)resVoltage

-

Adapted Resistive Voltage Source.

-

An adaptor implementing a resistive voltage source within Wave Digital Filter connection trees.

-

It should be used as a leaf/terminating element of the connection tree. -It is comprised of an ideal voltage source in series with a resistor. -Can be used for either DC (constant) or AC (signal) voltage sources.

-

Usage

-
v1(i) = resVoltage(i, R, ein);
-buildtree( A : v1 );
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • R : Resistance/Impedance of the series resistor in Ohms
  • -
  • ein : Voltage/Potential of the ideal voltage source in Volts
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.4

-
-

(wd.)resVoltage_Vout

-

Adapted Resistive Voltage Source + voltage output.

-

An adaptor implementing an adapted resistive voltage source within Wave Digital Filter connection trees.

-

It should be used as a leaf/terminating element of the connection tree. -It is comprised of an ideal voltage source in series with a resistor. -Can be used for either DC (constant) or AC (signal) voltage sources. -The resistive voltage source will also pass the voltage across it as an output of the model.

-

Usage

-
vout(i) = resVoltage_Vout(i, R, ein);
-buildtree( A : vout ) : _
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • R : Resistance/Impedance of the series resistor in Ohms
  • -
  • ein : Voltage/Potential across ideal voltage source in Volts
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.4

-
-

(wd.)u_resVoltage

-

Unadapted Resistive Voltage Source.

-

An unadapted adaptor implementing a resistive voltage source within Wave Digital Filter connection trees.

-

It should be used as the root/top element of the connection tree. -It is comprised of an ideal voltage source in series with a resistor. -Can be used for either DC (constant) or AC (signal) voltage sources.

-

Usage

-
v1(i) = u_resVoltage(i, R, ein);
-buildtree( v1 : B );
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • R : Resistance/Impedance of the series resistor in Ohms
  • -
  • ein : Voltage/Potential across ideal voltage source in Volts
  • -
-

Note: only usable as the root of a tree. -The adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.4

-
-

(wd.)resCurrent

-

Adapted Resistive Current Source.

-

An adaptor implementing a resistive current source within Wave Digital Filter connection trees.

-

It should be used as a leaf/terminating element of the connection tree. -It is comprised of an ideal current source in parallel with a resistor. -Can be used for either DC (constant) or AC (signal) current sources.

-

Usage

-
i1(i) = resCurrent(i, R, jin);
-buildtree( A : i1 );
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared.
  • -
  • R : Resistance/Impedance of the parallel resistor in Ohms
  • -
  • jin : Current through the ideal current source in Amps
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.5

-
-

(wd.)u_resCurrent

-

Unadapted Resistive Current Source.

-

An unadapted adaptor implementing a resistive current source within Wave Digital Filter connection trees.

-

It should be used as the root/top element of the connection tree. -It is comprised of an ideal current source in parallel with a resistor. -Can be used for either DC (constant) or AC (signal) current sources.

-

Usage

-
i1(i) = u_resCurrent(i, R, jin);
-buildtree( i1 : B );
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared.
  • -
  • R : Resistance/Impedance of the series resistor in Ohms
  • -
  • jin : Current through the ideal current source in Amps
  • -
-

Note: only usable as the root of a tree. -The adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.5

-
-

(wd.)u_switch

-

Unadapted Ideal Switch.

-

An unadapted adaptor implementing an ideal switch for Wave Digital Filter connection trees.

-

It should be used as the root/top element of the connection tree

-

Usage

-
s1(i) = u_resCurrent(i, lambda);
-buildtree( s1 : B );
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared.
  • -
  • lambda : switch state control. -1 for closed switch, 1 for open switch.
  • -
-

Note: only usable as the root of a tree. -The adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.2.8

-

Reactive One Port Adaptors

-
-

(wd.)capacitor

-

Adapted Capacitor.

-

A basic adaptor implementing a capacitor for use within Wave Digital Filter connection trees.

-

It should be used as a leaf/terminating element of the connection tree. -This capacitor model was digitized using the bi-linear transform.

-

Usage

-
c1(i) = capacitor(i, R);
-buildtree( A : c1 ) : _
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared.
  • -
  • R : Capacitance/Impedance of the capacitor being modeled in Farads.
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.3.1

-
-

(wd.)capacitor_Vout

-

Adapted Capacitor + voltage out.

-

A basic adaptor implementing a capacitor for use within Wave Digital Filter connection trees.

-

It should be used as a leaf/terminating element of the connection tree. -The capacitor will also pass the voltage across itself as an output of the model. -This capacitor model was digitized using the bi-linear transform.

-

Usage

-
cout(i) = capacitor_Vout(i, R);
-buildtree( A : cout ) : _
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • R : Capacitance/Impedence of the capacitor being modeled in Farads
  • -
-

Note: the adaptor must be declared as a seperate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.3.1

-
-

(wd.)inductor

-

Unadapted Inductor.

-

A basic adaptor implementing an inductor for use within Wave Digital Filter connection trees.

-

It should be used as a leaf/terminating element of the connection tree. -This inductor model was digitized using the bi-linear transform.

-

Usage

-
l1(i) = inductor(i, R);
-buildtree( A : l1 );
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • R : Inductance/Impedance of the inductor being modeled in Henries
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.3.2

-
-

(wd.)inductor_Vout

-

Unadapted Inductor + Voltage out.

-

A basic adaptor implementing an inductor for use within Wave Digital Filter connection trees.

-

It should be used as a leaf/terminating element of the connection tree. -The inductor will also pass the voltage across itself as an output of the model. -This inductor model was digitized using the bi-linear transform.

-

Usage

-
lout(i) = inductor_Vout(i, R);
-buildtree( A : lout ) : _
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • R : Inductance/Impedance of the inductor being modeled in Henries
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.3.2

-

Nonlinear One Port Adaptors

-
-

(wd.)u_idealDiode

-

Unadapted Ideal Diode.

-

An unadapted adaptor implementing an ideal diode for Wave Digital Filter connection trees.

-

It should be used as the root/top element of the connection tree.

-

Usage

-
buildtree( u_idealDiode : B );
-
-

Note: only usable as the root of a tree. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 3.2.3

-
-

(wd.)u_chua

-

Unadapted Chua Diode.

-

An adaptor implementing the chua diode / non-linear resistor within Wave Digital Filter connection trees.

-

It should be used as the root/top element of the connection tree.

-

Usage

-
chua1(i) = u_chua(i, G1, G2, V0);
-buildtree( chua1 : B );
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • G1 : resistance parameter 1 of the chua diode
  • -
  • G2 : resistance parameter 2 of the chua diode
  • -
  • V0 : voltage parameter of the chua diode
  • -
-

Note: only usable as the root of a tree. -The adaptor must be declared as a separate function before integration into the connection tree. -Correct implementation is shown above.

-

Reference

-

Meerkotter and Scholz, "Digital Simulation of Nonlinear Circuits by Wave Digital Filter Principles"

-
-

(wd.)lambert

-

An implementation of the lambert function. -It uses Halley's method of iteration to approximate the output. -Included in the WD library for use in non-linear diode models. -Adapted from K M Brigg's c++ lambert function approximation.

-

Usage

-
lambert(n, itr) : _
-
-

Where: -* n: value at which the lambert function will be evaluated -* itr: number of iterations before output

-
-

(wd.)u_diodePair

-

Unadapted pair of diodes facing in opposite directions.

-

An unadapted adaptor implementing two antiparallel diodes for Wave Digital Filter connection trees. -The behavior is approximated using Schottkey's ideal diode law.

-

Usage

-
d1(i) = u_diodePair(i, Is, Vt);
-buildtree( d1 : B );
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • Is : saturation current of the diodes
  • -
  • Vt : thermal resistances of the diodes
  • -
-

Note: only usable as the root of a tree. -Correct implementation is shown above.

-

Reference

-

K. Werner et al. "An Improved and Generalized Diode Clipper Model for Wave Digital Filters"

-
-

(wd.)u_diodeSingle

-

Unadapted single diode.

-

An unadapted adaptor implementing a single diode for Wave Digital Filter connection trees. -The behavior is approximated using Schottkey's ideal diode law.

-

Usage

-
d1(i) = u_diodeSingle(i, Is, Vt);
-buildtree( d1 : B );
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • Is : saturation current of the diodes
  • -
  • Vt : thermal resistances of the diodes
  • -
-

Note: only usable as the root of a tree. -Correct implementation is shown above.

-

Reference

-

K. Werner et al. "An Improved and Generalized Diode Clipper Model for Wave Digital Filters"

-
-

(wd.)u_diodeAntiparallel

-

Unadapted set of antiparallel diodes with M diodes facing forwards and N diodes facing backwards.

-

An unadapted adaptor implementing antiparallel diodes for Wave Digital Filter connection trees. -The behavior is approximated using Schottkey's ideal diode law.

-

Usage

-
d1(i) = u_diodeAntiparallel(i, Is, Vt);
-buildtree( d1 : B );
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • Is : saturation current of the diodes
  • -
  • Vt : thermal resistances of the diodes
  • -
-

Note: only usable as the root of a tree. -Correct implementation is shown above.

-

Reference

-

K. Werner et al. "An Improved and Generalized Diode Clipper Model for Wave Digital Filters"

-

Two Port Adaptors

-
-

(wd.)u_parallel2Port

-

Unadapted 2-port parallel connection.

-

An unadapted adaptor implementing a 2-port parallel connection between adaptors for Wave Digital Filter connection trees. -Elements connected to this adaptor will behave as if connected in parallel in circuit.

-

Usage

-
buildtree( u_parallel2Port : (A, B) );
-
-

Note: only usable as the root of a tree. -This adaptor has no user-accessible parameters. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.1

-
-

(wd.)parallel2Port

-

Adapted 2-port parallel connection.

-

An adaptor implementing a 2-port parallel connection between adaptors for Wave Digital Filter connection trees. -Elements connected to this adaptor will behave as if connected in parallel in circuit.

-

Usage

-
buildtree( A : parallel2Port : B );
-
-

Note: this adaptor has no user-accessible parameters. -It should be used within the connection tree with one previous and one forward adaptor. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.1

-
-

(wd.)u_series2Port

-

Unadapted 2-port series connection.

-

An unadapted adaptor implementing a 2-port series connection between adaptors for Wave Digital Filter connection trees. -Elements connected to this adaptor will behave as if connected in series in circuit.

-

Usage

-
buildtree( u_series2Port : (A, B) );
-
-

Note: only usable as the root of a tree. -This adaptor has no user-accessible parameters. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.1

-
-

(wd.)series2Port

-

Adapted 2-port series connection.

-

An adaptor implementing a 2-port series connection between adaptors for Wave Digital Filter connection trees. -Elements connected to this adaptor will behave as if connected in series in circuit.

-

Usage

-
buildtree( A : series2Port : B );
-
-

Note: this adaptor has no user-accessible parameters. -It should be used within the connection tree with one previous and one forward adaptor. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.1

-
-

(wd.)parallelCurrent

-

Adapted 2-port parallel connection + ideal current source.

-

An adaptor implementing a 2-port series connection and internal idealized current source between adaptors for Wave Digital Filter connection trees. -This adaptor connects the two connected elements and an additional ideal current source in parallel.

-

Usage

-
i1(i) = parallelCurrent(i, jin);
-buildtree(A : i1 : B);
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • jin : Current through the ideal current source in Amps
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -It should be used within a connection tree with one previous and one forward adaptor. -Correct implementation is shown above.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.2

-
-

(wd.)seriesVoltage

-

Adapted 2-port series connection + ideal voltage source.

-

An adaptor implementing a 2-port series connection and internal ideal voltage source between adaptors for Wave Digital Filter connection trees. -This adaptor connects the two connected adaptors and an additional ideal voltage source in series.

-

Usage

-
v1(i) = seriesVoltage(i, vin)
-buildtree( A : v1 : B );
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • vin : voltage across the ideal current source in Volts
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -It should be used within the connection tree with one previous and one forward adaptor.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.2

-
-

(wd.)u_transformer

-

Unadapted ideal transformer.

-

An adaptor implementing an ideal transformer for Wave Digital Filter connection trees. -The first downward-facing port corresponds to the primary winding connections, and the second downward-facing port to the secondary winding connections.

-

Usage

-
t1(i) = u_transformer(i, tr);
-buildtree(t1 : (A , B));
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • tr : the turn ratio between the windings on the primary and secondary coils
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -It may only be used as the root of the connection tree with two forward nodes.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.3

-
-

(wd.)transformer

-

Adapted ideal transformer.

-

An adaptor implementing an ideal transformer for Wave Digital Filter connection trees. -The upward-facing port corresponds to the primary winding connections, and the downward-facing port to the secondary winding connections

-

Usage

-
t1(i) = transformer(i, tr);
-buildtree(A : t1 : B);
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • tr : the turn ratio between the windings on the primary and secondary coils
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -It should be used within the connection tree with one backward and one forward nodes.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.3

-
-

(wd.)u_transformerActive

-

Unadapted ideal active transformer.

-

An adaptor implementing an ideal transformer for Wave Digital Filter connection trees. -The first downward-facing port corresponds to the primary winding connections, and the second downward-facing port to the secondary winding connections.

-

Usage

-
t1(i) = u_transformerActive(i, gamma1, gamma2);
-buildtree(t1 : (A , B));
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • gamma1 : the turn ratio describing the voltage relationship between the primary and secondary coils
  • -
  • gamma2 : the turn ratio describing the current relationship between the primary and secondary coils
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -It may only be used as the root of the connection tree with two forward nodes.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.3

-
-

(wd.)transformerActive

-

Adapted ideal active transformer.

-

An adaptor implementing an ideal active transformer for Wave Digital Filter connection trees. -The upward-facing port corresponds to the primary winding connections, and the downward-facing port to the secondary winding connections

-

Usage

-
t1(i) = transformerActive(i, gamma1, gamma2);
-buildtree(A : t1 : B);
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • gamma1 : the turn ratio describing the voltage relationship between the primary and secondary coils
  • -
  • gamma2 : the turn ratio describing the current relationship between the primary and secondary coils
  • -
-

Note: the adaptor must be declared as a separate function before integration into the connection tree. -It should be used within the connection tree with two forward nodes.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.4.3

-

Three Port Adaptors

-
-

(wd.)parallel

-

Adapted 3-port parallel connection.

-

An adaptor implementing a 3-port parallel connection between adaptors for Wave Digital Filter connection trees. -This adaptor is used to connect adaptors simulating components connected in parallel in the circuit.

-

Usage

-
buildtree( A : parallel : (B, C) );
-
-

Note: this adaptor has no user-accessible parameters. -It should be used within the connection tree with one previous and two forward adaptors.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.5.1

-
-

(wd.)series

-

Adapted 3-port series connection.

-

An adaptor implementing a 3-port series connection between adaptors for Wave Digital Filter connection trees. -This adaptor is used to connect adaptors simulating components connected in series in the circuit.

-

Usage

-

-tree = A : (series : (B, C));
-
-

Note: this adaptor has no user-accessible parameters. -It should be used within the connection tree with one previous and two forward adaptors.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 1.5.2

-

R-Type Adaptors

-
-

(wd.)u_sixportPassive

-

Unadapted six-port rigid connection.

-

An adaptor implementing a six-port passive rigid connection between elements. -It implements the simplest possible rigid connection found in the Fender Bassman Tonestack circuit.

-

Usage

-

-tree = u_sixportPassive : (A, B, C, D, E, F));
-
-

Note: this adaptor has no user-accessible parameters. -It should be used within the connection tree with six forward adaptors.

-

Reference

-

K. Werner, "Virtual Analog Modeling of Audio Circuitry Using Wave Digital Filters", 2.1.5

-

Node Creating Functions

-
-

(wd.)genericNode

-

Function for generating an adapted node from another faust function or scattering matrix.

-

This function generates a node which is suitable for use in the connection tree structure. -genericNode separates the function that it is passed into upward-going and downward-going waves.

-

Usage

-
n1(i) = genericNode(i, scatter, upRes);
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • scatter : the function which describes the the node's scattering behavior
  • -
  • upRes : the function which describes the node's upward-facing port-resistance
  • -
-

Note: scatter must be a function with n inputs, n outputs, and n-1 parameter inputs. - input/output 1 will be used as the adapted upward-facing port of the node, ports 2 to n will all be downward-facing. - The first input/output pair is assumed to already be adapted - i.e. the output 1 is not dependent on input 1. - The parameter inputs will receive the port resistances of the downward-facing ports.

-

upRes must be a function with n-1 parameter inputs and 1 output. - The parameter inputs will receive the port resistances of the downward-facing ports. - The output should give the upward-facing port resistance of the node based on the upward-facing port resistances of the input.

-

If used on a leaf element (n=1), the model will automatically introduce a one-sample delay. - Thus, the output of the node at sample t based on the input, a[t], should be the output one sample ahead, b[t+1]. - This may require transformation of the output signal.

-
-

(wd.)genericNode_Vout

-

Function for generating a terminating/leaf node which gives the voltage across itself as a model output.

-

This function generates a node which is suitable for use in the connection tree structure. -It also calculates the voltage across the element and gives it as a model output.

-

Usage

-
n1(i) = genericNode_Vout(i, scatter, upRes);
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • scatter : the function which describes the the node's scattering behavior
  • -
  • upRes : the function which describes the node's upward-facing port-resistance
  • -
-

Note: scatter must be a function with 1 input and 1 output. - It should give the output from the node based on the incident wave.

-

The model will automatically introduce a one-sample delay to the output of the function - Thus, the output of the node at sample t based on the input, a[t], should be the output one sample ahead, b[t+1]. - This may require transformation of the output signal.

-

upRes must be a function with no inputs and 1 output. - The output should give the upward-facing port resistance of the node.

-
-

(wd.)genericNode_Iout

-

Function for generating a terminating/leaf node which gives the current through itself as a model output.

-

This function generates a node which is suitable for use in the connection tree structure. -It also calculates the current through the element and gives it as a model output.

-

Usage

-
n1(i) = genericNode_Iout(i, scatter, upRes);
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • scatter : the function which describes the the node's scattering behavior
  • -
  • upRes : the function which describes the node's upward-facing port-resistance
  • -
-

Note: scatter must be a function with 1 input and 1 output. - It should give the output from the node based on the incident wave.

-

The model will automatically introduce a one-sample delay to the output of the function. - Thus, the output of the node at sample t based on the input, a[t], should be the output one sample ahead, b[t+1]. - This may require transformation of the output signal.

-

upRes must be a function with no inputs and 1 output. - The output should give the upward-facing port resistance of the node.

-
-

(wd.)u_genericNode

-

Function for generating an unadapted node from another Faust function or scattering matrix.

-

This function generates a node which is suitable for use as the root of the connection tree structure.

-

Usage

-
n1(i) = u_genericNode(i, scatter);
-
-

Where:

-
    -
  • i: index used by model-building functions. Should never be user declared
  • -
  • scatter : the function which describes the the node's scattering behavior
  • -
-

Note: -scatter must be a function with n inputs, n outputs, and n parameter inputs. - each input/output pair will be used as a downward-facing port of the node - the parameter inputs will receive the port resistances of the downward-facing ports.

-

Model Building Functions

-
-

(wd.)builddown

-

Function for building the structure for calculating waves traveling down the WD connection tree.

-

It recursively steps through the given tree, parametrizes the adaptors, and builds an algorithm. -It is used in conjunction with the buildup() function to create a model.

-

Usage

-
builddown(A : B)~buildup(A : B);
-
-

Where: - (A : B) : is a connection tree composed of WD adaptors

-
-

(wd.)buildup

-

Function for building the structure for calculating waves traveling up the WD connection tree.

-

It recursively steps through the given tree, parametrizes the adaptors, and builds an algorithm. -It is used in conjunction with the builddown() function to create a full structure.

-

Usage

-
builddown(A : B)~buildup(A : B);
-
-

Where: -(A : B) : is a connection tree composed of WD adaptors

-
-

(wd.)getres

-

Function for determining the upward-facing port resistance of a partial WD connection tree.

-

It recursively steps through the given tree, parametrizes the adaptors, and builds an algorithm. -It is used by the buildup and builddown functions but is also helpful in testing.

-

Usage

-
getres(A : B)~getres(A : B);
-
-

Where: -(A : B) : is a partial connection tree composed of WD adaptors

-

Note: -This function cannot be used on a complete WD tree. When called on an unadapted adaptor (u_ prefix), it will create errors.

-
-

(wd.)parres

-

Function for determining the upward-facing port resistance of a partial WD connection tree.

-

It recursively steps through the given tree, parametrizes the adaptors, and builds an algorithm. -It is used by the buildup and builddown functions but is also helpful in testing. -This function is a parallelized version of getres.

-

Usage

-
parres((A , B))~parres((A , B));
-
-

Where: -(A , B) : is a partial connection tree composed of WD adaptors

-

Note: this function cannot be used on a complete WD tree. When called on an unadapted adaptor (u_ prefix), it will create errors.

-
-

(wd.)buildout

-

Function for creating the output matrix for a WD model from a WD connection tree.

-

It recursively steps through the given tree and creates an output matrix passing only outputs.

-

Usage

-
buildout( A : B );
-
-

Where: -(A : B) : is a connection tree composed of WD adaptors

-
-

(wd.)buildtree

-

Function for building the DSP model from a WD connection tree structure.

-

It recursively steps through the given tree, parametrizes the adaptors, and builds the algorithm.

-

Usage

-
buildtree(A : B);
-
-

Where: -(A : B) : a connection tree composed of WD adaptors

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/wdmodels.lib/overview/index.html b/docs/contributors/faust/wdmodels.lib/overview/index.html deleted file mode 100644 index 1e23fad..0000000 --- a/docs/contributors/faust/wdmodels.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - wdmodels.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

wdmodels.lib Documentation

-

Welcome to the documentation for wdmodels.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.2.1

-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/webaudio.lib/1.1.0/doc/index.html b/docs/contributors/faust/webaudio.lib/1.1.0/doc/index.html deleted file mode 100644 index cae9210..0000000 --- a/docs/contributors/faust/webaudio.lib/1.1.0/doc/index.html +++ /dev/null @@ -1,366 +0,0 @@ - - - - - - - - - - - webaudio.lib - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

webaudio.lib

-

This library implement WebAudio filters, using their C++ version as a starting point, -taken from Mozilla Firefox implementation.

-

References

- -
-

(wa.)lowpass2

-

Standard second-order resonant lowpass filter with 12dB/octave rolloff. -Frequencies below the cutoff pass through, frequencies above it are attenuated.

-

Usage

-
_ : lowpass2(f0, Q, dtune) : _
-
-

Where:

-
    -
  • f0: cutoff frequency in Hz
  • -
  • Q: the quality factor
  • -
  • dtune: detuning of the frequency in cents
  • -
-

Reference

- -
-

(wa.)highpass2

-

Standard second-order resonant highpass filter with 12dB/octave rolloff. -Frequencies below the cutoff are attenuated, frequencies above it pass through.

-

Usage

-
_ : highpass2(f0, Q, dtune) : _
-
-

Where:

-
    -
  • f0: cutoff frequency in Hz
  • -
  • Q: the quality factor
  • -
  • dtune: detuning of the frequency in cents
  • -
-

Reference

- -
-

(wa.)bandpass2

-

Standard second-order bandpass filter. -Frequencies outside the given range of frequencies are attenuated, the frequencies inside it pass through.

-

Usage

-
_ : bandpass2(f0, Q, dtune) : _
-
-

Where:

-
    -
  • f0: cutoff frequency in Hz
  • -
  • Q: the quality factor
  • -
  • dtune: detuning of the frequency in cents
  • -
-

Reference

- -
-

(wa.)notch2

-

Standard notch filter, also called a band-stop or band-rejection filter. -It is the opposite of a bandpass filter: frequencies outside the give range of frequencies -pass through, frequencies inside it are attenuated.

-

Usage

-
_ : notch2(f0, Q, dtune) : _
-
-

Where:

-
    -
  • f0: cutoff frequency in Hz
  • -
  • Q: the quality factor
  • -
  • dtune: detuning of the frequency in cents
  • -
-

Reference

- -
-

(wa.)allpass2

-

Standard second-order allpass filter. It lets all frequencies through, -but changes the phase-relationship between the various frequencies.

-

Usage

-
_ : allpass2(f0, Q, dtune) : _
-
-

Where:

-
    -
  • f0: cutoff frequency in Hz
  • -
  • Q: the quality factor
  • -
  • dtune: detuning of the frequency in cents
  • -
-

Reference

- -
-

(wa.)peaking2

-

Frequencies inside the range get a boost or an attenuation, frequencies outside it are unchanged.

-

Usage

-
_ : peaking2(f0, gain, Q, dtune) : _
-
-

Where:

-
    -
  • f0: cutoff frequency in Hz
  • -
  • gain: the gain in dB
  • -
  • Q: the quality factor
  • -
  • dtune: detuning of the frequency in cents
  • -
-

Reference

- -
-

(wa.)lowshelf2

-

Standard second-order lowshelf filter. -Frequencies lower than the frequency get a boost, or an attenuation, frequencies over it are unchanged.

-
_ : lowshelf2(f0, gain, dtune) : _
-
-

Where:

-
    -
  • f0: cutoff frequency in Hz
  • -
  • gain: the gain in dB
  • -
  • dtune: detuning of the frequency in cents
  • -
-

Reference

- -
-

(wa.)highshelf2

-

Standard second-order highshelf filter. -Frequencies higher than the frequency get a boost or an attenuation, frequencies lower than it are unchanged.

-
_ : highshelf2(f0, gain, dtune) : _
-
-

Where:

-
    -
  • f0: cutoff frequency in Hz
  • -
  • gain: the gain in dB
  • -
  • dtune: detuning of the frequency in cents
  • -
-

Reference

-
-
-
- - - - - - - - - - - - diff --git a/docs/contributors/faust/webaudio.lib/overview/index.html b/docs/contributors/faust/webaudio.lib/overview/index.html deleted file mode 100644 index 6528a2c..0000000 --- a/docs/contributors/faust/webaudio.lib/overview/index.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - webaudio.lib Documentation - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

webaudio.lib Documentation

-

Welcome to the documentation for webaudio.lib. Below you will find an overview of the different versions of this library, along with links to their respective documentation.

-

1.1.0

-
-
- - - - - - - - - - - - diff --git a/docs/css/base.css b/docs/css/base.css deleted file mode 100644 index f5f27ba..0000000 --- a/docs/css/base.css +++ /dev/null @@ -1,366 +0,0 @@ -html { - /* The nav header is 3.5rem high, plus 20px for the margin-top of the - main container. */ - scroll-padding-top: calc(3.5rem + 20px); -} - -/* Replacement for `body { background-attachment: fixed; }`, which has - performance issues when scrolling on large displays. See #1394. */ -body::before { - content: ' '; - position: fixed; - width: 100%; - height: 100%; - top: 0; - left: 0; - background-color: var(--bs-body-bg); - background: url(../img/grid.png) repeat-x; - will-change: transform; - z-index: -1; -} - -body > .container { - margin-top: 20px; - min-height: 400px; -} - -.navbar.fixed-top { - position: -webkit-sticky; - position: sticky; -} - -.source-links { - float: right; -} - -.col-md-9 img { - max-width: 100%; - display: inline-block; - padding: 4px; - line-height: 1.428571429; - background-color: var(--bs-secondary-bg-subtle); - border: 1px solid var(--bs-secondary-border-subtle); - border-radius: 4px; - margin: 20px auto 30px auto; -} - -h1 { - color: inherit; - font-weight: 400; - font-size: 42px; -} - -h2, h3, h4, h5, h6 { - color: inherit; - font-weight: 300; -} - -hr { - border-top: 1px solid #aaa; - opacity: 1; -} - -pre, .rst-content tt { - max-width: 100%; - background-color: var(--bs-body-bg); - border: solid 1px var(--bs-border-color); - color: var(--bs-body-color); - overflow-x: auto; -} - -code.code-large, .rst-content tt.code-large { - font-size: 90%; -} - -code { - padding: 2px 5px; - background-color: rgba(var(--bs-body-bg-rgb), 0.75); - border: solid 1px var(--bs-border-color); - color: var(--bs-body-color); - white-space: pre-wrap; - word-wrap: break-word; -} - -pre code { - display: block; - border: none; - white-space: pre; - word-wrap: normal; - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - font-size: 12px; -} - -kbd { - padding: 2px 4px; - font-size: 90%; - color: var(--bs-secondary-text-emphasis); - background-color: var(--bs-secondary-bg-subtle); - border-radius: 3px; - -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); - box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); -} - -a code { - color: inherit; -} - -a:hover code, a:focus code { - color: inherit; -} - -footer { - margin-top: 30px; - margin-bottom: 10px; - text-align: center; - font-weight: 200; -} - -.modal-dialog { - margin-top: 60px; -} - -/* - * Side navigation - * - * Scrollspy and affixed enhanced navigation to highlight sections and secondary - * sections of docs content. - */ - -.bs-sidebar.affix { - position: -webkit-sticky; - position: sticky; - /* The nav header is 3.5rem high, plus 20px for the margin-top of the - main container. */ - top: calc(3.5rem + 20px); -} - -.bs-sidebar.card { - padding: 0; - max-height: 90%; - overflow-y: auto; -} - -/* Toggle (vertically flip) sidebar collapse icon */ -.bs-sidebar .navbar-toggler span { - -moz-transform: scale(1, -1); - -webkit-transform: scale(1, -1); - -o-transform: scale(1, -1); - -ms-transform: scale(1, -1); - transform: scale(1, -1); -} - -.bs-sidebar .navbar-toggler.collapsed span { - -moz-transform: scale(1, 1); - -webkit-transform: scale(1, 1); - -o-transform: scale(1, 1); - -ms-transform: scale(1, 1); - transform: scale(1, 1); -} - -/* First level of nav */ -.bs-sidebar > .navbar-collapse > .nav { - padding-top: 10px; - padding-bottom: 10px; - border-radius: 5px; - width: 100%; -} - -/* All levels of nav */ -.bs-sidebar .nav > li > a { - display: block; - padding: 5px 20px; - z-index: 1; -} -.bs-sidebar .nav > li > a:hover, -.bs-sidebar .nav > li > a:focus { - text-decoration: none; - border-right: 1px solid; -} -.bs-sidebar .nav > li > a.active, -.bs-sidebar .nav > li > a.active:hover, -.bs-sidebar .nav > li > a.active:focus { - font-weight: bold; - background-color: transparent; - border-right: 1px solid; -} - -.bs-sidebar .nav .nav .nav { - margin-left: 1em; -} - -.bs-sidebar .nav > li > a { - font-weight: bold; -} - -.bs-sidebar .nav .nav > li > a { - font-weight: normal; -} - -.headerlink { - font-family: FontAwesome; - font-size: 14px; - display: none; - padding-left: .5em; - text-decoration: none; - vertical-align: middle; -} - -h1:hover .headerlink, h2:hover .headerlink, h3:hover .headerlink, h4:hover .headerlink, h5:hover .headerlink, h6:hover .headerlink { - display:inline-block; -} - -blockquote { - padding-left: 10px; - border-left: 4px solid #e6e6e6; -} - -.admonition, details { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; - text-align: left; -} - -.admonition.note, details.note { - color: var(--bs-primary-text-emphasis); - background-color: var(--bs-primary-bg-subtle); - border-color: var(--bs-primary-border-subtle); -} - -.admonition.note h1, .admonition.note h2, .admonition.note h3, -.admonition.note h4, .admonition.note h5, .admonition.note h6, -details.note h1, details.note h2, details.note h3, -details.note h4, details.note h5, details.note h6 { - color: var(--bs-primary-text-emphasis); -} - -.admonition.info, details.info { - color: var(--bs-info-text-emphasis); - background-color: var(--bs-info-bg-subtle); - border-color: var(--bs-info-border-subtle); -} - -.admonition.info h1, .admonition.info h2, .admonition.info h3, -.admonition.info h4, .admonition.info h5, .admonition.info h6, -details.info h1, details.info h2, details.info h3, -details.info h4, details.info h5, details.info h6 { - color: var(--bs-info-text-emphasis); -} - -.admonition.warning, details.warning { - color: var(--bs-warning-text-emphasis); - background-color: var(--bs-warning-bg-subtle); - border-color: var(--bs-warning-border-subtle); -} - -.admonition.warning h1, .admonition.warning h2, .admonition.warning h3, -.admonition.warning h4, .admonition.warning h5, .admonition.warning h6, -details.warning h1, details.warning h2, details.warning h3, -details.warning h4, details.warning h5, details.warning h6 { - color: var(--bs-warning-text-emphasis); -} - -.admonition.danger, details.danger { - color: var(--bs-danger-text-emphasis); - background-color: var(--bs-danger-bg-subtle); - border-color: var(--bs-danger-border-subtle); -} - -.admonition.danger h1, .admonition.danger h2, .admonition.danger h3, -.admonition.danger h4, .admonition.danger h5, .admonition.danger h6, -details.danger h1, details.danger h2, details.danger h3, -details.danger h4, details.danger h5, details.danger h6 { - color: var(--bs-danger-text-emphasis); -} - -.admonition, details { - color: var(--bs-light-text-emphasis); - background-color: var(--bs-light-bg-subtle); - border-color: var(--bs-light-border-subtle); -} - -.admonition h1, .admonition h2, .admonition h3, -.admonition h4, .admonition h5, .admonition h6, -details h1, details h2, details h3, -details h4, details h5, details h6 { - color: var(--bs-light-text-emphasis); -} - -.admonition-title, summary { - font-weight: bold; - text-align: left; -} - -.admonition>p:last-child, details>p:last-child { - margin-bottom: 0; -} - -@media (max-width: 991.98px) { - .navbar-collapse.show { - overflow-y: auto; - max-height: calc(100vh - 3.5rem); - } -} - -.dropdown-item.open { - color: var(--bs-dropdown-link-active-color); - background-color: var(--bs-dropdown-link-active-bg); -} - -.dropdown-submenu > .dropdown-menu { - margin: 0 0 0 1.5rem; - padding: 0; - border-width: 0; -} - -.dropdown-submenu > a::after { - display: block; - content: " "; - float: right; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - border-width: 5px 0 5px 5px; - border-left-color: var(--bs-dropdown-link-active-color); - margin-top: 5px; - margin-right: -10px; -} - -.dropdown-submenu:hover > a::after { - border-left-color: var(--bs-dropdown-link-active-color); -} - -@media (min-width: 992px) { - .dropdown-menu { - overflow-y: auto; - max-height: calc(100vh - 3.5rem); - } - - .dropdown-submenu { - position: relative; - } - - .dropdown-submenu > .dropdown-menu { - position: fixed !important; - margin-top: -9px; - margin-left: -2px; - border-width: 1px; - padding: 0.5rem 0; - } - - .dropdown-submenu.pull-left { - float: none; - } - - .dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - } -} - -@media print { - /* Remove sidebar when print */ - .col-md-3 { display: none; } -} diff --git a/docs/css/bootstrap.min.css b/docs/css/bootstrap.min.css deleted file mode 100644 index 0eed851..0000000 --- a/docs/css/bootstrap.min.css +++ /dev/null @@ -1,12 +0,0 @@ -@charset "UTF-8";/*! - * Bootswatch v5.3.2 (https://bootswatch.com) - * Theme: cerulean - * Copyright 2012-2023 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root,[data-bs-theme=light]{--bs-blue:#033c73;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#e83e8c;--bs-red:#c71c22;--bs-orange:#fd7e14;--bs-yellow:#dd5600;--bs-green:#73a839;--bs-teal:#20c997;--bs-cyan:#2fa4e7;--bs-black:#000;--bs-white:#fff;--bs-gray:#868e96;--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:#868e96;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#2fa4e7;--bs-secondary:#e9ecef;--bs-success:#73a839;--bs-info:#033c73;--bs-warning:#dd5600;--bs-danger:#c71c22;--bs-light:#f8f9fa;--bs-dark:#343a40;--bs-primary-rgb:47,164,231;--bs-secondary-rgb:233,236,239;--bs-success-rgb:115,168,57;--bs-info-rgb:3,60,115;--bs-warning-rgb:221,86,0;--bs-danger-rgb:199,28,34;--bs-light-rgb:248,249,250;--bs-dark-rgb:52,58,64;--bs-primary-text-emphasis:#13425c;--bs-secondary-text-emphasis:#5d5e60;--bs-success-text-emphasis:#2e4317;--bs-info-text-emphasis:#01182e;--bs-warning-text-emphasis:#582200;--bs-danger-text-emphasis:#500b0e;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#d5edfa;--bs-secondary-bg-subtle:#fbfbfc;--bs-success-bg-subtle:#e3eed7;--bs-info-bg-subtle:#cdd8e3;--bs-warning-bg-subtle:#f8ddcc;--bs-danger-bg-subtle:#f4d2d3;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#acdbf5;--bs-secondary-border-subtle:#f6f7f9;--bs-success-border-subtle:#c7dcb0;--bs-info-border-subtle:#9ab1c7;--bs-warning-border-subtle:#f1bb99;--bs-danger-border-subtle:#e9a4a7;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, 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:#495057;--bs-body-color-rgb:73,80,87;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(73, 80, 87, 0.75);--bs-secondary-color-rgb:73,80,87;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(73, 80, 87, 0.5);--bs-tertiary-color-rgb:73,80,87;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:#2fa4e7;--bs-link-color:#2fa4e7;--bs-link-color-rgb:47,164,231;--bs-link-decoration:underline;--bs-link-hover-color:#2683b9;--bs-link-hover-color-rgb:38,131,185;--bs-code-color:#e83e8c;--bs-highlight-color:#495057;--bs-highlight-bg:#f8ddcc;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(47, 164, 231, 0.25);--bs-form-valid-color:#73a839;--bs-form-valid-border-color:#73a839;--bs-form-invalid-color:#c71c22;--bs-form-invalid-border-color:#c71c22}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#82c8f1;--bs-secondary-text-emphasis:#f2f4f5;--bs-success-text-emphasis:#abcb88;--bs-info-text-emphasis:#688aab;--bs-warning-text-emphasis:#eb9a66;--bs-danger-text-emphasis:#dd777a;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#09212e;--bs-secondary-bg-subtle:#2f2f30;--bs-success-bg-subtle:#17220b;--bs-info-bg-subtle:#010c17;--bs-warning-bg-subtle:#2c1100;--bs-danger-bg-subtle:#280607;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#1c628b;--bs-secondary-border-subtle:#8c8e8f;--bs-success-border-subtle:#456522;--bs-info-border-subtle:#022445;--bs-warning-border-subtle:#853400;--bs-danger-border-subtle:#771114;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#82c8f1;--bs-link-hover-color:#9bd3f4;--bs-link-color-rgb:130,200,241;--bs-link-hover-color-rgb:155,211,244;--bs-code-color:#f18bba;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#582200;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, 0.15);--bs-form-valid-color:#abcb88;--bs-form-valid-border-color:#abcb88;--bs-form-invalid-color:#dd777a;--bs-form-invalid-border-color:#dd777a}*,::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;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.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;color:var(--bs-heading-color)}.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[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:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}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:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);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]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[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]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-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:#868e96}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-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}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;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.33333333%}.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.66666667%}.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.33333333%}.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.66666667%}.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.33333333%}.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.66666667%}.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.33333333%}.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.66666667%}.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.33333333%}.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.66666667%}.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.33333333%}.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.66666667%}.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-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#d5edfa;--bs-table-border-color:#aabec8;--bs-table-striped-bg:#cae1ee;--bs-table-striped-color:#000;--bs-table-active-bg:#c0d5e1;--bs-table-active-color:#000;--bs-table-hover-bg:#c5dbe7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#fbfbfc;--bs-table-border-color:#c9c9ca;--bs-table-striped-bg:#eeeeef;--bs-table-striped-color:#000;--bs-table-active-bg:#e2e2e3;--bs-table-active-color:#000;--bs-table-hover-bg:#e8e8e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#e3eed7;--bs-table-border-color:#b6beac;--bs-table-striped-bg:#d8e2cc;--bs-table-striped-color:#000;--bs-table-active-bg:#ccd6c2;--bs-table-active-color:#000;--bs-table-hover-bg:#d2dcc7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cdd8e3;--bs-table-border-color:#a4adb6;--bs-table-striped-bg:#c3cdd8;--bs-table-striped-color:#000;--bs-table-active-bg:#b9c2cc;--bs-table-active-color:#000;--bs-table-hover-bg:#bec8d2;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#f8ddcc;--bs-table-border-color:#c6b1a3;--bs-table-striped-bg:#ecd2c2;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc7b8;--bs-table-active-color:#000;--bs-table-hover-bg:#e5ccbd;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f4d2d3;--bs-table-border-color:#c3a8a9;--bs-table-striped-bg:#e8c8c8;--bs-table-striped-color:#000;--bs-table-active-bg:#dcbdbe;--bs-table-active-color:#000;--bs-table-hover-bg:#e2c2c3;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#343a40;--bs-table-border-color:#5d6166;--bs-table-striped-bg:#3e444a;--bs-table-striped-color:#fff;--bs-table-active-bg:#484e53;--bs-table-active-color:#fff;--bs-table-hover-bg:#43494e;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.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 + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);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:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#97d2f3;outline:0;box-shadow:0 0 0 .25rem rgba(47,164,231,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::-moz-placeholder{color:var(--bs-secondary-color);opacity:1}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;-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:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;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:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline: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 + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.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-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.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}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#97d2f3;outline:0;box-shadow:0 0 0 .25rem rgba(47,164,231,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{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-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-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:#97d2f3;outline:0;box-shadow:0 0 0 .25rem rgba(47,164,231,.25)}.form-check-input:checked{background-color:#2fa4e7;border-color:#2fa4e7}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#2fa4e7;border-color:#2fa4e7;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);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{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2397d2f3'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.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}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(47,164,231,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(47,164,231,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;-webkit-appearance:none;appearance:none;background-color:#2fa4e7;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}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#c1e4f8}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;-moz-appearance:none;appearance:none;background-color:#2fa4e7;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}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#c1e4f8}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) 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,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.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{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:not(:-moz-placeholder-shown)~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control-plaintext~label::after,.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#868e96}.form-floating>.form-control:disabled~label::after,.form-floating>:disabled~label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.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:var(--bs-border-radius-lg)}.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:var(--bs-border-radius-sm)}.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)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){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>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.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:var(--bs-success);border-radius:var(--bs-border-radius)}.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:var(--bs-form-valid-border-color);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='%2373a839' 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'/%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:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{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:var(--bs-form-valid-border-color)}.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"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2373a839' 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'/%3e%3c/svg%3e");padding-right:4.125rem;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:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.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:var(--bs-danger);border-radius:var(--bs-border-radius)}.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:var(--bs-form-invalid-border-color);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='%23c71c22'%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='%23c71c22' 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:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{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:var(--bs-form-invalid-border-color)}.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"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23c71c22'%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='%23c71c22' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;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:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);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:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#2fa4e7;--bs-btn-border-color:#2fa4e7;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#288bc4;--bs-btn-hover-border-color:#2683b9;--bs-btn-focus-shadow-rgb:78,178,235;--bs-btn-active-color:#fff;--bs-btn-active-bg:#2683b9;--bs-btn-active-border-color:#237bad;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#2fa4e7;--bs-btn-disabled-border-color:#2fa4e7}.btn-secondary{--bs-btn-color:#000;--bs-btn-bg:#e9ecef;--bs-btn-border-color:#e9ecef;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#eceff1;--bs-btn-hover-border-color:#ebeef1;--bs-btn-focus-shadow-rgb:198,201,203;--bs-btn-active-color:#000;--bs-btn-active-bg:#edf0f2;--bs-btn-active-border-color:#ebeef1;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#e9ecef;--bs-btn-disabled-border-color:#e9ecef}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#73a839;--bs-btn-border-color:#73a839;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#628f30;--bs-btn-hover-border-color:#5c862e;--bs-btn-focus-shadow-rgb:136,181,87;--bs-btn-active-color:#fff;--bs-btn-active-bg:#5c862e;--bs-btn-active-border-color:#567e2b;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#73a839;--bs-btn-disabled-border-color:#73a839}.btn-info{--bs-btn-color:#fff;--bs-btn-bg:#033c73;--bs-btn-border-color:#033c73;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#033362;--bs-btn-hover-border-color:#02305c;--bs-btn-focus-shadow-rgb:41,89,136;--bs-btn-active-color:#fff;--bs-btn-active-bg:#02305c;--bs-btn-active-border-color:#022d56;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#033c73;--bs-btn-disabled-border-color:#033c73}.btn-warning{--bs-btn-color:#fff;--bs-btn-bg:#dd5600;--bs-btn-border-color:#dd5600;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bc4900;--bs-btn-hover-border-color:#b14500;--bs-btn-focus-shadow-rgb:226,111,38;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b14500;--bs-btn-active-border-color:#a64100;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dd5600;--bs-btn-disabled-border-color:#dd5600}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#c71c22;--bs-btn-border-color:#c71c22;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#a9181d;--bs-btn-hover-border-color:#9f161b;--bs-btn-focus-shadow-rgb:207,62,67;--bs-btn-active-color:#fff;--bs-btn-active-bg:#9f161b;--bs-btn-active-border-color:#95151a;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#c71c22;--bs-btn-disabled-border-color:#c71c22}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#343a40;--bs-btn-border-color:#343a40;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#52585d;--bs-btn-hover-border-color:#484e53;--bs-btn-focus-shadow-rgb:82,88,93;--bs-btn-active-color:#fff;--bs-btn-active-bg:#5d6166;--bs-btn-active-border-color:#484e53;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#343a40;--bs-btn-disabled-border-color:#343a40}.btn-outline-primary{--bs-btn-color:#2fa4e7;--bs-btn-border-color:#2fa4e7;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#2fa4e7;--bs-btn-hover-border-color:#2fa4e7;--bs-btn-focus-shadow-rgb:47,164,231;--bs-btn-active-color:#fff;--bs-btn-active-bg:#2fa4e7;--bs-btn-active-border-color:#2fa4e7;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#2fa4e7;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#2fa4e7;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#e9ecef;--bs-btn-border-color:#e9ecef;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#e9ecef;--bs-btn-hover-border-color:#e9ecef;--bs-btn-focus-shadow-rgb:233,236,239;--bs-btn-active-color:#000;--bs-btn-active-bg:#e9ecef;--bs-btn-active-border-color:#e9ecef;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#e9ecef;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#e9ecef;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#73a839;--bs-btn-border-color:#73a839;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#73a839;--bs-btn-hover-border-color:#73a839;--bs-btn-focus-shadow-rgb:115,168,57;--bs-btn-active-color:#fff;--bs-btn-active-bg:#73a839;--bs-btn-active-border-color:#73a839;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#73a839;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#73a839;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#033c73;--bs-btn-border-color:#033c73;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#033c73;--bs-btn-hover-border-color:#033c73;--bs-btn-focus-shadow-rgb:3,60,115;--bs-btn-active-color:#fff;--bs-btn-active-bg:#033c73;--bs-btn-active-border-color:#033c73;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#033c73;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#033c73;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#dd5600;--bs-btn-border-color:#dd5600;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dd5600;--bs-btn-hover-border-color:#dd5600;--bs-btn-focus-shadow-rgb:221,86,0;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dd5600;--bs-btn-active-border-color:#dd5600;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dd5600;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dd5600;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#c71c22;--bs-btn-border-color:#c71c22;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#c71c22;--bs-btn-hover-border-color:#c71c22;--bs-btn-focus-shadow-rgb:199,28,34;--bs-btn-active-color:#fff;--bs-btn-active-bg:#c71c22;--bs-btn-active-border-color:#c71c22;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#c71c22;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#c71c22;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#343a40;--bs-btn-border-color:#343a40;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#343a40;--bs-btn-hover-border-color:#343a40;--bs-btn-focus-shadow-rgb:52,58,64;--bs-btn-active-color:#fff;--bs-btn-active-bg:#343a40;--bs-btn-active-border-color:#343a40;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#343a40;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#343a40;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#868e96;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:78,178,235;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;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,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{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{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:#fff;--bs-dropdown-link-hover-bg:#2fa4e7;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#2fa4e7;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#868e96;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.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:var(--bs-dropdown-spacer)}.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:var(--bs-dropdown-spacer)}.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:var(--bs-dropdown-spacer)}.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:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#2fa4e7;--bs-dropdown-link-disabled-color:#adb5bd;--bs-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{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.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:calc(var(--bs-border-width) * -1)}.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{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;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:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(47,164,231,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#2fa4e7}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:0.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.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{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), 0.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2873, 80, 87, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.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:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@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 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);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:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{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;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .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:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{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;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .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:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{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;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .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:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{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;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .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:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{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;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .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:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{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;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, 0.8);--bs-navbar-hover-color:#fff;--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.8%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.8%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.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:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (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{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-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;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23495057'%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");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2313425c'%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");--bs-accordion-btn-focus-border-color:#97d2f3;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(47, 164, 231, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-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,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2382c8f1'%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");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2382c8f1'%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")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(47, 164, 231, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#2fa4e7;--bs-pagination-active-border-color:#2fa4e7;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);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:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width) * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#2fa4e7;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@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:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#2fa4e7;--bs-list-group-active-border-color:#2fa4e7;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:0.5;--bs-btn-close-hover-opacity:0.75;--bs-btn-close-focus-shadow:0 0 0 0.25rem rgba(47, 164, 231, 0.25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;--bs-btn-close-white-filter:invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);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% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-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-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@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-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@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-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@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-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@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-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@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-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);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;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:#2fa4e7;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);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;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.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:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{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%}.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}[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.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:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.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{animation:placeholder-glow 2s ease-in-out infinite}@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%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#000!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#fff!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#fff!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(38,131,185,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(38,131,185,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(38,131,185,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(237,240,242,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(237,240,242,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(237,240,242,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(92,134,46,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(92,134,46,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(92,134,46,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(2,48,92,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(2,48,92,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(2,48,92,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(177,69,0,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(177,69,0,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(177,69,0,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(159,22,27,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(159,22,27,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(159,22,27,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(42,46,51,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(42,46,51,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(42,46,51,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-underline-offset:0.25em;-webkit-backface-visibility:hidden;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.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}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom: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){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}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!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:var(--bs-border-width);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}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-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:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex: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}.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}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity: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}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10{--bs-link-opacity:0.1}.link-opacity-10-hover:hover{--bs-link-opacity:0.1}.link-opacity-25{--bs-link-opacity:0.25}.link-opacity-25-hover:hover{--bs-link-opacity:0.25}.link-opacity-50{--bs-link-opacity:0.5}.link-opacity-50-hover:hover{--bs-link-opacity:0.5}.link-opacity-75{--bs-link-opacity:0.75}.link-opacity-75-hover:hover{--bs-link-opacity:0.75}.link-opacity-100{--bs-link-opacity:1}.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1{text-underline-offset:0.125em!important}.link-offset-1-hover:hover{text-underline-offset:0.125em!important}.link-offset-2{text-underline-offset:0.25em!important}.link-offset-2-hover:hover{text-underline-offset:0.25em!important}.link-offset-3{text-underline-offset:0.375em!important}.link-offset-3-hover:hover{text-underline-offset:0.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0{--bs-link-underline-opacity:0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10{--bs-link-underline-opacity:0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.link-underline-opacity-25{--bs-link-underline-opacity:0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.link-underline-opacity-50{--bs-link-underline-opacity:0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.link-underline-opacity-75{--bs-link-underline-opacity:0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.link-underline-opacity-100{--bs-link-underline-opacity:1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity: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-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-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:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex: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}.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}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex: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}.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}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex: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}.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}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex: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}.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}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex: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}.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}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (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-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}.navbar.bg-primary{background-image:linear-gradient(#50b3eb,#2fa4e7 60%,#2c9ad9)}.navbar.bg-secondary{background-image:linear-gradient(#edeff2,#e9ecef 60%,#dbdee1)}.navbar.bg-success{background-image:linear-gradient(#89b659,#73a839 60%,#6c9e36)}.navbar.bg-info{background-image:linear-gradient(#2b5b89,#033c73 60%,#03386c)}.navbar.bg-warning{background-image:linear-gradient(#e27129,#dd5600 60%,#d05100)}.navbar.bg-danger{background-image:linear-gradient(#d04045,#c71c22 60%,#bb1a20)}.navbar.bg-light{background-image:linear-gradient(#f9fafb,#f8f9fa 60%,#e9eaeb)}.navbar.bg-dark{background-image:linear-gradient(#545a5f,#343a40 60%,#31373c)}.nav-link,.navbar-brand{text-shadow:0 1px 0 rgba(0,0,0,.05)}.btn{text-shadow:0 1px 0 rgba(0,0,0,.05)}.btn-outline-secondary,.btn-secondary{color:#495057}.btn-primary{background-image:linear-gradient(#50b3eb,#2fa4e7 60%,#2c9ad9)}.btn-secondary{background-image:linear-gradient(#edeff2,#e9ecef 60%,#dbdee1)}.btn-success{background-image:linear-gradient(#89b659,#73a839 60%,#6c9e36)}.btn-info{background-image:linear-gradient(#2b5b89,#033c73 60%,#03386c)}.btn-warning{background-image:linear-gradient(#e27129,#dd5600 60%,#d05100)}.btn-danger{background-image:linear-gradient(#d04045,#c71c22 60%,#bb1a20)}.btn-light{background-image:linear-gradient(#f9fafb,#f8f9fa 60%,#e9eaeb)}.btn-dark{background-image:linear-gradient(#545a5f,#343a40 60%,#31373c)}.text-secondary{color:#adb5bd!important}.bg-danger .h1,.bg-danger .h2,.bg-danger .h3,.bg-danger .h4,.bg-danger .h5,.bg-danger .h6,.bg-danger h1,.bg-danger h2,.bg-danger h3,.bg-danger h4,.bg-danger h5,.bg-danger h6,.bg-dark .h1,.bg-dark .h2,.bg-dark .h3,.bg-dark .h4,.bg-dark .h5,.bg-dark .h6,.bg-dark h1,.bg-dark h2,.bg-dark h3,.bg-dark h4,.bg-dark h5,.bg-dark h6,.bg-info .h1,.bg-info .h2,.bg-info .h3,.bg-info .h4,.bg-info .h5,.bg-info .h6,.bg-info h1,.bg-info h2,.bg-info h3,.bg-info h4,.bg-info h5,.bg-info h6,.bg-primary .h1,.bg-primary .h2,.bg-primary .h3,.bg-primary .h4,.bg-primary .h5,.bg-primary .h6,.bg-primary h1,.bg-primary h2,.bg-primary h3,.bg-primary h4,.bg-primary h5,.bg-primary h6,.bg-success .h1,.bg-success .h2,.bg-success .h3,.bg-success .h4,.bg-success .h5,.bg-success .h6,.bg-success h1,.bg-success h2,.bg-success h3,.bg-success h4,.bg-success h5,.bg-success h6,.bg-warning .h1,.bg-warning .h2,.bg-warning .h3,.bg-warning .h4,.bg-warning .h5,.bg-warning .h6,.bg-warning h1,.bg-warning h2,.bg-warning h3,.bg-warning h4,.bg-warning h5,.bg-warning h6{color:#fff}.dropdown-menu .dropdown-header{color:#868e96}.badge.bg-light,.badge.bg-secondary{color:#343a40} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/docs/css/bootstrap.min.css.map b/docs/css/bootstrap.min.css.map deleted file mode 100644 index 45f3248..0000000 --- a/docs/css/bootstrap.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["dist/cerulean/bootstrap.css"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/docs/css/brands.min.css b/docs/css/brands.min.css deleted file mode 100644 index 93a9a73..0000000 --- a/docs/css/brands.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2023 Fonticons, Inc. - */ -:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"} \ No newline at end of file diff --git a/docs/css/extra.css b/docs/css/extra.css deleted file mode 100644 index 1284b52..0000000 --- a/docs/css/extra.css +++ /dev/null @@ -1,11 +0,0 @@ - -code { - color: #C7254E; - background: #F9F2F4; -} - - -.hljs { - color: #C7254E; - background: #F9F2F4; -} diff --git a/docs/css/fontawesome.min.css b/docs/css/fontawesome.min.css deleted file mode 100644 index 688dd75..0000000 --- a/docs/css/fontawesome.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2023 Fonticons, Inc. - */ -.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} - -.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} -.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0} \ No newline at end of file diff --git a/docs/css/solid.min.css b/docs/css/solid.min.css deleted file mode 100644 index 7e1fb2d..0000000 --- a/docs/css/solid.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2023 Fonticons, Inc. - */ -:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900} \ No newline at end of file diff --git a/docs/css/v4-font-face.min.css b/docs/css/v4-font-face.min.css deleted file mode 100644 index dadd6c5..0000000 --- a/docs/css/v4-font-face.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2023 Fonticons, Inc. - */ -@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/docs/img/favicon.ico b/docs/img/favicon.ico deleted file mode 100644 index e85006a3ce1c6fd81faa6d5a13095519c4a6fc96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmd6lF-yZh9L1kl>(HSEK`2y^4yB6->f+$wD)=oNY!UheIt03Q=;qj=;8*Bap_4*& za8yAl;wmmx5Yyi^7dXN-WYdJ-{qNqpcez|5t#Fr0qTSYcPTG`I2PBk8r$~4kg^0zN zCJe(rhix3do!L$bZ+IuZ{i08x=JR3=e+M4pv0KsKA??{u_*EFfo|`p&t`Vf=jn{)F z1fKk9hWsmYwqWAP^JO*5u*R;*L&dX3H$%S7oB$f0{ISh{QVXuncnzN67WQH2`lip7 zhX+VI$6x$1+$8gMjh4+1l0N#8_0Fh=N#EwpKk{SeE!)SHFB@xQFX3y+8sF#_@!bDW eIdI-IC`$c%>bk?KbPeN9RHtL<1^)v~#xMt8oB^@` diff --git a/docs/img/grid.png b/docs/img/grid.png deleted file mode 100644 index 878c3ed5c196539c4e2da35b7787ab08e98b9cca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1458 zcmeAS@N?(olHy`uVBq!ia0vp^Q49=>MjUKFR#nCEMj*vm;1OBOz`!jG!i)^F=12fl zLsS+C#C9D4%n8IWc}2f)ZEm(l45;BJwtuC;Xu7MDalsFrAb+- z$t7TS!;J%bz$r0ZA4%9oA5*oBKFCE#E`)d=EDH3$9hZ$hJS^?Fp4#&|GB7Z|@^o^SSJTd6tq0S!DeK!2h*Tl*`P5Yzc8-3Bx*#7*P z_lIZyDoaaS`}OwX=Dx>2?#BS1xgR(Q!d=p|X>EOCN` zXA4VQu*xH8*v`wH|7Kg_&!-n1cjuav&3^o%1B-!38l2qsw5vX{)ww9+?vCFTf>ud~ zg*GO3KC`e=!r@T3xzf`*c)d-IUlfFk;PBjy4K6tmi!A&4@cAEP$Px9s?lqTci7~T+ z-}^{4afY_30{uixxSHt*N>9t^Tda&0H5mQ_1`yCs#p`NH*8Km)_~-KFoNo=!_8c#s zWAa>N-HQ`bo%5fbxey)esBZQ2{nIXNu`Os-bmok|{*PU&?;Wq;K7ViC-rR_~+KOL= zH4)jidxUns0>)Izao*FaI~PF{%uT~Dk@j=8|5Dta{K8wv>d|%Hcb{Lgz3+r2sU6kg zmTAw9&-`i8w14I8wx>P5N6NF;+MlVs*O$JfT6WJou)_P>@A@uXTleG5F;Ur%rwkr} z9Cy=jOL!Yh{`u60)j+55f37_IN$UUe9sghL7uuB@5hwlYz5Q2Eoi? z8|G~6tcc3~n|batFcfpX-rfHA^NYK3=QY>WxaPaUGs?d6cXxkJIsW|O^e4z^d}6ZQ z{XhH5lWzwfnEw0KbC6*c*P{6UH^(HL+Z_Lz)%(e&^e>X(pJ#64-W$DObB_40RoL^? hufEOi_HxMn - - - - - - - - - - Faust Libraries - - - - - - - - - - - - - - - - -
-
-
-
- -

Faust Libraries

-

The Faust libraries implement hundreds of DSP functions for audio processing and synthesis. They are organized by types in a set of .lib files (e.g., envelopes.lib, filters.lib, etc.). Librairies use semantic versioning, so may evolve in a manner where newer versions break compatibility with older ones. The recommended way to solve this issue is to keep self-contained versions of the DSP code (that is the DSP program with all needed libraries) as explained in Goals of the Mathdoc.

-

This website serves as the main documentation of the Faust libraries. The main Faust website can be found at the following URL:

-

-https://faust.grame.fr -

-

Using the Faust Libraries

-

The easiest and most standard way to use the Faust libraries is to import stdfaust.lib in your Faust code:

-
import("stdfaust.lib");
-
-

This will give you access to all the Faust libraries through a series of environments:

-
    -
  • sf: all.lib
  • -
  • aa: aanl.lib
  • -
  • an: analyzers.lib
  • -
  • ba: basics.lib
  • -
  • co: compressors.lib
  • -
  • de: delays.lib
  • -
  • dm: demos.lib
  • -
  • dx: dx7.lib
  • -
  • en: envelopes.lib
  • -
  • fd: fds.lib
  • -
  • fi: filters.lib
  • -
  • ho: hoa.lib
  • -
  • it: interpolators.lib
  • -
  • ma: maths.lib
  • -
  • mi: mi.lib
  • -
  • ef: misceffects.lib
  • -
  • os: oscillators.lib
  • -
  • no: noises.lib
  • -
  • pf: phaflangers.lib
  • -
  • pm: physmodels.lib
  • -
  • qu: quantizers.lib
  • -
  • rm: reducemaps.lib
  • -
  • re: reverbs.lib
  • -
  • ro: routes.lib
  • -
  • si: signals.lib
  • -
  • so: soundfiles.lib
  • -
  • sp: spats.lib
  • -
  • sy: synths.lib
  • -
  • ve: vaeffects.lib
  • -
  • vl: version.lib
  • -
  • wa: webaudio.lib
  • -
  • wd: wdmodels.lib
  • -
-

Environments can then be used as follows in your Faust code:

-
import("stdfaust.lib");
-process = os.osc(440);
-
-

In this case, we're calling the osc function from oscillators.lib.

-

You can also access all the functions of all the libraries directly using the sf environment:

-
import("stdfaust.lib");
-process = sf.osc(440);
-
-

Alternatively, environments can be created by hand:

-
os = library("oscillators.lib");
-process = os.osc(440);
-
-

Finally, libraries can be simply imported in the Faust code (not recommended):

-
import("oscillators.lib");
-process = osc(440);
-
-

Organization of This Documentation

-

The Overview tab in the upper menu provides additional information about the general organization of the libraries, licensing/copyright, and guidelines on how to contribute to the Faust libraries.

-

The Libraries tab contain the actual documentation of the Faust libraries.

-
-
- - - - - - - - - - - - - - diff --git a/docs/js/base.js b/docs/js/base.js deleted file mode 100644 index c176cc4..0000000 --- a/docs/js/base.js +++ /dev/null @@ -1,278 +0,0 @@ -function getSearchTerm() { - var sPageURL = window.location.search.substring(1); - var sURLVariables = sPageURL.split('&'); - for (var i = 0; i < sURLVariables.length; i++) { - var sParameterName = sURLVariables[i].split('='); - if (sParameterName[0] == 'q') { - return sParameterName[1]; - } - } -} - -function applyTopPadding() { - // Update various absolute positions to match where the main container - // starts. This is necessary for handling multi-line nav headers, since - // that pushes the main container down. - var container = document.querySelector('body > .container'); - var offset = container.offsetTop; - - document.documentElement.style.scrollPaddingTop = offset + 'px'; - document.querySelectorAll('.bs-sidebar.affix').forEach(function(sidebar) { - sidebar.style.top = offset + 'px'; - }); -} - -document.addEventListener("DOMContentLoaded", function () { - var search_term = getSearchTerm(); - var search_modal = new bootstrap.Modal(document.getElementById('mkdocs_search_modal')); - var keyboard_modal = new bootstrap.Modal(document.getElementById('mkdocs_keyboard_modal')); - - if (search_term) { - search_modal.show(); - } - - // make sure search input gets autofocus every time modal opens. - document.getElementById('mkdocs_search_modal').addEventListener('shown.bs.modal', function() { - document.getElementById('mkdocs-search-query').focus(); - }); - - // Close search modal when result is selected - // The links get added later so listen to parent - document.getElementById('mkdocs-search-results').addEventListener('click', function(e) { - if (e.target.tagName === 'A') { - search_modal.hide(); - } - }); - - // Populate keyboard modal with proper Keys - document.querySelector('.help.shortcut kbd').innerHTML = keyCodes[shortcuts.help]; - document.querySelector('.prev.shortcut kbd').innerHTML = keyCodes[shortcuts.previous]; - document.querySelector('.next.shortcut kbd').innerHTML = keyCodes[shortcuts.next]; - document.querySelector('.search.shortcut kbd').innerHTML = keyCodes[shortcuts.search]; - - // Keyboard navigation - document.addEventListener("keydown", function(e) { - if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return true; - var key = e.which || e.keyCode || window.event && window.event.keyCode; - var page; - switch (key) { - case shortcuts.next: - page = document.querySelector('.navbar a[rel="next"]:first').getAttribute('href'); - break; - case shortcuts.previous: - page = document.querySelector('.navbar a[rel="prev"]:first').getAttribute('href'); - break; - case shortcuts.search: - e.preventDefault(); - keyboard_modal.hide(); - search_modal.show(); - document.getElementById('mkdocs-search-query').focus(); - break; - case shortcuts.help: - search_modal.hide(); - keyboard_modal.show(); - break; - default: break; - } - if (page) { - keyboard_modal.hide(); - window.location.href = page; - } - }); - - document.querySelectorAll('table').forEach(function(table) { - table.classList.add('table', 'table-striped', 'table-hover'); - }); - - function showInnerDropdown(item) { - var popup = item.nextElementSibling; - popup.classList.add('show'); - item.classList.add('open'); - - // First, close any sibling dropdowns. - var container = item.parentElement.parentElement; - container.querySelectorAll('> .dropdown-submenu > a').forEach(function(el) { - if (el !== item) { - hideInnerDropdown(el); - } - }); - - var popupMargin = 10; - var maxBottom = window.innerHeight - popupMargin; - var bounds = item.getBoundingClientRect(); - - popup.style.left = bounds.right + 'px'; - if (bounds.top + popup.clientHeight > maxBottom && - bounds.top > window.innerHeight / 2) { - popup.style.top = (bounds.bottom - popup.clientHeight) + 'px'; - popup.style.maxHeight = (bounds.bottom - popupMargin) + 'px'; - } else { - popup.style.top = bounds.top + 'px'; - popup.style.maxHeight = (maxBottom - bounds.top) + 'px'; - } - } - - function hideInnerDropdown(item) { - var popup = item.nextElementSibling; - popup.classList.remove('show'); - item.classList.remove('open'); - - popup.scrollTop = 0; - popup.querySelector('.dropdown-menu').scrollTop = 0; - popup.querySelector('.dropdown-submenu > a').classList.remove('open'); - } - - document.querySelectorAll('.dropdown-submenu > a').forEach(function(item) { - item.addEventListener('click', function(e) { - if (item.nextElementSibling.classList.contains('show')) { - hideInnerDropdown(item); - } else { - showInnerDropdown(item); - } - - e.stopPropagation(); - e.preventDefault(); - }); - }); - - document.querySelectorAll('.dropdown-menu').forEach(function(menu) { - menu.parentElement.addEventListener('hide.bs.dropdown', function() { - menu.scrollTop = 0; - menu.querySelector('.dropdown-submenu > a').classList.remove('open'); - menu.querySelectorAll('.dropdown-menu .dropdown-menu').forEach(function(submenu) { - submenu.classList.remove('show'); - }); - }); - }); - - applyTopPadding(); -}); - -window.addEventListener('resize', applyTopPadding); - -var scrollSpy = new bootstrap.ScrollSpy(document.body, { - target: '.bs-sidebar' -}); - -/* Prevent disabled links from causing a page reload */ -document.querySelectorAll("li.disabled a").forEach(function(item) { - item.addEventListener("click", function(event) { - event.preventDefault(); - }); -}); - -// See https://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes -// We only list common keys below. Obscure keys are omitted and their use is discouraged. -var keyCodes = { - 8: 'backspace', - 9: 'tab', - 13: 'enter', - 16: 'shift', - 17: 'ctrl', - 18: 'alt', - 19: 'pause/break', - 20: 'caps lock', - 27: 'escape', - 32: 'spacebar', - 33: 'page up', - 34: 'page down', - 35: 'end', - 36: 'home', - 37: '←', - 38: '↑', - 39: '→', - 40: '↓', - 45: 'insert', - 46: 'delete', - 48: '0', - 49: '1', - 50: '2', - 51: '3', - 52: '4', - 53: '5', - 54: '6', - 55: '7', - 56: '8', - 57: '9', - 65: 'a', - 66: 'b', - 67: 'c', - 68: 'd', - 69: 'e', - 70: 'f', - 71: 'g', - 72: 'h', - 73: 'i', - 74: 'j', - 75: 'k', - 76: 'l', - 77: 'm', - 78: 'n', - 79: 'o', - 80: 'p', - 81: 'q', - 82: 'r', - 83: 's', - 84: 't', - 85: 'u', - 86: 'v', - 87: 'w', - 88: 'x', - 89: 'y', - 90: 'z', - 91: 'Left Windows Key / Left ⌘', - 92: 'Right Windows Key', - 93: 'Windows Menu / Right ⌘', - 96: 'numpad 0', - 97: 'numpad 1', - 98: 'numpad 2', - 99: 'numpad 3', - 100: 'numpad 4', - 101: 'numpad 5', - 102: 'numpad 6', - 103: 'numpad 7', - 104: 'numpad 8', - 105: 'numpad 9', - 106: 'multiply', - 107: 'add', - 109: 'subtract', - 110: 'decimal point', - 111: 'divide', - 112: 'f1', - 113: 'f2', - 114: 'f3', - 115: 'f4', - 116: 'f5', - 117: 'f6', - 118: 'f7', - 119: 'f8', - 120: 'f9', - 121: 'f10', - 122: 'f11', - 123: 'f12', - 124: 'f13', - 125: 'f14', - 126: 'f15', - 127: 'f16', - 128: 'f17', - 129: 'f18', - 130: 'f19', - 131: 'f20', - 132: 'f21', - 133: 'f22', - 134: 'f23', - 135: 'f24', - 144: 'num lock', - 145: 'scroll lock', - 186: ';', - 187: '=', - 188: ',', - 189: '‐', - 190: '.', - 191: '?', - 192: '`', - 219: '[', - 220: '\', - 221: ']', - 222: ''', -}; diff --git a/docs/js/bootstrap.bundle.min.js b/docs/js/bootstrap.bundle.min.js deleted file mode 100644 index b1999d9..0000000 --- a/docs/js/bootstrap.bundle.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 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=>{t.dispatchEvent(new Event(i))},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(n(t)):null,a=t=>{if(!o(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},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=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?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();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?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);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})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(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))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=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}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){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=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),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 P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.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 D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(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 j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(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,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{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=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(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),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(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(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.3.2"}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 B=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?n(i.trim()):null}return e},z={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=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).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(),N.trigger(this._element,K),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)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y 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=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_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(),g(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&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(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 ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt 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=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;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&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[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=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),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===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).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),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.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)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.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 Ht}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=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),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(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.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(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.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=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={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];me(s)&&ue(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}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){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 Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&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 Ce(t){var e=Te(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 Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(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 Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={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=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(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=Ne(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)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(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=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(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&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(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 Be={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:be(e.placement),variation:Fe(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,We(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,We(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 ze={passive:!0};const Re={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=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(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):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(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?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(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}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?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===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(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?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,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]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={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,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(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=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),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"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(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 ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={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=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(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})}},li={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=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].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,[Vt,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}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={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=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),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?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(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=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(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=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].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=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(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 fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.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)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!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=z.find(Ni);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=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,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())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),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=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{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,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}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&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({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=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(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(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),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=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn 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 zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}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)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["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:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}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},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(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)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={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 cs extends W{constructor(t,e){if(void 0===vi)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 as}static get DefaultType(){return ls}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),N.off(this._element.closest(is),ns,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=N.trigger(this._element,this.constructor.eventName("show")),e=(c(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),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.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(ts,es),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(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...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(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(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 g(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,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,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=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.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: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()),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=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}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=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es 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 ws}static get DefaultType(){return As}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=r(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&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(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=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(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(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.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]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=".dropdown-toggle",zs=`:not(${Bs})`,Rs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`,Vs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Ks extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(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?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Ks.getOrCreateInstance(i).show())}_getChildren(){return z.find(qs,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=z.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=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(Bs,Fs),n(".dropdown-menu",Ws),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(qs)?t:z.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Ks.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,Rs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Ks.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(Vs))Ks.getOrCreateInstance(t)})),m(Ks);const Qs=".bs.toast",Xs=`mouseover${Qs}`,Ys=`mouseout${Qs}`,Us=`focusin${Qs}`,Gs=`focusout${Qs}`,Js=`hide${Qs}`,Zs=`hidden${Qs}`,to=`show${Qs}`,eo=`shown${Qs}`,io="hide",no="show",so="showing",oo={animation:"boolean",autohide:"boolean",delay:"number"},ro={animation:!0,autohide:!0,delay:5e3};class ao extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return ro}static get DefaultType(){return oo}static get NAME(){return"toast"}show(){N.trigger(this._element,to).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(io),d(this._element),this._element.classList.add(no,so),this._queueCallback((()=>{this._element.classList.remove(so),N.trigger(this._element,eo),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Js).defaultPrevented||(this._element.classList.add(so),this._queueCallback((()=>{this._element.classList.add(io),this._element.classList.remove(so,no),N.trigger(this._element,Zs)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(no),super.dispose()}isShown(){return this._element.classList.contains(no)}_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(){N.on(this._element,Xs,(t=>this._onInteraction(t,!0))),N.on(this._element,Ys,(t=>this._onInteraction(t,!1))),N.on(this._element,Us,(t=>this._onInteraction(t,!0))),N.on(this._element,Gs,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ao.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ao),m(ao),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Ks,Toast:ao,Tooltip:cs}})); -//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/docs/js/bootstrap.bundle.min.js.map b/docs/js/bootstrap.bundle.min.js.map deleted file mode 100644 index 7cd8480..0000000 --- a/docs/js/bootstrap.bundle.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","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","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","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","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","sel","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","div","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_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","click","_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","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","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","../../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.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.2'\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 !== '#' ? parseSelector(hrefAttribute.trim()) : null\n }\n\n return selector\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 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 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 \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 `` and `` 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)')\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 { execute, executeAfterTransition, getElement, reflow } 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 { defineJQueryPlugin, isRTL, isVisible, reflow } 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 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// 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: '
'\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 { defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop } 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: '
' +\n '
' +\n '
' +\n '
',\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: '
' +\n '
' +\n '

' +\n '
' +\n '
',\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 { defineJQueryPlugin, getElement, isDisabled, isVisible } 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
    and