From 24b71e18cad3e8df854ede8c318ae7dcfb8a4962 Mon Sep 17 00:00:00 2001 From: RensDofferhoff <20978635+RensDofferhoff@users.noreply.github.com> Date: Wed, 17 Jul 2024 16:26:30 +0200 Subject: [PATCH 01/70] Renv Lockfiles (#5629) * use new module installation mechanism very basic functionality works start on making hashes work seems more or less functional now started rewriting cmake, stuff compiles but crashes at runtime everything seems functional on Linux windows fixes, stuff compiles but weird runtime error building on windows works from a clean build, but more testing is needed more tweaks, update to renv 1.0.2 updates for fallback without lockfile start unifying stuff across OSes autogenerated lockfiles seem to be work okay but need more testing reorganize file + pkgdepends fallback bump jaspModuleInstaller spaces -> tabs bump jaspModuleInstaller spaces -> tabs moved getModuleDependencies to jaspModuleInstaller call setupRenv in setup_renv_rcpp_rinside_jaspModuleInstaller.R.in remove custom Matrix installation make configuration work on macos compilation still fails though... do follow symlinks otherwise it patches nothing move searching for fortran outside of the "does framework not exist if()f" jaspModuleInstaller and fixing of r pkgs needs jaspEngine so change the order in which things are installed add R_LIBS for windows and macos make windows start * dont use Rscript now it builds again on macos arm without R installed * make it build on windows again * fix some path finding cmake * pre install hacks no longer needed * progress * works on windows now? * Merge mistake * Update jasprcpp.cpp * Fix symlink relativation on MAC * fix windows stuff * Update symlinkTools.R * progress' * now works on linux and flatpak(from cellar + lockfiles) * update ModuleInstaller to linux fixed version * make sure we dont forget any Modules * remove leftover logic to collect and restore flatpak cran now surpassed by using simple cellar * fix on mac again * fix v8 * fix * fix jaspBase compilation * devmodules ? * update jaspModuleInstaller * update module installer * this seems to work for Linux local builds at least * submodule update * merge mistakes * windows..... * windows couldn't find module installer because we were overwitting it * update module installer to fix windows * okay one more thing for windows * Enable all modules * Update cleanFlatpak.sh * Update cleanFlatpak.sh * load jaspBase first before loading module * Update install-module.R.in * Update setup_renv_rcpp_rinside.R.in * Update cleanFlatpak.sh * re-add the header includes that are definetly needed * Fix configure vars for jaspColumnEncoder * rewrite scary construction in DynamicModule::generateModuleInstallingR * update module installer * fix problems caused by -j * update submodules * try to satisfy the new flatpak regs * try to satisfy the new flatpak regs again * fix readstat search on fedora --------- Co-authored-by: vandenman Co-authored-by: Joris Goosen Co-authored-by: rens Co-authored-by: Rens --- .gitmodules | 3 + Desktop/main.cpp | 5 +- Desktop/modules/dynamicmodule.cpp | 26 +- Desktop/utilities/processhelper.cpp | 31 +- Desktop/utilities/processhelper.h | 2 +- Docs/development/windows-installer.md | 2 +- Engine/engine.cpp | 9 +- Engine/jaspModuleInstaller | 1 + Modules/Rcpp_RInside.lock | 23 + Modules/install-RInside.R.in | 11 - Modules/install-jaspBase.R.in | 54 - Modules/install-jaspModuleInstaller.R.in | 105 + Modules/install-module.R.in | 67 +- Modules/install-renv.R.in | 6 - Modules/jaspAcceptanceSampling | 2 +- Modules/jaspAnova | 2 +- Modules/jaspAudit | 2 +- Modules/jaspBain | 2 +- Modules/jaspBsts | 2 +- Modules/jaspCircular | 2 +- Modules/jaspCochrane | 2 +- Modules/jaspDescriptives | 2 +- Modules/jaspDistributions | 2 +- Modules/jaspEquivalenceTTests | 2 +- Modules/jaspFactor | 2 +- Modules/jaspFrequencies | 2 +- Modules/jaspJags | 2 +- Modules/jaspLearnBayes | 2 +- Modules/jaspLearnStats | 2 +- Modules/jaspMachineLearning | 2 +- Modules/jaspMetaAnalysis | 2 +- Modules/jaspMixedModels | 2 +- Modules/jaspNetwork | 2 +- Modules/jaspPower | 2 +- Modules/jaspPredictiveAnalytics | 2 +- Modules/jaspProcess | 2 +- Modules/jaspProphet | 2 +- Modules/jaspQualityControl | 2 +- Modules/jaspRegression | 2 +- Modules/jaspReliability | 2 +- Modules/jaspRobustTTests | 2 +- Modules/jaspSem | 2 +- Modules/jaspSummaryStatistics | 2 +- Modules/jaspSurvival | 2 +- Modules/jaspTTests | 2 +- Modules/jaspTimeSeries | 2 +- Modules/jaspVisualModeling | 2 +- Modules/junctionBootstrap.lock | 25 + Modules/pkgdepends.lock | 243 ++ Modules/setup_renv_rcpp_rinside.R.in | 79 + R-Interface/CMakeLists.txt | 14 +- R-Interface/R/symlinkTools.R | 24 +- R-Interface/jasprcpp.cpp | 59 +- R-Interface/jasprcpp_interface.h | 1 + Tools/CMake/FindRPackagePath.cmake | 22 + Tools/CMake/Install.cmake | 32 +- Tools/CMake/JASP.cmake | 17 +- Tools/CMake/Libraries.cmake | 2 +- Tools/CMake/Modules.cmake | 129 +- Tools/CMake/Pack.cmake | 6 - Tools/CMake/Patch.cmake | 8 +- Tools/CMake/R.cmake | 304 +- Tools/find_package_path.R | 29 + Tools/flatpak/JASP-screenshot-0.png | Bin 237640 -> 0 bytes Tools/flatpak/RPackages.json | 21 - Tools/flatpak/cleanFlatpak.sh | 8 + Tools/flatpak/collectCellar.sh | 6 + Tools/flatpak/expectedPackages.json | 3640 ----------------- Tools/flatpak/flatpak_screenshot_0_small.png | Bin 0 -> 91219 bytes Tools/flatpak/gather-r-package-info.R | 426 -- Tools/flatpak/org.jaspstats.JASP.appdata.xml | 10 +- Tools/flatpak/org.jaspstats.JASP.svg | 37 +- Tools/flatpak/setup-rpkgs/.Rprofile | 1 - Tools/flatpak/setup-rpkgs/.gitignore | 5 - Tools/flatpak/setup-rpkgs/R/Rprofile.R | 38 - .../setup-rpkgs/R/flatpakGeneratePkgsList.R | 99 - .../R/flatpakRegenerateRenvStructure.R | 77 - Tools/flatpak/setup-rpkgs/R/functions.R | 893 ---- Tools/flatpak/setup-rpkgs/R/validators.R | 80 - Tools/flatpak/setup-rpkgs/README.md | 25 - Tools/flatpak/setup-rpkgs/TODO.md | 26 - Tools/flatpak/setup-rpkgs/renv.lock | 29 - Tools/flatpak/setup-rpkgs/renv/.gitignore | 6 - Tools/flatpak/setup-rpkgs/renv/activate.R | 942 ----- Tools/flatpak/setup-rpkgs/setup-rpkgs.Rproj | 16 - Tools/windows/BuildBotScript.cmd | 2 - Tools/windows/CollectJunctions.cmd.in | 2 + Tools/windows/RecreateJunctions.cmd.in | 1 + Tools/windows/RecursiveJunctionRemover.cmd.in | 2 + Tools/windows/windowsPreInstallHacks.cmd.in | 17 - 90 files changed, 974 insertions(+), 6840 deletions(-) create mode 160000 Engine/jaspModuleInstaller create mode 100644 Modules/Rcpp_RInside.lock delete mode 100644 Modules/install-RInside.R.in delete mode 100644 Modules/install-jaspBase.R.in create mode 100644 Modules/install-jaspModuleInstaller.R.in delete mode 100644 Modules/install-renv.R.in create mode 100644 Modules/junctionBootstrap.lock create mode 100644 Modules/pkgdepends.lock create mode 100644 Modules/setup_renv_rcpp_rinside.R.in create mode 100644 Tools/CMake/FindRPackagePath.cmake create mode 100755 Tools/find_package_path.R delete mode 100644 Tools/flatpak/JASP-screenshot-0.png delete mode 100644 Tools/flatpak/RPackages.json create mode 100755 Tools/flatpak/cleanFlatpak.sh create mode 100755 Tools/flatpak/collectCellar.sh delete mode 100644 Tools/flatpak/expectedPackages.json create mode 100644 Tools/flatpak/flatpak_screenshot_0_small.png delete mode 100644 Tools/flatpak/gather-r-package-info.R delete mode 100644 Tools/flatpak/setup-rpkgs/.Rprofile delete mode 100644 Tools/flatpak/setup-rpkgs/.gitignore delete mode 100644 Tools/flatpak/setup-rpkgs/R/Rprofile.R delete mode 100644 Tools/flatpak/setup-rpkgs/R/flatpakGeneratePkgsList.R delete mode 100644 Tools/flatpak/setup-rpkgs/R/flatpakRegenerateRenvStructure.R delete mode 100644 Tools/flatpak/setup-rpkgs/R/functions.R delete mode 100644 Tools/flatpak/setup-rpkgs/R/validators.R delete mode 100644 Tools/flatpak/setup-rpkgs/README.md delete mode 100644 Tools/flatpak/setup-rpkgs/TODO.md delete mode 100644 Tools/flatpak/setup-rpkgs/renv.lock delete mode 100644 Tools/flatpak/setup-rpkgs/renv/.gitignore delete mode 100644 Tools/flatpak/setup-rpkgs/renv/activate.R delete mode 100644 Tools/flatpak/setup-rpkgs/setup-rpkgs.Rproj create mode 100644 Tools/windows/RecursiveJunctionRemover.cmd.in delete mode 100644 Tools/windows/windowsPreInstallHacks.cmd.in diff --git a/.gitmodules b/.gitmodules index ef714265a4..834cf863a8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -150,3 +150,6 @@ path = Common/jaspColumnEncoder url = https://github.com/jasp-stats/jaspColumnEncoder branch = master +[submodule "Engine/jaspModuleInstaller"] + path = Engine/jaspModuleInstaller + url = https://github.com/jasp-stats/jaspModuleInstaller.git diff --git a/Desktop/main.cpp b/Desktop/main.cpp index 57cf7eec7b..106b6ab107 100644 --- a/Desktop/main.cpp +++ b/Desktop/main.cpp @@ -52,7 +52,7 @@ const std::string jaspExtension = ".jasp", bool runJaspEngineJunctionFixer(int argc, char *argv[], bool removeJunctions = false, bool exitAfterwards = true) { QApplication * app = exitAfterwards ? new QApplication(argc, argv) : nullptr; - QProcessEnvironment env = ProcessHelper::getProcessEnvironmentForJaspEngine(); + QProcessEnvironment env = ProcessHelper::getProcessEnvironmentForJaspEngine(true); QString workDir = QFileInfo( QCoreApplication::applicationFilePath() ).absoluteDir().absolutePath(); QProcess engine; @@ -64,7 +64,8 @@ bool runJaspEngineJunctionFixer(int argc, char *argv[], bool removeJunctions = f //remove any leftover ModuleDir QDir modulesDir(AppDirs::bundledModulesDir()); - if(modulesDir.exists() && AppDirs::bundledModulesDir().contains("Modules", Qt::CaseInsensitive) && DynamicRuntimeInfo::getInstance()->getRuntimeEnvironment() != DynamicRuntimeInfo::ZIP) { + if(modulesDir.exists() && AppDirs::bundledModulesDir().contains("Modules", Qt::CaseInsensitive) && DynamicRuntimeInfo::getInstance()->getRuntimeEnvironment() != DynamicRuntimeInfo::ZIP) + { std::function removeDir = [&](QDir x) -> void { for(const auto& entry : x.entryInfoList(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files)) { diff --git a/Desktop/modules/dynamicmodule.cpp b/Desktop/modules/dynamicmodule.cpp index 0c3617fcbd..5dcd7190fa 100644 --- a/Desktop/modules/dynamicmodule.cpp +++ b/Desktop/modules/dynamicmodule.cpp @@ -392,6 +392,7 @@ Json::Value DynamicModule::requestJsonForPackageLoadingRequest() requestJson["moduleRequest"] = moduleStatusToString(moduleStatus::loading); requestJson["moduleName"] = _name; + requestJson["moduleLibPaths"] = getLibPathsToUse(); requestJson["moduleCode"] = generateModuleLoadingR(); return requestJson; @@ -399,7 +400,7 @@ Json::Value DynamicModule::requestJsonForPackageLoadingRequest() std::string DynamicModule::getLibPathsToUse() const { - return "c('" + AppDirs::rHome().toStdString() + "/library', '" + shortenWinPaths(moduleRLibrary()).toStdString() + "')"; + return "c('" + shortenWinPaths(moduleRLibrary()).toStdString() + "', '" + AppDirs::rHome().toStdString() + "/library')"; } ///It would probably be better to move all of this code to jasp-r-pkg or something, but for now this works fine. @@ -427,17 +428,30 @@ std::string DynamicModule::generateModuleInstallingR(bool onlyModPkg) return "stop('Something went wrong during intialization of the Description!\nMake sure it follows the standard set in https://github.com/jasp-stats/jasp-desktop/blob/development/Docs/development/jasp-adding-module.md#descriptionqml\n')"; } setInstallLog("Installing module " + _name + ".\n"); - - return "options(\"renv.config.install.verbose\" = FALSE);jaspBase::installJaspModule(modulePkg='" + _modulePackage + "', libPathsToUse=" + getLibPathsToUse() + ", moduleLibrary='" + moduleRLibrary().toStdString() + - "', repos='" + Settings::value(Settings::CRAN_REPO_URL).toString().toStdString() + "', onlyModPkg=" + (onlyModPkg ? "TRUE" : "FALSE") + - ", force=TRUE, cacheAble=FALSE, frameworkLibrary='"+fq(AppDirs::rHome())+"/library');"; + return QString( + R"readableR( + tmp <- .libPaths(); + .libPaths("%1"); + Sys.setenv(MODULE_INSTALL_MODE="localizeModuleOnly"); + options("renv.config.install.verbose" = TRUE, "PKGDEPENDS_LIBRARY"="%2"); + result <- jaspModuleInstaller::installJaspModule(modulePkg='%3', moduleLibrary='%4', repos='%5', onlyModPkg=%6, force=TRUE, frameworkLibrary='%7'); + .libPaths(tmp); + return(result); + )readableR") + .arg(AppDirs::bundledModulesDir() + "Tools/jaspModuleInstaller_library/") + .arg(AppDirs::bundledModulesDir() + "Tools/pkgdepends_library/") + .arg(tq(_modulePackage)) + .arg(moduleRLibrary()) + .arg(Settings::value(Settings::CRAN_REPO_URL).toString()) + .arg(onlyModPkg ? "TRUE" : "FALSE") + .arg(AppDirs::rHome()+"/library") + .toStdString(); } std::string DynamicModule::generateModuleLoadingR(bool shouldReturnSucces) { std::stringstream R; - R << ".libPaths(" << getLibPathsToUse() <<");\n"; R << standardRIndent << "library('" << _name << "');\n"; if(shouldReturnSucces) diff --git a/Desktop/utilities/processhelper.cpp b/Desktop/utilities/processhelper.cpp index 016fd0ac9f..b0b4c91097 100644 --- a/Desktop/utilities/processhelper.cpp +++ b/Desktop/utilities/processhelper.cpp @@ -1,12 +1,9 @@ #include "processhelper.h" #include "utilities/appdirs.h" - -#ifdef _WIN32 #include "utilities/qutils.h" #include "log.h" -#endif -QProcessEnvironment ProcessHelper::getProcessEnvironmentForJaspEngine() +QProcessEnvironment ProcessHelper::getProcessEnvironmentForJaspEngine(bool bootStrap) { QDir programDir = AppDirs::programDir(); QString engineExe = programDir.absoluteFilePath("JASPEngine"); @@ -21,8 +18,8 @@ QProcessEnvironment ProcessHelper::getProcessEnvironmentForJaspEngine() //Seems a bit weird but we need to tell this to jaspBase so it can tell renv to run it again because that will be running in a subprocess. //Which also means we have the following process -> subprocess structure while installing a dynamic module: // jasp -> JASPEngine with R-embedded -> Separate R -> separate instances of JASPEngine... - env.insert("JASPENGINE_LOCATION", engineExe); - + env.insert("JASPENGINE_LOCATION", engineExe); + QString TZDIR = AppDirs::rHome() + "/share/zoneinfo"; QString rHomePath = AppDirs::rHome(); QDir rHome ( rHomePath ); @@ -45,7 +42,7 @@ QProcessEnvironment ProcessHelper::getProcessEnvironmentForJaspEngine() R_HOME = shortenWinPaths(rHome.absolutePath()), JAGS_HOME = shortenWinPaths(programDir.absoluteFilePath("R/opt/jags/")); // JAGS_LIBDIR = shortenWinPaths(programDir.absoluteFilePath("R/opt/jags/lib/")); - + Log::log() << "R_HOME set to " << R_HOME << std::endl; env.insert("PATH", PATH); @@ -55,7 +52,10 @@ QProcessEnvironment ProcessHelper::getProcessEnvironmentForJaspEngine() #undef ARCH_SUBPATH - env.insert("R_LIBS", R_HOME + "/library"); + if(bootStrap) + env.insert("R_LIBS", programDir.absoluteFilePath("Modules/Tools/junction_bootstrap_library") + ";" + R_HOME + "/library"); + else + env.insert("R_LIBS", AppDirs::bundledModulesDir() + "Tools/R_cpp_includes_library" + ";" + R_HOME + "/library"); env.insert("R_ENVIRON", "something-which-doesn't-exist"); env.insert("R_PROFILE", "something-which-doesn't-exist"); @@ -73,7 +73,7 @@ QProcessEnvironment ProcessHelper::getProcessEnvironmentForJaspEngine() env.insert("R_HOME", rHome.absolutePath()); env.insert("RHOME", rHome.absolutePath()); //For Rscript env.insert("JASP_R_HOME", rHome.absolutePath()); //Used by the modified R script in jasp-required-files/Framework/etc/bin to make sure we use the actual R of JASP! (https://github.com/jasp-stats/INTERNAL-jasp/issues/452) - env.insert("R_LIBS", rHome.absoluteFilePath("library") + ":" + programDir.absoluteFilePath("R/library")); + env.insert("R_LIBS", programDir.absoluteFilePath("../Modules/Tools/R_cpp_includes_library") + ":" + rHome.absoluteFilePath("library") + ":" + programDir.absoluteFilePath("R/library") + custom_R_library); env.insert("JAGS_HOME", rHome.absolutePath() + "/opt/jags/lib/JAGS/"); // env.insert("JAGS_LIBDIR", rHome.absolutePath() + "/opt/jags/lib/"); @@ -84,11 +84,13 @@ QProcessEnvironment ProcessHelper::getProcessEnvironmentForJaspEngine() env.insert("LC_CTYPE", "UTF-8"); //This isn't really a locale but seems necessary to get proper output from gettext on mac env.insert("TZDIR", TZDIR); - +#elif FLATPAK_USED + env.insert("R_HOME", rHome.absolutePath()); + env.insert("R_LIBS", "/app/Modules/Tools/R_cpp_includes_library:/app/lib64/R/library" + custom_R_library); + env.insert("LD_LIBRARY_PATH", "/app/Modules/Tools/R_cpp_includes_library/RInside/lib/:/app/lib64/R/lib/"); #else // linux - env.insert("LD_LIBRARY_PATH", rHome.absoluteFilePath("lib") + ":" + rHome.absoluteFilePath("library/RInside/lib") + ":" + rHome.absoluteFilePath("library/Rcpp/lib") + ":" + rHome.absoluteFilePath("site-library/RInside/lib") + ":" + rHome.absoluteFilePath("site-library/Rcpp/lib") + ":/app/lib/:/app/lib64/"); env.insert("R_HOME", rHome.absolutePath()); - env.insert("R_LIBS", programDir.absoluteFilePath("R/library") + custom_R_library + ":" + rHome.absoluteFilePath("library") + ":" + rHome.absoluteFilePath("site-library")); + env.insert("R_LIBS", programDir.absoluteFilePath("../Modules/Tools/R_cpp_includes_library") + ":" + programDir.absoluteFilePath("R/library") + custom_R_library); #endif env.insert("R_LIBS_SITE", ""); @@ -99,5 +101,10 @@ QProcessEnvironment ProcessHelper::getProcessEnvironmentForJaspEngine() env.insert("R_LIBS_USER", (AppDirs::programDir().absolutePath().toStdString() + "/../R/library").c_str()); #endif + Log::log() << "R_LIBS:" << env.value("R_LIBS") << "\n" << + "R_LIBS_USER:" << env.value("R_LIBS_USER") << "\n" << + "LD_LIBRARY_PATH:" << env.value("LD_LIBRARY_PATH") << "\n" << + std::endl; + return(env); } diff --git a/Desktop/utilities/processhelper.h b/Desktop/utilities/processhelper.h index b0e9d85608..db671242b4 100644 --- a/Desktop/utilities/processhelper.h +++ b/Desktop/utilities/processhelper.h @@ -10,7 +10,7 @@ class ProcessHelper { public: - static QProcessEnvironment getProcessEnvironmentForJaspEngine(); + static QProcessEnvironment getProcessEnvironmentForJaspEngine(bool bootStrap = false); private: ProcessHelper(){} diff --git a/Docs/development/windows-installer.md b/Docs/development/windows-installer.md index f00f264f3b..f8f9d60147 100644 --- a/Docs/development/windows-installer.md +++ b/Docs/development/windows-installer.md @@ -45,7 +45,7 @@ The generated MSIX for the Microsoft Store will be unsigned and must be provided The MSIXs can be generated after building JASP by running the following commands in your JASP build folder: ``` -cmake --build . --target windowsPreInstallHacks && cmake --build . --target install && cmake --build . --target collect-junctions && cmake --install . --component MSIX && cmake --build . --target msix +cmake --build . --target install && cmake --build . --target collect-junctions && cmake --install . --component MSIX && cmake --build . --target msix ``` This is subject to change, for an up to date sequence take a peak at the [buildbot-script](/Tools/windows/BuildBotScript.cmd). diff --git a/Engine/engine.cpp b/Engine/engine.cpp index fde68b8acf..23b9b21461 100644 --- a/Engine/engine.cpp +++ b/Engine/engine.cpp @@ -481,8 +481,15 @@ void Engine::receiveModuleRequestMessage(const Json::Value & jsonRequest) std::string moduleRequest = jsonRequest["moduleRequest"].asString(); std::string moduleCode = jsonRequest["moduleCode"].asString(); std::string moduleName = jsonRequest["moduleName"].asString(); + std::string moduleLibPaths = jsonRequest["moduleLibPaths"].asString(); - Log::log() << "About to run module request for module '" << moduleName << "' and code to run:\n'" << moduleCode << "'" << std::endl; + Log::log() << "About to run module request for module '" << moduleName << "' and code to run:\n'" << moduleCode << "'" << std::endl; + + if(moduleStatusFromString((moduleRequest)) == moduleStatus::loading) { + //Some jaspModules use jaspBase calls in their .onload so we first we need to prepare jaspbase + jaspRCPP_evalRCode((".libPaths( " + moduleLibPaths + " );").c_str(), false); + jaspRCPP_init_jaspBase(); + } std::string result = jaspRCPP_evalRCode(moduleCode.c_str(), false); bool succes = result == "succes!"; //Defined in DynamicModule::succesResultString() diff --git a/Engine/jaspModuleInstaller b/Engine/jaspModuleInstaller new file mode 160000 index 0000000000..25027282aa --- /dev/null +++ b/Engine/jaspModuleInstaller @@ -0,0 +1 @@ +Subproject commit 25027282aa595ff78b61da862360bb3dcf2a883e diff --git a/Modules/Rcpp_RInside.lock b/Modules/Rcpp_RInside.lock new file mode 100644 index 0000000000..adb746136d --- /dev/null +++ b/Modules/Rcpp_RInside.lock @@ -0,0 +1,23 @@ +{ + "R": { + "Version": "4.3.3", + "Repositories": [ + { + "Name": "CRAN", + "URL": "https://cran.rstudio.com" + } + ] + }, + "Packages": { + "RInside": { + "Package": "RInside", + "Version": "0.2.18", + "Source": "Repository" + }, + "Rcpp": { + "Package": "Rcpp", + "Version": "1.0.12", + "Source": "Repository" + } + } +} diff --git a/Modules/install-RInside.R.in b/Modules/install-RInside.R.in deleted file mode 100644 index 00d7b6ae44..0000000000 --- a/Modules/install-RInside.R.in +++ /dev/null @@ -1,11 +0,0 @@ -# Generated from install-RInside.R.in -# -# Installs `RInside` and `Rcpp`. While `Rcpp` is a dependency of the `RInside`, -# I've ran into situation where installing `RInside` doesn't install the `Rcpp`. -# - -Sys.setenv(MAKEFLAGS="-j") - -.libPaths(c("@R_LIBRARY_PATH@")) -#We need building from source on linux in any case and on windows because otherwise lots of CRAN env-vars get baked into RInside... -install.packages(c('RInside', 'Rcpp'), type = ifelse(Sys.info()["sysname"] == "Darwin", "binary", "source"), lib='@R_LIBRARY_PATH@', repos='@R_REPOSITORY@', INSTALL_opts='--no-multiarch --no-docs --no-test-load') \ No newline at end of file diff --git a/Modules/install-jaspBase.R.in b/Modules/install-jaspBase.R.in deleted file mode 100644 index 338f6ccaa6..0000000000 --- a/Modules/install-jaspBase.R.in +++ /dev/null @@ -1,54 +0,0 @@ -# Generated from install-jaspBase.R.in -# -Sys.setenv(GITHUB_PAT="@GITHUB_PAT@") -Sys.setenv(RENV_PATHS_ROOT="@MODULES_RENV_ROOT_PATH@") -Sys.setenv(RENV_PATHS_CACHE="@MODULES_RENV_CACHE_PATH@") -Sys.setenv(JASPENGINE_LOCATION="@JASP_ENGINE_PATH@/JASPEngine") -Sys.setenv(MAKEFLAGS="-j") - -#Load the post-install fixes from jaspBase. Think Baron von Munchausen ;) -source("@PROJECT_SOURCE_DIR@/Engine/jaspBase/R/utility.R") -source("@PROJECT_SOURCE_DIR@/Engine/jaspBase/R/checkSums.R") -source("@PROJECT_SOURCE_DIR@/Engine/jaspBase/R/assignFunctionInPackage.R") -source("@PROJECT_SOURCE_DIR@/Engine/jaspBase/R/moduleInstall.R") - -# The R_LIBRARY_PATH might already be there, but depending on the configuration -# of the CMake, we might be installing in a different location, so, I just add -# it anyway! It gets to if-y. - -if (@IS_FLATPAK_USED@) { - source("/app/lib64/Rprofile.R") - options(repos = "@R_REPOSITORY@") -} - -.libPaths(c("@R_LIBRARY_PATH@")) - -modulePkg <- "@PROJECT_SOURCE_DIR@/Engine/jaspBase" -moduleLibrary <- "@R_LIBRARY_PATH@" -prompt <- FALSE - -if (md5SumsChanged(modulePkg, moduleLibrary)) { - options( - renv.cache.linkable = FALSE, - configure.vars = c(jaspBase = "INCLUDE_DIR='@PROJECT_SOURCE_DIR@/Common/jaspColumnEncoder'") - ) - - Sys.setenv(JASP_R_INTERFACE_LIBRARY="Oh yes indeed") - setupRenv("@R_LIBRARY_PATH@", modulePkg) - - renv::hydrate(library = moduleLibrary, project = modulePkg, sources=moduleLibrary) - options(renv.config.install.verbose = TRUE) - renv::install(package = modulePkg, project = modulePkg, library = moduleLibrary, prompt = prompt) - - correctlyInstalled <- installModulePkg(modulePkg, moduleLibrary, prompt, cacheAble=TRUE) - - if (correctlyInstalled) - writeMd5Sums(modulePkg, moduleLibrary) -} - -# Converting the absolute symlinks to relative symlinks on macOS -# Todo, I can do this using CMake like I do on Windows -if (Sys.info()["sysname"] == "Darwin") { - source('@MODULES_BINARY_PATH@/symlinkTools.R') - convertAbsoluteSymlinksToRelative('@R_LIBRARY_PATH@', '@MODULES_RENV_CACHE_PATH@') -} diff --git a/Modules/install-jaspModuleInstaller.R.in b/Modules/install-jaspModuleInstaller.R.in new file mode 100644 index 0000000000..8e1b11e7af --- /dev/null +++ b/Modules/install-jaspModuleInstaller.R.in @@ -0,0 +1,105 @@ +# Generated from install-jaspBase.R.in +# +Sys.setenv(GITHUB_PAT = "@GITHUB_PAT@") +Sys.setenv(RENV_PATHS_ROOT = "@MODULES_RENV_ROOT_PATH@") +Sys.setenv(RENV_PATHS_CACHE = "@MODULES_RENV_CACHE_PATH@") +Sys.setenv(RENV_PATHS_SANDBOX = "@RENV_SANDBOX@") +Sys.setenv(JASPENGINE_LOCATION = "@JASP_ENGINE_PATH@/JASPEngine") + +if("@R_PKG_CELLAR_PATH@" != "") + Sys.setenv(RENV_PATHS_CELLAR = "@R_PKG_CELLAR_PATH@") + + +#Load the post-install fixes from jaspBase. Think Baron von Munchhausen ;) +source("@PROJECT_SOURCE_DIR@/Engine/jaspModuleInstaller/R/renvOverrides.R") +source("@PROJECT_SOURCE_DIR@/Engine/jaspModuleInstaller/R/checksums.R") +source("@PROJECT_SOURCE_DIR@/Engine/jaspModuleInstaller/R/utils.R") +source("@PROJECT_SOURCE_DIR@/Engine/jaspModuleInstaller/R/installModule.R") + +# The R_LIBRARY_PATH might already be there, but depending on the configuration +# of the CMake, we might be installing in a different location, so, I just add +# it anyway! It gets to if-y. + + +.libPaths("@RENV_LIBRARY@") +sandboxPaths <- renv:::renv_sandbox_activate() + +JASPMODULEINSTALLER_LIBRARY <- "@JASPMODULEINSTALLER_LIBRARY@" +PKGDEPENDS_LIBRARY <- "@PKGDEPENDS_LIBRARY@" +RENV_LIBRARY <- "@RENV_LIBRARY@" +R_CPP_INCLUDES_LIBRARY <- "@R_CPP_INCLUDES_LIBRARY@" +JUNCTION_HANDLING_LIBRARY <- "@JUNCTION_HANDLING_LIBRARY@" + +ENGINE <- file.path("@PROJECT_SOURCE_DIR@", "Engine") +MODULES <- file.path("@PROJECT_SOURCE_DIR@", "Modules") +TOOLS <- file.path("@PROJECT_SOURCE_DIR@", "Tools") + + +modulePkg <- file.path("@PROJECT_SOURCE_DIR@", "Engine", "jaspModuleInstaller") + +cat("Restoring pkgdepends\n") +setupRenv(PKGDEPENDS_LIBRARY) +renv::restore( + library = PKGDEPENDS_LIBRARY, + lockfile = file.path(MODULES, "pkgdepends.lock"), + clean = TRUE +) + +if (.Platform$OS.type == "windows") { + cat("Restoring junction handling library\n") + options(renv.config.cache.symlinks = FALSE) + setupRenv(JUNCTION_HANDLING_LIBRARY) + renv::restore( + library = JUNCTION_HANDLING_LIBRARY, + lockfile = file.path(MODULES, "junctionBootstrap.lock"), + clean = TRUE + ) +} + +cat("Restoring jaspModuleInstaller\n") +options(renv.config.cache.symlinks = TRUE) +setupRenv(JASPMODULEINSTALLER_LIBRARY) +renv::restore( + library = JASPMODULEINSTALLER_LIBRARY, + lockfile = file.path(ENGINE, "jaspModuleInstaller", "renv.lock"), + exclude = "jaspModuleInstaller", # otherwise "clean" would remove jaspModuleInstaller + clean = TRUE +) + +print("Installing jaspModuleInstaller") +.libPaths(JASPMODULEINSTALLER_LIBRARY) +setupRenv("@R_LIBRARY_PATH@", modulePkg) + +record <- createLocalRecord(modulePkg, getModuleInfo(modulePkg), cacheAble = FALSE, addJaspToVersion = FALSE) +lf <- renv::lockfile_read(file.path(modulePkg, "renv.lock")) +lf <- renv::record(record, lockfile = lf) +cat(".libPaths()", .libPaths(), sep = "\n") + +# remove the package if it is installed, otherwise renv doesn't realize we want to reinstall it +pkgName <- basename(modulePkg) +if (dir.exists(file.path(.libPaths()[1L], pkgName))) + utils::remove.packages(pkgs = pkgName, lib = .libPaths()[1L]) + +renv::restore(lockfile = lf, library = .libPaths(), rebuild = pkgName) + + + +print("jaspModuleInstaller::writeModuleStatusObject(@PROJECT_SOURCE_DIR@") +jaspModuleInstaller::writeModuleStatusObject("@PROJECT_SOURCE_DIR@") +#This is necessary because of conflicts with Matrix dep of base R lib. +#Can be removed when a new version of R updates its Matrix +if (!@IS_FLATPAK_USED@) { + + if (Sys.info()["sysname"] == "Darwin") { + options(pkgType = "source") + } + + renv::install("Matrix", library = JASPMODULEINSTALLER_LIBRARY, prompt = FALSE) +} + +# Converting the absolute symlinks to relative symlinks on macOS +# Todo, I can do this using CMake like I do on Windows +if (Sys.info()["sysname"] == "Darwin") { + source('@MODULES_BINARY_PATH@/Tools/symlinkTools.R') + convertAbsoluteSymlinksToRelative('@R_LIBRARY_PATH@', '@MODULES_RENV_CACHE_PATH@') +} diff --git a/Modules/install-module.R.in b/Modules/install-module.R.in index 3186b3c304..2d1217e601 100644 --- a/Modules/install-module.R.in +++ b/Modules/install-module.R.in @@ -11,6 +11,14 @@ Sys.setenv(JAGS_PREFIX ="@jags_HOME@") Sys.setenv(JAGS_INCLUDEDIR ="@jags_INCLUDE_DIRS@") Sys.setenv(JAGS_LIBDIR ="@jags_LIBRARY_DIRS@") Sys.setenv(JASP_R_INTERFACE_LIBRARY ="Yes, do it") +Sys.setenv(RPKG_DOWNLOAD_ONLY = "@RPKG_DOWNLOAD_ONLY@") +Sys.setenv(REGENERATE_LOCKFILE = "@REGENERATE_LOCKFILE@") +Sys.setenv(MODULE_INSTALL_MODE = "@MODULE_INSTALL_MODE@") + + + +if("@R_PKG_CELLAR_PATH@" != "") + Sys.setenv(RENV_PATHS_CELLAR = "@R_PKG_CELLAR_PATH@") defaultMakeFlags <- function() { Sys.setenv(MAKEFLAGS = "-j" ) } setMakeFlagsToOne <- function() { Sys.setenv(MAKEFLAGS = "-j1") } @@ -21,51 +29,48 @@ options("JASP_RENV_INSTALL_OPTIONS" = list( blavaan = list(before = setMakeFlagsToOne, after = defaultMakeFlags), metaBMA = list(before = setMakeFlagsToOne, after = defaultMakeFlags), rstanarm = list(before = setMakeFlagsToOne, after = defaultMakeFlags), - stanova = list(before = setMakeFlagsToOne, after = defaultMakeFlags) - + stanova = list(before = setMakeFlagsToOne, after = defaultMakeFlags), + rpf = list(before = setMakeFlagsToOne, after = defaultMakeFlags), + cubature = list(before = setMakeFlagsToOne, after = defaultMakeFlags) )) options(renv.config.install.verbose = TRUE) +configureVars = NULL if (@IS_LINUX_LOCAL_BUILD@) { - # Only set when building using LINUX_LOCAL_BUILD. This is to help jags finds its libraries - Sys.setenv(LD_LIBRARY_PATH="@jags_LIBRARY_DIRS@") -} - - -if (@IS_FLATPAK_USED@) { - source('/app/lib64/Rprofile.R'); + # Only set when building using LINUX_LOCAL_BUILD. This is to help jags finds its libraries + Sys.setenv(LD_LIBRARY_PATH="@jags_LIBRARY_DIRS@") + configureVars = c(V8 = 'DOWNLOAD_STATIC_LIBV8=1') +} +if(@IS_FLATPAK_USED@) { + configureVars = c(V8 = "V8_PKG_LIBS='-L/app/lib64/v8/lib -lv8_monolith' V8_PKG_CFLAGS=-I/app/lib64/v8/include") } -# The R_LIBRARY_PATH might already be there, but depending on the configuration -# of the CMake, we might be installing in a different location, so, I just add -# it anyway! It gets to if-y. -.libPaths(c("@R_LIBRARY_PATH@")) +.libPaths("@JASPMODULEINSTALLER_LIBRARY@") +sandboxPaths <- renv:::renv_sandbox_activate() +configureVars = c(configureVars, jaspBase = "INCLUDE_DIR='@PROJECT_SOURCE_DIR@/Common/jaspColumnEncoder'") #Needed for flatpak build as it keeps recompiling jaspBase (which it shouldnt of course but I dont know why) and this is an easy fix to get it to work now options( - configure.vars = c(jaspBase = "INCLUDE_DIR='@PROJECT_SOURCE_DIR@/Common/jaspColumnEncoder'") #Needed for flatpak build as it keeps recompiling jaspBase (which it shouldnt of course but I dont know why) and this is an easy fix to get it to work now + configure.vars = configureVars, + PKGDEPENDS_LIBRARY = "@PKGDEPENDS_LIBRARY@" ) -if (jaspBase::getOS() == "osx" || jaspBase::getOS() == "windows") { - options(pkgType = "@R_BINARY_TYPE@") -} - -# Related to the comment above, there is variable here called, -# `libPathsToUse` but it is not connected to anything. If this works, -# then, I don't need to set the libPaths() anymore perhaps. -result <- jaspBase::installJaspModule("@MODULES_SOURCE_PATH@/@MODULE@", - repos="@R_REPOSITORY@", - moduleLibrary="@MODULES_BINARY_PATH@/@MODULE@", - onlyModPkg=FALSE, - libPathsToUse='', - frameworkLibrary="@R_LIBRARY_PATH@") +options(error = recover) +jaspModuleInstaller::installJaspModule( + modulePkg = "@MODULES_SOURCE_PATH@/@MODULE@", + repos = "@R_REPOSITORY@", + moduleLibrary = "@MODULES_BINARY_PATH@/@MODULE@", + onlyModPkg = FALSE, + frameworkLibrary = "@R_LIBRARY_PATH@" +) +result <- "succes" if (result == "succes") { - cat(NULL, file="@MODULES_RENV_ROOT_PATH@/@MODULE@-installed-successfully.log") + cat(NULL, file="@MODULES_RENV_ROOT_PATH@/@MODULE@-installed-successfully.log") } # Converting the absolute symlinks to relative symlinks on macOS # Todo, I can do this using CMake like I do on Windows -if (Sys.info()["sysname"] == "Darwin") { - source('@MODULES_BINARY_PATH@/symlinkTools.R') - convertAbsoluteSymlinksToRelative('@MODULES_BINARY_PATH@', '@MODULES_RENV_CACHE_PATH@') +if (Sys.info()["sysname"] == "Darwin") { + source('@MODULES_BINARY_PATH@/Tools/symlinkTools.R') + convertAbsoluteSymlinksToRelative('@MODULES_BINARY_PATH@', '@MODULES_RENV_CACHE_PATH@') } diff --git a/Modules/install-renv.R.in b/Modules/install-renv.R.in deleted file mode 100644 index 22162772de..0000000000 --- a/Modules/install-renv.R.in +++ /dev/null @@ -1,6 +0,0 @@ -# Generated from install-renv.R.in -# -.libPaths(c("@R_LIBRARY_PATH@")) - -install.packages(c('renv'), lib='@R_LIBRARY_PATH@', repos='@R_REPOSITORY@', INSTALL_opts='--no-multiarch --no-docs --no-test-load') -#remotes::install_github("vandenman/renv", ref="fix_multiple_cache_error", lib='@R_LIBRARY_PATH@', repos='@R_REPOSITORY@', INSTALL_opts='--no-multiarch --no-docs --no-test-load') diff --git a/Modules/jaspAcceptanceSampling b/Modules/jaspAcceptanceSampling index 5259cfc1c3..cda8476b35 160000 --- a/Modules/jaspAcceptanceSampling +++ b/Modules/jaspAcceptanceSampling @@ -1 +1 @@ -Subproject commit 5259cfc1c331e5cf7ea1107a9d3b9f427cfe8afb +Subproject commit cda8476b35c28db78cc02e56e339f8874ae69bc4 diff --git a/Modules/jaspAnova b/Modules/jaspAnova index 1172c95396..96e8235c67 160000 --- a/Modules/jaspAnova +++ b/Modules/jaspAnova @@ -1 +1 @@ -Subproject commit 1172c953966e53789496d21fa684af46fec49135 +Subproject commit 96e8235c67781a854afd1f23ce73fc0c10e41762 diff --git a/Modules/jaspAudit b/Modules/jaspAudit index 28c7640677..c980d5adb4 160000 --- a/Modules/jaspAudit +++ b/Modules/jaspAudit @@ -1 +1 @@ -Subproject commit 28c764067725e162d9f5af628e02546333f6406a +Subproject commit c980d5adb46367c9020ca28d3a5d95e0e78c23f3 diff --git a/Modules/jaspBain b/Modules/jaspBain index b5ca75ad61..eef1ef2ea2 160000 --- a/Modules/jaspBain +++ b/Modules/jaspBain @@ -1 +1 @@ -Subproject commit b5ca75ad61e53560a26e2caa2d86f5e74dde2ff2 +Subproject commit eef1ef2ea219ef453ce3cb3ee6f9c4309aa1fb1d diff --git a/Modules/jaspBsts b/Modules/jaspBsts index 5879d2fabf..d3ff6ab115 160000 --- a/Modules/jaspBsts +++ b/Modules/jaspBsts @@ -1 +1 @@ -Subproject commit 5879d2fabf59e29f664ba458a1d8a4951cee54be +Subproject commit d3ff6ab115581dfeebb30ea6f8bdc1a8453f7029 diff --git a/Modules/jaspCircular b/Modules/jaspCircular index 2bf11feb81..b57a87586d 160000 --- a/Modules/jaspCircular +++ b/Modules/jaspCircular @@ -1 +1 @@ -Subproject commit 2bf11feb81ada6872a2117f748819025e5a89d00 +Subproject commit b57a87586df033d59a178bff74820b186e2e9c15 diff --git a/Modules/jaspCochrane b/Modules/jaspCochrane index 9728819a60..54b9d3c22f 160000 --- a/Modules/jaspCochrane +++ b/Modules/jaspCochrane @@ -1 +1 @@ -Subproject commit 9728819a60d005295a7bfd8b805e6d47d35705b8 +Subproject commit 54b9d3c22fba2a45a08cd791930ef3fc446b7194 diff --git a/Modules/jaspDescriptives b/Modules/jaspDescriptives index f6ba4aa4c9..9e46068a01 160000 --- a/Modules/jaspDescriptives +++ b/Modules/jaspDescriptives @@ -1 +1 @@ -Subproject commit f6ba4aa4c933febecf2ff3a8c81e9af3341a451a +Subproject commit 9e46068a0120ca877a15e1f062d62b3a64bc87a2 diff --git a/Modules/jaspDistributions b/Modules/jaspDistributions index afc50c8cad..25c76fc2da 160000 --- a/Modules/jaspDistributions +++ b/Modules/jaspDistributions @@ -1 +1 @@ -Subproject commit afc50c8cadb1fbb3990f8cb78c8aff836c98bc0e +Subproject commit 25c76fc2da9c1461ebaa399bb1e93ee8b7f14890 diff --git a/Modules/jaspEquivalenceTTests b/Modules/jaspEquivalenceTTests index 26ec4008c9..0342474c5a 160000 --- a/Modules/jaspEquivalenceTTests +++ b/Modules/jaspEquivalenceTTests @@ -1 +1 @@ -Subproject commit 26ec4008c9b8311e59e3f07e9cfb8f5b069acb82 +Subproject commit 0342474c5a7dcee453b54d0d19a9a2e7912e9b13 diff --git a/Modules/jaspFactor b/Modules/jaspFactor index 656d329a58..dd08b70d9e 160000 --- a/Modules/jaspFactor +++ b/Modules/jaspFactor @@ -1 +1 @@ -Subproject commit 656d329a5899658bd04c4e46a9aa56b54b0ca7ff +Subproject commit dd08b70d9e7155fdc2fca85ef6e9b97c401ff692 diff --git a/Modules/jaspFrequencies b/Modules/jaspFrequencies index f94529d357..55e55a8900 160000 --- a/Modules/jaspFrequencies +++ b/Modules/jaspFrequencies @@ -1 +1 @@ -Subproject commit f94529d357d1d7949faadc6b870d0c6a7df8f56d +Subproject commit 55e55a8900a50346a449ce2dc77b9198b0e7695c diff --git a/Modules/jaspJags b/Modules/jaspJags index 6faa88d876..c271aa6a42 160000 --- a/Modules/jaspJags +++ b/Modules/jaspJags @@ -1 +1 @@ -Subproject commit 6faa88d87679764471498c688dd550470fefee81 +Subproject commit c271aa6a42c4ccc79a7133180bb22e4e507e35b7 diff --git a/Modules/jaspLearnBayes b/Modules/jaspLearnBayes index 294d506b48..5d2b658f5d 160000 --- a/Modules/jaspLearnBayes +++ b/Modules/jaspLearnBayes @@ -1 +1 @@ -Subproject commit 294d506b485eed22fa85ff0132be0998335c4f51 +Subproject commit 5d2b658f5d688c4ec40555970dc32d17a9b05f33 diff --git a/Modules/jaspLearnStats b/Modules/jaspLearnStats index 301ddd6ff7..7cabdde98f 160000 --- a/Modules/jaspLearnStats +++ b/Modules/jaspLearnStats @@ -1 +1 @@ -Subproject commit 301ddd6ff77fffbc68324bf00aa5c16cb2b989ca +Subproject commit 7cabdde98fdacbdde072e7625cb71d3bd515058d diff --git a/Modules/jaspMachineLearning b/Modules/jaspMachineLearning index feff392945..4d11495c74 160000 --- a/Modules/jaspMachineLearning +++ b/Modules/jaspMachineLearning @@ -1 +1 @@ -Subproject commit feff39294545a1b475910dd59e42fb1af10bda4a +Subproject commit 4d11495c7472e62da8c0eca5040866dfe5c41793 diff --git a/Modules/jaspMetaAnalysis b/Modules/jaspMetaAnalysis index 147a60eac2..0d4129d1da 160000 --- a/Modules/jaspMetaAnalysis +++ b/Modules/jaspMetaAnalysis @@ -1 +1 @@ -Subproject commit 147a60eac2efad430b3279cfb6d2f66de834e6c5 +Subproject commit 0d4129d1dae1df7796ff2050817a4bf35250a557 diff --git a/Modules/jaspMixedModels b/Modules/jaspMixedModels index e23177a38b..44f4cab613 160000 --- a/Modules/jaspMixedModels +++ b/Modules/jaspMixedModels @@ -1 +1 @@ -Subproject commit e23177a38b65ddf48d251b02d5e48aa43a00a6a7 +Subproject commit 44f4cab6137ebca07a82012c277d4b0b34278a2d diff --git a/Modules/jaspNetwork b/Modules/jaspNetwork index f9e45cf8cb..40e2b8de65 160000 --- a/Modules/jaspNetwork +++ b/Modules/jaspNetwork @@ -1 +1 @@ -Subproject commit f9e45cf8cbec5d2d781d8a86547fc88bd48ebc76 +Subproject commit 40e2b8de65a51cc40d5bbca9dfce17304f445266 diff --git a/Modules/jaspPower b/Modules/jaspPower index fdcfd31800..41b84cf153 160000 --- a/Modules/jaspPower +++ b/Modules/jaspPower @@ -1 +1 @@ -Subproject commit fdcfd31800bafba6bc9b726bfc4591228207a581 +Subproject commit 41b84cf153fee61448daf584adda61ee90779d49 diff --git a/Modules/jaspPredictiveAnalytics b/Modules/jaspPredictiveAnalytics index 0376f4881a..f306eecbb5 160000 --- a/Modules/jaspPredictiveAnalytics +++ b/Modules/jaspPredictiveAnalytics @@ -1 +1 @@ -Subproject commit 0376f4881a351e4de0373e1104555723e0141b6b +Subproject commit f306eecbb581ccfb1263f784cf80e910d389965b diff --git a/Modules/jaspProcess b/Modules/jaspProcess index 3c2ff78bb8..0778a5d18c 160000 --- a/Modules/jaspProcess +++ b/Modules/jaspProcess @@ -1 +1 @@ -Subproject commit 3c2ff78bb8418dc951143bc619a2433bc7ba28a2 +Subproject commit 0778a5d18c55562097c164847258d7804c663a6a diff --git a/Modules/jaspProphet b/Modules/jaspProphet index 8ebdc9819a..ca367863c1 160000 --- a/Modules/jaspProphet +++ b/Modules/jaspProphet @@ -1 +1 @@ -Subproject commit 8ebdc9819a45bd019bf02162ea3b4ed21881d691 +Subproject commit ca367863c1d13654c7455deb1cc6814d04979567 diff --git a/Modules/jaspQualityControl b/Modules/jaspQualityControl index 266153b5c6..71a9f4ca0e 160000 --- a/Modules/jaspQualityControl +++ b/Modules/jaspQualityControl @@ -1 +1 @@ -Subproject commit 266153b5c6fe096d8ae0963eb6e367810c61036b +Subproject commit 71a9f4ca0e20a06ba7980325841649d3639accad diff --git a/Modules/jaspRegression b/Modules/jaspRegression index abfe57c319..170ddd582b 160000 --- a/Modules/jaspRegression +++ b/Modules/jaspRegression @@ -1 +1 @@ -Subproject commit abfe57c3193a23a000fbbcbeca50ebe7778f5c1e +Subproject commit 170ddd582b818c1fce5a18b235ba43ab4c54d398 diff --git a/Modules/jaspReliability b/Modules/jaspReliability index 29c1eb57d9..74adf19d59 160000 --- a/Modules/jaspReliability +++ b/Modules/jaspReliability @@ -1 +1 @@ -Subproject commit 29c1eb57d9213d4e40a626ddb042caca666e10d1 +Subproject commit 74adf19d593c4912491be38c9d503f56f5f849c4 diff --git a/Modules/jaspRobustTTests b/Modules/jaspRobustTTests index 162478ce18..55a438e74e 160000 --- a/Modules/jaspRobustTTests +++ b/Modules/jaspRobustTTests @@ -1 +1 @@ -Subproject commit 162478ce18d909655e3afe2447402cbf8dd675b0 +Subproject commit 55a438e74ed699e323ec8710477c413f8af411b5 diff --git a/Modules/jaspSem b/Modules/jaspSem index 6bdb86f4ec..a5142a1685 160000 --- a/Modules/jaspSem +++ b/Modules/jaspSem @@ -1 +1 @@ -Subproject commit 6bdb86f4ecc75e1aa60c7ef6b603688ff63f7b7f +Subproject commit a5142a16851ecf2bcbffa7498de74cb02dd91d69 diff --git a/Modules/jaspSummaryStatistics b/Modules/jaspSummaryStatistics index 5b92974bff..4ec2a84261 160000 --- a/Modules/jaspSummaryStatistics +++ b/Modules/jaspSummaryStatistics @@ -1 +1 @@ -Subproject commit 5b92974bff81c1a6654fd0090d92559151e90fbe +Subproject commit 4ec2a84261df75d23fe3732ff3f523accdbe9489 diff --git a/Modules/jaspSurvival b/Modules/jaspSurvival index 6d1a904c5c..e6fd46ecd9 160000 --- a/Modules/jaspSurvival +++ b/Modules/jaspSurvival @@ -1 +1 @@ -Subproject commit 6d1a904c5c376244df7c8ef6c0b545dedbcf2b4b +Subproject commit e6fd46ecd9813097df7786e78769b625f4d5591f diff --git a/Modules/jaspTTests b/Modules/jaspTTests index e04f30b6db..657bfc9ba4 160000 --- a/Modules/jaspTTests +++ b/Modules/jaspTTests @@ -1 +1 @@ -Subproject commit e04f30b6db24df245bb46bcb7f7a115c98cc8e02 +Subproject commit 657bfc9ba486ecb6524b3b1120b993f7fe3fe1fb diff --git a/Modules/jaspTimeSeries b/Modules/jaspTimeSeries index e7164bb3f8..440fe623fc 160000 --- a/Modules/jaspTimeSeries +++ b/Modules/jaspTimeSeries @@ -1 +1 @@ -Subproject commit e7164bb3f8ccfe69f7fedddb6fcac679be40a0fd +Subproject commit 440fe623fc69951c9131c24ec9fc9578ad315eca diff --git a/Modules/jaspVisualModeling b/Modules/jaspVisualModeling index 9573b2d73c..05ffe013b5 160000 --- a/Modules/jaspVisualModeling +++ b/Modules/jaspVisualModeling @@ -1 +1 @@ -Subproject commit 9573b2d73c7fee031b3a41f2a55a841b5f67328f +Subproject commit 05ffe013b57959bef1a74fa24288830f62dd1e1a diff --git a/Modules/junctionBootstrap.lock b/Modules/junctionBootstrap.lock new file mode 100644 index 0000000000..3204801b83 --- /dev/null +++ b/Modules/junctionBootstrap.lock @@ -0,0 +1,25 @@ +{ + "R": { + "Version": "4.3.3", + "Repositories": [ + { + "Name": "CRAN", + "URL": "https://cran.rstudio.com" + } + ] + }, + "Packages": { + "RInside": { + "Package": "RInside", + "Source": "Repository" + }, + "fs": { + "Package": "fs", + "Source": "Repository" + }, + "Rcpp": { + "Package": "Rcpp", + "Source": "Repository" + } + } +} diff --git a/Modules/pkgdepends.lock b/Modules/pkgdepends.lock new file mode 100644 index 0000000000..15682ea82e --- /dev/null +++ b/Modules/pkgdepends.lock @@ -0,0 +1,243 @@ +{ + "R": { + "Version": "4.3.3", + "Repositories": [ + { + "Name": "CRAN", + "URL": "https://cloud.r-project.org" + } + ] + }, + "Packages": { + "R6": { + "Package": "R6", + "Version": "2.5.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "470851b6d5d0ac559e9d01bb352b4021" + }, + "callr": { + "Package": "callr", + "Version": "3.7.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "processx", + "utils" + ], + "Hash": "9b2191ede20fa29828139b9900922e51" + }, + "cli": { + "Package": "cli", + "Version": "3.6.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "89e6d8219950eac806ae0c489052048a" + }, + "crayon": { + "Package": "crayon", + "Version": "1.5.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "grDevices", + "methods", + "utils" + ], + "Hash": "e8a1e41acf02548751f45c718d55aa6a" + }, + "curl": { + "Package": "curl", + "Version": "5.0.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "511bacbfa153a15251166b463b4da4f9" + }, + "desc": { + "Package": "desc", + "Version": "1.4.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "cli", + "rprojroot", + "utils" + ], + "Hash": "6b9602c7ebbe87101a9c8edb6e8b6d21" + }, + "filelock": { + "Package": "filelock", + "Version": "1.0.2", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "38ec653c2613bed60052ba3787bd8a2c" + }, + "glue": { + "Package": "glue", + "Version": "1.6.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "methods" + ], + "Hash": "4f2596dfb05dac67b9dc558e5c6fba2e" + }, + "jsonlite": { + "Package": "jsonlite", + "Version": "1.8.7", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "methods" + ], + "Hash": "266a20443ca13c65688b2116d5220f76" + }, + "lpSolve": { + "Package": "lpSolve", + "Version": "5.6.18", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "12c7a918599d5700e4265dd8a21f684f" + }, + "pkgbuild": { + "Package": "pkgbuild", + "Version": "1.4.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "callr", + "cli", + "crayon", + "desc", + "prettyunits", + "processx", + "rprojroot" + ], + "Hash": "beb25b32a957a22a5c301a9e441190b3" + }, + "pkgcache": { + "Package": "pkgcache", + "Version": "2.2.0.1", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "callr", + "cli", + "curl", + "filelock", + "jsonlite", + "prettyunits", + "processx", + "rappdirs", + "tools", + "utils" + ], + "Hash": "2622106d5651a653c55430ee5f583978" + }, + "pkgdepends": { + "Package": "pkgdepends", + "Version": "0.6.0", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "callr", + "cli", + "curl", + "desc", + "filelock", + "glue", + "jsonlite", + "lpSolve", + "pkgbuild", + "pkgcache", + "prettyunits", + "processx", + "ps", + "rprojroot", + "stats", + "utils", + "zip" + ], + "Hash": "d0a9c1ca3fbc82d3db84e65f09b42720" + }, + "prettyunits": { + "Package": "prettyunits", + "Version": "1.1.1", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "95ef9167b75dde9d2ccc3c7528393e7e" + }, + "processx": { + "Package": "processx", + "Version": "3.8.2", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "R6", + "ps", + "utils" + ], + "Hash": "3efbd8ac1be0296a46c55387aeace0f3" + }, + "ps": { + "Package": "ps", + "Version": "1.7.5", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R", + "utils" + ], + "Hash": "709d852d33178db54b17c722e5b1e594" + }, + "rappdirs": { + "Package": "rappdirs", + "Version": "0.3.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "5e3c5dc0b071b21fa128676560dbe94d" + }, + "rprojroot": { + "Package": "rprojroot", + "Version": "2.0.3", + "Source": "Repository", + "Repository": "CRAN", + "Requirements": [ + "R" + ], + "Hash": "1de7ab598047a87bba48434ba35d497d" + }, + "zip": { + "Package": "zip", + "Version": "2.3.0", + "Source": "Repository", + "Repository": "CRAN", + "Hash": "d98c94dacb7e0efcf83b0a133a705504" + } + } +} diff --git a/Modules/setup_renv_rcpp_rinside.R.in b/Modules/setup_renv_rcpp_rinside.R.in new file mode 100644 index 0000000000..a119bacaa3 --- /dev/null +++ b/Modules/setup_renv_rcpp_rinside.R.in @@ -0,0 +1,79 @@ +# Generated from Tools/setup_renv_rcpp_rinside_jaspModuleInstaller.R.in +# +Sys.setenv(GITHUB_PAT = "@GITHUB_PAT@") +Sys.setenv(RENV_PATHS_ROOT = "@MODULES_RENV_ROOT_PATH@") +Sys.setenv(RENV_PATHS_CACHE = "@MODULES_RENV_CACHE_PATH@") +Sys.setenv(RENV_PATHS_SANDBOX = "@RENV_SANDBOX@") +Sys.setenv(JASPENGINE_LOCATION = "@JASP_ENGINE_PATH@/JASPEngine") + +if("@R_PKG_CELLAR_PATH@" != "") + Sys.setenv(RENV_PATHS_CELLAR = "@R_PKG_CELLAR_PATH@") + +RENV_LIBRARY <- "@RENV_LIBRARY@" +R_CPP_INCLUDES_LIBRARY <- "@R_CPP_INCLUDES_LIBRARY@" +JASPMODULEINSTALLER_LIBRARY <- "@JASPMODULEINSTALLER_LIBRARY@" +PKGDEPENDS_LIBRARY <- "@PKGDEPENDS_LIBRARY@" + +ENGINE <- file.path("@PROJECT_SOURCE_DIR@", "Engine") +MODULES <- file.path("@PROJECT_SOURCE_DIR@", "Modules") +TOOLS <- file.path("@PROJECT_SOURCE_DIR@", "Tools") + +# defines assignFunctionInRenv, getOS, and setupRenv +source(file.path(ENGINE, "jaspModuleInstaller", "R", "renvOverrides.R")) + +mkdir <- function(paths) { + for (path in paths) + if (!dir.exists(path)) + dir.create(path, recursive = TRUE) +} + +mkdir(c(RENV_LIBRARY, R_CPP_INCLUDES_LIBRARY, JASPMODULEINSTALLER_LIBRARY)) + +repos <- "https://packagemanager.posit.co/cran/latest" +# alternative to 'http://cloud.r-project.org' +if (!dir.exists(file.path(RENV_LIBRARY, "renv"))) { + if (@IS_FLATPAK_USED@) { + cat("Installing renv from cellar\n") + install.packages( + pkgs = file.path("@R_PKG_CELLAR_PATH@", "renv.tar.gz"), + lib = RENV_LIBRARY, + INSTALL_opts ='--no-multiarch --no-docs --no-test-load') # --no-test-load is dubious here + } else { + cat("Installing renv from CRAN\n") + install.packages( + pkgs = "renv", + lib = RENV_LIBRARY, + repos ='http://cloud.r-project.org', + INSTALL_opts ='--no-multiarch --no-docs --no-test-load') # --no-test-load is dubious here + } +} else { + cat("renv already installed, not reinstalling\n") +} + +# used by renv +options( + install.opts = "--no-multiarch --no-docs --no-test-load", + # these two could be added to setupRenv + renv.config.install.verbose = TRUE, + renv.config.ppm.default = TRUE +) + +.libPaths(RENV_LIBRARY) +sandboxPaths <- renv:::renv_sandbox_activate() + +#to fix flatpak issue cleaning up on interrupt +if (@IS_FLATPAK_USED@) { + system2(command="chmod", args=c("-R", "777", "@RENV_LIBRARY@/../")) +} + +cat("Using sandbox paths:\n") +for (path in sandboxPaths) + cat(" ", path, "\n", sep = "") + +cat("Restoring Rcpp & RInside\n") +setupRenv(R_CPP_INCLUDES_LIBRARY) +renv::restore( + library = R_CPP_INCLUDES_LIBRARY, + lockfile = file.path(MODULES, "Rcpp_RInside.lock"), + clean = TRUE +) diff --git a/R-Interface/CMakeLists.txt b/R-Interface/CMakeLists.txt index 8807e597fa..de3bb51c17 100644 --- a/R-Interface/CMakeLists.txt +++ b/R-Interface/CMakeLists.txt @@ -91,9 +91,17 @@ if(WIN32) set(R_EXECUTABLE "${R_HOME_PATH}/bin/R") set(R_INCLUDE_PATH "${R_HOME_PATH}/include") - set(RCPP_PATH "${R_LIBRARY_PATH}/Rcpp") - set(RINSIDE_PATH "${R_LIBRARY_PATH}/RInside") - set(RENV_PATH "${R_LIBRARY_PATH}/renv") + set(RENV_PATH "${JASP_BINARY_DIR}/_cache/R/renv_library/renv") + + set(R_CPP_INCLUDES_LIBRARY "${JASP_BINARY_DIR}/Modules/Tools/R_cpp_includes_library") + include(FindRPackagePath) + + find_package_path(RCPP_PATH ${R_CPP_INCLUDES_LIBRARY} "Rcpp") + find_package_path(RINSIDE_PATH ${R_CPP_INCLUDES_LIBRARY} "RInside") + + message(STATUS "RCPP_PATH = ${RCPP_PATH}") + message(STATUS "RINSIDE_PATH = ${RINSIDE_PATH}") + message(STATUS "RENV_PATH = ${RENV_PATH}") include(FetchContent) include(ExternalProject) diff --git a/R-Interface/R/symlinkTools.R b/R-Interface/R/symlinkTools.R index a4f62b883c..116939faf7 100644 --- a/R-Interface/R/symlinkTools.R +++ b/R-Interface/R/symlinkTools.R @@ -42,8 +42,8 @@ determineOverlap <- function(targetRoot, sourceRoot) { targetSplit <- splitPath(target) rootToSrc <- pastePath(sourceSplit[seq(overlap$len + 1, length(sourceSplit))]) - stepsDown <- length(targetSplit) - (overlap$len + as.integer(addRootToSource)) - tgtToSrc <- pastePath(rep("..", stepsDown) ) + stepsDown <- length(targetSplit) - (overlap$len + as.integer(addRootToSource)) - 1 + tgtToSrc <- pastePath(rep("..", max(0, stepsDown)) ) #for debug: #tgtToSrc <- paste0(tgtToSrc, .Platform$file.sep, ".") @@ -70,7 +70,7 @@ getRelativityFunction <- function(modulesRoot, renvCache) { if (Sys.info()["sysname"] == "Darwin") { - modToRenvS <- pastePath(c("..", "renv-cache")) + modToRenvS <- "renv-cache" } else { modToRenvF <- determineOverlap(modulesRoot, renvCache) modToRenvS <- modToRenvF$targetToSource(renvCache, TRUE) @@ -85,7 +85,11 @@ getRelativityFunction <- function(modulesRoot, renvCache) pathToRenv <- determineOverlap(targetPath, renvCache)$sourceToTarget linkToModS <- linkToMod(linkLocation, FALSE) - linkToRenvS <- modToRenvS #pastePath(c(linkToModS, modToRenvS)) + if (Sys.info()["sysname"] == "Darwin") { + linkToRenvS <- pastePath(c(linkToModS, modToRenvS)) + } else { + linkToRenvS <- modToRenvS + } pathToRenvS <- pathToRenv(targetPath) newTarget <- paste0(linkToRenvS, .Platform$file.sep, pathToRenvS) @@ -160,7 +164,7 @@ collectLinks <- function(modulesRoot, renvCache, isLink, getLink) if(!startsWith(symPath, ".")) #if starts with dot it is already relative symlinks[nrow(symlinks)+1, ] <<- list(linkLocation=path, linkTarget=relativeer(path, symPath), originalTarget=symPath) } - else if (depth < 2) + else if (depth < 6) { everything <- list.files(path, recursive=FALSE, include.dirs=TRUE, all.files=FALSE, full.names=TRUE) @@ -247,8 +251,8 @@ collectAndStoreJunctions <- function(buildfolder) symlinks <- collectLinks(modulesRoot, renvCache, isJunction2, normalizePath) overlap <- determineOverlap(modulesRoot, modulesRoot) relLink <- lapply(symlinks$linkLocation, overlap$sourceToTarget) - modules <- lapply(relLink, function(p) splitPath(p)[[1]]) - links <- lapply(relLink, function(p) splitPath(p)[[2]]) + modules <- lapply(relLink, function(p) { x <- splitPath(p); pastePath(head(x, n=-1)) }) + links <- lapply(relLink, function(p) { x <- splitPath(p); tail(x, n=1) }) if(nrow(symlinks) == 0) print("No absolute symlinks found, maybe you ran this script already?") @@ -261,6 +265,10 @@ collectAndStoreJunctions <- function(buildfolder) restoreJunctions <- function(modulesFolder, junctionsFolder, junctionRDSPath) { + #copy all the non junction dependencies into the Tools + require(utils) + file.copy(utils::shortPathName(pastePath(c(modulesFolder, "Tools"))), shortPathName(junctionsFolder), recursive = TRUE, overwrite = FALSE) + # Should contain a data.frame with columns: renv, module and link. # As created in collectAndStoreJunctions junctions <- readRDS(junctionRDSPath) @@ -281,7 +289,7 @@ restoreJunctions <- function(modulesFolder, junctionsFolder, junctionRDSPath) modDir <- pastePath(c(junctionsFolder, module)) if(!file.exists(modDir)) - dir.create(modDir) + dir.create(modDir, recursive = TRUE) setwd(modDir) # print(paste0("Creating junction '", padToMax(link, 1), "' to '", padToMax(renv, 2), "' in '", padToMax(pastePath(c(modulesRoot, module)), 3), "'")) diff --git a/R-Interface/jasprcpp.cpp b/R-Interface/jasprcpp.cpp index 62f31e10d8..de78232b64 100644 --- a/R-Interface/jasprcpp.cpp +++ b/R-Interface/jasprcpp.cpp @@ -56,6 +56,7 @@ getColNames getAllColumnNames; static logFlushDef _logFlushFunction = nullptr; static logWriteDef _logWriteFunction = nullptr; static sendFuncDef _sendToDesktop = nullptr; +static pollMessagesFuncDef _pollMessagesFunction = nullptr; static systemDef _systemFunc = nullptr; static libraryFixerDef _libraryFixerFunc = nullptr; static std::string _R_HOME = ""; @@ -75,13 +76,13 @@ void STDCALL jaspRCPP_init(const char* buildYear, const char* version, RBridgeCa _logFlushFunction = logFlushFunction; _logWriteFunction = logWriteFunction; _sendToDesktop = sendToDesktopFunction; + _pollMessagesFunction = pollMessagesFunction; _systemFunc = systemFunc; _libraryFixerFunc = libraryFixerFunc; jaspRCPP_logString("Creating RInside.\n"); rinside = new RInside(); - R_TempDir = (char*)tempDir; RInside &rInside = rinside->instance(); @@ -152,12 +153,36 @@ void STDCALL jaspRCPP_init(const char* buildYear, const char* version, RBridgeCa Rcpp::RObject sinkObj = rInside[".outputSink"]; //jaspRCPP_logString(sinkObj.isNULL() ? "sink is null\n" : !sinkObj.isObject() ? " sink is not object\n" : sinkObj.isS4() ? "sink is s4\n" : "sink is obj but not s4\n"); + rInside.parseEvalQNT("sink(.outputSink); print(.libPaths()); sink();"); + + // initialize everything unrelated to jaspBase static const char *baseCitationFormat = "JASP Team (%s). JASP (Version %s) [Computer software]."; char baseCitation[200]; snprintf(baseCitation, 200, baseCitationFormat, buildYear, version); rInside[".baseCitation"] = baseCitation; rInside[".jaspVersion"] = version; + rInside[".baseCitation"] = baseCitation; + rInside[".numDecimals"] = 3; + rInside[".fixedDecimals"] = false; + rInside[".normalizedNotation"] = true; + rInside[".exactPValues"] = false; + rInside[".resultFont"] = "Arial"; + rInside[".imageBackground"] = "transparent"; + rInside[".ppi"] = 300; + + jaspRCPP_parseEvalQNT("library(methods)"); + + _R_HOME = jaspRCPP_parseEvalStringReturn("R.home('')"); + jaspRCPP_logString("R_HOME is: " + _R_HOME + "\n"); + +} + +void STDCALL jaspRCPP_init_jaspBase() +{ + + jaspRCPP_logString("Start initializing jaspBase\n"); + //XPtr doesnt like it if it can't run a finalizer so here are some dummy variables: static logFuncDef _logFuncDef = jaspRCPP_logString; static getColumnTypeFuncDef _getColumnTypeFuncDef = jaspRCPP_getColumnType; @@ -174,14 +199,17 @@ void STDCALL jaspRCPP_init(const char* buildYear, const char* version, RBridgeCa static enDecodeFuncDef _encodeColumnName = jaspRCPP_encodeColumnName; static enDecodeFuncDef _decodeColumnName = jaspRCPP_decodeColumnName; + RInside &rInside = rinside->instance(); + rInside[".logString"] = Rcpp::XPtr( & _logFuncDef); rInside[".createColumn"] = Rcpp::XPtr( & _createColumnFuncDef); rInside[".deleteColumn"] = Rcpp::XPtr( & _deleteColumnFuncDef); rInside[".getColumnType"] = Rcpp::XPtr( & _getColumnTypeFuncDef); rInside[".getColumnExists"] = Rcpp::XPtr( & _getColumnExistsFuncDef); rInside[".getColumnAnalysisId"] = Rcpp::XPtr( & _getColumnAnIdFuncDef); - rInside[".sendToDesktopFunction"] = Rcpp::XPtr( & sendToDesktopFunction); - rInside[".pollMessagesFunction"] = Rcpp::XPtr( & pollMessagesFunction); + rInside[".sendToDesktopFunction"] = Rcpp::XPtr( & _sendToDesktop); + rInside[".pollMessagesFunction"] = Rcpp::XPtr( & _pollMessagesFunction); + rInside[".setColumnDataAsScalePtr"] = Rcpp::XPtr( & _setColumnDataAsScale); rInside[".setColumnDataAsOrdinalPtr"] = Rcpp::XPtr( & _setColumnDataAsOrdinal); rInside[".setColumnDataAsNominalPtr"] = Rcpp::XPtr( & _setColumnDataAsOrdinal); @@ -189,17 +217,6 @@ void STDCALL jaspRCPP_init(const char* buildYear, const char* version, RBridgeCa rInside[".shouldDecodeColName"] = Rcpp::XPtr(& _shouldDecodeColumnName); rInside[".encodeColName"] = Rcpp::XPtr( & _encodeColumnName); rInside[".decodeColName"] = Rcpp::XPtr( & _decodeColumnName); - rInside[".baseCitation"] = baseCitation; - rInside[".numDecimals"] = 3; - rInside[".fixedDecimals"] = false; - rInside[".normalizedNotation"] = true; - rInside[".exactPValues"] = false; - rInside[".resultFont"] = "Arial"; - rInside[".imageBackground"] = "transparent"; - rInside[".ppi"] = 300; - - - //jaspRCPP_parseEvalQNT("options(encoding = 'UTF-8')"); //Pass a whole bunch of pointers to jaspBase jaspRCPP_parseEvalQNT("jaspBase:::setColumnFuncs( .setColumnDataAsScalePtr, .setColumnDataAsOrdinalPtr, .setColumnDataAsNominalPtr, .getColumnType, .getColumnAnalysisId, .createColumn, .deleteColumn, .getColumnExists, .encodeColName, .decodeColName, .shouldEncodeColName, .shouldDecodeColName)"); @@ -208,21 +225,21 @@ void STDCALL jaspRCPP_init(const char* buildYear, const char* version, RBridgeCa jaspRCPP_parseEvalQNT("jaspBase:::setPollMessagesFunc( .pollMessagesFunction)"); jaspRCPP_parseEvalQNT("jaspBase:::setBaseCitation( .baseCitation)"); jaspRCPP_parseEvalQNT("jaspBase:::setInsideJasp()"); + jaspRCPP_parseEvalQNT("jaspBase:::registerFonts()"); //Load it jaspRCPP_logString("Initializing jaspBase.\n"); - jaspRCPP_parseEvalQNT("library(methods)"); jaspRCPP_parseEvalQNT("library(jaspBase)"); // if we have a separate engine for each module then we should move these kind of hacks to the .onAttach() of each module (instead of loading BayesFactor when Descriptives is requested). // jaspRCPP_logString("initEnvironment().\n"); // jaspRCPP_parseEvalQNT("initEnvironment()"); - _R_HOME = jaspRCPP_parseEvalStringReturn("R.home('')"); - jaspRCPP_logString("R_HOME is: " + _R_HOME + "\n"); - jaspRCPP_logString("initializeDoNotRemoveList().\n"); jaspRCPP_parseEvalQNT("jaspBase:::.initializeDoNotRemoveList()"); + + jaspRCPP_logString("Finished initializing jaspBase.\n"); + } void STDCALL jaspRCPP_junctionHelper(bool collectNotRestore, const char * modulesFolder, const char * linkFolder, const char * junctionsFilePath) @@ -232,10 +249,11 @@ void STDCALL jaspRCPP_junctionHelper(bool collectNotRestore, const char * module std::cout << "RInside created, now about to " << (collectNotRestore ? "collect" : "recreate") << " Modules junctions in renv-cache" << std::endl; - rinside->parseEvalQNT("source('Modules/symlinkTools.R')"); + rinside->parseEvalQNT("source('Modules/Tools/symlinkTools.R')"); rInside["modulesFolder"] = modulesFolder; rInside["symFolder"] = linkFolder; rInside["junctionsFilePath"] = junctionsFilePath; + rinside->parseEvalQNT(".libPaths( c( paste0( modulesFolder, 'Tools/junction_bootstrap_library' ) , .libPaths() ) )"); if(collectNotRestore) rinside->parseEvalQNT("collectAndStoreJunctions(modulesFolder)"); else rinside->parseEvalQNT("restoreModulesIfNeeded( modulesFolder, symFolder, junctionsFilePath)"); @@ -285,7 +303,8 @@ void STDCALL jaspRCPP_setFontAndPlotSettings(const char * resultFont, const int rInside[".imageBackground"] = imageBackground; rInside[".ppi"] = ppi; - jaspRCPP_parseEvalQNT("jaspBase:::registerFonts()"); + // sometimes jaspBase is not available + jaspRCPP_parseEvalQNT("try(jaspBase:::registerFonts())"); } const char* STDCALL jaspRCPP_runModuleCall(const char* name, const char* title, const char* moduleCall, const char* dataKey, const char* options, diff --git a/R-Interface/jasprcpp_interface.h b/R-Interface/jasprcpp_interface.h index d8004a8954..4d0e37713c 100644 --- a/R-Interface/jasprcpp_interface.h +++ b/R-Interface/jasprcpp_interface.h @@ -124,6 +124,7 @@ typedef size_t (*logWriteDef) (const void * buf, size_t len); // Calls from rbridge to jaspRCPP RBRIDGE_TO_JASP_INTERFACE void STDCALL jaspRCPP_init(const char* buildYear, const char* version, RBridgeCallBacks *calbacks, sendFuncDef sendToDesktopFunction, pollMessagesFuncDef pollMessagesFunction, logFlushDef logFlushFunction, logWriteDef logWriteFunction, systemDef systemFunc, libraryFixerDef libraryFixerFunc, const char* resultFont, const char * tempDir); +RBRIDGE_TO_JASP_INTERFACE void STDCALL jaspRCPP_init_jaspBase(); RBRIDGE_TO_JASP_INTERFACE void STDCALL jaspRCPP_setDecimalSettings(int numDecimals, bool fixedDecimals, bool normalizedNotation, bool exactPValues); RBRIDGE_TO_JASP_INTERFACE void STDCALL jaspRCPP_setFontAndPlotSettings(const char * resultFont, const int ppi, const char* imageBackground); RBRIDGE_TO_JASP_INTERFACE const char* STDCALL jaspRCPP_runModuleCall(const char* name, const char* title, const char* moduleCall, const char* dataKey, const char* options, const char* stateKey, int analysisID, int analysisRevision, bool developerMode); diff --git a/Tools/CMake/FindRPackagePath.cmake b/Tools/CMake/FindRPackagePath.cmake new file mode 100644 index 0000000000..a83c7e80f6 --- /dev/null +++ b/Tools/CMake/FindRPackagePath.cmake @@ -0,0 +1,22 @@ + +# Locate the full paths (so those in the cache, not the symlinks) + +#Argh +if("${CMAKE_PROJECT_NAME}" STREQUAL "R-Interface") + set(FIND_PACKAGE_PATH_SCRIPT ${CMAKE_SOURCE_DIR}/../Tools/find_package_path.R) +else() + + set(FIND_PACKAGE_PATH_SCRIPT ${CMAKE_SOURCE_DIR}/Tools/find_package_path.R) +endif() + +macro(find_package_path out libPath packageName) + #We are not using Rscript anywhere in CMake because that doesn't work on macOs + execute_process( + COMMAND ${R_EXECUTABLE} --slave --file=${FIND_PACKAGE_PATH_SCRIPT} ${libPath} ${packageName} + OUTPUT_VARIABLE TEMP_OUT + COMMAND_ECHO STDOUT) + #R could be printing all sorts of bullshit, so instead we simply take the last line of output + message(STATUS "TEMP_OUT is ${TEMP_OUT}") + string(REGEX MATCHALL "[^\n\r]+" TEMPLINES ${TEMP_OUT}) + list(GET TEMPLINES -1 ${out}) +endmacro() diff --git a/Tools/CMake/Install.cmake b/Tools/CMake/Install.cmake index 560ad3b551..be07380e7c 100644 --- a/Tools/CMake/Install.cmake +++ b/Tools/CMake/Install.cmake @@ -250,6 +250,11 @@ endif() install(FILES ${CMAKE_SOURCE_DIR}/Tools/flatpak/org.jaspstats.JASP.mime.xml DESTINATION ${JASP_INSTALL_PREFIX}/share/mime/packages) + + #clean up flatpak + if(FLATPAK_USED) + install(CODE "execute_process(COMMAND ${CMAKE_SOURCE_DIR}/Tools/flatpak/cleanFlatpak.sh WORKING_DIRECTORY ${CMAKE_BINARY_DIR})") + endif() endif() @@ -333,12 +338,12 @@ if(WIN32) configure_file(${CMAKE_SOURCE_DIR}/Tools/windows/CollectJunctions.cmd.in ${CMAKE_BINARY_DIR}/CollectJunctions.cmd @ONLY) - configure_file(${CMAKE_SOURCE_DIR}/Tools/windows/windowsPreInstallHacks.cmd.in - ${CMAKE_BINARY_DIR}/windowsPreInstallHacks.cmd @ONLY) - configure_file(${CMAKE_SOURCE_DIR}/Tools/windows/RecreateJunctions.cmd.in ${CMAKE_BINARY_DIR}/RecreateJunctions.cmd @ONLY) + configure_file(${CMAKE_SOURCE_DIR}/Tools/windows/RecursiveJunctionRemover.cmd.in + ${CMAKE_BINARY_DIR}/RecursiveJunctionRemover.cmd @ONLY) + #msix stuff configure_file(${CMAKE_SOURCE_DIR}/Tools/windows/msix/AppxManifest-store.xml.in ${CMAKE_BINARY_DIR}/AppxManifest-store.xml @ONLY) @@ -371,16 +376,10 @@ if(WIN32) install(FILES ${CMAKE_SOURCE_DIR}/Desktop/icon.ico DESTINATION .) - install( - DIRECTORY ${CMAKE_BINARY_DIR}/Modules/renv-cache - DESTINATION Modules/ - REGEX ${FILES_EXCLUDE_PATTERN} EXCLUDE - REGEX ${FOLDERS_EXCLUDE_PATTERN} EXCLUDE) - install( FILES ${CMAKE_SOURCE_DIR}/R-Interface/R/workarounds.R ${CMAKE_SOURCE_DIR}/R-Interface/R/symlinkTools.R - DESTINATION Modules/) + DESTINATION Modules/Tools/) install( FILES ${RTOOLS_LIBGCC_S_SEH_DLL} @@ -394,6 +393,19 @@ if(WIN32) ${_LIB_R_INTERFACE_DLL} DESTINATION .) + install( + DIRECTORY ${CMAKE_BINARY_DIR}/Modules/renv-cache + DESTINATION Modules/ + REGEX ${FILES_EXCLUDE_PATTERN} EXCLUDE + REGEX ${FOLDERS_EXCLUDE_PATTERN} EXCLUDE) + + install( + DIRECTORY ${CMAKE_BINARY_DIR}/Modules/Tools/ + DESTINATION Modules/Tools + REGEX ${FILES_EXCLUDE_PATTERN} EXCLUDE + REGEX ${FOLDERS_EXCLUDE_PATTERN} EXCLUDE) + + install(CODE "execute_process(COMMAND cmd.exe /C ${CMAKE_BINARY_DIR}/RecursiveJunctionRemover.cmd)") endif() list(POP_BACK CMAKE_MESSAGE_CONTEXT) diff --git a/Tools/CMake/JASP.cmake b/Tools/CMake/JASP.cmake index c1314b1be0..2b7a618c4b 100644 --- a/Tools/CMake/JASP.cmake +++ b/Tools/CMake/JASP.cmake @@ -72,6 +72,21 @@ set(MSIX_SIGN_CERT_PASSWORD "0000" CACHE STRING "Password selfsign cert for Nightlies") +set(R_PKG_CELLAR_PATH + "" + CACHE STRING "Set the path for an renv package cellar to be used during build phase") + +set(RPKG_DOWNLOAD_ONLY + OFF + CACHE BOOL "If enabled renv will not install JASP module deps but just download them. Usefull to make a cellar for Flatpak") + +set(REGENERATE_LOCKFILE + OFF + CACHE BOOL "If enabled jaspModuleInstaller will generate a fresh lockfile") + +set(MODULE_INSTALL_MODE + "localizeAll" + CACHE STRING "identicalToLockfile or localizeModuleOnly or localizeAll. Sets how much is pulled remote or from source folder") # TODO: # - [ ] Rename all JASP related variables to `JASP_*`. This way, @@ -84,8 +99,8 @@ if(NOT R_REPOSITORY) "http://cloud.r-project.org" CACHE STRING "The CRAN mirror used by 'renv' and 'install.packages'") endif() - if(FLATPAK_USED AND LINUX) + set(R_PKG_CELLAR_PATH "/app/lib64/cellar") set(R_REPOSITORY "file:///app/lib64/local-cran") endif() diff --git a/Tools/CMake/Libraries.cmake b/Tools/CMake/Libraries.cmake index cc4681a091..cda01d5524 100644 --- a/Tools/CMake/Libraries.cmake +++ b/Tools/CMake/Libraries.cmake @@ -181,7 +181,7 @@ if(LINUX) set(LIBREADSTAT_INCLUDE_DIRS /usr/local/include /usr/include) # The last two library paths handle the two most common multiarch cases. # Other multiarch-compliant paths may come up but should be rare. - set(LIBREADSTAT_LIBRARY_DIRS /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/aarch64-linux-gnu) + set(LIBREADSTAT_LIBRARY_DIRS /usr/local/lib /usr/lib /usr/lib64 /usr/lib/x86_64-linux-gnu /usr/lib/aarch64-linux-gnu) endif() message(CHECK_START "Looking for libreadstat.so") diff --git a/Tools/CMake/Modules.cmake b/Tools/CMake/Modules.cmake index 44dde24bce..e1559093e0 100644 --- a/Tools/CMake/Modules.cmake +++ b/Tools/CMake/Modules.cmake @@ -22,44 +22,44 @@ set(JASP_TEST_BUILD OFF CACHE BOOL "Do a quick build with just descriptive set(JASP_TEST_MODULE "jaspDescriptives" CACHE STRING "Which module other than jaspTestModule would you like to test?") if(NOT JASP_TEST_BUILD) - set(JASP_COMMON_MODULES - "jaspDescriptives" - "jaspTTests" - "jaspAnova" - "jaspMixedModels" - "jaspRegression" - "jaspFrequencies" - "jaspFactor" - ) - - set(JASP_EXTRA_MODULES - "jaspAcceptanceSampling" - "jaspAudit" - "jaspBain" - "jaspBsts" - "jaspCircular" - "jaspCochrane" - "jaspDistributions" - "jaspEquivalenceTTests" - "jaspJags" - "jaspLearnBayes" - "jaspLearnStats" - "jaspMachineLearning" - "jaspMetaAnalysis" - "jaspNetwork" - "jaspPower" - "jaspPredictiveAnalytics" - "jaspProcess" - "jaspProphet" - "jaspQualityControl" - "jaspReliability" - "jaspRobustTTests" - "jaspSem" - "jaspSurvival" - "jaspSummaryStatistics" - "jaspTimeSeries" - "jaspVisualModeling" - ) +set(JASP_COMMON_MODULES + "jaspDescriptives" + "jaspTTests" + "jaspAnova" + "jaspMixedModels" + "jaspRegression" + "jaspFrequencies" + "jaspFactor" +) + +set(JASP_EXTRA_MODULES + "jaspAcceptanceSampling" + "jaspAudit" + "jaspBain" + "jaspBsts" + "jaspCircular" + "jaspCochrane" + "jaspDistributions" + "jaspEquivalenceTTests" + "jaspJags" + "jaspLearnBayes" + "jaspLearnStats" + "jaspMachineLearning" + "jaspMetaAnalysis" + "jaspNetwork" + "jaspPower" + "jaspPredictiveAnalytics" + "jaspProcess" + "jaspProphet" + "jaspQualityControl" + "jaspReliability" + "jaspRobustTTests" + "jaspSem" + "jaspSurvival" + "jaspSummaryStatistics" + "jaspTimeSeries" + "jaspVisualModeling" + ) else() #it IS a test build message(STATUS "JASP_TEST_BUILD is enabled, building with minimal modules") set(JASP_COMMON_MODULES @@ -152,42 +152,36 @@ message(STATUS "Installing Required R Modules...") execute_process( WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/R-Interface COMMAND ${CMAKE_COMMAND} -E copy_if_different R/workarounds.R - ${MODULES_BINARY_PATH}/ + ${MODULES_BINARY_PATH}/Tools/ COMMAND ${CMAKE_COMMAND} -E copy_if_different R/symlinkTools.R - ${MODULES_BINARY_PATH}/) + ${MODULES_BINARY_PATH}/Tools/) add_custom_target( - jaspBase + jaspModuleInstaller WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/R-Interface - DEPENDS ${MODULES_BINARY_PATH}/jaspBase/jaspBaseHash.rds) - -configure_file("${PROJECT_SOURCE_DIR}/Modules/install-jaspBase.R.in" - ${SCRIPT_DIRECTORY}/install-jaspBase.R @ONLY) - -# I'm using a custom_command here to make sure that jaspBase is installed once -# and only once before everything else. So, `install-jaspBase.R` creates an empty -# file, i.e., `jaspBase-installed-successfully.log` and all other Modules look for -# it. If they find it, they proceed, if not, they trigger this custom command. -# TODO: -# - [ ] The following commands can be turned into a function or a macro, but -# for now, I would like to keep a granular control over differnt steps + DEPENDS ${JASPMODULEINSTALLER_LIBRARY}/jaspModuleInstaller) + +configure_file("${PROJECT_SOURCE_DIR}/Modules/install-jaspModuleInstaller.R.in" + ${SCRIPT_DIRECTORY}/install-jaspModuleInstaller.R @ONLY) + +# I'm using a custom_command here to make sure that jaspModuleInstaller is installed once if(APPLE) - add_dependencies(jaspBase JASPEngine) + add_dependencies(jaspModuleInstaller JASPEngine) add_custom_command( WORKING_DIRECTORY ${R_HOME_PATH} - OUTPUT ${MODULES_BINARY_PATH}/jaspBase/jaspBaseHash.rds - USES_TERMINAL - COMMAND ${CMAKE_COMMAND} -E env "JASP_R_HOME=${R_HOME_PATH}" ${R_EXECUTABLE} --slave --no-restore --no-save --file=${SCRIPT_DIRECTORY}/install-jaspBase.R - COMMENT "------ Installing 'jaspBase'") + OUTPUT ${JASPMODULEINSTALLER_LIBRARY}/jaspModuleInstaller + USES_TERMINAL + COMMAND ${CMAKE_COMMAND} -E env "JASP_R_HOME=${R_HOME_PATH}" ${R_EXECUTABLE} --slave --no-restore --no-save --file=${SCRIPT_DIRECTORY}/install-jaspModuleInstaller.R + COMMENT "------ Installing 'jaspModuleInstaller'") else() add_custom_command( WORKING_DIRECTORY ${R_HOME_PATH} - OUTPUT ${R_HOME_PATH}/jaspBase_md5sums.rds + OUTPUT ${JASPMODULEINSTALLER_LIBRARY}/jaspModuleInstaller USES_TERMINAL COMMAND ${R_EXECUTABLE} --slave --no-restore --no-save - --file=${SCRIPT_DIRECTORY}/install-jaspBase.R - COMMENT "------ Installing 'jaspBase'") + --file=${SCRIPT_DIRECTORY}/install-jaspModuleInstaller.R + COMMENT "------ Installing 'jaspModuleInstaller'") endif() @@ -221,7 +215,7 @@ if(APPLE) ${MODULE} USES_TERMINAL WORKING_DIRECTORY ${R_HOME_PATH} - DEPENDS ${MODULES_BINARY_PATH}/jaspBase/jaspBaseHash.rds + DEPENDS ${JASPMODULEINSTALLER_LIBRARY}/jaspModuleInstaller COMMAND ${CMAKE_COMMAND} -E env "JASP_R_HOME=${R_HOME_PATH}" ${R_EXECUTABLE} --slave --no-restore --no-save --file=${SCRIPT_DIRECTORY}/install-${MODULE}.R # COMMAND # ${CMAKE_COMMAND} -D PATH=${MODULES_BINARY_PATH}/${MODULE} -D @@ -239,7 +233,7 @@ else() ${MODULE} USES_TERMINAL WORKING_DIRECTORY ${R_HOME_PATH} - DEPENDS ${R_HOME_PATH}/jaspBase_md5sums.rds + DEPENDS ${JASPMODULEINSTALLER_LIBRARY}/jaspModuleInstaller COMMAND ${R_EXECUTABLE} --slave --no-restore --no-save --file=${SCRIPT_DIRECTORY}/install-${MODULE}.R BYPRODUCTS ${MODULES_BINARY_PATH}/${MODULE} @@ -273,9 +267,7 @@ if(APPLE) ${MODULE} USES_TERMINAL WORKING_DIRECTORY ${R_HOME_PATH} - DEPENDS - JASPEngine - ${MODULES_BINARY_PATH}/jaspBase/jaspBaseHash.rds + DEPENDS JASPEngine ${JASPMODULEINSTALLER_LIBRARY}/jaspModuleInstaller $<$:${jags_VERSION_H_PATH}> $<$:${jags_VERSION_H_PATH}> COMMAND ${CMAKE_COMMAND} -E env "JASP_R_HOME=${R_HOME_PATH}" ${R_EXECUTABLE} --slave --no-restore --no-save --file=${SCRIPT_DIRECTORY}/install-${MODULE}.R @@ -293,10 +285,7 @@ else() ${MODULE} USES_TERMINAL WORKING_DIRECTORY ${R_HOME_PATH} - DEPENDS - ${R_HOME_PATH}/jaspBase_md5sums.rds - $<$:${jags_VERSION_H_PATH}> - $<$:${jags_VERSION_H_PATH}> + DEPENDS ${JASPMODULEINSTALLER_LIBRARY}/jaspModuleInstaller $<$:${jags_VERSION_H_PATH}> $<$:${jags_VERSION_H_PATH}> COMMAND ${R_EXECUTABLE} --slave --no-restore --no-save --file=${SCRIPT_DIRECTORY}/install-${MODULE}.R diff --git a/Tools/CMake/Pack.cmake b/Tools/CMake/Pack.cmake index ca22e7b5e2..7d6cf2ef8e 100644 --- a/Tools/CMake/Pack.cmake +++ b/Tools/CMake/Pack.cmake @@ -58,12 +58,6 @@ if(WIN32) configure_file(${CMAKE_SOURCE_DIR}/Tools/windows/Upload.cmd.in ${CMAKE_BINARY_DIR}/Upload.cmd @ONLY) - add_custom_target( - windowsPreInstallHacks - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} - COMMAND cmd.exe /C windowsPreInstallHacks.cmd - ) - add_custom_target( collect-junctions WORKING_DIRECTORY ${PROJECT_BINARY_DIR} diff --git a/Tools/CMake/Patch.cmake b/Tools/CMake/Patch.cmake index 4b21f15165..7c72700c95 100644 --- a/Tools/CMake/Patch.cmake +++ b/Tools/CMake/Patch.cmake @@ -42,7 +42,7 @@ else() file( GLOB_RECURSE LIBRARIES - #FOLLOW_SYMLINKS #Turned this off because it got infinitely regressed + FOLLOW_SYMLINKS #Don turned this off because it got infinitely regressed, but Joris turned it back on because we use symlinks to go to packages nowadays... "${PATH}/*.so" "${PATH}/*.dylib") list( @@ -69,6 +69,9 @@ else() ${LIBRARIES} ${BINARIES}) + + message(STATUS "* Patching got files: ${Files}") + set(NEW_ID "") set(FRAMEWORK_RESOURCES "@executable_path/../Frameworks/R.framework/Versions/${R_DIR_NAME}/Resources") @@ -77,6 +80,9 @@ else() get_filename_component(FILE_NAME ${FILE} NAME) get_filename_component(DIRECTORY_NAME ${FILE} DIRECTORY) + message(STATUS "** Patching in Dir '$DIRECTORY' the file '${FILE}'") + + string(LENGTH "${PATH}/" PATH_LENGTH) string( SUBSTRING "${FILE}" diff --git a/Tools/CMake/R.cmake b/Tools/CMake/R.cmake index a010425788..0df6f7c3d9 100644 --- a/Tools/CMake/R.cmake +++ b/Tools/CMake/R.cmake @@ -16,15 +16,15 @@ # on x86_64, it is using the Fortran 8. # # Notes: -# - Be aware that at some point, R will move to use a different Fortran, and +# - Be aware that at some point, R will move to use a different Fortran, and # when that happens, someone needs to make sure that the right Fortran is being -# download, unpacked, and placed in the right location. You can find the +# download, unpacked, and placed in the right location. You can find the # appropriate version in `etc/Makeconf` and the binary here, # https://github.com/fxcoudert/gfortran-for-macOS/releases # - On GitHub Action, # - You probably want to unpack the `https://static.jasp-stats.org/development/gfortran-8.2-Mojave.dmg` # into a `.tar.gz`. I think this might elimite some possible issues with the unpacking on -# their environment. If you have decided to do this, make sure that the structure of the +# their environment. If you have decided to do this, make sure that the structure of the # archive is similiar and things land where they are expected. # # Todos: @@ -203,18 +203,17 @@ cmake_print_variables(MODULES_RENV_CACHE_PATH) if(APPLE) - set(R_FRAMEWORK_PATH "${CMAKE_BINARY_DIR}/Frameworks") - set(R_HOME_PATH - "${R_FRAMEWORK_PATH}/R.framework/Versions/${R_DIR_NAME}/Resources") - set(R_LIBRARY_PATH "${R_HOME_PATH}/library") - set(R_OPT_PATH "${R_HOME_PATH}/opt") - set(R_EXECUTABLE "${R_HOME_PATH}/bin/R") - set(R_INCLUDE_PATH "${R_HOME_PATH}/include") - set(RCPP_PATH "${R_LIBRARY_PATH}/Rcpp") - set(RINSIDE_PATH "${R_LIBRARY_PATH}/RInside") - set(RENV_PATH "${R_LIBRARY_PATH}/renv") - set(ENV{JASP_R_HOME} ${R_HOME_PATH}) - set(ENV{R_HOME} ${R_HOME_PATH}) + set(R_FRAMEWORK_PATH "${CMAKE_BINARY_DIR}/Frameworks") + set(R_HOME_PATH "${R_FRAMEWORK_PATH}/R.framework/Versions/${R_DIR_NAME}/Resources") + set(R_LIBRARY_PATH "${R_HOME_PATH}/library") + set(R_OPT_PATH "${R_HOME_PATH}/opt") + set(R_EXECUTABLE "${R_HOME_PATH}/bin/R") + set(R_INCLUDE_PATH "${R_HOME_PATH}/include") + set(RCPP_PATH "${R_LIBRARY_PATH}/Rcpp") + set(RINSIDE_PATH "${R_LIBRARY_PATH}/RInside") + set(RENV_PATH "${R_LIBRARY_PATH}/renv") + set(ENV{JASP_R_HOME} ${R_HOME_PATH}) + #set(ENV{R_HOME} ${R_HOME_PATH}) #enabling this breaks the output from R because it will add a warning about: `WARNING: ignoring environment value of R_HOME` cmake_print_variables(R_FRAMEWORK_PATH) cmake_print_variables(R_HOME_PATH) @@ -495,7 +494,7 @@ if(APPLE) message(CHECK_START "Patching /bin/exec/R") execute_process( #COMMAND_ECHO STDOUT - #ERROR_QUIET + #ERROR_QUIET OUTPUT_QUIET WORKING_DIRECTORY ${R_HOME_PATH} COMMAND @@ -511,14 +510,14 @@ if(APPLE) set(SIGNING_RESULT "timeout") while((${SIGNING_RESULT} MATCHES "timeout") OR (${SIGNING_RESULT} STREQUAL "1")) execute_process( - COMMAND_ECHO STDOUT + #COMMAND_ECHO STDOUT #ERROR_QUIET - #OUTPUT_QUIET + OUTPUT_QUIET TIMEOUT 30 WORKING_DIRECTORY ${R_HOME_PATH} COMMAND codesign --force --verbose --deep ${CODESIGN_TIMESTAMP_FLAG} --sign - ${APPLE_CODESIGN_IDENTITY} ${OPTIONS_RUNTIME} + ${APPLE_CODESIGN_IDENTITY} ${OPTIONS_RUNTIME} "${R_HOME_PATH}/bin/exec/R" RESULT_VARIABLE SIGNING_RESULT OUTPUT_VARIABLE SIGNING_OUTPUT @@ -546,6 +545,23 @@ if(APPLE) endif() + message(CHECK_START "Locating the 'gfortran'") + + find_program( + FORTRAN_EXECUTABLE + NAMES gfortran + PATHS ${GFORTRAN_PATH} + NO_DEFAULT_PATH + DOC "'gfortran' is needed for building some of the R packages") + + if(NOT FORTRAN_EXECUTABLE) + message(CHECK_FAIL "not found") + message(FATAL_ERROR "Please install 'gfortran' before continuing.") + else() + message(CHECK_PASS "found") + message(STATUS "FORTRAN_EXECUTABLE=${FORTRAN_EXECUTABLE}") + endif() + endif() # @@ -601,109 +617,15 @@ if(APPLE) message(CHECK_FAIL "not found in ${R_HOME_PATH}/lib") endif() - if(NOT EXISTS ${RINSIDE_PATH}) - message(STATUS "RInside is not installed!") - - message(CHECK_START "Installing the 'RInside' and 'Rcpp'") - - configure_file(${MODULES_SOURCE_PATH}/install-RInside.R.in - ${SCRIPT_DIRECTORY}/install-RInside.R @ONLY) - - execute_process( - COMMAND_ECHO STDOUT - #ERROR_QUIET OUTPUT_QUIET - WORKING_DIRECTORY ${R_HOME_PATH} - COMMAND ${R_EXECUTABLE} --slave --no-restore --no-save - --file=${SCRIPT_DIRECTORY}/install-RInside.R) - - if(NOT EXISTS ${R_LIBRARY_PATH}/RInside) - message(CHECK_FAIL "unsuccessful.") - message(FATAL_ERROR "'RInside' installation has failed!") - endif() - - message(CHECK_PASS "successful.") - - # Patching RInside and RCpp - message(CHECK_START "Patching Frameworks/.../library") - execute_process( - #COMMAND_ECHO STDOUT - #ERROR_QUIET - OUTPUT_QUIET - WORKING_DIRECTORY ${R_HOME_PATH} - COMMAND - ${CMAKE_COMMAND} -D - NAME_TOOL_PREFIX_PATCHER=${PROJECT_SOURCE_DIR}/Tools/macOS/install_name_prefix_tool.sh - -D PATH=${R_HOME_PATH}/library -D R_HOME_PATH=${R_HOME_PATH} - -D R_DIR_NAME=${R_DIR_NAME} -D SIGNING_IDENTITY=${APPLE_CODESIGN_IDENTITY} - -D SIGNING=1 -D CODESIGN_TIMESTAMP_FLAG=${CODESIGN_TIMESTAMP_FLAG} -P - ${PROJECT_SOURCE_DIR}/Tools/CMake/Patch.cmake) - - endif() - - if(NOT EXISTS ${RENV_PATH}) - message(STATUS "renv is not installed!") - message(CHECK_START "Installing 'renv'") - - configure_file(${MODULES_SOURCE_PATH}/install-renv.R.in - ${SCRIPT_DIRECTORY}/install-renv.R @ONLY) - - set(ENV{JASP_R_HOME} ${R_HOME_PATH}) - - execute_process( - COMMAND_ECHO STDERR - #ERROR_QUIET OUTPUT_QUIET - WORKING_DIRECTORY ${R_HOME_PATH} - COMMAND ${R_EXECUTABLE} --slave --no-restore --no-save --file=${SCRIPT_DIRECTORY}/install-renv.R) - - if(NOT EXISTS ${R_LIBRARY_PATH}/renv) - message(CHECK_FAIL "unsuccessful.") - message(FATAL_ERROR "'renv' installation has failed!") - endif() - - message(CHECK_PASS "successful.") - - message(CHECK_START "Patching Frameworks/.../library") - execute_process( - #COMMAND_ECHO STDOUT - #ERROR_QUIET - OUTPUT_QUIET - WORKING_DIRECTORY ${R_HOME_PATH} - COMMAND - ${CMAKE_COMMAND} -D - NAME_TOOL_PREFIX_PATCHER=${PROJECT_SOURCE_DIR}/Tools/macOS/install_name_prefix_tool.sh - -D PATH=${R_HOME_PATH}/library -D R_HOME_PATH=${R_HOME_PATH} - -D R_DIR_NAME=${R_DIR_NAME} -D SIGNING_IDENTITY=${APPLE_CODESIGN_IDENTITY} - -D SIGNING=1 -D CODESIGN_TIMESTAMP_FLAG=${CODESIGN_TIMESTAMP_FLAG} -P - ${PROJECT_SOURCE_DIR}/Tools/CMake/Patch.cmake) - endif() - - message(CHECK_START "Checking for 'libRInside'") - find_library( - _LIB_RINSIDE - NAMES RInside - PATHS ${RINSIDE_PATH}/lib - NO_DEFAULT_PATH NO_CACHE REQUIRED) - - if(_LIB_RINSIDE) - message(CHECK_PASS "found.") - message(STATUS " ${_LIB_RINSIDE}") - else() - message(CHECK_FAIL "not found in ${RINSIDE_PATH}/lib") - endif() - elseif(WIN32) - set(R_HOME_PATH "${CMAKE_BINARY_DIR}/R") - set(R_BIN_PATH "${R_HOME_PATH}/bin") - set(R_LIB_PATH "${R_HOME_PATH}/bin/${R_DIR_NAME}") - set(R_LIBRARY_PATH "${R_HOME_PATH}/library") - set(R_OPT_PATH "${R_HOME_PATH}/opt") - set(R_EXECUTABLE "${R_HOME_PATH}/bin/R") - set(R_INCLUDE_PATH "${R_HOME_PATH}/include") - set(RCPP_PATH "${R_LIBRARY_PATH}/Rcpp") - set(RINSIDE_PATH "${R_LIBRARY_PATH}/RInside") - set(RENV_PATH "${R_LIBRARY_PATH}/renv") - + set(R_HOME_PATH "${CMAKE_BINARY_DIR}/R") + set(R_BIN_PATH "${R_HOME_PATH}/bin") + set(R_LIB_PATH "${R_HOME_PATH}/bin/${R_DIR_NAME}") + set(R_LIBRARY_PATH "${R_HOME_PATH}/library") + set(R_OPT_PATH "${R_HOME_PATH}/opt") + set(R_EXECUTABLE "${R_HOME_PATH}/bin/R") + set(R_INCLUDE_PATH "${R_HOME_PATH}/include") # This will be added to the install.packages calls set(USE_LOCAL_R_LIBS_PATH ", lib='${R_LIBRARY_PATH}'") @@ -714,10 +636,6 @@ elseif(WIN32) cmake_print_variables(R_OPT_PATH) cmake_print_variables(R_EXECUTABLE) - cmake_print_variables(RCPP_PATH) - cmake_print_variables(RINSIDE_PATH) - cmake_print_variables(RENV_PATH) - message(CHECK_START "Checking for R/") if(NOT EXISTS ${CMAKE_BINARY_DIR}/R) @@ -788,52 +706,6 @@ elseif(WIN32) endif() - if(NOT EXISTS ${RENV_PATH}) - message(STATUS "renv is not installed!") - message(CHECK_START "Installing 'renv'") - - configure_file(${MODULES_SOURCE_PATH}/install-renv.R.in - ${SCRIPT_DIRECTORY}/install-renv.R @ONLY) - - execute_process( - COMMAND_ECHO STDOUT - #ERROR_QUIET OUTPUT_QUIET - WORKING_DIRECTORY ${R_HOME_PATH} - COMMAND ${R_EXECUTABLE} --slave --no-restore --no-save - --file=${SCRIPT_DIRECTORY}/install-renv.R) - - if(NOT EXISTS ${R_LIBRARY_PATH}/renv) - message(CHECK_FAIL "unsuccessful.") - message(FATAL_ERROR "'renv' installation has failed!") - endif() - - message(CHECK_PASS "successful.") - endif() - - if(NOT EXISTS ${RINSIDE_PATH}) - message(STATUS "RInside is not installed!") - - message(CHECK_START "Installing the 'RInside' and 'Rcpp'") - - configure_file(${MODULES_SOURCE_PATH}/install-RInside.R.in - ${SCRIPT_DIRECTORY}/install-RInside.R @ONLY) - - execute_process( - COMMAND_ECHO STDOUT - #ERROR_QUIET OUTPUT_QUIET - WORKING_DIRECTORY ${R_BIN_PATH} - COMMAND ${R_EXECUTABLE} --slave --no-restore --no-save - --file=${SCRIPT_DIRECTORY}/install-RInside.R) - - if(NOT EXISTS ${R_LIBRARY_PATH}/RInside) - message(CHECK_FAIL "unsuccessful.") - message(FATAL_ERROR "'RInside' installation has failed!") - endif() - - message(CHECK_PASS "successful.") - - endif() - elseif(LINUX) message(CHECK_START "Looking for R") @@ -901,16 +773,12 @@ elseif(LINUX) endif() set(R_EXECUTABLE "${R_HOME_PATH}/bin/R") - set(RSCRIPT_EXECUTABLE "${R_HOME_PATH}/bin/Rscript") - set(RCPP_PATH "${R_LIBRARY_PATH}/Rcpp") - set(RINSIDE_PATH "${R_LIBRARY_PATH}/RInside") - set(RENV_PATH "${R_LIBRARY_PATH}/renv") set(USE_LOCAL_R_LIBS_PATH ", lib='${R_LIBRARY_PATH}'") message(CHECK_START "Looking for R.h") # ask R where it thinks it's include folder is - execute_process(COMMAND ${RSCRIPT_EXECUTABLE} -e "cat(R.home(\"include\"))" OUTPUT_VARIABLE R_INCLUDE_PATH) + execute_process(COMMAND command -E env "JASP_R_HOME=${R_HOME_PATH}" ${R_EXECUTABLE} --slave --no-restore --no-save -e "cat(R.home(\"include\"))" OUTPUT_VARIABLE R_INCLUDE_PATH) # if R returns a nonexisting directory, try some fallback locations if(NOT EXISTS ${R_INCLUDE_PATH}) message(STATUS "R return an invalid include directory, trying fallbacks") @@ -953,50 +821,71 @@ elseif(LINUX) message(CHECK_FAIL "not found in ${R_HOME_PATH}/lib") endif() - if(NOT EXISTS ${RENV_PATH}) - message(STATUS "renv is not installed!") - message(CHECK_START "Installing 'renv'") +endif() - configure_file(${MODULES_SOURCE_PATH}/install-renv.R.in - ${SCRIPT_DIRECTORY}/install-renv.R @ONLY) +set(RENV_LIBRARY "${CMAKE_BINARY_DIR}/_cache/R/renv_library") +set(R_CPP_INCLUDES_LIBRARY "${CMAKE_BINARY_DIR}/Modules/Tools/R_cpp_includes_library") +set(JASPMODULEINSTALLER_LIBRARY "${CMAKE_BINARY_DIR}/Modules/Tools/jaspModuleInstaller_library") +set(PKGDEPENDS_LIBRARY "${CMAKE_BINARY_DIR}/Modules/Tools/pkgdepends_library") +set(JUNCTION_HANDLING_LIBRARY "${CMAKE_BINARY_DIR}/Modules/Tools/junction_bootstrap_library") - execute_process( - COMMAND_ECHO STDOUT - #ERROR_QUIET OUTPUT_QUIET - WORKING_DIRECTORY ${R_HOME_PATH} - COMMAND ${R_EXECUTABLE} --slave --no-restore --no-save - --file=${SCRIPT_DIRECTORY}/install-renv.R) +SET(RENV_SANDBOX "${CMAKE_BINARY_DIR}/_cache/R/renv_sandbox") +file(MAKE_DIRECTORY ${RENV_SANDBOX}) +# TODO: it could be nice to ship the sandbox so it can be used to install dynamic modules +# also, the sandbox paths may need to be adjusted on windows (they are symlinks) - if(NOT EXISTS ${R_LIBRARY_PATH}/renv) - message(CHECK_FAIL "unsuccessful.") - message(FATAL_ERROR "'renv' installation has failed!") - endif() +message(STATUS "Setting up renv, Rcpp, RInside, and jaspModuleInstaller") +message(STATUS "RENV_LIBRARY = ${RENV_LIBRARY}") +message(STATUS "R_CPP_INCLUDES_LIBRARY = ${R_CPP_INCLUDES_LIBRARY}") - message(CHECK_PASS "successful.") - endif() +configure_file(${PROJECT_SOURCE_DIR}/Modules/setup_renv_rcpp_rinside.R.in + ${SCRIPT_DIRECTORY}/setup_renv_rcpp_rinside.R @ONLY) - if(NOT EXISTS ${RINSIDE_PATH}) - message(STATUS "RInside is not installed!") +execute_process( + COMMAND_ECHO STDOUT + #ERROR_QUIET OUTPUT_QUIET + WORKING_DIRECTORY ${R_HOME_PATH} + COMMAND ${R_EXECUTABLE} --slave --no-restore --no-save --file=${SCRIPT_DIRECTORY}/setup_renv_rcpp_rinside.R) - message(CHECK_START "Installing the 'RInside' and 'Rcpp'") +if(APPLE) + # Patch RInside and RCpp + message(CHECK_START "Patching ${R_CPP_INCLUDES_LIBRARY}") + execute_process( + COMMAND_ECHO STDOUT + #ERROR_QUIET OUTPUT_QUIET + WORKING_DIRECTORY ${R_HOME_PATH} + COMMAND + ${CMAKE_COMMAND} -D + NAME_TOOL_PREFIX_PATCHER=${PROJECT_SOURCE_DIR}/Tools/macOS/install_name_prefix_tool.sh + -D PATH=${R_CPP_INCLUDES_LIBRARY} -D R_HOME_PATH=${R_HOME_PATH} -D + R_DIR_NAME=${R_DIR_NAME} -D SIGNING_IDENTITY=${APPLE_CODESIGN_IDENTITY} + -D SIGNING=1 -D CODESIGN_TIMESTAMP_FLAG=${CODESIGN_TIMESTAMP_FLAG} -P + ${PROJECT_SOURCE_DIR}/Tools/CMake/Patch.cmake + ) +endif() - configure_file(${MODULES_SOURCE_PATH}/install-RInside.R.in - ${SCRIPT_DIRECTORY}/install-RInside.R @ONLY) +include(FindRPackagePath) - execute_process( - COMMAND_ECHO STDOUT - COMMAND ${R_EXECUTABLE} --slave --no-restore --no-save - --file=${SCRIPT_DIRECTORY}/install-RInside.R) +find_package_path(RCPP_PATH ${R_CPP_INCLUDES_LIBRARY} "Rcpp") +find_package_path(RINSIDE_PATH ${R_CPP_INCLUDES_LIBRARY} "RInside") - if(NOT EXISTS ${R_LIBRARY_PATH}/RInside) - message(CHECK_FAIL "unsuccessful.") - message(FATAL_ERROR "'RInside' installation has failed!") - endif() +set(RENV_PATH "${RENV_LIBRARY}/renv") - message(CHECK_PASS "successful.") +message(STATUS "RENV_PATH = ${RENV_PATH}") +message(STATUS "RCPP_PATH = ${RCPP_PATH}") +message(STATUS "RINSIDE_PATH = ${RINSIDE_PATH}") - endif() +# if(NOT EXISTS ${RENV_PATH}) +# message(FATAL_ERROR "'renv' installation has failed!") +# endif() +if(NOT EXISTS ${RCPP_PATH}) + message(FATAL_ERROR "'Rcpp' installation has failed!") +endif() +if(NOT EXISTS ${RINSIDE_PATH}) + message(FATAL_ERROR "'RInside' installation has failed!") +endif() +if(APPLE OR LINUX) message(CHECK_START "Checking for 'libRInside'") find_library( _LIB_RINSIDE @@ -1010,7 +899,6 @@ elseif(LINUX) else() message(CHECK_FAIL "not found in ${RINSIDE_PATH}/lib") endif() - endif() list(POP_BACK CMAKE_MESSAGE_CONTEXT) diff --git a/Tools/find_package_path.R b/Tools/find_package_path.R new file mode 100755 index 0000000000..4dbe38a3d6 --- /dev/null +++ b/Tools/find_package_path.R @@ -0,0 +1,29 @@ +args <- commandArgs() +#print(args) + +pkgName <- args[[ length(args) ]] +pkgLib <- args[[ length(args) - 1 ]] +#print(pkgName) +#print(pkgLib) +# usage + +# R --file=renv_new_idea_find_package_path.R --args library packagename [subdir 1] [subdir 2] ... + +# throws if the package or directory does not exist. + + +# R-4.3.1 --file=renv_new_idea_find_package_path.R --args /home/don/R/x86_64-pc-linux-gnu-library/4.2 Rcpp +# R-4.3.1 --file=renv_new_idea_find_package_path.R --args /home/don/R/x86_64-pc-linux-gnu-library/4.2 Rcpp include +# args <- c( +# "/home/don/R/x86_64-pc-linux-gnu-library/4.2", +# "Rcpp" +# ) +result <- find.package(package = pkgName, lib.loc = pkgLib) + +#if (length(args) > 2L) +# result <- do.call(file.path, c(result, as.list(args[3:length(args)]))) + +if (!(dir.exists(result) || file.exists(result))) + stop("target file/ directory does not exist!") + +cat(normalizePath(result)) diff --git a/Tools/flatpak/JASP-screenshot-0.png b/Tools/flatpak/JASP-screenshot-0.png deleted file mode 100644 index d5a7e7d0f1ce744cbc64a1b53d6af63d24775b89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237640 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

Giaihgp=s>OcB2sgQ zmtVq!S~u)d>CficDSu)UCsPVmCF;^b}sftll2Rts;03#Ih(0mB3C?y zC=!L#-`R|B9g4J_cmlQNj7{P(5OzuOIpe0I4O<6)mOr9K^w=~Zzh77QmZ&^zp4!MM zIMJfo_oH+r3gx%8;a<#%SB*Kboo@rq`0T};O)w-M-__U7#g@pp+^LGM-jJV2b^*lp za-+9xpTiR3oXDzin+OZp&Xvo3UvOslP$0X0MK~aL)(0CN8>4bIuxH$Q%-b9ryE@Sb zDKC%uJ1wk%VW~zee7Eo5+KBp5=Vp3U^gSQ^(!94Ymqjve$Y>RVFsVCyerWbU1j^dp zw=2n+5uzScedot!yM->zX5$ZEIP5kLS|;D%>!k1G5fnaHlzzV3Z__Blom$uH?ra;|tDx7&|w2vc)k-q3f!qD!Sb2T5B zd}`8H)_jJVmIQYa5Qg+E*!>*k$Gh$Rny=NdW@NWy;H>G5^QUAD`?Uye+$VJ?33FRA zmPztuI}{MAeapX&nSL;SpEzsz8$HT-`Qz0G4n|LZN(N|%8n5SDbR#EC*FJ+@e=gC} zcA{EWZb7knyu~(d;jR5V>4ZMloWwLdS#BsD4kIS*%&F=7K`Qh5rdbKq;R?j11%ORFYaB!llYRXCAv_grD9_n>8t`JL zK{yza9t*TK31+lUW}6&_QkD%!4B#WVnT-=q*!aK?h`)ms7sg_7Sc=|!WRl;Cuo|2? z8+g1hF`4}y+7j!Pc;w=oBo+X?lna-r>`(y{NM?dA))%6Iv-$Hj9OqAFrfs5LRi)5)}GSnrRiZ;o~2Pu>|=V}pobso}9bi6=JI7q-H zpFGf@&kEjIGTPn|TdnF1V%;oFS6pe%mTgLz%~P9ZE;Hu4IrZ<+-*=kQ(i6Y)t)0No zBhEYG=d^!BN^z*6j+#l48+9B?6a=qD#EXn1&#NW9Eq2BidY!P_*yl>1XA{O%v}XKW zr6pfHYMXB*9`+4SK=otE??dvc)6O`gPl6)sM@Sw|3fU=?W%x3V(YbvM1-_Rx%lMfSjV2pgE?%&X{IP9dN{v2pBk5{Ntde8R}jUOFD&ox z`JA=LC?fv#h@k1ytu?!b+2?&dcw_Ox80el={HONT|nkRYI#H;`f+56Zak5DD73OBGS@yIcd$@ z{-~d&XQ798(#dx&E}AVr9Kb}Sg}?e$*D?Fj)ic(7<*}=|tWq@dsB( zyB`!M+?qR8=jd2>q{de^FF|U)70tA^*ZZl;WF0GTpUseGL&x=3-PQnN#uH(+0>Kzw zimaKADN)EWPZk8p*azMwboEsZm>^-7@^ZI}Q|G7_N7zq?Ig>bcgR08t-$4*<<`ckoZ9^x3R`O*DBzaD4c<0@+v3Yer zZ^Lxn|EnJL)>7M3+*Qp&rzFcH0g>vbtq)CyR)<)AhJ+E)JE=VM+ef^={rC=ttNr%` z)!+s7(myo>OP9pOW!S<)5jDoYaxFeNXdg`UrkbLw&xNpCp}6EKyZxN(SLej&Xs5!c zBI&VW;t!Y!BN8kwW$sZ5PG;cUVs%E}V79UK3HfFIPE;X|{cXr$q19D=NqVV2IrS}F z`;|A#ovxr??L0DRDbLR`jYt|tMu}7&7WGeRT}~+KF)gtOs}ZL75pdTqNB_$}{| z_)(D3e7#Dheh_Fo&J1d0gIxypA zH!7gzMlR-z#Zb;8m+m|m7-R9ibiVxq+tAt&!pxI~HuspD71Vsw=zCP@7w&T5_uPd_ zU*L1HdJ3!MsS^BTJ|5Mt*Yj&nu?B9|_%qbwpJ?Tb*O{4~$7^o>Lgi7_Ldu(Tx8c62 zsQOW*inrotPoKzyAmT@geI7U`SJ+y)e^?##E75lvT|KOvn1^G;@Q^|DCljLnSF@?A zGh_JdRHvr?^m6m*D=lQ3mIz1Qo5H$JePY5I+D`m!+;iS)h!F75 zo%qq*ZB|J1re%bxy}!&I!-v0T zKU&DvII%{bdeiXY&2(kEH2JNR!mV;Mt-Z58Zj$oaV6&wB;PSyTotw|e@^^rClSE5? zAR1ZuM&XZPd>Nlf>Djv=8e}5no?hkhcUbULtX|!bn4v~)j+V>^X*;s}^Ff>TkRNTg zR#fd~?&{(*@6HOx^y)H+UprGCnn?67p(xzgn$RK}G3z#~5K`TaNO>Bx`!v;fKdE&{ ztU)x{>*ly>);M9Qvb|&A`BBhIgT*Y1F{c@*Jew6o$Pp$bVs9Ede4Ngft1emC7$Gvn#H$#Gy) zY!kKvV@s!7J1~)oL|Cb}yB@aYDWc3C?RSL!F)5CqGTC~$dTPsb|LKJB)0ldyQ{OwW zTi<~uQ=?M?-c+HAr?r^3vV#g)V<>E0##SuNv{^EV^{olH?^%Mo({&O}b+qzvLj`eY zVK0B>eX#CY=fR&H<8z_xlydM`V{syI;7nZm>rb=dAf2xE$HjIOMbN8Xlr6>3*`wv_ zi1sNFXR7gcT;=YMSHC}BRj@p*5%s0Ts|=4!>?CBINve|WtGgQvpfeu3@^?&h#94fr z|Ed}Ly0tj$*?iK2)}FHzXEq;tznhED@^#iEbH)Y3o7T?YJhRfP&W>+NUkG33{lB$) zZsJ4hP-LS1I+IaqYU;TBi-gr5v++b&wzBO;*=)^J4DFHH5*3n-m<;#RroGwvbOI&} zc_>m$galZE8@BgTOq)z09_+vqV0KnyXIDkNhWRDu-*?hyp*kgp5m|(e{8s8Ec&9oD zm5UFL>tmLo?|m0*2|Ss-2djOFbOdC4{>UvXW_u^1iUFzOFZN)2W+4&IT5kU4PcjVV z=@RUiq}kb=kmI|(M?VZ9H~dIMYZErEND(PijsApTAP%gHU4_E?kMHzZOwkDJrj{6+ zn&e3azNL`%!m4BL^&yw82PuQaoEV{|iYkQk%7XZW#7r)7akFxms(oefPm&cWb-r{I zY)}bkPq`XABCDI{>$Sr1f=*+uyQ5=4VyQx0FU2W_=#bi-vex7hUzt6c`6347izemx zwy6jeZr;{`C$*++CHqB>??Eq1oh~N4J~B2~3g^_PgZIL5~fi zDL^$aFd#YWibIVJgGUV0YWv+X8C?@g~*vSRV0EUAqZqOZSBo3Y5utXCl{cSQe1Kb{FsNo`2=J{;?^?vn4^oM zQKttYRzvlnnqwop%%LQ%oSLpKV&%%Iy;Zt&PmvR+#t*lD(|6cw^pWN|6lD@(JYw=_ zkbXrpNS+k67jymE)DY)uglMgbpi%Dn=!i({efaw*CnnS;CMX0-5v5-$!EtK})0l3o zwBO&09MnSl51bBe)fC-|Ym=yA)m^)$z_h}xtvSS+54aDClnrsR1 zbg4q%L}Jk+5WH-uin2*@ zU`j5+{Fz)ZsC##!yYK+>T`!f2d(-qstP7lYW)wRr5kF1}47vB`Fue!#l5>asdyU1v zD@=uP;UIIFODEuHI}w>+{iVd<1``zPVk*gnzYaT3dkPh_Ba?~ADA;Rsqv}s#2E3r- zC7=fwo4Ui{;E?<#3KD8)8+Q6aO?ye9I9=CQwtxTJv$gCh>}N?u*B9PZ(k$znN3kuH z94m##{oze4XW?F<6GW2KubjUvs2Z8X%Z)06jo;T|mB_8I4Dx6py99%%D4?(c*U=uc zgvco9BHhl-TU5(F88@HYM@BNM@M_}O28aiLkT^`JQ*bFXu6{Ru*n3oGnD<>$w7;fs zTZmkSE4@2Q3F0H5w@Md`P-(7sacq5NbgPN;d!kkm`ck&Mqs`otSR*87_ziz!UF)48kbwPKp|n zP1tx7Ul5;ws)mC{OgCWiyNr_!VKW!qoy^{yt%ep-RT=K@^TM)jMVZKZOd%ZnG|kRS z);B`6hA7_tO}kxgUsoVnRh2hVp9SAWm{Rrai6~IAAo-it8xB$gjU0PNBu~o)`I&PS z*7Ne?EvWeCl?IJ0tFwRO83jXDz;)P6#0OpCa8Zn2inr9HWtcP2@P6ChSJR%6Z_rB5k^_? z7$QlyRQSsy+ub%|WuNkq_HV*#$Mg?c|o*KL>Ydr}97D{nbdd4_{R* zqf4di@AcVi<>Et8NwWWr8#x*(r;Pf(xhxlEX`C+2Q&sfIH(^Wd-#ULnV$$)k^}(C? zC!h93JXyY_@#k7AINuu*a(`UbP$_b5ZnPr#5C*ZNu^DrZVMU%S&1lu?@r{lfcfRXk zS44~B_hjtcioR$O0}x+`soI_y+8gL(+A5gq@TEIXY$)wKmM%7j z#-+Y_S5QJ^WL`h4KS%3RGiH(ei|O%%Frc!vWs1#OX9u9uw2Xlk=6I`d>_U&*kIu@f zK>k4W-BK-6o;SVB5MP=+zU10Fn~Mo1bVY_7JMj#h|5T|Yv#qH;!ZxfIwz46%e_@nN znhXlI|GV~62le=y+LAKanR z!YcnRBFjfvPX0gVXIhs?a;zo(&(Z(y7aRx^E*c zpX~qn+it_AC3jF~da=WkvyApjz`x6Hr=W?vp&4?g$KG;F{`_O<1e9au{`o)8^ooku z*L~oG9xV}@p-U5VFE{_htJ1HC8N9r#9fS%9ZG}0Ku)=^>u2!BD2!jF{7atEH^!4k- z8Sy8ww*ZLJe|862Fy?Q|%t8N&3&4N8*3UCO-+{9M{c~n71Oq8!TtZC^8>H&Fb?5?^ z3@GJ4@l`@s^fB?w@O5l9zb7$gXmHihKVI>_iv6jfjQ`yuL?0dw&ZC|!Q;qzG z6Z3igOT$SUINl_+7;j(~!3qU2eF;`V>$Q&PHAHS|IFOvbS=zKV9usfFKbn@pT z(Z0&xmLxj$I{OU~)3H=xE<#4v=;<{y5!BcrP=Xt)T)ld5!#>mAzfrz8(fw-o0#KK0 z0BKLxZQ~s_y+${X+2D`d87!GK_a|`E4g!zI zY<2bZEOLo%eDZ)Tp2qc+9Nfzcu#hk@F@JST&Z?ceOM*}Yt69)XA{QQ!6`R$ z?#9=CIYNg>%$F+lz864|rek0;#zPEn5plumoNq%63Wl7)GXp^n%IjZvbfgxA&m0)9 zb$UNt&nR$Z$;)%^V1m{vvM_AW0x#4bFV=_Rf3z%!Zv9t-8g$lvYs{SGz=r)fU=KYB1#ddElxVkH!WGXe0HP2WhWbrQc$~I`^=6Z%;Eq2m=MJgc zG!D4rQUD2F7)zo6 z0Lw==+27>Z!?!iQRi(U|Og6%j6+r#RzjkSsG9103d46$IJbVM%h$<_O{(oE^O>9}2 z1(o=LZ)}Qi^{mF_C*-)#9k*ih+*sm0%!uH^lb}KI1iZL_-7Py#vbde=gFzDrT6D*O z#dHi8P?{(C?+5|bYPRxAN|9U!@GBi2H~;0-4|m+Hj)H>r=D^H>)A~0U4f;YLYCP|3 ztJ+R^fOT?%%;TjdyCKj$e~+rK)&o)M0N^-pirRI}oAcj=ZI&8Mh7&$m|M>w|JTsii zV)W)85a8}vaV1MDuxbW*n6?b%xFitW&eOFs3;S0r*? zv^^^>LJ8P--Fd2+mWjQqS^$uw zw2W!}#)X?309gYB8aA)%sWHGx12-1{WRW!o@KtOM+fx7dh-#Hu1DV{8`wO)cA1!A| zaS=!4#4cldK!N&6zf|{_3QgxLUrQhPz)Q4eH)-LW>O% zj_(MPzjf8|;9_uABUA`(yiQjuS1r2v?rrcS>+NUz*LU!EiGj#El zVg-^xK(VIAB&VZ`1lXx`08J|PE-RKWF295CGI_J?|NP}f;j_BmeyN#K4R z3WSpuR_lnob$c$Ztthtrl{QY`OH2l%@U(p%cKQujmTft~*vWM{`J?S|P*|bU#-YPe z!Tu9)sR#dol>b2>&?qFBzix`?wMC29B-wkiRQNsLi;#Q(jYpCU;QljW@ z&lNRp%4=EGwqgrtWkbAY?aEcgnFEH>W*&SG+lj`erU~)!J->2AH3886?VS^ zn{T1T6W!6=eD6wfFM|?M7_Tr?Z!NTl7&oor_`hMZJSBPVF{U{82fNnwJR#{2+tGGx z5vagFTcwkc#%AWw^A6`%fiy0w9+BbDfwtI4K160C@x`un=Jq`Nn2u`9~gq{}wJH@VXqo`40SJYEc^Fqf!0h zH1wuEa~NpGD!i>BqX`oelfsyq4~`S2^=RQ@C5pMdEP;U?x=bK8gFAqCA!I>BvY4+T z0w6py03;vFy7$6=`#z*54J{Y%YkX=yoFvjKNR z;X4ODFbbPNiy64ie?b6P66n>fr>n_5;IQ(6%K=^P0NzXpLalq7yiEd<(iF8$FS^Kd zAj_TD5($;rL^LuNn)qY3M%$ERMn9J6|EUamy`hzmXTzj`W({0FtFiG{yl9`pZn$5% ze#E5R|2Rpud_(iixVeAh!^2J?*yBOSX}^Dy@+F)6c8>F&moLQdu#}!=7_PX+8)%|` zWNc$&V?aKa#b-A^Z{vuYZteC}ftFe{$NgVv%IB|Zqw z2EeahAI$8fc96?skMIb+-~{f3hfSuy-!C`W>HVe8%E?h^u$-HA)SY(*!t}%iL}X%k z1O)E0_N(bj^Ph2KV_Cc@0^Wc1>le+Jn^}O>0Hp&wJMc{!^w=CWfBJ!!(*$k|ES!N5 zfCAL&zkoDbstgw_;y@AqL_tk3d%kw7Sof{6?LpFxy(334=$dkXY<%SJPFq%M_8 zTaLXtu^!bFu67u36ZyfIgeS7wL{F48%n3G|3zqEupg5=b_Ky|BKcfazJ43*y>!Q1? zw66atNS;@GjY|JXAHXjE4eiY3Z#?`X$>lt{9ww!t>u1>zpKn(y)aU@)boa2ldKdVl zf5bd+nC!Xw8Aj?L)iQk$0MpE;3*dlu0qhsxpaQFoDs(&2fwF?6*^?<9FPeSGwa{vz zewlt{8Yc$a4ni(_KLFM#I;$-yDanM|78`k?E|kyW0h0`%24$LTSKer}IDAmxzrh5m z70}%}y?H^68Tma$VoAUYBH|HSX>|r5OGFZZ%naLB8t;>T^uDyTVZePne|!eo z5a|C}jS=}DAow#juLoSG9UAjF@?=e1dtE$ufdPjOA1t449qh(8u|JjXzME#&eBO%y z;dWSBjLYLh9gzomd7;h(0bpYKZJX)=SIr?u9W%JP>jl4QN$x$m0Z>(ZS7U65gj~!g zQC7dcLm-Dz@Jq^!&OrQACQ(sQ*E~s5FK~n@=o&>9FB|+qG88C2)$4rE*E6NSKk3m^ zztg%<Gj)EA{@J6P>Q9e8yzI^d9{ry}>9U(%^xN!dh0Pr2s>|3%GZ7D+H`o3sb0>`53 z%LApd>Ar8^^;023XTsy73^M(Mjf*Ub2wsvtD=G?+qJEc2qV0O9(ezNHXYhCCLn$*s z(Ey(4zjNi`VY$*(SHAQN;!%yy=^N*+u72NEbH+_6czH8ej0QoQr@2Uc6R4iEl)HO) zqtW5 z4lW?=xd_3`q#!?$2pML>KDA7>oK?U34VYm0^=;?_MF&__iFJq_Kt*SJo*Dp{*FOpr zA^}I#RKDcZPKsVaMuz7!moTy0Is}lG2aEMoU=O7C?2gT1`n@5j9#ft)k;VJ(fKnkl zQ#ZD73#v4VJY^KjIG4TeR#d9A(?C$L2bT9Qvi~z_^7!u-Gez277XuoVYPKyq*t?TC zu|V@o@Se%OGK6pEbYIx}Q3Ku`W{%Ha8lZ4}rQqm+asp14bIt4O?B%#HMRx==v{n_| zTuzm}IkNU>^-$w;OG5I6peSaZ*_vGYoYc4NT4g-BTtzY}f=I{@l*&)P`lJ?;ktZ68DyH%D_wmQ^Vv6;UZ_`wH`XES5-?Hk!-)pRpo4!B7 zf)-bzrbfQnLQwzJu}g-IRMn@=2S1>ESXLU9FcVeqfRT&PB^HkJ+UcMnqVN3h^O_45 zi-bIZd8Td{6MnIUJIpOCPw1@*T?;oJ<_?L7YjksLy0-cDq4r=q?P*{f zJe!)#vdh)g)q%-YJMakCXKSy`!~4dp!vuEi!YPb8K*w!LE7SdF?GZRlhp76PvP&>O zau~!jJ6|x0WdWREKppzp(zs%~2UL#!{;yoY^78Z|X@F*Y#g5y9u z`ea6{Bzo?^Z^@)UME~=fY?FL!E0a*4HHpDk`1g1K;20kt4>G-h2({+;!h=df99vv3 zjR;_Q&c`mEEzp;GUKj8Fsg*yk^{%TIs+dbquM?-Mx+3sFhSbxdb`Z6O;=+nb6+baX zuNHGU=w2!oY6Nn0D)hxw-WF10*Z3QXzAb=}>S$>(S$cYDmX@WCh(PtediJ{XU*YBD zb#!rYz0Ks_`(de?vdx_(KTqRHkR|gy8?jh6tryJtMZuy$tqlR$+p44A4P7peAm$kX zeRJIP`T~a6Y|_e~JK4%7tF9~@uyg_DSwqC0$HD+M_Ij&(df=4q#G_MO;-r%z_5QL6 zp{4qW$8m4s1Ag>$lieEh{Kque-*_&ZRNy1J@~`uFj$jUuWMA($Lgx?CEr$+AlIZ?T zdZ3^Yze~mv(|!)v^hMU0Z+X65YS~Ws%~(af8ifHnDta z)ar6FV$-yuhGS}y(m@EN^i-}V>2|+kE=N^7K3Y zRswZ7uYl25A}R6*0?e?_o3Xp=uH`hb8B#dMAK9idvL{AH9D3CT)cB!)=zpWx`s3hy z=@6mEom6+ZokParWS2^5kTpF$GMEG-0vnXo|Ev4CFnC9Voc%nBaS*9-VK*2j9VVwG z)5ybhr}AuueH=l#w)8Cm3R{X=on5_i)bpO8`$=2k0^Rka@d<+X{rbjeGY3oZ2+m|7 zy#XgA3w&?x8`~>>(hKH46~0DMsbP=1@4|L%$couOp`-hb?~`2L?#X5>FSo4sLgUc3 z17QYPHY0GF?+=*p1nWLZ&p^Cw`D6L#F&$07kS|Bjo8?ak%2Y$(LkYVand(Bs%e$x~Q4g_58@? za&`4Kum`%!j@UsGwg+gEMiq8E-)OJ&e972V5sr+|uzBYWMwQ>cx0@eQS2Ou<7Xrb* zEu7J(ETG?z2FKUZ{@$rQA8Ea2FK603tGx>RY3~G@j@fp(`8AEDK+!r{D}UpR=#_WJ z#ts)ckxIc74D2P<&M!^2?N<}L&gG~sH0TAKd+Jq?`u2l5z#3;>L3>oNWAU&4N{Ku)2t=|Y{Pku~ z$Td795Xm^&>1%-mH6a-~GO5*2$2T`or8*G-Z5rX${Scg-p#_r>XPOVfU7?JjdczqP zxwypkX4-x}V~$c}ae@MAoLU;ME8~W}TWICWJ;ljw>)fv++519s4)kl8Fjwvn*siMkStqDi zXqecxpqTC@NHhM) z8Ap(FzBp-rE6B7xiXNW*r~ixHWG@=Ay-vFiiQc$Ja^LN#$8KJ2-;*Rt!VFSlF2&w^U?QKM=P!Hnr=2E@1Pb2h{s zFYF%JE@rdbOCt#`yfyKK{ghW5(2(?Sev))Tf+wtx9*i>Gag z;;ge+3%DI2`9!qrrwiTvrG7AlhPgW$5jLv&K6aCPpsVI{&V?fXC7{6;!tC|RY4xQO z-j0I#Nt&kCrmbh~Hy%GmswJL zS^_LRk1Sor&o?7?m0spP(Z8#rwiF#su#nZaIo4@r%0OQ;G_Sc&@@(GB zD0Q-%500DwrCxtCm@oDB4L->q`|2~LL%&rUW<71bp`2*hlo5f5mK?g->c#Qd%(XbH zGxLei)Kl4T^YY@oLAH(78!$0~Ue_p;ZGV;DZRd~XS7=E!sxNlDUe$3stZyKk`(>re- zj-BDj51yyKZ^pGa7kA)t3%`MRWHQ5-!S;80wJAQ#9a(8#@HyT}eOeEfo;Vap!kY2f zj9Yp8x{oR`5;E1!x6poh>Pl!o_$pjc;NQE@Ag7(n$;{*dX@I@#3lF2ilV!HoE~$P; z2Ys@Zs7&(U$18F7zGKsd*sC}SF1G9EVM_ISjR4dGOKpgkQca?8X%dcw5=Gb^M zk8*M4QBL6Q_}6WBJoD3t1FV%#r}qUdbZlGbjBUmk9R?4p=Pgz0#|M@6)6YCVh{g_@ z)*_#0(=dq@=x)?S^l#@ z$$xw$Fyja!DQW3&E&BpRY8O1+Y9ROW-saxt^e&{46%~Bris{=PPUQZ(pYMLR;(FwB zG+l@QmR*qjh4fSCmYsC=j;gzM!G=oz(G9s16O$uy{`8%ZySPN{Nx;$mJ*|zk+}=X( zgk^oze)sXK?s(YI9@|Nu9ru2_B<{?(f{EArYJuc;LS3J1 zcfWmssbjI2qBUQSlz?kojvcr~8EmOB7UM3Z{6V+fzNG6UPgY%@veT}6=8gks1XLJos+jBmH@NS

ay#3(bivB9)v}U^~b%?fD1;f!vhsOM#$nyBXI=#H}wx;KtGu zpC3!1qZ@N_s)Z8w2h|!23+vuXcXcX;qREoRrk#%2nZan*;hnt95J|mT=S|ue3QDe| zK2}c3LVKgkUNjV>2BUcc+;O3_1>)arGozP7d#w8#+KKk-cUA5;o-wCOQ9r7wBD3%P zdX*XVp9BTOFcFOgw=qzKUVA~Ar=>I#0;0UwHkZ|fw;)mIJ@1QERYT(2BiQ6$8Iwpyd^<0%&!cs{EJ=4-JLLJ(%>m|V_DD)>Ldfk zk5Z7txNxDeMzD&A%0vrSppA0PKiVp7meW8Qk(Q(KjlO-`8>~5t_i?iR*vs1SX)U)t z(<*Ak5KP{ljXR}SboT9J%c_xFPSr-5@@!sMYa2+hCA_Q_ePN;=N}aUH&EY~b&T#Qu>nYLXY`ol#|M3T#+p~b84ckNwDo7R6|wYH=^ zOqMvZ;2rKw_v^i`hCevbWkh0p3Et<1e;6J$f0pmbdL==Hd|md8%Z4rOoF}a))2mvL zuG{-s+^6ZuT0OFPx@6{faj98A((GD3pqw`F36uw#C|8A_+g*m*kV<+5M8+^eUS~qIa~>245m0 z!>VA)F2hJkLo>>Zpx1>|9BP)?HSH?@{z*ksvsL)Gtg4C}KZXV@^uGqZ7Hpa|N`Np2 z95C=M!#4+0!idHriByu9;U83yI`)bS&P|uscDTg~ftpt@Z(~3vB?2alUdBI;R`*s% zP(%awIJRG*SBgxh)S5qd0{sgHI^jE%&Zb^ahQ%#%cj` za(713Ku4eBQ_KbId{z5r!&%cqy8AZ`C>ro8LnZ#4WG6DAKf7wB3$lK~jPZ!w;SLEl zPYCRw3u~&q7=E$zRf%pj>J6=dulHv#X2$g!UPy)%K0Wo*Uh4O^5>737TXzx}?4Wuw z4p*(m%)=*vCBtvOPH@ozk$_;ue5ID!WNH!-wPA%7pFc#cupRaMuYyrZ)xBG?7?jqh zd80@Iw(EPdc*$Agck&Pf1$dCf-oC9Dbcdb*#DsSJFZV^vPBMgr5nu2r{lLoY6|)=t)N$u(1y+`VhQXPX4QVrqR$ zP_CHAD^&QdfxhNCX&UDRH)@KITWQM1y!hoTcGSLj9hU9sw=uSVp_F|JkN?uqm%ukE z{dQ6##QiZ{yS~(fC##2itaX$ktG-22JEnZzry|<%_@$Vsx7fa`CiUL4A=W}5UhN6* zpV?Zlk*=FiJkVHcJigXIw-fYpz($a=)tg%`YaV9SDQ<>LLr139f@c`pS*I8Xa{#g9 zSO_@u*W6ZF&Mj~t=dJ=x``@j{0E)N}5T&LR1Wc!nkiC5^%HPi-7)@kUf5P@yjG>naEXrR{a%qbewTZBr_k3V$eK2Fyz(J4@nNKog1-96LM{H` zG<}LwMPSOt?uT=p@-QV8fHmg z}w#S)GG41A7Itf=P#A(?0djzT)~ome{4Tw4nx9rq3*GF^%`^KuP+d8(@#X76i`iM3ujbsNKF>G zn5caGlNMz=p<90`8fVEb;B*|J{SLv2VqHCJkHI5!7%}`iLDR4a6I9kCqBXE6*AkS) zn(5r%k&1hd@BM1Cc+nh($YRiLjcm?xFsJYOB6+%2O|BKslRU&YOW3$UWZ7y$CFN|? zJ|$)=&#*Jc)sdjwM^h$YAA*pzB)di%n(?+(FfXB&g{%xr+kF(~)aTibp3e$d=SEl= zy_!fgu!1s;{YdKycWD@!i1Bm4f}T&77`}TT0NdoAc&y!60@RLl7I#Ar6GgTsbFO?z zPbWUF2O|Jf%pBEwNKyayl=d}Nowmrq_wSq&t&A4Pebnn+RAE>jeD39txmg%pL}*6Q zX;s$Lb?|~$tA*=!fpB0kE=lxX&HMzC?@jG2*xtKWbU;vW@lFD>fwLD1cd@JY<6ye- zM9@m}9pSyAXcw}*nN8C3tL|{g3I0LjdkC?A42$8F+U<0Q(E$epp|0`Or5L|rv zvDol1%&f)KlIQjQ_+y^??lGUX+B}vFdxt$Qm#Mcjcap&v-YnKEoxt*8PhCpXZhxLj z;4e+PmHda<_c;nHguS8>q(aH?U^e@QDz; z0SdUmnN~wF6e>7d%7}LIp7bdPNCjIK)`bBKw&s&tVK>L92tVPKfGVRAn6t2<5zg(w zqt$vBAIK(KNy_x7`Fa8=47s7ppx@@{Q58&(7C%32nY0j+RnZI&U+pZAF4~7rc*aW% zd0y(R~2P(HsP_JBVXjU_6=( zzig9EK5V4eL4@`<-uI7R5Gl!5@z>8Cm=HMyV#n72ZnmLsztaTO$M_d&d0OatS82L9 zt(!FI4TNdaJ}NTDmgBkVSLGG3D3vatTvzVN6U2x;C?{XZ=&dZ~TnOAPc4H5c0e|>{ zLR05e3mYhO!RFpFMgo%=%aXcX@@QmS>y;6yN;BkMde z2snUF#9NJLG;>gkEc4XegUD|k`*y+s=RAc8~ z1D!I$-LPZ9^Ot@beWt^NUS||5k%yPpd{e{o4kmi2CQZ z1cc-|OKkxlOPTHS&ZX!5M3&xo_vw2&60MffSnEERx>5~AR&R#g?xZn9tb%0tPrASd9WV6rDiPoFk^ zZ5#x^aMLdfx^7K$!WmdHE3%OpT&7*l36l>HY#oY`b1jk8geIDD_B&}7 zCvD{j)vF7mphLo*Hj8yLMx*y9Z)qtgr>Cdps)+xb#I`TOip**CIx~BFh5jb+CV*Tn9((oe%Nx(_lyIi~Al8cZE@h!I z%z;uAM8D{g#dE zOoR|yT+(M|6mhAL#J6kJv(&JxFdekPtHE z#rW`)G2PJ_{1A{t9QVs&u)W`2+d?eGkeuZjDXmr&ErKMdB+izKYILwxF;PW%E(jV` z2&tNq#GJdiQNmpVLJ_*aT2Updf`$SwLcNmdn?PRK;G=>gh>{ALGMRM2iM)z}=u9#+ zkzEDpoP<)#FPeXC-|N8dUAjbY(7&nN;qh@Y4vv(H3R)igN!iH|)vtHAW=QvvzdX~r za>Vj1+lV*Iz)5=eTnhOL zxamd1K)$RGNLsOQ(XC3m7|B2fCRQw}OE^3G`()db9(ZX6@$VY6U<(<6>Z+uJsH#D6 zcH-RvseX+pN1+ldZrOS`8XrxG?u^Zg)`?}t&(9ARlX)T$Q$S{esx8-Cxlr1BSzh)c zx-DU)(ASouN{krEmt31x%~XasqM6Lif*~M2(MsBV2#2@SDP125VSiv@@__S#CsU5# z8^I-m(J$PCo8n8Op7QruEYFcQ&Le6v#{V2h2V~#K**=5G%sv7;aVobn^?!I(AlL>l zGFSjIK_VKNlauqkcu#Z|q9W3KOz%WrzgE`1A-GELq(n*qE&_xOFC9|b%9WxJ>~s(?mrg7g2_c?%wxeBKym+4TL91r zNDJYJym}IW3qePJeRtFKJTj)H9=Uq*QZBYqwWTGYpc#3Tnk1t*HoWe{=J3Wc5T41M zVHW4YckseaxkbWVn9mtYWIdkwsvdryJg5TYmtz$gGQRAXzd+rZ^THKCQCTUN0C4hO5NVX5 zD-%fdrvvm$SY~D>zxCG7+@6O*?ilZ*ofQ-k7P(m#NMx8qQYZ8Z7DjZ*`}J`X?dmUF z-cQBj`9U_{D|H1uN0d@GeBft9Fn>lage0c!6&7Il_@(CUoU!>{9wtmXX86JCm;Doh z&WqExqT%S3eIj(#andmbs7L`(jb(N6e%+W5CW@@z!BH8HkF!C9WQKB>GB+kNwN@GR zXGnKuJT+p0G7@&NhoE`*jNm>XJ3}9kLeOR9=zQ75z=5gghqtgMN*W=dUdlz4z zFi6?9J(9oS@-t_9w^$Mc;gwnJK|pE{v-c~A;xMUL40m|3o(tB?>~PJM@K4Jd#t=L< zbTKS`7wq(+X#g>YM8qExBk&4LjQ@+U14|>TG4E=!bHOJ9`K>8=V{p`9sM_fZXj=5u z&aXSd9QTaqUGS)`1utT7llH_tOQ|@s`m@ELSRx#A0=o5SX+0PCVKHHuiF z7peAxpdw_gu5@QKbJjJn;)%0qBN7!^iATqv=i+RET=`cKAepG`G%fPiima%-1DPd* z<3FYC0Dc7k=WZb(1I(<$Hye*``#AiqDKoSxrG)$nAeFmXo*k$++5yK2~m^$8(0Vz4XiEiptqRZ zz-;Gdw@oozVI3deN{tIKA$KuPaOwcJKnc}~7w8yBOomH-Znseed;}R(omtGOHi{p& z7ZE$$sYN2hX=PdiNhP%ofyX+NsfD{uB;v&=xNOImx|#LhQZbCDB}|Ldr*pDH2RBS! z&rU!$(J9s_VB&QJ0co@0=erZ1S*F&iSpdJ@xDuG28k1?~b>yq^Jw#zI8B)QMFY=qX)S;9mEuEZmG}pH9z6kpv~Qh zt@%+acpnJ*ghyK2#T$bj{l+)WuQ4t zyM}{Os{b*O-C83kS?VA}^(6|kdSMiRdsBJbuWh*}e$oC74`$eQN+>8yBeYHOV)HyD zWn*;SY;gd(xVv*b_FJtFVA@Tt@!sRsE{g~C`too0%G(Tl0A1f?>#=*~o2dMH;PPvt z8Oi6PM|?pc03dLHL$64FjzYhnnbly-_)4;5;hgwW#`h)mWNRA1Q_wNx%(s}fFGQp+ zt(q`K7`&6Tqr@m-pI+%A2|nS+ge(+yOaQP`qZF3@3cK(hFH|W zXo#E}bHtnRH8F+SzHd~>qB%A+n{)5px{8W5YRK4srXC^&Go)cXx;&luGu zg!HoZ5K1d??GA7IA_w$(_pP#a(0aSzrig|p5T#B;V zfVhU_Rk1v)s3#vm4FCJ13l_gche+QRn^d!=zP`;z z5kv=8wIC#!_dGYx6B6i?R}-y1+xxyCM$ghVgZ;c{jeeRF+GgPGSR0IahDX6?sHHd; zwr#-?jaU<)*0cTBinZaRL2Ks9pOS(%C&RiIE^akfjWP}4_5t`#r;f3sqa)X2Y=DpJ zBPA_&s3Ch~p+3gj%7ueg&gg(|n@iD2*^0nRt-29y zVUAn6b^typy>Xgit?c1)65cS;MP9JCTa~s!kXe{!t9=@_^oEj|MczJmMG=~1awWnH9&{l2 zl;t^y@AvLLh`u(aryb*h^caJ+?GPrK_>~Gd;8FRfl^`jrsyb{1Vc4iqN>h;)XSraj z>AI8sxai=pT&RLzhNGfyJ7oq6EN(;46QDtuP|3Z{hRSW1&{u-;(AgKxvT~R!?bpW$ z(T;*AzsLwI2M=}KI__=m62JwKfv1vRQOOzca37EM+9L(m777Xj$H#@B-Vv*>{d#Wx zF!UqXR~~PU znSlzJgpwaTj{zEoS9cZKO8)%iSa`4wrDd`US{+n9&`5UFPx^D3R_#uQ({PjQ!cXD_ z`y|H=8qYhhWwQvtGRtzY6;Uz%tgvDW(rCUdE--rq)f;%rxlyedK~p764txUAzc#;&4Mm#^SpyN@#Y7BB%j);Sm8im)J8!RJuSDTiP zUxL4mW%1RSl*7l!@!;hbfb$~d<*cl?bGu^J{z9=zE8QR%7UdXyGM^JIOQ0&48a7`~ z_b-VFcPsnZQ>xqM901(7rWGE|Lh?4u-c*a1)OIa3YcHA(&VN||J@EY2)FeyEOOf=M zT5F~4E2FHC1WT<{mqGcxtEb=5kdId{Wc@NJCJ=aL=PCWO=ha0eaa92vtKe-0c;yQ= zy~x}xbjvkbsEA20b%Je$`xM&}bxunbC`AGKZlU|EWE>WMFbx}B`nYzTv43v`<;j|& zhe4m;hf7z;^Y#n&1@FkI1B>_P?LMQ^ z<5p-HHS-*t_DZjVcEQOujIm&Q>YOEqL7V^SE2t*NouY;{d$U~OKFR1ojnk4GR$rPv z((nWc1C4UAfb$tEzh_h6bt;^UV!JHV`70SBt%m#%qEhY_k` zJ0Nvx2y`*uAJ12-)>T$97HaN%J}&?3-%4E>TbKEWPjFV^QcZ3y$n}7BBz!9N*97K?t$p zc{%JirN8wuGIqV8{J4XSoIg`mbo$R0i)%esrXmUZ*A;q{GE652a9%RZ&o(TdlTTU! zI6D~R4eI;Fp}bowf!A9G00_#<%XiCMRBY9Se2CbLu3^b5e~X#0#_~LV3+(M|75?m# zNKmvcE^9;ce9w?q;$!RJuzYpuzipjK+yRj02T^&g0~8%u1tx=v*O1OAsqreU23=Mygsw(DmW1lu)~=u2*Zn?BK5ikw0e|dT1``i~m3-Y*)@4t{V`cxO7Vr9pchLrwa3jB{}-71hGltVwE3|U(lx8w4glj?AhXq#@#M* z>nx2_zfD%1Eq+vlgneVVgZ4q6t-{fC#Cw*vNvYj9cXv8ji}4cyGg~0exWWGjtcZQU z2&r(=c_m_a$aeqKLboz)D}XEljNGY$FQ&~KWJap4rh4d|+-?u25y#_kdp^{iNBn$u zCOp*GX8#u1@Xf31yOUD|x1q0jy7*{8r^iIaLq?jcZPQhLmG{aBX1z4(tn^O7xCc$n z-lTH|`H>U1;cG0C4a$B?xoBL*MsVjFl)Unv>}c!jrH3)7D~NVyx<4KI;ryPducub6 zcc;SB-NeriCsGG%T8{55dPsjrr*n+58=uB>Rc7y1s%Lo8rA}nU^u_W=UUTJHQD{dE zo^Ox3)QjdH?SV=F2cUv1Ua}A<8GU`|`lw{_{&NkK4emU=__+RHB}(g<39!Xk&u)d> zNIHDoiDEqHz$qG8ZB)?`X10wA;oo&C!YSDA3b}MUfdg;imi3r(SdQ*0-{SJ}US9Vk zxSBk$HQ#0ADL@|+KD4MU{5Kq`6La-Lt>P6gR&o2`r3nvI_$sB>xv(`^vhhQBvbyzR zCd*?&+Kg-odXEUGD#3L*)R%TQhaFVqYYsw+v!j2d?C4p(?r#3 z3orOW>-i3g&wIx?cpL3IBsXV@$n17nnFi+h^!jq`sPXa+_xe)y!m?F&9H#LAPU-!i z`W)Sg@B1#6Irc_ne=g(hUJ9-!Wz%w@O1;n1Ydtx+<5!26r?z1r>UzIvGe2ZX z&zBl=z>ueMGH<2c0E?6AFit6pm0%>_FM14u&gafYvHpkxdb#VoH**th_&)lvxBO#Y zX(#ilj(7maV7lkuF#fMdHfeae9C;PL9tlFR7*Wf!A9*WgZa#_aX-UMJI2lt~HS zJ$fGkBC$d@iq478dmClF>)i=5xCgX;8SWG{lN0cZD&S_T2qVzSIS5&^#ON_4C*Myv z8`@GTp-kf*dj-#ViegVTv?0K`E{eWVQD%>lxk{TnuN6Bgbb+k${$fLefePO+u1>Ip z%u(6sYq`6w?N{|0r%52+>UkQadJLGRjLBk(b^NIfZIzh^hmcgZnIpdtTWf(Dc%gU<^w)?}h0>?d0Dw~?O z!)cD&`F&`jY1DNAU&OyEFj+t41#H((04k$ z*1cWDS*jm5Xm(@}YU};!T2+E@kd)0Hpg8z#DUTR%*w`|^1KnA>bfNJP)r+t_|BcVN zP>B*EJ!YS^Z(JNyHklwHgs6Boc5$YY1IRy6s%;&zE&sZ1OB6p$>L(zuMiB)WX1xMb zbt5gyc1!{V@WR2TH*Ng)AJWpZMw{J!V=s328SFL|ml@V8wOcNe$K~)34^!x6yW6|+hRNx6q`1xKXSXviN4CcuKRqy6o`FM(j6;qbE{0EXz3(ri zIz5Sh*0&#?npkBrgs903oAenBME!AfR{+N{i1@v?UXIJh4*cSX;@2)})}(FvTF@uncD9|M~AtNa*xHQ{jdo}?@WB40bT9_XwK z!o0^Dc&;u2FgdQ)AcZ2-^&CB;uJT8xIhfA;Mnj98uTe+2PDfH6PvhFuT`x+FV9Nch zykEBsquci(idOAtMXzu@>F$TXJKv4)(;E?0Rf&{ze}slsL!nQd)xfzOy)!MAT2LPc zC0T?@H7{W9^W35dPqZUC1<2@i^mHT0aNVx{aP#g>TfD-A7UV|XN$2q1?tJA@yuu8t zAJ__!HcfVQRRtrE&5pwK!Y-(IPABU8`N7xJ{tll)p!?gkT32jK0a!vkiDEx@;@tV| zmvyZlA8T2FRG|;ZqbK0YzC4;wz1)h4i z)uN&!mVZ5pVG&7Sx5|5AH`&r55y2AX^Mt>%LA76dQgtxDqbr(DrRsStx>m~}?GcvH zs;*3quvZaLm0#ALsJ^_GE9p%|wl0r8?d$i=s=uHv6|EZN9s3kZ|I9#e?=D1#j&rx z9+rE)b#fSfGVf%lZomCJ!$idpLlng9NBJen&xyN3260MrXAlT#G#~u@AznNS#BTpq z-1mo}p8S-#djcx_rkvkgn}#4pl>9?oPf)D@4@#B2vNwL8C`461WG_jJBh?I4Rn-F1 z$4HYB+(v_n7<2WPw~z0yCOt5jspIXFDNsRn-UrGn2EL`xDIpPk_g|yf#5hC5YjFOpAKDYwnqhoL{_9L z-b{b>IhvmSK4_idJpP^UcG&}Ul8B-x3Fw3LA>iE?S_)ai_T>yAljdxsan7O9T$(8n?~E-yx?%IXf{sgw@#xc4evJ4Ny{I~Tl4y$Ddw6~;I8}M*bfKCpq2Z^}swz>l zad97x1O~;lU%awB8SE}-XfUYbmr7Gb-|P6WUm17UELwlR3*Q?oAxcSn^(U|7oRtMy8*@HLu7&IDL0^xWG`Mu)b*ZXUPV&{9QH z?>o5rz77>Faf zOcjGSpYME8cqgpwHK-8iDWBys=fNDA3BZ$Xkvr`C)=zl($3YI<9*B`2maM@z{#7OE(X-X#%AEUXE z4Zp#P-%788h|o#jFXRkE4y5E?w`zaNW)vuv>Nt2$hoX5j8qSs)QnUghBE^SxxFK&q zm)O(H)2#XEHBBSb>WRS4xVw6sbaH`1PUBIkQaY_g7~UieL;A*RTGUoqtGjUQCChfl zA@ll^nJAl}EOY)tWecf~W)CkN^&(BDYCrR0i{&j8tE;-L-1c@*U*`cF7HiZK%$Z!@ zUYoVU<{y^lZjSCno2?h6c2RVRnBxv4q!sCPqrp4E&^<+H{BviP8&!BkJ2p4&bb%A; z&X&i|kDE&`Gr5jxt!OU#my24*BXnA5E5x{Zy54+8MtS4~$rYBSCYkSX&c&cC3PIBj zNO~0!H}^gaAYWNb?NrANvUhBWF%kUFi8`*mJQ~M}WJ0QL&o;8pI}kU2DD9+-fogDZ zsZ-JHY{<(|rDWj@NUvZ8X?NV)zE!cr9+9Geq<3EhnNoK^lX!PHf6aFQ8! zmUGs*TMHtH&9dTlFHo5h{{o@$&wcd(1C)eEHG32gLYZBkdd?Q_7txHphdN}wOI49Mu zix~6SJd;sy>%=U_Pl<#1@k9P&YFfQdd)TG&ug;8-l?VB;ih1VPS=`ROjn+W$6TozM zo7P-b7$)3dVPW4l6A*-c;@y0)A2Df{%{Z~C z_S&+MDLGtPq6TUG*J~JLLR2RH2cp=3S!u+we}qn^)$rfp1Vo@}feHZwjd@v?_2#PA z0g;%QhLg`2sv`yD*)F0{?HV{NTfV()AFfA^y>~nw>w^3^1ivvkerYvOoJsm;;AsJR znr+;wO<7535QLbppUA5sum7BC)ISs*A32d#L2pK=5wT60cvZN*(|J(Z9b@rG*S%9~ zv?NVg$ID+H@I|+7Q_|dl*S4k9(_P`PE`Ai#Gda_ZjL6($Is&Hh-D6>zfvcEi;pXX2qSN;R}aN8~ia38HZ`}9f>VsI~4oqr>@e^ygP98 z?+4~QEI*hC-9C;^%wOi1=Y5_rkJPO~!d5G&O*f<{lN(qZ!Dl|0t9BL=;>{0e1O6+X+Yfv(4`^{%qb`cT(Rx)8a2H(!FAj8 z1B#9}*6?)%MngvjkNM9<4w|RROFPDKiB=wb6EQ1cYZj_3I5FZ-#tCxHtPvGoe}6;S zpbxIbAo`4G{c&OA-Fm;Fl>xnFz5&sK%47SV9IAKJ#}ShHKOvcytyX%VRNpYW<3WFL z3=7v~Q6CUr7~CNv$BSG=*aaKtUUshweW~uI-4L&rpwFg%G^pD~pYHVL{u1Y0^5!c|D&!jyZ3Sn8DK>Zg?3Kd3FhBa|1@!!EF0K;@bNrfX%h}Y z7DME>K1pza5|LKz{`*$J!tFMlk^YdqL0)5<9In9}B;X zMiNQm%-vyL?bURR`2J-2;A5%n;*zrL&TnUfrH*X4CFxdfAMw?o0u7F3Y*{ z(4+He>w9$#3yJ+@f%~P_ieR_#r?& zOf)@f92gGH7st=lHK+M$gnlo_Kvx*=9M2?Nwz5$cv$*gpBS1w_to6+w5ab(Oz0OSH z?)p5_OHyI$a)osjt%2=<4ljozEtC^*6N4ZT1tJM4^9v6z_6tE1Aus{4O+dcLKd|xh@hM23?`t)u@hdBA1g!gB@+_vy=n9%4{4z1_Mx3Qs6WHfoDN{zL zSEtup=wNdc7|2JF{SMr$9eds zO=5uL>EC&|9w6XS$Np?38GfDmay9gYW`UkW`?T@)yH>v|Pc(kvn!@zPlu4FR1CRREU`yJ%r}S+_VcwdCY#1K4USE-ej0>Cc)slUq8W!ciWdvG7=ntWH zS2mDH?m!pT8ak&gRB7*5CD|~TpET`s>kUv6&fI)+%&Z3LSaA?ZI0gCl7U>> zus%IoT}HQrjZM1jREDv1umzGo5Cv`D@shv2J+dZ%MmexQbYAQ>-HzvnoQIl!F!>yN zR^9a}SVO-!D$z+ht92Af9hh5zCCH!6)5rsnw&n91$m!{$>xMF;j5VO_4r$;e2dF>h z&Ql`k8g3lO-l1bUFF6<4N45;kl@_L}tiQfHe|%kaK2WLMsvYUXprqdpPU$i+`il6; zF}pRmC<=QTP&`U!9nQ1d$mMz8!`A)^0hM`$P=&LU)e4UjAGZ{=*LleMu|33JP+W|; z5{)EI@VlMECQ3E^8$07KS1oK)wp@vXB38?}EMz@$UOe zVFLANZ*Ux0J;>Hy9WHQu7>}0gMtrb7>G@@w?!QZi>>gJ8oVO~OFV>uLuopkn=06_B z5Yi7#9JRFNBfV8DnvKty5+Kt(T4hS*-?ILK)E3gtE55c(lVzuKO94(bMG`x-*c>*} zsyo5A+&eCxXlbIF);;3w^zoNWBV(!-%pLVF2LDtl#pD_igl zA^t#xpyG&v`Ek1Qz4hre&c1-GXtqXI=lsJ8?-P7o^{(HnmJ%kVUYweZPOwCrPKvFM zXHcLxIJEsxsfqjuHc%o&6^SL zcl%cvxoN8L?F(glEaQXxXH(IL<=G?M!x+>1m~4fn`n;RyI;bhiaw?g0RObAMq;BD>(CVrmsE+VC)_AX|gVcIE7!{V|yCZenPNw;tB>gO%it4 z;HW~Pl0g%Hg9m7%quF9a;o#3<5cGiF5MaE){;KEz49t%;t=s6Y=b_{74b`;pbhEV4 zHn>%+c3X^_FEX<1Zt&jgr{BHe6prrb3}`0KFc;f&N!tupQtxn(eEuLgwFHxJqY$-w z(Uiq=DJS*`x{d0g?F-MSf=^y5VA?aw#UlZ;)dDgNY}axh?MBVyT}(mINHR~`TG zrf+`w>TQn|c`h5z86Y2~G;7DdLE zg1y`gl(PYf`Sk8!D#`Okc#;&!6oYEc>{Ep=(aRQ`$`WElRMRQ9h`ys+$9^$@WOJuAy;p+Fu~TJ zNq(LRiq$UpH{$&=pmQP77rE#WOF)-rJ+=prn~@kLA%lqY@dg$#xP#|{&;=yJh;aXmT1jsx4cx zm@Qk9vgmq7ib8BKUoJ9PUD9Cxkr-@bYfKws3V2pT3Z9Tb4O7Q1?2eW)RR7>hRENaF zX@*IGH%^X~b=lziW;eq;9=YFeUE!2$tJlr)!JUQmp(WABibyi_kr85x8^FQO!5t_? zDm{BHe3(&(&Qgm^j|b8{rH^YZ8lTV>J#>-QuVm{ZBC$Al(AB$wD3JMnZVK$)Z~9HB>BdLjwACz=Bz9SM$#rWBA6kO z8ko1<;)rX)e2eEEAg`)Uwec2mjxjNuR{i;7lf7vCF%nb{de&(wN5oV#x+T<4MrSb> zB|Xy(wW&JPbpK#OQ67b`LZ{x$m2^SIJ+rotTV8!vj4Jf8qaKSTiD0{~*=WXaH!<*% z_3&G~`S5^xC^jkP=W77tovzg40E8|9y~i);=>A!{+f*Urnufj#iZ?$x)@YPXuP1XFkW2*?%v1a1u%esI%`th1ow%r@+X0M~57z=QBrbYAEvsnTbN2C+RX9tybzQndLjjC?(xS5NzK@1!Lb)zC* z7*eB0orY8uv{U664b-kjzYLciHIIcqaOv3-y?+Ov!mI+HiO<{7O!~5qOj#MH7VYq& zofyMlHRPSY6-q)kfVv_ns7pVRBra*-6bf(aZ4)%yG>xq$#4G_*1-p=JHx<&f7!!RC zbA)A%>5E27v~j|KSFIDLN`Z%3)8~B+JE}5fDWk23jqiGNrx!9jOjq&ht!txUEpiD3 zY9@`sb5$blyXwCkzQ8jpB5I+iafa;91z|Re#@qPGf31S-zbt@iY^EmzCIa(}l7hf* zHSstG6rHFoLK3=kvDbA^Nq-loKghEp9!DNhus4@ttkm>Dh*c-UB61&~e-2VI`Hy1p z<;;-_S>+(9Uu|3!vBPXoYlcV1g)f|pWyK{)){T`p&q1+Le-*H?$r*7R2Z}$(@5E><|NQiigmnsBUESt|ygVyIh!kre5s-9j2uxp4!Lo_XXL4o^t?Lkc@YbVUFa-+!y6*?w=x!Q21t_=*{^{+mYuqr&!l1X11_Zkc7u3d(|`r?(6%K0@4sT^cE zw7a*c@A->-{W$+_57M(;wy=G(zf*qOoU$hYXRGghDvQ0AxO~Q^qH(VzpPDjS6=v6M zBlhKV?>R{kJRHt&sO9>5s*HpJ2wBqW{m7&oK}$<#_>&H_LVjSMK5!r#ljDEu7s1f! z2jr8QhAtKx$8}uS28;peQ-J^iBs^FeGTEEUSd^kS+{xE*1Y*rCW>h zMkOz4)Q^y}6^Fb%Dw!Ag zxV$oGZ%T;wnMI*Rf>q?uC!Cc>3JMMX|NZ`(iTm^Ck52MmWxl_Hbb$Wn zPB=}~;)OeZndk1GP5WMJv8NV}6)~3tBp6v4!aPc7O4xw#no9AA*-V#jv0~A5TmG^= zX1;F(?vV48DH*#F)#PWvZ9xC9sJKnR5dXz>AuC&CZromRNpkPYtAaJ2pn_?PQ|}Vm zzpiYk#Wv%3zy{biEc#?`&ZM?Zc~<(T1iB!<^p~8H&raG>d>^MOjc<>vkN)wN7IpB| zH_v4ryV~BYTcI*TH`&E~>I0DjBAK&XRLiU?rwRLK+^Es&>W$=DFPe4=0Y7#a!=%X`7}m2VhSdgh8GzXFb^zZ1}Pygge0dQBO`-yldT=mz+N_1cPg_)uJ6WC4zvmqLOt*$O&MhE{*^!a zzGDSvT9@3csS}0}R3p`XC{MWzHn%r;N$TGRl1%344R}>Zd4pxi5>pL$IV&0uSL2Ir zHdxnRw1{1zWJyKpNyMEIFvt-i2QJzXG=>sD4rgk|el*(O+%H6M7N2~Q$a&*cs~?0- zx|}M+U_M+0L8IZn(*b=_*u@RC|M}fM93(TrvB8H9OQn8 zf1l7FyXfPk3SyL7g;TpxB#`Z#XUjhJl9eJ>4AD8Mn;IiSdS=;&_w0p~TbtkI5f0GB zce@XF2a@s73Nq3m!YEtvoy*wd2w2A7fN;gCvkH~;Yyr2ZScznXp@)q7Hw8%X9|Hdj zBXs>pi$H@PgY%jTd+`LSA0NL>W`CbBf4LE~0%Jb@%rTi`9l!k|B!Thw&;Ndsf4A8? z#sa8d&dgg(Zlq)%;Xtz>-fo8Sj?YJP?A#M+i>AgYD3xp)L#y32q;5xN#_^2*z3`u@ zr@z>!{CplpzP!Uh#e_dH4o19Fw!jxACPy40(%vB?Msv#1G2Zkfq3z-6Snm|N%#bS& zPKn3Ra;U|3BXm$zNvi)pcM^y+mzVD0YbLD*I&2SlB@1Ti$!rfJ(frwBUHRv-sK|SP zb=H@36TKkVH(AyER-+g%#eIg-q*YqIYuJMZHnX`_uCl8mp0^!r=IP&nn88DgO%O!` z{&q=q+d-Gx2w|~jzaeXCAleeisK;uDs}u#uWDJxpqFsuQyo^UU07!E(r= zc*R6`w4yJCJ~X9^l}TSb@$+MNz;Z7mB-X8!)%Z&>6L4mT~KV6jCb-CMCYz~uSweLyR)aF$sT+ZKM7 zF7-kGUpEL%)X(1?8`l262M~g`FJT(lZ~R|l{=I@zSsd}7NZS9rEv^IUC*uD*#^2FG zg`*X85^~`FXXL-HUX?yefd0Qf!nOGSFP+dQ_{1cm{vI7QoUdT0vDQM_{ZwqNuaC^d)e?`% zw!d6>a>jYQdbuP)fFx8OK?>bco5;LY=tPT1xWW zb`1@<;1|F4yD^={tkZX10noF5r^Fx4U>+-2Ac{4fsCXTp(vIM#w)8}ckblyozrDyB z!F`maaUtFpisvojU=bKM&XU$J7u2_S!WO?xmD9Genbm-xZ8G;n#kVvdLn6D=1?Sn% z<)S;$-SlcG`_&vbIuM*x4S088UMc**V)m=}cY*=drcuN*1od#jRyyMf)g}by8yJcE zM&}>}(4R0jDkBu$9wrQMaN;sC5ep|7G=)74Q0SGmB*lr@sD5tyhKQ}d`Fh{c^%iz; zuNH2|NJxizVN_oA2dsdHto$F!zB;bTwP_bbKopRWkQ61Q5s*gd5D=8^F6oj+=@yWX zR8mkQAY4 z68Ny<+p&D^#R~C{dyz3O9oJ>F0L=A1|8jxgS?S;X8KS=9^Rwf3T^#lmeP25t zZe>!pOA6CVT87hc`SbQYOIIzQ65w&5Vqoak3z>DqS34umx!p~BR)Je{GH5a({{s8p z5#;jQN5X|&D>W#-)}Q44cCMb99o9)e@qJ`@Vt0bCUNN_aNq8{DONtZGr>9z!lGn;FavtA~vCvw}3jfk@^z9BAPTY@^rL zpe<8Qot8o&^Q7u`2u^uUhVLemZrvjrp77cma;!EL>f-F@3mZh0 zOx~dss$ov5X}YJvLqzoP=O`{^yY`Vl4jm7M|EtvrH_uhNQS(NdNON>9b((DJ%P|qn6<+De+Lkp*5lVrCR{l5rhZ5MJqxw*mb zoF!|b8^Lslce68d<=>rlC%|fas6>Bog_cXuH!KV@8gJs)LMr`bJt4b^na%G~Yq|Ei z2Wru*jgcB>Vfh*OUxnP8%{gtRlJN@@2(i4R6h5Og-6Y(d4ZYG|KrNTv7JXUWvB&&L zkBjFGPeYd8+Wq?qoUGON*Du|6`m}=|>b%dZ(OK~=VuihT(Ii9}ukFBmmBbyZ=ONH1 zu#02JQXlgCo}UVKawAsq<4k_-Dwm~oew|iFeuEKl#_P}y`{O9-ldWAX!?}=Gvvc!q z16l4ay%j5{w$%pHLxe`dg}#NOk>pJ2c1bKn=7OyRGN)*3S86wpmo*>ze>DkTcKzdt zvy1za`yisq@2uBaB(klul-vW?wab@5{2mqdo~b-TB?g!VuHacmzT1})a_E+I?!Nkx z2OqV^BeWiEh~mA7&dpU8C=~V}YS%iVcBsD$$X(*flCA12DKbj^EyYk_BPN>tb*nYK z^%igA8D}uc=Jl-1w|3sBMA3vJ?;cNGCEPY)jo!x@I-9ASW$aMDUFBh%5Ft^xH=JI6 zS=Fu?VZhk#WG!9I&1^ngieXiSHTP{1_3QxWtL%u@_K?w>W?K39l&K7ZwO}rJ{MEF= zmDbPN^SVy)=isxwVtiJuIB(u!aCz3rM3G`@e;|HwBhV^3y2)t7GT3gQnd!`leQVO2 zDo*(2Y?Ye1amF=;=s(8+atsvql-*uu{tDUQ=-zCH+WC!(&ha|Ql=Hy zbDQ!}Ec)X)E_+=g)6#E)R(m2VWiv!|Hr#H#z45M|aMfj^S)=L4nG=?RM|oTZNmH^U z%fj)YITO<_N9kY01O-I>Z*Un&6%`m-Yl$%L8?Ju|1vZw}s>j`>$F{MV8gxPh`t)#jIFGEG=LZ?hJ{Ver%?y z5!YeUe(g|>6BzRgjlANlAh^b{DO9XfgsS$)k0%+Ni~O!WM1T%~xgKQ((~~rB%k%K-qdPYhwKF0R?vZiWuV3$dFMVQc%1x%4Zu69A-y(Uu)?!&G z*p(fbs{f!@X6;L!vbz8K*#@>}dW^#6%ah+fEu?BJM?Ovq;L91fVO#mELGFs1_K`^+ ziYUd4qqUa|7mtn1?>>-!dDWAzsQO;pRf5a+r5zv24nPIsM0@QVoHfO*N(PEFx_biGBJy%WP1LP*1Lt7!K$`G)JeNc?5%WWX;N+kEEVGGc;`9`&@tGaH_paIroF7 ziR$xXo^68{M8hKW{keebb6#`geHQ-1Ksz3gIZ5Tns`k;w_~N17zAFb}@M7(&^mBx}WpZ6mb*_ih5ae z@iXonT6khevm~>i#Pzk@a@>5^7@}IRRP1kUU3>JDge6HvB>sybmu=z2l8QCo6@7s4 zKBFn-+EbYn2_C1Qiqg~4SN&v>C{1647t1Wu8mUjeGvt(KHos%M%QZXwtY+WnW|XgBhEK7p~usu&HEN=fmlyOECdJepOrR?0-BQ>vk-?#?e{sgq>TKH zN)9fjf5Pi$+Ha$lTbb8cXV=k9W9koB%ZLc=dzK%mC6&j1I7*h4m-kT@e_BBKPOYkj zb~>pmMDN|V#K4`{_iU@vl!`@Gk2G)AJR@`9W85p-ofS3g>|y@1fyG; zN>=9in0#E*uZ=eUh~~P(Rp8>m+Y*e*BzD#jle1Ob5A{YgZi8A(HY`2zHTeANhEunN zXKtZZ&UEk{H*;WA;iP}1pweiD&9K8}D2W2HhJL5XmZ z@7>8Epq`Kp^^KX?*-GWs+P}+f6ciN|{WlOA1ddx%DQ*X={S|hGZbzHsnpfsIDH5PP zknqS9yH8*bGdDLE(UKYo@jB2znB6=1sqxM8%(=>OMFgR)LCkJ&9b_9ESAPXV_3ZE>~8)_uqWo@ zqEAf4%sw{K!d-0J>U2u$i+9pCg|p30iL>Dk#2hKnVtYTX*|yFG^<-OK^P19BdGf-i zyKVbL^xT`Pvk!Evo2`?Do&@7lo+D(fSi;PHJGIFED9hZNaukB~D9<}KjxtO1u#CR* zyroKcbYf)4+RL|fzw-$gITlAr`iD#txdRHgyRQ8KzCq>pepkzpJ|WI(*kaCmPOEy; zL!5u=)>&wOm)~4U{g-rt09;{z{qSzTxA%2ly%x0!WY`TbJTo8;X{r$@Z4TBC?C9x1 zH`eo)>9}PYwkT%UfQ~UjJp)?d8?6jv6)z%ms2~Nvd$#_~ zu6h!od*HbI^G%j)eEN42DCdKPL>}1O2$~o2;F!3ADi?I)fIvIr{Tv9Z&4E6}^>pOW zU%y`JfL4~8XWQ;#w|d#DyP%gf8_HUT)UdRN4Elw0qZ8yvK(I%kcdj)wV{!6NkF>08=tVZPM)C)#Cu4PLTH3jt*T<0hsQi;? z`5O3124_x?h=_@e^&j78E3=xLo4XO%tmQPM{8h6&0-i4f#9OwZIW0>6y*|5ka!C&l z0fgeJot+&*h!8G1&K&Lv0nK{esf8yN5yLFOFS)H&SJs}TDO@@FeQ}E!--K`_G#5_MyrG!Cv>_OTG~&Wexo-kWq<=wbR>MNs^V(O#PPd|p?45LoyI&CwFCmRZ%)aQF#d z=i=1LZ>l$0mcuBuACFxmC|n3hMdj^PS?^yiuorLnzfpX^*K)aq^r|*T5MLz7w=j>R zOi5y~`(@d={Fd^;ssJ3MzdA0|N%;pvLn!``L$UIA;h1Ma(!at4!7Kok1aOh8L^#xdHR-)ZcI4CK8_` zJx3E3u%mTh6$}y9A<>-GmzGHV>bV+`;MaW`ofg{t@H}pJOxJb?gS_bbb>YLUng|(% z5cEYR)zR2eT=e!3=&;I{La=L8@*u2hy```*?yFN-re~AHM0Pk@sY*){_thEWb7Q1? zH^NBV$%&Hf?pu-2wp%9~R`VppdU1ym^_pHzoHgEDudt#oS`WFaYsuErRmh$j&hdu% z_;A&Oong9wxv)Vpu_3b@@>`1|zSMm>v)P@U|EXPFi^t%oe5N_t2 z-nLsU5@=7M`#|#OP7vDl&H5`Z7zn&u_dTFc7zu<;D1D~A&ccCewFlCK@rA zIRyhocs{Dgov$|F2}O`*({+LxmWL)%`$Rggsmg@obx1a5&(F5%QE+bh8*~#85vf+y zmK=dbWsuU%`sqG&N)MmGl?7dX?{-ANN+0Vy6e{(W#l(_8Uj0hZ@TPD z?)V&Sic)trgL!+XbkFQ}CI+(xXNG*z{Ej=GrP}kS$lR>V+PxvuM7xtN(>u_^@6lE~ zP1st}!^#})fkgQwp{I?fV`PtC6YE}nXb+utm$gYnv9B`P*=6}PYFP?KT={`<%P&so^uA)!~+S} z%R`scvXjLB!v*kYUinb*c9?ET*^Omcd-&+*;MMGfCAw0fxyvO}E#bzD$ygla*yVaF zy(vehd~4K59f|u)SpGB1kEnxvmXh;?J&M5>6{lJLm<6{u`Ft(WN3yNh_d5rKkGc*eMX-v zdz+>mnw*rlWk9z(6j0i#%=lUr&(u8!Mabv~Lo9GK;eZ4(TD)b?z(GPnD4402Ta&Mi z6q>@ReGW$@bRFU;s|9Ve=SoUVP;MZnr9}oQzc30xl0i|J}q{4AR1NYNx^rY#+ZX4=0`#g$C1KJ1j5 zjd|oO#OXV=G!9len1W)Jf}%c^ylE-Fcd>9w*MTOn=MGPH0W-Ccc`~gZv#&8Kh5RcD z$+efNi{*?Z^ttPw6c z(u=Nw@g(5~B;I!HJHf$7qZ*Gc=xqECd|LT+3z{%b8e(zWiLCaviIOU(x7zPgZiL!T zsmJ?1z|Q|9W!d$Ix}Pr`Yw^;?o$s5vr3koA4634kHzEq?*g{hU#0dm)qWZ6ctS95Xoi2F*^B4t;`11hnMdpjr(IiXuai zq1nij6hdAU%x&6ibD#sHwo&?L3!!#|S+mRtBvLU+ zIB$SbEvN$%3%q7a^Vo$wj1fHxyY^+Ch6P=C#Y;Yy&1YxM8)oBW%vR&yGepPZ60(>{ zEwt``p#3AydY2_P&eUVDh3&_~_64Fdkqx)hj^O*)C7~=;L1^JgMb?@^^){mt5sy2x zV`yy+BDrhq3?BV9F)A91_v@3NEndf@rHs{CtRa1PO0Cj~p0)SHd?`Z3h6FQTR(LQr zpMlTAXNsM@%0%*3&440mkgQZtzC%2QQ~te~)>~$#TCYa#@V^a@;5mxGevtjek<>VU z?^nbm>(SM+d7d2~_0^5yK9`08eKCusFWlKF`ow=z9*yxn(6-(G`1mzE8`&+d36H&= zbI@BZHik_{lr%UGlNP4khmVi%3N8ooYY3U76%^XpF!Av5E1{+f`88A=8?3397-1k$ zdY{|*I~`wmAwmCTQ?*tg z%0RFdrOiziTl+$=59PK1&e>Vnxb+uXVV=WLL&LST>3Z*V7tU9sY}}Mxpj;5vz1Xzj zJa1o#P^3kAy;-^BJQfF79`bX+A#xe%5iwYd=*h#0{W*~a`zslc*e1|;o7K)+QLAv# z1(;{8?nc2t!MQ#EWzJ!Z2Z3zvq%t8Ve+s1+U!qvvrnd6sMTqwo!E+Xxy@MOY3gR06 zR^#wcZyWW#Z-tI;0MEHVB}-pg8UwT`mCR{csMcW_E>&thnYgfEgoF^-1?^qKX5-jNeqc2r1j|6{*UvuO4(YFK zd{CdzSs238H;fdF+nlUc9lh#|p+g84|LIMUg;3bGQp+s=WVf3YBe1!6w#vZxpg*JY z#}6^fp5k_jYFTwJP^Z>%U5rJDbb}rQ+~FJ9qb2qXIZ7ank>2*@%3?0rnv^HTApb zXr+8XHpme!?M21Jh)PIEM^ES_wo^taopi;NdX z!@bP`v8+eADH8pk^Gdvz7V}Qs70#;nb{NOY^M)12-kExvx}U`ma!e$G!y`BqPb0$u zb_ra)sTVT1H?Bil4KCVa|q)4t^tcQjrs5j@|L_FAMby!}2KSUv3WGD6COyRok1+!!~ z8@qct?{yPfJdq#`>9@;>nI{Oi{^aik{dg*1s$qK&&^iYjx=t?IcNH-JfFH_`MgQ=j0mO^v;3q??T1tTWJN&+hq1S1g_iFEB)CaTZ z1nQiS53ixz{!!(m>}`2?R7S$kY227@EcS4+pun+O`KI-3C;HZ(vGRI}&BMPpDzeVs zu76>hrN1_81>ym!5AiH{o7p-#I~So_WK+p2>31kn4B}6pBBP@E|C4rSc(`jnAWbJ_ z0HG0ceLJKYyu5^fpNg1!fOcTTNlQubFm>mUsGWK*{p9MFqh`JF25%e5pJXlL5qn_$ zW%Td1sY_m06d}^6z8CH1i>) z-!U>7HiZK+8Xp_k;m;4_?U`57LEa7LC!xz@-;$`su%csPWZ8(D7VV`GkCV?5DdFw` zMi45+H7tQ6Bn3|*Fo;r=7~zxFE5@}I8FBsjU90}?x_}`)UOcwI+U@e;l|JqE^w#>F zwb~zAgXB(_Y!~cXQ@?_ARNg-1fGJtz-`Un~qY` z8+8_0$CgvoKOL!WYdL&M{x?Uxp4060<6d_OHBm?L9e12yKN?&Mobj@qGZYS$8XOU_ zYo$2NK1fKxiJS@tUh#?Bg3VPO>iUgnhqiUgo2yy-<}x66jox6*lav{bMu5 z^WfLkuUm0HX1deKZR+=bGCOVvzn7v{JC%QzoGcLHOCr-ud~4b}nLQ`1k>IiLvpN>< zX=a1p8>+UacMTKvXS&5+swarfUeoc`ySAk3#7gsdv})JEfnoo&dt-!~He4{~TjB9z z<1NB`-4;XEzQ)<!tFuS{hRQ=Z>@-HHnbdvpmOt;Ty`FisyAtd7S5wbP)|bzGt)Z1 zqemR@LsnJ(D8@!lx>1SG#)F``duTM2LVR4Wlr-#Om?!9tp<}&u;V{9rrj~m>IE3x&VI%7rMj0={{E_$X-L-9fqc7o0)fYx7vt(yux5nG-qhI4# zZm=8aWxX-@ra0%ocs0`7erRY!iuPagC485|?=Qn0T#U$JlAJ+l=pk$VyOcp%TADtK z`dBg8ndm$|%Y4bu;|wRSHJCUB?W3wE2I1(IR^$|$J1f4R*qxpbi9Yj>qIF!CR$2f+SvJq3hOwIwod$6$-g&S-|5b-pW7u_Lc*xW+ zka$)78LN!U{vQL5P5<|-g!|fg%#c;Y^hIJbX*f|dC%(MtXJW*NR}UqsbV9dj`e|yU zg$K3Uq83|&+lFI@c8RJbDgP|@pUY{{QeN--c0O`LD=(ivzxJdrreL9Qo{UMO2G57l zhNN}mc5>gTz1^20Ece*CEd1Q7wFt{&$AKF+7he8Db(y22LB_Eoj#i07tjAGdKrX?a zVP=>R}?VG#(cm2{!5+uEIMx3+9g=#?D!JtS+AUR$g_I6pp<;NZv9-(`-U zd0+E_G4^|q)>*x3!v1JG8ULX(3tt(thGd`>;TeloQIri)ei+ugzBp4Awm@8!wKOSQ zKTyXN;ZYyBF)%PR&hPw6;E=brX2~`;NQD0Qr7C%(JX^PhpV`RmrI+`Q;s5NO4&10O z`nr|jDECEk?CFRT2gaDjfQ$mclJle+NcWjxP+AAD4(>$>~> zX!PZ0p4oL--U3U}o1rLN1$Y`Lxxg&a^=xCqj8WNH=~H6$5Yb6hC; zF!};c=7y49FDE+-xD20pTs25X^PDkMEXbkVPL&#AArDgH7AkBFy%i^o1YE-wsxP3k z4x&{`FJD5ZqtC-#7UN~$QG-Oc(u)_j$6Upg1hLm;GX4*1PqbnEM= z5$A)QPsOD5EB7ltd7eWT)U*5SV|}@Ty|bU~@R#35HRpPcvl$JL*0`_jygwG@dKg8J z_-UlB<9S1bAMeg_;fK7{T{$7Lc-jv|!^Nt$P1 zeyl7k<@h)#&ZKc3MjZf7TC)VSSO^lkKO{sMq!f~wnb~Zhbg=)P`dWK^Qz8-H>=$pL z6tsv-$uzXQ2+_|d1FvPTk&BRNz!=cr!t?~8nAM})8&aHMd1!kj?CwHAsqA{_eeRIP z`zYp_3f`d}9*$9zviNoJ(7Ctg6EdxmzmW%Gxt4vIbVtO%G{hAgxnYJ7hi z@;QiJD)v4Ow|exuBER)+qc{gIZ@(}uPrMl zj;g4@(ViX4wq9Ubw8*Sz$9iOz-dQ2xz=!&jj$xMRr1UH`hV(&H%Ptw#>+lME7 z_9iR>g6|bgI5`H+f25vpw5M_v=r`39b`Vz_wdb&B>T(ORCdpbE-KCJrB#&3| zD8A-)XwFl>A9t{v+)LEWeJyX$?fDk|IC^(#3$f_t%%kHxC3aj~+^A;B&fD;RT--6r zFT65(`j~f^7k<2u?B}m$M5Pn#oui{wRDLln(!5|lhN7_h!{KUSNs{HkPdm=1;dg>$ z72A=&tUw%fmu&GHw#M%E7h7$j5hvH>2_v*@ryMQ)zgI^5C(2}i>A@3Q?TP)=3FkAb z375X`^Z8*)_LZY=Qu6!Xf3n@>bMDrkd1qL;HAIm7a#tuO?NTG34*THl&s)QV=4Ju> zarx6)Z4FcEK3$K=9}1uL43agXrCu_9)odrrBv#c>|0iZ z=MNdgjqt41Cx3?H`w;uG^Gje8-w1>pwH>|7`OAdYn51vWkh&7SV^0aq^JulVe!e+O zRgxldkBjT+C!GJ>f0Ri-69x`Z=)wZhCq43l#YPz!sY@p?e&v@6Zy1J{bDMn zriLXpri#?dp|zDw4^Mb2r{X`46C|}~7O*yn#h`*4!;<(Txz&~FVw)0^_r$*BYPx5C zFEF^Qp^`X4&=gPb>$S_n^=GG7eS+^RPaKuTgB1$8#Unl1&d>T5R#y6K|I|9DUoK=N zqAcJnzcv!ii>qz_R@l3gQ}0b=y7B_+!Dq4mekDGA6ozDn@xeKaBC6Tp_N4rWq{irFDX zuWfKg?LXs(Yfe!%j;U%EnC``r;DK`G@SQT!?(-KcC0%9m$0=E>1L59$0U<^Iee_c6 zGV|-YcXYv4CM^8fsF|9*aivgQ|#m;dWm1668eR*X0Q z_iyslyy|ro|2w&`I#pWj$t3@u-*B|i|KIN_J-Hra%z*q$gZ_gH&oo`!+n-GlfmZHF zs*V4>)Yz?R=J*DC?a{J)Ki55>r&$eiN$rM;Dk{C_C%1yc(r%)f+?>_p2=`Zr1IWS^fFY_3xVgFfdC@C*=BKF-+Wv2G%4@7_u?gTaK?aZ1WR-w)VUs`2bzU;Ac(Gua94iB0<^Krp`!pf$Y)dHGu(Q-}ZUl^*(5Wa;Q$o zPlmnq$hu$+4?FO7C#p%{Zn2oy!pzuBu#1MrtxoOqg$C-!MEWJLYfs-V_J)#e6n6yXz$ z|IA&KD4;3VN1Rqhiw$EI(2K@5B*Mx6gr{sdIXNvXE#YILAp?-{2?Xq`tyG^sf5Ju_ z7CZ18-w-n^D+_QLgD@({901CU1oKHxPk#^arlT{+a#G>knBl>OTcD<)nLRoigT$II z`t3Gi2--2|Fw=!VSF=PzGSAee(HcPV*!G?K121b6O0l21xbF5GJHGcp# zqlK|U2Xzq5M2r^*Re(B7NJxmm&Psm1rhY9$AeGLgWzs~H`6!M z=!l9083GVMzxHtgu@%PA{E+|NLvt}tS3Sy`tyc&)~1VYq>U30xRJ z`LFANblR_>p?Q11WDuFtFU2#@nzkr>i1O6p2xPfABboqmdk>%YhrwLSCX9-mJqk2#l$4Z^ zKIi5(t{o^TDn3BoT|Guq~ozHRk2`5QbRh3)hIQli@ zyu7^8I?prfGsDUuKNuMq0n5bk z$=OiFMz81d@R*D(bL;nJoL!Kq2kb3`hMa^;{&k&$lHpSOM7sI3<1-X!Dm@Ps#u@3V2r2Zr5Q4U27xm>h3;LljwFr zFtsArssPRdB!-Oi(~cFikJB1y-8vflBpOJ&<}AnaM3e)j3MX7*WukJ=i?ZIXo)jMg z61-u-lK}y^G(}6-Ma<0^03Y|dI7P!+p?Hf!r9Xk3?+OhWU8bT6l^$@Oh-573dmur zh~38>7#uuG{EUYi<(qT8qkN`H53?e|w?F=c2W87Pp^mE)1zoB)l{S6@DktG8j{j>( zCi3?FNS?o&)cggkV0CqMM2o=1?)aGK=(kqma6-V;NRm6vE?7 zmeJk`n9q-}1&J zw{Ncj;Y}QHenyqA2)hA?!Q(@efWM(c; zsEaMISzLk}5ED&y@1?37+j{AQ{4%*H7b~ezf}$;n^$OYd)YnFs{x(-}589@>!^?G> zTSD6%dMquECr<KftLl=4TNck4PikQvb@N78P3H!8{?vG8MYA^oz zQv$R_XmQ765?)weP=FoTE(&7~mPB1$8iM^dPwo-6!!W|m1-V?H$G1oX5gSg5oILsu z7XTg=PDfODUwZ^Ol)@4l8hCHn7(w_$mTV&L^I9tJ63@GhzU}G~|I)d&|JU^g%#W1X zwr6b=mKM7VrTb(QyMr~ySA-8$J&Jl3(KlvYTq4^?Yb)-r4@{!O1-v0E{ZKEE>K}X| zEu)~q_Sb-A%9U90b7LG8I5VpcCCrQ-2vtw@Z5=(n%M3)!#2>Q7U)q8zkDT3Y`o5K) zi8R-cpSks>z_QznySH=VQ5`$+I|(Y6X@gU=Wo^FOOnarVPrz7gti0YhB_WC5V8Xf4 z5=|BE9MRt^otjcU`C>puObol$B;|UoHh<`&z_7WFiI;eS0Vy)nW%Sq$rys&jm64N# z&IE@Rhb(yQ^44po74;?T?au;~2zh#6yzw{4((WNFM=6c(Ny1Gp->0i9|K}7F%jD(iyMd!{ zEsIjH!?@6SX0M$!J3V_*hrv2*cC%lQ=j^1Ax0>-CaRXQQ!Cmd|A9-H9c!ADO`@-`5 za(Qmt^RA){FURYwix4!D#7ih$j~@Pb+@K}esQT$D0{A= z(@LbE&`j>gu=$5qh9USr^9Ru@^V(T0_jqpMf@FP4>jxLkeQx&{CD-G*)K}#EzQS4@ z3BUC|i=%ezzLp+U>}q#vT(h%%OQqdUQOFmz_$Nw8KJA=dx3?mMjzu`4$G31%(i5Na za$awWt}OogIBE3;Rfr}fa_h_gK5t_1hF9OgiS`IpzNhMd^Tc6R>4P`)QwxWV=4moc zYy;^igdKblq&a!p$~E?H(Elh8xUSyre05|gpK43q$Z7+NDvY*V*l6H1Y%ZX4=%(L) z9tBonHE*ipQl>2D%RZleq9}JGyiaD`1y7AIGZ&IOwycE}nd#)YvU#!v1!Bx^Z`s=} zzUw5jCA{K)V)q|+95?EZ;p3xQLBEt8W~~(T(+~Wb68)b3_ugSM>3pMm!WLlbnG*3o z9}EVABe7faf4xkDoaV{@`Z04z@!J3TQSATs&&6TvA#eZtoB-WCjGO2Ae|}@-1qVd# z&4h@ob>T7!)KC83oeD?LwEl_F5Fd^R@RE`2v`6b|-vf2*cE8!ne5wdn0Sa(W)N77q z??)9~vkx-V)YAIV#I+0-@bY3oQtaegX~QwE(({ ze%WN4tlnLeyLUH;`S#VmXRCbt`Zakzf;9aJ8QLu(uihekQGy^sCj(_M9E&Cqgg(B#h zm7PlM+3+n(8!=P&fU+&(Qub0_nyW5Z@CpyoGA{v$)@LCOgopy11pFJV+P(v6ycu9}k57*T&FeBTWA!dV6_9Y%-bPqd2B*?{KsbDj-+a1H3;LuTv1A==- zY3ch|M%97grBuWNMWL9EbKfFl3c9cw=SG5W8s>NCpTOly6yioK5r~1k6gUOYSu9B_ zY6$>rCZ@2I(!Y=#Sr7yOv>8F+?C;~^R+~uRYGbUjs?R)JNX$s5A9gbm_%%DdEvem4 zItremw^F)?)3A2H&8rwLcHePxf>)*L?~+`2Vq{{%U0KxTqz#vQc?l}wBEUFd60 zzc{eB+5TRB!Pd4NQ}6L6+ubZfmnE*XNWb}WVPU%+D0kzSo0|inRQI2lmsbzmJbZZ` zCuBwMG`9xeSni{~d)MrN9<^v-bUNG>2w~?mG1Z!GM{>k_yo-5!I;Yf(ty09n{ zS)X0a534>BymUK3vRHe-Lu{d;xBEaMzPS8mW9#kW#LM$nQr9AGsT`%T-M`2=ce18> z9I-0nfE8kawOKK%ptX1Wo3>k^?mB8VR;WYSq`lX857)Oh~CZ;a`P4-+sH^p2-iJmrxZ@U#aj7JZ1BShBgJf&7X_UBgSoP_ z?_;^tRg@HERhBRt#HHVDb;N|BS1hfRFB>2`&SaTde`?Q)Y`Thg;qe>N?hxwDflOvo z2@^ynP||O@zubQ_0&$aM#|)M1;AyeJULVa|Dzkdzysn0ahsR0s&t5P2x>bKOjuflk za(N}J+U$P4=Q@_q>7YWTXH!-MMldtKMgdCZPjaCm?a12y*Zmx7O)k;u=r#r!Qb z7Vi8SGS(!$WFx%tykyyB)3TGu)=(hh5M(uewq#)KX2KBnM)|5Dgy4|j8AV+17ph<|9*`6>HWn^?rZ;{ad4H);5N5_n)R~fHoriHLJ+uKuL{>R&67O z7^dKsCETe|{ntPAZ;Zo4*^Ht-e2_Mg;J7-Pxu7O)0h#o0IbS>OHKp*6EY+MRMuU9i8AX?>O%% zHl;V_8Nl7pDJ<^{wxGuQ1n~;k5>zR~Fk!2in3%-evV?uj%q+K9`1gJiv#!SpbEPE7 zca289EOHI}c4E<+1~H74EAlnBuuA+9Cy;H6{+`BOrW>LmFYstGAyyS|!inp)6x!fRD^YPWJ8G7gv3YY_wO3c~4%0$Cn1TCgCX_{{hZER4>C7t99qKDYyt za9HASY1{`AEq|^fcKjH)DFq3i84G6$8Se{NR_bB)+Xf~6?ix+TypI?71DPd;n~EfS z00?!!Sd@gOJYYWo(^7u(kGaUQD{bdpN)`pC4p5^2X##l9JR*cJa3EVQNv+C}ft=6r zBlL><3oTf2gq)rc0>}q5)Vz|+4i#e%k!{ze$-)sb0HDKGsVCqGfd4@S%_J$D^db0>BT?C2)`X!AQa^Q@v$dLk|MZoDRgZ? z(%6^=lo=q{+CH9-bU+l~yno*U6_1HrC$l`*P??wEu+&TDGGPboHJ_Fiu`u=@NsqVO zU9q6_2WUln&g;kdW#cDvQ;42pOTt&`He|TC$cg6HVNaG~6|A*g#JVC(*g%PwYMZ;T zL|>{Pg8T+B!K)GoGB+Hq>SgU0#;xIuMM6bIEjC7!yyYa@--M4f{`FZgkc(TVFdinV zU4{|m%;Vzw_wNt_wr-LJiygXM7CSH<62$+Z@PBaseqdY{4p?ISlefhPNB{)FUyYZ^ z(cvOKeK&>JFi0W;{EHWmE1l=DI~%v}P3DCcgnM6|O;_jdop>N2C}02%KXTdB3S;*G zo-ncD>*Lu#mmgUcJWxtyI6gEy+=fRK9*hF8tDGEG8?klO3N1oR!0V)27l2(lxydz%SB1ORPq!-$JTFw&7Ah{r4v* zfnn0AAvVN}6g(sb;u^R+t(*LSEt>QswkEI}vbEX%U~dPI1fBy(nz)hezU%?O?f>+uR1~&qD;SK)9M~IxI+v z>>B|fwYq!0-IYCZh+8=HrXY z3R0{R`$ZWjH7p%D0Hp4wzgn#uSN+9?O)hv6OM5%OI%NkU)aa#-^O!Ms6luoYaj>fT z%}P5BA!9x2+1=FzkA?;{Et~~w9OeVm0Ll<0tr>cQdB>-dH-fgTNQj1ZcJpmqcR$&| z6Tx#d0~1~WDj&hlqL4@!!IL6**W6Yl;^N|tD+B(ks}^vZ;Iz!m835Z?43_wtCq95U zC#I*TkM60ye95NYbX~_|M;tM<4R28Ha#`E~<}f>OwP|T+vZVRpm`MkG{Qdhoa34T4 z%am)f6abq6fNZ?j6{{9k=Z3I;3k}c$jxNnZgp;JT%nBH(c4R^) z3-|&Q3KJWB0N_Z=$xT|FKpKFafx(=k#CUU}vRIJ{K9ufg%H3wY{1Euc4N#cA1Y*nc5(y8Hm4HGYe=2B|^aG^G_f z?<5Gi!%jxlf)vmBZhUW$=wS{LZ~jQIo@hX93>dG7Zk%JO=YtghXw3k{MwS7dz;=eIrVY`FqHO94B`iu@dU@ps$iznZSA?G)#1OPGvn4Mm35 z(tsF#T+yP1B|PU+f2RHF3eNb%SLKk(fwYw28X%WQFid02xTQH2>sn2nYX_TUuXMpj zl#OG8GFDU{0ODULDmI4QeS}zfkX=E@DF_hJdxhRmyHgy+B7Aky=Q{HS-6y~=hCKi}K5T=N*-(LAx2$ z6Cfze08tr_ARK{QA_THi2__T{eo z{tV>T2SciNA6sj^as|}Yt6tdIeZ-T0rv?Aye6R1MQ^D))T2(Qx0HT^0hJ4+tjTlN% zCXF;loD3s3s#pM~ZFn5~4#jRUR&^Kd4apYv3ABxC2Y&b1f>6Xf1YL+CFxYu8HBd~} z1b^s6DCj~JR~v|3|6cgMY31$Wc@Zvs+Xsw2+<2MQmJ16pL{d-^0VRT($50k=JW_v2 zFplV}yyZkGFR&wKVPQcm>?MHMz+hzE9)tw7Fd&@sDAC^e9oq@Jc11`Xe0iD-KsRuv zV-apUL|Jg?@mwCy+mX?6kND5?U{VSRu+U{&1HA2hxtDg*AL-R{b-8sF4Snx)bSNM< zT6|%i+))#?RwV#KBCy->pyulG44OMdD`rU8oh-(qV0GgA0E>MWak7D;W=olG04`OZ z;1L-F(*gieA}R}vewUiNdw7PA*T5=Atbhrp5p7~aMB!rPdPz43wU`fP7ekd#LFFG3 zND8)sHFrJRC@*FTh1!Ei*oA@0UsQ@6SCr5&iIEx*Bd2Lo+bVc8(M+W40o`!~MA(Q0 zK2oc|493tYm>jN;A*v>!TWly4Q(~A&MIa08{dfe9^(MO)$S3pM7COGyPUe95<_VGy zl$ikY2$Q8|TO^KI^Y4YB0vD=h1x}YU&ewFW5S(KsjZ(A72dc2fyvz`%E}1>#*C+(t z-le9>|Kp3mQL=G#llkv3r&JcmLXRdy$sU}LknV)U7}S{9X~r!R)gPlG>WIsyz4#HQ zFktCWcODsxPj?Mc%|nPcCqmo|CkkTBZupD9 zLF)j;8ts1yU;yC)N@{8y;J0^yV^IO>>4xK*=K|2*@q9l=*!a(n55$JVP?QR}&;6A_ z^yBOr5Ep$0<)P3+9FeFis9Jr96d`!1mWqHiZr(g@ro3!`0-ZO237DF`0L9Vw3@;J@ z0RXN%HO>uir#}d|+OInSKrSmgU((GIT3Z01IEClFqK@~46JjJ83u~HCiL{V>rngLC ziB33=TS1P;wwt*eaWo(fp>Z#0)cP!uGZ<#`d#8{Mcna`cEW9xqpno`4t~dPrBns#L zWfP(t5(@O%5W3TvUlH>#YIT7kKtU%LBRJU76}aOo;=o;6QI`5{#%4$KGNYd!k~fgh znyD&S{e!>>I$Y*>u;Cynp8|UDe}I3k)dtMS`!n!lVehVUyowS* zk-ve#cva0ch(Sj5yyccU*}%n_a;uuy0w>wgIe~GI?N;$m!bjk=_{DI)9OvG>J09z$ zzFfJ6S-=i>&v=B zy?43EfP{X?4#`Nf#T9uz&ug;7@qt`SrMQfcG|mz@8>G|&y}@F%cdpvneS!xBo9eS8 z`NX%|BygMOGuoN{LwDf8b-m4O$47dEk1kPk!Gy>TgI}J0w~i#2LW`Z4uSnt}K;=i1 zsP=3BLvUa8dv{7sQS&mrC(CT?jJdJ5a5E5oKogVX9{&GkrlY0DmR>m>lPT&;w&^4O zPq51=$Afn6%4Z?n+Y61}>;D5k!#H!3EeSN`@4c+KdTKoVoMpqtGONQ8vtz%HnW=)>Gt9aD zQKqHwm$(#>gwvoT*-EdL)if2sk_bU*(r-~zzJVjZ)WqzU;_UW*+tHE@cG9#ic^2Tu z3ghWamM`5iKeM2Uy4W%I{>MzAl_Bq0a=fYR#r-4G>-grMYb-MN&8x^`{dKb=9}7+0 z;Bnx&{~#N!l5Mx26gfp{Tm5y@ ztR{nuSAm=}dtAjhnOVc$VL%q$atd_C8ZTga*Zz9QB99Erk>fosObY@diPAIOk) zGdQ^B(;T5s>uFChmK-{|hUdEZkEmDu`IFr6oMQPrNsM^f^=F_+3bEME40$z^Etxep z+v{WC&QSmF^XgK4T85s)aNQ6c`+4K%E3buDvXX;Q_sMkjOm6l&tiFEP3k~+J<{){U zS?v}}m_|t`gDlh16jiOKrlz==8B;}Tf~bscMAQJr#-#gY_jnJaUQ{;H4PCeJUIIQc8z&6!%e}W3QaI&Hx+Wmv8BqWY(Fj{jv zN?Ssa6rJ=Dv)}3z>t-cyj#JHN-@PaXVD=x5WDcYs9F#*r*L6hx-gGl> z3Vf^?0aO4bW$P`9t;L>zN(D6{Ilh0JX!i5a(^l%Gd*(W94lh~WNIV!*jw zgE4nk#@a}&Q?9H-ZwyyLXK=~FW->i&{OlJW^Qv;g22M9Mb;Fo-q8?^wCoUC=myjDf z*=_|(Srq}TY!)-}kM&j$=_U&F-LSyjC+q7QjPIrG9sO&$hJDeuR7+jCB~=#mgd$x_ zY&qn-#r}I>SF3%RCYN5`+3>qzj&5;JyT0&l#v^>DRMv}IS0!F0w*)u6e9+XJBB@rO zdll+T>A|)#6*aYrvBKkHXXpvk&3H4jvuVjEYaX+Z25ml}EUbE5d-xs@^gBWBeF};& zPzPQBAmrfkKQUQlwo&v@P%xo6fJi}Exm2AjD>pY4dMzNJD4%HYYB081)h=Bo{Vvum z@buoK(P!-kQX;=ow(1q%K5A!S$}|mbxVm|`K}`9DGlg24uzGu$-47ssKa_p%pt$lN|c=4+#^O1HD7m>%(vzwoaU$hX@$;A3W$pG@i z({)2Z8r=|z$s;w}XtOJj(?dQ*W;zsD1#uq0OT8JUiQ&vU>dq~rP z0tzOn1OW<9?^{Hl;QK;p08@9w_6PC?)PvU4VJ_&hxoekX%eQ^$*b)n;ruN;`MLK=Jxd~*f zeGF4t9a&B(#f|7mSAKq%r@)+h64oMXbro4M&uP0-=;-CY@|o~G`9wc8 zkuLH;z%5Ep!x2Bu8M|JOr*Fq6t-}5J&4w4Zs$Pw&me*5FP5A-!M@%C#>I|>$6O~oF zcWhCHy=Eyv^mOIkX};_oquo|&yZLgLkFMwCng0Lo_u_jb8EsxwanIcH1Aj>;7_o~TA-wXi49aNtRP+n;KKWf53~jl=r#Iq?qrVY;`3aHV6AjX#x3UZyMv-= zl%Rxe2_hSs7l3X6ncnDO>a_$Ke`-QqobD7b-qOQ#n6OhZoq(FL4JzS!`1XHJ&H#c0 zCd}~L**9v032yr&f23#imY|P*^$S$8&^eZxjeX{IFpn`-4|~xl(gehqVY7*@0wBdM zoYYE^WoO-Tzvy1|da>$&zGpY!dfF0T`Y>m)(}g*?xG-1bn(@+XKY(ES0=P=wT6qqj89s z28!Mj+vS&FPyqBSSQ+s!q*0}x2R0ZmV+vXk2)?qC)aWyr9yDCl&~gA_2|?*tL6c9{ zJ@V@GY|A6<+c!@^sG!YKrD4Pr)Jo~XXpgAA$8zvh0bVLc+CR-`uyM2kTQ4-Mo!{W_ zc)Qi=0VCu5X4O_IG{l4ENJD`vKNy$%kahoy2iV5C^6etvLqRLk*4<6d&HV*zI^HI1 z!FGcZAK=`-@Rv)!lny`{4#&yQ9xLjr6H&q4_w3kp&hl_$C`ou?KSvI3$%IbWNl zoP%^~s!`3*m2?4?urg9akA|EgXn^SgEp&q}q-@6wXso>{x1jF7Qfg+?O5uQp6)xy8 zW%I|K3W3I;6E16QYfw)DT;L15C7_0?R@pOwAon|TAO(AfYY%)km^Nnsbom+3!XQAT zaM1FGI&eG=h0y>UzK%<_pcD8Vs6~t#<)Ofcgf&Sd8QjDReF4yh0D6Gc46Ms0=;sQi z1f~Iq9!~cwowe{dA%o4qgP>f{o+>ISaj0GVxb^tYY`|kqhWm6FE#{jz(}Ras0bhe( z7^01bP{&&$ZRBqjS)lZOv%((F%B}PVxTjU(?^EF^ML^f)w)0(&tYuI$UUVS@*RQ~n zO!l}qui_7Rk}7VvnM+XxP;+Hvr83DJ(w_s2@C1%+@WbMRbw9W|HsEyw&vE&?FAS(} zf%}GAxLy?u*U zIQv^a2h(pM)x>RMW+22uPkUeJ`Kucpg|7@+|YqD+O{afC5cXYEc9ylMk7gf;7k1Dw#{oxJEe1vHRdE{!T*H+uS4P%HiX6r^0ePc@+ITW<< z;93FW1c>yZFSzov>;6jMlj^-e^{0)o3}zpn&=G!sO%@2Ps7=`kdug~PUS6R^spx;o zj2AYsxGptXfE~eOQGELRRTy{;+~-IUL9A?kcSMZjE;#Djg#m?6Y6QaWFUl?Ilp z4G0(o8wcoov*}5}mq_342?7?YVbx3k$(-NCS({4Dzz+feFTvVw$%oAR8(@9~^Wr9Z zfKXfYh!D+e7oUH5CmKln4Cb7GTNX^Q1%Xtw0&slfVZ+e>E;;s2!o{gC;4hyoQNIvR zH1HV7tNwcv?G_QUK7a*iRYCXOGR2Lx5F=0;EEUvhdeY%~Q8&WZhJ+xF-=XYN!0JYT zNGO1~CLKQj==%u(_k3wLWjB~KAe#t4S=?5uaxlU|0KVR2Ggt6u199Lt9sLn_n|stA zp6vf)rhFB-i+dNsTHfIrd)pSIuyg&_tq)h)JwlGPqgKK5XDIT;pEMzXoohgYC+4+h z1RDHco6#62blwPTjU1(5pYZ<2j~~O4BLHZ65c4~;Lx?R|NA%+*xNK5kO!u_Ws~d*h zO@)jyJS()wW(7&G6?vLcP~d3EoZac+Heh1DFw`h*FP#SmFlZQKigQF^+Xj+zvzDH& zq$MoQ_);xG+7lqK_w5NTkTVHBLBz)mbo)(}uB6K`V?H^um_{ z9ALJu;k=Rp?808Ke*o}?Q1WIxEU;4;Ht7I@3P6e_fP3ql_mY{w9|3Xnm<{nbrGZhK zuj^1J3@TBfvKBh)|`cfUTHW*THm^x$e{&e*YaV98@MW2Wtaq zo;1y&g^%>{erFS-JUIYIJAyseLAeDKZ!kD}T-s%)nJN?44i#cdF^3-JV}SO;&33@7 zgqYi!767ck2@4QkfJscTQd6&;=4SaEHvA5rh`NkGE+=j{Wmox~ceQ&GMO-u-`sKu) z0Di^aqI{VQJMhkbXCWMiy{Y8E!NOyuW50g3)JUIBe&y9aD6t4y+qX@)9MqP3V1iXJ zJ|>VpS8L$zQ=%y6IU^6rc&`*VIm zHH}(*5oib`Td*%0ub^7NSfG9r2yxZ1aBp2rYIe1+fP>zui`(#jlq0M8IETreX5jMN zi3Zk5c2Spq)sR`)f{s(m(=-_h?!A76{`czd4klx=^qf9JjF$&OXu6ts72K2_L6ht% zkno-wdG&Yb&8s#zVN`&B9eS}xFslj@onu3vMajenIGVX#*fB0VHByxBFj@Ql@^don zKqNG6VQ29Kg6;4&*p`g<3B( zV64#69oAbJNsGKah}1>J-nia+HJ1PNuU=HbXJ(o^NAUs}5vKTnC=i8IT#*c4{s$zz zD6-Q0^yzZ8+Nl7SbZuxDeM0+vm5E=!90XE%R%cu`nAr&|hfR`~z(LhLKNp$exN%wV%kCkcEB6Tjp;`KmwGkJu^$7O(@&^Io7EU3% ziXMIWymEIkm3zJmV+@Mi`5pLAA=OLD@IPr(CmjRFyO^$D3r$67zulXzxL-`?kxWjs zUQD8bQX<{?2+MOntX;~Lv|TDp%MF-ARYeQgX~xEN+t^oZY!YkER$})o2e)3U7akc6 zIhqLcXkHw7TWv9Cv*CU`KZ}whZ#6q~!C6w73=FPz*ecQ3^L3)V>RPbTyKWZi*07+M z>`-q_FN1Fy=}zr2MkOnvok(m1}^&XN)qw<+OD(vFq*U(_uTaLHEOZ263_m zr*i1`;%QH1u(FgH^%jmhX;ZF{E-vL`Dvg!N%M(!dD0IMU#?8dC*(lnn*!z{+-!E3+ zihd_uZ_nRgKIc)e+1StKmbrj@-4%}!MM}E1tr7k(y?PE#ar;n%3r(SC#-aLkLB0PD zi#y$>|5#J7+83uKcc0AVb+aBWd3+DaNY3WOd`f#KHJ7k{`d0Gx&u-prgZ=KK)fD6rQHY+U=Bcibi1)N}y}%SZI<*+GYRDq-67Y!4v;6ff>4C=ajT=eso&G8o zsgs9}r-4$FZ8cGeWvO#is3?wGhSmdeB#INe40+Nk-IXC1O`f+X=RZ@sF=(CN==vR_ z#=FM6N?}P(RHb`cj8?jSEQ4lkh{$S#?UvIYU;dB%?lz3%t-`i_ytFvAehu{TzlIWi z&AqR4{k1E3O`{E?}n354pBR95L!e8qLQE1EGQNFLgYE33*jf4R%7mSV0ls_l|E#k?(NU!dqZ zTbQ~*>%8rFhJ}~GgXEf7u#))E$2Q=S+&ze7rAd*9?M?M<`2xx zPnY8P>e6M={h`hs(?a*sJO7KnV@KEyG9=G5SzbhksVHd4*S`;0Dq8I$Qac#5m1v|4 zT$`2b)^3aSK258R$D$IHWtZRi7q*?AdAdEfWs^o9E>6Fzb>-?68o#@Km;C*QpWZIW z#vnw3oY$zy3g^`SW+O9>Jp?U-!Bal{C??a?R2y< zM!?8$b7#kgkFeI3L-w^3x`<}8)|4=n=6f5prb$KPl2Cg>&7xssvqcsFX=AZxlUv zRAT8=y{@rCQ6#8Uzlind8TSp51A>PJ^(6#S#-AdB3AXA|5m!|?T z5?RZOSA_3m{r8y*@B0v=&lajYS!-5#P)c6l9Be>JTgnsPAr>oz%I31RHcFF2#pjro&vk=r$vdtHr(+c$1>QI+hlk$1`% zwh+a9;Yi0)uTAJ2Qg`sQMQo^W6J-c>_`l4#R2*r~IFws#$lldQyBSgtgmHe3%b%Md zq;mCvH)ZCJV*HyX-IpfpBaGi)^1k81^EjK|Tc9K@Rp$#Gb6M43{idfNuG*FHON}fI zD?$To$GpUU^mOP8e{zR$2<+Rk7_AOn{YjIca3B!DYBX};>TGja)~z;jTKKW$NW{SB zXM(6ZN3(5`sDnv^)3u~B5-SOec=x@kw>0edGcWVI!aAb(-!*q@HROxGX5DFYs4%eP zig!NhBfURu`8%W{jnR}OjJV45=3B+8dtB)g`v)YpcHY0`%45xYDU^N^zy4?PaXW7v z>+g3NRdxr?H6doxo4?7|wRT9ZPHave2VCPQ#KsL+57?TE3-EAz)8fr^qw_Fo@ss>RSo zTqHWo$zSa(c7$^Hv)7L*Fp!TAG+YRr#NP_xR=c!Y6}eN_o%NYj50zDS?0J7IbD3+N zyi(t3{to07Q9rMdqIo_RcCgcHHf1B7K*#rFmo*nP=g7(IOom3o>cMbcc(eUxOUmM%n z&?QcT*yW=>rrI9s%T5R7xR}5D6g5#^bQH~JB=D_er9)z`PRu9>3It@90^LIIo*Z*>zHLc5f z%=RA$&`0YT)0 zSl6#Rc=4Dbk><}bn%5q={|KAC|BWoYUn_f5Q`E`{O+^APirv1`~o zx0Oz)Nd*+{=vd3)TS7tI0mV-f_l`Ae?`58{uc_icj6H4Nsww9Ti=}-GjF0w_Aj9B| z6X`oT@BON@)&DuOYr{@+Db={eU_Ei_-izp&E_h-#NLS3w? zlb9(i&#*LTKVa1wXB9W^y=m~}bAd$sz2!VKSwg*YTZ*XLbT7}>URbkfct?%<1U%k& zn%^!v93~a>M*DM}z0{S5m&qMgk8F#iG9Pv%d6UL|WGLQ#h}qX9lw`cdshWCQZM0FI z-FW1h)aAay0<-Ng*P2IP!mCPX%T1XLrJNIDUcU|^$;>>k#G1HUV=%^la#)f`n!ejN zlgzgA{#{)%nnjF&#`q-Y31&M?)#eVF`tIeZndIL)NzdHv+i&`A+eG{Fm1kA+4UOK> zd&KF9N(b%_6k1#Y<*KS@OB*hCvSR#HE&q8g)C)R-L;a+BHd<=A&tgPt|=)H^S(9XlE&*}FBm)U zpxOY=b@_5)0N4X8eZUcz{tUkMyGp(MSg!v`iz&bw^TtyCMeHL0{zX9YV8Wje9SxqE zKwV0G#`_aHN}J^c@XtUp3#d}Ri&T`s_ciC7YirAU8bkXvc~4UCVfK^)fVUM<8c2u% zMLck+#cI?BzF9E{qbG-8bOCY}LX)PDmg@ZcP!Jyj1bXEoSoC-Tesre6Dgkcbi>d5o}TUpF+|~^p_cuNvR?;0uf9rn{L2Ys((Sw!dXFBZ z6cFYx^?ChGK+T=!IquY894J;i=Ua7>pijvI$c;4nRC40VWp_{+XZYK@H?_}+PGD_EiRWkfzZ_223kQ`q%iza5 z8>iR3*}M2oFh}V~y@aVV-_N`v=v$?@pQ_WZIyBC{Z>#a(#jf+`vvvFy2o3P4JX4E5 zcD#?1Fy!B!=_X4|FxEPWg*JoRV5wir)OQ^ZbLE?2T&u-bj)U7ydDsuK-)?d2vQ!#x zd=yj4>E;L=o#G(BDNleoa75va>#M>-+_Ylbo2iubY78jCA3FBdI$ePhstb5`-AU1# zuGlu<&905_!?fU2Y;5(GhO4Z=0H7WSoF)JRu(R5wZ%X2kF!UnC1Uo%Inkm68TAa`K zW9}L#uSinxKU~AgEZBg6lxGah0QYr5p8Ie1AQ<763rqs1uovk0U4j>`2uKV*-D_sk zQvkbyv#M|7Z5QwwM#yGpKo?XpaoIDm1o8NT6oiZYQlbC`E9HJYez$2}N`ys5mP~bp zTmX~_o?Xlp^LHZT0bnd|*@w}?cVkjWbtzz#EVdG4V+#ix3N{#cLHq}N8=0h#AbEeF zoPsAp6WC4Y#qsQwbiam)9!Ia3uC8v-20)b@rGiKE;RW3*;MM_-<+F(a%=f?}0ucE1 z^v*O=)AfKt`oAN1Tz}kJST?z{NX{+i%v_bfws>q&V#KwwFcKtF;@0*0Oo$gAaZC|x ztTf$xtkWQK*r%q+!bEcK?-@m`sLrBKu zZ=cgJokl%#9@25Gwj?o8&U@4Ow^?Jd?&|%8XA$E}_q|Xr5`%nU=NZEMm!q`i+_|#{ z!Wee2!A2{ijGF1V+IVo{T(@XsHCFeUHXzMl+cH=cvZ~PYG}$HeE4TZ z!?NKj;z$Bq1;Bh&5dBi_+9yBk0zm75;0!O6$b`e5%eePSN1-Y(84zRc`JZ8d6ug|d zAr1f}1K|9D;F0nlnAHA(nNNRAS0atpeysp=&2I0o$*WRRH9Z&D#Cl`kn*0k8aKQR> zkTjLGK_+J1-RQbgZwNDYs|71&a7`iRGA9RH9sRaDgSna=FxpY1*+TfT!ypm~I%PSw zfL)H*3c%Zzg4yGv-15X07qTQcFuvRSSTe|16Z}jD$K({%)Y^)=1;`|+l$1)u zNQl5op>zs3iv`3;_=D+4p?8A&@yGFT4fDD)dvNI>vvb8J$ocLQcfZQsdM?hwYTyh< zM_HM37FX@*)dRkwPcuW~loh|{514{eivE5$LEWEdZW70P*;PBfJ@|@;=V>_JiLaEi z&FvYL*6>I-N|o4=IGa>6ogNGYS{A4yy^ItS*KYe@|Hzz7rA$mN_xq9flLnVHc}Eyr zdJzgW*gank^T`2h|MB2U;yol}e#-5jnY1_FZC@=y9#*>+VEV(w4`7T118cMte3*^8 zf^%-c88Gml7_{R@$iwJ{x-<`=#M-A-8Hl7VAXBXkY)Fh*23S4J^!O?W~ zL@b13w87!q$~qW<>p_wqhp4SmLRY$T<1VBtNPz1EoaW7i*{Vyeu#iaIT!B0<0UH(} zNlEuo##;ByH!Twv*P=?oN_)}nLVbzsQ;%T?lyC$p^Sc*~gG^=PKY&1>HOC=%amohE z{PI18HDulmgiW|95exR3p}B3aDgxp&EVN38E$ru{J51x{#AO)oRBlh|&P8B;Ej|kFgsMgL*_&vJG>dZ%e;zjFjC%Z<(nV8K!A^9F3iBGg zDr}&&av?ti-b51hXoW`r94kF(vI)aeJ$xo0I<*V_1qp9A@aQa8QlbmN66DobM@L5+ zSaAa>Wv}I?Hv9`lNEJi1?p4Q*-tBltj+oMU>p-RVlf&u>kv@&)!sO_Q zL={;#4C8F*NH+OpCH2o8jSf!7j+*+2d&{z}{9k@F_9uj}ao0Z068PJ25M*tWR!vY= z#Z&_!8V#AJf(hfRlDFPE#4z$$Li-iROXLZ*AaF$8cuq=++z(LXhyn$`2qFbcJJF^4 zEK%fWKs(2;nvj8^GU6=-bG@J(W84}%?k7*S^O>GgVqSaq)uH#qRRHdNwBYs?Ez)qK zQ(n8(CWO!g1cJHq&$Y*^j}QTg{rYeN41#f%`A0@Z5Yl~p9t9~vpMbTC?9OqgrMQBw z7k=!1TQ!ryKz!$Q*yOv{>z!&0d~Fzs{Xo7Y*pQU3W@fQq&Uun9CsEu*^j<(lK)B^_ zEBD}TjMs^P1|uj;u17D&LcaxQLyr-b1w&e_5YVKYKpJ7Pu>}>LKI~(NjR#Vd$%4~X z-Gu-S|1K_=5%Ij;5q1%#DDRwUSyKF5SQ!7`vIi5(CO_tvkFayq%`3ba6jCjl2~;dW zF0i#z0vGPT(LGIN*O$4cwAVI6qBN?tEY?rNc#YvKB3v5|D;~~|kVic85zaUUrQ_Yr9SlfBTFb3^OFjkf;s;#Z zYi`{@r1$B3GdFJ2onv)sUlj+n2#i>t1G`It0rAFx_qqZ!Yg60j{qT)ZkP#B{*;Yr5 z5Nzy`>Fu~>BNp6m;fRcFcXhy|Zfl4g3n)c!3VXgt>j!D76pCDwK`BYN_zBF%GkZP~ zP?SLZsk~$dBVo|2BHy6cY%B_4JiseuE#(KxBxcRZKZ`LIy-8v?2(b#56XDo7Av6WOu6mDK04%o;@pM&4t2iLnU|@r zo??uY3~5P%`0ohVF9-#^y4p1%Z)>88E6U&rNQWSA2wc-{AnA13*^E&b>QPF1XYVho zvGeiBddSGg})0FY{~

UX?G!yP&~;W1!`{D#?7}rot{T(Dw?$58eXnhF=-O z2&#Tl4>ZVZGRxkf`8qXbTAEZiZf3DA{NcX?+9(@wUyJh6{PuQgc>>_s8N02+!dd8dR@0Q0! z3=C-DGwg(DLPD2|8FOtHU?q?M*#nWXffFtwodjB9;#wu6m%HDW)Hcw4>8%u$mlMZy z`hX+QWVI7gsqjIV29W!%cND@)A$M6XuyUyeqCpy*xR6M(11k=!Y@0xNL^>7^l`SZ& zWPvY)Q4d-NG-9?lQgKcxQ(I|jMQ{E^<$ywn+!KC~4JeANK-R-zHp))vIE@bW6QaNo zA#)1^E>stsGf=n#Sqn;MxIIJ|M8G=;A$EKQ#UPYu@Vp_K3H->&Jx;eFeWyb79Kcu9_SPtL2ZeKurc7r0`-Um0v3T`a=SwhRC;i2Ap%QaC+)zJZ5cGXL<|`mu&9B$ zaR_dA*ZbJHXT0zrC__wBz#y8J^}jW7xB+Gth>oykQq+cC2^7Wf2(9{VTnaOORajU^ z`|O6*m5%fz6T(v@dO- zqP$132nXgY5H!BSFl2Vt_3urXf|Jtg89~7^oTP>C;FmH1LEAw&LRB zwP>hnfuE!XIzh;D8c@*1r^>DW$yU4VsLGU5ancyU51${9*qPLhA*;(3=(a|b;!MfDX zPt}XwU_l3I^cDDK3la=KSgp(r4+|^kK3%m8m^4~m=ScoS zt2EE`L400hO-PONG56>h@L#7PdgJ2EF1bZf2k&2fdyf(nx=`{5;< zzzBKZtlDpmf9!li18#1BOEr$K>A%a+bG2p~tmLZ4{QmVojCamJ@onpe0|pFZt22x0KaS(pW%=+^0kDE* z1pZQQp@Afnkm5kgWR8~nd+;?($fJNDV*Q%oJc-HL5HTB%PSvcsVwO8bHNEDL$#}t= zRi5E>qvu5NUV^=J3|L>mX`87-(j9sKrjd77?vtd45DgOAO^iE4#GtkR7MRq?DZ8ZMZt`v9aMLbQ47j zci>#LnW^F65k$*Jr(_YRCOyH*!kPAEWA#>^i6S^PS-hCbB5*3^&Ba*?CYGtIt$9&w zMkiOYv>_D0*5`iVaHhSQF<$P-GA2+fD-&yEnj)s(jGnI#ktUK&=9A}~qg zmghk`Fn1Vz?aU_4Mi^5WJjD|D;&xgvnM=}kKqTYuAq7(~EL5OTs0j1O+DPhY=29K5hsa%IV#t8ycgC_1YQ5~L}P7s@5G$O4rz!)Dd!b5`FT^C1m+JBljy3^`RH7_88e~0 zVMaJ0`^A{l(( zk;Y%aKLvV=ce!g|c%(}#8q{)rJeh~I#NO@g5^zbt*BS3F7~LGVP6M%iz;z(ZE0ct$%O&L-fSV^gT5=WVC#X|vD@FL~q6UWW>r zIXVCs^kCX(#S?c2|K34%45tb|6HeH>yST=#6VXgmG6p|>QT^;;imzJYxwcF7lj-0h zJnos`5=YU#tNh-S+Ea#`4vS%BMR$9TUzNWOAFF`q3DT)7U6EMD#AU69vksAxqJ=NkK<44&i3N`{O@FO zJh;~NLf*fB&qJ1P#!2?tZI1v>^H@-7f)W^fs`T=pumRvJDxTk^H%sL)+@k^D22vx) z#YF_I1JF#tasXj=2e}_RKpY*C6bvW`U?<~-jkU&Kmn&tUe_x)e6GY_mPy`g*Mu?py zx;0=l0cBQ{!8U+szcZB{LD5lCZlv5`gu>gd| z$9Ez9ohc_7l=gsr_xni$(O3E_yAE89V06N&|1iyS1Q7^gvKg$>3xT~@tqKU zp%b}_Z@xKQcrUBoekPNix_Wd{wrC^;f?Ec ze{9@!p}4u-uOPd9P6JS-4{67Z#Ah8Vz|!&?_B+Dqn95TAXsIj7Xm7KG$#%I^P^t zQBo2&XZr67)d3H5zy**{yUrnI_lIGlb=MF zCRIeb)B_YUt{;u$n=@5)s3;WwaZ*;~)r`vU+;Dsq*Ze5U?i%Nai|a>R--il4-!s!U z&DwpGYIj22ip^gT`58I(wCGwLcCZ2688}&KU1o4@LM9KC=5Q{-Ea3};fr<+H>v+K8 zrVKGmC}K7G+5+1{3ZAfWZ}JVe1QDV-h@ZZ|gF?^|O^1nQ&@xMd2{8OZ;9)UJrz=$x zU6AwY)v=%psvs~LXM@rW?M-+5M7r3mnAA2fo!IBq14!r;K3C{bt@@<7nkTc?oP!P? zro51lfRlOPAx#-nuV4|=)EUSEQU@fI4+IWymIIg|6~_|^(%Mf@6c4Il05E{qnXnu8 zdcj(`lA;*2(xAaiB$F2YpN69qU>-4OW?xFoSfZf92Sf@w(SJrPfOpkjAf|*fzfUBm5zeSg;BjU5LV%=ZRHDVFQ*CqFGG(+i&FBh)*V*; zO^CP=+oOl4wrTw-E>u5H_lM!0?3zj0JFEIWC-a2`DxK4u=q+wF%gu6ioxPL!%k7X! zInQ=cqxQ>j*Wjs~n%NubwD?wrFHGfT`<%J!Z^Kj4nrD)HSIL7Eb5?O$wm$O;toxoW zyv%3)`|~yS8&s(pI(6eGTV~Q`i!3Rt$wOT#rm^Q80-$8P2N-?881L^$d58jpPw2|=@Sx!|gk8nKx#0*C#1V+Gghtb8=M8KI ziZ$Hy%*;fvhj)b_%OH2A-P!oM~g5Gq~=fYRC0ME!A7c zMrYW)m7?)G>u@cuJ+nVwshdI)P4gv8g-Ss$+`S^k0I(50-rwke555BM{JGMic6Mp# zNxMMqMGW3ONDO?VFHY;)-k@_%=NmoPSsba^y>@YMgxPORN~@`nJT<+-g8S$KDi;{* zD(Pji^s$S}$h-k~7o%9)KIvk_8ih!kV86jbh5;+mbHWAZVfx(>ZbTR~manA7I0EQl z43D~oLT3BvkRA9TLn~eo9J5@pdvaE?dIiusF!?S3|AV`QZ={5TgmPA_0j+`y(f|Mu z*t0{+)6mf)dFIG`7}`0ik~Mls48Q-LLS2#2ROptV{06^B-qqn876F&*7TR2tHJ7B- zI4UXEhkxc|pO`n2(M<_AoUWXjD0PZ_i|oDbwJ(4{fug}%?9?Q5d9yI<6l!&e$&-Go z{9O^HR(ro77JZRTD?h=|Fy#$8+eP0W6t28y_e2HvIV1)uL@RMI1|XobO|8H`PE_IT zZsmr!$3tR$@nddR1?|GzAID~A))JRv@QQyn{*cp479W1fbL@qC0@%lMXnKiRw9zc8 zx39r!w{qiyvjHxnCy??9l^O!{0|1@LkrSP}R%|j93<9Fp9gpmJAxHq+Em{eA^J+bv z;lW`0UT$PTJj|h+EI1f7CL57wB&Q)+hVnlZkM7OS6qQEFxA67xZ?j4FVz;ZQ`=6*m|4|oiCR3QZu zIIbay-2nG|0ZhG_rxgk*MA-$P90SaJoO608q71AClvJL8=M}u2kWtqcymy?ja4`DP zIZY?~Qv!*matMffuw^?!ZJcoP!d46Vu@v4zy!Nc$f-MgO6a<-HuaNh*Ls!smG{lN;^4KJ9A!w~wvFqZfM%mDX=b|pB;3p6= z)Zat%I#}O-ozOWOr0!y~q8YN&L_ySdvijxM>HKB1YeD2~u~o;c+udBhGde_yZR&T$ zCPQ39o|2>(7(7+*52#(}9K&EWZz+3F!L3Cugba27u50cWo?lU0&zAU*f5Qj;9j@~4 z`IFtE49nD6tEW1{y5cii+2|VsF=?KmxwJt6qQXOa!xNn|mWSyzeHGMtRGOi+#}Tqf z-3K2#;tjD5-GT}C3OqqDa6z&(QjH<*9KbyE<-Rl= z@T-q?oc)Mg;sqHmp-hnmz2!@Z9vF^7<45k22iF+Hz9Lb{FCX+T_X+PcS0-IR{{c`g zr2awy0{}Jd^(zqY`#Dt{@a;Z!NQ7j;yxdWE9TH{5z*QV9)jmerB&{%2`e^N51StWW z0@GeZs04=sV~4+;1Q0r|`Pq6w&jF)@3P5WSE55v%eNqUHriMnx049OswtdooBK)h$ zDV>+8<2}xu;6%}!+d;yIVZ6ERTmzZSen}NL-=2wiE?2&rm}yGo*ldx%^*c~EzUIWa zi^7d#>+#5)iYcjAU30+(B5!}M)g5vX1y_egFENRsr^a>&#)qlk|DBZV zZeHFf6fZqO_rAn_mF!V<;Og?EA-d)I)Y9#TZ3|I-uL|eKMD+LSf-luI{CtDPq*k&{ ze@(=^smW!WINS0z&6ujHrl_2*>S=~b@+ThKzb>Y#d@)_ESOx=?R7Xy0vY74Hwb6v> zYB~=tj%@VlGtO8#{+53)`|yy#&|etJGB4PT!G-YVirP%k2vC`1+b+T)A^F)IQoh5=mCP+&IO37Y~|S6Fxl z&Iy=jV%Gy=t*l280+{iPEe|jzFhMi_E1sVWl!E~MwE+(UOzy#X>pj$NJN1`wz&#I^ z5OOehoX%0fvqutQU`ZqXa?pMv#!JX?20nqU0$ESwB_Oj$6biMksd5lN00wlX4Vxgd zw1m4o9Q6EfKf|qy$o#G-BtU71#S#F#nnMgsOwHzHNNJ7`2Kb$AO|eMePnns6 zbA-Y2csyOK73dC#D;`9+9G;(SSwYuE%Ha=X+ng;A;4}!`C6J5@J8wu53J0)5O@pZ( z;(!PDg)EXF(_3D{bMzT6#x2(UO+u-#ku@?>^$4{B?#S_%om^Hs~PA_d%g@=)>&+ z`LE@Yx8A6!+^%;RJ2dxw<}~b+GOp48By7z2Cf&})|M>#YZ&jgPM}1PaTrg9pC>*>M zYs*`^q!k&d$V@4ip&X0Ov&$Xx(e2*em9P8rgJjO{4Z`}9`CAn|+~jR!HitBr39WvD zd)3fa>*nBheH+R5rkl68{-nO|Q#PxK;g7p}pZX8?e(td-X(+pNZzXGy$->Y(@;CIaXU{9n*|Sp*29pA5i2$`HV!2 zSAf&j7nIdKggfSTvX2NS?S0)LXaQO0@YPmM)nK>xuTg~V5dZ*A(_vh)9JKyJ4*-o| zO~YgrqKCL)LglnobD-OY_}qnnMZ!lQLd{vC9Kiz)wGg53;L#%*{F?>f+K3cXpu|Pi zHYiyQf{Y7D$pBcX(139|W*<9ZqL3D6PYUh88&Cybx%7@Si5(8g5fHN?@H`m$0e+JY z#*D+Wi}3TI_W@%TsR(&j7|bFa8>o{RJ7yv29`Wc!rYIeSsKw8EU?0E?#gAEWoaxt8 z7I+fKR{>SUM%5DPp{d zXfj}uNXlhK5wwo=WLL_Vd9cnykY0;3+@qTB!|dbuq`m|TL$w+E(M;<=QAIyixp{Z) zfLUfer_HDx7SHAcsl>5~ybrdXO$pPiqJjmXolzoW(-T-Jw3+&~)mzrrI7@<8e@)|@ z|9Y~pVOLNWubKaayS=S10pDhdW#!VpWqkg3BV&4G!yYy@6pmQOny@4`?8D>Z-JeGo zUc+3L-Tyekc=p8iN{BCB@D}Bmy+xh!72AMNba9#A5&nVr-0P8~N(UF-C=I&-=heT2 zgi!{GQh1G-6XH6b-zE$N$iF1HK4V##r4mRJ^45YKv&7J=CiYg(pSm_^p-M=7lDMw< z3CG|#)o5LM_cUnf@;fw;^&<1BaqAAIl1T+sRpRIcf<%yXM^!&c)^P#Pk> z2n7s{P*?wgDFzxCbY_NeCfY^9ToN3YgO7u!uaTh7zL1)};Qxzbezf)G+*OMQ3Vqd! zu-TmZBI5(yAA9_K-WjPDcM06GnRtD)7UQ9FoIY1R`>FLar{LW>TPvdub=ePFuA}*e z5?5Vg2hc%$kAqp67#%U`anU`l<*}7WY}CW3CIl_*te?4M4?7l|yAZdObSNO!`(xES zIzZugz^yT?HTTc(+T)Mct=OUM_UE`e@bi{uzPT7!9pAl2ST%3Pdfs_(LelCApQRPM4(Pgl?bC>tnZTr4hwA)l4g z1ewn>9UYw<8%m1KQU}*Wk1hV7NO^y#%boKwj&nPc;#9sYT0Njq4tEPR9|+Xi1)&oOvIu zcWlWR>8dsAhlD^_)o-oxznBkC&cB#cO8!5#&N`r~cm47hNQZWSQ;UU0X zl@%u(T|6FKF%BHv!o|??u&^J|trC&szv9ce8P3z?k&%B0fsD=nk|_Jrx>EE*@s~(v zk%81@SuxWCZz^u?Ak;g-m4Wy#KW}_Eidj(iAJ*VY3v_JF8Aq{3WE$Ca%BtHN1Z(g$+v@8byp(G)}2D z-riWs%KuV$Errr~vgmU$r>wu(z=3sZsZ^09HFSw*i_0Ma7qoqLHeQ9~%)lO!HVS8Z zxB6>u%8aJoT!1XAD6Qukd9V`mB}AF)IvCr~gd*yp)d*Q|gXb>87BRMXn2QpnJKn0f zu{|s^$H)z zl-DZoP`~^D-PvLIx+v%$m2~mQ3z~W-5JRuNVBg-&AxoJL_&YsDGLi5{B6<}n!qQs9 z?Pm44yX(EULvDn3j)jqclSngjS!1v{Er%3~xV2fWj8JQ=hU)Q`(@W3qKY5cpu5iet zExr2n&9&+kY#%QAKLa#W4qz%=?)uJCJBM1vTw;b#+ad}snki0PTHYw}QQs#Bqj8e; zgx2hZW7t?Lma7a!AFQEm=c$whE%0)KKo@$v-hQX@z9u8(+_FDOa`ZMc_GsgJ&LmVWD_hwSo?_`N32aYy#1&2UgcS}3BXMlI6Rz-~ zg04}m$b!ksPEDPXcy1U4H%le;j#PCMW-Iw94MwkvXm%dCHR>KI>N_Q&hmCMh4X8}-9a|44gU5NTbNKaS(>&!Bl65$ zbEFkrT+Wm6a`Ud*bo@COF#3R_^tF?bV<+?aS>pmhwyu)eS7x??FeGDvp~D#+S+Uwl z)%xZ*RBgYIsJXr)@?duYCu5u=x4-e~u)MFm{B6rjJDuD)dHfh(nCUl_u zulHI$7WLo9?Y|nH-~*uzkd9`KZxVwJp(<0f1dQuGsz?J(lkETw~;p<^v7 zZBWE6T@}pU=m%qT*<;+LXHXFS`$gXC3Z~4!DAKXoy=7qdd}I-6pOOz2UeM&3W;;eS zM~fvZ&g5h~J1}dHj#xm?rzKMQuMMB-Wpw%`&g0E4n;^oi)K|~Ho(!li8Ceb^dFsz>mf8Ww$SIz)_wksQaEEWjNq>L?E&i z*1Bmvka@wygs#d;iTGYoy_lpn;1TY(L0Yft8ynXo3dSI zwM12se>_bxip*kgkpB70_!(58Kfu>POo&FXYL#SxpWmre=yywbKDzM#`ch&Dpx>LD z^aW$3BM)zIN3Tu1GXt8Z_?8$&5bu zM3duNZO(~aQ`K-z(VPap{9(Y$E^g$MQ|bvTAIk<$K{?~;GyE}|q3u`Xa(CCl@mh|x ziXP#2O@&F_{n1~vC`qkm)>4zREoLaNTY7shLHP=O#q5Qzj$z8@ENmwvj4BM<1L;+p z)RkoULi4Xf_?EqPJZjzqlK)4g+ISEed2?`|Y2Kp|HY+HfRyQgM@iLyi(dd zAG*hD2fT`+5;4~g_hDAy zxVSIqYUB#hQMtBiE00a(i;=Pmy{JRXd6Zk_s;)77GCUiG8ER!j1+rqP|9LCrUdZ|w ztw~7;!%C}Nbw+Ng;DZBzy=R;z0U?fwT6XSc|ChbX-~6n?E(@t^!oVOlsdAuUQjpZT z`Fn58^?ta&>q&#wDTD+hk_oA#uFsnYtaob!{NT|Ft0D^(5fOJH>D=M|b>ld$lt6zQ z^>UTO+H)l4xW!;Ag|O%9t8d8xSj4|ZycxHRid*dhBI}OyxUd)LLO(j&IU*$B=SsaPBctDhRGVYnp z`hhw$C4A}=3Gfuq;ZpVQh^W0u=@e;Sgxj56W5t+=QBaLb#C0!CU7Q^awNlr$-;n;M zgbn{A^#_cRy>5wfI4TjGeqP=W+CuuDtIda0UX5i8AC?v|?>||5p;)PodlTG{7oC};QZ8D_D;*%IRbfd zxjx)z^_!N{c`4@y+{V7c&X9msJ()8GRwN zr6rnrCd;EOGfTb_5=1-@vFLf_ zafaJH(i(djsr{jR!iYwh)$j4Rn4Kwe=u~UDuvTn8 z>QkDjcQ)XGB`v+KyX{FhC~ha zbD8Zqv+dZn%a;1or?JJv>|G8#mx^OHORzY(Q{k?o$Jsu*{Ujk@pdS7=j!`Y7-YrIA zhQREi6i(G0e24fr!{aiWhpGS&@@Vd>jXQ1}a&CIp~m%5enS4U=JSb~SP$yy6;rOA-kv3B1D zb&2sE6IBUWJY}g5%w(cS>XieG4Pjly@qh54r%>C@Z}L?`8uj|rNdYC>LCE>s^bvN44-C(~^m1J#Lu$5J zoxa=N>1?BW4Zn=ltlsgN;`eJKrGlM(zJ)!Rkv;whXZp~=ubJ&Nc#+HoDg+(vgjEse zn?@W#rg$SCgR*Hjy7g6CpT^Gm+tbv3qYO{1_S>HKNhl>r?iITpQe~uT_8hwN1~*Ku zR?YEP8B*h01A@h}MeS#lmJuo(*U`6UiGux~cYRCiE#(Te8A|Z`KZizyy&Zu^JnL)? zL|WpjX!;bh+T7eGmi2%o$J%hY&gxZNi0bRxpV6qHIM$L_Nzc?;EqvNa4F^x{=hZ52 z2nrS9Vpqy&I*m5@N!{Y&lJPp&t<&i2} zzQWHfhT;X!sHshg{x_J}60GBJGb~>}GLEh+C;Uin4;3jjXkQhdH85Va@5SY?qYFQ( zkDNMaHYD!LvRiT$!a@#Rjqs;O6NU(?K< zQ|lr^MX}!UHbb9##Cs=fv#>Qh*T@uG{G;D{IX#K@E1_N_&H?kyJgeF6CE*aFQjroY z`~kHg0asn&rxuD-6(*wrw_|jeis#S5o+fl?qlkVS&*oXEo}jkM5eXw$f1KWORd9?; z)5TiXJCJbH=b~ftmokDBYrW6xKOTAcmXkBcN7m5_K8>c{F-U=(CA>k7VobMJ|69Wy zT?_uQ|GTFLL^tv`v;s)}B93zCLH5jVDA6OZ)kh9FlDKT&pjeSe$XZ8%CP{^`Ei%#0 z!I#7i`D4XuE&1u=AxefnOp}5C0usQJ$`!^6zy*oLdWzY?mzZR3bsMPVs=i5{D|_gb zrOBbmYktRmGB2Lv-0I|T$IqF7^Gb8{H~Eau0>kiDL6!p7b1UntnI@}HU5S*vr#RDW z2x1QtLn1*Cdi=!eg6tzl3p+m>s~jZL#X=Sb0(L#f0;ZYjG#NE#hxECp;e21}?qs<@ z_g5Y1w)n7Z1>H|Sy99~IVfp?~+fO665oh2t}-eowSQ(ZF;A*}L>i zzTa4gpPgIY!8)G2g?Y^F`lx9B(e;$QPavv}>T4Tw@WT6irCZF1cScd`+(P>y{oh)S zQTXsEZ3!SH^??|%H6(9yjKw_>Npd&TcXkdbtBu|LO7?mevc<|fj8 zE>!NzN*DaAN$5yFq^5#md_I9TckZbpm3NbT<$*qUb9gRA#4S{;^xj94CLubyl`0R* zG*u#a`{2O^`|vl@&(DnMjpAOxE94^oFeAWQLC{f)^Q3!_qYEqC9Q8k;YIW{- z{Jigt@-{j@zbu$i5b8&|L!Z6m=a>~qMvY`M?=o7Ym8>8XEJ&yOJo=reHEQM&rp!R+ z4KNClj#nx}_C~syU+eOCM8CbUA(v})^Fh+ z%p~B9NJA1nu?ekEn=l{5R$DC91p|Fv+4&4V-xQypI9w}A#<#C&dmF#}%};VOKa__V zqC)BrY_cp*(iBn3<{FrU%cnjyC3H_O!IeeWT7O-zCF~3z-0%3bS$k(r(1e|$`z+NF zR^n7O_kM{!tr1Hl7OB54wM+9S`E%F=qY8aPorK)QkpQOUY~{c!tZU!Ftvja55wo~K z@l*Z1o5hg2WU-y?>bd4~l{O*X_cb}peA+P($uN&ytM!?dq4i*qy|D%kN$)`inu`5d zU32#Uw8YO`=vmc0>{@9q+8Qm3Z%j_&<8hfcWn=ii=!dBi@+A-?ezs|2l%@Y_t2Y_q ze%Jnqk9LpZ);$+zu&tw=S(a5w#bh(>vePSDUrDk z84vn6lf;&tT?oqcYw_IQWY82F>`hQxTn$b$wBYXV?RY}vX=HulQ;VKO3`;wUO z`kibHO|1fakE6ZeIqZQ-JC(Q>_2Z(Bei1KN2=juvP(WPXP)Js@^W{V2?X3{9k+=^% zdrDma{xPy?@8xCD`QJbt=7Xb%#q-BEkH_)%eFMQc1|Rx{pOHsfW^ItZB_JqNXr;Bl z8$OKW8;)lfH935Cv-*@DiwSoip-&W;XW|T@l{uKnu%Exu9m(F3ac|&s3ey^n>OH35 zq?T!ZgVR2-hU|Li@#V2B(G_LC{JyynkIN9=a-UPT5jqb>4>F}=H+#mNIkvx7tJ-u& zt(i|Y7+^!#^oSLpwUR`P*4lT`U&`wK_f3PQEke6QSeUx3&vCuws>C+qig&M3ls&pH zOQ0%O;=Ndlcre3pta=UyxsF%7TzE#2wo`ydvF|RY_BXFBFaeC5+54d{rMjpb;&D9XjmPcz4<GiJpU|wMds}rHMsQ7xC&yS1&Z>-aer4@uw8&C+Yp<3N$z%C7e_|8_(T%Ryujf~F zl5sY6!EhDzWlxRn7gv78+6@?y3vV-QpKbIsi@VYXO1w>#el@Inn9Vs`qs!wa?O?c6 z<55LhYO}7VM6fb4drjOsf{?SJx5!aqG{ifaQ&Az&ysF)D`wb)GMPvQt94(M(h73v{ z8|*(ai{(k<@vdQO*82$Glc2!vEk1obvefYbPPFbJhM)B6_iP>-38WY((c_R6_lNNX z$lW2vy1Mf9bYk-TrV?dYGMExN&q=Gc-iXB1Fi{&iBW&|DahV~f zkDOv4zN)_so-tG8NmM)c((TB0;B%05AS=hMZ*jHIy2bnKyFW|f^m+v4eD}NUMcogq z@;cczWj~TDi?wcThS{@Drf+V$W?x+^e~#CaplPbb%7b@gW=FtiZ&zURyWxqn-{_7}e~c0E zjs8u_9B&&bUCC0eeYEHg8$X)vO}c^bJ8#X>+JOPBJC?#a9j#v8wnbnB^CsP%>zNTEH!;SV(nmO2R8^d~Xo(7wR^wr zbq73AgVUU85tn^3Vp2i}X4#xJC+rNK+|`PjoKu&j?;?6}tTt}^UD@L~j4EX%Y)jfP zO~h%=-xqapC)vGz%@BfyGZ}t3<>T}#?MO))tPglp+Vab8!Iy5$#OvcUcV(9L2V4Pz zp$kgjS0SI*>Qz|uw(nnJM1CB<>pL5Z2(Li>)0@SdL?uD=u1hdQ57%O;As(nxS%L8o z80Q>1j@~tEGeH$jP|?h|=|$3YB&Aeb6bZB$NV5)&9e8?ta-%kv-jB^Rv~qPHa(e*u z3p?@z>TtJ=^!A&D`4|t?$eQdkA+3_r%i?)g4<9%_hPmejwl9JmEv)eF1Zt7_r%YE( zk#G6sgD@^j*6wvmCF6cEG;elG^3_I;>l-Ig0g;2ELO?R-17m^_MkFP1fESV{#WLI2 zElNtT5qq=*)>$HsFc!xh*QK{oNYlO6Bzw?DvL9hxx0zKc*FrSbO> zVc#aKBp%Sg5%*kKOI5c~n^X|ZDTk~I7YlVRmHWO3Fv~u~^$|K4yBq4bO!?sH{Q@gs zLNw>RUM%~cirM2Z zO~$IMU8ZAqi87kKNV3w}%qBMm<9f~}Q&L^B9r2QJG%zTAIx!?}{_9T2lo zr9N|MSE&ROC+PT&(~6_n#&IX{~-*h~(J6U)6t_ z;g3=nF#m4l{_`->u9XO6AIkshxk0T&{r~Ty^5SBYz;NL-^2f7Cg#3x`>xlPU9x$4( zoPT%i`bSUo7mO7qf-n3j=cbbxaZ+Yi{sUE`JxYW_N+UAOo>N`E zSX>DQ`KBl({C{R51%6)NUIk5qNK+8z9xk?J$`uaM?$3N(K-xRv=1aTArLK+l(Go8a zlHSBONQ1cdsFy8*&h)8ehJoE8NRZq*c4ADve1YxDc9gC*D?}ElQ{V3bxTmoGrv=ELX2GAx))zGgA() zoKGMj(kpGJc3O8{StXXBVoMxr{iSUxD9S>I?`31a?<_E{ZO}*)z0F&nY#{X-Z7T|!g^PTN=>wQ!(X3ye2kHohOaKdbO*jad zRmc%T0k-O^f|hp}!6!gczHxrLJ5#C?O>duvW!-X11x+mko_J`Sf?X6MI4puLut)sicqWiYgE=_u4J)E@uP?>4LzXk8Sh<6h;TAn3z;2PN9>HsuoT`*pE<9sm#`zc zZ%82WF==cxi${IRAlyn-C0l*%ge7Q%_esJbqHoCV{=pqGReiBA7G_CuMb1fmHFG54 zW4~~Aqso>~GUKiup~Xf*!F!#Vwp3hh8E%GeSB69yLea?_aku!n)=CRtrtE<}-BBu& z18B9{K!k=Q7;1Pq!EBnUVX2z~%@82}Gq=$qdC%5_8>xvmY5!EB1S80gz-SGJMr^p! z;sIQ61J3{?)2nvB1gqVeli=+5;(;3MJdGNckMvuL-y+>kb^ZddgwQ5ezvnYJ?L)(} z!8fT#_UVv}rF>uhXZ{Xx@A3!t4aQSP%Sum0hVUO~W>y@TRxIX)8xau`1>-;G+$&sP zv0yPB^?nLwuyy0}cMZq6(?|x5+rM{X|lWTnf;9){7LV+X%37XLOF)PO%(=Vub-xSC^Q*`Ik9&*kFc z>sy!DdGVk3CJDm-wx!OC%2?+;)11UloQWLW5T^BC*y-JQ?{%M~7af!K-HZmgv&%Bs z^fzWEZ&lb}>i1r$q0cc1M_JN-XYO?@A)|+6#E1%|Gp1Lb7w~G_ib4hr9ycCGT@}P6 zo~7@+JOZ{lSW#kPV#~w2oEjssfAN3nb&iG90hXQJ#&!KT&v;#YT$*pMQC6G}XMbcK zhWR)RA2E)VJO*(hf+_P-F2y~@y;;KvwaXcs5ypaHOx!^)JC>CWMuOg|yj+I@qO}r+ z3uQjX?Sj>&b!5*LQxETT?OMX?bJ~Q2v_hTgp47Oo1y+Rs|CQsx(Frygq(r0WP5HQH zbm24^z@^a}PT_#2JwSa}z?`nwTpwVCwXLvn3|7b0x?@jkxV?_u}aAQ$th(3eykU%9)M*T<02j@Y;^>4%c- z4r82gAgaW#`8yzAP63X3H(k6-f^T{~aO7OaX{MM)X^;rXIL@O|{A zA<4km>DJBt-c_GDa(y)>_E+s8;zSZyAm(BzG&?{Lba2!I|1w+dXV+koRHqp94fN9=y`0h%5QBNj3!eT^EZQ5=if87HKsz7wR1JGkM7s&wJRsjr^WYO?I?YaekM~M+%h2a%n;$ft} z0cDr`CKq}&sfEZ(+%bjI(`>F*{9xkc)<7ZzyQ}y}=0atb`I%q+L?SDl=_wIrfhUYy~Y%e zfYWMoZgB8)YM+fco#wjry+8i6=c|@S1V9IQ%Yh|2$0DpqkVoItUae_&`C{>W8^>a< zDfoCheA~}6k2g6nML#ov$>iauK6^Zg{r=^bRqYfC#nfKh*NI~;Pc^eLZzDm0#3;i;j0ab*qpuOnX9UHHmaQJC?) z@A$>T+rVQ^Ys3BN>fPi>7DppSt4W~+)RmF6zU11l%^8MFdogzJp*o81Txv3tqO|^I zR27c_$av4&K;sOPqf7~^EC-|jrD9c<^;0eYtKQ%ac zLjnZckS(Atmj#x$TVN6Wsol&2`~mtv+YJSXB?2213&7R@07O6F(}ho`0O9x9vfJ?~ z$S2#f-iM|v0bCs5yTAdKq<()4WfQ<&LQTmqgj_b>K(hX<4De(?rQiHM3uBdj!JvNTdUfL{zA$VQOkhv>pn zb8|4zg|9PThM>hPzyodlcq1G{CK1pEbY7>C8?#Z0BZj9$z>|zdyCpO7vd41j=1I5U zw~*EMM)BeGecDb{-nC~VX6}@{`r1`QX0IlWHP7*%ot>+fw29Nwlz_6q z+l;DG`?KSogrRMRHAr0KQ|q?gokO9pl~oermXtj+uQ$&;vw|bCRtd+ogSikFb)Zss zY4*o0bRC9;pox%y&%dG?@5Ng*tD=J5`3t?ZDI}G|3^HckEf?6efeG)3R}VSEdqXf& ztUG?)C`l?R#~$sn-qkr(f3>3N<%v+?t0-mcY__tmIR9CWj8k8s!WjbyZX@N{JpST* zk_bHmEZ5Vsy85)WrG8)QE8ShL=p+$7e5#~WBrCy8cP@Xatx1=|twcN)JH8_}KKit4 zl!QUieJ*VE#Wn_8%gF?{qquaar_VLfx?7e1wH&xQRbNz(zq&8(=9e)^1J#YdL0M`G$eA0^5K& zBXV%7gBcl6tTZy5*AeiZOT&|fy#3dwF2UnU=003h19`W8)~8;9lr`;|eXjicUBf6qLt2 z|4zYT-?cPlZBI1lIV-}9@oo$^?`%Id=a00S8n^QV>j_rjpNW`Q?xfgITT>z{>DRTi zd^?E(J*ZveqG?UT_R*V_K|Sjfl&O3k(r)w1H#CAK+Zf^9NY~jMVImH(!pV$w?>&V# z&IwK@E=mzzbz9!4JU+F*S1ui^ zi21lkt2smW;`!WMu3;PnIe+>T1?N-4A+2jwi70#NV^@1ml%Di=^a4%o?N=1r#eGQ5 zP$(_9!rK9C(z8tyd|`>>+9WdKUMmKCnxP6Z>@KWaGCZoz}31)dke;)90Di}hs!dZ6-ZsF~H>(Dsre)p+y!eY>`uTap%O^Ekb=Q;Ib% z79lq?*&ki^bD^P`eg*Q+gXsbx4O1=C{CFZa;m} zXP?PpurT`RynW{0_m*{ihNviA#jn`J*se{c$9j%}x?Z)` z6SLY%Aka5rR%yOc1Kkh$(OAJldO-QV2C#^2hC zZ*aXIsIsZ2CyU0d{yU|&S?uwxbq&F;va;=)!5(gV9kL_kcN%p70eL9|x)3KCZvhKU z5ws;h6${?aK`$-y;eq&fc;FHV?e~Bx+XNc^mnoPDuwzll$p}K~>hrcU<_p1hC)e!D zK;#XOn2(OnZq>+Lp85DDlZ$Jp081M*BocrmVRS(!zv*H^`u4bY!`2%TmV}5+2bKn% z5M6m-X9Red4Z!2wn3NaXir_uc9sBVCoD461Un7Y~z|BL)7dA~-Wla^*a&jYH z!xhC4%PLD=FMgNKXfThZNh#jYN)lZ*m_BwBK!$yO19@yR(b+TA=<*uYeJc?oC>bIe z%L4hLy|i0CDv8h!Gm?_REz*X1jAf!u=iNMn z+{cQf$W}DWAO^~vfc)HDF7CPDtWp?44dtJ9uo-Trl3({jlR1oD^-H>`ReeK>XDkw? zCw#jbLfKI-^%~_B{6{bII3zgxxB0<=_In(=E1zY{z)$Dj;^qf@7zs!ijd-ly*Rpa1vWf>*Q1)<;*Vn7AxK!m<6N= ziIeI8h~n89^@7#dkM=A#)pWsw&sl$O74jZ{hZrz8&}_i!lm!f404sVF8g&V(WvIUs z9QUih*T#2cbc)8Vy$LG_g~Y=O0rxVJ$0%UDN7gr)rNq%H2LR;6Stpv{ShcwdjO+Cg zD9C~7(_MfB0JEXqSWvnP5AsI%>ES}lWqEckll1>1PR@$vd0gB~9YFQ^l3Cs>7$L#r;3 zm6Rc>`L}^4ulkju$&{bWmJ(_$K1khbn(% z$LUWcCSyQoIv9wr683K5vM1&~D-7sPq!7vt!LK}7aO*@29N)%VAD=%cF=hvS+VURF zlf3@h;e-4l8;qj@jdH@=?+~aMhV>!T(shTv ztfJX^AzHJk@;xZJTLmQ1zfgQ%GZ~l+<$Joqcpd&qVq1eHCgKSTX@QSc@MiSuVL9zj z=1NR*xmb%`wMd|U%c~{&W&iKICNXM5n5tu*V(O=;{X$r?xcG8 z4S_G6;lAqv9#cO|=`psOMx0oSkK^O`E6L)2eaZ)O%1?}`a*kZVPa1V$`y9;gjNx6aIUx%aa7c=jNNxqbxpjZ=X<#Tl2*Q|C*#{L|$eH%)} zC&SE(qm{*fZrluRUIA8irpo?U_h35quZrG1>z!9r~$$WUjsSrw|9 z)&zA;9FtB4V3S7xzB4PJ#zKRI0dhT9l-F2f<(d7!9dGr zXrk=x`Of*QK_m;{gFd;W0*HSfD6ye{v7PbHek;LLqKR;Wl01Ffh5pea4G-`0>V zbo+KE6Aro(*ZemAQ8gi+ge!^Lo(iV=>z{RyFR_&qDWDH-aZq$ND9tpin?Hg(B{ZjC z#r<6N(G}Wgllw$419;bAfTs(LB+&IY^d*52&2wfz4TM-EHucY0*KfUfL$CU_9Sz(8 zeLsPXx&&DIv&s9%lxmt!+fIwl3$1e}8(*#xo74D_wB;`3V9VSOp6*b-I@IB4_{3_a zm%cB_&*w~>)tO~HJa+-zG(51X;qk0YCemHbzWiiYnj_VSGv-t6BJbxdBC@p}!esBV z`&`hFQ7C@5k2qaglDkE&2wafTP>JRrYpKvilo*M%F!Op{7-w0q9kz)K|2F5E8?Fx; zfKD|YAiVJ$nb^H)miU@!J#OAhER|I=URN$d+lo1CO9)tiAH~FY`uiW1D;`0v1GE7F znt+e0tzKW~-xvUZGL*)ulqY4I{o=wiaXTS0W{!x9wd06z2QnH$^Xh$*SsCqrv;YX> zC3eU=G_Ns01!%>j9f?E~iGlo40oFCv42!t-QAOZGDVncx9uy=6@% zIQK?fEczxGi>hddHpJwaYd{vu%+@vWS2r zt~)rOoI}+LZI;D?nk6o9&(7d%q5k(LA7pHgLb=nrAaU}p^yhd3f5$9DZ+S~me_3N7 z4|bO7g#FkXvxGG5!UmZgbb`|L#Cb`yQ;!`H3_OX#R|)g1gw5mjI*ho!8@vzDTdR4C zUl}LsL)_$J> zFm(|0{063X$PBR;#1^!9y8v=c6!ezPbetNOpxh?V3nr>=vRt5|r42S^m-_PMjc04C z!YjBofKupe^LYWK9RkjxiFa2T6(IfEK0X4b1<0dOqZu>=+YVMriNKkc%xZMDV*)1k zw(C%y>*+= z@}kVLR1P-U%2+4+qDwW|q(;u#s-{Jw*k+4tHzR8d8-MfnxtD%sNbQe(yk|#VJJdZo zI+77%WK=hQm}`^*OLpop!U?uYHapf;PVYo*andOV%&0rE|fUE)vlbE8{?2xB%P1! zd!R= z;)Z^+tuLxmcidDHyEAIh+}{M9_y+|29&7tWWQQbM$TaJ&E4UYNtNcxg5*8wL>j=%ag;F#$$gTnMVP5-2fkp6?=$l@} z7HQfb;-XqC^iZ(~tv6Cx>7rNRwuOA2zsQiRJ6{hHU)3tTnh%bhrTDCyit1r~F>9o^ z>7`0ujz-$mzsWV?h0?HHJ-G?{0j#qJ!F(dPcjNY4K`8sfBQzvrvGI*_=_<2~KxQNe zi6(U51u-sdAOjwe!61doa=xm6rKgFs;0!cu>&LEk9MlIErklJa+b#Lry-+&a4joBq zJC#9A7r_&kFr5N`43AlD)n+NZC?#gU@tAdm9ybqMjMnVxBW5!@XEeaz1prh%xrwy3 z!Te5+e`E8)aU!YvoxS9s7)7#URv@yGtJ=*-=&Xs(#~nme&@N=(olcC?s&uh7z;b%M z$8UuTOA>dc{hefn;roP%0k*TI)gq0*Q6^JN&M$cN%iHILj-<=a!wDSdD9>*zP*}|d zGh1S7^@dY5XR}d8n_H2MXmUS(z@k+5>-BYF99}EJe;snmUK88*$OX|E@=-ULy|5-+ zFE=L5wxty$eYASc(*4_^lh0N$>Mn0X{5KL|I(z_CJ$w3S1nYK;CS5)^B(}s#j!(Eh z^hozGti8)l*lrbQOERrAZVbXVV0nKNXH+XFv|l4KD%*I#E_k7?L>M?k4Bu;V5i(v7 ziKm|M9rMbG@+!9<^YDRG`NycKpdyi5s7?eVwV+?$7}{c>bePU4-tm=LrRlD+4WMa9g_!cSFdJVn6OE z&712pwM9{?ERhe~;voK$?7cV<;_dOaJ90ZYQ zkCV48o12inAiq#UK|`V;x-*>Us+g^}WkqA=aGp!@V%3Ot->^Rz4ZI2L+-{sp#Qvd~ zj2ywgUVEbzFKH+FcbfZ!tX6`NWqaPpdiro@-J=C9fnpaip`@X+;m1vP9AS!*$Mz($ z8{VFvSalKb?g*Z#|KtEMSuwsqM`WwcD(B$+ffv=RJLGj=fB*3(V~j1`H->REU%pXM zd=eM9q!YK7^9$8m!54<%iT=rIZWR`xrQSdO`Q@L+Y$OO@C`|Ba>$8NCNSoV_mx#m1 zWRHpVq9AA?|CvHsOk2s)2U?teORKnklU(K^d4m!5ERfIa803VAALylC1}&ftC=`Yq?%I!dGJ2dLDNt#c@O9}|qCT0$ zlZvY-e%cb_Nn8-g9Dm1*qI&-Yt>wCUWBS#esfg9z$1ou)xyL6a!tvDfw00C6O3C(r ztF8W}vywyD$Td=>iN}4X#LER%WNNqp!n}(3j)&s?hioo;zx=S66w`jnKM`o1zhY!S z8&_U>r^AarClfxg$G-c>=U}e(i7s9)G*yS^qQ-dY&O%DA5kC(I;OLE|k7`*(g}QClWW0c?g8ElEcSS6v(O|+ZwQM65e-A1q~tD~sai zMOI_G7!{x{$aO}oiYw-$-h0Ho6nu=S6zzBUPg)UF^2X&~9Q*#|7d~NQR0oAD=-RGh-$Au#ZuR~Hr7uXM z#B_u{wctc8g`-uysbXRqzL@RZgIKCsxij{mh(*&jeW#fR ze-`W{KPV z7a8gLNO`4_3{czdp~Lrb{rNoM^~*$luUxm`q#osYJF}7t$+0*)b9|2@1(MW1`?Brc zHu)t0c62>eI<4q^`Ly$*x7EbhYDHM>Z^gxO`CH#Y8alCV41(;QWpjPcgd|lAS^9D@ zUk0)8=C@xyVSS(_gQsgw)Y45nbi1yh-MQ|4qdE)w;rr+1(es1zgJ%1JMK-pbku;|f zmut9$ta`66LEkd-vudzM{pyfNb^e$ux91nOHx53iE<9+`omkMl+xQX2aLi4+UL$_U zJ3tX1w9cON^yjVN8~amQ>dLa*wO2}=IB&1d3%Iv>3J~&djRFzJgJ|=Dy7g(G^T-W3 zKN1*F1b|2tr7vG1$4o${)^H-u*AG-a4wPu6@H* zL2?rkN`r!gbT^1}w=_tXbax3GknRShq`R9HBr<*Nj@(lGCXcNzFxJt6Nu)b1_g&)<5 z8Ae|WTc+79!CeZk@;B~@Y*T_vPbRQsUy41#&~QQPeo+iZxttDlMovFzI-xyT|F-Q$H{~1X$;@!=*3K?YZcOu;Y2!s zmb}jTEtA3r{b-f4+BgCCADe5B`y((t{wL18Eu?98#zjW-N2~S_)p5O7iS2Y^pz`?> zqr24KsZ##h;*-^k^@d*=E*0@IR8o)8$T89Hm*|zgSKQwiw_-XDbJCM4lZgc*A|HI> zVX1+5NeZHNCw|Bz1#aZ3N~B1^cnxgE3};mWkMC6pE&_w3nwpms?d?707f7{|YXQ8Z zcu*D2_X;~AsIBWv=H&%2@Up(s>5=gXW+z?jb-VEHfTB(_(+%dbY`nOH(KnkVD&o<@ zNgF=zyp%oS3)fHK>gS^Ag=4$_gtwnlek*jO9cLc(qqs{MK`7r>wj$4QI|{F}| zjybgQ_XnbqF+7nsulZ)WUxoc*{rQnyO|>j4Yqb50El+U@RV-T}FEUC#`UG-oGIgYx z5ldmN<|S`@jfCjsT8b#O%0r`6iy91d_4VhR{z%e#rZ(RXxeu_8zrQ1{$LTO#j`pZ@fU(Qt?0t0e>XQ{UF~ zg`-&qZ2Z}~51mhfgzAl57u}L-PYz=vfUM{S#WebS=?SR(qg{z`ju>1aiuPw?{f0Fj(_;2T^y*?-!kn@ z#r9d+L%hQKZ_5p^`4MVRU(4Dg>i+I?vao({ zxM&1u%Sjt>o4|DBFem8}BEju9Oy!KWSjz)ULY+Kc}kIT`HnsmRwFQaAm4Q9;()i9plE|*%@4M#tO+b7L%T)jy$m_qKi zC0TCcwSCU}WiCz7H1==ofBVT+6xK~01YrV!F{HapD!KKA_I1wGv zRh1BH@@qcYly*eT-}$?)JU~`)$=|qi#GohV7UT$b&+N<F zhEHZN^bp^!|ITsvhlG!#*_M)j)prpc7; zQk`6H-zA;yIi=a1!RWkiOdRb8Sprs()=GIJ@?X_%6}d@o&vuP&HuGVPQw;o#RX^uo zWN1v$`1+CgF8XW3UMUs#S^#hGM+)P7l;fhj_lf03PA{mmXVTRzZbGG!y_KYw*E!X0 zp)Q-F8-3{JbPww<&;`yZS~Xc>M+RVW-LALO4{P!d-hPOB*8NHPcbB8$i6>CSrOTt! ztv~Y{p1SFG>`NtF`ZYoK`;jnZ1V06WNIl+^=k)TX!pmrww7;gm%85Tm^k+f-IJ8k; zfx)W3&4T_Jg){O1w!|2|o>6uEO&j{X`|zmGG?B&l9wnj0o;H8+3Uf==!~gHPm>9`} z)_ledS5bc2*A>~Qrf*2(Pt+p$LY~&im~U0qm_r4^1a6n~`L8bbr&R7b*Bqy9UZ{1&@UcogM1n!A zy7v+C80H-dKK!xL*4{ypq%BVf6OG0{WMr^?8GTto#h=x%b|-lHvn%&@Kkgi_11Iuf z?X8^GJulWV-qz9y(;C7>k4%Zt`*Yjnwrc~q&rMsIC+NBCx!;Y>64v~2>_&5&tFh)U z$2HgDO4qs*bzfJxagd7>%hfXzbx0WoX-$q?(CZB+N!sbgz=B>L&n-emc)k(SEQq?H z+t>VuKRTzd^Z_p<4xqP|W+_%I8zQk#sytVDLPsUrn>Vs4k^zzvb$U^rIr({yZ&S>~fH!v;PbYVuM}ga|<`a zcaJx`h!Pr#BgXXQ8@nqKgcE9~o~P^;a_E?G_OyD-wT+Q zc-g7ya^Q2xqGdi>$-hBIk7G<4s&o8RteSbe(#>I~c??T4=i0%-QOGbGxWibIp;nZ7 zNAhcLkkM$UO5SdC8$;>(&O-(jePi4E#XDLw^t~1TiEzul!Ik&BGNOv+SnEHA%vP@*kIARvGeEEfJ{pP$`@)}IXv{P^8fgWZ=e!YX{XL@fGUD|jQ-(jbGlx4N6n;Rtv$3@Au zYO;`;y40=|4xD9lrOrk!NxjjiHX;A!eu7W)yxSO;ZFHckh(ub#0X&l=WJr|T=1y=f`<*lj4c)v9T?wI!uGeOQ$lstq=lw!A$55f(vxNqyscF{O!%pr3-8!Lz%hmAG2_KGaR0aqnSmr_@^;l z<480Z8Rt%2mF6)@lnFmRQ^76I2L&ysG3cNN^VxIXCl5EaxhEc;=*`SBL>wRqr)>@3R3DMPSJ-a7oi#7<6)Z~YqZIRb-_2EX^+Jp57~ZPM5!SEM+s<0LIVSPePHnAD=AGfO zdtDRD;@2W^&W-NgUe?1koQJF3*AzO#)mw)~#!U{%cfUz}v6e4S_o;VHE&9vuujkSm zW6=~^Q)CNi+N`XtPr0AF)@MK$g6*L+tnZg^M&VKzmCWh$z z@afS25eTsuwjVtR4caR9qnPnuE*`bQndNN;D9T$VKI1DP*mGFR`Fu^{K@?(>KlZs# z@yl8~wH~2+HEMYyMOXR#T)k^fG5Vs0t2@+CNn6C+Fa(`NHj9Qpw zsPK(!`?#kWvbPRfst%HHRUa()Gc^1g3{U4A-MTdE_g4TPuTOBh|pdC!^n3 zGDIw26)hm&ZV#1e+n?CD9tW7qxLrIa@$ur(&0&0KzQZZy-@wbbv3)uC%4-nr!PP%W zu-wZ_yQMj0fGIv$?RofA!eNp<-}~69R#rbJR(!!@%W11w2)DTHig63R!{6g(W+xKq zw#;rp5-;?Pi|lG?I+8Le1ij&KQSNOQHRj`SEo4%GAYFZo83*(EW_sFI_gFQ-q%Pu_ zr9SsTgO0T4^+6gsYWe5dTe6HJ{@t_^Iobx@yKcw17kJK{1?no@N7%-M{q)o@C#<2H zTOE#+5^g4{pIqKhX4}w27FNcgV84BdKTqiI>`tUW$G$eM7@gY;|F`nL3eBF72>_-Z zHvjTR4enjLSxUUPqMI%o%?4_3dx~3>V(o^|QXO7tp<9T(!>QQ}gBCdM$264{U%bUZ z0lv`}{ny03fS&4|rPtElu8FFj ziKN?i@#D8=;+Lgh{pt;eh{>U368IbIq-qyAqPhKBRA1XSO`*wQ79CmZV zuHaQdiX;kf3}jX*@Swrk!KCAHmalWll))ikIUVB{aQ%Wsn=Q1OlKzjN?GvH&Us-E% z*|BY5+beVizy4S@oYx^v6w8`kJARgYvu*dgAu(oHY}w7@jWlNy5zAi%p6a3Zgx;0& z&PEDl=w>s*sRAi=7NbwSntoBn5IGO1Uz@sl3S2pGPjn&2 zCcQ4G6b?iG{RPo%BVyAt8PZ|RT0@1EQtFwvm{Qr6nSRxlFWXN+nc&L^KjK)cC>~V_ zKNZ?;*E+II)aUWcd+zPOf}5X%oXam=f5V&5_vasWKqs0EE%{0$Y?f2t5Y9W*76LxR zj^~k=Ot5lW?KM<~`EJcs@A`1Hq*5mRog+dg^uVqQrWg(yIpV6|UI;*RltE^zP4(o4*#g!0=I=rlfq`3<_~ z;}R-wg;pd097;m^>t5^`5J2jBUm5p=;R~}gnD*e-S)~Ht{G(DEG|0O%NWL@gO==%` z^90%f^C!%iA{6hRuk2~$X{`CUI&2zqoRdhqm}INBrWv&G5fBLKGLmoo$Ph^SRSM5f z^UQxYI6*@T?zCA{&sqx!l$T3r2y>ax0%?Ipgn)RVmWGZl2f%Hc*hV`8QO#Fc??wXJ z2gqn`zccvv1K-fVMFEd>Lg}~tVS5+C?4lD!B3ACm}7g`aF)#2}6_8UD5 z_xn~`uoWlC^rzS1vr?_HkB+L|QZB^5<4H#B8)KU#^@1bBXHL7F`vcz(PMmLviv&oK z;BA$(62sqMLbCW0jRs0j?{+QumTE`JXi|MwD551kdS&`X8odcwu02?O-ftA6PA3LZ z3m?VawrPTe+DDu&7&x0Pgy0Hf23jpF9Edo(L8Okqn&Ke<_Rx2i!(~1IO?;%QdF(Z^ z;6VV=*Oj4ZuachIYlmB|sZI z!lDs;w|N`oAjC$Q5j5nx8Hk;IdjWl-XH!lcL3l=zT^h7Jtb;yW%bhPDnnT`OiD~d^ zmuNH_lyXI~6{mqL3bty31|!1?83WYVXMXJ@q|X%o9T!Ni&()?gNDOlHL*Fw6k5-OZ zhnf{zPke+`16YrGo)F8+5-IIjYBRD9AJXR3I;v5F>vyuNm5dg>xl`{Qmw=0!Ya+y`{M$_JrZ3rzY=4c~(BfWNx+;RgF5pe3vYLr=yo{nis zAAv^Zzh=rg8I0*%F1u{|47@)DT78LkJpGn97+e0`6)dINgvamwb z;{o~u#nEem6KSGKb(-$w#!;MqA)JBuxf}+jF{U1G;x^$V-cR&AhR~|Bv+`9`mbEox zBMkna%7^AqLru1nLC;*WpAk)mjUk@%{VF6;`b5O?K+VjeJz&cHoofTY_VVG zkEgj?j@hbtk4Yg+xbnkv>!GiQH<%AI=_03vOSiI-BON-IRwV8I-K<-9O-n#t1waNH zZ#zHCT%3+i3eMmE>oDY>%V9b0zxd5DrqhLl*gbQo!Ogf8M zz_y5Rk=mT;;q8_4Z;?M-p@C{R^(ebL=x@{VbD(1gb!@#Eed^%QS-btbWK~p5YQ||3iXQgo0D6Nn33$|UY ztrkjiq1JvzA%6|QVYLUo~Z%6L!(90lyu1)}Xe)>_xzUP})PJXBSuNFjfa+!U@_Y7i`75 zP5!$(gDdItUrpt|=HBe9Vy|(y^~C9};-|*%-8IWcrY%c~76yx!QIkF)ym8u!H7r&{ zCOJZMFA_Z2OOq<)qxRRmv@uazKk5(OE4+l_j31~{(7W3$Iki~mm3es(yNuGV4^*^8 zcm97JL-w$HmIt2tuadK}ictT8n}jlAQm%6rArMax_)w#@CHo=6cW!@SonRt>MTyJ{ z=O(PGg?`FBB|C-#jps~P3@I8uoT^NsuS%g>ZC^%h1d(!a7)xS${`N>#*uqq-dAPz4 zTAB?0w)jQPl#*e~^Z4uul{$Ag=lp-$x|laZ%aZ=3kVVll17hc^gu0(xau2)W&8}+- zSYiZ`nKL1REj8%A8X!YrG-A$Yi)65Ve$W~gKn=HlC|8(~!J=sic^<&%gY0!By&x~{ zPZl0+?Zp)jVo+U4cQKLkpBaq$JP+rje^#dd#>7bEXhY zy^mY_BF6aR_2J)>cJ(y7t!z@XWSwYe-gQ{PqfMe&b&L===g!sH70xlLc3{jY3vS_) zcVLX0MJnZb|2!_JG0}tI(tMfqc$U}0=IqV>%eEg$92|P0k3-r%GmnSg(Hj{;}wZnC9BW4Kfr4 zz-U2W+#1Z7KF(kR1P_3@SK6(KAwclTVZIV9$&Wtfj}R=tNj!8Uw0Cf*uu26$tcRUJ z4v*BFC7Ae>#SuNmq zi37e$?QD=m6@T>saw2pCJcNvNiiGkD3%N?G-N(i6Ar6?lS65deZ(aakF0*W`5sM@r zNm)r|U8@|>anXEJ_#@6fG&57bf(cFx4Z}8Y&46kBA9VR*z-BqZU!0frtH1v*w#>20#sVpCOmwu6sAxC3 z;I11%iA=4|cjI?_`xT7d7B#!SzcKxEcJa}=XNOc98U{j0>JRt?bO^eOFM>3x)Pja^ z3>c5`k5o$|@f!p@P42uRaHGm!Z>yd?Q+%JIciLV|#>|6XA|D`AP<_TyW?}DcY#-=HW&?j@H zUjb$|cu&~C{pf&NYtOummzqM>q>7aUEea89YwMP5tDi%4z?h2^caMRN&IpV+E}TU% z(9^%=7VaB!bN)fr&Z zVlp!$trnaHUUPERjkuIsrGg9&5Na(}Xy3j2URfFA$|ol&i46S1z~_|;;?ls$dd$k2 z^T^^1zVn+_4Ubv1bxqu~TyEwbH>>vZ4H24E>r>=k7~9BV?jpypLCgMD?bxH|@~ngh z-9VqMOV`ST%@cmmbgb0P=i{~v4yGK2U3WAwzSHiY5rS;ows1*`L@&9wygS8E=bZAK z%Bt1H--d0}6WG@W@!ge0IWhMqC9h*L{N9qo1?!dj=3W`3M>_hzOikF3XEN3euZ_JU zEDLOl1T8#5*>e%joDxuSa+$C0QU9(>xk2MLC6ZA|TFW`%~j-T9b}JG04|G!lVh ztm4%a{BvL&cAmWjHiyrP^%b>G+W?R+S2__ZT20;68Uv^zBXMvCTR zu{xj&y#}PFV$GUD=XvneeS?DlHKwSp-UnvJEc0<+y#he0J}?VILrvXYYem$nzuFl{ z5i1GQCf%X9Xb3_U&*(F@rVwzz!a;q-KtT|Wg#-`2iQ(hlT6^f~l7Lj^;>NNrw+C!I z8i3YXx(gU_;4w;CaZ~4lP8r;zd4#1bxQ+_-;*R%PqUx*IYF8MZ?%4&>&77ysarBdPH1mc`SRC_E4jq298leop13TOZBd6# zp3~7ol=*xZ6d$_PHBaZnGmleGN4t)cs9{fxF(GPigZ`%B#2-_X5}S_YuGyB3<0Pm| zG>b+l&gsi}RQXC{peQMQ)HrLQlkHUe;_n@I9^7kC12f0Zi&UWY{f1Kt_B#o1;M4Er zvuK9oSs*bFl6ID9zl*IkdWtPb3)dIBCSNdAvuTRNzHA0Gn@Lz)A@JR*N2wA#}_tz2NFg%c? zzBmy-kln@_*yn~)tp!7ZPg8}em!7Tj-_pVM0mx~OjKzhLIzUw$jumV~t|1x(EQnbcgl>Qx>iL2avd$v1t-&Q`6B=U?TlQ z*N9I{6bD+aDVv5}zz_StMU)3TLTVP46>P!)T^pbtYWL?y#j_Q^k5ex-xlrMte5;`p z6l|;Yhm6`Z7cF`qJQW-X04f5_wwI|L1ZHW^OpJ5#ZI2) zsczHL!jt^BJOm%9@=r-VQaF+DqzdHuC7h5+%P|r;hTs>u^d{Rr8wODA{9gD78qh+{HAKI5>B9h-dex8(1^V)Rq-NMq5!iU2ad9w%W4 z=>$|h&qtWzkKx@AqnXn!KAXl3E-I?5r+0v4rrg$-?4TG&{&un))T^~wMWZdp&A)`b z`d@^TKKhDcADCX|VoX+xvXV5PK&FkIH~M#dgxkm&UdPX+9j-J+DqDN`9WGx{!8N($ z&3vO`_6P_!r;fwV`Mga<1QwT0GxL8@7VZnRHqL^AOeYCskm_nU*sw$OxE523yXtIu0x5uS~V{fofSw znES`o^(3AZRfpm00iMwBlGCIVtd^S9R+lr}0 z+vR@8?VrhM5li(OHHR7}Cz)>N3-CoN_k?!{Bm+O48m(KhAf1I#f??blU_xQy+rrbK zMWavZPq9#SP1~c@Vx$JiWJ}h%gwZ#T$RmFrk&7{%Tw>$fbuoMD{DCpuaiwnB?nEPw zbL3-F=^nf6y%#|z11GaA;KP2Zg9;QT+lYe!B`GOt8k%ol{Et^B!&n3CT~qgZs0J)=E)2 zNr(!65-{T1)p=x`f>EbWV9Tx%p0+5l(|I-HL~qowm|Z+?vvP~X8S0L3~O z;Eq3T@=iKL`4)eqfsxfxBYS}g00b-Krx{VZgR5=|^NK%ulmK4VNKopGG=8QV)b$9R zk|TIZ8s=fn!l~`bH!d<2fRJGsyR6StCZ8dzd*D9uxh7#D^XiLZ+Xwv6%G(-khy9iM z^>O6lv}4F5$rb~enowR>!8cf75J zg=&h4Oo{JtdtBU4(BH|vJ6G@gVup0dkHqvoc`(Ri+-4~A%6W5(Xj*P+J9!lY!EN`D zvm$5VZLwZk1iPT8T&4^m8XnI`?n1X`;nq(htMdl?Za#n1(xh&~pP0D(yFGCqQ&es35CYz}` z1Z+$kj;&TB@vN6>2^Z~63&egdeQko+-mHe*2a>Gn4zURqFeVLRxnw>v2nD-@#O5L8ed8T8_i2 zX#U9wDkCNmv@i3XvMPmS6yHmDwv-Q->bz76@ql}9^g%3HBsOIigIR+MG_J&38U&mN zY9w<$#}rVMs^NYb&wxUE9Mb2h(XYZ1D%OIS0Ms!M<1-Oej1&mVtjIA*cJ2%e;XapN0$QYx)8__?alB!o_m!vp$v>n zoTa&lD6v8?!^Je(yuGYot{?#y6!ghIz3~*d^%exI)S4EOoxv)A2{h#!EsCu(RI8h0 zlSM&AwRCW&i0vmn*X|z}c#|yi7(7C+{>tjzm4lANJBNUOr5nKOgRs z3GdnCt40Wgw+B9W&Z#yq7AAf1M2K)cw!|n=*=OR_w46xE(Wg?%@;9?++@_7w=?IN4 zLi%a+c7{PWD9{gTZAXUa63Xnb)9b0W7p|Jcd^Xb+_Y*bmU+a9CHachD9f)p zi*#Y~vKj$LjDH5Harsq>f(eiAn?M9Mf?P-(3pE4H+s|D|><%v_7hruv?MZ%j5)|*a zH;Ye$m+p8?#12h2mF1Z>C#c3la)@LM%24rbwSPHaevL2=nZV7tI ziWNR9ChHc>g%>6{H5sNzw(Zz!SIz(X+PdlAh?4aVaD98sD*h{c%(Sk6A=P=ywvt$5 zj|{bZPGL~oP_HsU1DnwY%W!?XzlSTNCG4R4>_!6kl#Nc7CnqP5X$ZieFFeSpAdXr3 zbk=G{Dur4vHCDKvStQVD_?M12Oo49ct@nfT0=#O-lFp1VXdL0-;AF+Up{Fl#4lW^( zq5&^7nDYXe^U2-C%4D05515WsrZNK+9YAt6Y~gd*wfu`B~$)knev1=Lt0gn}_mCfHprKS#oWnl&a05C>u4E$;6bQ)ea+8)cVbt{PPDV|W=DD9;|;%6?;p~lH%G-ibHMju#rVo)2bx-u_e zi%%k(S-(h`nxDy?>c`2g4J@o|R5cqrB6mPthBp`9R24!+!*v#OGb|@_Zfx&ocY_76VV^ED9%&duS)>20CZy|;`sJjda3^&w zw*@h^)1KDf(neBYu#V@FoDP!V%?@wS1nT3}v}Ic4Z`Fxu(3{0SrH7_<>QFi6P89Hr z?!|@gOl8{sWlkvl8nZOgC940Cam;}~&fI_iL8@Wlx!7XdupgCnXIfR+YN-SI)-|H; zMv*v!(XK+a{__eo@2>GJ!5#-a&t6{$G{dPN&x#eoWc#aqeg-^NU^~TL zj|TFOveQP&D_1m7s$4R)_(}0;=A5j0It6K2reL=Jo9hh2 zbeoHTJd!U?i_tsIlB6kJLX)o}V-K8;xeY=Ls*szq+Yt{N$S}G1#O{+=urw&`Zo(@r&XAas(KS`^8 z>^F?J`}2>Ix4O~TG;{ljbc!~in-e40%^w|1ZN-<)!E5*S92YkFQ4oFgxOayWX5fJ) ztdW=)wSC@{&-_qF-aE$XK>=FwglcK5LC|||RI9$No61e?s|DDf@do-xIoGebR2O9Y zi(jgLB|u+#dJB^BKj8I8!0?xg@QXNb#$6;_K5GSR#mLNkQosDZ;;{bXE7wj+TWtIT zT4wRZk#?dr97gVGdsY2GpE&pa`k>oosim1Q&gs?d2L>)n3TLU4Gw{qa>Q}C7bcGMY zuP)95qCD)qPB8O9p_F*~{&pkYKTnnwpUupd2)XUq)zxzd-k3aSsYglWavik`DPe|7 z=q@9CUZBK8lF;AlMC&<#KL+`;-}@{-H}=|Bn~Tzn6vDYccI>uUq-`Rf*A;ltM#8p8g5bMgNoju z*IL>2h^kFggmgN6Zbat|nQXDn(GG{ojtKQK*BWw2n)bRi^HGV8l#k!uhjLLt_Jsz{ zZ1*X(&!L3TrNB*iu*Wkxk`#l~Sw;xq) zb>Mn}cHr}i+1i6`Kp8_%ez#TJ)|*;p!g-v8?U3V(v|LSv71Ri&$Lki2G5q0Gu1^GaE%al%A~b|Iowzck!m)U`WA$hLF67b4Ghl z{H-ztt#X>oiTw97+G{ z#O(!~X94%VT~LTtR8gs3@w!r=?hC`O!soXC^7s;w`tT*MMG(?FKW0s0x8x8Gf+YBx zQGiwqqYXJI6TPOVuauuAjqG*10!J zxJeT8I#clT--(abfnys2o3-BiUE(cud__mJP`YJ)+&CGhj|I83+sC2lCC5Wq&BMyk z#%LRjT+6Xoz@g719WB^-ZjkhnlEm355dy1zoRRaEITQ^XJ%rWN{iSB6CzWdA(sH_* zb@x&&0}8s1GqwSy3P^3SJPpu#n<6oyY6_7xyeA_ho{$aF9ak5`U2l2*hs-vb?&o1dy z)7za=3EG*Cu5Q)Err^+Owpv(@v=C?(o*MtEs`Ys`=d?G^)4@dl%v;bbQRSVgX=)%y z1IvaVUC$4fTikw!P}Tnqr9Gc@GG@Xv0@h;M&U40Sl>5_~hqkWNAT9gAhW=hf^aI;IKMmqo$W6Z-T-+Z(r zR-5@nnZ=QsuhmQow@a=2egnD|G@#b2#gM=wmC$Eq&f6n>e;U|5Se40reOe%LcA;R= zw7uZf>YjdVHBE@rVTcjFwK#Z>YA5NmYoc(EeA(Mj{zO3npM#4`m>vmtGqR`MZ% zfku*;>i>QU(xYVKam3B6xOzG%PZGFADN5}#9cN89p3C3z#rd0QNKQQ{5gFK!`n+e$ z<*HH(J-wzpPUbD-CENZmpo(?-zcm-EhxtEwDY+loYZ0_wxL)N?(*J`KzV0dufBp3T z$H~5($2)=FJBVWWZ$S3HzAVyf0#@>5nS+*iP_^;#RTyiNMG{&)MMM&x0D>vZBaQIV zEDnbB?mL&I0h^KLGwvnsN=F_6L zmZhEbpZ5RjT4*$TON=!|y} zkmbUgWf^8LS=93x?bAoJZ;#5ZUn`KzF%=^ahX{FK>h)}IJtY7B&hE)(&QZh7QWJD( z@=|o+=zNBjdZ{}2CF%i{;h3rf&rFZx(>6i2p{9G~Ic=pbW2=1Z9f!A4G{_ovBF+bO zd>5PA=-lg{t}jU2pTgZ>Gv{dk?I;^+9T+gy<2>5cw=%T881A|PFI;~RIiSV@Rt8T)o1^Kh*!)pmz*!G9;5 zZvKV$qzuspuKkq7?N33zYvW3d2)=j(d&^t zTzKJUYE9B`j$BEDjBQFN|0kh&yvmBv{q(J>8fe=Ccd;H*xU|?=w^IwxzFhwK~;{2r~o;Z9g%bXHS;Hdq5vfcOxBlVoyu8M7I#?r{1cqtUD+ea@$UPun|Rj{b;jRkNCWOK8T8IwQ$2gKphn=`M@Uz2_C?e*^L)#wzhog7F88m%5tf%6f@qu3F-$mbjJr?(^cgEb*H zB}ty!KjM;sjcQE#`L1b8AI}cGbmi-=pp>o3fpg70DP=OIs+ji$A$69oq^PZoEE#v8 z{MTQ}*r}`L$#8cV-qPN#jdt%=o|b6!edc<+kVXhBtGYT4G=_Q7OMkrCNpEGuL5T** zGU(4p{T%&w2SB-n^w)xyi?4vaf&Pc5qyv9fF~pEe=vZpSb39)np0@_7wN4SmA!ew( z|2eFnM6hz&vRVzTR2wU{)*7frEr3TOoX$J0;AGio=!hF}j}2_^BvCvl)BeFg(}Eyb zsDisuW!u^EvjF#ZXq!%7+rycjHA$8KoeWK~pcwOAKP~>P+zW9wHrJEw8SecN46fFM zxG?Zewo$^EW~j@ScH;_U3_fNjM*mt!zy7)cV%$fng1hB?6=Rqm0*y# zoVuStVlwc)Eb0AV0Q%+w36b#cK{d05o%hy0UQbtTyMJHu`=^>)_q1R44QzSaO z;qFV15?xb!^sD>W-g~NX92K)Q3Bm=pIVUP^y~1ChwKoe@Fs35fEc zMD|Fa2y@;23%ZILlS#PgvqHaKq@h=3V1+#1%r_*6_l#-ii72YT=B;vMzHr^LjAjA_ z4rGt5UjOnLUCI$3XZU5X#3zgk3Pl9(wlb*4z^3w(rx!?{d!ib zMY2V+krOLA;wXq~5FQt@tyVVZWGYYB9P>;<(}fPQAbq7~Pju`}l6J2E z_n3L%;UlSJqs=z4vo*2uZ=O7@Czqo^esPQvLPPTXnyoG$V|v@pp8 z1Wxu=Np2~8O!?M(EN;k!{>^tV=|W)R2wT4Ul&C-i<=^(I(^J=^Btzqqq*?Q3VFkks zqlDjooUgNj_*~eMZ(HC$fYv#S6b(rA2*SVD+{@DF1ay!^tnINqF}Mtf^Sol?XLJiQ z&0|;%3$T~uC24(+ng5yo?MHn0O7mg>Y4XnWGt8CDn{egfeURWv38+=7H}O^H3Qm`d zkj<7V?-gwt5x#1}_2={o1aWEyUE>TUuA9f0Km|XVnY>LTXiC^>wJB$klN|v+$18PHH(*XFxSzphII*S)*%SiUKbdDcp9s9=#eI;wk*5y@-;^{21C*+(*=e=c%$jEkjX9FBC9i$b-x80Gc4G?`@~F0mO$=1nKGL#E z*iW&I;JXsDs=ehh|7AMm)S_l^r!p}*R%UUZT zJ)Zsn?PKO6Y59&ZF5sdsOic=47h-*p|f z?SLBdrTSGwy%BMzyDipEkNuW)8iFvfPN z3MI&2V_e9F91RHGoV3fT9S_VFe3rZ6G9RPo%`o>aY@IKVe!qEQY!S-W~f+|_x?kD zlRQJOGk1W24+O?Wt?|GgsmB@oJt48&bromNJo4!0W$tX_OUCB&Cvp|TcV*3^3)#!- z*>wk|`$Ng<1L9;j8}a`SPiGlbRoixL8l+3<5@gfe-Q6J#(%s!1lF|**Akr-*-CfdM z(rh}vh4=e>{}_Y89-FnUJkL4jk@)~#xeTMzYfTxN&>J|$b3V^ROcL(Z0usofo1a<^ zZM2)v?YqZTZcm$Fd?`(2v{)W(D}R|IlJ`$+O*!A}*Os4sL`T6u0&!RE*NpB-?a{yH z>>_pStQ7n;3V~X2`HZ%85)OzHwZrPE_kLOvlVc(tE72hK#IpJy-lm0#;0Z)7RPL-d zy~N1VKhy!=dv+Gy^Wb^cqXydJ;e~e5h|O&FkK>A~7ALYn7-YMb(peB_vDpv>Bw6A( zMPG&W4xU-M?r&=q?#qVe%k#y;3d;cnK6cD@`n&RXaLD;B=Q~7k4q|7jQ-@qAOSxk> z;16{V<*D}vr)1GO1@E5TWw$-&;SODn31;DVcnljmJGO12GP_SJ()mKzdLhsLBY0~rqE7bk;U#KjX6Kbs7` z*L$M6d{L0AYEv-Jl$&%9+n~JlHdYjg!doY;$)^B%q~{>Cf*4 z-OH((6SmZVXn2jSpT1l2nAakg!xoxBAG^_NnfM1tenaI@*kx*pcI|x`xvhv*f02)b zdlu6`wi6U9rJrz90T4C21tXB#05QSztrz0IQoex2|&yopTs=r~r`1d1J zxCW>}w7fCz%W5(GY=s6iXd425`9itCjF=!wmPs9}etwoFB7U$rjSQzk7!NU~(#B(+ z=TXx>yIzD^&4^$80zGst-(#tJk|FjeaCqFYCeH(j*`A!S^NJ>A+wkG9^GaS!HGj-J zzJb1LkU~Oqs(h3+E@BaKBq1<=sq|>A>>la?!cm@ON%3QI9Myo_ z8HV;CPXphs1pCB#-WxFv{$~o^?(RDD^ElH=ERM zp6ffaEgiPwl|;|n*aF*J=gAQP)612HD+@gW9f{!ou5fz2AabF9TU1EtUp5A1h2!ZA zom`(t9R?4`0vA~hu{`V-A%r6K$AzlCVf&5&1bC$s@!!$l=U0xIVg=jU8QRj5z1>H3 zy}bG`C4rVeHgSTHi#e16D8qVdb1WuL26#5h-d_n^w|oy&Jn5voMtx;j2>b*-e+(OP zWP>RmjcvRF`v~5j7{SHDiBjjI+>qCL0;W38Z>Q`)mKKLaf(#`si1c+)@8zo}YC{Pm zG@x^{u;R23vl7jcJ@pBJR)<CQ%()qP5oc-sGbs*x%%K#a@JG8$z8NB51R~ zZyHWLM?7cFNA8PDvQp|e@NbzpAj=g8i(MKc(ItL|xse=ievb{mV!v0FXcN z@Lm>tcO#np>lvNf6zkDOXfSiS;$W2ISAuM`=We~&Y{z{T{ers-&YNsryJ5A^yr3x2 zzw~eOJ)8R@nKiU|PaF$3gIsMo$0v~68jwoTl4?)X7sj5+BoAHDesXh$2B!O5wVdW_ zlX|g6U_W!2wg%I5YV3qmBn_|hGmSMg`7?tpzT}TycM*O)E58Y=^(;p!g^h3mc-{LcbE_vHGDxn@Yc9`L@lb%X43} zsbBk{Py3aPZM76Q%Z}1okoxI7QIe;>GW~VABb0<~d2SBly2;gA@yu_AyBdfl@#`G? z$4^(^*@UYt?Zt8m6m_+`Uv8Wmij^-EEoebIsyL26?Nj||KW9>0@gsWozCi1!;Bemj zQTaW7O#DKCpYN}r?F|~Pt3NY&%E$|I9>aSZ3hiaf^$-KD7x;u@p7H#tY^=aT26U zx~>mA)@*g#A3lenwZ|Kew}&<5*mm!_Bk%U2R;jd)2WI)`vg-~kzBk9gC0-xT=?4+W zUPxYAES?aeTB_L|m3x%QN8>%C;++(DWy9&RZG6mE-;N5jP*7@ThOY@*MUOnmpgwR568hVGAh zP0QhL1^n0VI_`|%B#B%@u*KeQdJ+SX;051Fb2aIHNjB!n6yb6^QJClYa-_?drT$!K zv|aPuCj#nA50qYx=>?-{GI z%w`J%kTkcr2$M+Y*GPkph7AR8zIozu$A}=IwJgFp~`#9 zV(dHzblU7nO??c6&~pOBftqT5@!yk$bR|w=(!j@>i(I}jDb5jd5 z#6(RiRQcRT6+@CTv(!`5c#3xS1PS!frf_3L`)mDm33V1y8)@P&K*1+wlD>CPhDqjz zygCbb6dRn5Kao?mKPQPc^3@ec+pwfS50esJB`TP^Nv#(lgo${#{W2n0CJ8n+b*LBS z+5sg?eMb=#?);ct;}3308ZrTlG=QzarRo9Iq5^QW0Q{vXAj)0$Hawn9pp#^wv59&n zQu?@|KiT@#Akq-`4ImYa$`b*~@dy$QhC8YC0(4kg0N}v{;OuCoTqo{Z0zAmw;J4%0 zk7jsckAS1f)>C)J*VJ4Xy<#DZtp)a-h##(XY0q*Lp?T;cYU0|~fK0vE@^aOEeG0%N zLIvjL`jY_?B%4K+w?csUU%HrNY2#-x-n<*#>BCtCgF4p3lU$u;fm^APX|=sr5e>d| zv(`iGWsXmFkEg@W4^uB(g)GZ$Q_j*wtF|9j?wufFZ8!hSPvG3mU!PpzzK=~_Gt9=z zA~M2gOzwKQh)t9+chi1JCrLhw9oR^a`eT!g^eH?3tPgG1{nOuoR!{@-TELJ}wd`J$6s`83nan#2=KszU==q3h#?Ks9#s}tr1L2Mo9`q>Pst!*z};AL zJ0rw}2~>c(IAX-&zr}&V^v130<~KDu$szLPK29;o*mqVaaRsff_%4hKF%9aV8B7=( z?_;cpFSGkVe#{fP3HWbUcpH5;%3*SLZ-z4a&-4R@#tlsI!Hl0Y(aUXS(BR}LqkX<= zSr0Qez;`f(hQgK_OeKE4@2)=P{RK%T9;`Zfh~W1_{+YPY1i8oh2y z%I5`wRnRB&-TKd-PNXf8jxR}CXt@%FW`dVU-A+*dp5NOOFv|V(@4$83?xP%O#y7Tb zNcz(wMp`z(qUob{UKa_(41`Zhhz5VK%JumV4G`ufxXuwB1s9Suq-Koi9ZIhe`Xx28 ze_Gqh0UG4{iVIi(8V+S4=LB|QPX3spA!KOC9wcD=h*S;Ks|*cq*gMnpLJ^f#IdO`x zM?~g^V!{At8yFtALhhoeXlhF7v(@*^tw`!OhyXLnFG$@+>wj7RHl9y}BSqEK->mLi za4oXrvfLIr!qr(K=`#}{sCp#zg~@<|>P`r>RO9=9L!+}&koG#K@Cs;M)qsv~AR<%{ zXPDeB-Jxgp2hLc_tc24mQV-G-C7dUE$lVUWM@%nspq7WrDDKA~NWROhaGk1SCpY!Y z$Sl3KpoJX2B+gFFuR8&Y*D@&z+kI08Qo<2}dJ3^a{2J^1)M)Lpxl0bq5f|8E?rmXd zFxmEp^ZOFW95a=ML<(*9L_mq*RNI&;)DQqC3sFPE;szpQ77KO>+fEeHWrf2*#p5QD z;PsZh63V(Zq{UV&vD#lO)Z1f=mmw?&a>pxCM9ia)#GJ47Xke%!76s`#o*ms4Fn`=+ zD{(oA3f!s}#h?1MzA7dn3=uSiekRBS_1YQLt?T6ac~fYpmEru8tC$QD79q~g+gDt_6`BL1&u z- zN^qa9 z*~NTd*#$vZ&1g?&ia9k**pT2z6zTJyY%#yCjKNO?9@a}V4BT|N-vs-vIXed@8A(2# z&~0Rj*EOHpqg|e%?WubAaG~<&F}kAZ4qo$Tp8r+PZax@8r`^P+I3hhf>nvZMNi7w9aDng`EQTcQOqDKNfrBLxuY%a|`!j zqEUt$i<5CuT`-k)1AWmgq@mrxOnR+xuDHJ^+);|3{B)!!Q;1$|g6I0(MY^BQJl#^R zBXq9aqzk72zXM**LYb2Y}f z`Ij$mn=~*`(!4uDk^)hQrF3J_gpNP{yCIy z-VID0D$kjCh&wg51V98_`S{w@EWeMo`yFQe=C}$M-s>(GeZ#1V17Xvc-X$71E+8qY zt}b?eDB-b>ZVT0V?f9xr6K=uATT6~P@(F|~W*uYxscdndLE!o9{m#z(=3S-yo!<$Z z$P{VZx*ytOw&VN$rd($5Bf2l@4R}607lY}$!bygl&$XajR#OHKJfWB{>9URzb=^nK zv@jva``_fZ0$r4x-NNu}-4`Y%S$9WF@5P=nf+iJ#KqX5N0s2)yekgMMp{1oIInI1E zP1%vQ9FNz{W_KMr&?Zv`NVoEJBjkVb8q#P4AOP$O_DrZvFCHn5XW zj+`skfOY^lh>ieW!|C<;Ru+*CScJVpYIGQcmU_4j2nkOv58kgfz0_R3n%EKa`yoSc8KFPF}&zvZw-u`D}7C^eRd``2R&jIYB2ks=md#1mCZ zw#J3;LQbX66A}(1X)p9ddvD!@z<~1v|AZ`Kr&v_hvAiBl{O0tsJ>~s{EuGv$v*iJ~ z?$uxgZl)~l!Z#UhuAFdFt=V$D-~@To@3K^oRyaFGo*5=dU>$+3(}Pr z?W3i{V&!`94V61V?Ux(xpWa7aR$(Z1KDHb+-(kZ0IuxOmJIzK}1Vsg6r#Jifmdc0 zmx#evzi(<<^NIrERMLR6+;XEWZ7>x?x?C6lIGOn_42{oeH>$3o*Pu5^jvvDUz|jDg zs01L82AbRr#Xo;W11=B8-DHi=vx;@D^T6LE0;f0t1NfFS0rAGQ2W2@xK`^#oVFFU( zPw`Sx{|$iNQ`yUt#iW#CDIHWn#E*cosGkh~9hOoN-{W7a@#hT}!jT^joD;-_pQDXm zKesP_bKyS8QS>-^MePH#g^}U7U*OdK)#G`6<|X70yQD@7RcB8#$ zxd9&B!w4JeEXm^~$fo@n%iOg$sGf=ZID_NPd1`JyidTX}eC&W^fmy|z+Ok5?Ac`=k z+{+r*Sl1P{JTvp@hP_a}%RAq;2lzzwY>VGeC{C6?+wM`+dOR@_hOXMoyl^P&{Tx9;=@i3 z2?AjP{DHhLtts`N};Oi?_H6r^YkW8j;8_7>~7S zfEhg1P~eV1XmD2SNzk|3dZXM`p!j)WLUa|2Pp-~}2 z<^rHpT|9v&oHs*pK6lsyp6<~s?!?`ZRA?smQ{8c{ZRA+4Erd6|I-oZPw6_pkv7%Ji zP#gUO_JzQU9R*-qttSHaJBdlDsj5}_{DAXnxU3{+7+{fx+b;WD4uJq`QAd8I6*_A8 zkO@mPiC~UlPuSECby}d)2l&Q;%$dt2>#8XL=*8oH8a)AW9tF;qe^`Hrk#Ly8X!5)$ zqgr;5$m}{lw92-$NTR5uXzU^>;h|ejM_s=Qzm_dNf7TmtnB7SIbVv4LB*V3{!Rp~Y zWs_x+;L+cuMx0~2DZLpXC``xsyT`xvD|r~dOp|Daljd?`y{$7swinu7DPgnu4mK2| zUi_X+@IHE_Gih~@rSoUZxDu*C6o<9VIqrjF|M<*DRdUp8h1Vp#s*k3Rcl+1omsf%> z!q0WYd8WVb8Cu$iZXU{mhBq-(^qV{!m#>}#2@>?@i zoghr)^KqnC!@cg^q$Hi*?#WU^{#wVRNLM^c?6FNj#+c2=hRn$>Dy8ft=5LTrMh1JV zwU9AQsW1@_t{mhm3V%?O%t%j!eg{|xvD&EYfY#CQXGkb8-(jJKe-$&vRx6iKplJ4v zV?_UW@Yp`*BhH1H;9>xrw!#5_xAS%kCvbvG1S#$T=t972lM9W?_2p3_J5sqTxgeNU zMJ>Hp8jy&49^{47>|g)MpgbDqJ=@8BeFD9)%gH68f4lnQw&w!&SY>4l68|S=2*9YY zWas@7DMti2wJ5U{z_Y4~jw_A>>Tp&$-lyC^Bl3;91jz;L9&hAkAc{sn?cc7T{N9Pl zY9e2{X(a9Z0@U_AOTV&Ig4eUIBkaK_+ofEtWiF6;!DApG5MadJ)N3I1G~%vFRN1#H zc_#TR5d+K_j;o;f-i&O@Q1TZT#3mOMS)&sVqc0$iJ|aTUV-=h64}93eW6TigRO1eN2L@usi`z(#`P|OSFUvDQ?Jx&MQ4X_eZs|h%1XEi zM~mrGO`e9*sFOd1NIWXFCLfR1+7ri5mYrYbn(Eppf-N&N#gXuwUZm?!CNrVoI|qaJ ziA0tfhiqrVh$Wl4YxJJtnGD*WxdvPqg8`h&p2pkR-O&;E`#T)GPRD50(Ot=DWAD0Q(S?jg1d0W&X&pOIpCq(Ye+GWjD zW@h&uPFn1k3x`*?tByxeqnBJXV~dJ+65zo&xVnJ?pB+u-!I)W-yi8CqH&CNOyX1=l zc(6nP0CFj#^{gWksJT3EISl|xULay*2LOqI&=DppbT|RD3dBr_B7CXt+4%9@(){n? z*p9m`BnTk=iv_@_SWH5Ecd7*+51Lfl>Ilfa4Va{}5(cx@OctLVY_u0Ikz|mwjs`JB_xMpc-toXfh*muWxuGV zIsKR?=1bbHaZXp{^+uB0+@KA^Bbg>tJ+~=>f!>`zF5*wMgu?AS>|Rd$yxVo+y?X1{ zP$=Dj{5G~gl?@Zj`eW9Rs>c_iiJ|JU!YpSyU;G~V#9G~?#QcedIHwHr_)^b%eR={LGA2`O(}%cUhZ(@VTiMVQUeqX%~g7_ z(uYyfUr1{#aG?haF)5}$0IZDwCn+Addu}orSq|s15!RORI_f69q)Ut_IO%?@5T{Fo zjEu`#CqhN6Vd{+@|C{YR`u4l08YJpv6$!2H^rk~Gg;+Z0@C9kfo$LYgFa^x@$=yzT zNrxa#P}n7%%n0T(ktjuq=%oFYCiU<(br}+%fv~p?Rszh;LIA+a1JH^?zFk#-MewE1 zbRdRc07$<$T<;VFoK^Y2m6lGcHstwc8STxBJ=5k1&Sq$3|8gOlZHmToKng+ZcV}4H z@$mOVf7wm!>s!gHG4CgR|MPhc#-w@Ihd(h>d;~kHa+noKEsA_X(*?`Poyn@Dh2tLkfGeB5Q z-;5RDq8|9K!P5OHj6WT3RnYRpOG;MvyAAzA12Dk>x6lct_LE*JHrrQ^rva2ynN4l# ztsyoU>gge_&wU4|MZaZ0)QpTEQ*J8QLz67ArL}v@zudheSjk;+6-QE^8Y@*Xu1i`> zHjJ}gf5+U($kMKrDJ_XZyY+u0j#Jeq2GyNVB}V!JEVZP8ZHk$BH_3fX%i)m`=|Z|B z70ogj%aO541L|WJ7H?!7M)e%gkHmoWopIY^ahIkMU>r*q`~3l^s}Ug9#jjKit*f<- zFoL}XfpDVFSD}K3UD>Ph9eM}nSGVY_O^**RPet<7_2!8~6jHq-iwRfGk4Pkw%(dSh zB^Aj3&V(2nQVMtz(BIgLEfeF^ctk~g?LUX5(i6y@iQ^A?z7Y(-s>Bzj+LJ7Z2<4OD z7szr8XDe}>`Jnr>fs1&VFXwl|5f*)y#Him9{}98gN?6{-3zXxC>_FmW(IpR;qPsBnKQd7bH{5YrQ7q%9hp5kI+U>9S;-@I#-Ge4Ei&bTz1@vEpEIY6 zURUpo4Y>ghQL8Q>qX(#iYRL-O{wcs|3Q|qM>P0s2D-d2$1DO8b&f@^14uWPM0)Wgx zK&0wAz3b~+Y3&ErU_D%hR?wP3Uz3F~9-G9a`` zKD5AE?6|!OY3Fmv-#xNka_i|^I(J8)An=zC&NcUU)R0}9-}Vq!2kvk~8n^EU>WYK; zqW3tt4^;l0KS73^q59l8l9Yv7Pimqao`)p5Pgihz4Eo}KqcH0EUikLth!k!8Ga$`# zWCp^`fRJfzI=w6U!}?DJ1)=Dz02W#^r4P7ZYc@NO^@O8U*=($9V84H_Ui^*c`D#WB z;LZZhKX^YWdf=`BNi(C}VAR-C1x}Ch$Y+C;QC@ zJxQjBWvf!cN zP*hp^!Rxc2AJt(i7P#h#F(3O17!`MFH|?uU_H4T0Z@zTy_}_aKiKj|HUK$CkkzB)_ zRCT67XK+y1SyE*WL~VEMt~s8~aQ*!@N|kYHfVOb0wDjrEC1Fm>GXNM?z+ln^l%iV9 z)7sFnsXfMwPpKJYVVufJRs9^wiO$QTmWij(SU{Wzw|e?P)~VxOYqluo2B})OGkjSdw0H> zT$Kyl(2@s!HWUL-ulQsuuu_ZCM2a#X6f?U21XQIu8_kv|0ZEc$tk@5#Gv0GnPPbL90W9htpc!~C-r_wb(#NVRRx2gyYtAmAG(XE~EV-z&UpAiF1G zVbAe)e<0p*cu}QT>+zy|g`d843|}%^s3V^8{VjMO?po(Iy?3-xz*!L1vdQ^)?qzy_#bLPeVW@#`H2(AwXSG zTQH;|tvk^*X4^k=Cck^yQovRF80vC(Nzeb6z35kGw7rJ?PW2NmhgEAo#mS)ouA$+^ zEuIBD^2~<6^}M4{CLC9+g!iI;3$M;f4J)CyoquCJUiTl)_XNxOa^V>tQgDhC#z@Vo zAo<*sc~x%Ez^IFr;i$8_c^dtW`#+@X?frSkdEGaUKN}J%25pE$tm{{;0Qz@euQLXQ zB@p8DRIcRge#E#RXB4vOm;1Tpgec{2b%=3TQZlM&TX?N zoxyEm;H*sd#(eqWJ&)dKoBao-*Gx~j`}0pr_1uA|3j$+@6;4u~WOgm5KBu@27{>by zCG|g(S`6e2^|;d%FwQy!l{bAvx)4G=1+vZqk-5*P!t^fueQIp@KZ(B@U*dq7 zpF54rP)yO42t2pes}iT+))l;B;|;uYU93PVv69cf*flSAT{txHN8FmwLOd804B^L5 zVS+1tlW1Sh_*C8z(4H{uoN0hpCL!Bi7DZ%6hBeu&@kcloVaA*UJRU_qS1gBYPmp0E zsMdL5zw-s2fPH%{5Z*?w)3^b?H=+2)g7afFxc(cef(SeyH@pcj(3M33{EH@62UBkY zPKk=*5HO&r@4F+G63zKEc|HbWc|tZ@MvGoIQyLxfO&U@~z`DJ7?{PD*XAq5VTBn@< z4vs584wkZ$C%(53kRgtjb+$?4{ zIi9?F6c^{kn+?PkBqmV_2@ElfDjOgc9C(Z-0K{D`SAeK9ttgIjbRnDmF1{uvP6&G9?6PWouk7M)j1LP_*e3C%cX##uNF2 z#YIj(*(`Yp79&zWai9F)u@UJFsJ$XGQwhi<`M4)8uD>EWOg1quwm41_ouf0r`u$ZR3DZHRlTw5eyLyE{2Xa~ zL;fkl~LccIT!4=Bxz#!C_p z0lAiM@!UXII^w^K?ao0E|C`(JNej4|1M!+~&d$+X!Cc4f{*%N+bwsiohDLbFd1nia z0mCi{taT36t>=|1k9Rtb&+*hga9q5P)POEkCb8PjlZ22qrmp7^J421-B5}k-MVe*V zmVto6@sAlrlnU@Kas+I`pBQR=_}ouH=yy%#T7$?Tpa)N)6h3p9LmSxe~z)EpU z6eX0nwu!rACyG!b>(^>a(8I*F9nJa{BM9URFc5Ic$k@L%d7t=l3n_re+zWG{_y8PM zflJ<7JUnnj?sr|Ksj&|W3MhM*zF|4o{LQhbOd+B(sIcNr;}*utD|}eZ*xeit51 zXDxBssd-z(ddCM5-bPw$-~1IUkh;0J&H1AkO0p;I>}hoUz<3;vq(wL`xZK<2hrP2J ze`bAoVVP2duWm~bV7H&G@~VO&thmY982G&ODP4|in+Y(@VordiN@nV97BL4L3;$^s zE)q>(-oh_etrXV_!+bJY#0A0>W6+zhi}Nn$SY)KG6?3hDBvGYqE9?PSQx2dc;ukv}C<_%f;)&B^j#lL;p2 z7&s1I{i2f!?uz`Nw5_{aLPMl$tnOJ}ni>&ATCjVA)VEYs!s6PjLb1hA8k34%k_0xi z?}7Nd@AVcaBPoDxkM1qxv4dX^N*imqOk#Gh`gpkryN?~Vg{%<#pK}a&Y!?d~kF+Fh z^Gf=}=7-bvj)WTHVeR)~H}_H$2|l;0PIMy)P>Z2*GbZ3YdSKZT!$)C;uXspF*$83pYF4{9!zQis!GabCAG`%Z*ukxQt2Y4xu&7CfYbVZ~fkW8H! z{Dx;v7K%4>50hq%(I@%LQ^wrgT&2cOpE50{@>`N@0pVCigY|;U#tmoW9hI>lT-vR zH;!MY6zQEmBa%v#JJ7ie6KgNoU_)UkWMv1r@MDDigdqi>F-Q)Js+*&ce0tlDBw_mew7n{l*SsX* z#a~4>lkAqCInnGv*RZA!(&L_C93T|KyH=#;26tAv1ySoiPtTYMW%M4!l!POqI*x>_ zBKn#&WraWnVh^)Z0T~~tXODh&5s4MZyOt1I>`nY2^ZaH(WnfPREU4bo#jAdYdP;}l zy^*lq0}M1DFIAO~^)MXik7{pDwX1I%Yd5r&g~Tv~v6Ym)s+!~(rN__W@|=}j=y5y+ zClcZJ6etsc7DFO~Zkv282RR+lU5Fv)J8 zK)gmQYI(ea4E1UCeqRzAZ-rHa2DH!iHoe~7=~mS!Q}jtY4qZbdsmW4Ui9D)Ry5DxK z-f|_)uCfMYsLFKkCgbh{Q~7i+8)->f3NAVK+wwFPGX2Pv7Pts;9&nC{Rgu086d zIcKHeJs@sT61LkyuKQFDb@>^>Pby3(JtU?mYtosdqq5pj#86_5IpWp(9GX(l9|f|= z!hI4VrLaO9nl0yO+I3yjf{?|}@q@(o?-4o*yx-1NoTBM_<$*+JQO1^ty@A*4PNH_` z_jByMM$B6mxC-riNtyzIQW49qRXDF+ue_)DlUU`l{*jR%VZL76I->#XEYD?V+-K2G z7z4kn$$jny`;hM*%R_=Wh7m9NkT{)&8+yKm1YzHSxt(tHeOg?&pKt5}Yh~~*XF=H5 zFdRC9CoODt^I0B0fzaznoi=E1&1w%r*f6qff&V{;{9RM9fpb&DiSUx@PZ>NIdHFwq zVX#(FYm}h`p}%Dd#lHJm zsVvonCV5ZpnnS| zeR!3iUko)kKP^mnGWMeXSml?3Py8lH|Kd@aU%mYodvqyfE-UWs5-TqQ2dWDXuYz4m z!Q4C(O;ka-muTg)?0zlIm9g2(U*AUwL5f8>u9AfEez-xF)AK-21I zmUOmjVEz8f97vIQ4aI4F=tSDw__E;N;J$kgq(YgKyzwerzmfSq06+X8_UP!=nc0qS zpe!(!ZL;0Xdul_B*e_*=?q>SpDvpxGNfFRGRqL}p0QM0|RGhc$4#$$1Y*A;;Na5Ax z+`)+L1f!tZnPHBEdA>X^ls;^Hru>NrbuTphuuGlgTE%`xJQj=J-KwZ7{rtdte$|;9 z_}-q?Z0*6O!ax)ct~`~&n-L(hA$K^{KT2y))*KOF<%*2k4`>`#pr z^Bjok2Br8z@ZU;6u#jF4bi@jhmbPYpYO%f%E<*kkOToQu;=qo3V~Kkqy@Nf)_EW(^ zMij9w<+Nfga~I2zbf4DE@*uve5*D`UKtReyECRuYaw# z9!)}&kTL4$-hy##8j&ksn))IdE}2|oC6ct-#uItY2uv^~PrbYSNyUR<2QdR3#_C66 zsncD<$wNnG!E;WyN@txUDeh($TDbG@oVlZeYRr)*+s`u_7SxD-_rFuK0ijVJjB!!A zpiMP3!3HJG11)ktFAsk3`H=igP5mZSeBql|g!Cb>f!x&OTzN;uGNZw6U^?zYt>;8m z#!}<(n3>eRE}x)i&j;JmbmgxWImw-2K>e^6yb)0^#cA zmA|YCDvN=TB%q6U-h(y+LG}bT0M>2^WCmb)ty%*h|C!*NMj7uQ8~ON6Um6@J7Ky!_YbV);(v~ zAV8zg2+ce&xm&`#}Lz+DpF zeRZEbT^FxC&ZeIpjlVZhqfOe%)zq&&`5g>+xwTl=cio`wMIa`F6V@G)w(bMUB-M!F z)XE~8%Z5fVq*Bg6LQRJIvT@Mr+e$x*XQTlnU>>>*C-H+Mp?FY`3$K zy7gHH8`{*rA>k}0$V6{jQG`5o5um^2J!^BWyS-VmW(1@h{pD31Gi343)o0xOgAfar*y~INnyaD4()|Jr*gMD~;d;Nntch;sG*ay604v@2A zr-JUZHAp|33x2{u$u7a9-`ICPXsOixM^bt7ZkV&j_TQ+qUrT+L1-iUn(DQsN4c8?s z)r6h@LKjFXnoKnn9JU=%rxEy6?82m9_xD6UG(rswI*f>GV6NR--7qNHrhtHhL%kC> zkYYv&Pf@N><1qD6#f}~_TPApDR_D~(T(a?YPA8#dzG4H-pOf!h@N)n#zd+160RzZ!jS5m88oba9U zi%h2_FxndxZ&%$(us{ks!0XUf9Z2#@0^Wpe_$QpoijoEiYbL+^DT-H<3Xw=xoj%BUZL1{$hv(It}iyL6PBj~{Vvov+e+c=C@viH^LgG7b)1_d;XBVzwlEA#88*o@7vEsNE2p|D26GcNUb4{9Q%TpD%k2}mAe^$lRBiMoFGyU6%#5kMa9tC=nB^ans-w-skpagwkV*Sb9F z-gBXf)B4MeS$CN}Ql`Raw2+%{(z=SCBctlh5dZMO)>54~sh}Kn>HJTIpf4tSpY7p% zEer+nrJ$@j<93v^s%CwDvG5+}#TlhEF*c#!=uwnBc zF}g9^a0*M6jl{>VBZVqTs#-&2(DwTWNOl9)K0pdYN@%9SH>nZ?*OQ6aI65no z@%-Y1=kbsSiUN6TiSe zQpqei_tS4XgjyLo=5fQmnu^p@%FqBsJTM*)7I}Ly(|cm&PDsYsd;F6Ys-AB7fv=T# zndB+7Mt9)`1->!US}NR$7z5s7iCR!_cS5&`;SSs1%ZKg|1v3jNCuwx)tZ@znAF!96?m1JJBwN7L zE=ylHsY-qnWAN}B*Ddm)ti>_TG(R6^Jx)Ur3s!^@>bYL%Yg6~Hx*@mQ;Ue{NKVL9< zT&xgFkw3rM?X;(!|EB0$)6-_!dvNCJ7r^H~TUTMqAD3>4WaTM3T%;S>Ru!d-#G{MF z3$c~&saCuVW7u~a*$F0lna|c>DdS3~Z!2j>W}h0BSp7m>G+4Z4!kOcJlDRYej$_m` zVs583saCle*o~6=WF@|qw8aRv-XngK1(izM-}EcmVzkKp#nGp2XFqDbuT2V4Ycnes zD42gf!itjM^kPi;Bskb|;}|GMBg*!{pefF(e4Gk)NOSB%ql(SK`!CQP`i2)PR}iMc z?R^i$`y!*T%Rx}G+XN1~l72P!+Zh@EPpmu##;26w7iP3Oix{HF zFJ5>m+-Eo>NBF_rLFhvsP_Gk9!o$Dy?upQ%?{bhB_+WW669W=~;?R^lnfCTChPNdb z8V>o-FEf&!FX2RP8+|wiPeZ=|Pm6u$a|)2JDkTgYX75(<{0C#wSd_r);?&}a94809 zeFb774Pp-!OwMcgGU0l^z?(Ag13#h1u!bSZ-z!&WU0(P$G^Sas52z_G)t?P)wx;Yp zDr30LcLYo3xkkSb5e5nCAnr7k5zp+WaHgHF9j$l{tjg*0!R~eTl~7aTDRX{uj--Um zFodV@I8DPP$-y_>k!H@}V;K)^ExwqKhE!Q7#9|)D69^^A;R^qo)TEbVO>;foyTy!3 z7iq5^AQQ0!BR7^7%F!1{4=>1~#bv@6RmI@M)!Fc|94y=rU80H2ZgoP;prkZ-z&l=S z8m@ORTSN;S3&@Lh<+)BW;LD~^0r}@qM3)rgZEgc-VD*JK^hR-^s9_%FV_%XO)cuL_ z2l1A&Bsc*0^2pvZJ&?*sOv?WZS{7_9uZLI-(`dSGYsqXix&2LzxzeC*r5 zpqIB^Pi061VtJmFqXl;)gdaUnylX%Hy_}~9eMb%+bKqOY;Ai^+4<|n<>%r_lWDvi71|e^Vo2xmQF=G;U2mn% zq9GJLlpJ5d0di;d@eI}Aqn;myOClR$!KrzL1B;^%n*?T~cdgK6tic6bArW1@rAdxEAKa)yveaS<~ zoSrtS9pb{_dthcXa74Jsf-}YZ8ltR?MMITeUx;8lCK4Q4)aL(~PRMn~{x=!Nkbs!E zl{V`0M1BQEA8N?ErM(B+IeZXqe@!&|oO|L{f=VP(55e3j@M_3Ifh1uibkte>ss(fe zNe8)5LwIU{-(ymBR*7bc@eY1|oz)`75SEIXzNne0)-HV*S><98i;Z{VBap@}Imxjw zS{Z@;UR7H~j_V7#x&SctLtPn)nt`NqfaZw@!~-Wm0X5Z{F_xE7hU(}qxXTj><2$AF z5lU({PA2=%&ClTUtAH4feBVxkPIPedyk)dwQ&}nL6@=X^lBp?-_WHgd_I$oA(Q7D2Xr1O6Dh^t z0rNQE^Z_ta@3M9mQ=)%mGVO(SIh#y*R`?a&M;#j2&t%I&YsR$E3~jMqgX9Y*s7Pv5 zpe)u+Nz(ZQ(SCCv@d(`X56KItsR5dJl)F<87%T05z14F01)Zkn`fj7l|8mm5lhR~a zbLudQb%Q45Grj4CWBb80*kUcKKFxt^uvRg5`^DYA@L@!Q`=vS2lE!42eU)V#waPVEYhtYv&+p8~1msFaTagK3S<;mjnU|qV_t|7Hh`rQ<)uGi9L z{n=z_0o-bwdbQ_X6IP?g@q;rSw<~qknj^r-blo3*TnqSeqNoUCo6AYk5m-sYTf2|( zd}s3c(`G!K~70=DYY{Dqtm zkvSTNgz1PJ1pDcT2F2Bq$(_t^-v9u#Mq{dSVV91?y9zrB*cEvcA=3#h zun19Nv@=|4H%Bi7OuJrd+*MB!T#&e|*2j@wO%U^hA6fTakhpH?qlQ#Fjpu2DxpzuO z((ZS$#M zw(X>`Z8o;;#%gSyrg73(-%ju6{eI;9JZER^g*n$8b6nspezq)zgJI5;E)Rzz$@`3D zS#Mv?qp>FoHex}OOXsD_)Ajcq3~4DVr~?Yi+`|-w;tj+)lf@i-eJc%{yMxLI#rKKW zc&n$Bk0)FSYI9GH)5+rcnCSYy(FnR&LO&;oP3vgQp8tJn`yJI{-^n^W7yB?$5t-&I zPGkD^WE#_9gOf-uL-KGWa^hhx(4EZ{;Yc#D0);R4ge!3P8kBkY($es=NM}MeVyM>I zH|q+f#{1ilqFL66pYG8#gwLbB9Q#DY5`pv$q!$Ge4AaTq4UZ-M?{#`|#_DT_U(}hg6$_3Uv)up&}abAhNHEynEzg; z`2a*8MQHCA2R5s@TSoU_6ykkQAzZqr#%X`GN~OEd+9`oE5xU5dAJ0!H?VyLFaw z4|?Mj@dfgO@j*S*eTa40ij7BeK?5=8(;f4vNLX$JB3n9iL%<9vn38U{-`Qbba$)%~ zW)693Q~y^y^_;n9a>iCuMA9Hwn>&(t^2@;1VMN7rv1y;SCcYziRiRN@doKi>^_u<| zre0ig#P3BHar?e-zi}fwp8*|te(@zpgl=ThR5^e|LQw1-wK#IM3YI!kAof`}G|XZ} zz2qZzZrkn=5@Po=@l%UcKfh0y{q4sakC&cY1qF2(i@|KzU64A$MkE74heNzu9NmBi~4qxR2#q%$p`*aGJvjtA>6@CEp7f`#t9?&a1~gg(@6g z)ni+Q=zr36x2g1QzR+yp=lOwD$<$%WLFDJ8hm8)>&PLI0qiMvoUXDDe`QrD$E4F*h znl3G^R20vlpVWFCA2s86aO% zO}B1x2*|6w3PU2e%3-SiPZ8uXOu!=4Q@^Y(WD`?X(7l$ee8 zayJ!@dk>n~HYx&Va&U=YyMU(JaJx;-plR##h-{pcJMZ5^%3rDSbIm4J)m~SqpYrL@ ziXe-15{_tf>18cEM4sJ~TFoktO=YOW7UoQhr88#<z|k;7D9fW!g13E|N;9 zT^+8y6&D%sAgoqRnmU;|Z67*18ZQ`pYoNFsMWjhniyuh8C$fV8)lV}~DC9 zRswGd{>Z&Ce$$zIAg2xVr-Vri1*E@R`&S)pjbwu7%QNm?fvKFG#8Y zfDKILbWy>?6rW4x!2H2Fvj7h8JCf6DZR(e>= zmAfHo{Jr*pmG_5qx;b%qTXj!yjy^aG3?@??dZ;XTywljQRJLuJRQh#;0c4einrJ{xY zrI}KKy5Cd7H(u`SyLR67W+BIYEfXb!ku+8lcFVMe_w%TO6x(%)#+*mcbV%*_I^K=* z_=IKDlsPFm6)=H;9jIz%Md2(@<;E0{Hih9ez4(VFSLYwsu(cgm)F>fbf8Z~5UqN(raFF517yhh2 z)^KAcw&w|gx+N);?GL$Wz3HPcSEO9&$0eSlL%c`4%=NH3-*;jLdPqG$SuL*lG&rnofcBkSA zX1hqGxxt=t_>%T0a>o0f2*#pgdxnrFg`H1Ua|jjeki4kaS zxKLg{ZTk7K0tt96+TgkV?x5sJ8|X|4$tC#w38>mc&CQ{}!V>$9-IXd)>3SZK$?=@B zGN(`2)vs&Qk7(I-4Sj^d69n?hr6>v##vL(}|I-2hPI!E4{tT%a+5+@4gNvD2dxA8K zEf<8+i^@@)Ot6;o2!$W2>H-b=W18sK1gRt_P>pr`3Lj1sg7aXi5u0t|qr^uaAOVD$ zdmG+Z<3$5if(B;t8}v@Ua1tocz;G8Oy0kV3`4hD`Z}xai>>}sRCt3!Pxe)yuaM#Tj z$YI*oh!kHG8+G?|@FO;Kn`pq~0BdU=xJIe(mQ++s6J?d+ClEE_CL$J!bZ2cow0n@( z3}7T$>%H-&T_aBnPjEmF5eqSA2va2=8?V%Bfd~IAtnKh~inZg}DD>7=jCs!h2e3-# z)~gMbRU9P8k=-Yd=+CQV3_NeAoEHWukuu{Z$qErkdAYa2SzrP=Vr$!Tr!Ki9HHc`M z97eGPE3|LD&FN?+9}H38nGuxh_iCqF0|yzz`}n&MkYmSLvuhpmYFYt_AqCH_{OaAi zF)bj&OYDEwXf&L)AJbR2|0&md@i<1*Qf3f$xj6(Qw(}$@NFvuI0iyuYI$%<4iBE-f zWgMF8oiX(c_pawbmC@ZGSW$+Xpkunq@2SUC*rah6+p|y=2rT)QqP00EG!+gPD_I>6 z@z|zO+HMl3 z#aX+^ysWnU)k2Xe6+dYjKEwfyRF%CljU0WjSgZnC zVrf38mmFk&^kT(%T5m(SjNPtREKuw%?Q=l z;^6vE+6auxb13PD_av+%S*lo~SPAIU1LUx1u*ly711j?vn=d{;pDElU4_ z8O>VF5D9PWXr>{5e~0g@dkt0uGX340p-Vvu;9_ZXdvjH3wEz$r_Fpx61Z&LzV+d%@ z@{jq#0|0>EjbWNC(^v0c(2|t4&C97(l~JX)(UKHU9R7TDV;ReR zbe)31zU{}5%Z?lLfokf+Gnu0Vk?&%318sif(&p+(aT%2N;7anD%+y=S$8i4r;A*K! zP%J#rFwXcoXc>x4eK;iTxsBGc6Pze-TKbjjFYlWJaR|`^)4x6N-%x%0uPn(=?;hF* ztR0KxTB4Y}=aXl^o=1Kw2@|MFMF}Hn(YbY$)DTG+<4~r zDaZ2(QTp%lTPw5tlY7oQ`O#960BUlmQ7t`n7dP9TfbXcWAn<1E)fK($duMhQEo$1uZ^GrQfun0d0;M&t*i5j6e zn$3d3QPZ;F0-2$)$Fb}u>Lz~F+XoVD`u)bC$9;uy+Ukl7g)s2UafDx3684+M#CS_K( z)DCu#5{8O!wQWLiaYAwJe!IFyxpwRg`*|R^5>FnED=08eB$H46u;Rc%IHkXKAj-!R zI(3sJ(0=BthEPeT2NY=Yk$5LgWKc_VYarH4^IPC}?9taEYp63^uIRwpt_S`*$CFwo zuliA}Z{NPP!gJ4#2dp%t7-5AzQ~qyd0w&^|qaQSkPPdzwZ88&2#O##PsAA2UY_zY4WtZe#@X^zmvw?K|?1)#jP96Lh~ac)o3I z@czx6J!udjlHTfyr-#ZN`c~sTdgYOr=Cg(E%zsQ20gGo%GU_+nDS`&2uxy&b!S9_5 zyVO@}jUoROY!(K;ThC$G$?-~(@ywZ(?Iw^aDA~Gb^V5XI{dJmvA>BBs&u(h($oJr{ zrOvRNxX!>>)D0>&5$uS1-!g+!mixNmpj85HG{bHim-p3%z3j{HFSeW@QGN#goECyM zI1{T!H>`s7a64O_g$VhB41W_#L9vU!2SYz9-KbVw9@U@f=P`#rau86*IBm-ZGFwKiM+1!LP2dG?$t$myo2gAhCC=-NfU4O#s6=| z6Mi1jSaTxDSd5b?QSWqz0Sx?SYvCJgGM%|6>rKY}>N{{QY2;8+#CY+|cKXHcyBQ#q zD5i8W0D`M>k8c~=FavFip68?!9@KP2SN=Mq{?HipkF6L&t~uOpvyAO0|F78O3KQbW zBZ??hL}&>1>*#LwziQon&$lH-X#2a7cSfwVBccMn$$T;)f$)Ja5rq1A*W)6}Jxd4P zuYXK_4LU~MUwl)EM8#^@=DMZd@xyWD%?_X4OTyJycq1R?bwYhQQ}{YwNDm5uf}AfG zjd$SCZWlf%F9RO~IxO+kwS!DDfp~yxfYo5y>1=OdErt|lQt5hSzO#*R0-5r?9R|`F*s9S5c#Gi z#W!HvewnTv7@F76ZsYOOdWW$4j?`;fe()e@HB#ziH+|EM8rY*tTQFu zPON{b=?*n#ff!!_6@f~M_DT$Rz>svo$%^6L`E1jP*&5R&3e!5?enbW;I5iE*52gFu z94mzgZSLVQaJ+lJmP?n?YUj;D#4y^NktdSe5|5uoKFr^TTgENmfJhZhgl&SMzm^g7 zl9`}0y%$-IrjrzVF48~_FDaVn-aWd@b=_+z&&PaES%1k&x8`a(EAGTJA**I-vuzm! zhb#DijdFyiOD~eRXj7KaR=+6orONtbAs5NQ3ocepeYmaT>yIdtcyM*1!9@vDluE## zA#yC+@eQ;Dh!3#ap3ZyJGx&v}hL`|s_9DVR z&|7x^JXL~0z2|RM4Wn$LF*6X5&Z_#9l$S@?b81@+sL>~yEbYk$;67b%Q6*>n(%i!# z@4i(W>s_u5(RsS}l*I^hG*?0Rtfp$P6Tg7ryC6I#_~MD&czfN3-yI9Gpv@+2dl$;o zS>v91nA3KSJ)32+(TN`aHa#wD8oqvc{;=Df`z8SU?YIu&=1(e<(MiS0${%MGx?9jG zfm+>kOtEN1`6W9wr0inFNPHOkc5bXd-^F+iSzS4fauvLK+HtqY$IXmkjw&AS$l}Pu`5&{o<^gRu4Q@QW{%7ZbEF_G^v?lbFo z4cRSWN={}IyVEVN#+cVITK|5g1%*0Q?CwTdrv%kpg!fcALB_0soC{2YFB) z5ZNx%n^yt-vu1$PqSnF}RbURrOIUOL_)`qid^|om(!9Ig#m(X>M`p?>-21DwTXRXj zhOt+B%SURA1>5t$qSNulh4v?xXkZ2peH&c6&d+Yyh945BWBv@K6Qp&H+#PN_ump>A z(~h4ea30`t8OD{c*xk)9;D4N9*2xb{m~Q9+Wm!@~QL6%T)K2RNb6K`FP0t%~;F$CIarQ+wswCF8Mj!kCac7j zSeG4Mc}c)@uWM&`ay1W%l`pg%X?Sk%l2lpJ57WHp_X+wv?k4%;!sl~$n7D!-tVQs%)8P)OqS|2IH@i|WoXIVB#DzgF|3?vOuYRQQ%C@G&3om8Ek8pnBy>g|TxKCQG*F zrA>L^3lC23Jk7Ma;C>nkU=yN{WyRNjo~z;V?isM~wZn+|Afopg`1y{SI77mInas^$ zANQ$lKE`I{G$|A7MIBpYIC=Z&VH)J0-9LY{dWci5jBh5un-O_SnMdC3@L`ZuS#%?m zwK}~wKgx8u+lXp8k3-5$VA7#kD$pARt5o}ib`X16K)ugB_Lp#se4(t?6OfV=ii zIPKqIEJ-JD@4x0%tp7z{K+ znpk7zN%@dVxB=1pB^M!zW_x-LIGJL5zH>|;x#MRn@lXqESAGp#g{{ADE*jmRzmj1) z{#ypS3`3T)1?fqF@5#;ZDxm~ms`=jfdiUZYgiwqYAn1QMnF+{7%U?H>m5O#3iWXmq zK!DBdVpr(~Yx071Qg(h4@s}E+u0t1U7%QlUDK{;2GO)Oxv9F5C8ZeZ!Xl*hHN%6zd zs)^)Rql{QlYxbwS&~ps0%}kyy z@;D{~dHm&fv}C0oU6=**iVH^H8^>gWcrCUdT!!`#>{+GPhu(pc*^)GM7q-mMzcS;8 zPjz;TObZbK;%CC#cOVF%B=kH^YegN@nwODBGbN01Q}4l_b~^ODFZPaY>#E)oHC#Ow z!&IGC?CQcY&Ct(jZSZBzXXYtmZdYpqNz0CC5h@w~`;yiJxE{7OZUyuv`5lb%Z z>I#6OO!Y}=&}KhFF1_tR2n(52+zl1&1SyoKb-7x_D#@lPHTkX=4mPT><0kHHM6@G6 z*M1_>#r6F3h1<<|dft{oN##SgxI^9U54mg&{bYUOKE!{)?d6hz1oCrzCS*;@uY2#u zC&)xN+8&z|*%h^(&s*0(ST%jUf2;B9)X9Gl*Tm2IzNK9T8#1)c2gHC?LWPZ2VEf8n z#du_wTWnMFG3$Dcv^|0@zJR_OXt0nwJC_@%osA za1l%nOu*@qdvb6-W(_(Ye!@iHjp9S(OUK_pFug?-n4?0{(rWw2BB>W7WL{ive6Z z$n`26_l(q1h6m4f%NMmK1=`0+P}VA*h^Dj0DBSFIQAu+ctn?=DMPOvUBZR2Wl^H0Q$Re^e!BSdC( z7pVRI_3`GGPd=uy-7;uT>H$V|p{Pj4x1oOWjoEQFc_N1`6aAZ{MIOL*snel?!_{^i zerWvd#4sRtDoBf5T0$;GemqxnYMTV*NI5Sg4stx(=>TB%Uweq;cUOfj*z)}+1sJ%Z z-F$!SG?Z2s`$~#bd!LAW>O&H;L-3JnhplbfZr%LL|0of2;zPZ(X-^Y5$Npg_5UG%$ zC-h1pSOjV_zzk|h%_k`&S!YTEs+mG%E>K*2ni#8=kv5EMFE@YMB-ZHg(BAp(uyL)1 zK)T^}HRb_YgDdB0iOvymfz2o@@5>@;edny2{z2Wyyx(wf*@e5=C{vaADqu4s&KQ| zPlq<6ZKB{nG3~4E4seou?-nI#3J34p@gGvOyW!0T+Fo}JS?m|4&-O?VlmiB5t)*@H z%aLfobi-ZVm>X;Cr3R65yll4o2B4(_Ztv&wkutw+!HA__bZ*!e9D$dYosDtc3~I29 z*DHW^+8E5O!MNp?+jYd!LSv>V=xT~KlDCfv`s0ivAi+T{$q-pr#E_PnM;8Pdb+8Y^f?NE${W)3iHTKpf z+C~eoXCwTr&^&$w)EvJ_F`4ZPP$EDmx+1G}vVVyiS@+GXXKU?}7Z0TKvVT1CS+)T& zPkA{6dWe_v&X@h2>1yq!&DFn7xy#vMofE5K|dixNQTiG`(8aL_3|v~JndqNR5B1L|A+^2v3QH#@37}lIcjyP~ zE!LYj(!a+t8w@+YJ`A>Kd#EQMnECd$oUcnP{GrAs1dOKNBjcO1U$1f1{7L;$lZUN* zYx2Th(nB<_rQ?-8~L48W(vs8mS-z7sBHSjA_VX^nUh33t zD<8MR3WQldqClJ@ai#m4FTZB-z2RY4BNe>jW+%y$%N9(RIVqxV&hGao1|t0H)*}Kx zqcP>_I0OjxEysaRG#|`oaMl9YN8X~pGi(TtIsSh&1?O z3r?civ=@r1rD)K6@IYaguTw#O;{DU&1bjk0ZtxlXV;tBtwv_GaJe(KEi}?u44W2ul z%>VolO2N&QI|H!DnCq}2dbzWd-V>>=!VT)72}-l={hMx-&Tk2RC!an#357pJgZefA zrl!-IctFa83V35u30qcsvBLd-}nsx^RmUB9kyRIHVG*Z4fULy45ED>6h?kp{Q@L(5N# z12_6_I%`VG$YkmY{_?&j1dYSjSBUfvIbmU89fxdVqH5E|Tr)+wAFJi^9kF+hw7WNS zsJe3-@TmDqrAP4HabzH55$~>iSRe2ke+wBU3_4|0f`alH{kd4of`FrT2hWzxoY%2i z()!lAcXuM^3!o}8!C|#o2*}7HzG5LeXsbQ0-Uwg%l_v~wAMw2WRdeqFXU4rctOosU zdebLNO|cje?=6R_3QxvzTn%b@Ks% z&jn5DW_PxY!`{0_)!wX72hR^`s(W|(*~gfnx!ncl?xcmUR4#qI-+{;8^w0vIw}hgu zvM~k_Djh=@{S-j`58Je+aH_Fqp{#eZx93c(!NXH8wI@>;MwzRpb6%5jj4HLgH zoe59$@U!)~z71cL^)1kw_ujPe-|VwnX)llRSF+~0DrXl^XaFWk^S641ZmHWZSi5Iy z_+%>heGYt$i>)z1_0NfnjX$^GRJ)k1=!+154t@PLC(1#H9973_si z8U>^J7(IcZT3oWF+JC@lYr^O(i)-S+m;JiOJye0XTesq5KO5t-iKdkTq^6g9j(913 zw*Rd+ryIW$Xu{z3t|9H_QO9_%Y?!KZxJWX;*Ve{`G0gRcNx#76ZaY->&Xu%yyo*iA zrXww8r;@14&8JNdFW9b+AT!KmHrpYD&g)aeiMKPBTY8N_j>f�M|WscXv&WnApXb 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 SKShy*Pdh6|&J_#aL;nZ1>1Rg( literal 0 HcmV?d00001 diff --git a/Tools/flatpak/gather-r-package-info.R b/Tools/flatpak/gather-r-package-info.R deleted file mode 100644 index 42072f1db4..0000000000 --- a/Tools/flatpak/gather-r-package-info.R +++ /dev/null @@ -1,426 +0,0 @@ -options(warn=1) #print warnings as they occur -options(nCpus=parallel::detectCores()) - -CRAN <- #"https://cran.rstudio.com/" - "https://cran.r-project.org/" # - - -#define vars -expEnv <- NULL -downloaded <- NULL -pkgDeps <- NULL -available_pkgs <- NULL -destDir <- NULL -destTmpDir <- NULL -pkgs <- NULL -base_pkgs <- NULL -specials <- NULL - -initialize <- function() -{ - #Create necessary environments (only hash available) - expEnv <<- new.env(hash = TRUE, parent = parent.frame()) - downloaded <<- new.env(hash = TRUE, parent = parent.frame()) - pkgDeps <<- new.env(hash = TRUE, parent = parent.frame()) - - #what packages are available? Do we care? - available_pkgs <<- available.packages(repos = CRAN) - destDir <<- "pkg-source-files/" - destTmpDir <<- "pkg-source-tmp-files/" - - # Define the base packages. These are packages which come with R upon install - # of R. These packages include: "base", "compiler", "datasets", "graphics", - # "grDevices", "grid", "methods", "parallel", "splines", "stats", "stats4", - # "tcltk", "tools", and "utils". - # - # NOTE: there are Priority = "recommended" packages as well. If these packages - # are missing from the system install, this script might fail. Downloading and - # installing the 'recommended' packages can be difficult between R versions. - base_pkgs <<- unname(utils::installed.packages()[utils::installed.packages()[, "Priority"] %in% c("base", "recommended"), "Package"]) - - cat('get the packages that JASP expects and put them in an env that includes a specific version\n') - source("../../Engine/jaspBase/R/packagecheck.R", local=TRUE) - expected <- .expectedPackages() - pkgs <<- expected[,1] - - for (curPkg in pkgs) - { - expVersion <- expected[curPkg, "Version"] - expEnv[[curPkg]] <- expVersion - } - - if(!dir.exists(destDir)) - dir.create(destDir) - - if(!dir.exists(destTmpDir)) - dir.create(destTmpDir) -} - - -defineSpecials <- function() -{ - specials <<- new.env(hash = TRUE, parent = parent.frame()) - specials[['bstats']] <- list(type='github', commit='1b0b925d0404537b908a6380b70d80382df2d374', repo='AlexanderLyNL/bstats' ) - specials[['flexplot']] <- list(type='github', commit='163137fe30d9541234eb0053d6d86e1f96cd3dc5', repo='dustinfife/flexplot' ) - specials[['Bayesrel']] <- list(type='github', commit='06bfd2fe3e7dba988adbf2e328131067b8d50361', repo='juliuspf/Bayesrel' ) - specials[['stanova']] <- list(type='github', commit='3e5635816fb2e4cda06704778e5bcd382f14717d', repo='bayesstuff/stanova' ) - #specials[['afex']] <- list(type='github', commit='71e22f0020399de1b35189d7c0dd4e5a2729b843', repo='singmann/afex' ) - specials[['ggpol']] <- list(type='github', commit='dea9db2503b04b81dbc746fdeccf92e9849ce64b', repo='jasp-stats/ggpol' ) # temporary fix for conflicting ggplot2 dependencies in jasp 0.12.2. Should be removed after that release and shit should be fixed! - #specials[['RoBMA']] <- list(type='github', commit='7685d4d203a46f259b4cda2c492c8235397c80eb', repo='FBartos/RoBMA' ) - -} - -getPkgVersion <- function(pkgName) -{ - if(!exists(pkgName, where=expEnv, inherits=FALSE)) - { - # so we do not know what version we need... Because this pkg was unexpected - cat(paste0("Checking version of pkg ", pkgName, " in available_pkgs\n")) - expEnv[[pkgName]] <- available_pkgs[[pkgName, "Version"]] - cat(paste0("Couldn't find version of ",pkgName," in expected packages so took it from availablePackages: ", expEnv[[pkgName]], '\n')) - } - - return(expEnv[[pkgName]]) -} - -downloadPkgGithub <- function(pkgName) -{ - # example https://github.com/quentingronau/abtest/tarball/503c50e96768a0134b755747e0421d820cc1a115 - repo <- specials[[pkgName]]$repo - commit <- specials[[pkgName]]$commit - succes <- FALSE - tarballUrl <- paste0('https://github.com/', repo, '/tarball/', commit) - destFile <- paste0(destTmpDir, '/', pkgName, '_', commit, '.tar.gz') - - if(!file.exists(destFile)) - { - cat(paste0('For pkg ', pkgName, ' getting github tarball download from "',tarballUrl,'" to: "', destFile, '"', '\n')) - - tryCatch(error=function(e) e, exp= - { - download.file(url=tarballUrl, destfile=destFile); - succes <- TRUE; - }) - - if(!succes) - stop("Failed to get pkg sources for '", pkgName, "' from github for repo: '", repo, "' and commit '", commit, "'") - } - - return(destFile) -} - -downloadPkgCran <- function(curPkg) -{ - version <- getPkgVersion(curPkg) - filePkg <- paste0(curPkg, "_", expEnv[[curPkg]],".tar.gz") - destFile <- paste0(destDir, filePkg) - - downloaded[[curPkg]] <- list(version=version, fileName=filePkg, destFile=destFile, downloadUrl=paste0("http://static.jasp-stats.org/RPkgs/", filePkg), sha256='') - - if(!file.exists(destFile)) - { - cat(paste0("File ",destFile, " does not exist yet, try to get it from CRAN.\n")) - curVer <- paste0(CRAN, 'src/contrib/', filePkg) - oldVer <- paste0(CRAN, 'src/contrib/Archive/', curPkg, '/', filePkg) - succes <- FALSE - - cat(paste0('For pkg ', curPkg, ' trying download from "',curVer,'"\n')) - - tryCatch(error=function(e) e, exp= - { - download.file(url=curVer, destfile=destFile); - succes <- TRUE; - }) - - if(!succes) - { - cat(paste0('Download failed, now trying: "',oldVer,'"\n')) - tryCatch(error=function(e) e, exp={ - download.file(url=oldVer, destfile=destFile); - succes <- TRUE; - }) - } - - if(!succes) - stop("Both downloads failed...") - } - - sha256sumOutput <- system2('sha256sum', args=destFile, stdout=TRUE) - downloaded[[curPkg]]$sha256 <- strsplit(sha256sumOutput, ' ')[[1]][[1]] - - return(destFile) - -} - - -downloadPkg <- function(pkgName) -{ - if(is.null(specials)) defineSpecials() - - filename <- "???" - - #check if special case then go to github - filename <- ifelse( - exists(pkgName, where=specials, inherits=FALSE), - yes = downloadPkgGithub(pkgName), - no = downloadPkgCran(pkgName) - ) - - #github doesnt need to check if file downloaded because it is just a few - #otherwise try to get it from Cran if it isnt in pkg-sources yet - - return(filename) -} - -getDeps <- function(pkgName) -{ - if(pkgName %in% base_pkgs) - return(c()) - - if(exists(pkgName, where=pkgDeps, inherits=FALSE)) #Avoid double work because time is precious - { - cat(paste0('Dependencies for pkg "', pkgName, '" requested more than once...\n')) - return(pkgDeps[[pkgName]]) #in case someone wants em? - } - - #make sure the source pkg is in the pkg-source folder: - pkgFile <- downloadPkg(pkgName) - - deps <- remotes::dev_package_deps(pkgFile, repos = NULL, type = "source")$package - deps <- deps[!(deps %in% base_pkgs)] #remove base pkgs - - pkgDeps[[pkgName]] <- deps - - padding <- strrep(" ", 29 - nchar(pkgName)) - depstr <- paste(deps, sep=', ', collapse=', ') - - cat(paste0("Dependencies for pkg '", pkgName, "': ", padding, "'", depstr, "'\n")) - - return(deps) -} - - -giveOrderedDependencies <- function(addDeps=TRUE) -{ - initialize() - cat("Determing dependencies and their order\n") - - i <- 1L - while(i <= length(pkgs)) - { - curPkg <- pkgs[i] - deps <- getDeps(curPkg) - - if(addDeps) - pkgs <- append(pkgs, deps[!(deps %in% pkgs)]) - - i <- i + 1L - } - - cat('Now we must make sure that all pkgs are preceded by their dependencies and they by theirs\n') - orderedPkgs <- character() - inList <- new.env(hash = TRUE, parent = parent.frame(), size = length(pkgs)) - lastTime <- -1 - pkgs_to_order <- sort(names(pkgDeps)) - - while(length(pkgs_to_order) > 0) - { - i <- 1L - - while(i <= length(pkgs_to_order)) - { - curPkg <- pkgs_to_order[i] - deps <- pkgDeps[[curPkg]] - - if(!exists(curPkg, where=inList, inherits=FALSE)) - { - insert <- length(deps) == 0 - - if(!insert) #maybe all dependencies are alread in list - { - insert <- TRUE - - for(dep in deps) - if(!exists(dep, where=inList, inherits=FALSE)) - insert <- FALSE - } - - if(insert) - { - inList[[curPkg]] <- deps # no point in losing the deps even though we don't really need them after this - orderedPkgs <- c(orderedPkgs, curPkg) - remove(list=curPkg, envir=pkgDeps, inherits=FALSE) # We remove it from the pkgDeps env to make sure we know we finish eventually - #cat(paste0('Pkg ',curPkg,' depends on #', length(deps),' of deps {' ,paste0(deps, collapse='', sep=', '), '} and was added to ordered list\n')) - } - } - i <- i + 1L - } - - pkgs_to_order <- sort(names(pkgDeps)) - cat(paste0('pkgs_to_order was rebuilt from pkgDeps and now has length: ', length(pkgs_to_order), '\n')) - - if(lastTime == length(pkgs_to_order)) - { - cat('pkgDeps is not getting smaller anymore... Currently it consists of: "', paste(pkgs_to_order, sep=", ", collapse=", "), '"\n') - stop('list isnt decreasing in size anymore... bailing!') - } - - lastTime <- length(pkgs_to_order) - } - - orderedPkgs <- orderedPkgs[!(orderedPkgs %in% base_pkgs)] #remove base pkgs, because somehow they sneaked back in! - orderedPkgs <- orderedPkgs[!(orderedPkgs %in% c("graph"))] - #cat(paste0('Pkgs ordered by dependencies: ', paste0(orderedPkgs, sep=', ', collapse=''))) - - return(orderedPkgs); -} - -#Dont forget to add the dependencies up top -generateRCmdInstall <- function(configargs="") -{ - return( - paste0( - ind,'\t"build-commands": [ "R CMD INSTALL .', ifelse(configargs == "", "", paste0(" --configure-args=",configargs)) ,'" ]\n',ind,'}', - sep='', - collapse='' - ) - ); -} - -ind <- '\t\t' - -convertToJsonGitBuild <- function(pkgName) -{ - repo <- paste0('https://github.com/', specials[[pkgName]]$repo) - commit <- specials[[pkgName]]$commit - - return(paste0( - ind,'{\n',ind,'\t"name": "', - pkgName, - '",\n',ind,'\t"buildsystem": "simple",\n',ind,'\t"sources": [\n',ind,'\t\t{\n',ind,'\t\t\t"type": "git",\n',ind,'\t\t\t"url": "', - repo, - '",\n',ind,'\t\t\t"commit": "', - commit, - '"\n',ind,'\t\t}\n',ind,'\t],\n', - generateRCmdInstall(), - sep='', - collapse='')) -} - -convertToJsonDefault <- function(pkgName) -{ - needsJAGSInfo = (pkgName == "runjags"); #rjags is smart enough, but runjags isnt... - - pkgUrl <- downloaded[[pkgName]]$downloadUrl - pkgSha <- downloaded[[pkgName]]$sha256 - - return( - paste0( - ind,'{\n',ind,'\t"name": "', - pkgName, - '",\n',ind,'\t"buildsystem": "simple",\n',ind,'\t"sources": [\n',ind,'\t\t{\n',ind,'\t\t\t"type": "archive",\n',ind,'\t\t\t"url": "', - pkgUrl, - '",\n',ind,'\t\t\t"sha256": "', - pkgSha, - '"\n',ind,'\t\t}\n',ind,'\t],\n', - generateRCmdInstall(ifelse(needsJAGSInfo, "'--with-jags-include=/app/include/JAGS --with-jags-lib=/app/lib/'" , '')), - sep='', - collapse='' - ) - ) -} - -convertToJsonEntry <- function(pkgName) -{ - # check if something special should be done for this package - if(!exists(pkgName, where=specials, inherits=FALSE)) - return(convertToJsonDefault(pkgName)) - - switch(specials[[pkgName]]$type, - github = return(convertToJsonGitBuild(pkgName)) - ) - - stop(paste0("Found a special for pkg '", pkgName, "' that I cannot handle because type is: '", specials[[pkgName]]$type, "'")) -} - -createFlatpakJson <- function() -{ - orderedPkgs <- giveOrderedDependencies() - - jsonLines <- c('{\n\t"name": "RPackages",\n\t"buildsystem": "simple",\n\t"build-commands": [],\n\t"modules":\n\t[', paste0(as.character(lapply(orderedPkgs, convertToJsonEntry)), collapse=",\n"), '\n\t]\n}\n') - jsonFile <- "RPackages.json" - - fileConn <- file(jsonFile) - writeLines(jsonLines, fileConn) - close(fileConn) - - cat(paste0("Expected packages are written as json to ", jsonFile, " and org.jaspstats.JASP.json knows where to look for it.\n")) -} - -getInstalledPackageEnv <- function() -{ - installed <- as.data.frame(installed.packages(lib.loc = .libPaths()[1])[,c(1,3:4)]); - rownames(installed) <- NULL - installed <- installed[is.na(installed$Priority),1:2,drop=FALSE] - installEnv <- new.env(hash = TRUE, parent = parent.frame(), size=length(installed)) - - i <- 1L - while(i <= nrow(installed)) - { - pkg <- as.character(installed$Package[[i]]) - ver <- as.character(installed$Version[[i]]) - installEnv[[pkg]] <- ver - i <- i + 1L - } - - return(installEnv) -} - -installRequiredPackages <- function(stopOnError = TRUE) -{ - orderedPkgs <- giveOrderedDependencies() - installedPkgs <- getInstalledPackageEnv() - errorPkgs <- c() - - - error <- NULL - for (pkgName in orderedPkgs) - { - - version <- expEnv[[pkgName]] - isThere <- exists(pkgName, where=installedPkgs, inherits=FALSE) - - if(isThere) - isThere <- (installedPkgs[[pkgName]] == version) - - cat(paste0('Getting ready to install ',pkgName,' ',version, '\n')) - - if(isThere) - cat('Already installed!\n') - else if(exists(pkgName, where=specials, inherits=FALSE)) - { - specialDef <- specials[[pkgName]] - if(specialDef$type == 'github') - error <- try(remotes::install_github(paste0(specialDef$repo, '@', specialDef$commit))) - else - stop(paste0("Found a special that I cannot handle! (",specialDef,")")) - } - else - error <- try(remotes::install_version(package=pkgName, version=version, repos=CRAN, dependencies=FALSE, upgrade_dependencies=FALSE)) - - if (inherits(error, "try-error")) - { - if(stopOnError) stop(error) - else errorPkgs <- c(errorPkgs, pkgName) - } - - } - - - cat('All packages installed!\n') - - if(!stopOnError && length(errorPkgs) > 0) - cat("Installing the following pkgs failed: ", paste(errorPkgs, sep=", ", collapse=", "), "\n") -} - -cat('Run createFlatpakJson() to transform the expected packages of JASP into a fresh org.jaspstats.JASP.json for flatpak.\nOr run installRequiredPackages() as administrator to get you local installed version of R up to speed with the same packages.\n') diff --git a/Tools/flatpak/org.jaspstats.JASP.appdata.xml b/Tools/flatpak/org.jaspstats.JASP.appdata.xml index 588999eade..35b295d5a7 100644 --- a/Tools/flatpak/org.jaspstats.JASP.appdata.xml +++ b/Tools/flatpak/org.jaspstats.JASP.appdata.xml @@ -4,7 +4,7 @@ org.jaspstats.JASP org.jaspstats.JASP.desktop JASP -

Standard statistical analyses, both classical and Bayesian + Classical and Bayesian Statistics CC0-1.0 AGPL-3.0+ @@ -26,13 +26,17 @@ - Shows the dataviewer of JASP flanked with the options and output for the Independent Samples T-Test - https://raw.githubusercontent.com/jasp-stats/jasp-desktop/development/Tools/flatpak/JASP-screenshot-0.png + Shows JASP Descriptives + https://raw.githubusercontent.com/jasp-stats/jasp-desktop/lockfiletesting/Tools/flatpak/flatpak_screenshot_0_small.png http://www.jasp-stats.org https://github.com/jasp-stats/jasp-issues/issues https://jasp-stats.org/donate/ + + #14a1e3 + #14a1e3 + diff --git a/Tools/flatpak/org.jaspstats.JASP.svg b/Tools/flatpak/org.jaspstats.JASP.svg index 0a3de2ccdf..d55f2f1a8d 100644 --- a/Tools/flatpak/org.jaspstats.JASP.svg +++ b/Tools/flatpak/org.jaspstats.JASP.svg @@ -1,16 +1,37 @@ image/svg+xml \ No newline at end of file + d="m 0,0 c 0.671,-0.957 0.928,-2.113 0.724,-3.261 -0.372,-2.096 -2.177,-3.617 -4.29,-3.617 -0.265,0 -0.531,0.025 -0.771,0.066 -0.82,0.148 -1.578,0.528 -2.271,1.166 l -0.079,0.062 c -0.182,0.184 -0.338,0.371 -0.465,0.556 -0.403,0.585 -0.654,1.271 -0.744,2 -0.053,0.537 -0.048,0.922 0.041,1.351 l 0.06,0.211 c 0.399,1.641 1.667,2.874 3.306,3.22 0.669,0.142 1.195,0.123 1.666,0.048 0.996,-0.18 1.885,-0.703 2.536,-1.473 C -0.217,0.238 -0.14,0.152 0,0 m -3.516,1.926 c -2.46,0 -4.454,-1.994 -4.454,-4.454 0,-2.459 1.994,-4.453 4.454,-4.453 2.459,0 4.453,1.994 4.453,4.453 0,2.46 -1.994,4.454 -4.453,4.454" /> diff --git a/Tools/flatpak/setup-rpkgs/.Rprofile b/Tools/flatpak/setup-rpkgs/.Rprofile deleted file mode 100644 index 81b960f5c6..0000000000 --- a/Tools/flatpak/setup-rpkgs/.Rprofile +++ /dev/null @@ -1 +0,0 @@ -source("renv/activate.R") diff --git a/Tools/flatpak/setup-rpkgs/.gitignore b/Tools/flatpak/setup-rpkgs/.gitignore deleted file mode 100644 index 3ea2c4bd5a..0000000000 --- a/Tools/flatpak/setup-rpkgs/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -.Rproj.user/ -flatpak_folder/ -archives/ -app/ -other_deps/ diff --git a/Tools/flatpak/setup-rpkgs/R/Rprofile.R b/Tools/flatpak/setup-rpkgs/R/Rprofile.R deleted file mode 100644 index c38f390628..0000000000 --- a/Tools/flatpak/setup-rpkgs/R/Rprofile.R +++ /dev/null @@ -1,38 +0,0 @@ - -.lib64 <- if (dir.exists("/app")) { - file.path("file:", "app", "lib64") - cat("/app exists!\n") - "/app/lib64" -} else { - file.path("file:", normalizePath("flatpak_folder/flatpak-helper/local-github")) - cat("/app does not exist!\n") - "app/lib64" -} - -stripUrl <- function(url) { - gsub("/+", "_", strsplit(url, "repos/", fixed = TRUE)[[1L]][2]) -} - -download_override_flatpak <- function(url, destfile, mode = "wb", quiet = FALSE, headers = NULL) { - - options("renv.download.override" = NULL) - on.exit(options("renv.download.override" = download_override_flatpak)) - - type <- get("type", parent.frame(1)) - if (identical(type, "github")) { - cat("old url:", url, '\n') - url <- file.path(.lib64, "local-github", stripUrl(url)) - cat("new url:", url, '\n') - } - - renv:::download(url, destfile, type = type, quiet = quiet, headers = headers) - -} - -# this will only take effect AFTER flatpakRegenerateRenvStructure.R was run -if (dir.exists(file.path(.lib64, "local-github"))) { - cat("overriding renv download function\n") - options("renv.download.override" = download_override_flatpak) -} else { - cat("not overriding renv download function\n") -} diff --git a/Tools/flatpak/setup-rpkgs/R/flatpakGeneratePkgsList.R b/Tools/flatpak/setup-rpkgs/R/flatpakGeneratePkgsList.R deleted file mode 100644 index 33ec0eeb3f..0000000000 --- a/Tools/flatpak/setup-rpkgs/R/flatpakGeneratePkgsList.R +++ /dev/null @@ -1,99 +0,0 @@ -# Since everybody has a different setup, it might be that you need to adjust some (minor) things -# when running this on a new PC. The things you may need to adjust can be found by searching for -# the comment `| HERE |`. -# -# Some other remarks: -# -# - you MUST set a GITHUB_PAT, otherwise you'll get an error. Do not commit that to this file because then GitHub will invalidate it. -# - you can call this from cmd via Rscript R/flatpakGeneratePkgsList.R. (in Tools/flatpak/setup-rpkgs) - -# TODO: -# -# - look at https://github.com/andrie/miniCRAN/issues/50#issuecomment-374624319 -# it would be nice to be able to outsource this to miniCRAN which has a method for adding local pkgs to a repository -# the only downside is that it looks like miniCRAN is not actively maintained anymore. -# -# - there is some rudimentary support for caching downloaded CRAN pkgs. -# this should be extended to GitHub packages as well, but it doesn't work because I delete all old files related to a particular -# github pkg if renv alreadyd downloaded it. So now we're downloading jaspBase 20 times. - -expectedDirs <- c("R", "renv") -if (!all(expectedDirs %in% list.dirs(getwd(), recursive = FALSE, full.names = FALSE))) - stop("Incorrect working directory! Expected these directories at the top level: ", paste(expectedDirs, collapse = ", ")) - -# | HERE | you may want to adjust the paths when running this file on a new computer -jaspDir <- normalizePath(file.path(getwd(), "..", "..", "..")) # local clone of https://github.com/jasp-stats/jasp-desktop -flatpakDir <- normalizePath(file.path(jaspDir, "..", "org.jaspstats.JASP")) # local clone of https://github.com/flathub/org.jaspstats.JASP - -renvProject <- file.path(jaspDir, "Tools", "flatpak", "setup-rpkgs") -if (!identical(renv::project(), renvProject)) - renv::activate(renvProject) - -if (!identical(renv::project(), renvProject)) - stop("Failed to set renv project") - -source(file.path("R", "functions.R")) -source(file.path("R", "validators.R")) - -validateSetup(jaspDir, flatpakDir) - -guardForNonStandardPackagesInSystemLibrary() - -options(repos = list(repos = c(CRAN = "https://cran.rstudio.com"))) -# for binary packages, but this does not yet work well -# options(repos = list(repos = c(RSPM = "https://packagemanager.rstudio.com/all/__linux__/focal/latest"))) -# options("binaryPkgs" = TRUE) - -# NOTE: if you change the flatpak_dir anywhere you must also change it in the flatpak builder script! -dirs <- setupJaspDirs("flatpak_folder") - -Sys.setenv("RENV_PATHS_CACHE" = dirs["renv-cache"]) -Sys.setenv("RENV_PATHS_ROOT" = dirs["renv-root"]) - -# this version uses the default branch of all modules -- always the latest version -# jaspModules <- paste0("jasp-stats/", Filter(function(x) startsWith(x, "jasp"), dir(file.path(jaspDir, "Modules")))) - -# this version uses the local checked-out versions -- but modules that are dependencies are still retrieved from github -isJaspModule <- function(path) file.exists(file.path(path, "DESCRIPTION")) && file.exists(file.path(path, "inst", "Description.qml")) -jaspModules <- Filter(isJaspModule, list.dirs(file.path(jaspDir, "Modules"), recursive = FALSE)) -names(jaspModules) <- basename(jaspModules) - -# | HERE | you can add modules to exclude -#jaspModules <- jaspModules[setdiff(names(jaspModules), c("jaspProcessControl"))] - -# useful to find out why some function is not downloaded -# trace(renv:::renv_retrieve_impl, quote(if(package == "Rcpp") browser())) - -getModuleEnvironments(jaspModules) -# system("beep_finished.sh") - -moveMissingTarBalls(dirs) - -installRecommendedPackages(dirs) - -cleanupBigPackages(dirs) - -updateV8Rpackage(dirs) - -createLocalPackageRepository(dirs) - -# Test if multiple versions are present -# pkgs <- list.files(file.path(dirs["local-cran"], "src", "contrib"), pattern = "\\.tar\\.gz$") -# tb <- table(sapply(strsplit(pkgs, "_", fixed = TRUE), `[`, 1)) -# all(tb == 1) -# tb[tb != 1] # these packages appear more than once - -downloadV8ifneeded() -copyV8Lib(dirs) -copyRfiles(dirs) - -validateFlatpakFolder(dirs) - -# debugonce(createTarArchive) -info <- createTarArchive(dirs, jaspDir, verbose = FALSE, compression = "best") - -# | HERE | you may wish to flip the local flag to adjust the script so it uses the local archive -writeRpkgsJson(file.path(flatpakDir, "RPackages.json"), info, local = FALSE) - -# IF you have ssh setup this will upload the tar.gz to static-jasp. It's nicer to do this via a terminal because there you see a progress bar -uploadTarArchive(info["tar-file"], printOnly = TRUE) diff --git a/Tools/flatpak/setup-rpkgs/R/flatpakRegenerateRenvStructure.R b/Tools/flatpak/setup-rpkgs/R/flatpakRegenerateRenvStructure.R deleted file mode 100644 index e1e44d1085..0000000000 --- a/Tools/flatpak/setup-rpkgs/R/flatpakRegenerateRenvStructure.R +++ /dev/null @@ -1,77 +0,0 @@ -# To run this locally, first run flatpakGeneratePkgsList.R and then do: -# next, do: -# setwd("flatpak_folder") - - -helperfile <- list.files(pattern = "functions\\.R", full.names = TRUE, recursive = TRUE) -source(helperfile) -# source("flatpak-helper/r-helpers/functions.R") - -prettyCat(getwd()) -prettyCat(dir(getwd())) -prettyCat(.libPaths()) - -# these directories point to everything in the zip file -dirs <- setupJaspDirs(clearAll = FALSE) -prettyCat(dirs) - -# if you're running this locally, we pretend /app is just app so the code can be run -runningLocally <- !dir.exists("/app") -dirApp <- if (runningLocally) "app" else "/app" -dirLib64 <- file.path(dirApp, "lib64") -flatpakDirs <- setupJaspDirs(dirLib64, jaspSubdir = "", clearAll = FALSE, renvOnly = TRUE) - -prettyCat(dirApp) -prettyCat(dirLib64) -prettyCat(flatpakDirs) - -Sys.setenv("RENV_PATHS_CACHE" = flatpakDirs["renv-cache"]) -Sys.setenv("RENV_PATHS_ROOT" = flatpakDirs["renv-root"]) - -options("repos" = c("local" = file.path("file:", dirs["local-cran"]))) -options(install.opts = "--no-html") -options(renv.cache.linkable = TRUE) -# options(renv.config.install.verbose = TRUE) - -# uncomment to test locally (and not pollute renv/library) -# .libPaths(c(tempdir(), .libPaths())) - -# remotes is called through loadNamespace somewhere although we no longer need/ use it... -install.packages(c("renv", "remotes")) - -# V8 needs to be present after installing as well -file.copy(from = file.path(dirs["other-dependencies"], "v8"), to = dirLib64, recursive = TRUE) - -dirV8 <- file.path(dirLib64, "v8") -# This must be an absolute path, since installation is staged -if (runningLocally) dirV8 <- normalizePath(dirV8) - -prettyCat(dir()) -prettyCat(dir(dirApp)) - -dirLibGit2 <- file.path(dirApp, "libgit2") -configureVars <- c( - V8 = sprintf("INCLUDE_DIR=%1$s/include LIB_DIR=%1$s/lib", dirV8), - gert = sprintf("INCLUDE_DIR=%1$s/include LIB_DIR=%1$s", dirLibGit2) -) -options(configure.vars = configureVars) -prettyCat(configureVars) - -# set environment variable for V8 -libArch <- system("uname -m", intern = TRUE) -Sys.setenv("LIB_ARCH" = if (identical(libArch, "x86_64")) "x64" else "aarch64") -prettyCat(Sys.getenv("LIB_ARCH")) - -# install V8 and gert here so later they only need to be retrieved from the cache -availablePkgs <- available.packages() -toInstall <- intersect(c("V8", "gert"), availablePkgs[, "Package"]) -renv::install(toInstall) -renv::install('MatrixModels') - -# installJaspStats(c("jaspBase", "jaspGraphs"), dirs) - -prettyCat(setNames(lapply(.libPaths(), dir), .libPaths())) - -file.copy(from = dirs["local-cran"], to = dirLib64, recursive = TRUE) -file.copy(from = dirs["local-github"], to = dirLib64, recursive = TRUE) -file.copy(from = file.path(dirs["r-helpers"], "Rprofile.R"), to = dirLib64) diff --git a/Tools/flatpak/setup-rpkgs/R/functions.R b/Tools/flatpak/setup-rpkgs/R/functions.R deleted file mode 100644 index 64e61d714d..0000000000 --- a/Tools/flatpak/setup-rpkgs/R/functions.R +++ /dev/null @@ -1,893 +0,0 @@ -assignFunctionInPackage <- function(fun, name, package) { - # copied from jaspBase - ns <- getNamespace(package) - unlockBinding(name, ns) - assign(name, fun, ns) - lockBinding(name, ns) -} - -packageFromUrl <- function(url) { - split <- strsplit(url, "/")[[1]] - if (grepl("github", url, fixed = TRUE)) { - idx <- which(split == "tarball")[1L] - return(split[idx - 1]) - } else { - return(split[length(split) - 1]) - } -} - -stopEarlyExit <- function(message = "expected error: early exit", call = NULL, ...) { - err <- structure( - list( - message = message, - call = call, - ... - ), - class = c("earlyExit", "condition") - ) - stop(err) -} - -download_override <- function(url, destfile, mode = "wb", quiet = FALSE, headers = NULL) { - - # TODO: - # tweak this so that previously downloaded packages are not downloaded again - # just make an environment with recorded urls + local file locations - # right now, jaspBase + jaspGraphs are redownloaded for every module... - - # this allows us to just use the standard renv construction for installing stuff - tryCatch({ - options("renv.download.override" = NULL) - on.exit(options("renv.download.override" = download_override)) - - # a little bit hacky, but without the correct type the GITHUB_PAT is not used (and we really want that to be used) - type <- get("type", parent.frame(1)) - - dirs <- getDirs() - - if (!is.null(type)) { - if (type == "repository") { - - # check if this pkg has been downloaded before - pkg <- basename(url) - if (pkg != "PACKAGES.rds") { - pkgName <- gsub("_.*", "", pkg) - - localFile0 <- file.path(dirs["local-cran-source"], pkg) - if (getOption("binaryPkgs", FALSE)) { - localFile1 <- file.path(dirs["renv-root-binary"], pkgName, pkg) - } else { - localFile1 <- file.path(dirs["renv-root-source"], pkgName, pkg) - } - - if (file.exists(localFile1)) { - - ws <- strrep(" ", 35 - nchar(pkg)) # NetworkComparisonTest is the longest package name I encountered - maybecat(sprintf("Already downloaded %s%sreusing %s\n", pkg, ws, makePathRelative(localFile1, dirs["jasp-subdir"]))) - if (!file.exists(localFile0)) - file.copy(from = localFile1, to = localFile0) - return(localFile1) - } - } - } else if (type == "github") { - - if (grepl("/tarball/.+$", url)) { - - pieces <- strsplit(url, "/", TRUE)[[1]] - pkgName <- pieces[6] - SHA <- pieces[8] - - localFile0 <- file.path(dirs["local-github"], stripUrl(url)) - localFile1 <- file.path(dirs["renv-root"], "source", "github", pkgName, paste0(pkgName, "_", SHA, ".tar.gz")) - if (file.exists(localFile1)) { - ws <- strrep(" ", 35 - nchar(pkgName)) # NetworkComparisonTest is the longest package name I encountered - maybecat(sprintf("Already downloaded %s%sreusing %s\n", pkgName, ws, makePathRelative(localFile1, dirs["jasp-subdir"]))) - if (!file.exists(localFile0)) - file.copy(from = localFile1, to = localFile0) - return(localFile1) - } - } - } - } - - file <- renv:::download(url, destfile, type = type, quiet = quiet, headers = headers) - if (!identical(type, "github")) { - maybecat(sprintf("skipping url: %s\n", url)) - } else { - - to <- file.path(dirs["local-github"], stripUrl(url)) - maybecat(sprintf("recording github url: %s to %s\n", makeGitHubUrlRelative(url), makePathRelative(to))) - if (file.exists(to)) { - maybecat(sprintf("%s already exists, deleting older versions!\n", makePathRelative(to))) - existingFiles <- list.files(path = dirname(to), pattern = paste(basename(to), "*"), full.names = TRUE) - res <- file.remove(existingFiles) - if (!all(res)) - stop2("Failed to remove previously downloaded GitHub packages: ", paste(existingFiles[!res], collapse = ", ")) - } - file.copy(from = destfile, to = to, overwrite = TRUE) - - } - - # renv does need this, but we don't - if (endsWith(url, "PACKAGES.rds") || endsWith(destfile, ".json") || startsWith(basename(destfile), "renv-")) { - return(file) - } - maybecat(sprintf("recording package url: %s\n", url)) - - storeUrl(url, destfile) - - return(file) - - }, error = function(e) { - if (interactive()) - browser() - else - stop2(e) - } - ) - -} - -maybecat <- function(x) { - if (getResultsEnv()$debug) cat(x) -} - -getResultsEnv <- function() get("resultsEnv", envir = .GlobalEnv) - -createResultsEnv <- function(dirForPkgs, downloadPkgs, fromLockFile = FALSE, debug = TRUE) { - if (exists("resultsEnv", envir = .GlobalEnv)) - rm(list = "resultsEnv", envir = .GlobalEnv) - assign("resultsEnv", new.env(parent = .GlobalEnv), pos = .GlobalEnv) - resultsEnv <- getResultsEnv() - resultsEnv$index <- 1L - resultsEnv$dirForPkgs <- dirForPkgs - resultsEnv$downloadPkgs <- downloadPkgs - resultsEnv$fromLockFile <- fromLockFile - resultsEnv$debug <- debug - - # if (!downloadPkgs && !fromLockFile) { - # fakepkgpath <- file.path(tempdir(), "fakepkg") - # mkdir(fakepkgpath) - # - # if (!file.exists(file.path(fakepkgpath, "fakepkg"))) - # utils::package.skeleton(name = "fakepkg", path = fakepkgpath) - # - # fakepkgtar <- file.path(tempdir(), "fakepkgtar.tar.gz") - # if (!file.exists(fakepkgtar)) { - # oldwd <- getwd() - # on.exit(setwd(oldwd), add = TRUE) - # setwd(file.path(fakepkgpath)) - # tar(fakepkgtar, list.files(), compression = "gzip", tar = "tar") - # } - # resultsEnv$fakepkgtar <- fakepkgtar - # } - - - resultsEnv -} - -storeUrl <- function(url, destfile) { - resultsEnv <- getResultsEnv() - # destfile <- file.path(resultsEnv$dirForPkgs, basename(destfile)) - - i <- resultsEnv$index - - resultsEnv$url[i] <- url - resultsEnv$destfile[i] <- destfile - resultsEnv$index <- resultsEnv$index + 1 -} - -stripUrl <- function(url) { - # since repos is hardcoded in renv:::renv_remotes_resolve_github_ref_impl and we modify host, - # this looks like the safest approach - gsub("/+", "_", strsplit(url, "repos/", fixed = TRUE)[[1L]][2]) -} - -mkdir <- function(x, deleteIfExists = FALSE) { - if (deleteIfExists) { - if (dir.exists(x)) - unlink(x, recursive = TRUE) - dir.create(x, recursive = TRUE) - } else if (!dir.exists(x)) { - dir.create(x, recursive = TRUE) - } -} - -hasRenvLockFile <- function(modulePkg) { - return(file.exists(file.path(modulePkg, "renv.lock"))) -} - -postProcessResults <- function() { - - resultsEnv <- getResultsEnv() - resultsEnv$packages <- character(length(resultsEnv$url)) - resultsEnv$version <- character(length(resultsEnv$url)) - - idx_cran <- grep("src/contrib/", resultsEnv$url) - if (length(resultsEnv$url) > 0L) { - temp <- strsplit(basename(resultsEnv$url[idx_cran]), "_", fixed = TRUE) - - resultsEnv$packages[idx_cran] <- vapply(temp, `[`, character(1L), 1L) - resultsEnv$version [idx_cran] <- sub(".tar.gz$", "", vapply(temp, `[`, character(1L), 2L)) - resultsEnv$source [idx_cran] <- "repository" - - idx_github <- grep("api.github.com/", resultsEnv$url) - - resultsEnv$packages[idx_github] <- gsub(".*/(.+)/tarball/.*", "\\1", resultsEnv$url[idx_github]) - resultsEnv$version [idx_github] <- basename(resultsEnv$url[idx_github]) # actually just the commit - resultsEnv$source [idx_github] <- "github" - } - - for (i in seq_along(resultsEnv$records)) - if (isGitHubRecord(resultsEnv$records[[i]])) - resultsEnv$records[[i]]$Path <- makePathRelative(resultsEnv$records[[i]]$Path) - - return(resultsEnv) -} - -makePathRelative <- function(path, base = getwd(), prepend = TRUE) { - if (prepend) base <- paste0(base, .Platform$file.sep) - gsub(pattern = base, replacement = "", x = path, fixed = TRUE) -} - -makeGitHubUrlRelative <- function(url) { - makePathRelative(url, "https://api.github.com/", FALSE) -} - -getFlatpakJSONFromDESCRIPTION <- function(pathToModule, dirForPkgs = tempdir(), downloadPkgs = FALSE) { - - if (!downloadPkgs) - warning("with downloadPkgs = FALSE dependencies of DEPENDENCIES won't show up in the results!", immediate. = TRUE) - - library <- file.path(dirForPkgs, "library") - mkdir(library) - resultsEnv <- createResultsEnv(dirForPkgs, downloadPkgs) - resultsEnv$records <- customRenvInstall(packages = pathToModule, library = library, rebuild = TRUE) - -} - -guardForNonStandardPackagesInSystemLibrary <- function() { - # look for packages in the system library and tell renv to rebuild them so it doesn't try to reuse them - installed <- installed.packages(.libPaths()[-1L]) - idx <- !startsWith(installed[, "License"], "Part of R ") - badPackagesFoundInSystemLibrary <- installed[idx, "Package"] - if (length(badPackagesFoundInSystemLibrary) > 0L) { - cat("Warning: The following packages were found in the system library but they are not shipped with R!\nThis script should still work, but you probably don't want this.\n") - cat(badPackagesFoundInSystemLibrary, sep = ", ") - cat("\n") - } - options(badPackagesFoundInSystemLibrary = badPackagesFoundInSystemLibrary) -} - -customRenvInstall <- function(packages, library = NULL, rebuild = TRUE, customDownload = TRUE) { - - if (customDownload) { - options("renv.download.override" = download_override) - on.exit(options("renv.download.override" = NULL)) - } - - old_renv_impl_install <- renv:::renv_install_impl - on.exit(assignFunctionInPackage(old_renv_impl_install, "renv_install_impl", "renv"), add = TRUE) - assignFunctionInPackage(identity, "renv_install_impl", "renv") - - rebuild <- c(packages, getOption("badPackagesFoundInSystemLibrary", default = character())) - renv::install(packages = packages, library = library, rebuild = rebuild) - -} - -installRecommendedPackages <- function(dirs) { - - installed <- installed.packages(.libPaths()) - recPkgs <- unname(installed[installed[, "Priority"] %in% "recommended", "Package"]) - - alreadyDownloadedPkgs <- list.files(dirs["local-cran-source"], pattern = "\\.tar\\.gz$", recursive = TRUE, full.names = FALSE) - alreadyDownloadedPkgs <- gsub("_(.*)", "", basename(alreadyDownloadedPkgs)) - - toInstall <- c(recPkgs, - # for some reason, "devtools" and "roxygen2" are missing... - # renv is not a direct dependency and is installed by default - # jasp-desktop does somewhere loadNamespace("remotes"), which is why we also download it here - "devtools", "roxygen2", "renv", "remotes" - ) - - toInstall <- setdiff(toInstall, alreadyDownloadedPkgs) - - # these must be installed from CRAN - options(repos = list(repos = c(CRAN = "https://cran.rstudio.com"))) - if (length(toInstall) > 0L) { - cat("Downloading recommended packages:", paste(toInstall, collapse = ", ")) - customRenvInstall(toInstall, customDownload = FALSE) - } else { - cat("All recommended packages are downloaded.") - } - -} - -# getFlatpakJSONFromLockfile <- function(pathToModule, dirForPkgs = tempdir(), downloadPkgs = FALSE) { -# -# options("renv.download.override" = download_override) -# on.exit(options("renv.download.override" = NULL)) -# -# lockfile <- jsonlite::fromJSON(file.path(pathToModule, "renv.lock")) -# records <- lockfile$Packages -# records <- Filter(function(x) !x$Package %in% c("jaspTools", "jaspResults"), records) -# -# nrecords <- length(records) -# -# resultsEnv <- createResultsEnv(dirForPkgs, downloadPkgs, fromLockFile = TRUE) -# resultsEnv$packages <- character(nrecords) -# resultsEnv$url <- character(nrecords) -# resultsEnv$destfile <- character(nrecords) -# resultsEnv$records <- vector("list", nrecords) -# -# pb <- utils::txtProgressBar(max = nrecords, style = 3) -# on.exit(close(pb), add = TRUE) -# for (i in seq_along(records)) { -# -# # TODO: consider the same hack as in getFlatpakJSONFromDESCRIPTION to overwrite renv:::renv_install -# -# tryCatch( -# # rebuild ensures we bypass the cache -# capture.output(renv::install(records[i], rebuild = TRUE, sources = "")), -# earlyExit = function(e) {}, -# error = function(e) { -# if (!identical(e[["message"]], "failed to retrieve 'Error: expected error: early exit\n' [expected error: early exit]")) { -# browser(e) -# print(paste("got an error:", e[["message"]])) -# } -# } -# ) -# -# utils::setTxtProgressBar(pb, i) -# -# } -# -# } - -getFlatpakJSONFromModule <- function(pathToModule, dirForPkgs = tempdir(), downloadPkgs = FALSE) { - - mkdir(dirForPkgs) - - # for now we assume no modules have a lockfile - # if (hasRenvLockFile(pathToModule)) { - # getFlatpakJSONFromLockfile(pathToModule, dirForPkgs, downloadPkgs) - # } else { - getFlatpakJSONFromDESCRIPTION(pathToModule, dirForPkgs, downloadPkgs) - # } - - postProcessResults() - -} - -# repository infrastructure -createFolderStructure <- function(toplevel = file.path(getwd(), "toplevelRepository")) { - - contrib <- file.path(toplevel, "src", "contrib") - mkdir(contrib) - contribBinary <- file.path(toplevel, "bin", "linux", "contrib") - mkdir(contribBinary) - return(c("root" = toplevel, "source" = contrib, "binary" = contribBinary)) - -} - -getPackageFilesBySource <- function(resultsEnv, source, invert = FALSE) { - - idx <- if (invert) resultsEnv$source != source else resultsEnv$source == source - return(paste0(resultsEnv$packages[idx], "_", resultsEnv$version[idx], ".tar.gz")) - -} - -createLocalRepository <- function(contrib, sourcePkgsDir) { - - # nonRepositoryPkgsNames <- Reduce(unique, lapply( - # moduleEnvironments, - # function(resultsEnv) getPackageFilesBySource(resultsEnv, "repository", invert = TRUE) - # )) - - # repositoryPkgFiles <- setdiff(list.files(sourcePkgsDir, pattern = "\\.tar\\.gz$", recursive = TRUE), nonRepositoryPkgsNames) - - repositoryPkgFiles <- list.files(sourcePkgsDir, pattern = "\\.tar\\.gz$", recursive = TRUE, full.names = TRUE) - - file.copy(repositoryPkgFiles, to = file.path(contrib, basename(repositoryPkgFiles))) - tools::write_PACKAGES(contrib, type = "source") - -} - -createLocalGithubRepository <- function(resultsEnv, githubDir, sourcePkgsDir) { - - githubPkgsNames <- getPackageFilesBySource(resultsEnv, "github") - - githubRecords <- Filter(function(x) x[["Source"]] == "GitHub", resultsEnv$records) - temp <- vapply(githubRecords, function(x) paste0(x$Package, "_", x$RemoteSha, ".tar.gz"), character(1L)) - githubPkgsNames <- githubPkgsNames[match(temp, githubPkgsNames)] - - fmt <- "%s/repos/%s/%s/tarball/%s" - for (i in seq_along(githubRecords)) { - record <- githubRecords[[i]] - newPath <- file.path(githubDir, sprintf(fmt, record$RemoteUsername, record$RemoteRepo, record$RemoteSha, githubPkgsNames[i])) - mkdir(dirname(newPath)) - file.copy(file.path(sourcePkgsDir, githubPkgsNames[i]), newPath) - } - -} - -createLocalPackageRepository <- function(dirs) { - - createLocalRepository(dirs["local-cran-source"], dirs[c("renv-root-source", "renv-root-binary")]) - -} - -copy_of_renv_bootstrap_platform_prefix <- function() { - # as the name suggests, a copy of renv:::renv_bootstrap_platform_prefix - version <- paste(R.version$major, R.version$minor, sep = ".") - prefix <- paste("R", numeric_version(version)[1, 1:2], sep = "-") - devel <- identical(R.version[["status"]], "Under development (unstable)") || - identical(R.version[["nickname"]], "Unsuffered Consequences") - if (devel) - prefix <- paste(prefix, R.version[["svn rev"]], sep = "-r") - components <- c(prefix, R.version$platform) - # prefix <- renv_bootstrap_platform_prefix_impl() - prefix <- NA - if (!is.na(prefix) && nzchar(prefix)) - components <- c(prefix, components) - paste(components, collapse = "/") -} - -setupJaspDirs <- function(root = getwd(), jaspSubdir = "jasp-build", flatpakSubdir = "flatpak-helper", clearAll = FALSE, renvOnly = FALSE) { - - paths <- c( - # folder structure should be identical to JASP - "Modules" = file.path(root, jaspSubdir, "Modules"), - "renv-cache" = file.path(root, jaspSubdir, "renv-cache"), - "renv-root" = file.path(root, jaspSubdir, "renv-root"), - "renv-root-source" = file.path(root, jaspSubdir, "renv-root", "source", "repository"), - "renv-root-binary" = file.path(root, jaspSubdir, "renv-root", "binary", copy_of_renv_bootstrap_platform_prefix(), "repository"), - - # these directories are only relevant for building flatpak - "module-environments" = file.path(root, flatpakSubdir, "module-environments"), - "other-dependencies" = file.path(root, flatpakSubdir, "other-dependencies"), - "r-helpers" = file.path(root, flatpakSubdir, "r-helpers"), - "local-cran" = file.path(root, flatpakSubdir, "local-cran"), - "local-cran-source" = file.path(root, flatpakSubdir, "local-cran", "src", "contrib"), - "local-cran-binary" = file.path(root, flatpakSubdir, "local-cran", "bin", "linux", "contrib"), - "local-github" = file.path(root, flatpakSubdir, "local-github"), - "root" = root, - "jasp-subdir" = file.path(root, jaspSubdir), - "flatpak-dir" = file.path(root, flatpakSubdir) - ) - - if (renvOnly) - paths <- paths[startsWith(names(paths), "renv-")] - - if (clearAll) - lapply(paths, unlink, recursive = TRUE) - - lapply(paths, mkdir) - - return(sapply(paths, normalizePath)) -} - -getModuleEnvironments <- function(jaspModules) { - # moduleEnvironments contains all meta data for the packages (versions, url, etc.) - moduleEnvironments <- setNames(vector("list", length(jaspModules)), names(jaspModules)) - - for (url in jaspModules) { - nm <- basename(url) - moduleEnvironments[[nm]] <- getFlatpakJSONFromModule(url, downloadPkgs = TRUE) - } - return(invisible(moduleEnvironments)) -} - -installGitHubRecords <- function(githubRecords, tempLib) { - - # pretend the github packages are local packages (which they are) - # the order of githubRecords follows the order of the obtained URLs so the module of interest is always last - for (temprecord in githubRecords) { - record <- list(list( - Package = temprecord[["Package"]], - Version = temprecord[["Version"]], - Path = fixLocalPath(temprecord[["Path"]]), # renv requires an absolute path - Source = "Local", - Cacheable = TRUE - )) - names(record) <- temprecord[["Package"]] - print("installing record:") - print(record) - renv::install(record, library = tempLib, project = tempLib[1]) - } - -} - -fixLocalPath <- function(path) { - - # TODO: this function is unnessecary if we'd store the correct path immediately! - # the problem is that if you modify flatpakGeneratePkgsList, this might modify the path - # and this function is a convenient fallback - - # .. I should really delete this - path <- sub(pattern = "jasp_build", replacement = "jasp-build", x = path, fixed = TRUE) - - cat("wd:\t", getwd(), "\ndir():\t", dir(getwd()), "\npath:\t", path, '\n') - cat(file.path(getwd(), path), "\n") - if (file.exists(path)) - return(normalizePath(path)) - - - print(dir(file.path(getwd(), "jasp-build", "renv-root/source/github/jaspBase/"))) - print(dir(file.path(getwd(), "jasp-build", "renv-root/source/github/"))) - print(dir(file.path(getwd(), "jasp-build", "renv-root/source/"))) - - orgpath <- path - oldpath <- path - newpath <- sub("[^/]+/", "", oldpath) - - # drop the highest directory until the thingy exists - while (oldpath != newpath) { - cat(sprintf("trying path %s\n", file.path(getwd(), newpath))) - if (file.exists(file.path(getwd(), newpath))) - return(normalizePath(file.path(getwd(), newpath))) - oldpath <- newpath - newpath <- sub("[^/]+/", "", newpath) - } - stop2(sprintf("Could not make this path work: %s", orgpath)) - -} - -isGitHubRecord <- function(x) { - x[["Source"]] == "GitHub" -} - -installModules <- function(dirs, moduleEnvironments) { - - moduleNames <- names(moduleEnvironments) - for (i in seq_along(moduleEnvironments)) { - - env <- moduleEnvironments[[i]] - githubRecords <- Filter(isGitHubRecord, env$records) - - lib <- file.path(dirs["Modules"], moduleNames[i]) - unlink(lib, recursive = TRUE) - mkdir(lib) - - # we use here the last libPaths. Usually that one only contains the default packages (e.g., when using renv) - # when this also contains other packages, the installation behavior might differ from flatpak - libpaths <- .libPaths() - installGitHubRecords(githubRecords, c(normalizePath(lib), libpaths[length(libpaths)])) - - } - -} - -downloadFile <- function(url, destdir) { - mkdir(destdir) - destfile <- file.path(destdir, basename(url)) - download.file(url = url, destfile = destfile) - return(destfile) -} - -copyRfiles <- function(dirs) { - rfiles <- list.files("R", pattern = "*\\.R$", full.names = TRUE) - successes <- file.copy(from = rfiles, to = dirs["r-helpers"], overwrite = TRUE) - if (!all(successes)) - stop2("failed to copy these R files: ", paste(rfiles[!successes], collapse = ", "), " to ", dirs["r-helpers"]) - -} - -createTarArchive <- function(dirs, jaspDir, outputPath = "archives/flatpak_archive_%s.tar.gz", compression = c("fast", "none", "best"), - verbose = TRUE, update = FALSE) { - - # TODO: update does not work - - if (grepl("%s", outputPath)) { - # get the tag of the current jasp-desktop clone or the commit hash as a fallback - commitHash <- system(sprintf("cd %s && git describe --exact-match --tags 2> /dev/null || git rev-parse HEAD", jaspDir), intern = TRUE) - outputPath <- sprintf(outputPath, commitHash) - } - - if (update && !identical(compression[1L], "none")) { - warning("can only update when compression is 'none'! Not updating instead.", immediate. = TRUE) - update <- FALSE - } - - if (!is.numeric(compression)) { - compression <- match.arg(compression) - compression <- switch(compression, - "none" = "", - "best" = "-I 'gzip -9'", - "fast" = "-I 'gzip -1'" - ) - } else if (!is.numeric(compression) || (is.numeric(compression) && !(compression >= 1 && compression <= 9))) { - stop2("compression must be character ('best' or 'fast') or numeric (1-9)") - } - - dirsForArchive <- dirs["flatpak-dir"] - # dirsForArchive <- c(dirs["flatpak-dir"], file.path(dirs["renv-root"], "source", "github")) - - # files <- file.path("..", basename(getwd()), makePathRelative(dirsForArchive)) - files <- makePathRelative(dirsForArchive, base = dirname(dirs["root"])) - - mkdir(dirname(outputPath)) - - creatArchive <- sprintf( - "tar --mode=a+rw %s -%s%sf %s %s", - compression, - if (verbose) "v" else "", - if (update) "u" else "c", - outputPath, - paste(files, collapse = " ") - ) - cat('running: ', creatArchive, '\n') - system(creatArchive) - - sha256 <- strsplit(system2("sha256sum", outputPath, stdout = TRUE), " ", fixed = TRUE)[[1]][1] - cat("\nsha256sum\n") - cat(sha256, '\n') - - rfile <- makePathRelative(file.path(dirs["r-helpers"], "flatpakRegenerateRenvStructure.R"), base = dirs["root"]) - cat(sprintf("command for flatpak\nR --vanilla --file=%s\n", rfile)) - - return(c( - "tar-file" = outputPath, - "sha256" = sha256, - "r-file" = rfile - )) -} - -uploadTarArchive <- function(archivePath = "archives/flatpak_archive.tar.gz", verbose = TRUE, printOnly = TRUE) { - - if (!file.exists(archivePath)) - stop2("Archive does not exist") - - archivePath <- normalizePath(archivePath) - archiveName <- "flatpak_archive_buildbot.tar.gz" - - cmd <- sprintf("scp %s jonathonlove@static.jasp-stats.org:static.jasp-stats.org/%s", archivePath, archiveName) - if (printOnly) cat(cmd) else system(cmd) - -} - -writeRpkgsJson <- function(path, info, local = FALSE) { - - template <- '{ - "name": "RPackages2", - "buildsystem": "simple", - "build-commands": [], - "modules": - [ - { - "name": "Rpackages", - "buildsystem": "simple", - "sources": [ - { - "type": "archive", - "url": "%s", - "sha256": "%s" - } - ], - "build-commands": ["cd ./flatpak-helper/local-cran/src/contrib && gunzip rstanarm* && tar --delete -vf rstanarm_*.tar rstanarm/cleanup && gzip rstanarm*.tar", - "R --vanilla --file=%s" ] - } - ] -} -' - - location <- if (local) { - file.path("file:/", normalizePath(info["tar-file"])) - } else { - paste0("http://static.jasp-stats.org/", "flatpak_archive_buildbot.tar.gz") - } - - new <- sprintf(template, location, info["sha256"], info["r-file"]) - writeLines(new, path) - -} - -prettyCat <- function(x) { - name <- deparse(substitute(x)) - if (is.list(x)) { - cat(name, '\n') - cat(unlist(lapply(seq_along(x), function(i) paste(c(names(x[i]), x[[i]]), collapse = "\n"))), sep = '\n\n') - } else if (!is.null(names(x))) - cat(name, '\n', paste(format(names(x)), unname(x), sep = '\t', collapse = '\n'), '\n', sep = "") - else if (length(x) == 1L) - cat(name, '\t', x, '\n', sep = "") - else - cat(name, '\n', paste(x, collapse = '\n'), '\n', sep = "") -} - -installJaspStats <- function(pkgs, dirs) { - - paths <- character(length(pkgs)) - for (i in seq_along(pkgs)) { - pathsFound <- list.files(path = dirs["local-github"], pattern = sprintf("^jasp-stats_%s_tarball_", pkgs[i]), full.names = TRUE) - if (length(pathsFound) != 1L) - stop2("There are ", if (length(pathsFound) < 1L) "zero" else "multiple", " ", pkgs[i], "_*.tar.gz present!") - paths[i] <- pathsFound - } - - prettyCat(paths) - - for (path in paths) { - pathtemp <- tempfile(fileext = ".tar.gz") - file.copy(path, to = pathtemp) - renv::install(pathtemp) - } - -} - -makeTar <- function(pathOriginal, dirTemp) { - - newPathV8 <- file.path(dirTemp, basename(pathOriginal)) - oldwd <- getwd() - on.exit(setwd(oldwd)) - setwd(dir) - tar(tarfile = newPathV8, files = "V8", compression = "gzip") - - file.copy(from = newPathV8, to = pathOriginal, overwrite = TRUE) - -} - -cleanupBigPackages <- function(dirs) { - - # So the GitHub downloads contain EVERYTHING in a repo. That's much more than we need. - # Luckily, almost every package has an .Rbuildignore. So when we unpack the github tarball - # and ask R to build a source package then anything listed in .Rbuildignore is excluded - # from the tarball. This provides a very effective way for deleting useless files while not - # having to make any guesses about what the package authors intended. - # In addition, this function deletes the folders "tests" and "vignettes". - - oldwd <- getwd() - on.exit(setwd(oldwd)) - paths <- list.files(dirs["local-github"], pattern = "*_tarball_*", full.names = TRUE) - - dirTemp <- file.path(tempdir(), "resize-github-pkgs") - mkdir(dirTemp, deleteIfExists = TRUE) - - rpath <- file.path(Sys.getenv("R_HOME"), "bin", "R") - - for (i in seq_along(paths)) { - - path <- paths[i] - dirTempPkg <- file.path(dirTemp, basename(path)) - mkdir(dirTempPkg, deleteIfExists = TRUE) - untar(path, exdir = dirTempPkg) - - newPath <- file.path(dirTempPkg, dir(dirTempPkg)) - - unlink(file.path(newPath, c( - "vignettes", - "tests" - )), recursive = TRUE) - - dirTemp2 <- file.path(tempdir(), basename(path)) - mkdir(dirTemp2, deleteIfExists = TRUE) - - if (startsWith(basename(path), "dustinfife_flexplot")) { - # flexplot removes jasp related files in the .Rbuildignore... - .RbuildignorePath <- file.path(newPath, ".Rbuildignore") - if (file.exists(.RbuildignorePath)) { - .Rbuildignore <- readLines(.RbuildignorePath) - .Rbuildignore <- .Rbuildignore[!(grepl("jasp", .Rbuildignore) & endsWith(.Rbuildignore, ".R"))] - writeLines(.Rbuildignore, .RbuildignorePath) - } - - } - - setwd(dirTemp2) - cmd <- sprintf("%s CMD build --no-build-vignettes --no-manual --resave-data %s", rpath, newPath) - system(cmd) - - file.copy(from = dir(dirTemp2), to = path, overwrite = TRUE) - - } - -} - -copyV8Lib <- function(dirs, source = "other_deps/v8") { - if (!file.copy(source, to = dirs["other-dependencies"], recursive = TRUE)) - stop2("Failed to copy from ", source, " to ", dirs["other-dependencies"]) -} - -updateV8Rpackage <- function(dirs) { - - pathV8 <- list.files(file.path(dirs["renv-root-source"], "V8"), pattern = "^V8_*", full.names = TRUE) - if (length(pathV8) == 0L) { - warning("No V8 package found. This is fine if you adjusted some things and are not building everything.", domain = NA) - return() - } - - fixV8Package <- function(pathV8) { - dirTemp <- file.path(tempdir(), "V8_fix") - mkdir(dirTemp, deleteIfExists = TRUE) - untar(tarfile = pathV8, exdir = dirTemp) - dirTempV8 <- file.path(dirTemp, "V8") - configureLines <- readLines(file.path(dirTempV8, "configure")) - configureLines[startsWith(configureLines, "PKG_LIBS=\"-lv8")] <- "PKG_LIBS=\"-lv8_monolith_$LIB_ARCH\"" - configureLines[startsWith(configureLines, "PKG_CFLAGS=\"-I/usr/include/v8")] <- "PKG_CFLAGS=\"\"" - writeLines(configureLines, file.path(dirTempV8, "configure")) - - newPathV8 <- file.path(dirTemp, basename(pathV8)) - oldwd <- getwd() - on.exit(setwd(oldwd)) - setwd(dirTemp) - tar(tarfile = newPathV8, files = "V8", compression = "gzip") - - result <- file.copy(from = newPathV8, to = pathV8, overwrite = TRUE) - if (!result) - stop2("failed to update the V8 package for path: ", pathV8) - - } - - fixV8Package(pathV8) - - # also do this for the cran repo, just in case functions are run out of order - pathV8cran <- list.files(dirs["local-cran-source"], pattern = "^V8_*", full.names = TRUE) - if (length(pathV8cran) > 0L) - fixV8Package(pathV8cran) - -} - -moveMissingTarBalls <- function(dirs) { - # sometimes renv realizes that it does not need to redownload a github package because it already has the source in - # flatpak_folder/jasp-build/renv-root/source/github. - # this function locates any missing tarballs and copies them to flatpak_folder/flatpak-helper/local-github/ - - allFiles <- list.files(dirs["local-github"]) - - r <- "^(.*)_contents_DESCRIPTION\\?ref=(.+)$" - matches <- regmatches(allFiles, regexec(r, allFiles)) - matches <- matches[lengths(matches) > 0L] - - SHAs <- unlist(lapply(matches, `[[`, 3L), use.names = FALSE) - names(SHAs) <- unlist(lapply(matches, `[[`, 2L), use.names = FALSE) - tarballs <- file.path(dirs["local-github"], paste0(names(SHAs), "_tarball_", SHAs)) - missing <- which(!file.exists(tarballs)) - - if (length(missing) > 0L) { - repoNames <- vapply(strsplit(names(SHAs[missing]), "_", fixed = TRUE), `[[`, character(1L), 2L) - backupTarballNames <- paste0(repoNames, "_", SHAs[missing], ".tar.gz") - backupTarballs <- file.path(dirs["renv-root"], "source", "github", repoNames, backupTarballNames) - - found <- file.exists(backupTarballs) - file.copy(from = backupTarballs[found], to = tarballs[missing][found]) - - cat("Moved these tarballs:\n", paste(basename(tarballs[missing][found]), collapse = ", "), "\n") - - if (any(!found)) { - warning("Did not find these tarballs: ", paste(backupTarballs[!found], collapse = ","), - " check if these tarballs are ok: ", paste(tarballs[missing][!found], collapse = ","), domain = NA) - } - } else { - cat("No missing tarballs.\n") - } -} - -downloadV8ifneeded <- function(destination = "other_deps") { - - if (!dir.exists(file.path(destination, "v8"))) { - # ensure parent folder exists - mkdir(destination) - downloadFile(url = "http://static.jasp-stats.org/v8.tar.gz", destination) - - oldwd <- getwd() - setwd(destination) - on.exit(setwd(oldwd)) - untar(tarfile = normalizePath("v8.tar.gz")) - } - -} - -getDirs <- function() { - get("dirs", envir = .GlobalEnv) -} - -stop2 <- function(..., call. = TRUE, domain = NA) { - stop(cli::col_red(cli::style_bold(paste0(..., collapse = ""))), call. = call., domain = domain) -} - -options("error" = function() { - traceback(4, max.lines = 2L) - if (!interactive()) { - quit(status = 1) - } -}) diff --git a/Tools/flatpak/setup-rpkgs/R/validators.R b/Tools/flatpak/setup-rpkgs/R/validators.R deleted file mode 100644 index a48a7887fa..0000000000 --- a/Tools/flatpak/setup-rpkgs/R/validators.R +++ /dev/null @@ -1,80 +0,0 @@ -assertDirExists <- function(x) { - if (!dir.exists(x)) - stop2("Directory ", x, " does not exist") -} - -validateJaspDir <- function(dir) { - assertDirExists(dir) - expectedDirs <- c("Common", "Desktop", "Engine", "Modules", "R-Interface", "Resources", "Tools") - if (!all(expectedDirs %in% list.dirs(dir, full.names = FALSE, recursive = FALSE))) - stop2("Invalid jaspDir. Expected these folders: ", paste(expectedDirs, collapse = ", ")) -} - -validateFlatpakDir <- function(dir) { - assertDirExists(dir) - expectedFiles <- c("flathub.json", "org.jaspstats.JASP.json", "RPackages.json") - if (!all(expectedFiles %in% list.files(dir))) - stop2("Invalid flatpakDir. Expected these files") -} - -validateGithubPath <- function() { - if (Sys.getenv("GITHUB_PAT") == "") - stop2("GITHUB_PAT is not set!") -} - -validateSetup <- function(jaspDir, flatpakDir) { - # call this before downloading pkgs - validateJaspDir(jaspDir) - validateFlatpakDir(flatpakDir) - validateGithubPath() -} - -validateGithubPkgs <- function(dirs) { - - errorMessages <- character() - allFiles <- list.files(dirs["local-github"]) - - r <- "^(.*)_contents_DESCRIPTION\\?ref=(.+)$" - matches <- regmatches(allFiles, regexec(r, allFiles)) - matches <- matches[lengths(matches) > 0L] - - SHAs <- unlist(lapply(matches, `[[`, 3L), use.names = FALSE) - names(SHAs) <- unlist(lapply(matches, `[[`, 2L), use.names = FALSE) - - # check 1: verify that all the index files match the names - this check is no good if people explicitly specify a commit in the DESCRIPTION - # indexFiles <- allFiles[grep("^([^_]*_){1}[^_]*$", allFiles)] - # diff <- setdiff(names(SHAs), indexFiles) - # if (length(diff) > 0L) - # errorMessages <- c(errorMessages, paste0("These _contents_DESCRIPTION are missing an index file: ", paste0(diff, collapse = ","))) - - # check 2: verify that every "*_contents_description*" has an associated tarball - tarballs <- file.path(dirs["local-github"], paste0(names(SHAs), "_tarball_", SHAs)) - missing <- which(!file.exists(tarballs)) - if (length(missing) > 0L) - errorMessages <- c(errorMessages, paste0("These github packages are missing a tarball: ", paste(names(SHAs)[missing], collapse = ", "))) - - if (length(errorMessages) > 0L) - stop2("These error message occurred:\n\n", paste(errorMessages, collapse = "\n")) - - return(invisible(TRUE)) - -} - -validateV8folder <- function(dirs) { - - v8Dir <- file.path(dirs["other-dependencies"], "v8") - if (!dir.exists(v8Dir)) - stop2("V8 dir does not exist at ", v8Dir, domain = NA) - - subdirs <- file.path(v8Dir, c("include", "lib", "lic")) - if (!all(dir.exists(subdirs))) - stop2("V8 dir does not contain the following subdirectories: ", paste(subdirs, collapse = ", "), domain = NA) - - -} - -validateFlatpakFolder <- function(dirs) { - # call this before creating one tar.gz - validateGithubPkgs(dirs) - validateV8folder(dirs) -} diff --git a/Tools/flatpak/setup-rpkgs/README.md b/Tools/flatpak/setup-rpkgs/README.md deleted file mode 100644 index 72b134928d..0000000000 --- a/Tools/flatpak/setup-rpkgs/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Helper functions to JASP work on flatpak - -#### Building the flatpak locally. - -From a terminal, run `Rscript R/flatpakGeneratePkgsList.R` to generate a tar.gz under archives that contains all packages. -Alternatively, open the project file in RStudio and source `flatpakGeneratePkgsList.R`. -To build JASP locally, clone https://github.com/flathub/org.jaspstats.JASP and then run `flatpak-builder --user --install --force-clean build org.jaspstats.JASP.json` where `build` is your build folder. - -#### Debugging the flatpak build - -First build the flatpak version locally. -Next, in your clone of flathub/org.jaspstats.JASP do -``` -flatpak run -d --command=sh org.jaspstats.JASP -``` -This starts shell instead of directly starting JASP. -The remainder of the commans should be run from that shell. -To start JASP with a debugger, do -``` -gdb /app/bin/org.jaspstats.JASP -``` -If you get a message about debugsymbols not found, you can hopefully locate these using: -``` -find /app/ -type f -name "*.debug" -``` diff --git a/Tools/flatpak/setup-rpkgs/TODO.md b/Tools/flatpak/setup-rpkgs/TODO.md deleted file mode 100644 index 52e2a0034b..0000000000 --- a/Tools/flatpak/setup-rpkgs/TODO.md +++ /dev/null @@ -1,26 +0,0 @@ -# TODO: - -- [x] 1. make sure the installed packages are actually symlinks -- [x] 2. make a neat interface to loop over all modules (folder structure identical to JASP!) -- [x] 3. test it for 4-5 modules -- [ ] 4. look at how multiple versions are handled within a custom CRAN repo! test if renv::install(@version) works! -- [x] 5. bundle an renv tar.gz into this and make sure we can install it separately! - -- [x] 6. look into running flatpak locally - - [x] a. how to update jasp? can look at specific commit I guess - -- [x] 7. can we do without the custom download script? No we can't -- [x] 8. make this a github repo and push it (too much work went into it already!) -- [x] 9. add renv to the local CRAN repo and install it from there! - -- [x] 10. Somehow put stuff in /app/lib64/ -- [x] 11. Don't install all the r packages, only V8, renv, and jaspBase. + jaspGraphs - -- [x] 12. Upload the big tar.gz to static. - -- [ ] 13. There are messages about "package is not available" (devtools, roxygen2, etc.) - - a. [ ] figure out if we can get these by also downloading Suggests! - -- [ ] 14. The moduleEnvironments object is no longer necessary. It's probably useful for debugging to create it but it shouldn't be in the archive. - -- [ ] 15. Reduce the size of the flatpak object (1.2 GB is a bit much). Check if unnecessary stuff is actually deleted (like local-github) diff --git a/Tools/flatpak/setup-rpkgs/renv.lock b/Tools/flatpak/setup-rpkgs/renv.lock deleted file mode 100644 index 13d0e8ffd8..0000000000 --- a/Tools/flatpak/setup-rpkgs/renv.lock +++ /dev/null @@ -1,29 +0,0 @@ -{ - "R": { - "Version": "4.2.1", - "Repositories": [ - { - "Name": "repos", - "URL": "https://cran.rstudio.com" - } - ] - }, - "Packages": { - "crayon": { - "Package": "crayon", - "Version": "1.5.1", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "8dc45fd8a1ee067a92b85ef274e66d6a", - "Requirements": [] - }, - "renv": { - "Package": "renv", - "Version": "0.15.5", - "Source": "Repository", - "Repository": "CRAN", - "Hash": "6a38294e7d12f5d8e656b08c5bd8ae34", - "Requirements": [] - } - } -} diff --git a/Tools/flatpak/setup-rpkgs/renv/.gitignore b/Tools/flatpak/setup-rpkgs/renv/.gitignore deleted file mode 100644 index cb0686430c..0000000000 --- a/Tools/flatpak/setup-rpkgs/renv/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -cellar/ -library/ -local/ -lock/ -python/ -staging/ diff --git a/Tools/flatpak/setup-rpkgs/renv/activate.R b/Tools/flatpak/setup-rpkgs/renv/activate.R deleted file mode 100644 index 72c0818a82..0000000000 --- a/Tools/flatpak/setup-rpkgs/renv/activate.R +++ /dev/null @@ -1,942 +0,0 @@ - -local({ - - # the requested version of renv - version <- "0.15.5" - - # the project directory - project <- getwd() - - # figure out whether the autoloader is enabled - enabled <- local({ - - # first, check config option - override <- getOption("renv.config.autoloader.enabled") - if (!is.null(override)) - return(override) - - # next, check environment variables - # TODO: prefer using the configuration one in the future - envvars <- c( - "RENV_CONFIG_AUTOLOADER_ENABLED", - "RENV_AUTOLOADER_ENABLED", - "RENV_ACTIVATE_PROJECT" - ) - - for (envvar in envvars) { - envval <- Sys.getenv(envvar, unset = NA) - if (!is.na(envval)) - return(tolower(envval) %in% c("true", "t", "1")) - } - - # enable by default - TRUE - - }) - - if (!enabled) - return(FALSE) - - # avoid recursion - if (identical(getOption("renv.autoloader.running"), TRUE)) { - warning("ignoring recursive attempt to run renv autoloader") - return(invisible(TRUE)) - } - - # signal that we're loading renv during R startup - options(renv.autoloader.running = TRUE) - on.exit(options(renv.autoloader.running = NULL), add = TRUE) - - # signal that we've consented to use renv - options(renv.consent = TRUE) - - # load the 'utils' package eagerly -- this ensures that renv shims, which - # mask 'utils' packages, will come first on the search path - library(utils, lib.loc = .Library) - - # unload renv if it's already been loaded - if ("renv" %in% loadedNamespaces()) - unloadNamespace("renv") - - # load bootstrap tools - `%||%` <- function(x, y) { - if (is.environment(x) || length(x)) x else y - } - - bootstrap <- function(version, library) { - - # attempt to download renv - tarball <- tryCatch(renv_bootstrap_download(version), error = identity) - if (inherits(tarball, "error")) - stop("failed to download renv ", version) - - # now attempt to install - status <- tryCatch(renv_bootstrap_install(version, tarball, library), error = identity) - if (inherits(status, "error")) - stop("failed to install renv ", version) - - } - - renv_bootstrap_tests_running <- function() { - getOption("renv.tests.running", default = FALSE) - } - - renv_bootstrap_repos <- function() { - - # check for repos override - repos <- Sys.getenv("RENV_CONFIG_REPOS_OVERRIDE", unset = NA) - if (!is.na(repos)) - return(repos) - - # check for lockfile repositories - repos <- tryCatch(renv_bootstrap_repos_lockfile(), error = identity) - if (!inherits(repos, "error") && length(repos)) - return(repos) - - # if we're testing, re-use the test repositories - if (renv_bootstrap_tests_running()) - return(getOption("renv.tests.repos")) - - # retrieve current repos - repos <- getOption("repos") - - # ensure @CRAN@ entries are resolved - repos[repos == "@CRAN@"] <- getOption( - "renv.repos.cran", - "https://cloud.r-project.org" - ) - - # add in renv.bootstrap.repos if set - default <- c(FALLBACK = "https://cloud.r-project.org") - extra <- getOption("renv.bootstrap.repos", default = default) - repos <- c(repos, extra) - - # remove duplicates that might've snuck in - dupes <- duplicated(repos) | duplicated(names(repos)) - repos[!dupes] - - } - - renv_bootstrap_repos_lockfile <- function() { - - lockpath <- Sys.getenv("RENV_PATHS_LOCKFILE", unset = "renv.lock") - if (!file.exists(lockpath)) - return(NULL) - - lockfile <- tryCatch(renv_json_read(lockpath), error = identity) - if (inherits(lockfile, "error")) { - warning(lockfile) - return(NULL) - } - - repos <- lockfile$R$Repositories - if (length(repos) == 0) - return(NULL) - - keys <- vapply(repos, `[[`, "Name", FUN.VALUE = character(1)) - vals <- vapply(repos, `[[`, "URL", FUN.VALUE = character(1)) - names(vals) <- keys - - return(vals) - - } - - renv_bootstrap_download <- function(version) { - - # if the renv version number has 4 components, assume it must - # be retrieved via github - nv <- numeric_version(version) - components <- unclass(nv)[[1]] - - # if this appears to be a development version of 'renv', we'll - # try to restore from github - dev <- length(components) == 4L - - # begin collecting different methods for finding renv - methods <- c( - renv_bootstrap_download_tarball, - if (dev) - renv_bootstrap_download_github - else c( - renv_bootstrap_download_cran_latest, - renv_bootstrap_download_cran_archive - ) - ) - - for (method in methods) { - path <- tryCatch(method(version), error = identity) - if (is.character(path) && file.exists(path)) - return(path) - } - - stop("failed to download renv ", version) - - } - - renv_bootstrap_download_impl <- function(url, destfile) { - - mode <- "wb" - - # https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17715 - fixup <- - Sys.info()[["sysname"]] == "Windows" && - substring(url, 1L, 5L) == "file:" - - if (fixup) - mode <- "w+b" - - utils::download.file( - url = url, - destfile = destfile, - mode = mode, - quiet = TRUE - ) - - } - - renv_bootstrap_download_cran_latest <- function(version) { - - spec <- renv_bootstrap_download_cran_latest_find(version) - - message("* Downloading renv ", version, " ... ", appendLF = FALSE) - - type <- spec$type - repos <- spec$repos - - info <- tryCatch( - utils::download.packages( - pkgs = "renv", - destdir = tempdir(), - repos = repos, - type = type, - quiet = TRUE - ), - condition = identity - ) - - if (inherits(info, "condition")) { - message("FAILED") - return(FALSE) - } - - # report success and return - message("OK (downloaded ", type, ")") - info[1, 2] - - } - - renv_bootstrap_download_cran_latest_find <- function(version) { - - # check whether binaries are supported on this system - binary <- - getOption("renv.bootstrap.binary", default = TRUE) && - !identical(.Platform$pkgType, "source") && - !identical(getOption("pkgType"), "source") && - Sys.info()[["sysname"]] %in% c("Darwin", "Windows") - - types <- c(if (binary) "binary", "source") - - # iterate over types + repositories - for (type in types) { - for (repos in renv_bootstrap_repos()) { - - # retrieve package database - db <- tryCatch( - as.data.frame( - utils::available.packages(type = type, repos = repos), - stringsAsFactors = FALSE - ), - error = identity - ) - - if (inherits(db, "error")) - next - - # check for compatible entry - entry <- db[db$Package %in% "renv" & db$Version %in% version, ] - if (nrow(entry) == 0) - next - - # found it; return spec to caller - spec <- list(entry = entry, type = type, repos = repos) - return(spec) - - } - } - - # if we got here, we failed to find renv - fmt <- "renv %s is not available from your declared package repositories" - stop(sprintf(fmt, version)) - - } - - renv_bootstrap_download_cran_archive <- function(version) { - - name <- sprintf("renv_%s.tar.gz", version) - repos <- renv_bootstrap_repos() - urls <- file.path(repos, "src/contrib/Archive/renv", name) - destfile <- file.path(tempdir(), name) - - message("* Downloading renv ", version, " ... ", appendLF = FALSE) - - for (url in urls) { - - status <- tryCatch( - renv_bootstrap_download_impl(url, destfile), - condition = identity - ) - - if (identical(status, 0L)) { - message("OK") - return(destfile) - } - - } - - message("FAILED") - return(FALSE) - - } - - renv_bootstrap_download_tarball <- function(version) { - - # if the user has provided the path to a tarball via - # an environment variable, then use it - tarball <- Sys.getenv("RENV_BOOTSTRAP_TARBALL", unset = NA) - if (is.na(tarball)) - return() - - # allow directories - info <- file.info(tarball, extra_cols = FALSE) - if (identical(info$isdir, TRUE)) { - name <- sprintf("renv_%s.tar.gz", version) - tarball <- file.path(tarball, name) - } - - # bail if it doesn't exist - if (!file.exists(tarball)) { - - # let the user know we weren't able to honour their request - fmt <- "* RENV_BOOTSTRAP_TARBALL is set (%s) but does not exist." - msg <- sprintf(fmt, tarball) - warning(msg) - - # bail - return() - - } - - fmt <- "* Bootstrapping with tarball at path '%s'." - msg <- sprintf(fmt, tarball) - message(msg) - - tarball - - } - - renv_bootstrap_download_github <- function(version) { - - enabled <- Sys.getenv("RENV_BOOTSTRAP_FROM_GITHUB", unset = "TRUE") - if (!identical(enabled, "TRUE")) - return(FALSE) - - # prepare download options - pat <- Sys.getenv("GITHUB_PAT") - if (nzchar(Sys.which("curl")) && nzchar(pat)) { - fmt <- "--location --fail --header \"Authorization: token %s\"" - extra <- sprintf(fmt, pat) - saved <- options("download.file.method", "download.file.extra") - options(download.file.method = "curl", download.file.extra = extra) - on.exit(do.call(base::options, saved), add = TRUE) - } else if (nzchar(Sys.which("wget")) && nzchar(pat)) { - fmt <- "--header=\"Authorization: token %s\"" - extra <- sprintf(fmt, pat) - saved <- options("download.file.method", "download.file.extra") - options(download.file.method = "wget", download.file.extra = extra) - on.exit(do.call(base::options, saved), add = TRUE) - } - - message("* Downloading renv ", version, " from GitHub ... ", appendLF = FALSE) - - url <- file.path("https://api.github.com/repos/rstudio/renv/tarball", version) - name <- sprintf("renv_%s.tar.gz", version) - destfile <- file.path(tempdir(), name) - - status <- tryCatch( - renv_bootstrap_download_impl(url, destfile), - condition = identity - ) - - if (!identical(status, 0L)) { - message("FAILED") - return(FALSE) - } - - message("OK") - return(destfile) - - } - - renv_bootstrap_install <- function(version, tarball, library) { - - # attempt to install it into project library - message("* Installing renv ", version, " ... ", appendLF = FALSE) - dir.create(library, showWarnings = FALSE, recursive = TRUE) - - # invoke using system2 so we can capture and report output - bin <- R.home("bin") - exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R" - r <- file.path(bin, exe) - - args <- c( - "--vanilla", "CMD", "INSTALL", "--no-multiarch", - "-l", shQuote(path.expand(library)), - shQuote(path.expand(tarball)) - ) - - output <- system2(r, args, stdout = TRUE, stderr = TRUE) - message("Done!") - - # check for successful install - status <- attr(output, "status") - if (is.numeric(status) && !identical(status, 0L)) { - header <- "Error installing renv:" - lines <- paste(rep.int("=", nchar(header)), collapse = "") - text <- c(header, lines, output) - writeLines(text, con = stderr()) - } - - status - - } - - renv_bootstrap_platform_prefix <- function() { - - # construct version prefix - version <- paste(R.version$major, R.version$minor, sep = ".") - prefix <- paste("R", numeric_version(version)[1, 1:2], sep = "-") - - # include SVN revision for development versions of R - # (to avoid sharing platform-specific artefacts with released versions of R) - devel <- - identical(R.version[["status"]], "Under development (unstable)") || - identical(R.version[["nickname"]], "Unsuffered Consequences") - - if (devel) - prefix <- paste(prefix, R.version[["svn rev"]], sep = "-r") - - # build list of path components - components <- c(prefix, R.version$platform) - - # include prefix if provided by user - prefix <- renv_bootstrap_platform_prefix_impl() - if (!is.na(prefix) && nzchar(prefix)) - components <- c(prefix, components) - - # build prefix - paste(components, collapse = "/") - - } - - renv_bootstrap_platform_prefix_impl <- function() { - - # if an explicit prefix has been supplied, use it - prefix <- Sys.getenv("RENV_PATHS_PREFIX", unset = NA) - if (!is.na(prefix)) - return(prefix) - - # if the user has requested an automatic prefix, generate it - auto <- Sys.getenv("RENV_PATHS_PREFIX_AUTO", unset = NA) - if (auto %in% c("TRUE", "True", "true", "1")) - return(renv_bootstrap_platform_prefix_auto()) - - # empty string on failure - "" - - } - - renv_bootstrap_platform_prefix_auto <- function() { - - prefix <- tryCatch(renv_bootstrap_platform_os(), error = identity) - if (inherits(prefix, "error") || prefix %in% "unknown") { - - msg <- paste( - "failed to infer current operating system", - "please file a bug report at https://github.com/rstudio/renv/issues", - sep = "; " - ) - - warning(msg) - - } - - prefix - - } - - renv_bootstrap_platform_os <- function() { - - sysinfo <- Sys.info() - sysname <- sysinfo[["sysname"]] - - # handle Windows + macOS up front - if (sysname == "Windows") - return("windows") - else if (sysname == "Darwin") - return("macos") - - # check for os-release files - for (file in c("/etc/os-release", "/usr/lib/os-release")) - if (file.exists(file)) - return(renv_bootstrap_platform_os_via_os_release(file, sysinfo)) - - # check for redhat-release files - if (file.exists("/etc/redhat-release")) - return(renv_bootstrap_platform_os_via_redhat_release()) - - "unknown" - - } - - renv_bootstrap_platform_os_via_os_release <- function(file, sysinfo) { - - # read /etc/os-release - release <- utils::read.table( - file = file, - sep = "=", - quote = c("\"", "'"), - col.names = c("Key", "Value"), - comment.char = "#", - stringsAsFactors = FALSE - ) - - vars <- as.list(release$Value) - names(vars) <- release$Key - - # get os name - os <- tolower(sysinfo[["sysname"]]) - - # read id - id <- "unknown" - for (field in c("ID", "ID_LIKE")) { - if (field %in% names(vars) && nzchar(vars[[field]])) { - id <- vars[[field]] - break - } - } - - # read version - version <- "unknown" - for (field in c("UBUNTU_CODENAME", "VERSION_CODENAME", "VERSION_ID", "BUILD_ID")) { - if (field %in% names(vars) && nzchar(vars[[field]])) { - version <- vars[[field]] - break - } - } - - # join together - paste(c(os, id, version), collapse = "-") - - } - - renv_bootstrap_platform_os_via_redhat_release <- function() { - - # read /etc/redhat-release - contents <- readLines("/etc/redhat-release", warn = FALSE) - - # infer id - id <- if (grepl("centos", contents, ignore.case = TRUE)) - "centos" - else if (grepl("redhat", contents, ignore.case = TRUE)) - "redhat" - else - "unknown" - - # try to find a version component (very hacky) - version <- "unknown" - - parts <- strsplit(contents, "[[:space:]]")[[1L]] - for (part in parts) { - - nv <- tryCatch(numeric_version(part), error = identity) - if (inherits(nv, "error")) - next - - version <- nv[1, 1] - break - - } - - paste(c("linux", id, version), collapse = "-") - - } - - renv_bootstrap_library_root_name <- function(project) { - - # use project name as-is if requested - asis <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT_ASIS", unset = "FALSE") - if (asis) - return(basename(project)) - - # otherwise, disambiguate based on project's path - id <- substring(renv_bootstrap_hash_text(project), 1L, 8L) - paste(basename(project), id, sep = "-") - - } - - renv_bootstrap_library_root <- function(project) { - - prefix <- renv_bootstrap_profile_prefix() - - path <- Sys.getenv("RENV_PATHS_LIBRARY", unset = NA) - if (!is.na(path)) - return(paste(c(path, prefix), collapse = "/")) - - path <- renv_bootstrap_library_root_impl(project) - if (!is.null(path)) { - name <- renv_bootstrap_library_root_name(project) - return(paste(c(path, prefix, name), collapse = "/")) - } - - renv_bootstrap_paths_renv("library", project = project) - - } - - renv_bootstrap_library_root_impl <- function(project) { - - root <- Sys.getenv("RENV_PATHS_LIBRARY_ROOT", unset = NA) - if (!is.na(root)) - return(root) - - type <- renv_bootstrap_project_type(project) - if (identical(type, "package")) { - userdir <- renv_bootstrap_user_dir() - return(file.path(userdir, "library")) - } - - } - - renv_bootstrap_validate_version <- function(version) { - - loadedversion <- utils::packageDescription("renv", fields = "Version") - if (version == loadedversion) - return(TRUE) - - # assume four-component versions are from GitHub; three-component - # versions are from CRAN - components <- strsplit(loadedversion, "[.-]")[[1]] - remote <- if (length(components) == 4L) - paste("rstudio/renv", loadedversion, sep = "@") - else - paste("renv", loadedversion, sep = "@") - - fmt <- paste( - "renv %1$s was loaded from project library, but this project is configured to use renv %2$s.", - "Use `renv::record(\"%3$s\")` to record renv %1$s in the lockfile.", - "Use `renv::restore(packages = \"renv\")` to install renv %2$s into the project library.", - sep = "\n" - ) - - msg <- sprintf(fmt, loadedversion, version, remote) - warning(msg, call. = FALSE) - - FALSE - - } - - renv_bootstrap_hash_text <- function(text) { - - hashfile <- tempfile("renv-hash-") - on.exit(unlink(hashfile), add = TRUE) - - writeLines(text, con = hashfile) - tools::md5sum(hashfile) - - } - - renv_bootstrap_load <- function(project, libpath, version) { - - # try to load renv from the project library - if (!requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) - return(FALSE) - - # warn if the version of renv loaded does not match - renv_bootstrap_validate_version(version) - - # load the project - renv::load(project) - - TRUE - - } - - renv_bootstrap_profile_load <- function(project) { - - # if RENV_PROFILE is already set, just use that - profile <- Sys.getenv("RENV_PROFILE", unset = NA) - if (!is.na(profile) && nzchar(profile)) - return(profile) - - # check for a profile file (nothing to do if it doesn't exist) - path <- renv_bootstrap_paths_renv("profile", profile = FALSE) - if (!file.exists(path)) - return(NULL) - - # read the profile, and set it if it exists - contents <- readLines(path, warn = FALSE) - if (length(contents) == 0L) - return(NULL) - - # set RENV_PROFILE - profile <- contents[[1L]] - if (!profile %in% c("", "default")) - Sys.setenv(RENV_PROFILE = profile) - - profile - - } - - renv_bootstrap_profile_prefix <- function() { - profile <- renv_bootstrap_profile_get() - if (!is.null(profile)) - return(file.path("profiles", profile, "renv")) - } - - renv_bootstrap_profile_get <- function() { - profile <- Sys.getenv("RENV_PROFILE", unset = "") - renv_bootstrap_profile_normalize(profile) - } - - renv_bootstrap_profile_set <- function(profile) { - profile <- renv_bootstrap_profile_normalize(profile) - if (is.null(profile)) - Sys.unsetenv("RENV_PROFILE") - else - Sys.setenv(RENV_PROFILE = profile) - } - - renv_bootstrap_profile_normalize <- function(profile) { - - if (is.null(profile) || profile %in% c("", "default")) - return(NULL) - - profile - - } - - renv_bootstrap_path_absolute <- function(path) { - - substr(path, 1L, 1L) %in% c("~", "/", "\\") || ( - substr(path, 1L, 1L) %in% c(letters, LETTERS) && - substr(path, 2L, 3L) %in% c(":/", ":\\") - ) - - } - - renv_bootstrap_paths_renv <- function(..., profile = TRUE, project = NULL) { - renv <- Sys.getenv("RENV_PATHS_RENV", unset = "renv") - root <- if (renv_bootstrap_path_absolute(renv)) NULL else project - prefix <- if (profile) renv_bootstrap_profile_prefix() - components <- c(root, renv, prefix, ...) - paste(components, collapse = "/") - } - - renv_bootstrap_project_type <- function(path) { - - descpath <- file.path(path, "DESCRIPTION") - if (!file.exists(descpath)) - return("unknown") - - desc <- tryCatch( - read.dcf(descpath, all = TRUE), - error = identity - ) - - if (inherits(desc, "error")) - return("unknown") - - type <- desc$Type - if (!is.null(type)) - return(tolower(type)) - - package <- desc$Package - if (!is.null(package)) - return("package") - - "unknown" - - } - - renv_bootstrap_user_dir <- function() { - dir <- renv_bootstrap_user_dir_impl() - path.expand(chartr("\\", "/", dir)) - } - - renv_bootstrap_user_dir_impl <- function() { - - # use local override if set - override <- getOption("renv.userdir.override") - if (!is.null(override)) - return(override) - - # use R_user_dir if available - tools <- asNamespace("tools") - if (is.function(tools$R_user_dir)) - return(tools$R_user_dir("renv", "cache")) - - # try using our own backfill for older versions of R - envvars <- c("R_USER_CACHE_DIR", "XDG_CACHE_HOME") - for (envvar in envvars) { - root <- Sys.getenv(envvar, unset = NA) - if (!is.na(root)) - return(file.path(root, "R/renv")) - } - - # use platform-specific default fallbacks - if (Sys.info()[["sysname"]] == "Windows") - file.path(Sys.getenv("LOCALAPPDATA"), "R/cache/R/renv") - else if (Sys.info()[["sysname"]] == "Darwin") - "~/Library/Caches/org.R-project.R/R/renv" - else - "~/.cache/R/renv" - - } - - - renv_json_read <- function(file = NULL, text = NULL) { - - text <- paste(text %||% read(file), collapse = "\n") - - # find strings in the JSON - pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' - locs <- gregexpr(pattern, text, perl = TRUE)[[1]] - - # if any are found, replace them with placeholders - replaced <- text - strings <- character() - replacements <- character() - - if (!identical(c(locs), -1L)) { - - # get the string values - starts <- locs - ends <- locs + attr(locs, "match.length") - 1L - strings <- substring(text, starts, ends) - - # only keep those requiring escaping - strings <- grep("[[\\]{}:]", strings, perl = TRUE, value = TRUE) - - # compute replacements - replacements <- sprintf('"\032%i\032"', seq_along(strings)) - - # replace the strings - mapply(function(string, replacement) { - replaced <<- sub(string, replacement, replaced, fixed = TRUE) - }, strings, replacements) - - } - - # transform the JSON into something the R parser understands - transformed <- replaced - transformed <- gsub("[[{]", "list(", transformed) - transformed <- gsub("[]}]", ")", transformed) - transformed <- gsub(":", "=", transformed, fixed = TRUE) - text <- paste(transformed, collapse = "\n") - - # parse it - json <- parse(text = text, keep.source = FALSE, srcfile = NULL)[[1L]] - - # construct map between source strings, replaced strings - map <- as.character(parse(text = strings)) - names(map) <- as.character(parse(text = replacements)) - - # convert to list - map <- as.list(map) - - # remap strings in object - remapped <- renv_json_remap(json, map) - - # evaluate - eval(remapped, envir = baseenv()) - - } - - renv_json_remap <- function(json, map) { - - # fix names - if (!is.null(names(json))) { - lhs <- match(names(json), names(map), nomatch = 0L) - rhs <- match(names(map), names(json), nomatch = 0L) - names(json)[rhs] <- map[lhs] - } - - # fix values - if (is.character(json)) - return(map[[json]] %||% json) - - # handle true, false, null - if (is.name(json)) { - text <- as.character(json) - if (text == "true") - return(TRUE) - else if (text == "false") - return(FALSE) - else if (text == "null") - return(NULL) - } - - # recurse - if (is.recursive(json)) { - for (i in seq_along(json)) { - json[i] <- list(renv_json_remap(json[[i]], map)) - } - } - - json - - } - - # load the renv profile, if any - renv_bootstrap_profile_load(project) - - # construct path to library root - root <- renv_bootstrap_library_root(project) - - # construct library prefix for platform - prefix <- renv_bootstrap_platform_prefix() - - # construct full libpath - libpath <- file.path(root, prefix) - - # attempt to load - if (renv_bootstrap_load(project, libpath, version)) - return(TRUE) - - # load failed; inform user we're about to bootstrap - prefix <- paste("# Bootstrapping renv", version) - postfix <- paste(rep.int("-", 77L - nchar(prefix)), collapse = "") - header <- paste(prefix, postfix) - message(header) - - # perform bootstrap - bootstrap(version, libpath) - - # exit early if we're just testing bootstrap - if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) - return(TRUE) - - # try again to load - if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { - message("* Successfully installed and loaded renv ", version, ".") - return(renv::load()) - } - - # failed to download or load renv; warn the user - msg <- c( - "Failed to find an renv installation: the project will not be loaded.", - "Use `renv::activate()` to re-initialize the project." - ) - - warning(paste(msg, collapse = "\n"), call. = FALSE) - -}) diff --git a/Tools/flatpak/setup-rpkgs/setup-rpkgs.Rproj b/Tools/flatpak/setup-rpkgs/setup-rpkgs.Rproj deleted file mode 100644 index e83436a3e9..0000000000 --- a/Tools/flatpak/setup-rpkgs/setup-rpkgs.Rproj +++ /dev/null @@ -1,16 +0,0 @@ -Version: 1.0 - -RestoreWorkspace: Default -SaveWorkspace: Default -AlwaysSaveHistory: Default - -EnableCodeIndexing: Yes -UseSpacesForTab: Yes -NumSpacesForTab: 2 -Encoding: UTF-8 - -RnwWeave: Sweave -LaTeX: pdfLaTeX - -AutoAppendNewline: Yes -StripTrailingWhitespace: Yes diff --git a/Tools/windows/BuildBotScript.cmd b/Tools/windows/BuildBotScript.cmd index 78d1d374e8..ccab8ca44c 100644 --- a/Tools/windows/BuildBotScript.cmd +++ b/Tools/windows/BuildBotScript.cmd @@ -31,8 +31,6 @@ cmake -S . -B build -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=D:/Qt cmake --build build --target all -cmake --build build --target windowsPreInstallHacks - cmake --build build --target install cmake --build build --target collect-junctions diff --git a/Tools/windows/CollectJunctions.cmd.in b/Tools/windows/CollectJunctions.cmd.in index 86ba3a0e9a..91fedda8cb 100644 --- a/Tools/windows/CollectJunctions.cmd.in +++ b/Tools/windows/CollectJunctions.cmd.in @@ -10,6 +10,8 @@ call "@VC_VARS_PATH_NATIVE@\vcvars64.bat" set PATH=@RINSIDE_PATH_NATIVE@\libs\x64;@RCPP_PATH_NATIVE@\libs\x64;@R_BIN_PATH_NATIVE@\x64;%QTVCDIR%;%PATH% set R_HOME=@R_HOME_PATH_NATIVE@ set JASPENGINE_LOCATION=@JASP_BINARY_DIR_NATIVE@\JASPEngine.exe +set R_LIBS=@JASP_BINARY_DIR_NATIVE@\Modules\Tools\junction_bootstrap_library;@R_HOME_PATH_NATIVE@\library + rem ---------------------- Collecting Junctions ------------------ diff --git a/Tools/windows/RecreateJunctions.cmd.in b/Tools/windows/RecreateJunctions.cmd.in index 8b70999c46..0c6505b71e 100644 --- a/Tools/windows/RecreateJunctions.cmd.in +++ b/Tools/windows/RecreateJunctions.cmd.in @@ -10,6 +10,7 @@ call "@VC_VARS_PATH_NATIVE@\vcvars64.bat" set PATH=@RINSIDE_PATH_NATIVE@\libs\x64;@RCPP_PATH_NATIVE@\libs\x64;@R_BIN_PATH_NATIVE@\x64;%QTVCDIR%;%PATH% set R_HOME=@R_HOME_PATH_NATIVE@ set JASPENGINE_LOCATION=@JASP_BINARY_DIR_NATIVE@\JASPEngine.exe +set R_LIBS=@JASP_BINARY_DIR_NATIVE@\Modules\Tools\junction_bootstrap_library;@R_HOME_PATH_NATIVE@\library rem ---------------------- Collecting Junctions ------------------ diff --git a/Tools/windows/RecursiveJunctionRemover.cmd.in b/Tools/windows/RecursiveJunctionRemover.cmd.in new file mode 100644 index 0000000000..5668d4ec2c --- /dev/null +++ b/Tools/windows/RecursiveJunctionRemover.cmd.in @@ -0,0 +1,2 @@ +rem Need to remove junctions from Modules/Tools +FOR /f "tokens=*" %%a in ('dir /AL /S /B @JASP_BINARY_DIR_NATIVE@\Install\Modules\Tools\') DO del /Q %%a \ No newline at end of file diff --git a/Tools/windows/windowsPreInstallHacks.cmd.in b/Tools/windows/windowsPreInstallHacks.cmd.in deleted file mode 100644 index 88eb69514f..0000000000 --- a/Tools/windows/windowsPreInstallHacks.cmd.in +++ /dev/null @@ -1,17 +0,0 @@ -rem This file is generated from Tools/windows/windowsPostInstallHacks.cmd.in, if you want to change it, -rem be aware that it will be overwritten. You can edit the template file, and rerun the CMake -rem to see your changes here. -rem -rem You don't need to run this file manually, you can ask CMake to run it for you using -rem `cmake --build . --target windowsPostInstallHacks` - - -rem -------- Temporary fix to transfer modules to cache -------- - -echo Transfering module folders to renv-cache (we should get rid of this in the future) - -pushd . -cd @JASP_BINARY_DIR_NATIVE@\Modules\ -mkdir renv-cache\tmpSolution -For /D %%G IN (jasp*) do ( move /Y %%G\%%G renv-cache\tmpSolution\%%G && mklink /J %%G\%%G renv-cache\tmpSolution\%%G ) -popd From 180557666c2b936aa691fd0d56dfd11e7c751176 Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Sat, 20 Jul 2024 04:54:02 +0200 Subject: [PATCH 02/70] Translations update from Hosted Weblate (#5621) * Translated using Weblate (Spanish) Currently translated at 100.0% (1108 of 1108 strings) Translation: JASP/jaspDesktop Translate-URL: https://hosted.weblate.org/projects/jasp/jaspdesktop/es/ * Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (1108 of 1108 strings) Translation: JASP/jaspDesktop Translate-URL: https://hosted.weblate.org/projects/jasp/jaspdesktop/zh_Hans/ * Translated using Weblate (Galician) Currently translated at 100.0% (1108 of 1108 strings) Translation: JASP/jaspDesktop Translate-URL: https://hosted.weblate.org/projects/jasp/jaspdesktop/gl/ * Translated using Weblate (German) Currently translated at 98.9% (1096 of 1108 strings) Translation: JASP/jaspDesktop Translate-URL: https://hosted.weblate.org/projects/jasp/jaspdesktop/de/ * Translated using Weblate (Turkish) Currently translated at 7.9% (88 of 1108 strings) Translation: JASP/jaspDesktop Translate-URL: https://hosted.weblate.org/projects/jasp/jaspdesktop/tr/ --------- Co-authored-by: ecadrian Co-authored-by: Shun Wang Co-authored-by: Johannes Keyser Co-authored-by: blomusti --- Desktop/po/jaspDesktop-de.po | 25 ++++++++++++++++++++----- Desktop/po/jaspDesktop-es.po | 23 +++++++++++++++++++---- Desktop/po/jaspDesktop-gl.po | 23 +++++++++++++++++++---- Desktop/po/jaspDesktop-tr.po | 8 +++++++- Desktop/po/jaspDesktop-zh_Hans.po | 19 ++++++++++++++----- 5 files changed, 79 insertions(+), 19 deletions(-) diff --git a/Desktop/po/jaspDesktop-de.po b/Desktop/po/jaspDesktop-de.po index 27aec0c3d7..eb486cdb56 100644 --- a/Desktop/po/jaspDesktop-de.po +++ b/Desktop/po/jaspDesktop-de.po @@ -1,9 +1,15 @@ msgid "" msgstr "" +"PO-Revision-Date: 2024-07-14 15:09+0000\n" +"Last-Translator: Johannes Keyser \n" +"Language-Team: German \n" +"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.7-dev\n" "X-Language: en_US\n" "X-Source-Language: American English\n" "X-Qt-Contexts: true\n" @@ -5454,7 +5460,6 @@ msgctxt "ListModelTermsAssigned|" msgid "Only %1 variables are allowed" msgstr "Nur %1 Variablen sind erlaubt" -#, fuzzy msgctxt "VariableInfo|" msgid "Scale" msgstr "Metrisch" @@ -5473,11 +5478,11 @@ msgstr "Unbekannt" msgctxt "ColumnBasicInfo|" msgid "" -msgstr "" +msgstr "" msgctxt "PrefsData|" msgid "Maximum allowed levels for scale when used as nominal/ordinal" -msgstr "" +msgstr "Maximal erlaubte Stufen für Metrisch bei Verwendung als Nominal/Ordinal" msgctxt "PrefsData|" msgid "" @@ -5485,11 +5490,14 @@ msgid "" "scale variable is used, JASP checks whether the number of levels of this " "variable exceeds this maximum." msgstr "" +"Bei Analysen, die nur nominale oder ordinale Variablen akzeptieren, prüft " +"JASP bei Verwendung einer metrischen Variablen, ob die Stufenanzahl dieser " +"Variablen dieses Maximum überschreitet." #, qt-format msgctxt "VariablesListBase|" msgid "Maximum number of levels is %1. Variable %2 has %3 levels." -msgstr "" +msgstr "Maximale Anzahl von Stufen ist %1. Die Variable %2 hat %3 Stufen." #, qt-format msgctxt "VariablesListBase|" @@ -5499,6 +5507,11 @@ msgid "" "either change its type, or change 'Maximum allowed levels for scale' in " "Preferences / Data menu" msgstr "" +"Es wurde versucht, die metrische Variable %1 in eine %2-Variable " +"umzuwandeln, aber die Anzahl der Stufen %3 überschreitet das Maximum %4. " +"Wenn Sie diese Variable dennoch verwenden möchten, ändern Sie entweder ihren " +"Typ oder ändern Sie die \"Maximal zulässigen Stufen für Metrisch\" im Menü " +"Einstellungen / Daten" #, qt-format msgctxt "VariablesListBase|" @@ -5506,3 +5519,5 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" +"Die minimale Anzahl von numerischen Werten ist %1. Variable %2 hat nur %3 " +"verschiedene numerische Werte" diff --git a/Desktop/po/jaspDesktop-es.po b/Desktop/po/jaspDesktop-es.po index 2d3b4e8d92..c55cc4a239 100644 --- a/Desktop/po/jaspDesktop-es.po +++ b/Desktop/po/jaspDesktop-es.po @@ -1,9 +1,15 @@ msgid "" msgstr "" +"PO-Revision-Date: 2024-07-13 08:13+0000\n" +"Last-Translator: ecadrian \n" +"Language-Team: Spanish \n" +"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.7-dev\n" "X-Language: es\n" "X-Source-Language: American English\n" "X-Qt-Contexts: true\n" @@ -5478,11 +5484,11 @@ msgstr "Desconocido" msgctxt "ColumnBasicInfo|" msgid "" -msgstr "" +msgstr "" msgctxt "PrefsData|" msgid "Maximum allowed levels for scale when used as nominal/ordinal" -msgstr "" +msgstr "Niveles de escala máximos permitidos cuando se usa como nominal/ordinal" msgctxt "PrefsData|" msgid "" @@ -5490,11 +5496,14 @@ msgid "" "scale variable is used, JASP checks whether the number of levels of this " "variable exceeds this maximum." msgstr "" +"Para los análisis que admiten solo que algunas variables sean nominales u " +"ordinales, cuando se usa una variable de escala, JASP comprueba si el número " +"de niveles de esta variable excede este máximo." #, qt-format msgctxt "VariablesListBase|" msgid "Maximum number of levels is %1. Variable %2 has %3 levels." -msgstr "" +msgstr "El número máximo de niveles es %1. La variable %2 tiene %3 niveles." #, qt-format msgctxt "VariablesListBase|" @@ -5504,6 +5513,10 @@ msgid "" "either change its type, or change 'Maximum allowed levels for scale' in " "Preferences / Data menu" msgstr "" +"Intenta transformar la variable de escala %1 en la variable %2, pero su " +"número de niveles %3 excede el máximo %4. Si todavía desea utilizar esta " +"variable, modifique su tipo o cambie 'Niveles de escala máximos permitidos' " +"en el menú de Preferencias/Datos" #, qt-format msgctxt "VariablesListBase|" @@ -5511,3 +5524,5 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" +"El número mínimo de valores numéricos es %1. La variable %2 tiene solo %3 " +"valores numéricos diferentes" diff --git a/Desktop/po/jaspDesktop-gl.po b/Desktop/po/jaspDesktop-gl.po index 72884ba7de..ca4483eaa8 100644 --- a/Desktop/po/jaspDesktop-gl.po +++ b/Desktop/po/jaspDesktop-gl.po @@ -1,9 +1,15 @@ msgid "" msgstr "" +"PO-Revision-Date: 2024-07-13 08:13+0000\n" +"Last-Translator: ecadrian \n" +"Language-Team: Galician \n" +"Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.7-dev\n" "X-Language: gl_ES\n" "X-Source-Language: C\n" "X-Qt-Contexts: true\n" @@ -5452,11 +5458,11 @@ msgstr "Descoñecido" msgctxt "ColumnBasicInfo|" msgid "" -msgstr "" +msgstr "" msgctxt "PrefsData|" msgid "Maximum allowed levels for scale when used as nominal/ordinal" -msgstr "" +msgstr "Niveis de escala máximos permitidos cando se usa como nominal/ordinal" msgctxt "PrefsData|" msgid "" @@ -5464,11 +5470,14 @@ msgid "" "scale variable is used, JASP checks whether the number of levels of this " "variable exceeds this maximum." msgstr "" +"Para as análises que admiten só que algunhas variables sexan nominais ou " +"ordinais, cando se usa unha variable de escala, JASP comproba se o número de " +"niveis desta variable excede este máximo." #, qt-format msgctxt "VariablesListBase|" msgid "Maximum number of levels is %1. Variable %2 has %3 levels." -msgstr "" +msgstr "O número máximo de niveis é %1. A variable %2 ten %3 niveis." #, qt-format msgctxt "VariablesListBase|" @@ -5478,6 +5487,10 @@ msgid "" "either change its type, or change 'Maximum allowed levels for scale' in " "Preferences / Data menu" msgstr "" +"Intentas transformar a variable de escala %1 na variable %2, pero o seu " +"número de niveis %3 excede o máximo %4. Se aínda queres utilizar esta " +"variable, ben troca o seu tipo, ou ben troca 'Niveis de escala máximos " +"permitidos' no menú de Preferencias/Datos" #, qt-format msgctxt "VariablesListBase|" @@ -5485,3 +5498,5 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" +"O número mínimo de valores numéricos é %1. A variable %2 ten só %3 valores " +"numéricos diferentes" diff --git a/Desktop/po/jaspDesktop-tr.po b/Desktop/po/jaspDesktop-tr.po index 2e5278b48a..5eb3471975 100644 --- a/Desktop/po/jaspDesktop-tr.po +++ b/Desktop/po/jaspDesktop-tr.po @@ -1,9 +1,15 @@ msgid "" msgstr "" +"PO-Revision-Date: 2024-07-20 02:53+0000\n" +"Last-Translator: blomusti \n" +"Language-Team: Turkish \n" +"Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.7-dev\n" "X-Language: tr\n" "X-Qt-Contexts: true\n" @@ -29,7 +35,7 @@ msgstr "Kaydedilecek dosyayı seçin" msgctxt "FileSelector|" msgid "Select file to load" -msgstr "" +msgstr "Yüklemek için dosya seçiniz" msgctxt "FileSelector|" msgid "Browse" diff --git a/Desktop/po/jaspDesktop-zh_Hans.po b/Desktop/po/jaspDesktop-zh_Hans.po index 281922f7c9..2f195345fa 100644 --- a/Desktop/po/jaspDesktop-zh_Hans.po +++ b/Desktop/po/jaspDesktop-zh_Hans.po @@ -1,9 +1,15 @@ msgid "" msgstr "" +"PO-Revision-Date: 2024-07-13 08:13+0000\n" +"Last-Translator: Shun Wang \n" +"Language-Team: Chinese (Simplified) \n" +"Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.7-dev\n" "X-Language: zh_Hans\n" "X-Qt-Contexts: true\n" @@ -5235,23 +5241,24 @@ msgstr "未知" msgctxt "ColumnBasicInfo|" msgid "" -msgstr "" +msgstr "<首先填写列名称>" msgctxt "PrefsData|" msgid "Maximum allowed levels for scale when used as nominal/ordinal" -msgstr "" +msgstr "当连续型变量被用作名义/有序类型时允许的最大水平" msgctxt "PrefsData|" msgid "" "For analysis accepting only nominal or ordinal for some variables, if a " "scale variable is used, JASP checks whether the number of levels of this " "variable exceeds this maximum." -msgstr "" +msgstr "对于某些变量仅接受名义或有序的分析,如果使用了连续变量,JASP " +"会检查该变量的水平数是否超出此最大值。" #, qt-format msgctxt "VariablesListBase|" msgid "Maximum number of levels is %1. Variable %2 has %3 levels." -msgstr "" +msgstr "最大水平数仅允许 %1。变量 %2 有 %3 个水平。" #, qt-format msgctxt "VariablesListBase|" @@ -5261,10 +5268,12 @@ msgid "" "either change its type, or change 'Maximum allowed levels for scale' in " "Preferences / Data menu" msgstr "" +"尝试将连续变量 %1 转换为 %2 变量,但其水平数 %3 超出最大值 %4。如果您仍想使用" +"此变量,请更改其度量类型,或在“首选项/数据”菜单中更改“连续变量允许的最大水平”" #, qt-format msgctxt "VariablesListBase|" msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" -msgstr "" +msgstr "数值的最小数量为 %1。变量 %2 仅有 %3 个不同的数值" From f9ff03c7033f153949d444a6804dd74aa69a83da Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 20 Jul 2024 02:57:25 +0000 Subject: [PATCH 03/70] updated translation files --- Desktop/po/jaspDesktop-de.po | 11 +++-------- Desktop/po/jaspDesktop-es.po | 11 +++-------- Desktop/po/jaspDesktop-gl.po | 8 +------- Desktop/po/jaspDesktop-tr.po | 6 ------ Desktop/po/jaspDesktop-zh_Hans.po | 11 +++-------- Resources/Translations/jaspDesktop-de.qm | Bin 176872 -> 179337 bytes Resources/Translations/jaspDesktop-es.qm | Bin 177231 -> 179614 bytes Resources/Translations/jaspDesktop-gl.qm | Bin 174040 -> 176369 bytes Resources/Translations/jaspDesktop-tr.qm | Bin 14839 -> 14953 bytes Resources/Translations/jaspDesktop-zh_Hans.qm | Bin 113915 -> 115290 bytes 10 files changed, 10 insertions(+), 37 deletions(-) diff --git a/Desktop/po/jaspDesktop-de.po b/Desktop/po/jaspDesktop-de.po index eb486cdb56..dca414bb63 100644 --- a/Desktop/po/jaspDesktop-de.po +++ b/Desktop/po/jaspDesktop-de.po @@ -1,15 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-07-14 15:09+0000\n" -"Last-Translator: Johannes Keyser \n" -"Language-Team: German \n" -"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Language: en_US\n" "X-Source-Language: American English\n" "X-Qt-Contexts: true\n" @@ -5482,7 +5476,8 @@ msgstr "" msgctxt "PrefsData|" msgid "Maximum allowed levels for scale when used as nominal/ordinal" -msgstr "Maximal erlaubte Stufen für Metrisch bei Verwendung als Nominal/Ordinal" +msgstr "" +"Maximal erlaubte Stufen für Metrisch bei Verwendung als Nominal/Ordinal" msgctxt "PrefsData|" msgid "" diff --git a/Desktop/po/jaspDesktop-es.po b/Desktop/po/jaspDesktop-es.po index c55cc4a239..b5f67fd809 100644 --- a/Desktop/po/jaspDesktop-es.po +++ b/Desktop/po/jaspDesktop-es.po @@ -1,15 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-07-13 08:13+0000\n" -"Last-Translator: ecadrian \n" -"Language-Team: Spanish \n" -"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Language: es\n" "X-Source-Language: American English\n" "X-Qt-Contexts: true\n" @@ -5488,7 +5482,8 @@ msgstr "" msgctxt "PrefsData|" msgid "Maximum allowed levels for scale when used as nominal/ordinal" -msgstr "Niveles de escala máximos permitidos cuando se usa como nominal/ordinal" +msgstr "" +"Niveles de escala máximos permitidos cuando se usa como nominal/ordinal" msgctxt "PrefsData|" msgid "" diff --git a/Desktop/po/jaspDesktop-gl.po b/Desktop/po/jaspDesktop-gl.po index ca4483eaa8..b49825ad7d 100644 --- a/Desktop/po/jaspDesktop-gl.po +++ b/Desktop/po/jaspDesktop-gl.po @@ -1,15 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-07-13 08:13+0000\n" -"Last-Translator: ecadrian \n" -"Language-Team: Galician \n" -"Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Language: gl_ES\n" "X-Source-Language: C\n" "X-Qt-Contexts: true\n" diff --git a/Desktop/po/jaspDesktop-tr.po b/Desktop/po/jaspDesktop-tr.po index 5eb3471975..74d1fd00d6 100644 --- a/Desktop/po/jaspDesktop-tr.po +++ b/Desktop/po/jaspDesktop-tr.po @@ -1,15 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-07-20 02:53+0000\n" -"Last-Translator: blomusti \n" -"Language-Team: Turkish \n" -"Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.7-dev\n" "X-Language: tr\n" "X-Qt-Contexts: true\n" diff --git a/Desktop/po/jaspDesktop-zh_Hans.po b/Desktop/po/jaspDesktop-zh_Hans.po index 2f195345fa..ab8f097b4c 100644 --- a/Desktop/po/jaspDesktop-zh_Hans.po +++ b/Desktop/po/jaspDesktop-zh_Hans.po @@ -1,15 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-07-13 08:13+0000\n" -"Last-Translator: Shun Wang \n" -"Language-Team: Chinese (Simplified) \n" -"Language: zh_Hans\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 5.7-dev\n" "X-Language: zh_Hans\n" "X-Qt-Contexts: true\n" @@ -5252,8 +5246,9 @@ msgid "" "For analysis accepting only nominal or ordinal for some variables, if a " "scale variable is used, JASP checks whether the number of levels of this " "variable exceeds this maximum." -msgstr "对于某些变量仅接受名义或有序的分析,如果使用了连续变量,JASP " -"会检查该变量的水平数是否超出此最大值。" +msgstr "" +"对于某些变量仅接受名义或有序的分析,如果使用了连续变量,JASP 会检查该变量的水" +"平数是否超出此最大值。" #, qt-format msgctxt "VariablesListBase|" diff --git a/Resources/Translations/jaspDesktop-de.qm b/Resources/Translations/jaspDesktop-de.qm index b8ece414034f731a4b8d7f97a333a4eac56f9367..c37193b1b44d68adfc9726a754a43cdbac161b81 100644 GIT binary patch delta 10518 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%0Dp}?9@dwdW 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 delta 8938 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 diff --git a/Resources/Translations/jaspDesktop-tr.qm b/Resources/Translations/jaspDesktop-tr.qm index 481bf2e5650bd58ab0b1f230973ab22a97f3883a..8837fe70c1a76ec6eebc6247b1057dbb15bf6e49 100644 GIT binary patch delta 665 zcmXAmUr3W-6vm(T+xGR%efVz`ICX7vx@K<6+9p!D1w{k}f!QC)$hjG#;Uc}LA+9c3 zcp)Y;P|B<%6v0u=C~9aIhEk9>N+6|Kfk?7SGmU6;x<}#rp zPaC$o;M_L@U=F7e-9X-7R1Y)*<}P^JegL_j;V;j~ zwsKBWbrHyqb3t7YD4pPfNhOf=n;Xq`1C}A~yQ?3NH^`#r-Q6~YekYAX^A#7Th{od6KM;i|GY$dB${BR z!^^_pm#^gRap4VXp_$Kx`4@%2&TB&Qwh`F9BrMO+F2|tKbckjb29%W{FNx=sk>QW@ zUsv`T?^569XbI;!J*9H=o(0lYRUHWvu&YPa_d%p=UP{awR>dn7BynCWdbE*&U9_dh z3Wr{-m|O-*=ES3;BY^Fhc&_&oSq6#Df6+0{YBM|1i{EJhbxnHpWEVv@E75AsczcWt z&|l72U3^T5Mf^aSJFb`Y6fkFWk0syfMG%d+f?DW^J}khG2C9&-v4y8nSNa0Jx+Yz{ XKj70f1$BX7tv8x!+8Q4zDp&sp%~!hH delta 592 zcmXAmYeq2w{|{>XF4DwA+J5mXWaog& zIBz|$nH0_Qp{`j#vYy``d`5>j_+EbwSi3CN!^Y?LBw7GPUKveWsOnOVyjD>rk3?$5m8nJX9L_aUYU>Llpbe>;r-vxAS&{Zk$<%f-VD+hz{M;Q% TD$-85zDiX~u2iOKEI#c&T_vVE diff --git a/Resources/Translations/jaspDesktop-zh_Hans.qm b/Resources/Translations/jaspDesktop-zh_Hans.qm index 8de387792f50daaacc84f090d7293950bc40603e..b4730ff7a03e47f21bc84b811d292c607fce6e8a 100644 GIT binary patch delta 9996 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 delta 8918 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 Date: Mon, 22 Jul 2024 17:52:11 +0200 Subject: [PATCH 04/70] fix Results crash upon encountering a string var in a number type column (#5587) --- Desktop/html/js/utils.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Desktop/html/js/utils.js b/Desktop/html/js/utils.js index 5669de5b02..9f64ccea2a 100644 --- a/Desktop/html/js/utils.js +++ b/Desktop/html/js/utils.js @@ -99,6 +99,18 @@ function formatColumn(column, type, format, alignNumbers, combine, modelFootnote log10 = true; } + for (var rowNo = 0; rowNo < column.length; rowNo++) { + var cell = column[rowNo] + var content = cell.content + + if (typeof(content) !== "number" || typeof(content) !== "Number") { + if (isNaN(parseFloat(content))) // isn't a number + continue + console.warn("You are delivering a result that should be a number as a string, We will do our best :("); + cell.content = content = parseFloat(content) + } + } + if (isFinite(sf)) { var upperLimit = 1e6 From 14b4e60bdcf59b4ca65f8e8db27245de75201a19 Mon Sep 17 00:00:00 2001 From: RensDofferhoff <20978635+RensDofferhoff@users.noreply.github.com> Date: Fri, 26 Jul 2024 21:15:15 +0200 Subject: [PATCH 05/70] Update submodules (#5632) --- Modules/jaspAcceptanceSampling | 2 +- Modules/jaspAnova | 2 +- Modules/jaspAudit | 2 +- Modules/jaspBain | 2 +- Modules/jaspBsts | 2 +- Modules/jaspCircular | 2 +- Modules/jaspCochrane | 2 +- Modules/jaspDescriptives | 2 +- Modules/jaspDistributions | 2 +- Modules/jaspEquivalenceTTests | 2 +- Modules/jaspFactor | 2 +- Modules/jaspFrequencies | 2 +- Modules/jaspJags | 2 +- Modules/jaspLearnBayes | 2 +- Modules/jaspLearnStats | 2 +- Modules/jaspMachineLearning | 2 +- Modules/jaspMetaAnalysis | 2 +- Modules/jaspMixedModels | 2 +- Modules/jaspNetwork | 2 +- Modules/jaspPower | 2 +- Modules/jaspPredictiveAnalytics | 2 +- Modules/jaspProcess | 2 +- Modules/jaspProphet | 2 +- Modules/jaspQualityControl | 2 +- Modules/jaspRegression | 2 +- Modules/jaspReliability | 2 +- Modules/jaspRobustTTests | 2 +- Modules/jaspSem | 2 +- Modules/jaspSummaryStatistics | 2 +- Modules/jaspSurvival | 2 +- Modules/jaspTTests | 2 +- Modules/jaspTestModule | 2 +- Modules/jaspTimeSeries | 2 +- Modules/jaspVisualModeling | 2 +- 34 files changed, 34 insertions(+), 34 deletions(-) diff --git a/Modules/jaspAcceptanceSampling b/Modules/jaspAcceptanceSampling index cda8476b35..dc1813419a 160000 --- a/Modules/jaspAcceptanceSampling +++ b/Modules/jaspAcceptanceSampling @@ -1 +1 @@ -Subproject commit cda8476b35c28db78cc02e56e339f8874ae69bc4 +Subproject commit dc1813419a129df1f87c18360282e8a0351fbc24 diff --git a/Modules/jaspAnova b/Modules/jaspAnova index 96e8235c67..6d9c6ba191 160000 --- a/Modules/jaspAnova +++ b/Modules/jaspAnova @@ -1 +1 @@ -Subproject commit 96e8235c67781a854afd1f23ce73fc0c10e41762 +Subproject commit 6d9c6ba1918637ce8246ce2ef92ad53f3ad4fc39 diff --git a/Modules/jaspAudit b/Modules/jaspAudit index c980d5adb4..5991074685 160000 --- a/Modules/jaspAudit +++ b/Modules/jaspAudit @@ -1 +1 @@ -Subproject commit c980d5adb46367c9020ca28d3a5d95e0e78c23f3 +Subproject commit 59910746852ce3ac3376e9d437b15d37ee90c434 diff --git a/Modules/jaspBain b/Modules/jaspBain index eef1ef2ea2..89b3be1ce9 160000 --- a/Modules/jaspBain +++ b/Modules/jaspBain @@ -1 +1 @@ -Subproject commit eef1ef2ea219ef453ce3cb3ee6f9c4309aa1fb1d +Subproject commit 89b3be1ce9bca2238b348cdeea8b063d93465e01 diff --git a/Modules/jaspBsts b/Modules/jaspBsts index d3ff6ab115..474d05b36c 160000 --- a/Modules/jaspBsts +++ b/Modules/jaspBsts @@ -1 +1 @@ -Subproject commit d3ff6ab115581dfeebb30ea6f8bdc1a8453f7029 +Subproject commit 474d05b36c36323a5999458e7a73ad2f0e48c244 diff --git a/Modules/jaspCircular b/Modules/jaspCircular index b57a87586d..874c3f54ed 160000 --- a/Modules/jaspCircular +++ b/Modules/jaspCircular @@ -1 +1 @@ -Subproject commit b57a87586df033d59a178bff74820b186e2e9c15 +Subproject commit 874c3f54ed301196f155eb8d6c6c470c3cd68a84 diff --git a/Modules/jaspCochrane b/Modules/jaspCochrane index 54b9d3c22f..cc0c017a55 160000 --- a/Modules/jaspCochrane +++ b/Modules/jaspCochrane @@ -1 +1 @@ -Subproject commit 54b9d3c22fba2a45a08cd791930ef3fc446b7194 +Subproject commit cc0c017a5550bfe105e1219fadd6dcbcef92baa0 diff --git a/Modules/jaspDescriptives b/Modules/jaspDescriptives index 9e46068a01..9a802fd6d6 160000 --- a/Modules/jaspDescriptives +++ b/Modules/jaspDescriptives @@ -1 +1 @@ -Subproject commit 9e46068a0120ca877a15e1f062d62b3a64bc87a2 +Subproject commit 9a802fd6d6936e724abc3f8c91780439f284d6dc diff --git a/Modules/jaspDistributions b/Modules/jaspDistributions index 25c76fc2da..2dd5a7cd94 160000 --- a/Modules/jaspDistributions +++ b/Modules/jaspDistributions @@ -1 +1 @@ -Subproject commit 25c76fc2da9c1461ebaa399bb1e93ee8b7f14890 +Subproject commit 2dd5a7cd9453150ad0e247f19c31e2a74191d006 diff --git a/Modules/jaspEquivalenceTTests b/Modules/jaspEquivalenceTTests index 0342474c5a..abf905da1a 160000 --- a/Modules/jaspEquivalenceTTests +++ b/Modules/jaspEquivalenceTTests @@ -1 +1 @@ -Subproject commit 0342474c5a7dcee453b54d0d19a9a2e7912e9b13 +Subproject commit abf905da1ac8347a4e484750ba796390d8cd3b83 diff --git a/Modules/jaspFactor b/Modules/jaspFactor index dd08b70d9e..824c2388a7 160000 --- a/Modules/jaspFactor +++ b/Modules/jaspFactor @@ -1 +1 @@ -Subproject commit dd08b70d9e7155fdc2fca85ef6e9b97c401ff692 +Subproject commit 824c2388a771a7ff5c2ac4b1e27b4a497192032f diff --git a/Modules/jaspFrequencies b/Modules/jaspFrequencies index 55e55a8900..7d7d6a354c 160000 --- a/Modules/jaspFrequencies +++ b/Modules/jaspFrequencies @@ -1 +1 @@ -Subproject commit 55e55a8900a50346a449ce2dc77b9198b0e7695c +Subproject commit 7d7d6a354c3ac061450e60bfe590418aab591b1d diff --git a/Modules/jaspJags b/Modules/jaspJags index c271aa6a42..cbe1694414 160000 --- a/Modules/jaspJags +++ b/Modules/jaspJags @@ -1 +1 @@ -Subproject commit c271aa6a42c4ccc79a7133180bb22e4e507e35b7 +Subproject commit cbe169441437f4a66fd4619b320272b1d42d80de diff --git a/Modules/jaspLearnBayes b/Modules/jaspLearnBayes index 5d2b658f5d..528e3e88da 160000 --- a/Modules/jaspLearnBayes +++ b/Modules/jaspLearnBayes @@ -1 +1 @@ -Subproject commit 5d2b658f5d688c4ec40555970dc32d17a9b05f33 +Subproject commit 528e3e88daceae1d12df1044de8390f40f0a3690 diff --git a/Modules/jaspLearnStats b/Modules/jaspLearnStats index 7cabdde98f..775a637a11 160000 --- a/Modules/jaspLearnStats +++ b/Modules/jaspLearnStats @@ -1 +1 @@ -Subproject commit 7cabdde98fdacbdde072e7625cb71d3bd515058d +Subproject commit 775a637a1111cae419774a3c8f584e857ad7c0db diff --git a/Modules/jaspMachineLearning b/Modules/jaspMachineLearning index 4d11495c74..73808f06a4 160000 --- a/Modules/jaspMachineLearning +++ b/Modules/jaspMachineLearning @@ -1 +1 @@ -Subproject commit 4d11495c7472e62da8c0eca5040866dfe5c41793 +Subproject commit 73808f06a4a73ab3142f6db0a74030539fc3b09f diff --git a/Modules/jaspMetaAnalysis b/Modules/jaspMetaAnalysis index 0d4129d1da..d78139a9e3 160000 --- a/Modules/jaspMetaAnalysis +++ b/Modules/jaspMetaAnalysis @@ -1 +1 @@ -Subproject commit 0d4129d1dae1df7796ff2050817a4bf35250a557 +Subproject commit d78139a9e3847f9675275de85320d84cdcd5e24e diff --git a/Modules/jaspMixedModels b/Modules/jaspMixedModels index 44f4cab613..609a5dd224 160000 --- a/Modules/jaspMixedModels +++ b/Modules/jaspMixedModels @@ -1 +1 @@ -Subproject commit 44f4cab6137ebca07a82012c277d4b0b34278a2d +Subproject commit 609a5dd22463e742dac9033ec414594367fbab74 diff --git a/Modules/jaspNetwork b/Modules/jaspNetwork index 40e2b8de65..cf3aa43611 160000 --- a/Modules/jaspNetwork +++ b/Modules/jaspNetwork @@ -1 +1 @@ -Subproject commit 40e2b8de65a51cc40d5bbca9dfce17304f445266 +Subproject commit cf3aa4361177f5838f3c7abf138bae959effe145 diff --git a/Modules/jaspPower b/Modules/jaspPower index 41b84cf153..3b6b275c1e 160000 --- a/Modules/jaspPower +++ b/Modules/jaspPower @@ -1 +1 @@ -Subproject commit 41b84cf153fee61448daf584adda61ee90779d49 +Subproject commit 3b6b275c1e09404a792730d705351cd93122becd diff --git a/Modules/jaspPredictiveAnalytics b/Modules/jaspPredictiveAnalytics index f306eecbb5..5ba9553e7a 160000 --- a/Modules/jaspPredictiveAnalytics +++ b/Modules/jaspPredictiveAnalytics @@ -1 +1 @@ -Subproject commit f306eecbb581ccfb1263f784cf80e910d389965b +Subproject commit 5ba9553e7a07090071fb4a7a6811d87c13f61268 diff --git a/Modules/jaspProcess b/Modules/jaspProcess index 0778a5d18c..59e26f58f1 160000 --- a/Modules/jaspProcess +++ b/Modules/jaspProcess @@ -1 +1 @@ -Subproject commit 0778a5d18c55562097c164847258d7804c663a6a +Subproject commit 59e26f58f16290aa9c9fa2e50aba8281cfb5b3f9 diff --git a/Modules/jaspProphet b/Modules/jaspProphet index ca367863c1..9e349efa7f 160000 --- a/Modules/jaspProphet +++ b/Modules/jaspProphet @@ -1 +1 @@ -Subproject commit ca367863c1d13654c7455deb1cc6814d04979567 +Subproject commit 9e349efa7f719e6af201adf16b2a9015e90cc14b diff --git a/Modules/jaspQualityControl b/Modules/jaspQualityControl index 71a9f4ca0e..4cfbe35632 160000 --- a/Modules/jaspQualityControl +++ b/Modules/jaspQualityControl @@ -1 +1 @@ -Subproject commit 71a9f4ca0e20a06ba7980325841649d3639accad +Subproject commit 4cfbe35632be5636712e6f859135c4c6e5aa25f5 diff --git a/Modules/jaspRegression b/Modules/jaspRegression index 170ddd582b..a17cb15b50 160000 --- a/Modules/jaspRegression +++ b/Modules/jaspRegression @@ -1 +1 @@ -Subproject commit 170ddd582b818c1fce5a18b235ba43ab4c54d398 +Subproject commit a17cb15b5099aa0f2ab573935995626e02f155e3 diff --git a/Modules/jaspReliability b/Modules/jaspReliability index 74adf19d59..4aa41d1a0e 160000 --- a/Modules/jaspReliability +++ b/Modules/jaspReliability @@ -1 +1 @@ -Subproject commit 74adf19d593c4912491be38c9d503f56f5f849c4 +Subproject commit 4aa41d1a0eecb32787c972d6def7ca75392a1313 diff --git a/Modules/jaspRobustTTests b/Modules/jaspRobustTTests index 55a438e74e..3d76c0ee43 160000 --- a/Modules/jaspRobustTTests +++ b/Modules/jaspRobustTTests @@ -1 +1 @@ -Subproject commit 55a438e74ed699e323ec8710477c413f8af411b5 +Subproject commit 3d76c0ee4325b8425d49844cd21195117639c1bf diff --git a/Modules/jaspSem b/Modules/jaspSem index a5142a1685..720d47a075 160000 --- a/Modules/jaspSem +++ b/Modules/jaspSem @@ -1 +1 @@ -Subproject commit a5142a16851ecf2bcbffa7498de74cb02dd91d69 +Subproject commit 720d47a0756715a564771bc36be2590639afb589 diff --git a/Modules/jaspSummaryStatistics b/Modules/jaspSummaryStatistics index 4ec2a84261..f7f1ba2cda 160000 --- a/Modules/jaspSummaryStatistics +++ b/Modules/jaspSummaryStatistics @@ -1 +1 @@ -Subproject commit 4ec2a84261df75d23fe3732ff3f523accdbe9489 +Subproject commit f7f1ba2cdad3bff5adcb837917764445610435f7 diff --git a/Modules/jaspSurvival b/Modules/jaspSurvival index e6fd46ecd9..f26bf6aba9 160000 --- a/Modules/jaspSurvival +++ b/Modules/jaspSurvival @@ -1 +1 @@ -Subproject commit e6fd46ecd9813097df7786e78769b625f4d5591f +Subproject commit f26bf6aba9d06b29679f726b7f3097ae8658104b diff --git a/Modules/jaspTTests b/Modules/jaspTTests index 657bfc9ba4..bf5e91576b 160000 --- a/Modules/jaspTTests +++ b/Modules/jaspTTests @@ -1 +1 @@ -Subproject commit 657bfc9ba486ecb6524b3b1120b993f7fe3fe1fb +Subproject commit bf5e91576bada4b8d98735b816842feeb9d7a8ce diff --git a/Modules/jaspTestModule b/Modules/jaspTestModule index dce9957f60..5b77601d9b 160000 --- a/Modules/jaspTestModule +++ b/Modules/jaspTestModule @@ -1 +1 @@ -Subproject commit dce9957f6027f2ba91e1b4cf7c16d0e5a21320b3 +Subproject commit 5b77601d9b7272e16a795c0e59fe0c821c79e7ae diff --git a/Modules/jaspTimeSeries b/Modules/jaspTimeSeries index 440fe623fc..d32a8a0e7f 160000 --- a/Modules/jaspTimeSeries +++ b/Modules/jaspTimeSeries @@ -1 +1 @@ -Subproject commit 440fe623fc69951c9131c24ec9fc9578ad315eca +Subproject commit d32a8a0e7f7e422a12b950d564196af246597228 diff --git a/Modules/jaspVisualModeling b/Modules/jaspVisualModeling index 05ffe013b5..9ddfff7c92 160000 --- a/Modules/jaspVisualModeling +++ b/Modules/jaspVisualModeling @@ -1 +1 @@ -Subproject commit 05ffe013b57959bef1a74fa24288830f62dd1e1a +Subproject commit 9ddfff7c922e31c0e8a37112a99007dcbdcccd10 From 6c2d3aedbb8d803cb2ed96212d44fd4801ce959c Mon Sep 17 00:00:00 2001 From: Shun Wang Date: Mon, 29 Jul 2024 18:09:13 +0800 Subject: [PATCH 06/70] Dependencies: upgrade to Quill 2.0 (#5517) * first upgrade to Quill-2.0 * also bump the highlight version * make code highlight looks better * fix rSyntax highlight --- Desktop/html/css/highlight-default.min.css | 19 +- Desktop/html/css/jasp.css | 6 + Desktop/html/css/quill.snow.css | 958 +- Desktop/html/js/highlight-r.min.js | 5 +- Desktop/html/js/highlight.min.js | 856 +- Desktop/html/js/jaspNotes.js | 2 +- Desktop/html/js/jaspwidgets.js | 3 +- Desktop/html/js/quill.js | 11574 +------------------ 8 files changed, 463 insertions(+), 12960 deletions(-) diff --git a/Desktop/html/css/highlight-default.min.css b/Desktop/html/css/highlight-default.min.css index 69edcf1baa..03b6da8bf4 100644 --- a/Desktop/html/css/highlight-default.min.css +++ b/Desktop/html/css/highlight-default.min.css @@ -1,9 +1,10 @@ -/*! - Theme: Default - Description: Original highlight.js style - Author: (c) Ivan Sagalaev - Maintainer: @highlightjs/core-team - Website: https://highlightjs.org/ - License: see project LICENSE - Touched: 2021 -*/pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{background:#f3f3f3;color:#444}.hljs-comment{color:#697070}.hljs-punctuation,.hljs-tag{color:#444a}.hljs-tag .hljs-attr,.hljs-tag .hljs-name{color:#444}.hljs-attribute,.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-name,.hljs-selector-tag{font-weight:700}.hljs-deletion,.hljs-number,.hljs-quote,.hljs-selector-class,.hljs-selector-id,.hljs-string,.hljs-template-tag,.hljs-type{color:#800}.hljs-section,.hljs-title{color:#800;font-weight:700}.hljs-link,.hljs-operator,.hljs-regexp,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-symbol,.hljs-template-variable,.hljs-variable{color:#ab5656}.hljs-literal{color:#695}.hljs-addition,.hljs-built_in,.hljs-bullet,.hljs-code{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#38a}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700} +pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! + Theme: GitHub Dark + Description: Dark theme as seen on github.com + Author: github.com + Maintainer: @Hirse + Updated: 2021-05-15 + + Outdated base version: https://github.com/primer/github-syntax-dark + Current colors taken from GitHub's CSS +*/.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#79c0ff}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-code,.hljs-comment,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c} \ No newline at end of file diff --git a/Desktop/html/css/jasp.css b/Desktop/html/css/jasp.css index c985a7c1f6..5d3c2b83b9 100644 --- a/Desktop/html/css/jasp.css +++ b/Desktop/html/css/jasp.css @@ -655,3 +655,9 @@ iframe.ql-video { transform: translateX(0); } } + +/* we hack the quill editor code-block style */ +.ql-snow .ql-editor .ql-code-block-container { + background-color: #333333 !important; + color: #f8f8f2 !important; +} \ No newline at end of file diff --git a/Desktop/html/css/quill.snow.css b/Desktop/html/css/quill.snow.css index 8c66ec615d..d06fe4f570 100644 --- a/Desktop/html/css/quill.snow.css +++ b/Desktop/html/css/quill.snow.css @@ -1,958 +1,8 @@ /*! - * - * Quill Editor v1.3.1 - * https://quilljs.com/ + * Quill Editor v2.0.2 + * https://quilljs.com + * Copyright (c) 2017-2024, Slab * Copyright (c) 2014, Jason Chen * Copyright (c) 2013, salesforce.com */ - .ql-container { - box-sizing: border-box; - font-family: Helvetica, Arial, sans-serif; - font-size: 13px; - height: 100%; - margin: 0px; - position: relative; -} -.ql-container.ql-disabled .ql-tooltip { - visibility: hidden; -} -.ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { - pointer-events: none; -} -.ql-clipboard { - left: -100000px; - height: 1px; - overflow-y: hidden; - position: absolute; - top: 50%; -} -.ql-clipboard p { - margin: 0; - padding: 0; -} -.ql-editor { - box-sizing: border-box; - line-height: 1.42; - height: 100%; - outline: none; - overflow-y: auto; - padding: 12px 15px; - tab-size: 4; - -moz-tab-size: 4; - text-align: left; - white-space: pre-wrap; - word-wrap: break-word; -} -.ql-editor > * { - cursor: text; -} -.ql-editor p, -.ql-editor ol, -.ql-editor ul, -.ql-editor pre, -.ql-editor blockquote, -.ql-editor h1, -.ql-editor h2, -.ql-editor h3, -.ql-editor h4, -.ql-editor h5, -.ql-editor h6 { - margin: 0; - padding: 0; - counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; -} -.ql-editor ol, -.ql-editor ul { - padding-left: 1.5em; -} -.ql-editor ol > li, -.ql-editor ul > li { - list-style-type: none; -} -.ql-editor ul > li::before { - content: '\2022'; -} -.ql-editor ul[data-checked=true], -.ql-editor ul[data-checked=false] { - pointer-events: none; -} -.ql-editor ul[data-checked=true] > li *, -.ql-editor ul[data-checked=false] > li * { - pointer-events: all; -} -.ql-editor ul[data-checked=true] > li::before, -.ql-editor ul[data-checked=false] > li::before { - color: #777; - cursor: pointer; - pointer-events: all; -} -.ql-editor ul[data-checked=true] > li::before { - content: '\2611'; -} -.ql-editor ul[data-checked=false] > li::before { - content: '\2610'; -} -.ql-editor li::before { - display: inline-block; - white-space: nowrap; - width: 1.2em; -} -.ql-editor li:not(.ql-direction-rtl)::before { - margin-left: -1.5em; - margin-right: 0.3em; - text-align: right; -} -.ql-editor li.ql-direction-rtl::before { - margin-left: 0.3em; - margin-right: -1.5em; -} -.ql-editor ol li:not(.ql-direction-rtl), -.ql-editor ul li:not(.ql-direction-rtl) { - padding-left: 1.5em; -} -.ql-editor ol li.ql-direction-rtl, -.ql-editor ul li.ql-direction-rtl { - padding-right: 1.5em; -} -.ql-editor ol li { - counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; - counter-increment: list-0; -} -.ql-editor ol li:before { - content: counter(list-0, decimal) '. '; -} -.ql-editor ol li.ql-indent-1 { - counter-increment: list-1; -} -.ql-editor ol li.ql-indent-1:before { - content: counter(list-1, lower-alpha) '. '; -} -.ql-editor ol li.ql-indent-1 { - counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; -} -.ql-editor ol li.ql-indent-2 { - counter-increment: list-2; -} -.ql-editor ol li.ql-indent-2:before { - content: counter(list-2, lower-roman) '. '; -} -.ql-editor ol li.ql-indent-2 { - counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; -} -.ql-editor ol li.ql-indent-3 { - counter-increment: list-3; -} -.ql-editor ol li.ql-indent-3:before { - content: counter(list-3, decimal) '. '; -} -.ql-editor ol li.ql-indent-3 { - counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; -} -.ql-editor ol li.ql-indent-4 { - counter-increment: list-4; -} -.ql-editor ol li.ql-indent-4:before { - content: counter(list-4, lower-alpha) '. '; -} -.ql-editor ol li.ql-indent-4 { - counter-reset: list-5 list-6 list-7 list-8 list-9; -} -.ql-editor ol li.ql-indent-5 { - counter-increment: list-5; -} -.ql-editor ol li.ql-indent-5:before { - content: counter(list-5, lower-roman) '. '; -} -.ql-editor ol li.ql-indent-5 { - counter-reset: list-6 list-7 list-8 list-9; -} -.ql-editor ol li.ql-indent-6 { - counter-increment: list-6; -} -.ql-editor ol li.ql-indent-6:before { - content: counter(list-6, decimal) '. '; -} -.ql-editor ol li.ql-indent-6 { - counter-reset: list-7 list-8 list-9; -} -.ql-editor ol li.ql-indent-7 { - counter-increment: list-7; -} -.ql-editor ol li.ql-indent-7:before { - content: counter(list-7, lower-alpha) '. '; -} -.ql-editor ol li.ql-indent-7 { - counter-reset: list-8 list-9; -} -.ql-editor ol li.ql-indent-8 { - counter-increment: list-8; -} -.ql-editor ol li.ql-indent-8:before { - content: counter(list-8, lower-roman) '. '; -} -.ql-editor ol li.ql-indent-8 { - counter-reset: list-9; -} -.ql-editor ol li.ql-indent-9 { - counter-increment: list-9; -} -.ql-editor ol li.ql-indent-9:before { - content: counter(list-9, decimal) '. '; -} -.ql-editor .ql-indent-1:not(.ql-direction-rtl) { - padding-left: 3em; -} -.ql-editor li.ql-indent-1:not(.ql-direction-rtl) { - padding-left: 4.5em; -} -.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { - padding-right: 3em; -} -.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { - padding-right: 4.5em; -} -.ql-editor .ql-indent-2:not(.ql-direction-rtl) { - padding-left: 6em; -} -.ql-editor li.ql-indent-2:not(.ql-direction-rtl) { - padding-left: 7.5em; -} -.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { - padding-right: 6em; -} -.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { - padding-right: 7.5em; -} -.ql-editor .ql-indent-3:not(.ql-direction-rtl) { - padding-left: 9em; -} -.ql-editor li.ql-indent-3:not(.ql-direction-rtl) { - padding-left: 10.5em; -} -.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { - padding-right: 9em; -} -.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { - padding-right: 10.5em; -} -.ql-editor .ql-indent-4:not(.ql-direction-rtl) { - padding-left: 12em; -} -.ql-editor li.ql-indent-4:not(.ql-direction-rtl) { - padding-left: 13.5em; -} -.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { - padding-right: 12em; -} -.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { - padding-right: 13.5em; -} -.ql-editor .ql-indent-5:not(.ql-direction-rtl) { - padding-left: 15em; -} -.ql-editor li.ql-indent-5:not(.ql-direction-rtl) { - padding-left: 16.5em; -} -.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { - padding-right: 15em; -} -.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { - padding-right: 16.5em; -} -.ql-editor .ql-indent-6:not(.ql-direction-rtl) { - padding-left: 18em; -} -.ql-editor li.ql-indent-6:not(.ql-direction-rtl) { - padding-left: 19.5em; -} -.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { - padding-right: 18em; -} -.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { - padding-right: 19.5em; -} -.ql-editor .ql-indent-7:not(.ql-direction-rtl) { - padding-left: 21em; -} -.ql-editor li.ql-indent-7:not(.ql-direction-rtl) { - padding-left: 22.5em; -} -.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { - padding-right: 21em; -} -.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { - padding-right: 22.5em; -} -.ql-editor .ql-indent-8:not(.ql-direction-rtl) { - padding-left: 24em; -} -.ql-editor li.ql-indent-8:not(.ql-direction-rtl) { - padding-left: 25.5em; -} -.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { - padding-right: 24em; -} -.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { - padding-right: 25.5em; -} -.ql-editor .ql-indent-9:not(.ql-direction-rtl) { - padding-left: 27em; -} -.ql-editor li.ql-indent-9:not(.ql-direction-rtl) { - padding-left: 28.5em; -} -.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { - padding-right: 27em; -} -.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { - padding-right: 28.5em; -} -.ql-editor .ql-video { - display: block; - max-width: 100%; -} -.ql-editor .ql-video.ql-align-center { - margin: 0 auto; -} -.ql-editor .ql-video.ql-align-right { - margin: 0 0 0 auto; -} -.ql-editor .ql-bg-black { - background-color: #000; -} -.ql-editor .ql-bg-red { - background-color: #e60000; -} -.ql-editor .ql-bg-orange { - background-color: #f90; -} -.ql-editor .ql-bg-yellow { - background-color: #ff0; -} -.ql-editor .ql-bg-green { - background-color: #008a00; -} -.ql-editor .ql-bg-blue { - background-color: #06c; -} -.ql-editor .ql-bg-purple { - background-color: #93f; -} -.ql-editor .ql-color-white { - color: #fff; -} -.ql-editor .ql-color-red { - color: #e60000; -} -.ql-editor .ql-color-orange { - color: #f90; -} -.ql-editor .ql-color-yellow { - color: #ff0; -} -.ql-editor .ql-color-green { - color: #008a00; -} -.ql-editor .ql-color-blue { - color: #06c; -} -.ql-editor .ql-color-purple { - color: #93f; -} -.ql-editor .ql-font-serif { - font-family: Georgia, Times New Roman, serif; -} -.ql-editor .ql-font-monospace { - font-family: Monaco, Courier New, monospace; -} -.ql-editor .ql-size-small { - font-size: 0.75em; -} -.ql-editor .ql-size-large { - font-size: 1.5em; -} -.ql-editor .ql-size-huge { - font-size: 2.5em; -} -.ql-editor .ql-direction-rtl { - direction: rtl; - text-align: inherit; -} -.ql-editor .ql-align-center { - text-align: center; -} -.ql-editor .ql-align-justify { - text-align: justify; -} -.ql-editor .ql-align-right { - text-align: right; -} -.ql-editor .ql-embed-selected { - border: 1px solid #777; - user-select: none; -} -.ql-editor.ql-blank::before { - color: rgba(0,0,0,0.6); - content: attr(data-placeholder); - font-style: italic; - pointer-events: none; - position: absolute; -} -.ql-snow.ql-toolbar:after, -.ql-snow .ql-toolbar:after { - clear: both; - content: ''; - display: table; -} -.ql-snow.ql-toolbar button, -.ql-snow .ql-toolbar button { - background: none; - border: none; - cursor: pointer; - display: inline-block; - float: left; - height: 24px; - padding: 3px 5px; - width: 28px; -} -.ql-snow.ql-toolbar button svg, -.ql-snow .ql-toolbar button svg { - float: left; - height: 100%; -} -.ql-snow.ql-toolbar button:active:hover, -.ql-snow .ql-toolbar button:active:hover { - outline: none; -} -.ql-snow.ql-toolbar input.ql-image[type=file], -.ql-snow .ql-toolbar input.ql-image[type=file] { - display: none; -} -.ql-snow.ql-toolbar button:hover, -.ql-snow .ql-toolbar button:hover, -.ql-snow.ql-toolbar button:focus, -.ql-snow .ql-toolbar button:focus, -.ql-snow.ql-toolbar button.ql-active, -.ql-snow .ql-toolbar button.ql-active, -.ql-snow.ql-toolbar .ql-picker-label:hover, -.ql-snow .ql-toolbar .ql-picker-label:hover, -.ql-snow.ql-toolbar .ql-picker-label.ql-active, -.ql-snow .ql-toolbar .ql-picker-label.ql-active, -.ql-snow.ql-toolbar .ql-picker-item:hover, -.ql-snow .ql-toolbar .ql-picker-item:hover, -.ql-snow.ql-toolbar .ql-picker-item.ql-selected, -.ql-snow .ql-toolbar .ql-picker-item.ql-selected { - color: #06c; -} -.ql-snow.ql-toolbar button:hover .ql-fill, -.ql-snow .ql-toolbar button:hover .ql-fill, -.ql-snow.ql-toolbar button:focus .ql-fill, -.ql-snow .ql-toolbar button:focus .ql-fill, -.ql-snow.ql-toolbar button.ql-active .ql-fill, -.ql-snow .ql-toolbar button.ql-active .ql-fill, -.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill, -.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill, -.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill, -.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill, -.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill, -.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill, -.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill, -.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill, -.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill, -.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill, -.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill, -.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill, -.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill, -.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill, -.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, -.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, -.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, -.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, -.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, -.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, -.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, -.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { - fill: #06c; -} -.ql-snow.ql-toolbar button:hover .ql-stroke, -.ql-snow .ql-toolbar button:hover .ql-stroke, -.ql-snow.ql-toolbar button:focus .ql-stroke, -.ql-snow .ql-toolbar button:focus .ql-stroke, -.ql-snow.ql-toolbar button.ql-active .ql-stroke, -.ql-snow .ql-toolbar button.ql-active .ql-stroke, -.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke, -.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke, -.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke, -.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke, -.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke, -.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke, -.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, -.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, -.ql-snow.ql-toolbar button:hover .ql-stroke-miter, -.ql-snow .ql-toolbar button:hover .ql-stroke-miter, -.ql-snow.ql-toolbar button:focus .ql-stroke-miter, -.ql-snow .ql-toolbar button:focus .ql-stroke-miter, -.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter, -.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter, -.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, -.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, -.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, -.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, -.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, -.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, -.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, -.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { - stroke: #06c; -} -@media (pointer: coarse) { - .ql-snow.ql-toolbar button:hover:not(.ql-active), - .ql-snow .ql-toolbar button:hover:not(.ql-active) { - color: #444; - } - .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill, - .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill, - .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, - .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { - fill: #444; - } - .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke, - .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke, - .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, - .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { - stroke: #444; - } -} -.ql-snow { - box-sizing: border-box; -} -.ql-snow * { - box-sizing: border-box; -} -.ql-snow .ql-hidden { - display: none; -} -.ql-snow .ql-out-bottom, -.ql-snow .ql-out-top { - visibility: hidden; -} -.ql-snow .ql-tooltip { - position: absolute; - transform: translateY(10px); -} -.ql-snow .ql-tooltip a { - cursor: pointer; - text-decoration: none; -} -.ql-snow .ql-tooltip.ql-flip { - transform: translateY(-10px); -} -.ql-snow .ql-formats { - display: inline-block; - vertical-align: middle; -} -.ql-snow .ql-formats:after { - clear: both; - content: ''; - display: table; -} -.ql-snow .ql-stroke { - fill: none; - stroke: #444; - stroke-linecap: round; - stroke-linejoin: round; - stroke-width: 2; -} -.ql-snow .ql-stroke-miter { - fill: none; - stroke: #444; - stroke-miterlimit: 10; - stroke-width: 2; -} -.ql-snow .ql-fill, -.ql-snow .ql-stroke.ql-fill { - fill: #444; -} -.ql-snow .ql-empty { - fill: none; -} -.ql-snow .ql-even { - fill-rule: evenodd; -} -.ql-snow .ql-thin, -.ql-snow .ql-stroke.ql-thin { - stroke-width: 1; -} -.ql-snow .ql-transparent { - opacity: 0.4; -} -.ql-snow .ql-direction svg:last-child { - display: none; -} -.ql-snow .ql-direction.ql-active svg:last-child { - display: inline; -} -.ql-snow .ql-direction.ql-active svg:first-child { - display: none; -} -.ql-snow .ql-editor h1 { - font-size: 2em; -} -.ql-snow .ql-editor h2 { - font-size: 1.5em; -} -.ql-snow .ql-editor h3 { - font-size: 1.17em; -} -.ql-snow .ql-editor h4 { - font-size: 1em; -} -.ql-snow .ql-editor h5 { - font-size: 0.83em; -} -.ql-snow .ql-editor h6 { - font-size: 0.67em; -} -.ql-snow .ql-editor a { - text-decoration: underline; -} -.ql-snow .ql-editor blockquote { - border-left: 4px solid #ccc; - margin-bottom: 5px; - margin-top: 5px; - padding-left: 16px; -} -.ql-snow .ql-editor code, -.ql-snow .ql-editor pre { - background-color: #f0f0f0; - border-radius: 3px; -} -.ql-snow .ql-editor pre { - white-space: pre-wrap; - margin-bottom: 5px; - margin-top: 5px; - padding: 5px 10px; -} -.ql-snow .ql-editor code { - font-size: 85%; - padding: 2px 4px; -} -.ql-snow .ql-editor pre.ql-syntax { - background-color: #23241f; - color: #f8f8f2; - overflow: visible; -} -.ql-snow .ql-editor img { - max-width: 100%; -} -.ql-snow .ql-picker { - color: #444; - display: inline-block; - float: left; - font-size: 14px; - font-weight: 500; - height: 24px; - position: relative; - vertical-align: middle; -} -.ql-snow .ql-picker-label { - cursor: pointer; - display: inline-block; - height: 100%; - padding-left: 8px; - padding-right: 2px; - position: relative; - width: 100%; -} -.ql-snow .ql-picker-label::before { - display: inline-block; - line-height: 22px; -} -.ql-snow .ql-picker-options { - background-color: #fff; - display: none; - min-width: 100%; - padding: 4px 8px; - position: absolute; - white-space: nowrap; -} -.ql-snow .ql-picker-options .ql-picker-item { - cursor: pointer; - display: block; - padding-bottom: 5px; - padding-top: 5px; -} -.ql-snow .ql-picker.ql-expanded .ql-picker-label { - color: #ccc; - z-index: 2; -} -.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill { - fill: #ccc; -} -.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke { - stroke: #ccc; -} -.ql-snow .ql-picker.ql-expanded .ql-picker-options { - display: block; - margin-top: -1px; - top: 100%; - z-index: 1; -} -.ql-snow .ql-color-picker, -.ql-snow .ql-icon-picker { - width: 28px; -} -.ql-snow .ql-color-picker .ql-picker-label, -.ql-snow .ql-icon-picker .ql-picker-label { - padding: 2px 4px; -} -.ql-snow .ql-color-picker .ql-picker-label svg, -.ql-snow .ql-icon-picker .ql-picker-label svg { - right: 4px; -} -.ql-snow .ql-icon-picker .ql-picker-options { - padding: 4px 0px; -} -.ql-snow .ql-icon-picker .ql-picker-item { - height: 24px; - width: 24px; - padding: 2px 4px; -} -.ql-snow .ql-color-picker .ql-picker-options { - padding: 3px 5px; - width: 152px; -} -.ql-snow .ql-color-picker .ql-picker-item { - border: 1px solid transparent; - float: left; - height: 16px; - margin: 2px; - padding: 0px; - width: 16px; -} -.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { - position: absolute; - margin-top: -9px; - right: 0; - top: 50%; - width: 18px; -} -.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before, -.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before, -.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before, -.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before, -.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before, -.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before { - content: attr(data-label); -} -.ql-snow .ql-picker.ql-header { - width: 98px; -} -.ql-snow .ql-picker.ql-header .ql-picker-label::before, -.ql-snow .ql-picker.ql-header .ql-picker-item::before { - content: 'Normal'; -} -.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { - content: 'Heading 1'; -} -.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { - content: 'Heading 2'; -} -.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { - content: 'Heading 3'; -} -.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { - content: 'Heading 4'; -} -.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { - content: 'Heading 5'; -} -.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { - content: 'Heading 6'; -} -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { - font-size: 2em; -} -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { - font-size: 1.5em; -} -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { - font-size: 1.17em; -} -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { - font-size: 1em; -} -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { - font-size: 0.83em; -} -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { - font-size: 0.67em; -} -.ql-snow .ql-picker.ql-font { - width: 108px; -} -.ql-snow .ql-picker.ql-font .ql-picker-label::before, -.ql-snow .ql-picker.ql-font .ql-picker-item::before { - content: 'Sans Serif'; -} -.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, -.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { - content: 'Serif'; -} -.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, -.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { - content: 'Monospace'; -} -.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { - font-family: Georgia, Times New Roman, serif; -} -.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { - font-family: Monaco, Courier New, monospace; -} -.ql-snow .ql-picker.ql-size { - width: 98px; -} -.ql-snow .ql-picker.ql-size .ql-picker-label::before, -.ql-snow .ql-picker.ql-size .ql-picker-item::before { - content: 'Normal'; -} -.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before, -.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { - content: 'Small'; -} -.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before, -.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { - content: 'Large'; -} -.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, -.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { - content: 'Huge'; -} -.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { - font-size: 10px; -} -.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { - font-size: 18px; -} -.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { - font-size: 32px; -} -.ql-snow .ql-color-picker.ql-background .ql-picker-item { - background-color: #fff; -} -.ql-snow .ql-color-picker.ql-color .ql-picker-item { - background-color: #000; -} -.ql-toolbar.ql-snow { - border: 1px solid #ccc; - box-sizing: border-box; - font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; - padding: 8px; -} -.ql-toolbar.ql-snow .ql-formats { - margin-right: 15px; -} -.ql-toolbar.ql-snow .ql-picker-label { - border: 1px solid transparent; -} -.ql-toolbar.ql-snow .ql-picker-options { - border: 1px solid transparent; - box-shadow: rgba(0,0,0,0.2) 0 2px 8px; -} -.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label { - border-color: #ccc; -} -.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options { - border-color: #ccc; -} -.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected, -.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover { - border-color: #000; -} -.ql-toolbar.ql-snow + .ql-container.ql-snow { - border-top: 0px; -} -.ql-snow .ql-tooltip { - background-color: #fff; - border: 1px solid #ccc; - box-shadow: 0px 0px 5px #ddd; - color: #444; - padding: 5px 12px; - white-space: nowrap; -} -.ql-snow .ql-tooltip::before { - content: "Visit URL:"; - line-height: 26px; - margin-right: 8px; -} -.ql-snow .ql-tooltip input[type=text] { - display: none; - border: 1px solid #ccc; - font-size: 13px; - height: 26px; - margin: 0px; - padding: 3px 5px; - width: 170px; -} -.ql-snow .ql-tooltip a { - display: inline-block; - max-width: 200px; - overflow-x: hidden; - text-overflow: ellipsis; - vertical-align: top; -} -.ql-snow .ql-tooltip a.ql-action::after { - border-right: 1px solid #ccc; - content: 'Edit'; - margin-left: 16px; - padding-right: 8px; -} -.ql-snow .ql-tooltip a.ql-remove::before { - content: 'Remove'; - margin-left: 8px; -} -.ql-snow .ql-tooltip a { - line-height: 26px; -} -.ql-snow .ql-tooltip.ql-editing a.ql-preview, -.ql-snow .ql-tooltip.ql-editing a.ql-remove { - display: none; -} -.ql-snow .ql-tooltip.ql-editing input[type=text] { - display: inline-block; -} -.ql-snow .ql-tooltip.ql-editing a.ql-action::after { - border-right: 0px; - content: 'Save'; - padding-right: 0px; -} -.ql-snow .ql-tooltip[data-mode=link]::before { - content: "Enter link:"; -} -.ql-snow .ql-tooltip[data-mode=formula]::before { - content: "Enter formula:"; -} -.ql-snow .ql-tooltip[data-mode=video]::before { - content: "Enter video:"; -} -.ql-snow a { - color: #06c; -} - -.ql-editor p { - margin-top: 1em; - margin-bottom: 0; -} - -.ql-editor p:first-child { - margin-top: 0 -} - -p.linebreak-true { - margin-top: 0; -} + .ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container:not(.ql-disabled) li[data-list=checked] > .ql-ui,.ql-container:not(.ql-disabled) li[data-list=unchecked] > .ql-ui{cursor:pointer}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor > *{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0}@supports (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-set:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor table{border-collapse:collapse}.ql-editor td{border:1px solid #000;padding:2px 5px}.ql-editor ol{padding-left:1.5em}.ql-editor li{list-style-type:none;padding-left:1.5em;position:relative}.ql-editor li > .ql-ui:before{display:inline-block;margin-left:-1.5em;margin-right:.3em;text-align:right;white-space:nowrap;width:1.2em}.ql-editor li[data-list=checked] > .ql-ui,.ql-editor li[data-list=unchecked] > .ql-ui{color:#777}.ql-editor li[data-list=bullet] > .ql-ui:before{content:'\2022'}.ql-editor li[data-list=checked] > .ql-ui:before{content:'\2611'}.ql-editor li[data-list=unchecked] > .ql-ui:before{content:'\2610'}@supports (counter-set:none){.ql-editor li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list]{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered]{counter-increment:list-0}.ql-editor li[data-list=ordered] > .ql-ui:before{content:counter(list-0, decimal) '. '}.ql-editor li[data-list=ordered].ql-indent-1{counter-increment:list-1}.ql-editor li[data-list=ordered].ql-indent-1 > .ql-ui:before{content:counter(list-1, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-set:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-2{counter-increment:list-2}.ql-editor li[data-list=ordered].ql-indent-2 > .ql-ui:before{content:counter(list-2, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-set:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-3{counter-increment:list-3}.ql-editor li[data-list=ordered].ql-indent-3 > .ql-ui:before{content:counter(list-3, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-set:list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-4{counter-increment:list-4}.ql-editor li[data-list=ordered].ql-indent-4 > .ql-ui:before{content:counter(list-4, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-set:list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-5{counter-increment:list-5}.ql-editor li[data-list=ordered].ql-indent-5 > .ql-ui:before{content:counter(list-5, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-set:list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-6{counter-increment:list-6}.ql-editor li[data-list=ordered].ql-indent-6 > .ql-ui:before{content:counter(list-6, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-set:list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-reset:list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-7{counter-increment:list-7}.ql-editor li[data-list=ordered].ql-indent-7 > .ql-ui:before{content:counter(list-7, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-set:list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-reset:list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-8{counter-increment:list-8}.ql-editor li[data-list=ordered].ql-indent-8 > .ql-ui:before{content:counter(list-8, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-set:list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-reset:list-9}}.ql-editor li[data-list=ordered].ql-indent-9{counter-increment:list-9}.ql-editor li[data-list=ordered].ql-indent-9 > .ql-ui:before{content:counter(list-9, decimal) '. '}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor li.ql-direction-rtl{padding-right:1.5em}.ql-editor li.ql-direction-rtl > .ql-ui:before{margin-left:.3em;margin-right:-1.5em;text-align:left}.ql-editor table{table-layout:fixed;width:100%}.ql-editor table td{outline:none}.ql-editor .ql-code-block-container{font-family:monospace}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor .ql-ui{position:absolute}.ql-editor.ql-blank::before{color:rgba(0,0,0,0.6);content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-snow.ql-toolbar:after,.ql-snow .ql-toolbar:after{clear:both;content:'';display:table}.ql-snow.ql-toolbar button,.ql-snow .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-snow.ql-toolbar button svg,.ql-snow .ql-toolbar button svg{float:left;height:100%}.ql-snow.ql-toolbar button:active:hover,.ql-snow .ql-toolbar button:active:hover{outline:none}.ql-snow.ql-toolbar input.ql-image[type=file],.ql-snow .ql-toolbar input.ql-image[type=file]{display:none}.ql-snow.ql-toolbar button:hover,.ql-snow .ql-toolbar button:hover,.ql-snow.ql-toolbar button:focus,.ql-snow .ql-toolbar button:focus,.ql-snow.ql-toolbar button.ql-active,.ql-snow .ql-toolbar button.ql-active,.ql-snow.ql-toolbar .ql-picker-label:hover,.ql-snow .ql-toolbar .ql-picker-label:hover,.ql-snow.ql-toolbar .ql-picker-label.ql-active,.ql-snow .ql-toolbar .ql-picker-label.ql-active,.ql-snow.ql-toolbar .ql-picker-item:hover,.ql-snow .ql-toolbar .ql-picker-item:hover,.ql-snow.ql-toolbar .ql-picker-item.ql-selected,.ql-snow .ql-toolbar .ql-picker-item.ql-selected{color:#06c}.ql-snow.ql-toolbar button:hover .ql-fill,.ql-snow .ql-toolbar button:hover .ql-fill,.ql-snow.ql-toolbar button:focus .ql-fill,.ql-snow .ql-toolbar button:focus .ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#06c}.ql-snow.ql-toolbar button:hover .ql-stroke,.ql-snow .ql-toolbar button:hover .ql-stroke,.ql-snow.ql-toolbar button:focus .ql-stroke,.ql-snow .ql-toolbar button:focus .ql-stroke,.ql-snow.ql-toolbar button.ql-active .ql-stroke,.ql-snow .ql-toolbar button.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-snow.ql-toolbar button:hover .ql-stroke-miter,.ql-snow .ql-toolbar button:hover .ql-stroke-miter,.ql-snow.ql-toolbar button:focus .ql-stroke-miter,.ql-snow .ql-toolbar button:focus .ql-stroke-miter,.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#06c}@media (pointer:coarse){.ql-snow.ql-toolbar button:hover:not(.ql-active),.ql-snow .ql-toolbar button:hover:not(.ql-active){color:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#444}.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#444}}.ql-snow{box-sizing:border-box}.ql-snow *{box-sizing:border-box}.ql-snow .ql-hidden{display:none}.ql-snow .ql-out-bottom,.ql-snow .ql-out-top{visibility:hidden}.ql-snow .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-snow .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-snow .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-snow .ql-formats{display:inline-block;vertical-align:middle}.ql-snow .ql-formats:after{clear:both;content:'';display:table}.ql-snow .ql-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-snow .ql-stroke-miter{fill:none;stroke:#444;stroke-miterlimit:10;stroke-width:2}.ql-snow .ql-fill,.ql-snow .ql-stroke.ql-fill{fill:#444}.ql-snow .ql-empty{fill:none}.ql-snow .ql-even{fill-rule:evenodd}.ql-snow .ql-thin,.ql-snow .ql-stroke.ql-thin{stroke-width:1}.ql-snow .ql-transparent{opacity:.4}.ql-snow .ql-direction svg:last-child{display:none}.ql-snow .ql-direction.ql-active svg:last-child{display:inline}.ql-snow .ql-direction.ql-active svg:first-child{display:none}.ql-snow .ql-editor h1{font-size:2em}.ql-snow .ql-editor h2{font-size:1.5em}.ql-snow .ql-editor h3{font-size:1.17em}.ql-snow .ql-editor h4{font-size:1em}.ql-snow .ql-editor h5{font-size:.83em}.ql-snow .ql-editor h6{font-size:.67em}.ql-snow .ql-editor a{text-decoration:underline}.ql-snow .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-snow .ql-editor code,.ql-snow .ql-editor .ql-code-block-container{background-color:#f0f0f0;border-radius:3px}.ql-snow .ql-editor .ql-code-block-container{margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-snow .ql-editor code{font-size:85%;padding:2px 4px}.ql-snow .ql-editor .ql-code-block-container{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-snow .ql-editor img{max-width:100%}.ql-snow .ql-picker{color:#444;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-snow .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-snow .ql-picker-label::before{display:inline-block;line-height:22px}.ql-snow .ql-picker-options{background-color:#fff;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-snow .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-snow .ql-picker.ql-expanded .ql-picker-label{color:#ccc;z-index:2}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#ccc}.ql-snow .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-snow .ql-color-picker,.ql-snow .ql-icon-picker{width:28px}.ql-snow .ql-color-picker .ql-picker-label,.ql-snow .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-label svg,.ql-snow .ql-icon-picker .ql-picker-label svg{right:4px}.ql-snow .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-snow .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-snow .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-snow .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before{content:attr(data-label)}.ql-snow .ql-picker.ql-header{width:98px}.ql-snow .ql-picker.ql-header .ql-picker-label::before,.ql-snow .ql-picker.ql-header .ql-picker-item::before{content:'Normal'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{content:'Heading 1'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{content:'Heading 2'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{content:'Heading 3'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{content:'Heading 4'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{content:'Heading 5'}.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{content:'Heading 6'}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{font-size:2em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{font-size:1.5em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{font-size:1.17em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{font-size:1em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{font-size:.83em}.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{font-size:.67em}.ql-snow .ql-picker.ql-font{width:108px}.ql-snow .ql-picker.ql-font .ql-picker-label::before,.ql-snow .ql-picker.ql-font .ql-picker-item::before{content:'Sans Serif'}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{content:'Serif'}.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{content:'Monospace'}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{font-family:Georgia,Times New Roman,serif}.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{font-family:Monaco,Courier New,monospace}.ql-snow .ql-picker.ql-size{width:98px}.ql-snow .ql-picker.ql-size .ql-picker-label::before,.ql-snow .ql-picker.ql-size .ql-picker-item::before{content:'Normal'}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before{content:'Small'}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before{content:'Large'}.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{content:'Huge'}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before{font-size:10px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before{font-size:18px}.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{font-size:32px}.ql-snow .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-snow .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-code-block-container{position:relative}.ql-code-block-container .ql-ui{right:5px;top:5px}.ql-toolbar.ql-snow{border:1px solid #ccc;box-sizing:border-box;font-family:'Helvetica Neue','Helvetica','Arial',sans-serif;padding:8px}.ql-toolbar.ql-snow .ql-formats{margin-right:15px}.ql-toolbar.ql-snow .ql-picker-label{border:1px solid transparent}.ql-toolbar.ql-snow .ql-picker-options{border:1px solid transparent;box-shadow:rgba(0,0,0,0.2) 0 2px 8px}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label{border-color:#ccc}.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options{border-color:#ccc}.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover{border-color:#000}.ql-toolbar.ql-snow + .ql-container.ql-snow{border-top:0}.ql-snow .ql-tooltip{background-color:#fff;border:1px solid #ccc;box-shadow:0 0 5px #ddd;color:#444;padding:5px 12px;white-space:nowrap}.ql-snow .ql-tooltip::before{content:"Visit URL:";line-height:26px;margin-right:8px}.ql-snow .ql-tooltip input[type=text]{display:none;border:1px solid #ccc;font-size:13px;height:26px;margin:0;padding:3px 5px;width:170px}.ql-snow .ql-tooltip a.ql-preview{display:inline-block;max-width:200px;overflow-x:hidden;text-overflow:ellipsis;vertical-align:top}.ql-snow .ql-tooltip a.ql-action::after{border-right:1px solid #ccc;content:'Edit';margin-left:16px;padding-right:8px}.ql-snow .ql-tooltip a.ql-remove::before{content:'Remove';margin-left:8px}.ql-snow .ql-tooltip a{line-height:26px}.ql-snow .ql-tooltip.ql-editing a.ql-preview,.ql-snow .ql-tooltip.ql-editing a.ql-remove{display:none}.ql-snow .ql-tooltip.ql-editing input[type=text]{display:inline-block}.ql-snow .ql-tooltip.ql-editing a.ql-action::after{border-right:0;content:'Save';padding-right:0}.ql-snow .ql-tooltip[data-mode=link]::before{content:"Enter link:"}.ql-snow .ql-tooltip[data-mode=formula]::before{content:"Enter formula:"}.ql-snow .ql-tooltip[data-mode=video]::before{content:"Enter video:"}.ql-snow a{color:#06c}.ql-container.ql-snow{border:1px solid #ccc} diff --git a/Desktop/html/js/highlight-r.min.js b/Desktop/html/js/highlight-r.min.js index 0af724cca7..b330b3431b 100644 --- a/Desktop/html/js/highlight-r.min.js +++ b/Desktop/html/js/highlight-r.min.js @@ -1,4 +1,4 @@ -/*! `r` grammar compiled for Highlight.js 11.7.0 */ +/*! `r` grammar compiled for Highlight.js 11.9.0 */ (()=>{var e=(()=>{"use strict";return e=>{ const a=e.regex,n=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,i=a.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),s=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,t=a.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/) ;return{name:"R",keywords:{$pattern:n, @@ -23,5 +23,4 @@ 2:"number"},match:[/[^a-zA-Z0-9._]|^/,i]}]},{scope:{3:"operator"}, match:[n,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:s},{ match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:t},{begin:"`",end:"`", - contains:[{begin:/\\./}]}]}}})();hljs.registerLanguage("r",e)})(); - \ No newline at end of file + contains:[{begin:/\\./}]}]}}})();hljs.registerLanguage("r",e)})(); \ No newline at end of file diff --git a/Desktop/html/js/highlight.min.js b/Desktop/html/js/highlight.min.js index 3a722bfcb1..f43ba9aa97 100644 --- a/Desktop/html/js/highlight.min.js +++ b/Desktop/html/js/highlight.min.js @@ -1,33 +1,33 @@ /*! - Highlight.js v11.7.0 (git: 82688fad18) - (c) 2006-2022 undefined and other contributors + Highlight.js v11.9.0 (git: f47103d4f1) + (c) 2006-2023 undefined and other contributors License: BSD-3-Clause */ - var hljs=function(){"use strict";var e={exports:{}};function n(e){ - return e instanceof Map?e.clear=e.delete=e.set=()=>{ - throw Error("map is read-only")}:e instanceof Set&&(e.add=e.clear=e.delete=()=>{ + var hljs=function(){"use strict";function e(n){ + return n instanceof Map?n.clear=n.delete=n.set=()=>{ + throw Error("map is read-only")}:n instanceof Set&&(n.add=n.clear=n.delete=()=>{ throw Error("set is read-only") - }),Object.freeze(e),Object.getOwnPropertyNames(e).forEach((t=>{var a=e[t] - ;"object"!=typeof a||Object.isFrozen(a)||n(a)})),e} - e.exports=n,e.exports.default=n;class t{constructor(e){ + }),Object.freeze(n),Object.getOwnPropertyNames(n).forEach((t=>{ + const a=n[t],i=typeof a;"object"!==i&&"function"!==i||Object.isFrozen(a)||e(a) + })),n}class n{constructor(e){ void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} - ignoreMatch(){this.isMatchIgnored=!0}}function a(e){ + ignoreMatch(){this.isMatchIgnored=!0}}function t(e){ return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") - }function i(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n] - ;return n.forEach((e=>{for(const n in e)t[n]=e[n]})),t} - const r=e=>!!e.scope||e.sublanguage&&e.language;class s{constructor(e,n){ + }function a(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n] + ;return n.forEach((e=>{for(const n in e)t[n]=e[n]})),t}const i=e=>!!e.scope + ;class r{constructor(e,n){ this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){ - this.buffer+=a(e)}openNode(e){if(!r(e))return;let n="" - ;n=e.sublanguage?"language-"+e.language:((e,{prefix:n})=>{if(e.includes(".")){ - const t=e.split(".") + this.buffer+=t(e)}openNode(e){if(!i(e))return;const n=((e,{prefix:n})=>{ + if(e.startsWith("language:"))return e.replace("language:","language-") + ;if(e.includes(".")){const t=e.split(".") ;return[`${n}${t.shift()}`,...t.map(((e,n)=>`${e}${"_".repeat(n+1)}`))].join(" ") - }return`${n}${e}`})(e.scope,{prefix:this.classPrefix}),this.span(n)} - closeNode(e){r(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ - this.buffer+=``}}const o=(e={})=>{const n={children:[]} - ;return Object.assign(n,e),n};class l{constructor(){ - this.rootNode=o(),this.stack=[this.rootNode]}get top(){ + }return`${n}${e}`})(e.scope,{prefix:this.classPrefix});this.span(n)} + closeNode(e){i(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ + this.buffer+=``}}const s=(e={})=>{const n={children:[]} + ;return Object.assign(n,e),n};class o{constructor(){ + this.rootNode=s(),this.stack=[this.rootNode]}get top(){ return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ - this.top.children.push(e)}openNode(e){const n=o({scope:e}) + this.top.children.push(e)}openNode(e){const n=s({scope:e}) ;this.add(n),this.stack.push(n)}closeNode(){ if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} @@ -35,104 +35,105 @@ return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n), n.children.forEach((n=>this._walk(e,n))),e.closeNode(n)),e}static _collapse(e){ "string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ - l._collapse(e)})))}}class c extends l{constructor(e){super(),this.options=e} - addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())} - addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root - ;t.sublanguage=!0,t.language=n,this.add(t)}toHTML(){ - return new s(this,this.options).value()}finalize(){return!0}}function d(e){ - return e?"string"==typeof e?e:e.source:null}function g(e){return m("(?=",e,")")} - function u(e){return m("(?:",e,")*")}function b(e){return m("(?:",e,")?")} - function m(...e){return e.map((e=>d(e))).join("")}function p(...e){const n=(e=>{ + o._collapse(e)})))}}class l extends o{constructor(e){super(),this.options=e} + addText(e){""!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){ + this.closeNode()}__addSublanguage(e,n){const t=e.root + ;n&&(t.scope="language:"+n),this.add(t)}toHTML(){ + return new r(this,this.options).value()}finalize(){ + return this.closeAllNodes(),!0}}function c(e){ + return e?"string"==typeof e?e:e.source:null}function d(e){return b("(?=",e,")")} + function g(e){return b("(?:",e,")*")}function u(e){return b("(?:",e,")?")} + function b(...e){return e.map((e=>c(e))).join("")}function m(...e){const n=(e=>{ const n=e[e.length-1] ;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} - })(e);return"("+(n.capture?"":"?:")+e.map((e=>d(e))).join("|")+")"} - function _(e){return RegExp(e.toString()+"|").exec("").length-1} - const h=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ - ;function f(e,{joinWith:n}){let t=0;return e.map((e=>{t+=1;const n=t - ;let a=d(e),i="";for(;a.length>0;){const e=h.exec(a);if(!e){i+=a;break} + })(e);return"("+(n.capture?"":"?:")+e.map((e=>c(e))).join("|")+")"} + function p(e){return RegExp(e.toString()+"|").exec("").length-1} + const _=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ + ;function h(e,{joinWith:n}){let t=0;return e.map((e=>{t+=1;const n=t + ;let a=c(e),i="";for(;a.length>0;){const e=_.exec(a);if(!e){i+=a;break} i+=a.substring(0,e.index), a=a.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?i+="\\"+(Number(e[1])+n):(i+=e[0], "("===e[0]&&t++)}return i})).map((e=>`(${e})`)).join(n)} - const E="[a-zA-Z]\\w*",y="[a-zA-Z_]\\w*",w="\\b\\d+(\\.\\d+)?",N="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",v="\\b(0b[01]+)",O={ - begin:"\\\\[\\s\\S]",relevance:0},k={scope:"string",begin:"'",end:"'", - illegal:"\\n",contains:[O]},x={scope:"string",begin:'"',end:'"',illegal:"\\n", - contains:[O]},M=(e,n,t={})=>{const a=i({scope:"comment",begin:e,end:n, - contains:[]},t);a.contains.push({scope:"doctag", + const f="[a-zA-Z]\\w*",E="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",N="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",w="\\b(0b[01]+)",v={ + begin:"\\\\[\\s\\S]",relevance:0},O={scope:"string",begin:"'",end:"'", + illegal:"\\n",contains:[v]},k={scope:"string",begin:'"',end:'"',illegal:"\\n", + contains:[v]},x=(e,n,t={})=>{const i=a({scope:"comment",begin:e,end:n, + contains:[]},t);i.contains.push({scope:"doctag", begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) - ;const r=p("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) - ;return a.contains.push({begin:m(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),a - },S=M("//","$"),A=M("/\\*","\\*/"),C=M("#","$");var T=Object.freeze({ - __proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:E,UNDERSCORE_IDENT_RE:y, - NUMBER_RE:w,C_NUMBER_RE:N,BINARY_NUMBER_RE:v, + ;const r=m("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) + ;return i.contains.push({begin:b(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i + },M=x("//","$"),S=x("/\\*","\\*/"),A=x("#","$");var C=Object.freeze({ + __proto__:null,APOS_STRING_MODE:O,BACKSLASH_ESCAPE:v,BINARY_NUMBER_MODE:{ + scope:"number",begin:w,relevance:0},BINARY_NUMBER_RE:w,COMMENT:x, + C_BLOCK_COMMENT_MODE:S,C_LINE_COMMENT_MODE:M,C_NUMBER_MODE:{scope:"number", + begin:N,relevance:0},C_NUMBER_RE:N,END_SAME_AS_BEGIN:e=>Object.assign(e,{ + "on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{ + n.data._beginMatch!==e[1]&&n.ignoreMatch()}}),HASH_COMMENT_MODE:A,IDENT_RE:f, + MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:{begin:"\\.\\s*"+E,relevance:0}, + NUMBER_MODE:{scope:"number",begin:y,relevance:0},NUMBER_RE:y, + PHRASAL_WORDS_MODE:{ + begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ + },QUOTE_STRING_MODE:k,REGEXP_MODE:{scope:"regexp",begin:/\/(?=[^/\n]*\/)/, + end:/\/[gimuy]*/,contains:[v,{begin:/\[/,end:/\]/,relevance:0,contains:[v]}]}, RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", SHEBANG:(e={})=>{const n=/^#![ ]*\// - ;return e.binary&&(e.begin=m(n,/.*\b/,e.binary,/\b.*/)),i({scope:"meta",begin:n, + ;return e.binary&&(e.begin=b(n,/.*\b/,e.binary,/\b.*/)),a({scope:"meta",begin:n, end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)}, - BACKSLASH_ESCAPE:O,APOS_STRING_MODE:k,QUOTE_STRING_MODE:x,PHRASAL_WORDS_MODE:{ - begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ - },COMMENT:M,C_LINE_COMMENT_MODE:S,C_BLOCK_COMMENT_MODE:A,HASH_COMMENT_MODE:C, - NUMBER_MODE:{scope:"number",begin:w,relevance:0},C_NUMBER_MODE:{scope:"number", - begin:N,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:v,relevance:0}, - REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//, - end:/\/[gimuy]*/,illegal:/\n/,contains:[O,{begin:/\[/,end:/\]/,relevance:0, - contains:[O]}]}]},TITLE_MODE:{scope:"title",begin:E,relevance:0}, - UNDERSCORE_TITLE_MODE:{scope:"title",begin:y,relevance:0},METHOD_GUARD:{ - begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ - "on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{ - n.data._beginMatch!==e[1]&&n.ignoreMatch()}})});function R(e,n){ - "."===e.input[e.index-1]&&n.ignoreMatch()}function D(e,n){ - void 0!==e.className&&(e.scope=e.className,delete e.className)}function I(e,n){ + TITLE_MODE:{scope:"title",begin:f,relevance:0},UNDERSCORE_IDENT_RE:E, + UNDERSCORE_TITLE_MODE:{scope:"title",begin:E,relevance:0}});function T(e,n){ + "."===e.input[e.index-1]&&n.ignoreMatch()}function R(e,n){ + void 0!==e.className&&(e.scope=e.className,delete e.className)}function D(e,n){ n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", - e.__beforeBegin=R,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, - void 0===e.relevance&&(e.relevance=0))}function L(e,n){ - Array.isArray(e.illegal)&&(e.illegal=p(...e.illegal))}function B(e,n){ + e.__beforeBegin=T,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, + void 0===e.relevance&&(e.relevance=0))}function I(e,n){ + Array.isArray(e.illegal)&&(e.illegal=m(...e.illegal))}function L(e,n){ if(e.match){ if(e.begin||e.end)throw Error("begin & end are not supported with match") - ;e.begin=e.match,delete e.match}}function $(e,n){ - void 0===e.relevance&&(e.relevance=1)}const z=(e,n)=>{if(!e.beforeMatch)return + ;e.begin=e.match,delete e.match}}function B(e,n){ + void 0===e.relevance&&(e.relevance=1)}const $=(e,n)=>{if(!e.beforeMatch)return ;if(e.starts)throw Error("beforeMatch cannot be used with starts") ;const t=Object.assign({},e);Object.keys(e).forEach((n=>{delete e[n] - })),e.keywords=t.keywords,e.begin=m(t.beforeMatch,g(t.begin)),e.starts={ + })),e.keywords=t.keywords,e.begin=b(t.beforeMatch,d(t.begin)),e.starts={ relevance:0,contains:[Object.assign(t,{endsParent:!0})] },e.relevance=0,delete t.beforeMatch - },F=["of","and","for","in","not","or","if","then","parent","list","value"] - ;function U(e,n,t="keyword"){const a=Object.create(null) + },z=["of","and","for","in","not","or","if","then","parent","list","value"],F="keyword" + ;function U(e,n,t=F){const a=Object.create(null) ;return"string"==typeof e?i(t,e.split(" ")):Array.isArray(e)?i(t,e):Object.keys(e).forEach((t=>{ Object.assign(a,U(e[t],n,t))})),a;function i(e,t){ n&&(t=t.map((e=>e.toLowerCase()))),t.forEach((n=>{const t=n.split("|") ;a[t[0]]=[e,j(t[0],t[1])]}))}}function j(e,n){ - return n?Number(n):(e=>F.includes(e.toLowerCase()))(e)?0:1}const P={},K=e=>{ + return n?Number(n):(e=>z.includes(e.toLowerCase()))(e)?0:1}const P={},K=e=>{ console.error(e)},H=(e,...n)=>{console.log("WARN: "+e,...n)},q=(e,n)=>{ P[`${e}/${n}`]||(console.log(`Deprecated as of ${e}. ${n}`),P[`${e}/${n}`]=!0) - },Z=Error();function G(e,n,{key:t}){let a=0;const i=e[t],r={},s={} - ;for(let e=1;e<=n.length;e++)s[e+a]=i[e],r[e+a]=!0,a+=_(n[e-1]) + },G=Error();function Z(e,n,{key:t}){let a=0;const i=e[t],r={},s={} + ;for(let e=1;e<=n.length;e++)s[e+a]=i[e],r[e+a]=!0,a+=p(n[e-1]) ;e[t]=s,e[t]._emit=r,e[t]._multi=!0}function W(e){(e=>{ e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ _wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope }),(e=>{if(Array.isArray(e.begin)){ if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), - Z + G ;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), - Z;G(e,e.begin,{key:"beginScope"}),e.begin=f(e.begin,{joinWith:""})}})(e),(e=>{ + G;Z(e,e.begin,{key:"beginScope"}),e.begin=h(e.begin,{joinWith:""})}})(e),(e=>{ if(Array.isArray(e.end)){ if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), - Z + G ;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), - Z;G(e,e.end,{key:"endScope"}),e.end=f(e.end,{joinWith:""})}})(e)}function Q(e){ + G;Z(e,e.end,{key:"endScope"}),e.end=h(e.end,{joinWith:""})}})(e)}function Q(e){ function n(n,t){ - return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(t?"g":"")) + return RegExp(c(n),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(t?"g":"")) }class t{constructor(){ this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} addRule(e,n){ n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]), - this.matchAt+=_(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) - ;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(f(e,{joinWith:"|" + this.matchAt+=p(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) + ;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(h(e,{joinWith:"|" }),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex ;const n=this.matcherRe.exec(e);if(!n)return null ;const t=n.findIndex(((e,n)=>n>0&&void 0!==e)),a=this.matchIndexes[t] - ;return n.splice(0,t),Object.assign(n,a)}}class a{constructor(){ + ;return n.splice(0,t),Object.assign(n,a)}}class i{constructor(){ this.rules=[],this.multiRegexes=[], this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t @@ -148,148 +149,150 @@ this.regexIndex===this.count&&this.considerAll()),t}} if(e.compilerExtensions||(e.compilerExtensions=[]), e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") - ;return e.classNameAliases=i(e.classNameAliases||{}),function t(r,s){const o=r + ;return e.classNameAliases=a(e.classNameAliases||{}),function t(r,s){const o=r ;if(r.isCompiled)return o - ;[D,B,W,z].forEach((e=>e(r,s))),e.compilerExtensions.forEach((e=>e(r,s))), - r.__beforeBegin=null,[I,L,$].forEach((e=>e(r,s))),r.isCompiled=!0;let l=null + ;[R,L,W,$].forEach((e=>e(r,s))),e.compilerExtensions.forEach((e=>e(r,s))), + r.__beforeBegin=null,[D,I,B].forEach((e=>e(r,s))),r.isCompiled=!0;let l=null ;return"object"==typeof r.keywords&&r.keywords.$pattern&&(r.keywords=Object.assign({},r.keywords), l=r.keywords.$pattern, delete r.keywords.$pattern),l=l||/\w+/,r.keywords&&(r.keywords=U(r.keywords,e.case_insensitive)), o.keywordPatternRe=n(l,!0), s&&(r.begin||(r.begin=/\B|\b/),o.beginRe=n(o.begin),r.end||r.endsWithParent||(r.end=/\B|\b/), r.end&&(o.endRe=n(o.end)), - o.terminatorEnd=d(o.end)||"",r.endsWithParent&&s.terminatorEnd&&(o.terminatorEnd+=(r.end?"|":"")+s.terminatorEnd)), + o.terminatorEnd=c(o.end)||"",r.endsWithParent&&s.terminatorEnd&&(o.terminatorEnd+=(r.end?"|":"")+s.terminatorEnd)), r.illegal&&(o.illegalRe=n(r.illegal)), - r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((n=>i(e,{ - variants:null},n)))),e.cachedVariants?e.cachedVariants:X(e)?i(e,{ - starts:e.starts?i(e.starts):null - }):Object.isFrozen(e)?i(e):e))("self"===e?r:e)))),r.contains.forEach((e=>{t(e,o) - })),r.starts&&t(r.starts,s),o.matcher=(e=>{const n=new a + r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((n=>a(e,{ + variants:null},n)))),e.cachedVariants?e.cachedVariants:X(e)?a(e,{ + starts:e.starts?a(e.starts):null + }):Object.isFrozen(e)?a(e):e))("self"===e?r:e)))),r.contains.forEach((e=>{t(e,o) + })),r.starts&&t(r.starts,s),o.matcher=(e=>{const n=new i ;return e.contains.forEach((e=>n.addRule(e.begin,{rule:e,type:"begin" }))),e.terminatorEnd&&n.addRule(e.terminatorEnd,{type:"end" }),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n})(o),o}(e)}function X(e){ return!!e&&(e.endsWithParent||X(e.starts))}class V extends Error{ constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}} - const J=a,Y=i,ee=Symbol("nomatch");var ne=(n=>{ + const J=t,Y=a,ee=Symbol("nomatch"),ne=t=>{ const a=Object.create(null),i=Object.create(null),r=[];let s=!0 - ;const o="Could not find the language '{}', did you forget to load/include a language module?",l={ - disableAutodetect:!0,name:"Plain text",contains:[]};let d={ + ;const o="Could not find the language '{}', did you forget to load/include a language module?",c={ + disableAutodetect:!0,name:"Plain text",contains:[]};let p={ ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", - cssSelector:"pre code",languages:null,__emitter:c};function _(e){ - return d.noHighlightRe.test(e)}function h(e,n,t){let a="",i="" + cssSelector:"pre code",languages:null,__emitter:l};function _(e){ + return p.noHighlightRe.test(e)}function h(e,n,t){let a="",i="" ;"object"==typeof n?(a=e, t=n.ignoreIllegals,i=n.language):(q("10.7.0","highlight(lang, code, ...args) has been deprecated."), q("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), i=e,a=n),void 0===t&&(t=!0);const r={code:a,language:i};x("before:highlight",r) ;const s=r.result?r.result:f(r.language,r.code,t) - ;return s.code=r.code,x("after:highlight",s),s}function f(e,n,i,r){ - const l=Object.create(null);function c(){if(!k.keywords)return void M.addText(S) - ;let e=0;k.keywordPatternRe.lastIndex=0;let n=k.keywordPatternRe.exec(S),t="" - ;for(;n;){t+=S.substring(e,n.index) - ;const i=w.case_insensitive?n[0].toLowerCase():n[0],r=(a=i,k.keywords[a]);if(r){ + ;return s.code=r.code,x("after:highlight",s),s}function f(e,t,i,r){ + const l=Object.create(null);function c(){if(!x.keywords)return void S.addText(A) + ;let e=0;x.keywordPatternRe.lastIndex=0;let n=x.keywordPatternRe.exec(A),t="" + ;for(;n;){t+=A.substring(e,n.index) + ;const i=w.case_insensitive?n[0].toLowerCase():n[0],r=(a=i,x.keywords[a]);if(r){ const[e,a]=r - ;if(M.addText(t),t="",l[i]=(l[i]||0)+1,l[i]<=7&&(A+=a),e.startsWith("_"))t+=n[0];else{ - const t=w.classNameAliases[e]||e;M.addKeyword(n[0],t)}}else t+=n[0] - ;e=k.keywordPatternRe.lastIndex,n=k.keywordPatternRe.exec(S)}var a - ;t+=S.substring(e),M.addText(t)}function g(){null!=k.subLanguage?(()=>{ - if(""===S)return;let e=null;if("string"==typeof k.subLanguage){ - if(!a[k.subLanguage])return void M.addText(S) - ;e=f(k.subLanguage,S,!0,x[k.subLanguage]),x[k.subLanguage]=e._top - }else e=E(S,k.subLanguage.length?k.subLanguage:null) - ;k.relevance>0&&(A+=e.relevance),M.addSublanguage(e._emitter,e.language) - })():c(),S=""}function u(e,n){let t=1;const a=n.length-1;for(;t<=a;){ - if(!e._emit[t]){t++;continue}const a=w.classNameAliases[e[t]]||e[t],i=n[t] - ;a?M.addKeyword(i,a):(S=i,c(),S=""),t++}}function b(e,n){ - return e.scope&&"string"==typeof e.scope&&M.openNode(w.classNameAliases[e.scope]||e.scope), - e.beginScope&&(e.beginScope._wrap?(M.addKeyword(S,w.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), - S=""):e.beginScope._multi&&(u(e.beginScope,n),S="")),k=Object.create(e,{parent:{ - value:k}}),k}function m(e,n,a){let i=((e,n)=>{const t=e&&e.exec(n) - ;return t&&0===t.index})(e.endRe,a);if(i){if(e["on:end"]){const a=new t(e) - ;e["on:end"](n,a),a.isMatchIgnored&&(i=!1)}if(i){ + ;if(S.addText(t),t="",l[i]=(l[i]||0)+1,l[i]<=7&&(C+=a),e.startsWith("_"))t+=n[0];else{ + const t=w.classNameAliases[e]||e;g(n[0],t)}}else t+=n[0] + ;e=x.keywordPatternRe.lastIndex,n=x.keywordPatternRe.exec(A)}var a + ;t+=A.substring(e),S.addText(t)}function d(){null!=x.subLanguage?(()=>{ + if(""===A)return;let e=null;if("string"==typeof x.subLanguage){ + if(!a[x.subLanguage])return void S.addText(A) + ;e=f(x.subLanguage,A,!0,M[x.subLanguage]),M[x.subLanguage]=e._top + }else e=E(A,x.subLanguage.length?x.subLanguage:null) + ;x.relevance>0&&(C+=e.relevance),S.__addSublanguage(e._emitter,e.language) + })():c(),A=""}function g(e,n){ + ""!==e&&(S.startScope(n),S.addText(e),S.endScope())}function u(e,n){let t=1 + ;const a=n.length-1;for(;t<=a;){if(!e._emit[t]){t++;continue} + const a=w.classNameAliases[e[t]]||e[t],i=n[t];a?g(i,a):(A=i,c(),A=""),t++}} + function b(e,n){ + return e.scope&&"string"==typeof e.scope&&S.openNode(w.classNameAliases[e.scope]||e.scope), + e.beginScope&&(e.beginScope._wrap?(g(A,w.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), + A=""):e.beginScope._multi&&(u(e.beginScope,n),A="")),x=Object.create(e,{parent:{ + value:x}}),x}function m(e,t,a){let i=((e,n)=>{const t=e&&e.exec(n) + ;return t&&0===t.index})(e.endRe,a);if(i){if(e["on:end"]){const a=new n(e) + ;e["on:end"](t,a),a.isMatchIgnored&&(i=!1)}if(i){ for(;e.endsParent&&e.parent;)e=e.parent;return e}} - if(e.endsWithParent)return m(e.parent,n,a)}function p(e){ - return 0===k.matcher.regexIndex?(S+=e[0],1):(R=!0,0)}function _(e){ - const t=e[0],a=n.substring(e.index),i=m(k,e,a);if(!i)return ee;const r=k - ;k.endScope&&k.endScope._wrap?(g(), - M.addKeyword(t,k.endScope._wrap)):k.endScope&&k.endScope._multi?(g(), - u(k.endScope,e)):r.skip?S+=t:(r.returnEnd||r.excludeEnd||(S+=t), - g(),r.excludeEnd&&(S=t));do{ - k.scope&&M.closeNode(),k.skip||k.subLanguage||(A+=k.relevance),k=k.parent - }while(k!==i.parent);return i.starts&&b(i.starts,e),r.returnEnd?0:t.length} - let h={};function y(a,r){const o=r&&r[0];if(S+=a,null==o)return g(),0 - ;if("begin"===h.type&&"end"===r.type&&h.index===r.index&&""===o){ - if(S+=n.slice(r.index,r.index+1),!s){const n=Error(`0 width match regex (${e})`) - ;throw n.languageName=e,n.badRule=h.rule,n}return 1} - if(h=r,"begin"===r.type)return(e=>{ - const n=e[0],a=e.rule,i=new t(a),r=[a.__beforeBegin,a["on:begin"]] - ;for(const t of r)if(t&&(t(e,i),i.isMatchIgnored))return p(n) - ;return a.skip?S+=n:(a.excludeBegin&&(S+=n), - g(),a.returnBegin||a.excludeBegin||(S=n)),b(a,e),a.returnBegin?0:n.length})(r) + if(e.endsWithParent)return m(e.parent,t,a)}function _(e){ + return 0===x.matcher.regexIndex?(A+=e[0],1):(D=!0,0)}function h(e){ + const n=e[0],a=t.substring(e.index),i=m(x,e,a);if(!i)return ee;const r=x + ;x.endScope&&x.endScope._wrap?(d(), + g(n,x.endScope._wrap)):x.endScope&&x.endScope._multi?(d(), + u(x.endScope,e)):r.skip?A+=n:(r.returnEnd||r.excludeEnd||(A+=n), + d(),r.excludeEnd&&(A=n));do{ + x.scope&&S.closeNode(),x.skip||x.subLanguage||(C+=x.relevance),x=x.parent + }while(x!==i.parent);return i.starts&&b(i.starts,e),r.returnEnd?0:n.length} + let y={};function N(a,r){const o=r&&r[0];if(A+=a,null==o)return d(),0 + ;if("begin"===y.type&&"end"===r.type&&y.index===r.index&&""===o){ + if(A+=t.slice(r.index,r.index+1),!s){const n=Error(`0 width match regex (${e})`) + ;throw n.languageName=e,n.badRule=y.rule,n}return 1} + if(y=r,"begin"===r.type)return(e=>{ + const t=e[0],a=e.rule,i=new n(a),r=[a.__beforeBegin,a["on:begin"]] + ;for(const n of r)if(n&&(n(e,i),i.isMatchIgnored))return _(t) + ;return a.skip?A+=t:(a.excludeBegin&&(A+=t), + d(),a.returnBegin||a.excludeBegin||(A=t)),b(a,e),a.returnBegin?0:t.length})(r) ;if("illegal"===r.type&&!i){ - const e=Error('Illegal lexeme "'+o+'" for mode "'+(k.scope||"")+'"') - ;throw e.mode=k,e}if("end"===r.type){const e=_(r);if(e!==ee)return e} + const e=Error('Illegal lexeme "'+o+'" for mode "'+(x.scope||"")+'"') + ;throw e.mode=x,e}if("end"===r.type){const e=h(r);if(e!==ee)return e} if("illegal"===r.type&&""===o)return 1 - ;if(T>1e5&&T>3*r.index)throw Error("potential infinite loop, way more iterations than matches") - ;return S+=o,o.length}const w=v(e) + ;if(R>1e5&&R>3*r.index)throw Error("potential infinite loop, way more iterations than matches") + ;return A+=o,o.length}const w=v(e) ;if(!w)throw K(o.replace("{}",e)),Error('Unknown language: "'+e+'"') - ;const N=Q(w);let O="",k=r||N;const x={},M=new d.__emitter(d);(()=>{const e=[] - ;for(let n=k;n!==w;n=n.parent)n.scope&&e.unshift(n.scope) - ;e.forEach((e=>M.openNode(e)))})();let S="",A=0,C=0,T=0,R=!1;try{ - for(k.matcher.considerAll();;){ - T++,R?R=!1:k.matcher.considerAll(),k.matcher.lastIndex=C - ;const e=k.matcher.exec(n);if(!e)break;const t=y(n.substring(C,e.index),e) - ;C=e.index+t} - return y(n.substring(C)),M.closeAllNodes(),M.finalize(),O=M.toHTML(),{ - language:e,value:O,relevance:A,illegal:!1,_emitter:M,_top:k}}catch(t){ - if(t.message&&t.message.includes("Illegal"))return{language:e,value:J(n), - illegal:!0,relevance:0,_illegalBy:{message:t.message,index:C, - context:n.slice(C-100,C+100),mode:t.mode,resultSoFar:O},_emitter:M};if(s)return{ - language:e,value:J(n),illegal:!1,relevance:0,errorRaised:t,_emitter:M,_top:k} - ;throw t}}function E(e,n){n=n||d.languages||Object.keys(a);const t=(e=>{ - const n={value:J(e),illegal:!1,relevance:0,_top:l,_emitter:new d.__emitter(d)} + ;const O=Q(w);let k="",x=r||O;const M={},S=new p.__emitter(p);(()=>{const e=[] + ;for(let n=x;n!==w;n=n.parent)n.scope&&e.unshift(n.scope) + ;e.forEach((e=>S.openNode(e)))})();let A="",C=0,T=0,R=0,D=!1;try{ + if(w.__emitTokens)w.__emitTokens(t,S);else{for(x.matcher.considerAll();;){ + R++,D?D=!1:x.matcher.considerAll(),x.matcher.lastIndex=T + ;const e=x.matcher.exec(t);if(!e)break;const n=N(t.substring(T,e.index),e) + ;T=e.index+n}N(t.substring(T))}return S.finalize(),k=S.toHTML(),{language:e, + value:k,relevance:C,illegal:!1,_emitter:S,_top:x}}catch(n){ + if(n.message&&n.message.includes("Illegal"))return{language:e,value:J(t), + illegal:!0,relevance:0,_illegalBy:{message:n.message,index:T, + context:t.slice(T-100,T+100),mode:n.mode,resultSoFar:k},_emitter:S};if(s)return{ + language:e,value:J(t),illegal:!1,relevance:0,errorRaised:n,_emitter:S,_top:x} + ;throw n}}function E(e,n){n=n||p.languages||Object.keys(a);const t=(e=>{ + const n={value:J(e),illegal:!1,relevance:0,_top:c,_emitter:new p.__emitter(p)} ;return n._emitter.addText(e),n})(e),i=n.filter(v).filter(k).map((n=>f(n,e,!1))) ;i.unshift(t);const r=i.sort(((e,n)=>{ if(e.relevance!==n.relevance)return n.relevance-e.relevance ;if(e.language&&n.language){if(v(e.language).supersetOf===n.language)return 1 - ;if(v(n.language).supersetOf===e.language)return-1}return 0})),[s,o]=r,c=s - ;return c.secondBest=o,c}function y(e){let n=null;const t=(e=>{ + ;if(v(n.language).supersetOf===e.language)return-1}return 0})),[s,o]=r,l=s + ;return l.secondBest=o,l}function y(e){let n=null;const t=(e=>{ let n=e.className+" ";n+=e.parentNode?e.parentNode.className:"" - ;const t=d.languageDetectRe.exec(n);if(t){const n=v(t[1]) + ;const t=p.languageDetectRe.exec(n);if(t){const n=v(t[1]) ;return n||(H(o.replace("{}",t[1])), H("Falling back to no-highlight mode for this block.",e)),n?t[1]:"no-highlight"} return n.split(/\s+/).find((e=>_(e)||v(e)))})(e);if(_(t))return ;if(x("before:highlightElement",{el:e,language:t - }),e.children.length>0&&(d.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), + }),e.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e) + ;if(e.children.length>0&&(p.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), console.warn("The element with unescaped HTML:"), - console.warn(e)),d.throwUnescapedHTML))throw new V("One of your code blocks includes unescaped HTML.",e.innerHTML) + console.warn(e)),p.throwUnescapedHTML))throw new V("One of your code blocks includes unescaped HTML.",e.innerHTML) ;n=e;const a=n.textContent,r=t?h(a,{language:t,ignoreIllegals:!0}):E(a) - ;e.innerHTML=r.value,((e,n,t)=>{const a=n&&i[n]||t + ;e.innerHTML=r.value,e.dataset.highlighted="yes",((e,n,t)=>{const a=n&&i[n]||t ;e.classList.add("hljs"),e.classList.add("language-"+a) })(e,t,r.language),e.result={language:r.language,re:r.relevance, relevance:r.relevance},r.secondBest&&(e.secondBest={ language:r.secondBest.language,relevance:r.secondBest.relevance - }),x("after:highlightElement",{el:e,result:r,text:a})}let w=!1;function N(){ - "loading"!==document.readyState?document.querySelectorAll(d.cssSelector).forEach(y):w=!0 + }),x("after:highlightElement",{el:e,result:r,text:a})}let N=!1;function w(){ + "loading"!==document.readyState?document.querySelectorAll(p.cssSelector).forEach(y):N=!0 }function v(e){return e=(e||"").toLowerCase(),a[e]||a[i[e]]} function O(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ i[e.toLowerCase()]=n}))}function k(e){const n=v(e) ;return n&&!n.disableAutodetect}function x(e,n){const t=e;r.forEach((e=>{ e[t]&&e[t](n)}))} "undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ - w&&N()}),!1),Object.assign(n,{highlight:h,highlightAuto:E,highlightAll:N, + N&&w()}),!1),Object.assign(t,{highlight:h,highlightAuto:E,highlightAll:w, highlightElement:y, highlightBlock:e=>(q("10.7.0","highlightBlock will be removed entirely in v12.0"), - q("10.7.0","Please use highlightElement now."),y(e)),configure:e=>{d=Y(d,e)}, + q("10.7.0","Please use highlightElement now."),y(e)),configure:e=>{p=Y(p,e)}, initHighlighting:()=>{ - N(),q("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, + w(),q("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, initHighlightingOnLoad:()=>{ - N(),q("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") - },registerLanguage:(e,t)=>{let i=null;try{i=t(n)}catch(n){ + w(),q("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") + },registerLanguage:(e,n)=>{let i=null;try{i=n(t)}catch(n){ if(K("Language definition for '{}' could not be registered.".replace("{}",e)), - !s)throw n;K(n),i=l} - i.name||(i.name=e),a[e]=i,i.rawDefinition=t.bind(null,n),i.aliases&&O(i.aliases,{ + !s)throw n;K(n),i=c} + i.name||(i.name=e),a[e]=i,i.rawDefinition=n.bind(null,t),i.aliases&&O(i.aliases,{ languageName:e})},unregisterLanguage:e=>{delete a[e] ;for(const n of Object.keys(i))i[n]===e&&delete i[n]}, listLanguages:()=>Object.keys(a),getLanguage:v,registerAliases:O, @@ -297,31 +300,32 @@ e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=n=>{ e["before:highlightBlock"](Object.assign({block:n.el},n)) }),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=n=>{ - e["after:highlightBlock"](Object.assign({block:n.el},n))})})(e),r.push(e)} - }),n.debugMode=()=>{s=!1},n.safeMode=()=>{s=!0 - },n.versionString="11.7.0",n.regex={concat:m,lookahead:g,either:p,optional:b, - anyNumberOfTimes:u};for(const n in T)"object"==typeof T[n]&&e.exports(T[n]) - ;return Object.assign(n,T),n})({});const te=e=>({IMPORTANT:{scope:"meta", - begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{ + e["after:highlightBlock"](Object.assign({block:n.el},n))})})(e),r.push(e)}, + removePlugin:e=>{const n=r.indexOf(e);-1!==n&&r.splice(n,1)}}),t.debugMode=()=>{ + s=!1},t.safeMode=()=>{s=!0},t.versionString="11.9.0",t.regex={concat:b, + lookahead:d,either:m,optional:u,anyNumberOfTimes:g} + ;for(const n in C)"object"==typeof C[n]&&e(C[n]);return Object.assign(t,C),t + },te=ne({});te.newInstance=()=>ne({});var ae=te;const ie=e=>({IMPORTANT:{ + scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{ scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/}, FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/}, ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ scope:"number", begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", - relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z][A-Za-z0-9_-]*/} - }),ae=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],ie=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],re=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],se=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],oe=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse(),le=re.concat(se) - ;var ce="\\.([0-9](_*[0-9])*)",de="[0-9a-fA-F](_*[0-9a-fA-F])*",ge={ + relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/} + }),re=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],se=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],oe=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],le=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],ce=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse(),de=oe.concat(le) + ;var ge="[0-9](_*[0-9])*",ue=`\\.(${ge})`,be="[0-9a-fA-F](_*[0-9a-fA-F])*",me={ className:"number",variants:[{ - begin:`(\\b([0-9](_*[0-9])*)((${ce})|\\.)?|(${ce}))[eE][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` - },{begin:`\\b([0-9](_*[0-9])*)((${ce})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ - begin:`(${ce})[fFdD]?\\b`},{begin:"\\b([0-9](_*[0-9])*)[fFdD]\\b"},{ - begin:`\\b0[xX]((${de})\\.?|(${de})?\\.(${de}))[pP][+-]?([0-9](_*[0-9])*)[fFdD]?\\b` - },{begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${de})[lL]?\\b`},{ + begin:`(\\b(${ge})((${ue})|\\.)?|(${ue}))[eE][+-]?(${ge})[fFdD]?\\b`},{ + begin:`\\b(${ge})((${ue})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ + begin:`(${ue})[fFdD]?\\b`},{begin:`\\b(${ge})[fFdD]\\b`},{ + begin:`\\b0[xX]((${be})\\.?|(${be})?\\.(${be}))[pP][+-]?(${ge})[fFdD]?\\b`},{ + begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${be})[lL]?\\b`},{ begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], - relevance:0};function ue(e,n,t){return-1===t?"":e.replace(n,(a=>ue(e,n,t-1)))} - const be="[A-Za-z$_][0-9A-Za-z$_]*",me=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],pe=["true","false","null","undefined","NaN","Infinity"],_e=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],he=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],fe=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],Ee=["arguments","this","super","console","window","document","localStorage","module","global"],ye=[].concat(fe,_e,he) - ;function we(e){const n=e.regex,t=be,a={begin:/<[A-Za-z0-9\\._:-]+/, + relevance:0};function pe(e,n,t){return-1===t?"":e.replace(n,(a=>pe(e,n,t-1)))} + const _e="[A-Za-z$_][0-9A-Za-z$_]*",he=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],fe=["true","false","null","undefined","NaN","Infinity"],Ee=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],ye=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],Ne=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],we=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],ve=[].concat(Ne,Ee,ye) + ;function Oe(e){const n=e.regex,t=_e,a={begin:/<[A-Za-z0-9\\._:-]+/, end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ const t=e[0].length+e.index,a=e.input[t] ;if("<"===a||","===a)return void n.ignoreMatch();let i @@ -329,74 +333,76 @@ ;return-1!==e.input.indexOf(t,n)})(e,{after:t})||n.ignoreMatch()) ;const r=e.input.substring(t) ;((i=r.match(/^\s*=/))||(i=r.match(/^\s+extends\s+/))&&0===i.index)&&n.ignoreMatch() - }},i={$pattern:be,keyword:me,literal:pe,built_in:ye,"variable.language":Ee - },r="\\.([0-9](_?[0-9])*)",s="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",o={ + }},i={$pattern:_e,keyword:he,literal:fe,built_in:ve,"variable.language":we + },r="[0-9](_?[0-9])*",s=`\\.(${r})`,o="0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*",l={ className:"number",variants:[{ - begin:`(\\b(${s})((${r})|\\.)?|(${r}))[eE][+-]?([0-9](_?[0-9])*)\\b`},{ - begin:`\\b(${s})\\b((${r})\\b|\\.)?|(${r})\\b`},{ + begin:`(\\b(${o})((${s})|\\.)?|(${s}))[eE][+-]?(${r})\\b`},{ + begin:`\\b(${o})\\b((${s})\\b|\\.)?|(${s})\\b`},{ begin:"\\b(0|[1-9](_?[0-9])*)n\\b"},{ begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b"},{ begin:"\\b0[bB][0-1](_?[0-1])*n?\\b"},{begin:"\\b0[oO][0-7](_?[0-7])*n?\\b"},{ - begin:"\\b0[0-7]+n?\\b"}],relevance:0},l={className:"subst",begin:"\\$\\{", - end:"\\}",keywords:i,contains:[]},c={begin:"html`",end:"",starts:{end:"`", - returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,l],subLanguage:"xml"}},d={ + begin:"\\b0[0-7]+n?\\b"}],relevance:0},c={className:"subst",begin:"\\$\\{", + end:"\\}",keywords:i,contains:[]},d={begin:"html`",end:"",starts:{end:"`", + returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,c],subLanguage:"xml"}},g={ begin:"css`",end:"",starts:{end:"`",returnEnd:!1, - contains:[e.BACKSLASH_ESCAPE,l],subLanguage:"css"}},g={className:"string", - begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,l]},u={className:"comment", + contains:[e.BACKSLASH_ESCAPE,c],subLanguage:"css"}},u={begin:"gql`",end:"", + starts:{end:"`",returnEnd:!1,contains:[e.BACKSLASH_ESCAPE,c], + subLanguage:"graphql"}},b={className:"string",begin:"`",end:"`", + contains:[e.BACKSLASH_ESCAPE,c]},m={className:"comment", variants:[e.COMMENT(/\/\*\*(?!\/)/,"\\*/",{relevance:0,contains:[{ begin:"(?=@[A-Za-z]+)",relevance:0,contains:[{className:"doctag", begin:"@[A-Za-z]+"},{className:"type",begin:"\\{",end:"\\}",excludeEnd:!0, excludeBegin:!0,relevance:0},{className:"variable",begin:t+"(?=\\s*(-)|$)", endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}] }),e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE] - },b=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,c,d,g,{match:/\$\d+/},o] - ;l.contains=b.concat({begin:/\{/,end:/\}/,keywords:i,contains:["self"].concat(b) - });const m=[].concat(u,l.contains),p=m.concat([{begin:/\(/,end:/\)/,keywords:i, - contains:["self"].concat(m)}]),_={className:"params",begin:/\(/,end:/\)/, - excludeBegin:!0,excludeEnd:!0,keywords:i,contains:p},h={variants:[{ + },p=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,g,u,b,{match:/\$\d+/},l] + ;c.contains=p.concat({begin:/\{/,end:/\}/,keywords:i,contains:["self"].concat(p) + });const _=[].concat(m,c.contains),h=_.concat([{begin:/\(/,end:/\)/,keywords:i, + contains:["self"].concat(_)}]),f={className:"params",begin:/\(/,end:/\)/, + excludeBegin:!0,excludeEnd:!0,keywords:i,contains:h},E={variants:[{ match:[/class/,/\s+/,t,/\s+/,/extends/,/\s+/,n.concat(t,"(",n.concat(/\./,t),")*")], scope:{1:"keyword",3:"title.class",5:"keyword",7:"title.class.inherited"}},{ - match:[/class/,/\s+/,t],scope:{1:"keyword",3:"title.class"}}]},f={relevance:0, + match:[/class/,/\s+/,t],scope:{1:"keyword",3:"title.class"}}]},y={relevance:0, match:n.either(/\bJSON/,/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/), - className:"title.class",keywords:{_:[..._e,...he]}},E={variants:[{ + className:"title.class",keywords:{_:[...Ee,...ye]}},N={variants:[{ match:[/function/,/\s+/,t,/(?=\s*\()/]},{match:[/function/,/\s*(?=\()/]}], - className:{1:"keyword",3:"title.function"},label:"func.def",contains:[_], - illegal:/%/},y={ - match:n.concat(/\b/,(w=[...fe,"super","import"],n.concat("(?!",w.join("|"),")")),t,n.lookahead(/\(/)), - className:"title.function",relevance:0};var w;const N={ + className:{1:"keyword",3:"title.function"},label:"func.def",contains:[f], + illegal:/%/},w={ + match:n.concat(/\b/,(v=[...Ne,"super","import"],n.concat("(?!",v.join("|"),")")),t,n.lookahead(/\(/)), + className:"title.function",relevance:0};var v;const O={ begin:n.concat(/\./,n.lookahead(n.concat(t,/(?![0-9A-Za-z$_(])/))),end:t, - excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},v={ + excludeBegin:!0,keywords:"prototype",className:"property",relevance:0},k={ match:[/get|set/,/\s+/,t,/(?=\()/],className:{1:"keyword",3:"title.function"}, - contains:[{begin:/\(\)/},_] - },O="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",k={ - match:[/const|var|let/,/\s+/,t,/\s*/,/=\s*/,/(async\s*)?/,n.lookahead(O)], - keywords:"async",className:{1:"keyword",3:"title.function"},contains:[_]} - ;return{name:"Javascript",aliases:["js","jsx","mjs","cjs"],keywords:i,exports:{ - PARAMS_CONTAINS:p,CLASS_REFERENCE:f},illegal:/#(?![$_A-z])/, + contains:[{begin:/\(\)/},f] + },x="(\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)|"+e.UNDERSCORE_IDENT_RE+")\\s*=>",M={ + match:[/const|var|let/,/\s+/,t,/\s*/,/=\s*/,/(async\s*)?/,n.lookahead(x)], + keywords:"async",className:{1:"keyword",3:"title.function"},contains:[f]} + ;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:i,exports:{ + PARAMS_CONTAINS:h,CLASS_REFERENCE:y},illegal:/#(?![$_A-z])/, contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),{ label:"use_strict",className:"meta",relevance:10, begin:/^\s*['"]use (strict|asm)['"]/ - },e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,c,d,g,u,{match:/\$\d+/},o,f,{ - className:"attr",begin:t+n.lookahead(":"),relevance:0},k,{ + },e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,g,u,b,m,{match:/\$\d+/},l,y,{ + className:"attr",begin:t+n.lookahead(":"),relevance:0},M,{ begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", - keywords:"return throw case",relevance:0,contains:[u,e.REGEXP_MODE,{ - className:"function",begin:O,returnBegin:!0,end:"\\s*=>",contains:[{ + keywords:"return throw case",relevance:0,contains:[m,e.REGEXP_MODE,{ + className:"function",begin:x,returnBegin:!0,end:"\\s*=>",contains:[{ className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{ className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0, - excludeEnd:!0,keywords:i,contains:p}]}]},{begin:/,/,relevance:0},{match:/\s+/, + excludeEnd:!0,keywords:i,contains:h}]}]},{begin:/,/,relevance:0},{match:/\s+/, relevance:0},{variants:[{begin:"<>",end:""},{ match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:a.begin, "on:begin":a.isTrulyOpeningTag,end:a.end}],subLanguage:"xml",contains:[{ - begin:a.begin,end:a.end,skip:!0,contains:["self"]}]}]},E,{ + begin:a.begin,end:a.end,skip:!0,contains:["self"]}]}]},N,{ beginKeywords:"while if switch catch for"},{ begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", - returnBegin:!0,label:"func.def",contains:[_,e.inherit(e.TITLE_MODE,{begin:t, - className:"title.function"})]},{match:/\.\.\./,relevance:0},N,{match:"\\$"+t, + returnBegin:!0,label:"func.def",contains:[f,e.inherit(e.TITLE_MODE,{begin:t, + className:"title.function"})]},{match:/\.\.\./,relevance:0},O,{match:"\\$"+t, relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, - contains:[_]},y,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, - className:"variable.constant"},h,v,{match:/\$[(.]/}]}} - const Ne=e=>m(/\b/,e,/\w$/.test(e)?/\b/:/\B/),ve=["Protocol","Type"].map(Ne),Oe=["init","self"].map(Ne),ke=["Any","Self"],xe=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","distributed","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],Me=["false","nil","true"],Se=["assignment","associativity","higherThan","left","lowerThan","none","right"],Ae=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],Ce=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],Te=p(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),Re=p(Te,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),De=m(Te,Re,"*"),Ie=p(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),Le=p(Ie,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),Be=m(Ie,Le,"*"),$e=m(/[A-Z]/,Le,"*"),ze=["autoclosure",m(/convention\(/,p("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",m(/objc\(/,Be,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","testable","UIApplicationMain","unknown","usableFromInline"],Fe=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] - ;var Ue=Object.freeze({__proto__:null,grmr_bash:e=>{const n=e.regex,t={},a={ + contains:[f]},w,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, + className:"variable.constant"},E,k,{match:/\$[(.]/}]}} + const ke=e=>b(/\b/,e,/\w$/.test(e)?/\b/:/\B/),xe=["Protocol","Type"].map(ke),Me=["init","self"].map(ke),Se=["Any","Self"],Ae=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","borrowing","break","case","catch","class","consume","consuming","continue","convenience","copy","default","defer","deinit","didSet","distributed","do","dynamic","each","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","macro","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],Ce=["false","nil","true"],Te=["assignment","associativity","higherThan","left","lowerThan","none","right"],Re=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning"],De=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],Ie=m(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),Le=m(Ie,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),Be=b(Ie,Le,"*"),$e=m(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),ze=m($e,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),Fe=b($e,ze,"*"),Ue=b(/[A-Z]/,ze,"*"),je=["attached","autoclosure",b(/convention\(/,m("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","freestanding","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",b(/objc\(/,Fe,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","Sendable","testable","UIApplicationMain","unchecked","unknown","usableFromInline","warn_unqualified_access"],Pe=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] + ;var Ke=Object.freeze({__proto__:null,grmr_bash:e=>{const n=e.regex,t={},a={ begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]} ;Object.assign(t,{className:"variable",variants:[{ begin:n.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},a]});const i={ @@ -409,92 +415,91 @@ }),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/, - keyword:["if","then","else","elif","fi","for","while","in","do","done","case","esac","function"], + keyword:["if","then","else","elif","fi","for","while","until","in","do","done","case","esac","function","select"], literal:["true","false"], built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"] },contains:[l,e.SHEBANG(),c,o,e.HASH_COMMENT_MODE,r,{match:/(\/[a-z._-]+)+/},s,{ - className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},t]}}, + match:/\\"/},{className:"string",begin:/'/,end:/'/},{match:/\\'/},t]}}, grmr_c:e=>{const n=e.regex,t=e.COMMENT("//","$",{contains:[{begin:/\\\n/}] - }),a="[a-zA-Z_]\\w*::",i="(decltype\\(auto\\)|"+n.optional(a)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",r={ + }),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",r="("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",s={ className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{ - match:/\batomic_[a-z]{3,6}\b/}]},s={className:"string",variants:[{ + match:/\batomic_[a-z]{3,6}\b/}]},o={className:"string",variants:[{ begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ - begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ + begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ className:"number",variants:[{begin:"\\b(0b[01']+)"},{ begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" },{ begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" - }],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ + }],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" - },contains:[{begin:/\\\n/,relevance:0},e.inherit(s,{className:"string"}),{ - className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},c={ - className:"title",begin:n.optional(a)+e.IDENT_RE,relevance:0 - },d=n.optional(a)+e.IDENT_RE+"\\s*\\(",g={ + },contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ + className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ + className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 + },g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"], type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary"], literal:"true false NULL", built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" - },u=[l,r,t,e.C_BLOCK_COMMENT_MODE,o,s],b={variants:[{begin:/=/,end:/;/},{ + },b=[c,s,t,e.C_BLOCK_COMMENT_MODE,l,o],m={variants:[{begin:/=/,end:/;/},{ begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], - keywords:g,contains:u.concat([{begin:/\(/,end:/\)/,keywords:g, - contains:u.concat(["self"]),relevance:0}]),relevance:0},m={ - begin:"("+i+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, - keywords:g,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:"decltype\\(auto\\)", - keywords:g,relevance:0},{begin:d,returnBegin:!0,contains:[e.inherit(c,{ - className:"title.function"})],relevance:0},{relevance:0,match:/,/},{ - className:"params",begin:/\(/,end:/\)/,keywords:g,relevance:0, - contains:[t,e.C_BLOCK_COMMENT_MODE,s,o,r,{begin:/\(/,end:/\)/,keywords:g, - relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,s,o,r]}] - },r,t,e.C_BLOCK_COMMENT_MODE,l]};return{name:"C",aliases:["h"],keywords:g, - disableAutodetect:!0,illegal:".]/,contains:[{begin:a,keywords:u,relevance:0},{ + begin:g,returnBegin:!0,contains:[e.inherit(d,{className:"title.function"})], + relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/, + keywords:u,relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/, + end:/\)/,keywords:u,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,s] + }]},s,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u, + disableAutodetect:!0,illegal:"=]/,contains:[{ - beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:l, - strings:s,keywords:g}}},grmr_cpp:e=>{const n=e.regex,t=e.COMMENT("//","$",{ + beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:c, + strings:o,keywords:u}}},grmr_cpp:e=>{const n=e.regex,t=e.COMMENT("//","$",{ contains:[{begin:/\\\n/}] - }),a="[a-zA-Z_]\\w*::",i="(?!struct)(decltype\\(auto\\)|"+n.optional(a)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",r={ - className:"type",begin:"\\b[a-z\\d_]*_t\\b"},s={className:"string",variants:[{ + }),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",r="(?!struct)("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",s={ + className:"type",begin:"\\b[a-z\\d_]*_t\\b"},o={className:"string",variants:[{ begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ - begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},o={ + begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ className:"number",variants:[{begin:"\\b(0b[01']+)"},{ begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" },{ begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" - }],relevance:0},l={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ + }],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" - },contains:[{begin:/\\\n/,relevance:0},e.inherit(s,{className:"string"}),{ - className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},c={ - className:"title",begin:n.optional(a)+e.IDENT_RE,relevance:0 - },d=n.optional(a)+e.IDENT_RE+"\\s*\\(",g={ + },contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ + className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ + className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 + },g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"], keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"], literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"], _type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"] - },u={className:"function.dispatch",relevance:0,keywords:{ + },b={className:"function.dispatch",relevance:0,keywords:{ _hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"] }, begin:n.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,n.lookahead(/(<[^<>]+>|)\s*\(/)) - },b=[u,l,r,t,e.C_BLOCK_COMMENT_MODE,o,s],m={variants:[{begin:/=/,end:/;/},{ + },m=[b,c,s,t,e.C_BLOCK_COMMENT_MODE,l,o],p={variants:[{begin:/=/,end:/;/},{ begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], - keywords:g,contains:b.concat([{begin:/\(/,end:/\)/,keywords:g, - contains:b.concat(["self"]),relevance:0}]),relevance:0},p={className:"function", - begin:"("+i+"[\\*&\\s]+)+"+d,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, - keywords:g,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:"decltype\\(auto\\)", - keywords:g,relevance:0},{begin:d,returnBegin:!0,contains:[c],relevance:0},{ - begin:/::/,relevance:0},{begin:/:/,endsWithParent:!0,contains:[s,o]},{ - relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/,keywords:g, - relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,s,o,r,{begin:/\(/,end:/\)/, - keywords:g,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,s,o,r]}] - },r,t,e.C_BLOCK_COMMENT_MODE,l]};return{name:"C++", - aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:g,illegal:".]/,contains:[{begin:a,keywords:u,relevance:0},{ + begin:g,returnBegin:!0,contains:[d],relevance:0},{begin:/::/,relevance:0},{ + begin:/:/,endsWithParent:!0,contains:[o,l]},{relevance:0,match:/,/},{ + className:"params",begin:/\(/,end:/\)/,keywords:u,relevance:0, + contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/,end:/\)/,keywords:u, + relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,s]}] + },s,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C++", + aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:u,illegal:"",keywords:g,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:g},{ + end:">",keywords:u,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:u},{ match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/], className:{1:"keyword",3:"title.class"}}])}},grmr_csharp:e=>{const n={ keyword:["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]), @@ -541,15 +546,15 @@ begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, contains:[g,a,e.C_BLOCK_COMMENT_MODE] },e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},m]}},grmr_css:e=>{ - const n=e.regex,t=te(e),a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{ + const n=e.regex,t=ie(e),a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{ name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{ keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"}, contains:[t.BLOCK_COMMENT,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ },t.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 },{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 },t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ - begin:":("+re.join("|")+")"},{begin:":(:)?("+se.join("|")+")"}] - },t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+oe.join("|")+")\\b"},{ + begin:":("+oe.join("|")+")"},{begin:":(:)?("+le.join("|")+")"}] + },t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+ce.join("|")+")\\b"},{ begin:/:/,end:/[;}{]/, contains:[t.BLOCK_COMMENT,t.HEXCOLOR,t.IMPORTANT,t.CSS_NUMBER_MODE,...a,{ begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" @@ -557,9 +562,9 @@ excludeEnd:!0}]},t.FUNCTION_DISPATCH]},{begin:n.lookahead(/@/),end:"[{;]", relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/ },{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{ - $pattern:/[a-z-]+/,keyword:"and or not only",attribute:ie.join(" ")},contains:[{ + $pattern:/[a-z-]+/,keyword:"and or not only",attribute:se.join(" ")},contains:[{ begin:/[a-z-]+(?=:)/,className:"attribute"},...a,t.CSS_NUMBER_MODE]}]},{ - className:"selector-tag",begin:"\\b("+ae.join("|")+")\\b"}]}},grmr_diff:e=>{ + className:"selector-tag",begin:"\\b("+re.join("|")+")\\b"}]}},grmr_diff:e=>{ const n=e.regex;return{name:"Diff",aliases:["patch"],contains:[{ className:"meta",relevance:10, match:n.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/) @@ -602,7 +607,7 @@ contains:[a,{className:"section",begin:/\[+/,end:/\]+/},{ begin:n.concat(l,"(\\s*\\.\\s*",l,")*",n.lookahead(/\s*=\s*[^#\s]/)), className:"attr",starts:{end:/$/,contains:[a,o,r,i,s,t]}}]}},grmr_java:e=>{ - const n=e.regex,t="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",a=t+ue("(?:<"+t+"~~~(?:\\s*,\\s*"+t+"~~~)*>)?",/~~~/g,2),i={ + const n=e.regex,t="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",a=t+pe("(?:<"+t+"~~~(?:\\s*,\\s*"+t+"~~~)*>)?",/~~~/g,2),i={ keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits"], literal:["false","true","null"], type:["char","boolean","long","float","int","byte","short","double"], @@ -625,8 +630,8 @@ begin:["(?:"+a+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{ 2:"title.function"},keywords:i,contains:[{className:"params",begin:/\(/, end:/\)/,keywords:i,relevance:0, - contains:[r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,ge,e.C_BLOCK_COMMENT_MODE] - },e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},ge,r]}},grmr_javascript:we, + contains:[r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,me,e.C_BLOCK_COMMENT_MODE] + },e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},me,r]}},grmr_javascript:Oe, grmr_json:e=>{const n=["true","false","null"],t={scope:"literal", beginKeywords:n.join(" ")};return{name:"JSON",keywords:{literal:n},contains:[{ className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{ @@ -645,7 +650,7 @@ begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" },o={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, end:/\)/,contains:[e.inherit(r,{className:"string"}),"self"]}] - },l=ge,c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),d={ + },l=me,c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),d={ variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, contains:[]}]},g=d;return g.variants[1].contains=[d],d.variants[1].contains=[g], {name:"Kotlin",aliases:["kt","kts"],keywords:n, @@ -668,41 +673,41 @@ excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/, excludeBegin:!0,returnEnd:!0},s,o]},r,{className:"meta",begin:"^#!/usr/bin/env", end:"$",illegal:"\n"},l]}},grmr_less:e=>{ - const n=te(e),t=le,a="([\\w-]+|@\\{[\\w-]+\\})",i=[],r=[],s=e=>({ - className:"string",begin:"~?"+e+".*?"+e}),o=(e,n,t)=>({className:e,begin:n, - relevance:t}),l={$pattern:/[a-z-]+/,keyword:"and or not only", - attribute:ie.join(" ")},c={begin:"\\(",end:"\\)",contains:r,keywords:l, + const n=ie(e),t=de,a="[\\w-]+",i="("+a+"|@\\{"+a+"\\})",r=[],s=[],o=e=>({ + className:"string",begin:"~?"+e+".*?"+e}),l=(e,n,t)=>({className:e,begin:n, + relevance:t}),c={$pattern:/[a-z-]+/,keyword:"and or not only", + attribute:se.join(" ")},d={begin:"\\(",end:"\\)",contains:s,keywords:c, relevance:0} - ;r.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s("'"),s('"'),n.CSS_NUMBER_MODE,{ + ;s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,o("'"),o('"'),n.CSS_NUMBER_MODE,{ begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", excludeEnd:!0} - },n.HEXCOLOR,c,o("variable","@@?[\\w-]+",10),o("variable","@\\{[\\w-]+\\}"),o("built_in","~?`[^`]*?`"),{ - className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0 - },n.IMPORTANT,{beginKeywords:"and not"},n.FUNCTION_DISPATCH);const d=r.concat({ - begin:/\{/,end:/\}/,contains:i}),g={beginKeywords:"when",endsWithParent:!0, - contains:[{beginKeywords:"and not"}].concat(r)},u={begin:a+"\\s*:", + },n.HEXCOLOR,d,l("variable","@@?"+a,10),l("variable","@\\{"+a+"\\}"),l("built_in","~?`[^`]*?`"),{ + className:"attribute",begin:a+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0 + },n.IMPORTANT,{beginKeywords:"and not"},n.FUNCTION_DISPATCH);const g=s.concat({ + begin:/\{/,end:/\}/,contains:r}),u={beginKeywords:"when",endsWithParent:!0, + contains:[{beginKeywords:"and not"}].concat(s)},b={begin:i+"\\s*:", returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/ - },n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+oe.join("|")+")\\b", - end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:r}}] - },b={className:"keyword", + },n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+ce.join("|")+")\\b", + end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}] + },m={className:"keyword", begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", - starts:{end:"[;{}]",keywords:l,returnEnd:!0,contains:r,relevance:0}},m={ - className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{ - begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:d}},p={variants:[{ - begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:a,end:/\{/}],returnBegin:!0, + starts:{end:"[;{}]",keywords:c,returnEnd:!0,contains:s,relevance:0}},p={ + className:"variable",variants:[{begin:"@"+a+"\\s*:",relevance:15},{begin:"@"+a + }],starts:{end:"[;}]",returnEnd:!0,contains:g}},_={variants:[{ + begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:i,end:/\{/}],returnBegin:!0, returnEnd:!0,illegal:"[<='$\"]",relevance:0, - contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,o("keyword","all\\b"),o("variable","@\\{[\\w-]+\\}"),{ - begin:"\\b("+ae.join("|")+")\\b",className:"selector-tag" - },n.CSS_NUMBER_MODE,o("selector-tag",a,0),o("selector-id","#"+a),o("selector-class","\\."+a,0),o("selector-tag","&",0),n.ATTRIBUTE_SELECTOR_MODE,{ - className:"selector-pseudo",begin:":("+re.join("|")+")"},{ - className:"selector-pseudo",begin:":(:)?("+se.join("|")+")"},{begin:/\(/, - end:/\)/,relevance:0,contains:d},{begin:"!important"},n.FUNCTION_DISPATCH]},_={ - begin:`[\\w-]+:(:)?(${t.join("|")})`,returnBegin:!0,contains:[p]} - ;return i.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,b,m,_,u,p,g,n.FUNCTION_DISPATCH), - {name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:i}}, + contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,u,l("keyword","all\\b"),l("variable","@\\{"+a+"\\}"),{ + begin:"\\b("+re.join("|")+")\\b",className:"selector-tag" + },n.CSS_NUMBER_MODE,l("selector-tag",i,0),l("selector-id","#"+i),l("selector-class","\\."+i,0),l("selector-tag","&",0),n.ATTRIBUTE_SELECTOR_MODE,{ + className:"selector-pseudo",begin:":("+oe.join("|")+")"},{ + className:"selector-pseudo",begin:":(:)?("+le.join("|")+")"},{begin:/\(/, + end:/\)/,relevance:0,contains:g},{begin:"!important"},n.FUNCTION_DISPATCH]},h={ + begin:a+":(:)?"+`(${t.join("|")})`,returnBegin:!0,contains:[_]} + ;return r.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,m,p,h,b,_,u,n.FUNCTION_DISPATCH), + {name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:r}}, grmr_lua:e=>{const n="\\[=*\\[",t="\\]=*\\]",a={begin:n,end:t,contains:["self"] - },i=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[",t,{contains:[a], - relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, + },i=[e.COMMENT("--(?!"+n+")","$"),e.COMMENT("--"+n,t,{contains:[a],relevance:10 + })];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, literal:"true false nil", keyword:"and break do else elseif end for goto if in local not or repeat return then until while", built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" @@ -722,35 +727,9 @@ name:"Makefile",aliases:["mk","mak","make"],keywords:{$pattern:/[\w-]+/, keyword:"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath" },contains:[e.HASH_COMMENT_MODE,n,t,a,i,{className:"meta",begin:/^\.PHONY:/, - end:/$/,keywords:{$pattern:/[\.\w]+/,keyword:".PHONY"}},r]}},grmr_xml:e=>{ - const n=e.regex,t=n.concat(/[\p{L}_]/u,n.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),a={ - className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},i={begin:/\s/, - contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] - },r=e.inherit(i,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{ - className:"string"}),o=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),l={ - endsWithParent:!0,illegal:/`]+/}]}]}]};return{ - name:"HTML, XML", - aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], - case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[i,o,s,r,{begin:/\[/,end:/\]/,contains:[{ - className:"meta",begin://,contains:[i,r,o,s]}]}] - },e.COMMENT(//,{relevance:10}),{begin://, - relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, - relevance:10,contains:[o]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", - begin:/)/,end:/>/,keywords:{name:"style"},contains:[l],starts:{ - end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", - begin:/)/,end:/>/,keywords:{name:"script"},contains:[l],starts:{ - end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ - className:"tag",begin:/<>|<\/>/},{className:"tag", - begin:n.concat(//,/>/,/\s/)))), - end:/\/?>/,contains:[{className:"name",begin:t,relevance:0,starts:l}]},{ - className:"tag",begin:n.concat(/<\//,n.lookahead(n.concat(t,/>/))),contains:[{ - className:"name",begin:t,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]} - },grmr_markdown:e=>{const n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml", - relevance:0},t={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{ + end:/$/,keywords:{$pattern:/[\.\w]+/,keyword:".PHONY"}},r]}},grmr_markdown:e=>{ + const n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},t={ + variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{ begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, relevance:2},{ begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), @@ -836,11 +815,13 @@ scope:"variable",match:"\\$+"+a},s={scope:"subst",variants:[{begin:/\$\w+/},{ begin:/\{\$/,end:/\}/}]},o=e.inherit(e.APOS_STRING_MODE,{illegal:null }),l="[ \t\n]",c={scope:"string",variants:[e.inherit(e.QUOTE_STRING_MODE,{ - illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(s) - }),o,e.END_SAME_AS_BEGIN({begin:/<<<[ \t]*(\w+)\n/,end:/[ \t]*(\w+)\b/, - contains:e.QUOTE_STRING_MODE.contains.concat(s)})]},d={scope:"number", - variants:[{begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{ - begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{ + illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(s)}),o,{ + begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/, + contains:e.QUOTE_STRING_MODE.contains.concat(s),"on:begin":(e,n)=>{ + n.data._beginMatch=e[1]||e[2]},"on:end":(e,n)=>{ + n.data._beginMatch!==e[1]&&n.ignoreMatch()}},e.END_SAME_AS_BEGIN({ + begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/})]},d={scope:"number",variants:[{ + begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{ begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{ begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?" }],relevance:0 @@ -858,20 +839,20 @@ 3:"variable.language"}}]},E={scope:"attr", match:n.concat(a,n.lookahead(":"),n.lookahead(/(?!::)/))},y={relevance:0, begin:/\(/,end:/\)/,keywords:m,contains:[E,r,f,e.C_BLOCK_COMMENT_MODE,c,d,_] - },w={relevance:0, + },N={relevance:0, match:[/\b/,n.concat("(?!fn\\b|function\\b|",p(u).join("\\b|"),"|",p(b).join("\\b|"),"\\b)"),a,n.concat(l,"*"),n.lookahead(/(?=\()/)], - scope:{3:"title.function.invoke"},contains:[y]};y.contains.push(w) - ;const N=[E,f,e.C_BLOCK_COMMENT_MODE,c,d,_];return{case_insensitive:!1, + scope:{3:"title.function.invoke"},contains:[y]};y.contains.push(N) + ;const w=[E,f,e.C_BLOCK_COMMENT_MODE,c,d,_];return{case_insensitive:!1, keywords:m,contains:[{begin:n.concat(/#\[\s*/,i),beginScope:"meta",end:/]/, endScope:"meta",keywords:{literal:g,keyword:["new","array"]},contains:[{ begin:/\[/,end:/]/,keywords:{literal:g,keyword:["new","array"]}, - contains:["self",...N]},...N,{scope:"meta",match:i}] + contains:["self",...w]},...w,{scope:"meta",match:i}] },e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{ scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/, keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE, contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},{scope:"meta",variants:[{ begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{ - begin:/\?>/}]},{scope:"variable.language",match:/\$this\b/},r,w,f,{ + begin:/\?>/}]},{scope:"variable.language",match:/\$this\b/},r,N,f,{ match:[/const/,/\s/,a],scope:{1:"keyword",3:"variable.constant"}},_,{ scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/, excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use" @@ -924,7 +905,7 @@ end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:i, contains:["self",r,u,l,e.HASH_COMMENT_MODE]}]};return s.contains=[l,u,r],{ name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:i, - illegal:/(<\/|->|\?)|=>/,contains:[r,u,{begin:/\bself\b/},{beginKeywords:"if", + illegal:/(<\/|\?)|=>/,contains:[r,u,{begin:/\bself\b/},{beginKeywords:"if", relevance:0},l,b,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,t],scope:{ 1:"keyword",3:"title.function"},contains:[m]},{variants:[{ match:[/\bclass/,/\s+/,t,/\s*/,/\(\s*/,t,/\s*\)/]},{match:[/\bclass/,/\s+/,t]}], @@ -1009,8 +990,8 @@ aliases:["rb","gemspec","podspec","thor","irb"],keywords:r,illegal:/\/\*/, contains:[e.SHEBANG({binary:"ruby"})].concat(p).concat(l).concat(m)}}, grmr_rust:e=>{const n=e.regex,t={className:"title.function.invoke",relevance:0, - begin:n.concat(/\b/,/(?!let\b)/,e.IDENT_RE,n.lookahead(/\s*\(/)) - },a="([ui](8|16|32|64|128|size)|f(32|64))?",i=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],r=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"] + begin:n.concat(/\b/,/(?!let|for|while|if|else|match\b)/,e.IDENT_RE,n.lookahead(/\s*\(/)) + },a="([ui](8|16|32|64|128|size)|f(32|64))?",i=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],r=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"] ;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:r, keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","unsafe","unsized","use","virtual","where","while","yield"], literal:["true","false","Some","None","Ok","Err"],built_in:i},illegal:""},t]}}, - grmr_scss:e=>{const n=te(e),t=se,a=re,i="@[a-z-]+",r={className:"variable", + grmr_scss:e=>{const n=ie(e),t=le,a=oe,i="@[a-z-]+",r={className:"variable", begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b",relevance:0};return{name:"SCSS", case_insensitive:!0,illegal:"[=/|']", contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,n.CSS_NUMBER_MODE,{ className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 },n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", - begin:"\\b("+ae.join("|")+")\\b",relevance:0},{className:"selector-pseudo", + begin:"\\b("+re.join("|")+")\\b",relevance:0},{className:"selector-pseudo", begin:":("+a.join("|")+")"},{className:"selector-pseudo", begin:":(:)?("+t.join("|")+")"},r,{begin:/\(/,end:/\)/, contains:[n.CSS_NUMBER_MODE]},n.CSS_VARIABLE,{className:"attribute", - begin:"\\b("+oe.join("|")+")\\b"},{ + begin:"\\b("+ce.join("|")+")\\b"},{ begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" },{begin:/:/,end:/[;}{]/,relevance:0, contains:[n.BLOCK_COMMENT,r,n.HEXCOLOR,n.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.IMPORTANT,n.FUNCTION_DISPATCH] },{begin:"@(page|font-face)",keywords:{$pattern:i,keyword:"@page @font-face"}},{ begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, - keyword:"and or not only",attribute:ie.join(" ")},contains:[{begin:i, + keyword:"and or not only",attribute:se.join(" ")},contains:[{begin:i, className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" },r,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.HEXCOLOR,n.CSS_NUMBER_MODE] },n.FUNCTION_DISPATCH]}},grmr_shell:e=>({name:"Shell Session", @@ -1067,78 +1048,81 @@ },contains:[{begin:n.either(...s),relevance:0,keywords:{$pattern:/[\w\.]+/, keyword:l.concat(s),literal:a,type:i}},{className:"type", begin:n.either("double precision","large object","with timezone","without timezone") - },c,{className:"variable",begin:/@[a-z0-9]+/},{className:"string",variants:[{ - begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/,contains:[{ - begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{className:"operator", - begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,relevance:0}]}}, - grmr_swift:e=>{const n={match:/\s+/,relevance:0},t=e.COMMENT("/\\*","\\*/",{ - contains:["self"]}),a=[e.C_LINE_COMMENT_MODE,t],i={match:[/\./,p(...ve,...Oe)], - className:{2:"keyword"}},r={match:m(/\./,p(...xe)),relevance:0 - },s=xe.filter((e=>"string"==typeof e)).concat(["_|0"]),o={variants:[{ + },c,{className:"variable",begin:/@[a-z0-9][a-z0-9_]*/},{className:"string", + variants:[{begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/, + contains:[{begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{ + className:"operator",begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/, + relevance:0}]}},grmr_swift:e=>{const n={match:/\s+/,relevance:0 + },t=e.COMMENT("/\\*","\\*/",{contains:["self"]}),a=[e.C_LINE_COMMENT_MODE,t],i={ + match:[/\./,m(...xe,...Me)],className:{2:"keyword"}},r={match:b(/\./,m(...Ae)), + relevance:0},s=Ae.filter((e=>"string"==typeof e)).concat(["_|0"]),o={variants:[{ className:"keyword", - match:p(...xe.filter((e=>"string"!=typeof e)).concat(ke).map(Ne),...Oe)}]},l={ - $pattern:p(/\b\w+/,/#\w+/),keyword:s.concat(Ae),literal:Me},c=[i,r,o],d=[{ - match:m(/\./,p(...Ce)),relevance:0},{className:"built_in", - match:m(/\b/,p(...Ce),/(?=\()/)}],u={match:/->/,relevance:0},b=[u,{ - className:"operator",relevance:0,variants:[{match:De},{match:`\\.(\\.|${Re})+`}] - }],_="([0-9a-fA-F]_*)+",h={className:"number",relevance:0,variants:[{ - match:"\\b(([0-9]_*)+)(\\.(([0-9]_*)+))?([eE][+-]?(([0-9]_*)+))?\\b"},{ - match:`\\b0x(${_})(\\.(${_}))?([pP][+-]?(([0-9]_*)+))?\\b`},{ - match:/\b0o([0-7]_*)+\b/},{match:/\b0b([01]_*)+\b/}]},f=(e="")=>({ - className:"subst",variants:[{match:m(/\\/,e,/[0\\tnr"']/)},{ - match:m(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}]}),E=(e="")=>({className:"subst", - match:m(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/)}),y=(e="")=>({className:"subst", - label:"interpol",begin:m(/\\/,e,/\(/),end:/\)/}),w=(e="")=>({begin:m(e,/"""/), - end:m(/"""/,e),contains:[f(e),E(e),y(e)]}),N=(e="")=>({begin:m(e,/"/), - end:m(/"/,e),contains:[f(e),y(e)]}),v={className:"string", - variants:[w(),w("#"),w("##"),w("###"),N(),N("#"),N("##"),N("###")]},O={ - match:m(/`/,Be,/`/)},k=[O,{className:"variable",match:/\$\d+/},{ - className:"variable",match:`\\$${Le}+`}],x=[{match:/(@|#(un)?)available/, - className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:Fe, - contains:[...b,h,v]}]}},{className:"keyword",match:m(/@/,p(...ze))},{ - className:"meta",match:m(/@/,Be)}],M={match:g(/\b[A-Z]/),relevance:0,contains:[{ - className:"type", - match:m(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,Le,"+") - },{className:"type",match:$e,relevance:0},{match:/[?!]+/,relevance:0},{ - match:/\.\.\./,relevance:0},{match:m(/\s+&\s+/,g($e)),relevance:0}]},S={ - begin://,keywords:l,contains:[...a,...c,...x,u,M]};M.contains.push(S) - ;const A={begin:/\(/,end:/\)/,relevance:0,keywords:l,contains:["self",{ - match:m(Be,/\s*:/),keywords:"_|0",relevance:0 - },...a,...c,...d,...b,h,v,...k,...x,M]},C={begin://,contains:[...a,M] - },T={begin:/\(/,end:/\)/,keywords:l,contains:[{ - begin:p(g(m(Be,/\s*:/)),g(m(Be,/\s+/,Be,/\s*:/))),end:/:/,relevance:0, - contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:Be}] - },...a,...c,...b,h,v,...x,M,A],endsParent:!0,illegal:/["']/},R={ - match:[/func/,/\s+/,p(O.match,Be,De)],className:{1:"keyword",3:"title.function" - },contains:[C,T,n],illegal:[/\[/,/%/]},D={ + match:m(...Ae.filter((e=>"string"!=typeof e)).concat(Se).map(ke),...Me)}]},l={ + $pattern:m(/\b\w+/,/#\w+/),keyword:s.concat(Re),literal:Ce},c=[i,r,o],g=[{ + match:b(/\./,m(...De)),relevance:0},{className:"built_in", + match:b(/\b/,m(...De),/(?=\()/)}],u={match:/->/,relevance:0},p=[u,{ + className:"operator",relevance:0,variants:[{match:Be},{match:`\\.(\\.|${Le})+`}] + }],_="([0-9]_*)+",h="([0-9a-fA-F]_*)+",f={className:"number",relevance:0, + variants:[{match:`\\b(${_})(\\.(${_}))?([eE][+-]?(${_}))?\\b`},{ + match:`\\b0x(${h})(\\.(${h}))?([pP][+-]?(${_}))?\\b`},{match:/\b0o([0-7]_*)+\b/ + },{match:/\b0b([01]_*)+\b/}]},E=(e="")=>({className:"subst",variants:[{ + match:b(/\\/,e,/[0\\tnr"']/)},{match:b(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}] + }),y=(e="")=>({className:"subst",match:b(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/) + }),N=(e="")=>({className:"subst",label:"interpol",begin:b(/\\/,e,/\(/),end:/\)/ + }),w=(e="")=>({begin:b(e,/"""/),end:b(/"""/,e),contains:[E(e),y(e),N(e)] + }),v=(e="")=>({begin:b(e,/"/),end:b(/"/,e),contains:[E(e),N(e)]}),O={ + className:"string", + variants:[w(),w("#"),w("##"),w("###"),v(),v("#"),v("##"),v("###")] + },k=[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0, + contains:[e.BACKSLASH_ESCAPE]}],x={begin:/\/[^\s](?=[^/\n]*\/)/,end:/\//, + contains:k},M=e=>{const n=b(e,/\//),t=b(/\//,e);return{begin:n,end:t, + contains:[...k,{scope:"comment",begin:`#(?!.*${t})`,end:/$/}]}},S={ + scope:"regexp",variants:[M("###"),M("##"),M("#"),x]},A={match:b(/`/,Fe,/`/) + },C=[A,{className:"variable",match:/\$\d+/},{className:"variable", + match:`\\$${ze}+`}],T=[{match:/(@|#(un)?)available/,scope:"keyword",starts:{ + contains:[{begin:/\(/,end:/\)/,keywords:Pe,contains:[...p,f,O]}]}},{ + scope:"keyword",match:b(/@/,m(...je))},{scope:"meta",match:b(/@/,Fe)}],R={ + match:d(/\b[A-Z]/),relevance:0,contains:[{className:"type", + match:b(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,ze,"+") + },{className:"type",match:Ue,relevance:0},{match:/[?!]+/,relevance:0},{ + match:/\.\.\./,relevance:0},{match:b(/\s+&\s+/,d(Ue)),relevance:0}]},D={ + begin://,keywords:l,contains:[...a,...c,...T,u,R]};R.contains.push(D) + ;const I={begin:/\(/,end:/\)/,relevance:0,keywords:l,contains:["self",{ + match:b(Fe,/\s*:/),keywords:"_|0",relevance:0 + },...a,S,...c,...g,...p,f,O,...C,...T,R]},L={begin://, + keywords:"repeat each",contains:[...a,R]},B={begin:/\(/,end:/\)/,keywords:l, + contains:[{begin:m(d(b(Fe,/\s*:/)),d(b(Fe,/\s+/,Fe,/\s*:/))),end:/:/, + relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params", + match:Fe}]},...a,...c,...p,f,O,...T,R,I],endsParent:!0,illegal:/["']/},$={ + match:[/(func|macro)/,/\s+/,m(A.match,Fe,Be)],className:{1:"keyword", + 3:"title.function"},contains:[L,B,n],illegal:[/\[/,/%/]},z={ match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"}, - contains:[C,T,n],illegal:/\[|%/},I={match:[/operator/,/\s+/,De],className:{ - 1:"keyword",3:"title"}},L={begin:[/precedencegroup/,/\s+/,$e],className:{ - 1:"keyword",3:"title"},contains:[M],keywords:[...Se,...Me],end:/}/} - ;for(const e of v.variants){const n=e.contains.find((e=>"interpol"===e.label)) - ;n.keywords=l;const t=[...c,...d,...b,h,v,...k];n.contains=[...t,{begin:/\(/, + contains:[L,B,n],illegal:/\[|%/},F={match:[/operator/,/\s+/,Be],className:{ + 1:"keyword",3:"title"}},U={begin:[/precedencegroup/,/\s+/,Ue],className:{ + 1:"keyword",3:"title"},contains:[R],keywords:[...Te,...Ce],end:/}/} + ;for(const e of O.variants){const n=e.contains.find((e=>"interpol"===e.label)) + ;n.keywords=l;const t=[...c,...g,...p,f,O,...C];n.contains=[...t,{begin:/\(/, end:/\)/,contains:["self",...t]}]}return{name:"Swift",keywords:l, - contains:[...a,R,D,{beginKeywords:"struct protocol class extension enum actor", + contains:[...a,$,z,{beginKeywords:"struct protocol class extension enum actor", end:"\\{",excludeEnd:!0,keywords:l,contains:[e.inherit(e.TITLE_MODE,{ className:"title.class",begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...c] - },I,L,{beginKeywords:"import",end:/$/,contains:[...a],relevance:0 - },...c,...d,...b,h,v,...k,...x,M,A]}},grmr_typescript:e=>{ - const n=we(e),t=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],a={ + },F,U,{beginKeywords:"import",end:/$/,contains:[...a],relevance:0 + },S,...c,...g,...p,f,O,...C,...T,R,I]}},grmr_typescript:e=>{ + const n=Oe(e),t=_e,a=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],i={ beginKeywords:"namespace",end:/\{/,excludeEnd:!0, - contains:[n.exports.CLASS_REFERENCE]},i={beginKeywords:"interface",end:/\{/, - excludeEnd:!0,keywords:{keyword:"interface extends",built_in:t}, - contains:[n.exports.CLASS_REFERENCE]},r={$pattern:be, - keyword:me.concat(["type","namespace","interface","public","private","protected","implements","declare","abstract","readonly","enum","override"]), - literal:pe,built_in:ye.concat(t),"variable.language":Ee},s={className:"meta", - begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},o=(e,n,t)=>{ - const a=e.contains.findIndex((e=>e.label===n)) + contains:[n.exports.CLASS_REFERENCE]},r={beginKeywords:"interface",end:/\{/, + excludeEnd:!0,keywords:{keyword:"interface extends",built_in:a}, + contains:[n.exports.CLASS_REFERENCE]},s={$pattern:_e, + keyword:he.concat(["type","namespace","interface","public","private","protected","implements","declare","abstract","readonly","enum","override"]), + literal:fe,built_in:ve.concat(a),"variable.language":we},o={className:"meta", + begin:"@"+t},l=(e,n,t)=>{const a=e.contains.findIndex((e=>e.label===n)) ;if(-1===a)throw Error("can not find mode to replace");e.contains.splice(a,1,t)} - ;return Object.assign(n.keywords,r), - n.exports.PARAMS_CONTAINS.push(s),n.contains=n.contains.concat([s,a,i]), - o(n,"shebang",e.SHEBANG()),o(n,"use_strict",{className:"meta",relevance:10, + ;return Object.assign(n.keywords,s), + n.exports.PARAMS_CONTAINS.push(o),n.contains=n.contains.concat([o,i,r]), + l(n,"shebang",e.SHEBANG()),l(n,"use_strict",{className:"meta",relevance:10, begin:/^\s*['"]use strict['"]/ }),n.contains.find((e=>"func.def"===e.label)).relevance=0,Object.assign(n,{ - name:"TypeScript",aliases:["ts","tsx"]}),n},grmr_vbnet:e=>{ + name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),n},grmr_vbnet:e=>{ const n=e.regex,t=/\d{1,2}\/\d{1,2}\/\d{4}/,a=/\d{4}-\d{1,2}-\d{1,2}/,i=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,s={ className:"literal",variants:[{begin:n.concat(/# */,n.either(a,t),/ *#/)},{ begin:n.concat(/# */,r,/ *#/)},{begin:n.concat(/# */,i,/ *#/)},{ @@ -1173,7 +1157,34 @@ match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/ },{className:"number",relevance:0, match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/ - }]}},grmr_yaml:e=>{ + }]}},grmr_xml:e=>{ + const n=e.regex,t=n.concat(/[\p{L}_]/u,n.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),a={ + className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},i={begin:/\s/, + contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] + },r=e.inherit(i,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{ + className:"string"}),o=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),l={ + endsWithParent:!0,illegal:/`]+/}]}]}]};return{ + name:"HTML, XML", + aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], + case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[i,o,s,r,{begin:/\[/,end:/\]/,contains:[{ + className:"meta",begin://,contains:[i,r,o,s]}]}] + },e.COMMENT(//,{relevance:10}),{begin://, + relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, + relevance:10,contains:[o]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", + begin:/)/,end:/>/,keywords:{name:"style"},contains:[l],starts:{ + end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", + begin:/)/,end:/>/,keywords:{name:"script"},contains:[l],starts:{ + end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ + className:"tag",begin:/<>|<\/>/},{className:"tag", + begin:n.concat(//,/>/,/\s/)))), + end:/\/?>/,contains:[{className:"name",begin:t,relevance:0,starts:l}]},{ + className:"tag",begin:n.concat(/<\//,n.lookahead(n.concat(t,/>/))),contains:[{ + className:"name",begin:t,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]} + },grmr_yaml:e=>{ const n="true false yes no null",t="[\\w#;/?:@&=+$,.~*'()[\\]]+",a={ className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ },{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", @@ -1196,8 +1207,7 @@ begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" },{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},s,o,a],c=[...l] ;return c.pop(),c.push(i),r.contains=c,{name:"YAML",case_insensitive:!0, - aliases:["yml"],contains:l}}});const je=ne;for(const e of Object.keys(Ue)){ - const n=e.replace("grmr_","").replace("_","-");je.registerLanguage(n,Ue[e])} - return je}() - ;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); - \ No newline at end of file + aliases:["yml"],contains:l}}});const He=ae;for(const e of Object.keys(Ke)){ + const n=e.replace("grmr_","").replace("_","-");He.registerLanguage(n,Ke[e])} + return He}() + ;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); \ No newline at end of file diff --git a/Desktop/html/js/jaspNotes.js b/Desktop/html/js/jaspNotes.js index 72ff77a21a..5fab5b553b 100644 --- a/Desktop/html/js/jaspNotes.js +++ b/Desktop/html/js/jaspNotes.js @@ -22,7 +22,7 @@ function isURLInWhitelist(hostname) { if (insideJASP) { var Parchment = Quill.import('parchment'); - var LineBreakClass = new Parchment.Attributor.Class('linebreak', 'linebreak', { + var LineBreakClass = new Parchment.ClassAttributor('linebreak', 'linebreak', { scope: Parchment.Scope.BLOCK }); diff --git a/Desktop/html/js/jaspwidgets.js b/Desktop/html/js/jaspwidgets.js index 348b1473c7..c87a99cf6a 100644 --- a/Desktop/html/js/jaspwidgets.js +++ b/Desktop/html/js/jaspwidgets.js @@ -641,8 +641,7 @@ JASPWidgets.RSyntaxView = JASPWidgets.View.extend({ .html("
" + rScript + "
"); setTimeout(() => { this.$el.find(".jasp-rsyntax")[0].querySelectorAll('pre code').forEach((el) => { - el.innerHTML = el.textContent; //Suppress warnings of html code tags - hljs.highlightElement(el); + el.innerHTML = hljs.highlight(el.textContent, { language: 'r' }).value; }); }, 200); }, diff --git a/Desktop/html/js/quill.js b/Desktop/html/js/quill.js index bee4110fc2..080847a236 100644 --- a/Desktop/html/js/quill.js +++ b/Desktop/html/js/quill.js @@ -1,11571 +1,9 @@ -/*! - * Quill Editor v1.3.7 - * https://quilljs.com/ +/*! + * Quill Editor v2.0.2 + * https://quilljs.com + * Copyright (c) 2017-2024, Slab * Copyright (c) 2014, Jason Chen * Copyright (c) 2013, salesforce.com + * For license information please see quill.js.LICENSE.txt */ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else if(typeof exports === 'object') - exports["Quill"] = factory(); - else - root["Quill"] = factory(); -})(typeof self !== 'undefined' ? self : this, function() { -return /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 109); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -var container_1 = __webpack_require__(17); -var format_1 = __webpack_require__(18); -var leaf_1 = __webpack_require__(19); -var scroll_1 = __webpack_require__(45); -var inline_1 = __webpack_require__(46); -var block_1 = __webpack_require__(47); -var embed_1 = __webpack_require__(48); -var text_1 = __webpack_require__(49); -var attributor_1 = __webpack_require__(12); -var class_1 = __webpack_require__(32); -var style_1 = __webpack_require__(33); -var store_1 = __webpack_require__(31); -var Registry = __webpack_require__(1); -var Parchment = { - Scope: Registry.Scope, - create: Registry.create, - find: Registry.find, - query: Registry.query, - register: Registry.register, - Container: container_1.default, - Format: format_1.default, - Leaf: leaf_1.default, - Embed: embed_1.default, - Scroll: scroll_1.default, - Block: block_1.default, - Inline: inline_1.default, - Text: text_1.default, - Attributor: { - Attribute: attributor_1.default, - Class: class_1.default, - Style: style_1.default, - Store: store_1.default, - }, -}; -exports.default = Parchment; - - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -var ParchmentError = /** @class */ (function (_super) { - __extends(ParchmentError, _super); - function ParchmentError(message) { - var _this = this; - message = '[Parchment] ' + message; - _this = _super.call(this, message) || this; - _this.message = message; - _this.name = _this.constructor.name; - return _this; - } - return ParchmentError; -}(Error)); -exports.ParchmentError = ParchmentError; -var attributes = {}; -var classes = {}; -var tags = {}; -var types = {}; -exports.DATA_KEY = '__blot'; -var Scope; -(function (Scope) { - Scope[Scope["TYPE"] = 3] = "TYPE"; - Scope[Scope["LEVEL"] = 12] = "LEVEL"; - Scope[Scope["ATTRIBUTE"] = 13] = "ATTRIBUTE"; - Scope[Scope["BLOT"] = 14] = "BLOT"; - Scope[Scope["INLINE"] = 7] = "INLINE"; - Scope[Scope["BLOCK"] = 11] = "BLOCK"; - Scope[Scope["BLOCK_BLOT"] = 10] = "BLOCK_BLOT"; - Scope[Scope["INLINE_BLOT"] = 6] = "INLINE_BLOT"; - Scope[Scope["BLOCK_ATTRIBUTE"] = 9] = "BLOCK_ATTRIBUTE"; - Scope[Scope["INLINE_ATTRIBUTE"] = 5] = "INLINE_ATTRIBUTE"; - Scope[Scope["ANY"] = 15] = "ANY"; -})(Scope = exports.Scope || (exports.Scope = {})); -function create(input, value) { - var match = query(input); - if (match == null) { - throw new ParchmentError("Unable to create " + input + " blot"); - } - var BlotClass = match; - var node = - // @ts-ignore - input instanceof Node || input['nodeType'] === Node.TEXT_NODE ? input : BlotClass.create(value); - return new BlotClass(node, value); -} -exports.create = create; -function find(node, bubble) { - if (bubble === void 0) { bubble = false; } - if (node == null) - return null; - // @ts-ignore - if (node[exports.DATA_KEY] != null) - return node[exports.DATA_KEY].blot; - if (bubble) - return find(node.parentNode, bubble); - return null; -} -exports.find = find; -function query(query, scope) { - if (scope === void 0) { scope = Scope.ANY; } - var match; - if (typeof query === 'string') { - match = types[query] || attributes[query]; - // @ts-ignore - } - else if (query instanceof Text || query['nodeType'] === Node.TEXT_NODE) { - match = types['text']; - } - else if (typeof query === 'number') { - if (query & Scope.LEVEL & Scope.BLOCK) { - match = types['block']; - } - else if (query & Scope.LEVEL & Scope.INLINE) { - match = types['inline']; - } - } - else if (query instanceof HTMLElement) { - var names = (query.getAttribute('class') || '').split(/\s+/); - for (var i in names) { - match = classes[names[i]]; - if (match) - break; - } - match = match || tags[query.tagName]; - } - if (match == null) - return null; - // @ts-ignore - if (scope & Scope.LEVEL & match.scope && scope & Scope.TYPE & match.scope) - return match; - return null; -} -exports.query = query; -function register() { - var Definitions = []; - for (var _i = 0; _i < arguments.length; _i++) { - Definitions[_i] = arguments[_i]; - } - if (Definitions.length > 1) { - return Definitions.map(function (d) { - return register(d); - }); - } - var Definition = Definitions[0]; - if (typeof Definition.blotName !== 'string' && typeof Definition.attrName !== 'string') { - throw new ParchmentError('Invalid definition'); - } - else if (Definition.blotName === 'abstract') { - throw new ParchmentError('Cannot register abstract class'); - } - types[Definition.blotName || Definition.attrName] = Definition; - if (typeof Definition.keyName === 'string') { - attributes[Definition.keyName] = Definition; - } - else { - if (Definition.className != null) { - classes[Definition.className] = Definition; - } - if (Definition.tagName != null) { - if (Array.isArray(Definition.tagName)) { - Definition.tagName = Definition.tagName.map(function (tagName) { - return tagName.toUpperCase(); - }); - } - else { - Definition.tagName = Definition.tagName.toUpperCase(); - } - var tagNames = Array.isArray(Definition.tagName) ? Definition.tagName : [Definition.tagName]; - tagNames.forEach(function (tag) { - if (tags[tag] == null || Definition.className == null) { - tags[tag] = Definition; - } - }); - } - } - return Definition; -} -exports.register = register; - - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - -var diff = __webpack_require__(51); -var equal = __webpack_require__(11); -var extend = __webpack_require__(3); -var op = __webpack_require__(20); - - -var NULL_CHARACTER = String.fromCharCode(0); // Placeholder char for embed in diff() - - -var Delta = function (ops) { - // Assume we are given a well formed ops - if (Array.isArray(ops)) { - this.ops = ops; - } else if (ops != null && Array.isArray(ops.ops)) { - this.ops = ops.ops; - } else { - this.ops = []; - } -}; - - -Delta.prototype.insert = function (text, attributes) { - var newOp = {}; - if (text.length === 0) return this; - newOp.insert = text; - if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) { - newOp.attributes = attributes; - } - return this.push(newOp); -}; - -Delta.prototype['delete'] = function (length) { - if (length <= 0) return this; - return this.push({ 'delete': length }); -}; - -Delta.prototype.retain = function (length, attributes) { - if (length <= 0) return this; - var newOp = { retain: length }; - if (attributes != null && typeof attributes === 'object' && Object.keys(attributes).length > 0) { - newOp.attributes = attributes; - } - return this.push(newOp); -}; - -Delta.prototype.push = function (newOp) { - var index = this.ops.length; - var lastOp = this.ops[index - 1]; - newOp = extend(true, {}, newOp); - if (typeof lastOp === 'object') { - if (typeof newOp['delete'] === 'number' && typeof lastOp['delete'] === 'number') { - this.ops[index - 1] = { 'delete': lastOp['delete'] + newOp['delete'] }; - return this; - } - // Since it does not matter if we insert before or after deleting at the same index, - // always prefer to insert first - if (typeof lastOp['delete'] === 'number' && newOp.insert != null) { - index -= 1; - lastOp = this.ops[index - 1]; - if (typeof lastOp !== 'object') { - this.ops.unshift(newOp); - return this; - } - } - if (equal(newOp.attributes, lastOp.attributes)) { - if (typeof newOp.insert === 'string' && typeof lastOp.insert === 'string') { - this.ops[index - 1] = { insert: lastOp.insert + newOp.insert }; - if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes - return this; - } else if (typeof newOp.retain === 'number' && typeof lastOp.retain === 'number') { - this.ops[index - 1] = { retain: lastOp.retain + newOp.retain }; - if (typeof newOp.attributes === 'object') this.ops[index - 1].attributes = newOp.attributes - return this; - } - } - } - if (index === this.ops.length) { - this.ops.push(newOp); - } else { - this.ops.splice(index, 0, newOp); - } - return this; -}; - -Delta.prototype.chop = function () { - var lastOp = this.ops[this.ops.length - 1]; - if (lastOp && lastOp.retain && !lastOp.attributes) { - this.ops.pop(); - } - return this; -}; - -Delta.prototype.filter = function (predicate) { - return this.ops.filter(predicate); -}; - -Delta.prototype.forEach = function (predicate) { - this.ops.forEach(predicate); -}; - -Delta.prototype.map = function (predicate) { - return this.ops.map(predicate); -}; - -Delta.prototype.partition = function (predicate) { - var passed = [], failed = []; - this.forEach(function(op) { - var target = predicate(op) ? passed : failed; - target.push(op); - }); - return [passed, failed]; -}; - -Delta.prototype.reduce = function (predicate, initial) { - return this.ops.reduce(predicate, initial); -}; - -Delta.prototype.changeLength = function () { - return this.reduce(function (length, elem) { - if (elem.insert) { - return length + op.length(elem); - } else if (elem.delete) { - return length - elem.delete; - } - return length; - }, 0); -}; - -Delta.prototype.length = function () { - return this.reduce(function (length, elem) { - return length + op.length(elem); - }, 0); -}; - -Delta.prototype.slice = function (start, end) { - start = start || 0; - if (typeof end !== 'number') end = Infinity; - var ops = []; - var iter = op.iterator(this.ops); - var index = 0; - while (index < end && iter.hasNext()) { - var nextOp; - if (index < start) { - nextOp = iter.next(start - index); - } else { - nextOp = iter.next(end - index); - ops.push(nextOp); - } - index += op.length(nextOp); - } - return new Delta(ops); -}; - - -Delta.prototype.compose = function (other) { - var thisIter = op.iterator(this.ops); - var otherIter = op.iterator(other.ops); - var ops = []; - var firstOther = otherIter.peek(); - if (firstOther != null && typeof firstOther.retain === 'number' && firstOther.attributes == null) { - var firstLeft = firstOther.retain; - while (thisIter.peekType() === 'insert' && thisIter.peekLength() <= firstLeft) { - firstLeft -= thisIter.peekLength(); - ops.push(thisIter.next()); - } - if (firstOther.retain - firstLeft > 0) { - otherIter.next(firstOther.retain - firstLeft); - } - } - var delta = new Delta(ops); - while (thisIter.hasNext() || otherIter.hasNext()) { - if (otherIter.peekType() === 'insert') { - delta.push(otherIter.next()); - } else if (thisIter.peekType() === 'delete') { - delta.push(thisIter.next()); - } else { - var length = Math.min(thisIter.peekLength(), otherIter.peekLength()); - var thisOp = thisIter.next(length); - var otherOp = otherIter.next(length); - if (typeof otherOp.retain === 'number') { - var newOp = {}; - if (typeof thisOp.retain === 'number') { - newOp.retain = length; - } else { - newOp.insert = thisOp.insert; - } - // Preserve null when composing with a retain, otherwise remove it for inserts - var attributes = op.attributes.compose(thisOp.attributes, otherOp.attributes, typeof thisOp.retain === 'number'); - if (attributes) newOp.attributes = attributes; - delta.push(newOp); - - // Optimization if rest of other is just retain - if (!otherIter.hasNext() && equal(delta.ops[delta.ops.length - 1], newOp)) { - var rest = new Delta(thisIter.rest()); - return delta.concat(rest).chop(); - } - - // Other op should be delete, we could be an insert or retain - // Insert + delete cancels out - } else if (typeof otherOp['delete'] === 'number' && typeof thisOp.retain === 'number') { - delta.push(otherOp); - } - } - } - return delta.chop(); -}; - -Delta.prototype.concat = function (other) { - var delta = new Delta(this.ops.slice()); - if (other.ops.length > 0) { - delta.push(other.ops[0]); - delta.ops = delta.ops.concat(other.ops.slice(1)); - } - return delta; -}; - -Delta.prototype.diff = function (other, index) { - if (this.ops === other.ops) { - return new Delta(); - } - var strings = [this, other].map(function (delta) { - return delta.map(function (op) { - if (op.insert != null) { - return typeof op.insert === 'string' ? op.insert : NULL_CHARACTER; - } - var prep = (delta === other) ? 'on' : 'with'; - throw new Error('diff() called ' + prep + ' non-document'); - }).join(''); - }); - var delta = new Delta(); - var diffResult = diff(strings[0], strings[1], index); - var thisIter = op.iterator(this.ops); - var otherIter = op.iterator(other.ops); - diffResult.forEach(function (component) { - var length = component[1].length; - while (length > 0) { - var opLength = 0; - switch (component[0]) { - case diff.INSERT: - opLength = Math.min(otherIter.peekLength(), length); - delta.push(otherIter.next(opLength)); - break; - case diff.DELETE: - opLength = Math.min(length, thisIter.peekLength()); - thisIter.next(opLength); - delta['delete'](opLength); - break; - case diff.EQUAL: - opLength = Math.min(thisIter.peekLength(), otherIter.peekLength(), length); - var thisOp = thisIter.next(opLength); - var otherOp = otherIter.next(opLength); - if (equal(thisOp.insert, otherOp.insert)) { - delta.retain(opLength, op.attributes.diff(thisOp.attributes, otherOp.attributes)); - } else { - delta.push(otherOp)['delete'](opLength); - } - break; - } - length -= opLength; - } - }); - return delta.chop(); -}; - -Delta.prototype.eachLine = function (predicate, newline) { - newline = newline || '\n'; - var iter = op.iterator(this.ops); - var line = new Delta(); - var i = 0; - while (iter.hasNext()) { - if (iter.peekType() !== 'insert') return; - var thisOp = iter.peek(); - var start = op.length(thisOp) - iter.peekLength(); - var index = typeof thisOp.insert === 'string' ? - thisOp.insert.indexOf(newline, start) - start : -1; - if (index < 0) { - line.push(iter.next()); - } else if (index > 0) { - line.push(iter.next(index)); - } else { - if (predicate(line, iter.next(1).attributes || {}, i) === false) { - return; - } - i += 1; - line = new Delta(); - } - } - if (line.length() > 0) { - predicate(line, {}, i); - } -}; - -Delta.prototype.transform = function (other, priority) { - priority = !!priority; - if (typeof other === 'number') { - return this.transformPosition(other, priority); - } - var thisIter = op.iterator(this.ops); - var otherIter = op.iterator(other.ops); - var delta = new Delta(); - while (thisIter.hasNext() || otherIter.hasNext()) { - if (thisIter.peekType() === 'insert' && (priority || otherIter.peekType() !== 'insert')) { - delta.retain(op.length(thisIter.next())); - } else if (otherIter.peekType() === 'insert') { - delta.push(otherIter.next()); - } else { - var length = Math.min(thisIter.peekLength(), otherIter.peekLength()); - var thisOp = thisIter.next(length); - var otherOp = otherIter.next(length); - if (thisOp['delete']) { - // Our delete either makes their delete redundant or removes their retain - continue; - } else if (otherOp['delete']) { - delta.push(otherOp); - } else { - // We retain either their retain or insert - delta.retain(length, op.attributes.transform(thisOp.attributes, otherOp.attributes, priority)); - } - } - } - return delta.chop(); -}; - -Delta.prototype.transformPosition = function (index, priority) { - priority = !!priority; - var thisIter = op.iterator(this.ops); - var offset = 0; - while (thisIter.hasNext() && offset <= index) { - var length = thisIter.peekLength(); - var nextType = thisIter.peekType(); - thisIter.next(); - if (nextType === 'delete') { - index -= Math.min(length, index - offset); - continue; - } else if (nextType === 'insert' && (offset < index || !priority)) { - index += length; - } - offset += length; - } - return index; -}; - - -module.exports = Delta; - - -/***/ }), -/* 3 */ -/***/ (function(module, exports) { - -'use strict'; - -var hasOwn = Object.prototype.hasOwnProperty; -var toStr = Object.prototype.toString; -var defineProperty = Object.defineProperty; -var gOPD = Object.getOwnPropertyDescriptor; - -var isArray = function isArray(arr) { - if (typeof Array.isArray === 'function') { - return Array.isArray(arr); - } - - return toStr.call(arr) === '[object Array]'; -}; - -var isPlainObject = function isPlainObject(obj) { - if (!obj || toStr.call(obj) !== '[object Object]') { - return false; - } - - var hasOwnConstructor = hasOwn.call(obj, 'constructor'); - var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf'); - // Not own constructor property must be Object - if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) { - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - var key; - for (key in obj) { /**/ } - - return typeof key === 'undefined' || hasOwn.call(obj, key); -}; - -// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target -var setProperty = function setProperty(target, options) { - if (defineProperty && options.name === '__proto__') { - defineProperty(target, options.name, { - enumerable: true, - configurable: true, - value: options.newValue, - writable: true - }); - } else { - target[options.name] = options.newValue; - } -}; - -// Return undefined instead of __proto__ if '__proto__' is not an own property -var getProperty = function getProperty(obj, name) { - if (name === '__proto__') { - if (!hasOwn.call(obj, name)) { - return void 0; - } else if (gOPD) { - // In early versions of node, obj['__proto__'] is buggy when obj has - // __proto__ as an own property. Object.getOwnPropertyDescriptor() works. - return gOPD(obj, name).value; - } - } - - return obj[name]; -}; - -module.exports = function extend() { - var options, name, src, copy, copyIsArray, clone; - var target = arguments[0]; - var i = 1; - var length = arguments.length; - var deep = false; - - // Handle a deep copy situation - if (typeof target === 'boolean') { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - if (target == null || (typeof target !== 'object' && typeof target !== 'function')) { - target = {}; - } - - for (; i < length; ++i) { - options = arguments[i]; - // Only deal with non-null/undefined values - if (options != null) { - // Extend the base object - for (name in options) { - src = getProperty(target, name); - copy = getProperty(options, name); - - // Prevent never-ending loop - if (target !== copy) { - // Recurse if we're merging plain objects or arrays - if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) { - if (copyIsArray) { - copyIsArray = false; - clone = src && isArray(src) ? src : []; - } else { - clone = src && isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - setProperty(target, { name: name, newValue: extend(deep, clone, copy) }); - - // Don't bring in undefined values - } else if (typeof copy !== 'undefined') { - setProperty(target, { name: name, newValue: copy }); - } - } - } - } - } - - // Return the modified object - return target; -}; - - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = exports.BlockEmbed = exports.bubbleFormats = undefined; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _extend = __webpack_require__(3); - -var _extend2 = _interopRequireDefault(_extend); - -var _quillDelta = __webpack_require__(2); - -var _quillDelta2 = _interopRequireDefault(_quillDelta); - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _break = __webpack_require__(16); - -var _break2 = _interopRequireDefault(_break); - -var _inline = __webpack_require__(6); - -var _inline2 = _interopRequireDefault(_inline); - -var _text = __webpack_require__(7); - -var _text2 = _interopRequireDefault(_text); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var NEWLINE_LENGTH = 1; - -var BlockEmbed = function (_Parchment$Embed) { - _inherits(BlockEmbed, _Parchment$Embed); - - function BlockEmbed() { - _classCallCheck(this, BlockEmbed); - - return _possibleConstructorReturn(this, (BlockEmbed.__proto__ || Object.getPrototypeOf(BlockEmbed)).apply(this, arguments)); - } - - _createClass(BlockEmbed, [{ - key: 'attach', - value: function attach() { - _get(BlockEmbed.prototype.__proto__ || Object.getPrototypeOf(BlockEmbed.prototype), 'attach', this).call(this); - this.attributes = new _parchment2.default.Attributor.Store(this.domNode); - } - }, { - key: 'delta', - value: function delta() { - return new _quillDelta2.default().insert(this.value(), (0, _extend2.default)(this.formats(), this.attributes.values())); - } - }, { - key: 'format', - value: function format(name, value) { - var attribute = _parchment2.default.query(name, _parchment2.default.Scope.BLOCK_ATTRIBUTE); - if (attribute != null) { - this.attributes.attribute(attribute, value); - } - } - }, { - key: 'formatAt', - value: function formatAt(index, length, name, value) { - this.format(name, value); - } - }, { - key: 'insertAt', - value: function insertAt(index, value, def) { - if (typeof value === 'string' && value.endsWith('\n')) { - var block = _parchment2.default.create(Block.blotName); - this.parent.insertBefore(block, index === 0 ? this : this.next); - block.insertAt(0, value.slice(0, -1)); - } else { - _get(BlockEmbed.prototype.__proto__ || Object.getPrototypeOf(BlockEmbed.prototype), 'insertAt', this).call(this, index, value, def); - } - } - }]); - - return BlockEmbed; -}(_parchment2.default.Embed); - -BlockEmbed.scope = _parchment2.default.Scope.BLOCK_BLOT; -// It is important for cursor behavior BlockEmbeds use tags that are block level elements - - -var Block = function (_Parchment$Block) { - _inherits(Block, _Parchment$Block); - - function Block(domNode) { - _classCallCheck(this, Block); - - var _this2 = _possibleConstructorReturn(this, (Block.__proto__ || Object.getPrototypeOf(Block)).call(this, domNode)); - - _this2.cache = {}; - return _this2; - } - - _createClass(Block, [{ - key: 'delta', - value: function delta() { - if (this.cache.delta == null) { - this.cache.delta = this.descendants(_parchment2.default.Leaf).reduce(function (delta, leaf) { - if (leaf.length() === 0) { - return delta; - } else { - return delta.insert(leaf.value(), bubbleFormats(leaf)); - } - }, new _quillDelta2.default()).insert('\n', bubbleFormats(this)); - } - return this.cache.delta; - } - }, { - key: 'deleteAt', - value: function deleteAt(index, length) { - _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'deleteAt', this).call(this, index, length); - this.cache = {}; - } - }, { - key: 'formatAt', - value: function formatAt(index, length, name, value) { - if (length <= 0) return; - if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK)) { - if (index + length === this.length()) { - this.format(name, value); - } - } else { - _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'formatAt', this).call(this, index, Math.min(length, this.length() - index - 1), name, value); - } - this.cache = {}; - } - }, { - key: 'insertAt', - value: function insertAt(index, value, def) { - if (def != null) return _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertAt', this).call(this, index, value, def); - if (value.length === 0) return; - var lines = value.split('\n'); - var text = lines.shift(); - if (text.length > 0) { - if (index < this.length() - 1 || this.children.tail == null) { - _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertAt', this).call(this, Math.min(index, this.length() - 1), text); - } else { - this.children.tail.insertAt(this.children.tail.length(), text); - } - this.cache = {}; - } - var block = this; - lines.reduce(function (index, line) { - block = block.split(index, true); - block.insertAt(0, line); - return line.length; - }, index + text.length); - } - }, { - key: 'insertBefore', - value: function insertBefore(blot, ref) { - var head = this.children.head; - _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'insertBefore', this).call(this, blot, ref); - if (head instanceof _break2.default) { - head.remove(); - } - this.cache = {}; - } - }, { - key: 'length', - value: function length() { - if (this.cache.length == null) { - this.cache.length = _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'length', this).call(this) + NEWLINE_LENGTH; - } - return this.cache.length; - } - }, { - key: 'moveChildren', - value: function moveChildren(target, ref) { - _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'moveChildren', this).call(this, target, ref); - this.cache = {}; - } - }, { - key: 'optimize', - value: function optimize(context) { - _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'optimize', this).call(this, context); - this.cache = {}; - } - }, { - key: 'path', - value: function path(index) { - return _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'path', this).call(this, index, true); - } - }, { - key: 'removeChild', - value: function removeChild(child) { - _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'removeChild', this).call(this, child); - this.cache = {}; - } - }, { - key: 'split', - value: function split(index) { - var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - if (force && (index === 0 || index >= this.length() - NEWLINE_LENGTH)) { - var clone = this.clone(); - if (index === 0) { - this.parent.insertBefore(clone, this); - return this; - } else { - this.parent.insertBefore(clone, this.next); - return clone; - } - } else { - var next = _get(Block.prototype.__proto__ || Object.getPrototypeOf(Block.prototype), 'split', this).call(this, index, force); - this.cache = {}; - return next; - } - } - }]); - - return Block; -}(_parchment2.default.Block); - -Block.blotName = 'block'; -Block.tagName = 'P'; -Block.defaultChild = 'break'; -Block.allowedChildren = [_inline2.default, _parchment2.default.Embed, _text2.default]; - -function bubbleFormats(blot) { - var formats = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - if (blot == null) return formats; - if (typeof blot.formats === 'function') { - formats = (0, _extend2.default)(formats, blot.formats()); - } - if (blot.parent == null || blot.parent.blotName == 'scroll' || blot.parent.statics.scope !== blot.statics.scope) { - return formats; - } - return bubbleFormats(blot.parent, formats); -} - -exports.bubbleFormats = bubbleFormats; -exports.BlockEmbed = BlockEmbed; -exports.default = Block; - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = exports.overload = exports.expandConfig = undefined; - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -__webpack_require__(50); - -var _quillDelta = __webpack_require__(2); - -var _quillDelta2 = _interopRequireDefault(_quillDelta); - -var _editor = __webpack_require__(14); - -var _editor2 = _interopRequireDefault(_editor); - -var _emitter3 = __webpack_require__(8); - -var _emitter4 = _interopRequireDefault(_emitter3); - -var _module = __webpack_require__(9); - -var _module2 = _interopRequireDefault(_module); - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _selection = __webpack_require__(15); - -var _selection2 = _interopRequireDefault(_selection); - -var _extend = __webpack_require__(3); - -var _extend2 = _interopRequireDefault(_extend); - -var _logger = __webpack_require__(10); - -var _logger2 = _interopRequireDefault(_logger); - -var _theme = __webpack_require__(34); - -var _theme2 = _interopRequireDefault(_theme); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var debug = (0, _logger2.default)('quill'); - -var Quill = function () { - _createClass(Quill, null, [{ - key: 'debug', - value: function debug(limit) { - if (limit === true) { - limit = 'log'; - } - _logger2.default.level(limit); - } - }, { - key: 'find', - value: function find(node) { - return node.__quill || _parchment2.default.find(node); - } - }, { - key: 'import', - value: function _import(name) { - if (this.imports[name] == null) { - debug.error('Cannot import ' + name + '. Are you sure it was registered?'); - } - return this.imports[name]; - } - }, { - key: 'register', - value: function register(path, target) { - var _this = this; - - var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - if (typeof path !== 'string') { - var name = path.attrName || path.blotName; - if (typeof name === 'string') { - // register(Blot | Attributor, overwrite) - this.register('formats/' + name, path, target); - } else { - Object.keys(path).forEach(function (key) { - _this.register(key, path[key], target); - }); - } - } else { - if (this.imports[path] != null && !overwrite) { - debug.warn('Overwriting ' + path + ' with', target); - } - this.imports[path] = target; - if ((path.startsWith('blots/') || path.startsWith('formats/')) && target.blotName !== 'abstract') { - _parchment2.default.register(target); - } else if (path.startsWith('modules') && typeof target.register === 'function') { - target.register(); - } - } - } - }]); - - function Quill(container) { - var _this2 = this; - - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - _classCallCheck(this, Quill); - - this.options = expandConfig(container, options); - this.container = this.options.container; - if (this.container == null) { - return debug.error('Invalid Quill container', container); - } - if (this.options.debug) { - Quill.debug(this.options.debug); - } - var html = this.container.innerHTML.trim(); - this.container.classList.add('ql-container'); - this.container.innerHTML = ''; - this.container.__quill = this; - this.root = this.addContainer('ql-editor'); - this.root.classList.add('ql-blank'); - this.root.setAttribute('data-gramm', false); - this.scrollingContainer = this.options.scrollingContainer || this.root; - this.emitter = new _emitter4.default(); - this.scroll = _parchment2.default.create(this.root, { - emitter: this.emitter, - whitelist: this.options.formats - }); - this.editor = new _editor2.default(this.scroll); - this.selection = new _selection2.default(this.scroll, this.emitter); - this.theme = new this.options.theme(this, this.options); - this.keyboard = this.theme.addModule('keyboard'); - this.clipboard = this.theme.addModule('clipboard'); - this.history = this.theme.addModule('history'); - this.theme.init(); - this.emitter.on(_emitter4.default.events.EDITOR_CHANGE, function (type) { - if (type === _emitter4.default.events.TEXT_CHANGE) { - _this2.root.classList.toggle('ql-blank', _this2.editor.isBlank()); - } - }); - this.emitter.on(_emitter4.default.events.SCROLL_UPDATE, function (source, mutations) { - var range = _this2.selection.lastRange; - var index = range && range.length === 0 ? range.index : undefined; - modify.call(_this2, function () { - return _this2.editor.update(null, mutations, index); - }, source); - }); - var contents = this.clipboard.convert('
' + html + '


'); - this.setContents(contents); - this.history.clear(); - if (this.options.placeholder) { - this.root.setAttribute('data-placeholder', this.options.placeholder); - } - if (this.options.readOnly) { - this.disable(); - } - } - - _createClass(Quill, [{ - key: 'addContainer', - value: function addContainer(container) { - var refNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - - if (typeof container === 'string') { - var className = container; - container = document.createElement('div'); - container.classList.add(className); - } - this.container.insertBefore(container, refNode); - return container; - } - }, { - key: 'blur', - value: function blur() { - this.selection.setRange(null); - } - }, { - key: 'deleteText', - value: function deleteText(index, length, source) { - var _this3 = this; - - var _overload = overload(index, length, source); - - var _overload2 = _slicedToArray(_overload, 4); - - index = _overload2[0]; - length = _overload2[1]; - source = _overload2[3]; - - return modify.call(this, function () { - return _this3.editor.deleteText(index, length); - }, source, index, -1 * length); - } - }, { - key: 'disable', - value: function disable() { - this.enable(false); - } - }, { - key: 'enable', - value: function enable() { - var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - this.scroll.enable(enabled); - this.container.classList.toggle('ql-disabled', !enabled); - } - }, { - key: 'focus', - value: function focus() { - var scrollTop = this.scrollingContainer.scrollTop; - this.selection.focus(); - this.scrollingContainer.scrollTop = scrollTop; - this.scrollIntoView(); - } - }, { - key: 'format', - value: function format(name, value) { - var _this4 = this; - - var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _emitter4.default.sources.API; - - return modify.call(this, function () { - var range = _this4.getSelection(true); - var change = new _quillDelta2.default(); - if (range == null) { - return change; - } else if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK)) { - change = _this4.editor.formatLine(range.index, range.length, _defineProperty({}, name, value)); - } else if (range.length === 0) { - _this4.selection.format(name, value); - return change; - } else { - change = _this4.editor.formatText(range.index, range.length, _defineProperty({}, name, value)); - } - _this4.setSelection(range, _emitter4.default.sources.SILENT); - return change; - }, source); - } - }, { - key: 'formatLine', - value: function formatLine(index, length, name, value, source) { - var _this5 = this; - - var formats = void 0; - - var _overload3 = overload(index, length, name, value, source); - - var _overload4 = _slicedToArray(_overload3, 4); - - index = _overload4[0]; - length = _overload4[1]; - formats = _overload4[2]; - source = _overload4[3]; - - return modify.call(this, function () { - return _this5.editor.formatLine(index, length, formats); - }, source, index, 0); - } - }, { - key: 'formatText', - value: function formatText(index, length, name, value, source) { - var _this6 = this; - - var formats = void 0; - - var _overload5 = overload(index, length, name, value, source); - - var _overload6 = _slicedToArray(_overload5, 4); - - index = _overload6[0]; - length = _overload6[1]; - formats = _overload6[2]; - source = _overload6[3]; - - return modify.call(this, function () { - return _this6.editor.formatText(index, length, formats); - }, source, index, 0); - } - }, { - key: 'getBounds', - value: function getBounds(index) { - var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - var bounds = void 0; - if (typeof index === 'number') { - bounds = this.selection.getBounds(index, length); - } else { - bounds = this.selection.getBounds(index.index, index.length); - } - var containerBounds = this.container.getBoundingClientRect(); - return { - bottom: bounds.bottom - containerBounds.top, - height: bounds.height, - left: bounds.left - containerBounds.left, - right: bounds.right - containerBounds.left, - top: bounds.top - containerBounds.top, - width: bounds.width - }; - } - }, { - key: 'getContents', - value: function getContents() { - var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getLength() - index; - - var _overload7 = overload(index, length); - - var _overload8 = _slicedToArray(_overload7, 2); - - index = _overload8[0]; - length = _overload8[1]; - - return this.editor.getContents(index, length); - } - }, { - key: 'getFormat', - value: function getFormat() { - var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getSelection(true); - var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - if (typeof index === 'number') { - return this.editor.getFormat(index, length); - } else { - return this.editor.getFormat(index.index, index.length); - } - } - }, { - key: 'getIndex', - value: function getIndex(blot) { - return blot.offset(this.scroll); - } - }, { - key: 'getLength', - value: function getLength() { - return this.scroll.length(); - } - }, { - key: 'getLeaf', - value: function getLeaf(index) { - return this.scroll.leaf(index); - } - }, { - key: 'getLine', - value: function getLine(index) { - return this.scroll.line(index); - } - }, { - key: 'getLines', - value: function getLines() { - var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_VALUE; - - if (typeof index !== 'number') { - return this.scroll.lines(index.index, index.length); - } else { - return this.scroll.lines(index, length); - } - } - }, { - key: 'getModule', - value: function getModule(name) { - return this.theme.modules[name]; - } - }, { - key: 'getSelection', - value: function getSelection() { - var focus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - - if (focus) this.focus(); - this.update(); // Make sure we access getRange with editor in consistent state - return this.selection.getRange()[0]; - } - }, { - key: 'getText', - value: function getText() { - var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getLength() - index; - - var _overload9 = overload(index, length); - - var _overload10 = _slicedToArray(_overload9, 2); - - index = _overload10[0]; - length = _overload10[1]; - - return this.editor.getText(index, length); - } - }, { - key: 'hasFocus', - value: function hasFocus() { - return this.selection.hasFocus(); - } - }, { - key: 'insertEmbed', - value: function insertEmbed(index, embed, value) { - var _this7 = this; - - var source = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Quill.sources.API; - - return modify.call(this, function () { - return _this7.editor.insertEmbed(index, embed, value); - }, source, index); - } - }, { - key: 'insertText', - value: function insertText(index, text, name, value, source) { - var _this8 = this; - - var formats = void 0; - - var _overload11 = overload(index, 0, name, value, source); - - var _overload12 = _slicedToArray(_overload11, 4); - - index = _overload12[0]; - formats = _overload12[2]; - source = _overload12[3]; - - return modify.call(this, function () { - return _this8.editor.insertText(index, text, formats); - }, source, index, text.length); - } - }, { - key: 'isEnabled', - value: function isEnabled() { - return !this.container.classList.contains('ql-disabled'); - } - }, { - key: 'off', - value: function off() { - return this.emitter.off.apply(this.emitter, arguments); - } - }, { - key: 'on', - value: function on() { - return this.emitter.on.apply(this.emitter, arguments); - } - }, { - key: 'once', - value: function once() { - return this.emitter.once.apply(this.emitter, arguments); - } - }, { - key: 'pasteHTML', - value: function pasteHTML(index, html, source) { - this.clipboard.dangerouslyPasteHTML(index, html, source); - } - }, { - key: 'removeFormat', - value: function removeFormat(index, length, source) { - var _this9 = this; - - var _overload13 = overload(index, length, source); - - var _overload14 = _slicedToArray(_overload13, 4); - - index = _overload14[0]; - length = _overload14[1]; - source = _overload14[3]; - - return modify.call(this, function () { - return _this9.editor.removeFormat(index, length); - }, source, index); - } - }, { - key: 'scrollIntoView', - value: function scrollIntoView() { - this.selection.scrollIntoView(this.scrollingContainer); - } - }, { - key: 'setContents', - value: function setContents(delta) { - var _this10 = this; - - var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API; - - return modify.call(this, function () { - delta = new _quillDelta2.default(delta); - var length = _this10.getLength(); - var deleted = _this10.editor.deleteText(0, length); - var applied = _this10.editor.applyDelta(delta); - var lastOp = applied.ops[applied.ops.length - 1]; - if (lastOp != null && typeof lastOp.insert === 'string' && lastOp.insert[lastOp.insert.length - 1] === '\n') { - _this10.editor.deleteText(_this10.getLength() - 1, 1); - applied.delete(1); - } - var ret = deleted.compose(applied); - return ret; - }, source); - } - }, { - key: 'setSelection', - value: function setSelection(index, length, source) { - if (index == null) { - this.selection.setRange(null, length || Quill.sources.API); - } else { - var _overload15 = overload(index, length, source); - - var _overload16 = _slicedToArray(_overload15, 4); - - index = _overload16[0]; - length = _overload16[1]; - source = _overload16[3]; - - this.selection.setRange(new _selection.Range(index, length), source); - if (source !== _emitter4.default.sources.SILENT) { - this.selection.scrollIntoView(this.scrollingContainer); - } - } - } - }, { - key: 'setText', - value: function setText(text) { - var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API; - - var delta = new _quillDelta2.default().insert(text); - return this.setContents(delta, source); - } - }, { - key: 'update', - value: function update() { - var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _emitter4.default.sources.USER; - - var change = this.scroll.update(source); // Will update selection before selection.update() does if text changes - this.selection.update(source); - return change; - } - }, { - key: 'updateContents', - value: function updateContents(delta) { - var _this11 = this; - - var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _emitter4.default.sources.API; - - return modify.call(this, function () { - delta = new _quillDelta2.default(delta); - return _this11.editor.applyDelta(delta, source); - }, source, true); - } - }]); - - return Quill; -}(); - -Quill.DEFAULTS = { - bounds: null, - formats: null, - modules: {}, - placeholder: '', - readOnly: false, - scrollingContainer: null, - strict: true, - theme: 'default' -}; -Quill.events = _emitter4.default.events; -Quill.sources = _emitter4.default.sources; -// eslint-disable-next-line no-undef -Quill.version = false ? 'dev' : "1.3.7"; - -Quill.imports = { - 'delta': _quillDelta2.default, - 'parchment': _parchment2.default, - 'core/module': _module2.default, - 'core/theme': _theme2.default -}; - -function expandConfig(container, userConfig) { - userConfig = (0, _extend2.default)(true, { - container: container, - modules: { - clipboard: true, - keyboard: true, - history: true - } - }, userConfig); - if (!userConfig.theme || userConfig.theme === Quill.DEFAULTS.theme) { - userConfig.theme = _theme2.default; - } else { - userConfig.theme = Quill.import('themes/' + userConfig.theme); - if (userConfig.theme == null) { - throw new Error('Invalid theme ' + userConfig.theme + '. Did you register it?'); - } - } - var themeConfig = (0, _extend2.default)(true, {}, userConfig.theme.DEFAULTS); - [themeConfig, userConfig].forEach(function (config) { - config.modules = config.modules || {}; - Object.keys(config.modules).forEach(function (module) { - if (config.modules[module] === true) { - config.modules[module] = {}; - } - }); - }); - var moduleNames = Object.keys(themeConfig.modules).concat(Object.keys(userConfig.modules)); - var moduleConfig = moduleNames.reduce(function (config, name) { - var moduleClass = Quill.import('modules/' + name); - if (moduleClass == null) { - debug.error('Cannot load ' + name + ' module. Are you sure you registered it?'); - } else { - config[name] = moduleClass.DEFAULTS || {}; - } - return config; - }, {}); - // Special case toolbar shorthand - if (userConfig.modules != null && userConfig.modules.toolbar && userConfig.modules.toolbar.constructor !== Object) { - userConfig.modules.toolbar = { - container: userConfig.modules.toolbar - }; - } - userConfig = (0, _extend2.default)(true, {}, Quill.DEFAULTS, { modules: moduleConfig }, themeConfig, userConfig); - ['bounds', 'container', 'scrollingContainer'].forEach(function (key) { - if (typeof userConfig[key] === 'string') { - userConfig[key] = document.querySelector(userConfig[key]); - } - }); - userConfig.modules = Object.keys(userConfig.modules).reduce(function (config, name) { - if (userConfig.modules[name]) { - config[name] = userConfig.modules[name]; - } - return config; - }, {}); - return userConfig; -} - -// Handle selection preservation and TEXT_CHANGE emission -// common to modification APIs -function modify(modifier, source, index, shift) { - if (this.options.strict && !this.isEnabled() && source === _emitter4.default.sources.USER) { - return new _quillDelta2.default(); - } - var range = index == null ? null : this.getSelection(); - var oldDelta = this.editor.delta; - var change = modifier(); - if (range != null) { - if (index === true) index = range.index; - if (shift == null) { - range = shiftRange(range, change, source); - } else if (shift !== 0) { - range = shiftRange(range, index, shift, source); - } - this.setSelection(range, _emitter4.default.sources.SILENT); - } - if (change.length() > 0) { - var _emitter; - - var args = [_emitter4.default.events.TEXT_CHANGE, change, oldDelta, source]; - (_emitter = this.emitter).emit.apply(_emitter, [_emitter4.default.events.EDITOR_CHANGE].concat(args)); - if (source !== _emitter4.default.sources.SILENT) { - var _emitter2; - - (_emitter2 = this.emitter).emit.apply(_emitter2, args); - } - } - return change; -} - -function overload(index, length, name, value, source) { - var formats = {}; - if (typeof index.index === 'number' && typeof index.length === 'number') { - // Allow for throwaway end (used by insertText/insertEmbed) - if (typeof length !== 'number') { - source = value, value = name, name = length, length = index.length, index = index.index; - } else { - length = index.length, index = index.index; - } - } else if (typeof length !== 'number') { - source = value, value = name, name = length, length = 0; - } - // Handle format being object, two format name/value strings or excluded - if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') { - formats = name; - source = value; - } else if (typeof name === 'string') { - if (value != null) { - formats[name] = value; - } else { - source = name; - } - } - // Handle optional source - source = source || _emitter4.default.sources.API; - return [index, length, formats, source]; -} - -function shiftRange(range, index, length, source) { - if (range == null) return null; - var start = void 0, - end = void 0; - if (index instanceof _quillDelta2.default) { - var _map = [range.index, range.index + range.length].map(function (pos) { - return index.transformPosition(pos, source !== _emitter4.default.sources.USER); - }); - - var _map2 = _slicedToArray(_map, 2); - - start = _map2[0]; - end = _map2[1]; - } else { - var _map3 = [range.index, range.index + range.length].map(function (pos) { - if (pos < index || pos === index && source === _emitter4.default.sources.USER) return pos; - if (length >= 0) { - return pos + length; - } else { - return Math.max(index, pos + length); - } - }); - - var _map4 = _slicedToArray(_map3, 2); - - start = _map4[0]; - end = _map4[1]; - } - return new _selection.Range(start, end - start); -} - -exports.expandConfig = expandConfig; -exports.overload = overload; -exports.default = Quill; - -/***/ }), -/* 6 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _text = __webpack_require__(7); - -var _text2 = _interopRequireDefault(_text); - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Inline = function (_Parchment$Inline) { - _inherits(Inline, _Parchment$Inline); - - function Inline() { - _classCallCheck(this, Inline); - - return _possibleConstructorReturn(this, (Inline.__proto__ || Object.getPrototypeOf(Inline)).apply(this, arguments)); - } - - _createClass(Inline, [{ - key: 'formatAt', - value: function formatAt(index, length, name, value) { - if (Inline.compare(this.statics.blotName, name) < 0 && _parchment2.default.query(name, _parchment2.default.Scope.BLOT)) { - var blot = this.isolate(index, length); - if (value) { - blot.wrap(name, value); - } - } else { - _get(Inline.prototype.__proto__ || Object.getPrototypeOf(Inline.prototype), 'formatAt', this).call(this, index, length, name, value); - } - } - }, { - key: 'optimize', - value: function optimize(context) { - _get(Inline.prototype.__proto__ || Object.getPrototypeOf(Inline.prototype), 'optimize', this).call(this, context); - if (this.parent instanceof Inline && Inline.compare(this.statics.blotName, this.parent.statics.blotName) > 0) { - var parent = this.parent.isolate(this.offset(), this.length()); - this.moveChildren(parent); - parent.wrap(this); - } - } - }], [{ - key: 'compare', - value: function compare(self, other) { - var selfIndex = Inline.order.indexOf(self); - var otherIndex = Inline.order.indexOf(other); - if (selfIndex >= 0 || otherIndex >= 0) { - return selfIndex - otherIndex; - } else if (self === other) { - return 0; - } else if (self < other) { - return -1; - } else { - return 1; - } - } - }]); - - return Inline; -}(_parchment2.default.Inline); - -Inline.allowedChildren = [Inline, _parchment2.default.Embed, _text2.default]; -// Lower index means deeper in the DOM tree, since not found (-1) is for embeds -Inline.order = ['cursor', 'inline', // Must be lower -'underline', 'strike', 'italic', 'bold', 'script', 'link', 'code' // Must be higher -]; - -exports.default = Inline; - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var TextBlot = function (_Parchment$Text) { - _inherits(TextBlot, _Parchment$Text); - - function TextBlot() { - _classCallCheck(this, TextBlot); - - return _possibleConstructorReturn(this, (TextBlot.__proto__ || Object.getPrototypeOf(TextBlot)).apply(this, arguments)); - } - - return TextBlot; -}(_parchment2.default.Text); - -exports.default = TextBlot; - -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _eventemitter = __webpack_require__(54); - -var _eventemitter2 = _interopRequireDefault(_eventemitter); - -var _logger = __webpack_require__(10); - -var _logger2 = _interopRequireDefault(_logger); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var debug = (0, _logger2.default)('quill:events'); - -var EVENTS = ['selectionchange', 'mousedown', 'mouseup', 'click']; - -EVENTS.forEach(function (eventName) { - document.addEventListener(eventName, function () { - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - [].slice.call(document.querySelectorAll('.ql-container')).forEach(function (node) { - // TODO use WeakMap - if (node.__quill && node.__quill.emitter) { - var _node$__quill$emitter; - - (_node$__quill$emitter = node.__quill.emitter).handleDOM.apply(_node$__quill$emitter, args); - } - }); - }); -}); - -var Emitter = function (_EventEmitter) { - _inherits(Emitter, _EventEmitter); - - function Emitter() { - _classCallCheck(this, Emitter); - - var _this = _possibleConstructorReturn(this, (Emitter.__proto__ || Object.getPrototypeOf(Emitter)).call(this)); - - _this.listeners = {}; - _this.on('error', debug.error); - return _this; - } - - _createClass(Emitter, [{ - key: 'emit', - value: function emit() { - debug.log.apply(debug, arguments); - _get(Emitter.prototype.__proto__ || Object.getPrototypeOf(Emitter.prototype), 'emit', this).apply(this, arguments); - } - }, { - key: 'handleDOM', - value: function handleDOM(event) { - for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - args[_key2 - 1] = arguments[_key2]; - } - - (this.listeners[event.type] || []).forEach(function (_ref) { - var node = _ref.node, - handler = _ref.handler; - - if (event.target === node || node.contains(event.target)) { - handler.apply(undefined, [event].concat(args)); - } - }); - } - }, { - key: 'listenDOM', - value: function listenDOM(eventName, node, handler) { - if (!this.listeners[eventName]) { - this.listeners[eventName] = []; - } - this.listeners[eventName].push({ node: node, handler: handler }); - } - }]); - - return Emitter; -}(_eventemitter2.default); - -Emitter.events = { - EDITOR_CHANGE: 'editor-change', - SCROLL_BEFORE_UPDATE: 'scroll-before-update', - SCROLL_OPTIMIZE: 'scroll-optimize', - SCROLL_UPDATE: 'scroll-update', - SELECTION_CHANGE: 'selection-change', - TEXT_CHANGE: 'text-change' -}; -Emitter.sources = { - API: 'api', - SILENT: 'silent', - USER: 'user' -}; - -exports.default = Emitter; - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Module = function Module(quill) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - _classCallCheck(this, Module); - - this.quill = quill; - this.options = options; -}; - -Module.DEFAULTS = {}; - -exports.default = Module; - -/***/ }), -/* 10 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -var levels = ['error', 'warn', 'log', 'info']; -var level = 'warn'; - -function debug(method) { - if (levels.indexOf(method) <= levels.indexOf(level)) { - var _console; - - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - (_console = console)[method].apply(_console, args); // eslint-disable-line no-console - } -} - -function namespace(ns) { - return levels.reduce(function (logger, method) { - logger[method] = debug.bind(console, method, ns); - return logger; - }, {}); -} - -debug.level = namespace.level = function (newLevel) { - level = newLevel; -}; - -exports.default = namespace; - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - -var pSlice = Array.prototype.slice; -var objectKeys = __webpack_require__(52); -var isArguments = __webpack_require__(53); - -var deepEqual = module.exports = function (actual, expected, opts) { - if (!opts) opts = {}; - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - // 7.3. Other pairs that do not both pass typeof value == 'object', - // equivalence is determined by ==. - } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') { - return opts.strict ? actual === expected : actual == expected; - - // 7.4. For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical 'prototype' property. Note: this - // accounts for both named and indexed properties on Arrays. - } else { - return objEquiv(actual, expected, opts); - } -} - -function isUndefinedOrNull(value) { - return value === null || value === undefined; -} - -function isBuffer (x) { - if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false; - if (typeof x.copy !== 'function' || typeof x.slice !== 'function') { - return false; - } - if (x.length > 0 && typeof x[0] !== 'number') return false; - return true; -} - -function objEquiv(a, b, opts) { - var i, key; - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - // an identical 'prototype' property. - if (a.prototype !== b.prototype) return false; - //~~~I've managed to break Object.keys through screwy arguments passing. - // Converting to array solves the problem. - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return deepEqual(a, b, opts); - } - if (isBuffer(a)) { - if (!isBuffer(b)) { - return false; - } - if (a.length !== b.length) return false; - for (i = 0; i < a.length; i++) { - if (a[i] !== b[i]) return false; - } - return true; - } - try { - var ka = objectKeys(a), - kb = objectKeys(b); - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates - // hasOwnProperty) - if (ka.length != kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!deepEqual(a[key], b[key], opts)) return false; - } - return typeof a === typeof b; -} - - -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -var Registry = __webpack_require__(1); -var Attributor = /** @class */ (function () { - function Attributor(attrName, keyName, options) { - if (options === void 0) { options = {}; } - this.attrName = attrName; - this.keyName = keyName; - var attributeBit = Registry.Scope.TYPE & Registry.Scope.ATTRIBUTE; - if (options.scope != null) { - // Ignore type bits, force attribute bit - this.scope = (options.scope & Registry.Scope.LEVEL) | attributeBit; - } - else { - this.scope = Registry.Scope.ATTRIBUTE; - } - if (options.whitelist != null) - this.whitelist = options.whitelist; - } - Attributor.keys = function (node) { - return [].map.call(node.attributes, function (item) { - return item.name; - }); - }; - Attributor.prototype.add = function (node, value) { - if (!this.canAdd(node, value)) - return false; - node.setAttribute(this.keyName, value); - return true; - }; - Attributor.prototype.canAdd = function (node, value) { - var match = Registry.query(node, Registry.Scope.BLOT & (this.scope | Registry.Scope.TYPE)); - if (match == null) - return false; - if (this.whitelist == null) - return true; - if (typeof value === 'string') { - return this.whitelist.indexOf(value.replace(/["']/g, '')) > -1; - } - else { - return this.whitelist.indexOf(value) > -1; - } - }; - Attributor.prototype.remove = function (node) { - node.removeAttribute(this.keyName); - }; - Attributor.prototype.value = function (node) { - var value = node.getAttribute(this.keyName); - if (this.canAdd(node, value) && value) { - return value; - } - return ''; - }; - return Attributor; -}()); -exports.default = Attributor; - - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = exports.Code = undefined; - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _quillDelta = __webpack_require__(2); - -var _quillDelta2 = _interopRequireDefault(_quillDelta); - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _block = __webpack_require__(4); - -var _block2 = _interopRequireDefault(_block); - -var _inline = __webpack_require__(6); - -var _inline2 = _interopRequireDefault(_inline); - -var _text = __webpack_require__(7); - -var _text2 = _interopRequireDefault(_text); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Code = function (_Inline) { - _inherits(Code, _Inline); - - function Code() { - _classCallCheck(this, Code); - - return _possibleConstructorReturn(this, (Code.__proto__ || Object.getPrototypeOf(Code)).apply(this, arguments)); - } - - return Code; -}(_inline2.default); - -Code.blotName = 'code'; -Code.tagName = 'CODE'; - -var CodeBlock = function (_Block) { - _inherits(CodeBlock, _Block); - - function CodeBlock() { - _classCallCheck(this, CodeBlock); - - return _possibleConstructorReturn(this, (CodeBlock.__proto__ || Object.getPrototypeOf(CodeBlock)).apply(this, arguments)); - } - - _createClass(CodeBlock, [{ - key: 'delta', - value: function delta() { - var _this3 = this; - - var text = this.domNode.textContent; - if (text.endsWith('\n')) { - // Should always be true - text = text.slice(0, -1); - } - return text.split('\n').reduce(function (delta, frag) { - return delta.insert(frag).insert('\n', _this3.formats()); - }, new _quillDelta2.default()); - } - }, { - key: 'format', - value: function format(name, value) { - if (name === this.statics.blotName && value) return; - - var _descendant = this.descendant(_text2.default, this.length() - 1), - _descendant2 = _slicedToArray(_descendant, 1), - text = _descendant2[0]; - - if (text != null) { - text.deleteAt(text.length() - 1, 1); - } - _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'format', this).call(this, name, value); - } - }, { - key: 'formatAt', - value: function formatAt(index, length, name, value) { - if (length === 0) return; - if (_parchment2.default.query(name, _parchment2.default.Scope.BLOCK) == null || name === this.statics.blotName && value === this.statics.formats(this.domNode)) { - return; - } - var nextNewline = this.newlineIndex(index); - if (nextNewline < 0 || nextNewline >= index + length) return; - var prevNewline = this.newlineIndex(index, true) + 1; - var isolateLength = nextNewline - prevNewline + 1; - var blot = this.isolate(prevNewline, isolateLength); - var next = blot.next; - blot.format(name, value); - if (next instanceof CodeBlock) { - next.formatAt(0, index - prevNewline + length - isolateLength, name, value); - } - } - }, { - key: 'insertAt', - value: function insertAt(index, value, def) { - if (def != null) return; - - var _descendant3 = this.descendant(_text2.default, index), - _descendant4 = _slicedToArray(_descendant3, 2), - text = _descendant4[0], - offset = _descendant4[1]; - - text.insertAt(offset, value); - } - }, { - key: 'length', - value: function length() { - var length = this.domNode.textContent.length; - if (!this.domNode.textContent.endsWith('\n')) { - return length + 1; - } - return length; - } - }, { - key: 'newlineIndex', - value: function newlineIndex(searchIndex) { - var reverse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - if (!reverse) { - var offset = this.domNode.textContent.slice(searchIndex).indexOf('\n'); - return offset > -1 ? searchIndex + offset : -1; - } else { - return this.domNode.textContent.slice(0, searchIndex).lastIndexOf('\n'); - } - } - }, { - key: 'optimize', - value: function optimize(context) { - if (!this.domNode.textContent.endsWith('\n')) { - this.appendChild(_parchment2.default.create('text', '\n')); - } - _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'optimize', this).call(this, context); - var next = this.next; - if (next != null && next.prev === this && next.statics.blotName === this.statics.blotName && this.statics.formats(this.domNode) === next.statics.formats(next.domNode)) { - next.optimize(context); - next.moveChildren(this); - next.remove(); - } - } - }, { - key: 'replace', - value: function replace(target) { - _get(CodeBlock.prototype.__proto__ || Object.getPrototypeOf(CodeBlock.prototype), 'replace', this).call(this, target); - [].slice.call(this.domNode.querySelectorAll('*')).forEach(function (node) { - var blot = _parchment2.default.find(node); - if (blot == null) { - node.parentNode.removeChild(node); - } else if (blot instanceof _parchment2.default.Embed) { - blot.remove(); - } else { - blot.unwrap(); - } - }); - } - }], [{ - key: 'create', - value: function create(value) { - var domNode = _get(CodeBlock.__proto__ || Object.getPrototypeOf(CodeBlock), 'create', this).call(this, value); - domNode.setAttribute('spellcheck', false); - return domNode; - } - }, { - key: 'formats', - value: function formats() { - return true; - } - }]); - - return CodeBlock; -}(_block2.default); - -CodeBlock.blotName = 'code-block'; -CodeBlock.tagName = 'PRE'; -CodeBlock.TAB = ' '; - -exports.Code = Code; -exports.default = CodeBlock; - -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _quillDelta = __webpack_require__(2); - -var _quillDelta2 = _interopRequireDefault(_quillDelta); - -var _op = __webpack_require__(20); - -var _op2 = _interopRequireDefault(_op); - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _code = __webpack_require__(13); - -var _code2 = _interopRequireDefault(_code); - -var _cursor = __webpack_require__(24); - -var _cursor2 = _interopRequireDefault(_cursor); - -var _block = __webpack_require__(4); - -var _block2 = _interopRequireDefault(_block); - -var _break = __webpack_require__(16); - -var _break2 = _interopRequireDefault(_break); - -var _clone = __webpack_require__(21); - -var _clone2 = _interopRequireDefault(_clone); - -var _deepEqual = __webpack_require__(11); - -var _deepEqual2 = _interopRequireDefault(_deepEqual); - -var _extend = __webpack_require__(3); - -var _extend2 = _interopRequireDefault(_extend); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var ASCII = /^[ -~]*$/; - -var Editor = function () { - function Editor(scroll) { - _classCallCheck(this, Editor); - - this.scroll = scroll; - this.delta = this.getDelta(); - } - - _createClass(Editor, [{ - key: 'applyDelta', - value: function applyDelta(delta) { - var _this = this; - - var consumeNextNewline = false; - this.scroll.update(); - var scrollLength = this.scroll.length(); - this.scroll.batchStart(); - delta = normalizeDelta(delta); - delta.reduce(function (index, op) { - var length = op.retain || op.delete || op.insert.length || 1; - var attributes = op.attributes || {}; - if (op.insert != null) { - if (typeof op.insert === 'string') { - var text = op.insert; - if (text.endsWith('\n') && consumeNextNewline) { - consumeNextNewline = false; - text = text.slice(0, -1); - } - if (index >= scrollLength && !text.endsWith('\n')) { - consumeNextNewline = true; - } - _this.scroll.insertAt(index, text); - - var _scroll$line = _this.scroll.line(index), - _scroll$line2 = _slicedToArray(_scroll$line, 2), - line = _scroll$line2[0], - offset = _scroll$line2[1]; - - var formats = (0, _extend2.default)({}, (0, _block.bubbleFormats)(line)); - if (line instanceof _block2.default) { - var _line$descendant = line.descendant(_parchment2.default.Leaf, offset), - _line$descendant2 = _slicedToArray(_line$descendant, 1), - leaf = _line$descendant2[0]; - - formats = (0, _extend2.default)(formats, (0, _block.bubbleFormats)(leaf)); - } - attributes = _op2.default.attributes.diff(formats, attributes) || {}; - } else if (_typeof(op.insert) === 'object') { - var key = Object.keys(op.insert)[0]; // There should only be one key - if (key == null) return index; - _this.scroll.insertAt(index, key, op.insert[key]); - } - scrollLength += length; - } - Object.keys(attributes).forEach(function (name) { - _this.scroll.formatAt(index, length, name, attributes[name]); - }); - return index + length; - }, 0); - delta.reduce(function (index, op) { - if (typeof op.delete === 'number') { - _this.scroll.deleteAt(index, op.delete); - return index; - } - return index + (op.retain || op.insert.length || 1); - }, 0); - this.scroll.batchEnd(); - return this.update(delta); - } - }, { - key: 'deleteText', - value: function deleteText(index, length) { - this.scroll.deleteAt(index, length); - return this.update(new _quillDelta2.default().retain(index).delete(length)); - } - }, { - key: 'formatLine', - value: function formatLine(index, length) { - var _this2 = this; - - var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - - this.scroll.update(); - Object.keys(formats).forEach(function (format) { - if (_this2.scroll.whitelist != null && !_this2.scroll.whitelist[format]) return; - var lines = _this2.scroll.lines(index, Math.max(length, 1)); - var lengthRemaining = length; - lines.forEach(function (line) { - var lineLength = line.length(); - if (!(line instanceof _code2.default)) { - line.format(format, formats[format]); - } else { - var codeIndex = index - line.offset(_this2.scroll); - var codeLength = line.newlineIndex(codeIndex + lengthRemaining) - codeIndex + 1; - line.formatAt(codeIndex, codeLength, format, formats[format]); - } - lengthRemaining -= lineLength; - }); - }); - this.scroll.optimize(); - return this.update(new _quillDelta2.default().retain(index).retain(length, (0, _clone2.default)(formats))); - } - }, { - key: 'formatText', - value: function formatText(index, length) { - var _this3 = this; - - var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - - Object.keys(formats).forEach(function (format) { - _this3.scroll.formatAt(index, length, format, formats[format]); - }); - return this.update(new _quillDelta2.default().retain(index).retain(length, (0, _clone2.default)(formats))); - } - }, { - key: 'getContents', - value: function getContents(index, length) { - return this.delta.slice(index, index + length); - } - }, { - key: 'getDelta', - value: function getDelta() { - return this.scroll.lines().reduce(function (delta, line) { - return delta.concat(line.delta()); - }, new _quillDelta2.default()); - } - }, { - key: 'getFormat', - value: function getFormat(index) { - var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - var lines = [], - leaves = []; - if (length === 0) { - this.scroll.path(index).forEach(function (path) { - var _path = _slicedToArray(path, 1), - blot = _path[0]; - - if (blot instanceof _block2.default) { - lines.push(blot); - } else if (blot instanceof _parchment2.default.Leaf) { - leaves.push(blot); - } - }); - } else { - lines = this.scroll.lines(index, length); - leaves = this.scroll.descendants(_parchment2.default.Leaf, index, length); - } - var formatsArr = [lines, leaves].map(function (blots) { - if (blots.length === 0) return {}; - var formats = (0, _block.bubbleFormats)(blots.shift()); - while (Object.keys(formats).length > 0) { - var blot = blots.shift(); - if (blot == null) return formats; - formats = combineFormats((0, _block.bubbleFormats)(blot), formats); - } - return formats; - }); - return _extend2.default.apply(_extend2.default, formatsArr); - } - }, { - key: 'getText', - value: function getText(index, length) { - return this.getContents(index, length).filter(function (op) { - return typeof op.insert === 'string'; - }).map(function (op) { - return op.insert; - }).join(''); - } - }, { - key: 'insertEmbed', - value: function insertEmbed(index, embed, value) { - this.scroll.insertAt(index, embed, value); - return this.update(new _quillDelta2.default().retain(index).insert(_defineProperty({}, embed, value))); - } - }, { - key: 'insertText', - value: function insertText(index, text) { - var _this4 = this; - - var formats = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - - text = text.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); - this.scroll.insertAt(index, text); - Object.keys(formats).forEach(function (format) { - _this4.scroll.formatAt(index, text.length, format, formats[format]); - }); - return this.update(new _quillDelta2.default().retain(index).insert(text, (0, _clone2.default)(formats))); - } - }, { - key: 'isBlank', - value: function isBlank() { - if (this.scroll.children.length == 0) return true; - if (this.scroll.children.length > 1) return false; - var block = this.scroll.children.head; - if (block.statics.blotName !== _block2.default.blotName) return false; - if (block.children.length > 1) return false; - return block.children.head instanceof _break2.default; - } - }, { - key: 'removeFormat', - value: function removeFormat(index, length) { - var text = this.getText(index, length); - - var _scroll$line3 = this.scroll.line(index + length), - _scroll$line4 = _slicedToArray(_scroll$line3, 2), - line = _scroll$line4[0], - offset = _scroll$line4[1]; - - var suffixLength = 0, - suffix = new _quillDelta2.default(); - if (line != null) { - if (!(line instanceof _code2.default)) { - suffixLength = line.length() - offset; - } else { - suffixLength = line.newlineIndex(offset) - offset + 1; - } - suffix = line.delta().slice(offset, offset + suffixLength - 1).insert('\n'); - } - var contents = this.getContents(index, length + suffixLength); - var diff = contents.diff(new _quillDelta2.default().insert(text).concat(suffix)); - var delta = new _quillDelta2.default().retain(index).concat(diff); - return this.applyDelta(delta); - } - }, { - key: 'update', - value: function update(change) { - var mutations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; - var cursorIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; - - var oldDelta = this.delta; - if (mutations.length === 1 && mutations[0].type === 'characterData' && mutations[0].target.data.match(ASCII) && _parchment2.default.find(mutations[0].target)) { - // Optimization for character changes - var textBlot = _parchment2.default.find(mutations[0].target); - var formats = (0, _block.bubbleFormats)(textBlot); - var index = textBlot.offset(this.scroll); - var oldValue = mutations[0].oldValue.replace(_cursor2.default.CONTENTS, ''); - var oldText = new _quillDelta2.default().insert(oldValue); - var newText = new _quillDelta2.default().insert(textBlot.value()); - var diffDelta = new _quillDelta2.default().retain(index).concat(oldText.diff(newText, cursorIndex)); - change = diffDelta.reduce(function (delta, op) { - if (op.insert) { - return delta.insert(op.insert, formats); - } else { - return delta.push(op); - } - }, new _quillDelta2.default()); - this.delta = oldDelta.compose(change); - } else { - this.delta = this.getDelta(); - if (!change || !(0, _deepEqual2.default)(oldDelta.compose(change), this.delta)) { - change = oldDelta.diff(this.delta, cursorIndex); - } - } - return change; - } - }]); - - return Editor; -}(); - -function combineFormats(formats, combined) { - return Object.keys(combined).reduce(function (merged, name) { - if (formats[name] == null) return merged; - if (combined[name] === formats[name]) { - merged[name] = combined[name]; - } else if (Array.isArray(combined[name])) { - if (combined[name].indexOf(formats[name]) < 0) { - merged[name] = combined[name].concat([formats[name]]); - } - } else { - merged[name] = [combined[name], formats[name]]; - } - return merged; - }, {}); -} - -function normalizeDelta(delta) { - return delta.reduce(function (delta, op) { - if (op.insert === 1) { - var attributes = (0, _clone2.default)(op.attributes); - delete attributes['image']; - return delta.insert({ image: op.attributes.image }, attributes); - } - if (op.attributes != null && (op.attributes.list === true || op.attributes.bullet === true)) { - op = (0, _clone2.default)(op); - if (op.attributes.list) { - op.attributes.list = 'ordered'; - } else { - op.attributes.list = 'bullet'; - delete op.attributes.bullet; - } - } - if (typeof op.insert === 'string') { - var text = op.insert.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); - return delta.insert(text, op.attributes); - } - return delta.push(op); - }, new _quillDelta2.default()); -} - -exports.default = Editor; - -/***/ }), -/* 15 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = exports.Range = undefined; - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _clone = __webpack_require__(21); - -var _clone2 = _interopRequireDefault(_clone); - -var _deepEqual = __webpack_require__(11); - -var _deepEqual2 = _interopRequireDefault(_deepEqual); - -var _emitter3 = __webpack_require__(8); - -var _emitter4 = _interopRequireDefault(_emitter3); - -var _logger = __webpack_require__(10); - -var _logger2 = _interopRequireDefault(_logger); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var debug = (0, _logger2.default)('quill:selection'); - -var Range = function Range(index) { - var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - _classCallCheck(this, Range); - - this.index = index; - this.length = length; -}; - -var Selection = function () { - function Selection(scroll, emitter) { - var _this = this; - - _classCallCheck(this, Selection); - - this.emitter = emitter; - this.scroll = scroll; - this.composing = false; - this.mouseDown = false; - this.root = this.scroll.domNode; - this.cursor = _parchment2.default.create('cursor', this); - // savedRange is last non-null range - this.lastRange = this.savedRange = new Range(0, 0); - this.handleComposition(); - this.handleDragging(); - this.emitter.listenDOM('selectionchange', document, function () { - if (!_this.mouseDown) { - setTimeout(_this.update.bind(_this, _emitter4.default.sources.USER), 1); - } - }); - this.emitter.on(_emitter4.default.events.EDITOR_CHANGE, function (type, delta) { - if (type === _emitter4.default.events.TEXT_CHANGE && delta.length() > 0) { - _this.update(_emitter4.default.sources.SILENT); - } - }); - this.emitter.on(_emitter4.default.events.SCROLL_BEFORE_UPDATE, function () { - if (!_this.hasFocus()) return; - var native = _this.getNativeRange(); - if (native == null) return; - if (native.start.node === _this.cursor.textNode) return; // cursor.restore() will handle - // TODO unclear if this has negative side effects - _this.emitter.once(_emitter4.default.events.SCROLL_UPDATE, function () { - try { - _this.setNativeRange(native.start.node, native.start.offset, native.end.node, native.end.offset); - } catch (ignored) {} - }); - }); - this.emitter.on(_emitter4.default.events.SCROLL_OPTIMIZE, function (mutations, context) { - if (context.range) { - var _context$range = context.range, - startNode = _context$range.startNode, - startOffset = _context$range.startOffset, - endNode = _context$range.endNode, - endOffset = _context$range.endOffset; - - _this.setNativeRange(startNode, startOffset, endNode, endOffset); - } - }); - this.update(_emitter4.default.sources.SILENT); - } - - _createClass(Selection, [{ - key: 'handleComposition', - value: function handleComposition() { - var _this2 = this; - - this.root.addEventListener('compositionstart', function () { - _this2.composing = true; - }); - this.root.addEventListener('compositionend', function () { - _this2.composing = false; - if (_this2.cursor.parent) { - var range = _this2.cursor.restore(); - if (!range) return; - setTimeout(function () { - _this2.setNativeRange(range.startNode, range.startOffset, range.endNode, range.endOffset); - }, 1); - } - }); - } - }, { - key: 'handleDragging', - value: function handleDragging() { - var _this3 = this; - - this.emitter.listenDOM('mousedown', document.body, function () { - _this3.mouseDown = true; - }); - this.emitter.listenDOM('mouseup', document.body, function () { - _this3.mouseDown = false; - _this3.update(_emitter4.default.sources.USER); - }); - } - }, { - key: 'focus', - value: function focus() { - if (this.hasFocus()) return; - this.root.focus(); - this.setRange(this.savedRange); - } - }, { - key: 'format', - value: function format(_format, value) { - if (this.scroll.whitelist != null && !this.scroll.whitelist[_format]) return; - this.scroll.update(); - var nativeRange = this.getNativeRange(); - if (nativeRange == null || !nativeRange.native.collapsed || _parchment2.default.query(_format, _parchment2.default.Scope.BLOCK)) return; - if (nativeRange.start.node !== this.cursor.textNode) { - var blot = _parchment2.default.find(nativeRange.start.node, false); - if (blot == null) return; - // TODO Give blot ability to not split - if (blot instanceof _parchment2.default.Leaf) { - var after = blot.split(nativeRange.start.offset); - blot.parent.insertBefore(this.cursor, after); - } else { - blot.insertBefore(this.cursor, nativeRange.start.node); // Should never happen - } - this.cursor.attach(); - } - this.cursor.format(_format, value); - this.scroll.optimize(); - this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length); - this.update(); - } - }, { - key: 'getBounds', - value: function getBounds(index) { - var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - - var scrollLength = this.scroll.length(); - index = Math.min(index, scrollLength - 1); - length = Math.min(index + length, scrollLength - 1) - index; - var node = void 0, - _scroll$leaf = this.scroll.leaf(index), - _scroll$leaf2 = _slicedToArray(_scroll$leaf, 2), - leaf = _scroll$leaf2[0], - offset = _scroll$leaf2[1]; - if (leaf == null) return null; - - var _leaf$position = leaf.position(offset, true); - - var _leaf$position2 = _slicedToArray(_leaf$position, 2); - - node = _leaf$position2[0]; - offset = _leaf$position2[1]; - - var range = document.createRange(); - if (length > 0) { - range.setStart(node, offset); - - var _scroll$leaf3 = this.scroll.leaf(index + length); - - var _scroll$leaf4 = _slicedToArray(_scroll$leaf3, 2); - - leaf = _scroll$leaf4[0]; - offset = _scroll$leaf4[1]; - - if (leaf == null) return null; - - var _leaf$position3 = leaf.position(offset, true); - - var _leaf$position4 = _slicedToArray(_leaf$position3, 2); - - node = _leaf$position4[0]; - offset = _leaf$position4[1]; - - range.setEnd(node, offset); - return range.getBoundingClientRect(); - } else { - var side = 'left'; - var rect = void 0; - if (node instanceof Text) { - if (offset < node.data.length) { - range.setStart(node, offset); - range.setEnd(node, offset + 1); - } else { - range.setStart(node, offset - 1); - range.setEnd(node, offset); - side = 'right'; - } - rect = range.getBoundingClientRect(); - } else { - rect = leaf.domNode.getBoundingClientRect(); - if (offset > 0) side = 'right'; - } - return { - bottom: rect.top + rect.height, - height: rect.height, - left: rect[side], - right: rect[side], - top: rect.top, - width: 0 - }; - } - } - }, { - key: 'getNativeRange', - value: function getNativeRange() { - var selection = document.getSelection(); - if (selection == null || selection.rangeCount <= 0) return null; - var nativeRange = selection.getRangeAt(0); - if (nativeRange == null) return null; - var range = this.normalizeNative(nativeRange); - debug.info('getNativeRange', range); - return range; - } - }, { - key: 'getRange', - value: function getRange() { - var normalized = this.getNativeRange(); - if (normalized == null) return [null, null]; - var range = this.normalizedToRange(normalized); - return [range, normalized]; - } - }, { - key: 'hasFocus', - value: function hasFocus() { - return document.activeElement === this.root; - } - }, { - key: 'normalizedToRange', - value: function normalizedToRange(range) { - var _this4 = this; - - var positions = [[range.start.node, range.start.offset]]; - if (!range.native.collapsed) { - positions.push([range.end.node, range.end.offset]); - } - var indexes = positions.map(function (position) { - var _position = _slicedToArray(position, 2), - node = _position[0], - offset = _position[1]; - - var blot = _parchment2.default.find(node, true); - var index = blot.offset(_this4.scroll); - if (offset === 0) { - return index; - } else if (blot instanceof _parchment2.default.Container) { - return index + blot.length(); - } else { - return index + blot.index(node, offset); - } - }); - var end = Math.min(Math.max.apply(Math, _toConsumableArray(indexes)), this.scroll.length() - 1); - var start = Math.min.apply(Math, [end].concat(_toConsumableArray(indexes))); - return new Range(start, end - start); - } - }, { - key: 'normalizeNative', - value: function normalizeNative(nativeRange) { - if (!contains(this.root, nativeRange.startContainer) || !nativeRange.collapsed && !contains(this.root, nativeRange.endContainer)) { - return null; - } - var range = { - start: { node: nativeRange.startContainer, offset: nativeRange.startOffset }, - end: { node: nativeRange.endContainer, offset: nativeRange.endOffset }, - native: nativeRange - }; - [range.start, range.end].forEach(function (position) { - var node = position.node, - offset = position.offset; - while (!(node instanceof Text) && node.childNodes.length > 0) { - if (node.childNodes.length > offset) { - node = node.childNodes[offset]; - offset = 0; - } else if (node.childNodes.length === offset) { - node = node.lastChild; - offset = node instanceof Text ? node.data.length : node.childNodes.length + 1; - } else { - break; - } - } - position.node = node, position.offset = offset; - }); - return range; - } - }, { - key: 'rangeToNative', - value: function rangeToNative(range) { - var _this5 = this; - - var indexes = range.collapsed ? [range.index] : [range.index, range.index + range.length]; - var args = []; - var scrollLength = this.scroll.length(); - indexes.forEach(function (index, i) { - index = Math.min(scrollLength - 1, index); - var node = void 0, - _scroll$leaf5 = _this5.scroll.leaf(index), - _scroll$leaf6 = _slicedToArray(_scroll$leaf5, 2), - leaf = _scroll$leaf6[0], - offset = _scroll$leaf6[1]; - var _leaf$position5 = leaf.position(offset, i !== 0); - - var _leaf$position6 = _slicedToArray(_leaf$position5, 2); - - node = _leaf$position6[0]; - offset = _leaf$position6[1]; - - args.push(node, offset); - }); - if (args.length < 2) { - args = args.concat(args); - } - return args; - } - }, { - key: 'scrollIntoView', - value: function scrollIntoView(scrollingContainer) { - var range = this.lastRange; - if (range == null) return; - var bounds = this.getBounds(range.index, range.length); - if (bounds == null) return; - var limit = this.scroll.length() - 1; - - var _scroll$line = this.scroll.line(Math.min(range.index, limit)), - _scroll$line2 = _slicedToArray(_scroll$line, 1), - first = _scroll$line2[0]; - - var last = first; - if (range.length > 0) { - var _scroll$line3 = this.scroll.line(Math.min(range.index + range.length, limit)); - - var _scroll$line4 = _slicedToArray(_scroll$line3, 1); - - last = _scroll$line4[0]; - } - if (first == null || last == null || scrollingContainer == null) return; - var scrollBounds = scrollingContainer.getBoundingClientRect(); - if (bounds.top < scrollBounds.top) { - scrollingContainer.scrollTop -= scrollBounds.top - bounds.top; - } else if (bounds.bottom > scrollBounds.bottom) { - scrollingContainer.scrollTop += bounds.bottom - scrollBounds.bottom; - } - } - }, { - key: 'setNativeRange', - value: function setNativeRange(startNode, startOffset) { - var endNode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : startNode; - var endOffset = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : startOffset; - var force = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; - - debug.info('setNativeRange', startNode, startOffset, endNode, endOffset); - if (startNode != null && (this.root.parentNode == null || startNode.parentNode == null || endNode.parentNode == null)) { - return; - } - var selection = document.getSelection(); - if (selection == null) return; - if (startNode != null) { - if (!this.hasFocus()) this.root.focus(); - var native = (this.getNativeRange() || {}).native; - if (native == null || force || startNode !== native.startContainer || startOffset !== native.startOffset || endNode !== native.endContainer || endOffset !== native.endOffset) { - - if (startNode.tagName == "BR") { - startOffset = [].indexOf.call(startNode.parentNode.childNodes, startNode); - startNode = startNode.parentNode; - } - if (endNode.tagName == "BR") { - endOffset = [].indexOf.call(endNode.parentNode.childNodes, endNode); - endNode = endNode.parentNode; - } - var range = document.createRange(); - range.setStart(startNode, startOffset); - range.setEnd(endNode, endOffset); - selection.removeAllRanges(); - selection.addRange(range); - } - } else { - selection.removeAllRanges(); - this.root.blur(); - document.body.focus(); // root.blur() not enough on IE11+Travis+SauceLabs (but not local VMs) - } - } - }, { - key: 'setRange', - value: function setRange(range) { - var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _emitter4.default.sources.API; - - if (typeof force === 'string') { - source = force; - force = false; - } - debug.info('setRange', range); - if (range != null) { - var args = this.rangeToNative(range); - this.setNativeRange.apply(this, _toConsumableArray(args).concat([force])); - } else { - this.setNativeRange(null); - } - this.update(source); - } - }, { - key: 'update', - value: function update() { - var source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _emitter4.default.sources.USER; - - var oldRange = this.lastRange; - - var _getRange = this.getRange(), - _getRange2 = _slicedToArray(_getRange, 2), - lastRange = _getRange2[0], - nativeRange = _getRange2[1]; - - this.lastRange = lastRange; - if (this.lastRange != null) { - this.savedRange = this.lastRange; - } - if (!(0, _deepEqual2.default)(oldRange, this.lastRange)) { - var _emitter; - - if (!this.composing && nativeRange != null && nativeRange.native.collapsed && nativeRange.start.node !== this.cursor.textNode) { - this.cursor.restore(); - } - var args = [_emitter4.default.events.SELECTION_CHANGE, (0, _clone2.default)(this.lastRange), (0, _clone2.default)(oldRange), source]; - (_emitter = this.emitter).emit.apply(_emitter, [_emitter4.default.events.EDITOR_CHANGE].concat(args)); - if (source !== _emitter4.default.sources.SILENT) { - var _emitter2; - - (_emitter2 = this.emitter).emit.apply(_emitter2, args); - } - } - } - }]); - - return Selection; -}(); - -function contains(parent, descendant) { - try { - // Firefox inserts inaccessible nodes around video elements - descendant.parentNode; - } catch (e) { - return false; - } - // IE11 has bug with Text nodes - // https://connect.microsoft.com/IE/feedback/details/780874/node-contains-is-incorrect - if (descendant instanceof Text) { - descendant = descendant.parentNode; - } - return parent.contains(descendant); -} - -exports.Range = Range; -exports.default = Selection; - -/***/ }), -/* 16 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Break = function (_Parchment$Embed) { - _inherits(Break, _Parchment$Embed); - - function Break() { - _classCallCheck(this, Break); - - return _possibleConstructorReturn(this, (Break.__proto__ || Object.getPrototypeOf(Break)).apply(this, arguments)); - } - - _createClass(Break, [{ - key: 'insertInto', - value: function insertInto(parent, ref) { - if (parent.children.length === 0) { - _get(Break.prototype.__proto__ || Object.getPrototypeOf(Break.prototype), 'insertInto', this).call(this, parent, ref); - } else { - this.remove(); - } - } - }, { - key: 'length', - value: function length() { - return 0; - } - }, { - key: 'value', - value: function value() { - return ''; - } - }], [{ - key: 'value', - value: function value() { - return undefined; - } - }]); - - return Break; -}(_parchment2.default.Embed); - -Break.blotName = 'break'; -Break.tagName = 'BR'; - -exports.default = Break; - -/***/ }), -/* 17 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -var linked_list_1 = __webpack_require__(44); -var shadow_1 = __webpack_require__(30); -var Registry = __webpack_require__(1); -var ContainerBlot = /** @class */ (function (_super) { - __extends(ContainerBlot, _super); - function ContainerBlot(domNode) { - var _this = _super.call(this, domNode) || this; - _this.build(); - return _this; - } - ContainerBlot.prototype.appendChild = function (other) { - this.insertBefore(other); - }; - ContainerBlot.prototype.attach = function () { - _super.prototype.attach.call(this); - this.children.forEach(function (child) { - child.attach(); - }); - }; - ContainerBlot.prototype.build = function () { - var _this = this; - this.children = new linked_list_1.default(); - // Need to be reversed for if DOM nodes already in order - [].slice - .call(this.domNode.childNodes) - .reverse() - .forEach(function (node) { - try { - var child = makeBlot(node); - _this.insertBefore(child, _this.children.head || undefined); - } - catch (err) { - if (err instanceof Registry.ParchmentError) - return; - else - throw err; - } - }); - }; - ContainerBlot.prototype.deleteAt = function (index, length) { - if (index === 0 && length === this.length()) { - return this.remove(); - } - this.children.forEachAt(index, length, function (child, offset, length) { - child.deleteAt(offset, length); - }); - }; - ContainerBlot.prototype.descendant = function (criteria, index) { - var _a = this.children.find(index), child = _a[0], offset = _a[1]; - if ((criteria.blotName == null && criteria(child)) || - (criteria.blotName != null && child instanceof criteria)) { - return [child, offset]; - } - else if (child instanceof ContainerBlot) { - return child.descendant(criteria, offset); - } - else { - return [null, -1]; - } - }; - ContainerBlot.prototype.descendants = function (criteria, index, length) { - if (index === void 0) { index = 0; } - if (length === void 0) { length = Number.MAX_VALUE; } - var descendants = []; - var lengthLeft = length; - this.children.forEachAt(index, length, function (child, index, length) { - if ((criteria.blotName == null && criteria(child)) || - (criteria.blotName != null && child instanceof criteria)) { - descendants.push(child); - } - if (child instanceof ContainerBlot) { - descendants = descendants.concat(child.descendants(criteria, index, lengthLeft)); - } - lengthLeft -= length; - }); - return descendants; - }; - ContainerBlot.prototype.detach = function () { - this.children.forEach(function (child) { - child.detach(); - }); - _super.prototype.detach.call(this); - }; - ContainerBlot.prototype.formatAt = function (index, length, name, value) { - this.children.forEachAt(index, length, function (child, offset, length) { - child.formatAt(offset, length, name, value); - }); - }; - ContainerBlot.prototype.insertAt = function (index, value, def) { - var _a = this.children.find(index), child = _a[0], offset = _a[1]; - if (child) { - child.insertAt(offset, value, def); - } - else { - var blot = def == null ? Registry.create('text', value) : Registry.create(value, def); - this.appendChild(blot); - } - }; - ContainerBlot.prototype.insertBefore = function (childBlot, refBlot) { - if (this.statics.allowedChildren != null && - !this.statics.allowedChildren.some(function (child) { - return childBlot instanceof child; - })) { - throw new Registry.ParchmentError("Cannot insert " + childBlot.statics.blotName + " into " + this.statics.blotName); - } - childBlot.insertInto(this, refBlot); - }; - ContainerBlot.prototype.length = function () { - return this.children.reduce(function (memo, child) { - return memo + child.length(); - }, 0); - }; - ContainerBlot.prototype.moveChildren = function (targetParent, refNode) { - this.children.forEach(function (child) { - targetParent.insertBefore(child, refNode); - }); - }; - ContainerBlot.prototype.optimize = function (context) { - _super.prototype.optimize.call(this, context); - if (this.children.length === 0) { - if (this.statics.defaultChild != null) { - var child = Registry.create(this.statics.defaultChild); - this.appendChild(child); - child.optimize(context); - } - else { - this.remove(); - } - } - }; - ContainerBlot.prototype.path = function (index, inclusive) { - if (inclusive === void 0) { inclusive = false; } - var _a = this.children.find(index, inclusive), child = _a[0], offset = _a[1]; - var position = [[this, index]]; - if (child instanceof ContainerBlot) { - return position.concat(child.path(offset, inclusive)); - } - else if (child != null) { - position.push([child, offset]); - } - return position; - }; - ContainerBlot.prototype.removeChild = function (child) { - this.children.remove(child); - }; - ContainerBlot.prototype.replace = function (target) { - if (target instanceof ContainerBlot) { - target.moveChildren(this); - } - _super.prototype.replace.call(this, target); - }; - ContainerBlot.prototype.split = function (index, force) { - if (force === void 0) { force = false; } - if (!force) { - if (index === 0) - return this; - if (index === this.length()) - return this.next; - } - var after = this.clone(); - this.parent.insertBefore(after, this.next); - this.children.forEachAt(index, this.length(), function (child, offset, length) { - child = child.split(offset, force); - after.appendChild(child); - }); - return after; - }; - ContainerBlot.prototype.unwrap = function () { - this.moveChildren(this.parent, this.next); - this.remove(); - }; - ContainerBlot.prototype.update = function (mutations, context) { - var _this = this; - var addedNodes = []; - var removedNodes = []; - mutations.forEach(function (mutation) { - if (mutation.target === _this.domNode && mutation.type === 'childList') { - addedNodes.push.apply(addedNodes, mutation.addedNodes); - removedNodes.push.apply(removedNodes, mutation.removedNodes); - } - }); - removedNodes.forEach(function (node) { - // Check node has actually been removed - // One exception is Chrome does not immediately remove IFRAMEs - // from DOM but MutationRecord is correct in its reported removal - if (node.parentNode != null && - // @ts-ignore - node.tagName !== 'IFRAME' && - document.body.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) { - return; - } - var blot = Registry.find(node); - if (blot == null) - return; - if (blot.domNode.parentNode == null || blot.domNode.parentNode === _this.domNode) { - blot.detach(); - } - }); - addedNodes - .filter(function (node) { - return node.parentNode == _this.domNode; - }) - .sort(function (a, b) { - if (a === b) - return 0; - if (a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING) { - return 1; - } - return -1; - }) - .forEach(function (node) { - var refBlot = null; - if (node.nextSibling != null) { - refBlot = Registry.find(node.nextSibling); - } - var blot = makeBlot(node); - if (blot.next != refBlot || blot.next == null) { - if (blot.parent != null) { - blot.parent.removeChild(_this); - } - _this.insertBefore(blot, refBlot || undefined); - } - }); - }; - return ContainerBlot; -}(shadow_1.default)); -function makeBlot(node) { - var blot = Registry.find(node); - if (blot == null) { - try { - blot = Registry.create(node); - } - catch (e) { - blot = Registry.create(Registry.Scope.INLINE); - [].slice.call(node.childNodes).forEach(function (child) { - // @ts-ignore - blot.domNode.appendChild(child); - }); - if (node.parentNode) { - node.parentNode.replaceChild(blot.domNode, node); - } - blot.attach(); - } - } - return blot; -} -exports.default = ContainerBlot; - - -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -var attributor_1 = __webpack_require__(12); -var store_1 = __webpack_require__(31); -var container_1 = __webpack_require__(17); -var Registry = __webpack_require__(1); -var FormatBlot = /** @class */ (function (_super) { - __extends(FormatBlot, _super); - function FormatBlot(domNode) { - var _this = _super.call(this, domNode) || this; - _this.attributes = new store_1.default(_this.domNode); - return _this; - } - FormatBlot.formats = function (domNode) { - if (typeof this.tagName === 'string') { - return true; - } - else if (Array.isArray(this.tagName)) { - return domNode.tagName.toLowerCase(); - } - return undefined; - }; - FormatBlot.prototype.format = function (name, value) { - var format = Registry.query(name); - if (format instanceof attributor_1.default) { - this.attributes.attribute(format, value); - } - else if (value) { - if (format != null && (name !== this.statics.blotName || this.formats()[name] !== value)) { - this.replaceWith(name, value); - } - } - }; - FormatBlot.prototype.formats = function () { - var formats = this.attributes.values(); - var format = this.statics.formats(this.domNode); - if (format != null) { - formats[this.statics.blotName] = format; - } - return formats; - }; - FormatBlot.prototype.replaceWith = function (name, value) { - var replacement = _super.prototype.replaceWith.call(this, name, value); - this.attributes.copy(replacement); - return replacement; - }; - FormatBlot.prototype.update = function (mutations, context) { - var _this = this; - _super.prototype.update.call(this, mutations, context); - if (mutations.some(function (mutation) { - return mutation.target === _this.domNode && mutation.type === 'attributes'; - })) { - this.attributes.build(); - } - }; - FormatBlot.prototype.wrap = function (name, value) { - var wrapper = _super.prototype.wrap.call(this, name, value); - if (wrapper instanceof FormatBlot && wrapper.statics.scope === this.statics.scope) { - this.attributes.move(wrapper); - } - return wrapper; - }; - return FormatBlot; -}(container_1.default)); -exports.default = FormatBlot; - - -/***/ }), -/* 19 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -var shadow_1 = __webpack_require__(30); -var Registry = __webpack_require__(1); -var LeafBlot = /** @class */ (function (_super) { - __extends(LeafBlot, _super); - function LeafBlot() { - return _super !== null && _super.apply(this, arguments) || this; - } - LeafBlot.value = function (domNode) { - return true; - }; - LeafBlot.prototype.index = function (node, offset) { - if (this.domNode === node || - this.domNode.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINED_BY) { - return Math.min(offset, 1); - } - return -1; - }; - LeafBlot.prototype.position = function (index, inclusive) { - var offset = [].indexOf.call(this.parent.domNode.childNodes, this.domNode); - if (index > 0) - offset += 1; - return [this.parent.domNode, offset]; - }; - LeafBlot.prototype.value = function () { - var _a; - return _a = {}, _a[this.statics.blotName] = this.statics.value(this.domNode) || true, _a; - }; - LeafBlot.scope = Registry.Scope.INLINE_BLOT; - return LeafBlot; -}(shadow_1.default)); -exports.default = LeafBlot; - - -/***/ }), -/* 20 */ -/***/ (function(module, exports, __webpack_require__) { - -var equal = __webpack_require__(11); -var extend = __webpack_require__(3); - - -var lib = { - attributes: { - compose: function (a, b, keepNull) { - if (typeof a !== 'object') a = {}; - if (typeof b !== 'object') b = {}; - var attributes = extend(true, {}, b); - if (!keepNull) { - attributes = Object.keys(attributes).reduce(function (copy, key) { - if (attributes[key] != null) { - copy[key] = attributes[key]; - } - return copy; - }, {}); - } - for (var key in a) { - if (a[key] !== undefined && b[key] === undefined) { - attributes[key] = a[key]; - } - } - return Object.keys(attributes).length > 0 ? attributes : undefined; - }, - - diff: function(a, b) { - if (typeof a !== 'object') a = {}; - if (typeof b !== 'object') b = {}; - var attributes = Object.keys(a).concat(Object.keys(b)).reduce(function (attributes, key) { - if (!equal(a[key], b[key])) { - attributes[key] = b[key] === undefined ? null : b[key]; - } - return attributes; - }, {}); - return Object.keys(attributes).length > 0 ? attributes : undefined; - }, - - transform: function (a, b, priority) { - if (typeof a !== 'object') return b; - if (typeof b !== 'object') return undefined; - if (!priority) return b; // b simply overwrites us without priority - var attributes = Object.keys(b).reduce(function (attributes, key) { - if (a[key] === undefined) attributes[key] = b[key]; // null is a valid value - return attributes; - }, {}); - return Object.keys(attributes).length > 0 ? attributes : undefined; - } - }, - - iterator: function (ops) { - return new Iterator(ops); - }, - - length: function (op) { - if (typeof op['delete'] === 'number') { - return op['delete']; - } else if (typeof op.retain === 'number') { - return op.retain; - } else { - return typeof op.insert === 'string' ? op.insert.length : 1; - } - } -}; - - -function Iterator(ops) { - this.ops = ops; - this.index = 0; - this.offset = 0; -}; - -Iterator.prototype.hasNext = function () { - return this.peekLength() < Infinity; -}; - -Iterator.prototype.next = function (length) { - if (!length) length = Infinity; - var nextOp = this.ops[this.index]; - if (nextOp) { - var offset = this.offset; - var opLength = lib.length(nextOp) - if (length >= opLength - offset) { - length = opLength - offset; - this.index += 1; - this.offset = 0; - } else { - this.offset += length; - } - if (typeof nextOp['delete'] === 'number') { - return { 'delete': length }; - } else { - var retOp = {}; - if (nextOp.attributes) { - retOp.attributes = nextOp.attributes; - } - if (typeof nextOp.retain === 'number') { - retOp.retain = length; - } else if (typeof nextOp.insert === 'string') { - retOp.insert = nextOp.insert.substr(offset, length); - } else { - // offset should === 0, length should === 1 - retOp.insert = nextOp.insert; - } - return retOp; - } - } else { - return { retain: Infinity }; - } -}; - -Iterator.prototype.peek = function () { - return this.ops[this.index]; -}; - -Iterator.prototype.peekLength = function () { - if (this.ops[this.index]) { - // Should never return 0 if our index is being managed correctly - return lib.length(this.ops[this.index]) - this.offset; - } else { - return Infinity; - } -}; - -Iterator.prototype.peekType = function () { - if (this.ops[this.index]) { - if (typeof this.ops[this.index]['delete'] === 'number') { - return 'delete'; - } else if (typeof this.ops[this.index].retain === 'number') { - return 'retain'; - } else { - return 'insert'; - } - } - return 'retain'; -}; - -Iterator.prototype.rest = function () { - if (!this.hasNext()) { - return []; - } else if (this.offset === 0) { - return this.ops.slice(this.index); - } else { - var offset = this.offset; - var index = this.index; - var next = this.next(); - var rest = this.ops.slice(this.index); - this.offset = offset; - this.index = index; - return [next].concat(rest); - } -}; - - -module.exports = lib; - - -/***/ }), -/* 21 */ -/***/ (function(module, exports) { - -var clone = (function() { -'use strict'; - -function _instanceof(obj, type) { - return type != null && obj instanceof type; -} - -var nativeMap; -try { - nativeMap = Map; -} catch(_) { - // maybe a reference error because no `Map`. Give it a dummy value that no - // value will ever be an instanceof. - nativeMap = function() {}; -} - -var nativeSet; -try { - nativeSet = Set; -} catch(_) { - nativeSet = function() {}; -} - -var nativePromise; -try { - nativePromise = Promise; -} catch(_) { - nativePromise = function() {}; -} - -/** - * Clones (copies) an Object using deep copying. - * - * This function supports circular references by default, but if you are certain - * there are no circular references in your object, you can save some CPU time - * by calling clone(obj, false). - * - * Caution: if `circular` is false and `parent` contains circular references, - * your program may enter an infinite loop and crash. - * - * @param `parent` - the object to be cloned - * @param `circular` - set to true if the object to be cloned may contain - * circular references. (optional - true by default) - * @param `depth` - set to a number if the object is only to be cloned to - * a particular depth. (optional - defaults to Infinity) - * @param `prototype` - sets the prototype to be used when cloning an object. - * (optional - defaults to parent prototype). - * @param `includeNonEnumerable` - set to true if the non-enumerable properties - * should be cloned as well. Non-enumerable properties on the prototype - * chain will be ignored. (optional - false by default) -*/ -function clone(parent, circular, depth, prototype, includeNonEnumerable) { - if (typeof circular === 'object') { - depth = circular.depth; - prototype = circular.prototype; - includeNonEnumerable = circular.includeNonEnumerable; - circular = circular.circular; - } - // maintain two arrays for circular references, where corresponding parents - // and children have the same index - var allParents = []; - var allChildren = []; - - var useBuffer = typeof Buffer != 'undefined'; - - if (typeof circular == 'undefined') - circular = true; - - if (typeof depth == 'undefined') - depth = Infinity; - - // recurse this function so we don't reset allParents and allChildren - function _clone(parent, depth) { - // cloning null always returns null - if (parent === null) - return null; - - if (depth === 0) - return parent; - - var child; - var proto; - if (typeof parent != 'object') { - return parent; - } - - if (_instanceof(parent, nativeMap)) { - child = new nativeMap(); - } else if (_instanceof(parent, nativeSet)) { - child = new nativeSet(); - } else if (_instanceof(parent, nativePromise)) { - child = new nativePromise(function (resolve, reject) { - parent.then(function(value) { - resolve(_clone(value, depth - 1)); - }, function(err) { - reject(_clone(err, depth - 1)); - }); - }); - } else if (clone.__isArray(parent)) { - child = []; - } else if (clone.__isRegExp(parent)) { - child = new RegExp(parent.source, __getRegExpFlags(parent)); - if (parent.lastIndex) child.lastIndex = parent.lastIndex; - } else if (clone.__isDate(parent)) { - child = new Date(parent.getTime()); - } else if (useBuffer && Buffer.isBuffer(parent)) { - if (Buffer.allocUnsafe) { - // Node.js >= 4.5.0 - child = Buffer.allocUnsafe(parent.length); - } else { - // Older Node.js versions - child = new Buffer(parent.length); - } - parent.copy(child); - return child; - } else if (_instanceof(parent, Error)) { - child = Object.create(parent); - } else { - if (typeof prototype == 'undefined') { - proto = Object.getPrototypeOf(parent); - child = Object.create(proto); - } - else { - child = Object.create(prototype); - proto = prototype; - } - } - - if (circular) { - var index = allParents.indexOf(parent); - - if (index != -1) { - return allChildren[index]; - } - allParents.push(parent); - allChildren.push(child); - } - - if (_instanceof(parent, nativeMap)) { - parent.forEach(function(value, key) { - var keyChild = _clone(key, depth - 1); - var valueChild = _clone(value, depth - 1); - child.set(keyChild, valueChild); - }); - } - if (_instanceof(parent, nativeSet)) { - parent.forEach(function(value) { - var entryChild = _clone(value, depth - 1); - child.add(entryChild); - }); - } - - for (var i in parent) { - var attrs; - if (proto) { - attrs = Object.getOwnPropertyDescriptor(proto, i); - } - - if (attrs && attrs.set == null) { - continue; - } - child[i] = _clone(parent[i], depth - 1); - } - - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(parent); - for (var i = 0; i < symbols.length; i++) { - // Don't need to worry about cloning a symbol because it is a primitive, - // like a number or string. - var symbol = symbols[i]; - var descriptor = Object.getOwnPropertyDescriptor(parent, symbol); - if (descriptor && !descriptor.enumerable && !includeNonEnumerable) { - continue; - } - child[symbol] = _clone(parent[symbol], depth - 1); - if (!descriptor.enumerable) { - Object.defineProperty(child, symbol, { - enumerable: false - }); - } - } - } - - if (includeNonEnumerable) { - var allPropertyNames = Object.getOwnPropertyNames(parent); - for (var i = 0; i < allPropertyNames.length; i++) { - var propertyName = allPropertyNames[i]; - var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName); - if (descriptor && descriptor.enumerable) { - continue; - } - child[propertyName] = _clone(parent[propertyName], depth - 1); - Object.defineProperty(child, propertyName, { - enumerable: false - }); - } - } - - return child; - } - - return _clone(parent, depth); -} - -/** - * Simple flat clone using prototype, accepts only objects, usefull for property - * override on FLAT configuration object (no nested props). - * - * USE WITH CAUTION! This may not behave as you wish if you do not know how this - * works. - */ -clone.clonePrototype = function clonePrototype(parent) { - if (parent === null) - return null; - - var c = function () {}; - c.prototype = parent; - return new c(); -}; - -// private utility functions - -function __objToStr(o) { - return Object.prototype.toString.call(o); -} -clone.__objToStr = __objToStr; - -function __isDate(o) { - return typeof o === 'object' && __objToStr(o) === '[object Date]'; -} -clone.__isDate = __isDate; - -function __isArray(o) { - return typeof o === 'object' && __objToStr(o) === '[object Array]'; -} -clone.__isArray = __isArray; - -function __isRegExp(o) { - return typeof o === 'object' && __objToStr(o) === '[object RegExp]'; -} -clone.__isRegExp = __isRegExp; - -function __getRegExpFlags(re) { - var flags = ''; - if (re.global) flags += 'g'; - if (re.ignoreCase) flags += 'i'; - if (re.multiline) flags += 'm'; - return flags; -} -clone.__getRegExpFlags = __getRegExpFlags; - -return clone; -})(); - -if (typeof module === 'object' && module.exports) { - module.exports = clone; -} - - -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _emitter = __webpack_require__(8); - -var _emitter2 = _interopRequireDefault(_emitter); - -var _block = __webpack_require__(4); - -var _block2 = _interopRequireDefault(_block); - -var _break = __webpack_require__(16); - -var _break2 = _interopRequireDefault(_break); - -var _code = __webpack_require__(13); - -var _code2 = _interopRequireDefault(_code); - -var _container = __webpack_require__(25); - -var _container2 = _interopRequireDefault(_container); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -function isLine(blot) { - return blot instanceof _block2.default || blot instanceof _block.BlockEmbed; -} - -var Scroll = function (_Parchment$Scroll) { - _inherits(Scroll, _Parchment$Scroll); - - function Scroll(domNode, config) { - _classCallCheck(this, Scroll); - - var _this = _possibleConstructorReturn(this, (Scroll.__proto__ || Object.getPrototypeOf(Scroll)).call(this, domNode)); - - _this.emitter = config.emitter; - if (Array.isArray(config.whitelist)) { - _this.whitelist = config.whitelist.reduce(function (whitelist, format) { - whitelist[format] = true; - return whitelist; - }, {}); - } - // Some reason fixes composition issues with character languages in Windows/Chrome, Safari - _this.domNode.addEventListener('DOMNodeInserted', function () {}); - _this.optimize(); - _this.enable(); - return _this; - } - - _createClass(Scroll, [{ - key: 'batchStart', - value: function batchStart() { - this.batch = true; - } - }, { - key: 'batchEnd', - value: function batchEnd() { - this.batch = false; - this.optimize(); - } - }, { - key: 'deleteAt', - value: function deleteAt(index, length) { - var _line = this.line(index), - _line2 = _slicedToArray(_line, 2), - first = _line2[0], - offset = _line2[1]; - - var _line3 = this.line(index + length), - _line4 = _slicedToArray(_line3, 1), - last = _line4[0]; - - _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'deleteAt', this).call(this, index, length); - if (last != null && first !== last && offset > 0) { - if (first instanceof _block.BlockEmbed || last instanceof _block.BlockEmbed) { - this.optimize(); - return; - } - if (first instanceof _code2.default) { - var newlineIndex = first.newlineIndex(first.length(), true); - if (newlineIndex > -1) { - first = first.split(newlineIndex + 1); - if (first === last) { - this.optimize(); - return; - } - } - } else if (last instanceof _code2.default) { - var _newlineIndex = last.newlineIndex(0); - if (_newlineIndex > -1) { - last.split(_newlineIndex + 1); - } - } - var ref = last.children.head instanceof _break2.default ? null : last.children.head; - first.moveChildren(last, ref); - first.remove(); - } - this.optimize(); - } - }, { - key: 'enable', - value: function enable() { - var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; - - this.domNode.setAttribute('contenteditable', enabled); - } - }, { - key: 'formatAt', - value: function formatAt(index, length, format, value) { - if (this.whitelist != null && !this.whitelist[format]) return; - _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'formatAt', this).call(this, index, length, format, value); - this.optimize(); - } - }, { - key: 'insertAt', - value: function insertAt(index, value, def) { - if (def != null && this.whitelist != null && !this.whitelist[value]) return; - if (index >= this.length()) { - if (def == null || _parchment2.default.query(value, _parchment2.default.Scope.BLOCK) == null) { - var blot = _parchment2.default.create(this.statics.defaultChild); - this.appendChild(blot); - if (def == null && value.endsWith('\n')) { - value = value.slice(0, -1); - } - blot.insertAt(0, value, def); - } else { - var embed = _parchment2.default.create(value, def); - this.appendChild(embed); - } - } else { - _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'insertAt', this).call(this, index, value, def); - } - this.optimize(); - } - }, { - key: 'insertBefore', - value: function insertBefore(blot, ref) { - if (blot.statics.scope === _parchment2.default.Scope.INLINE_BLOT) { - var wrapper = _parchment2.default.create(this.statics.defaultChild); - wrapper.appendChild(blot); - blot = wrapper; - } - _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'insertBefore', this).call(this, blot, ref); - } - }, { - key: 'leaf', - value: function leaf(index) { - return this.path(index).pop() || [null, -1]; - } - }, { - key: 'line', - value: function line(index) { - if (index === this.length()) { - return this.line(index - 1); - } - return this.descendant(isLine, index); - } - }, { - key: 'lines', - value: function lines() { - var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.MAX_VALUE; - - var getLines = function getLines(blot, index, length) { - var lines = [], - lengthLeft = length; - blot.children.forEachAt(index, length, function (child, index, length) { - if (isLine(child)) { - lines.push(child); - } else if (child instanceof _parchment2.default.Container) { - lines = lines.concat(getLines(child, index, lengthLeft)); - } - lengthLeft -= length; - }); - return lines; - }; - return getLines(this, index, length); - } - }, { - key: 'optimize', - value: function optimize() { - var mutations = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - if (this.batch === true) return; - _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'optimize', this).call(this, mutations, context); - if (mutations.length > 0) { - this.emitter.emit(_emitter2.default.events.SCROLL_OPTIMIZE, mutations, context); - } - } - }, { - key: 'path', - value: function path(index) { - return _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'path', this).call(this, index).slice(1); // Exclude self - } - }, { - key: 'update', - value: function update(mutations) { - if (this.batch === true) return; - var source = _emitter2.default.sources.USER; - if (typeof mutations === 'string') { - source = mutations; - } - if (!Array.isArray(mutations)) { - mutations = this.observer.takeRecords(); - } - if (mutations.length > 0) { - this.emitter.emit(_emitter2.default.events.SCROLL_BEFORE_UPDATE, source, mutations); - } - _get(Scroll.prototype.__proto__ || Object.getPrototypeOf(Scroll.prototype), 'update', this).call(this, mutations.concat([])); // pass copy - if (mutations.length > 0) { - this.emitter.emit(_emitter2.default.events.SCROLL_UPDATE, source, mutations); - } - } - }]); - - return Scroll; -}(_parchment2.default.Scroll); - -Scroll.blotName = 'scroll'; -Scroll.className = 'ql-editor'; -Scroll.tagName = 'DIV'; -Scroll.defaultChild = 'block'; -Scroll.allowedChildren = [_block2.default, _block.BlockEmbed, _container2.default]; - -exports.default = Scroll; - -/***/ }), -/* 23 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.SHORTKEY = exports.default = undefined; - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _clone = __webpack_require__(21); - -var _clone2 = _interopRequireDefault(_clone); - -var _deepEqual = __webpack_require__(11); - -var _deepEqual2 = _interopRequireDefault(_deepEqual); - -var _extend = __webpack_require__(3); - -var _extend2 = _interopRequireDefault(_extend); - -var _quillDelta = __webpack_require__(2); - -var _quillDelta2 = _interopRequireDefault(_quillDelta); - -var _op = __webpack_require__(20); - -var _op2 = _interopRequireDefault(_op); - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _quill = __webpack_require__(5); - -var _quill2 = _interopRequireDefault(_quill); - -var _logger = __webpack_require__(10); - -var _logger2 = _interopRequireDefault(_logger); - -var _module = __webpack_require__(9); - -var _module2 = _interopRequireDefault(_module); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var debug = (0, _logger2.default)('quill:keyboard'); - -var SHORTKEY = /Mac/i.test(navigator.platform) ? 'metaKey' : 'ctrlKey'; - -var Keyboard = function (_Module) { - _inherits(Keyboard, _Module); - - _createClass(Keyboard, null, [{ - key: 'match', - value: function match(evt, binding) { - binding = normalize(binding); - if (['altKey', 'ctrlKey', 'metaKey', 'shiftKey'].some(function (key) { - return !!binding[key] !== evt[key] && binding[key] !== null; - })) { - return false; - } - return binding.key === (evt.which || evt.keyCode); - } - }]); - - function Keyboard(quill, options) { - _classCallCheck(this, Keyboard); - - var _this = _possibleConstructorReturn(this, (Keyboard.__proto__ || Object.getPrototypeOf(Keyboard)).call(this, quill, options)); - - _this.bindings = {}; - Object.keys(_this.options.bindings).forEach(function (name) { - if (name === 'list autofill' && quill.scroll.whitelist != null && !quill.scroll.whitelist['list']) { - return; - } - if (_this.options.bindings[name]) { - _this.addBinding(_this.options.bindings[name]); - } - }); - _this.addBinding({ key: Keyboard.keys.ENTER, shiftKey: null }, handleEnter); - _this.addBinding({ key: Keyboard.keys.ENTER, metaKey: null, ctrlKey: null, altKey: null }, function () {}); - if (/Firefox/i.test(navigator.userAgent)) { - // Need to handle delete and backspace for Firefox in the general case #1171 - _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true }, handleBackspace); - _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true }, handleDelete); - } else { - _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: true, prefix: /^.?$/ }, handleBackspace); - _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: true, suffix: /^.?$/ }, handleDelete); - } - _this.addBinding({ key: Keyboard.keys.BACKSPACE }, { collapsed: false }, handleDeleteRange); - _this.addBinding({ key: Keyboard.keys.DELETE }, { collapsed: false }, handleDeleteRange); - _this.addBinding({ key: Keyboard.keys.BACKSPACE, altKey: null, ctrlKey: null, metaKey: null, shiftKey: null }, { collapsed: true, offset: 0 }, handleBackspace); - _this.listen(); - return _this; - } - - _createClass(Keyboard, [{ - key: 'addBinding', - value: function addBinding(key) { - var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var handler = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - - var binding = normalize(key); - if (binding == null || binding.key == null) { - return debug.warn('Attempted to add invalid keyboard binding', binding); - } - if (typeof context === 'function') { - context = { handler: context }; - } - if (typeof handler === 'function') { - handler = { handler: handler }; - } - binding = (0, _extend2.default)(binding, context, handler); - this.bindings[binding.key] = this.bindings[binding.key] || []; - this.bindings[binding.key].push(binding); - } - }, { - key: 'listen', - value: function listen() { - var _this2 = this; - - this.quill.root.addEventListener('keydown', function (evt) { - if (evt.defaultPrevented) return; - var which = evt.which || evt.keyCode; - var bindings = (_this2.bindings[which] || []).filter(function (binding) { - return Keyboard.match(evt, binding); - }); - if (bindings.length === 0) return; - var range = _this2.quill.getSelection(); - if (range == null || !_this2.quill.hasFocus()) return; - - var _quill$getLine = _this2.quill.getLine(range.index), - _quill$getLine2 = _slicedToArray(_quill$getLine, 2), - line = _quill$getLine2[0], - offset = _quill$getLine2[1]; - - var _quill$getLeaf = _this2.quill.getLeaf(range.index), - _quill$getLeaf2 = _slicedToArray(_quill$getLeaf, 2), - leafStart = _quill$getLeaf2[0], - offsetStart = _quill$getLeaf2[1]; - - var _ref = range.length === 0 ? [leafStart, offsetStart] : _this2.quill.getLeaf(range.index + range.length), - _ref2 = _slicedToArray(_ref, 2), - leafEnd = _ref2[0], - offsetEnd = _ref2[1]; - - var prefixText = leafStart instanceof _parchment2.default.Text ? leafStart.value().slice(0, offsetStart) : ''; - var suffixText = leafEnd instanceof _parchment2.default.Text ? leafEnd.value().slice(offsetEnd) : ''; - var curContext = { - collapsed: range.length === 0, - empty: range.length === 0 && line.length() <= 1, - format: _this2.quill.getFormat(range), - offset: offset, - prefix: prefixText, - suffix: suffixText - }; - var prevented = bindings.some(function (binding) { - if (binding.collapsed != null && binding.collapsed !== curContext.collapsed) return false; - if (binding.empty != null && binding.empty !== curContext.empty) return false; - if (binding.offset != null && binding.offset !== curContext.offset) return false; - if (Array.isArray(binding.format)) { - // any format is present - if (binding.format.every(function (name) { - return curContext.format[name] == null; - })) { - return false; - } - } else if (_typeof(binding.format) === 'object') { - // all formats must match - if (!Object.keys(binding.format).every(function (name) { - if (binding.format[name] === true) return curContext.format[name] != null; - if (binding.format[name] === false) return curContext.format[name] == null; - return (0, _deepEqual2.default)(binding.format[name], curContext.format[name]); - })) { - return false; - } - } - if (binding.prefix != null && !binding.prefix.test(curContext.prefix)) return false; - if (binding.suffix != null && !binding.suffix.test(curContext.suffix)) return false; - return binding.handler.call(_this2, range, curContext) !== true; - }); - if (prevented) { - evt.preventDefault(); - } - }); - } - }]); - - return Keyboard; -}(_module2.default); - -Keyboard.keys = { - BACKSPACE: 8, - TAB: 9, - ENTER: 13, - ESCAPE: 27, - LEFT: 37, - UP: 38, - RIGHT: 39, - DOWN: 40, - DELETE: 46 -}; - -Keyboard.DEFAULTS = { - bindings: { - 'bold': makeFormatHandler('bold'), - 'italic': makeFormatHandler('italic'), - 'underline': makeFormatHandler('underline'), - 'indent': { - // highlight tab or tab at beginning of list, indent or blockquote - key: Keyboard.keys.TAB, - format: ['blockquote', 'indent', 'list'], - handler: function handler(range, context) { - if (context.collapsed && context.offset !== 0) return true; - this.quill.format('indent', '+1', _quill2.default.sources.USER); - } - }, - 'outdent': { - key: Keyboard.keys.TAB, - shiftKey: true, - format: ['blockquote', 'indent', 'list'], - // highlight tab or tab at beginning of list, indent or blockquote - handler: function handler(range, context) { - if (context.collapsed && context.offset !== 0) return true; - this.quill.format('indent', '-1', _quill2.default.sources.USER); - } - }, - 'outdent backspace': { - key: Keyboard.keys.BACKSPACE, - collapsed: true, - shiftKey: null, - metaKey: null, - ctrlKey: null, - altKey: null, - format: ['indent', 'list'], - offset: 0, - handler: function handler(range, context) { - if (context.format.indent != null) { - this.quill.format('indent', '-1', _quill2.default.sources.USER); - } else if (context.format.list != null) { - this.quill.format('list', false, _quill2.default.sources.USER); - } - } - }, - 'indent code-block': makeCodeBlockHandler(true), - 'outdent code-block': makeCodeBlockHandler(false), - 'remove tab': { - key: Keyboard.keys.TAB, - shiftKey: true, - collapsed: true, - prefix: /\t$/, - handler: function handler(range) { - this.quill.deleteText(range.index - 1, 1, _quill2.default.sources.USER); - } - }, - 'tab': { - key: Keyboard.keys.TAB, - handler: function handler(range) { - this.quill.history.cutoff(); - var delta = new _quillDelta2.default().retain(range.index).delete(range.length).insert('\t'); - this.quill.updateContents(delta, _quill2.default.sources.USER); - this.quill.history.cutoff(); - this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT); - } - }, - 'list empty enter': { - key: Keyboard.keys.ENTER, - collapsed: true, - format: ['list'], - empty: true, - handler: function handler(range, context) { - this.quill.format('list', false, _quill2.default.sources.USER); - if (context.format.indent) { - this.quill.format('indent', false, _quill2.default.sources.USER); - } - } - }, - 'checklist enter': { - key: Keyboard.keys.ENTER, - collapsed: true, - format: { list: 'checked' }, - handler: function handler(range) { - var _quill$getLine3 = this.quill.getLine(range.index), - _quill$getLine4 = _slicedToArray(_quill$getLine3, 2), - line = _quill$getLine4[0], - offset = _quill$getLine4[1]; - - var formats = (0, _extend2.default)({}, line.formats(), { list: 'checked' }); - var delta = new _quillDelta2.default().retain(range.index).insert('\n', formats).retain(line.length() - offset - 1).retain(1, { list: 'unchecked' }); - this.quill.updateContents(delta, _quill2.default.sources.USER); - this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT); - this.quill.scrollIntoView(); - } - }, - 'header enter': { - key: Keyboard.keys.ENTER, - collapsed: true, - format: ['header'], - suffix: /^$/, - handler: function handler(range, context) { - var _quill$getLine5 = this.quill.getLine(range.index), - _quill$getLine6 = _slicedToArray(_quill$getLine5, 2), - line = _quill$getLine6[0], - offset = _quill$getLine6[1]; - - var delta = new _quillDelta2.default().retain(range.index).insert('\n', context.format).retain(line.length() - offset - 1).retain(1, { header: null }); - this.quill.updateContents(delta, _quill2.default.sources.USER); - this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT); - this.quill.scrollIntoView(); - } - }, - 'list autofill': { - key: ' ', - collapsed: true, - format: { list: false }, - prefix: /^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/, - handler: function handler(range, context) { - var length = context.prefix.length; - - var _quill$getLine7 = this.quill.getLine(range.index), - _quill$getLine8 = _slicedToArray(_quill$getLine7, 2), - line = _quill$getLine8[0], - offset = _quill$getLine8[1]; - - if (offset > length) return true; - var value = void 0; - switch (context.prefix.trim()) { - case '[]':case '[ ]': - value = 'unchecked'; - break; - case '[x]': - value = 'checked'; - break; - case '-':case '*': - value = 'bullet'; - break; - default: - value = 'ordered'; - } - this.quill.insertText(range.index, ' ', _quill2.default.sources.USER); - this.quill.history.cutoff(); - var delta = new _quillDelta2.default().retain(range.index - offset).delete(length + 1).retain(line.length() - 2 - offset).retain(1, { list: value }); - this.quill.updateContents(delta, _quill2.default.sources.USER); - this.quill.history.cutoff(); - this.quill.setSelection(range.index - length, _quill2.default.sources.SILENT); - } - }, - 'code exit': { - key: Keyboard.keys.ENTER, - collapsed: true, - format: ['code-block'], - prefix: /\n\n$/, - suffix: /^\s+$/, - handler: function handler(range) { - var _quill$getLine9 = this.quill.getLine(range.index), - _quill$getLine10 = _slicedToArray(_quill$getLine9, 2), - line = _quill$getLine10[0], - offset = _quill$getLine10[1]; - - var delta = new _quillDelta2.default().retain(range.index + line.length() - offset - 2).retain(1, { 'code-block': null }).delete(1); - this.quill.updateContents(delta, _quill2.default.sources.USER); - } - }, - 'embed left': makeEmbedArrowHandler(Keyboard.keys.LEFT, false), - 'embed left shift': makeEmbedArrowHandler(Keyboard.keys.LEFT, true), - 'embed right': makeEmbedArrowHandler(Keyboard.keys.RIGHT, false), - 'embed right shift': makeEmbedArrowHandler(Keyboard.keys.RIGHT, true) - } -}; - -function makeEmbedArrowHandler(key, shiftKey) { - var _ref3; - - var where = key === Keyboard.keys.LEFT ? 'prefix' : 'suffix'; - return _ref3 = { - key: key, - shiftKey: shiftKey, - altKey: null - }, _defineProperty(_ref3, where, /^$/), _defineProperty(_ref3, 'handler', function handler(range) { - var index = range.index; - if (key === Keyboard.keys.RIGHT) { - index += range.length + 1; - } - - var _quill$getLeaf3 = this.quill.getLeaf(index), - _quill$getLeaf4 = _slicedToArray(_quill$getLeaf3, 1), - leaf = _quill$getLeaf4[0]; - - if (!(leaf instanceof _parchment2.default.Embed)) return true; - if (key === Keyboard.keys.LEFT) { - if (shiftKey) { - this.quill.setSelection(range.index - 1, range.length + 1, _quill2.default.sources.USER); - } else { - this.quill.setSelection(range.index - 1, _quill2.default.sources.USER); - } - } else { - if (shiftKey) { - this.quill.setSelection(range.index, range.length + 1, _quill2.default.sources.USER); - } else { - this.quill.setSelection(range.index + range.length + 1, _quill2.default.sources.USER); - } - } - return false; - }), _ref3; -} - -function handleBackspace(range, context) { - if (range.index === 0 || this.quill.getLength() <= 1) return; - - var _quill$getLine11 = this.quill.getLine(range.index), - _quill$getLine12 = _slicedToArray(_quill$getLine11, 1), - line = _quill$getLine12[0]; - - var formats = {}; - if (context.offset === 0) { - var _quill$getLine13 = this.quill.getLine(range.index - 1), - _quill$getLine14 = _slicedToArray(_quill$getLine13, 1), - prev = _quill$getLine14[0]; - - if (prev != null && prev.length() > 1) { - var curFormats = line.formats(); - var prevFormats = this.quill.getFormat(range.index - 1, 1); - formats = _op2.default.attributes.diff(curFormats, prevFormats) || {}; - } - } - // Check for astral symbols - var length = /[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(context.prefix) ? 2 : 1; - this.quill.deleteText(range.index - length, length, _quill2.default.sources.USER); - if (Object.keys(formats).length > 0) { - this.quill.formatLine(range.index - length, length, formats, _quill2.default.sources.USER); - } - this.quill.focus(); -} - -function handleDelete(range, context) { - // Check for astral symbols - var length = /^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(context.suffix) ? 2 : 1; - if (range.index >= this.quill.getLength() - length) return; - var formats = {}, - nextLength = 0; - - var _quill$getLine15 = this.quill.getLine(range.index), - _quill$getLine16 = _slicedToArray(_quill$getLine15, 1), - line = _quill$getLine16[0]; - - if (context.offset >= line.length() - 1) { - var _quill$getLine17 = this.quill.getLine(range.index + 1), - _quill$getLine18 = _slicedToArray(_quill$getLine17, 1), - next = _quill$getLine18[0]; - - if (next) { - var curFormats = line.formats(); - var nextFormats = this.quill.getFormat(range.index, 1); - formats = _op2.default.attributes.diff(curFormats, nextFormats) || {}; - nextLength = next.length(); - } - } - this.quill.deleteText(range.index, length, _quill2.default.sources.USER); - if (Object.keys(formats).length > 0) { - this.quill.formatLine(range.index + nextLength - 1, length, formats, _quill2.default.sources.USER); - } -} - -function handleDeleteRange(range) { - var lines = this.quill.getLines(range); - var formats = {}; - if (lines.length > 1) { - var firstFormats = lines[0].formats(); - var lastFormats = lines[lines.length - 1].formats(); - formats = _op2.default.attributes.diff(lastFormats, firstFormats) || {}; - } - this.quill.deleteText(range, _quill2.default.sources.USER); - if (Object.keys(formats).length > 0) { - this.quill.formatLine(range.index, 1, formats, _quill2.default.sources.USER); - } - this.quill.setSelection(range.index, _quill2.default.sources.SILENT); - this.quill.focus(); -} - -function handleEnter(range, context) { - var _this3 = this; - - if (range.length > 0) { - this.quill.scroll.deleteAt(range.index, range.length); // So we do not trigger text-change - } - var lineFormats = Object.keys(context.format).reduce(function (lineFormats, format) { - if (_parchment2.default.query(format, _parchment2.default.Scope.BLOCK) && !Array.isArray(context.format[format])) { - lineFormats[format] = context.format[format]; - } - return lineFormats; - }, {}); - this.quill.insertText(range.index, '\n', lineFormats, _quill2.default.sources.USER); - // Earlier scroll.deleteAt might have messed up our selection, - // so insertText's built in selection preservation is not reliable - this.quill.setSelection(range.index + 1, _quill2.default.sources.SILENT); - this.quill.focus(); - Object.keys(context.format).forEach(function (name) { - if (lineFormats[name] != null) return; - if (Array.isArray(context.format[name])) return; - if (name === 'link') return; - _this3.quill.format(name, context.format[name], _quill2.default.sources.USER); - }); -} - -function makeCodeBlockHandler(indent) { - return { - key: Keyboard.keys.TAB, - shiftKey: !indent, - format: { 'code-block': true }, - handler: function handler(range) { - var CodeBlock = _parchment2.default.query('code-block'); - var index = range.index, - length = range.length; - - var _quill$scroll$descend = this.quill.scroll.descendant(CodeBlock, index), - _quill$scroll$descend2 = _slicedToArray(_quill$scroll$descend, 2), - block = _quill$scroll$descend2[0], - offset = _quill$scroll$descend2[1]; - - if (block == null) return; - var scrollIndex = this.quill.getIndex(block); - var start = block.newlineIndex(offset, true) + 1; - var end = block.newlineIndex(scrollIndex + offset + length); - var lines = block.domNode.textContent.slice(start, end).split('\n'); - offset = 0; - lines.forEach(function (line, i) { - if (indent) { - block.insertAt(start + offset, CodeBlock.TAB); - offset += CodeBlock.TAB.length; - if (i === 0) { - index += CodeBlock.TAB.length; - } else { - length += CodeBlock.TAB.length; - } - } else if (line.startsWith(CodeBlock.TAB)) { - block.deleteAt(start + offset, CodeBlock.TAB.length); - offset -= CodeBlock.TAB.length; - if (i === 0) { - index -= CodeBlock.TAB.length; - } else { - length -= CodeBlock.TAB.length; - } - } - offset += line.length + 1; - }); - this.quill.update(_quill2.default.sources.USER); - this.quill.setSelection(index, length, _quill2.default.sources.SILENT); - } - }; -} - -function makeFormatHandler(format) { - return { - key: format[0].toUpperCase(), - shortKey: true, - handler: function handler(range, context) { - this.quill.format(format, !context.format[format], _quill2.default.sources.USER); - } - }; -} - -function normalize(binding) { - if (typeof binding === 'string' || typeof binding === 'number') { - return normalize({ key: binding }); - } - if ((typeof binding === 'undefined' ? 'undefined' : _typeof(binding)) === 'object') { - binding = (0, _clone2.default)(binding, false); - } - if (typeof binding.key === 'string') { - if (Keyboard.keys[binding.key.toUpperCase()] != null) { - binding.key = Keyboard.keys[binding.key.toUpperCase()]; - } else if (binding.key.length === 1) { - binding.key = binding.key.toUpperCase().charCodeAt(0); - } else { - return null; - } - } - if (binding.shortKey) { - binding[SHORTKEY] = binding.shortKey; - delete binding.shortKey; - } - return binding; -} - -exports.default = Keyboard; -exports.SHORTKEY = SHORTKEY; - -/***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _text = __webpack_require__(7); - -var _text2 = _interopRequireDefault(_text); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Cursor = function (_Parchment$Embed) { - _inherits(Cursor, _Parchment$Embed); - - _createClass(Cursor, null, [{ - key: 'value', - value: function value() { - return undefined; - } - }]); - - function Cursor(domNode, selection) { - _classCallCheck(this, Cursor); - - var _this = _possibleConstructorReturn(this, (Cursor.__proto__ || Object.getPrototypeOf(Cursor)).call(this, domNode)); - - _this.selection = selection; - _this.textNode = document.createTextNode(Cursor.CONTENTS); - _this.domNode.appendChild(_this.textNode); - _this._length = 0; - return _this; - } - - _createClass(Cursor, [{ - key: 'detach', - value: function detach() { - // super.detach() will also clear domNode.__blot - if (this.parent != null) this.parent.removeChild(this); - } - }, { - key: 'format', - value: function format(name, value) { - if (this._length !== 0) { - return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'format', this).call(this, name, value); - } - var target = this, - index = 0; - while (target != null && target.statics.scope !== _parchment2.default.Scope.BLOCK_BLOT) { - index += target.offset(target.parent); - target = target.parent; - } - if (target != null) { - this._length = Cursor.CONTENTS.length; - target.optimize(); - target.formatAt(index, Cursor.CONTENTS.length, name, value); - this._length = 0; - } - } - }, { - key: 'index', - value: function index(node, offset) { - if (node === this.textNode) return 0; - return _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'index', this).call(this, node, offset); - } - }, { - key: 'length', - value: function length() { - return this._length; - } - }, { - key: 'position', - value: function position() { - return [this.textNode, this.textNode.data.length]; - } - }, { - key: 'remove', - value: function remove() { - _get(Cursor.prototype.__proto__ || Object.getPrototypeOf(Cursor.prototype), 'remove', this).call(this); - this.parent = null; - } - }, { - key: 'restore', - value: function restore() { - if (this.selection.composing || this.parent == null) return; - var textNode = this.textNode; - var range = this.selection.getNativeRange(); - var restoreText = void 0, - start = void 0, - end = void 0; - if (range != null && range.start.node === textNode && range.end.node === textNode) { - var _ref = [textNode, range.start.offset, range.end.offset]; - restoreText = _ref[0]; - start = _ref[1]; - end = _ref[2]; - } - // Link format will insert text outside of anchor tag - while (this.domNode.lastChild != null && this.domNode.lastChild !== this.textNode) { - this.domNode.parentNode.insertBefore(this.domNode.lastChild, this.domNode); - } - if (this.textNode.data !== Cursor.CONTENTS) { - var text = this.textNode.data.split(Cursor.CONTENTS).join(''); - if (this.next instanceof _text2.default) { - restoreText = this.next.domNode; - this.next.insertAt(0, text); - this.textNode.data = Cursor.CONTENTS; - } else { - this.textNode.data = text; - this.parent.insertBefore(_parchment2.default.create(this.textNode), this); - this.textNode = document.createTextNode(Cursor.CONTENTS); - this.domNode.appendChild(this.textNode); - } - } - this.remove(); - if (start != null) { - var _map = [start, end].map(function (offset) { - return Math.max(0, Math.min(restoreText.data.length, offset - 1)); - }); - - var _map2 = _slicedToArray(_map, 2); - - start = _map2[0]; - end = _map2[1]; - - return { - startNode: restoreText, - startOffset: start, - endNode: restoreText, - endOffset: end - }; - } - } - }, { - key: 'update', - value: function update(mutations, context) { - var _this2 = this; - - if (mutations.some(function (mutation) { - return mutation.type === 'characterData' && mutation.target === _this2.textNode; - })) { - var range = this.restore(); - if (range) context.range = range; - } - } - }, { - key: 'value', - value: function value() { - return ''; - } - }]); - - return Cursor; -}(_parchment2.default.Embed); - -Cursor.blotName = 'cursor'; -Cursor.className = 'ql-cursor'; -Cursor.tagName = 'span'; -Cursor.CONTENTS = '\uFEFF'; // Zero width no break space - - -exports.default = Cursor; - -/***/ }), -/* 25 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _block = __webpack_require__(4); - -var _block2 = _interopRequireDefault(_block); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Container = function (_Parchment$Container) { - _inherits(Container, _Parchment$Container); - - function Container() { - _classCallCheck(this, Container); - - return _possibleConstructorReturn(this, (Container.__proto__ || Object.getPrototypeOf(Container)).apply(this, arguments)); - } - - return Container; -}(_parchment2.default.Container); - -Container.allowedChildren = [_block2.default, _block.BlockEmbed, Container]; - -exports.default = Container; - -/***/ }), -/* 26 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.ColorStyle = exports.ColorClass = exports.ColorAttributor = undefined; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ColorAttributor = function (_Parchment$Attributor) { - _inherits(ColorAttributor, _Parchment$Attributor); - - function ColorAttributor() { - _classCallCheck(this, ColorAttributor); - - return _possibleConstructorReturn(this, (ColorAttributor.__proto__ || Object.getPrototypeOf(ColorAttributor)).apply(this, arguments)); - } - - _createClass(ColorAttributor, [{ - key: 'value', - value: function value(domNode) { - var value = _get(ColorAttributor.prototype.__proto__ || Object.getPrototypeOf(ColorAttributor.prototype), 'value', this).call(this, domNode); - if (!value.startsWith('rgb(')) return value; - value = value.replace(/^[^\d]+/, '').replace(/[^\d]+$/, ''); - return '#' + value.split(',').map(function (component) { - return ('00' + parseInt(component).toString(16)).slice(-2); - }).join(''); - } - }]); - - return ColorAttributor; -}(_parchment2.default.Attributor.Style); - -var ColorClass = new _parchment2.default.Attributor.Class('color', 'ql-color', { - scope: _parchment2.default.Scope.INLINE -}); -var ColorStyle = new ColorAttributor('color', 'color', { - scope: _parchment2.default.Scope.INLINE -}); - -exports.ColorAttributor = ColorAttributor; -exports.ColorClass = ColorClass; -exports.ColorStyle = ColorStyle; - -/***/ }), -/* 27 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.sanitize = exports.default = undefined; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _inline = __webpack_require__(6); - -var _inline2 = _interopRequireDefault(_inline); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Link = function (_Inline) { - _inherits(Link, _Inline); - - function Link() { - _classCallCheck(this, Link); - - return _possibleConstructorReturn(this, (Link.__proto__ || Object.getPrototypeOf(Link)).apply(this, arguments)); - } - - _createClass(Link, [{ - key: 'format', - value: function format(name, value) { - if (name !== this.statics.blotName || !value) return _get(Link.prototype.__proto__ || Object.getPrototypeOf(Link.prototype), 'format', this).call(this, name, value); - value = this.constructor.sanitize(value); - this.domNode.setAttribute('href', value); - } - }], [{ - key: 'create', - value: function create(value) { - var node = _get(Link.__proto__ || Object.getPrototypeOf(Link), 'create', this).call(this, value); - value = this.sanitize(value); - node.setAttribute('href', value); - // node.setAttribute('rel', 'noopener noreferrer'); - // node.setAttribute('target', '_blank'); - return node; - } - }, { - key: 'formats', - value: function formats(domNode) { - return domNode.getAttribute('href'); - } - }, { - key: 'sanitize', - value: function sanitize(url) { - return _sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL; - } - }]); - - return Link; -}(_inline2.default); - -Link.blotName = 'link'; -Link.tagName = 'A'; -Link.SANITIZED_URL = 'about:blank'; -Link.PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel']; - -function _sanitize(url, protocols) { - var anchor = document.createElement('a'); - anchor.href = url; - var protocol = anchor.href.slice(0, anchor.href.indexOf(':')); - return protocols.indexOf(protocol) > -1; -} - -exports.default = Link; -exports.sanitize = _sanitize; - -/***/ }), -/* 28 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _keyboard = __webpack_require__(23); - -var _keyboard2 = _interopRequireDefault(_keyboard); - -var _dropdown = __webpack_require__(107); - -var _dropdown2 = _interopRequireDefault(_dropdown); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var optionsCounter = 0; - -function toggleAriaAttribute(element, attribute) { - element.setAttribute(attribute, !(element.getAttribute(attribute) === 'true')); -} - -var Picker = function () { - function Picker(select) { - var _this = this; - - _classCallCheck(this, Picker); - - this.select = select; - this.container = document.createElement('span'); - this.buildPicker(); - this.select.style.display = 'none'; - this.select.parentNode.insertBefore(this.container, this.select); - - this.label.addEventListener('mousedown', function () { - _this.togglePicker(); - }); - this.label.addEventListener('keydown', function (event) { - switch (event.keyCode) { - // Allows the "Enter" key to open the picker - case _keyboard2.default.keys.ENTER: - _this.togglePicker(); - break; - - // Allows the "Escape" key to close the picker - case _keyboard2.default.keys.ESCAPE: - _this.escape(); - event.preventDefault(); - break; - default: - } - }); - this.select.addEventListener('change', this.update.bind(this)); - } - - _createClass(Picker, [{ - key: 'togglePicker', - value: function togglePicker() { - this.container.classList.toggle('ql-expanded'); - // Toggle aria-expanded and aria-hidden to make the picker accessible - toggleAriaAttribute(this.label, 'aria-expanded'); - toggleAriaAttribute(this.options, 'aria-hidden'); - } - }, { - key: 'buildItem', - value: function buildItem(option) { - var _this2 = this; - - var item = document.createElement('span'); - item.tabIndex = '0'; - item.setAttribute('role', 'button'); - - item.classList.add('ql-picker-item'); - if (option.hasAttribute('value')) { - item.setAttribute('data-value', option.getAttribute('value')); - } - if (option.textContent) { - item.setAttribute('data-label', option.textContent); - } - item.addEventListener('click', function () { - _this2.selectItem(item, true); - }); - item.addEventListener('keydown', function (event) { - switch (event.keyCode) { - // Allows the "Enter" key to select an item - case _keyboard2.default.keys.ENTER: - _this2.selectItem(item, true); - event.preventDefault(); - break; - - // Allows the "Escape" key to close the picker - case _keyboard2.default.keys.ESCAPE: - _this2.escape(); - event.preventDefault(); - break; - default: - } - }); - - return item; - } - }, { - key: 'buildLabel', - value: function buildLabel() { - var label = document.createElement('span'); - label.classList.add('ql-picker-label'); - label.innerHTML = _dropdown2.default; - label.tabIndex = '0'; - label.setAttribute('role', 'button'); - label.setAttribute('aria-expanded', 'false'); - this.container.appendChild(label); - return label; - } - }, { - key: 'buildOptions', - value: function buildOptions() { - var _this3 = this; - - var options = document.createElement('span'); - options.classList.add('ql-picker-options'); - - // Don't want screen readers to read this until options are visible - options.setAttribute('aria-hidden', 'true'); - options.tabIndex = '-1'; - - // Need a unique id for aria-controls - options.id = 'ql-picker-options-' + optionsCounter; - optionsCounter += 1; - this.label.setAttribute('aria-controls', options.id); - - this.options = options; - - [].slice.call(this.select.options).forEach(function (option) { - var item = _this3.buildItem(option); - options.appendChild(item); - if (option.selected === true) { - _this3.selectItem(item); - } - }); - this.container.appendChild(options); - } - }, { - key: 'buildPicker', - value: function buildPicker() { - var _this4 = this; - - [].slice.call(this.select.attributes).forEach(function (item) { - _this4.container.setAttribute(item.name, item.value); - }); - this.container.classList.add('ql-picker'); - this.label = this.buildLabel(); - this.buildOptions(); - } - }, { - key: 'escape', - value: function escape() { - var _this5 = this; - - // Close menu and return focus to trigger label - this.close(); - // Need setTimeout for accessibility to ensure that the browser executes - // focus on the next process thread and after any DOM content changes - setTimeout(function () { - return _this5.label.focus(); - }, 1); - } - }, { - key: 'close', - value: function close() { - this.container.classList.remove('ql-expanded'); - this.label.setAttribute('aria-expanded', 'false'); - this.options.setAttribute('aria-hidden', 'true'); - } - }, { - key: 'selectItem', - value: function selectItem(item) { - var trigger = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - var selected = this.container.querySelector('.ql-selected'); - if (item === selected) return; - if (selected != null) { - selected.classList.remove('ql-selected'); - } - if (item == null) return; - item.classList.add('ql-selected'); - this.select.selectedIndex = [].indexOf.call(item.parentNode.children, item); - if (item.hasAttribute('data-value')) { - this.label.setAttribute('data-value', item.getAttribute('data-value')); - } else { - this.label.removeAttribute('data-value'); - } - if (item.hasAttribute('data-label')) { - this.label.setAttribute('data-label', item.getAttribute('data-label')); - } else { - this.label.removeAttribute('data-label'); - } - if (trigger) { - if (typeof Event === 'function') { - this.select.dispatchEvent(new Event('change')); - } else if ((typeof Event === 'undefined' ? 'undefined' : _typeof(Event)) === 'object') { - // IE11 - var event = document.createEvent('Event'); - event.initEvent('change', true, true); - this.select.dispatchEvent(event); - } - this.close(); - } - } - }, { - key: 'update', - value: function update() { - var option = void 0; - if (this.select.selectedIndex > -1) { - var item = this.container.querySelector('.ql-picker-options').children[this.select.selectedIndex]; - option = this.select.options[this.select.selectedIndex]; - this.selectItem(item); - } else { - this.selectItem(null); - } - var isActive = option != null && option !== this.select.querySelector('option[selected]'); - this.label.classList.toggle('ql-active', isActive); - } - }]); - - return Picker; -}(); - -exports.default = Picker; - -/***/ }), -/* 29 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _quill = __webpack_require__(5); - -var _quill2 = _interopRequireDefault(_quill); - -var _block = __webpack_require__(4); - -var _block2 = _interopRequireDefault(_block); - -var _break = __webpack_require__(16); - -var _break2 = _interopRequireDefault(_break); - -var _container = __webpack_require__(25); - -var _container2 = _interopRequireDefault(_container); - -var _cursor = __webpack_require__(24); - -var _cursor2 = _interopRequireDefault(_cursor); - -var _embed = __webpack_require__(35); - -var _embed2 = _interopRequireDefault(_embed); - -var _inline = __webpack_require__(6); - -var _inline2 = _interopRequireDefault(_inline); - -var _scroll = __webpack_require__(22); - -var _scroll2 = _interopRequireDefault(_scroll); - -var _text = __webpack_require__(7); - -var _text2 = _interopRequireDefault(_text); - -var _clipboard = __webpack_require__(55); - -var _clipboard2 = _interopRequireDefault(_clipboard); - -var _history = __webpack_require__(42); - -var _history2 = _interopRequireDefault(_history); - -var _keyboard = __webpack_require__(23); - -var _keyboard2 = _interopRequireDefault(_keyboard); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -_quill2.default.register({ - 'blots/block': _block2.default, - 'blots/block/embed': _block.BlockEmbed, - 'blots/break': _break2.default, - 'blots/container': _container2.default, - 'blots/cursor': _cursor2.default, - 'blots/embed': _embed2.default, - 'blots/inline': _inline2.default, - 'blots/scroll': _scroll2.default, - 'blots/text': _text2.default, - - 'modules/clipboard': _clipboard2.default, - 'modules/history': _history2.default, - 'modules/keyboard': _keyboard2.default -}); - -_parchment2.default.register(_block2.default, _break2.default, _cursor2.default, _inline2.default, _scroll2.default, _text2.default); - -exports.default = _quill2.default; - -/***/ }), -/* 30 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -var Registry = __webpack_require__(1); -var ShadowBlot = /** @class */ (function () { - function ShadowBlot(domNode) { - this.domNode = domNode; - // @ts-ignore - this.domNode[Registry.DATA_KEY] = { blot: this }; - } - Object.defineProperty(ShadowBlot.prototype, "statics", { - // Hack for accessing inherited static methods - get: function () { - return this.constructor; - }, - enumerable: true, - configurable: true - }); - ShadowBlot.create = function (value) { - if (this.tagName == null) { - throw new Registry.ParchmentError('Blot definition missing tagName'); - } - var node; - if (Array.isArray(this.tagName)) { - if (typeof value === 'string') { - value = value.toUpperCase(); - if (parseInt(value).toString() === value) { - value = parseInt(value); - } - } - if (typeof value === 'number') { - node = document.createElement(this.tagName[value - 1]); - } - else if (this.tagName.indexOf(value) > -1) { - node = document.createElement(value); - } - else { - node = document.createElement(this.tagName[0]); - } - } - else { - node = document.createElement(this.tagName); - } - if (this.className) { - node.classList.add(this.className); - } - return node; - }; - ShadowBlot.prototype.attach = function () { - if (this.parent != null) { - this.scroll = this.parent.scroll; - } - }; - ShadowBlot.prototype.clone = function () { - var domNode = this.domNode.cloneNode(false); - return Registry.create(domNode); - }; - ShadowBlot.prototype.detach = function () { - if (this.parent != null) - this.parent.removeChild(this); - // @ts-ignore - delete this.domNode[Registry.DATA_KEY]; - }; - ShadowBlot.prototype.deleteAt = function (index, length) { - var blot = this.isolate(index, length); - blot.remove(); - }; - ShadowBlot.prototype.formatAt = function (index, length, name, value) { - var blot = this.isolate(index, length); - if (Registry.query(name, Registry.Scope.BLOT) != null && value) { - blot.wrap(name, value); - } - else if (Registry.query(name, Registry.Scope.ATTRIBUTE) != null) { - var parent = Registry.create(this.statics.scope); - blot.wrap(parent); - parent.format(name, value); - } - }; - ShadowBlot.prototype.insertAt = function (index, value, def) { - var blot = def == null ? Registry.create('text', value) : Registry.create(value, def); - var ref = this.split(index); - this.parent.insertBefore(blot, ref); - }; - ShadowBlot.prototype.insertInto = function (parentBlot, refBlot) { - if (refBlot === void 0) { refBlot = null; } - if (this.parent != null) { - this.parent.children.remove(this); - } - var refDomNode = null; - parentBlot.children.insertBefore(this, refBlot); - if (refBlot != null) { - refDomNode = refBlot.domNode; - } - if (this.domNode.parentNode != parentBlot.domNode || - this.domNode.nextSibling != refDomNode) { - parentBlot.domNode.insertBefore(this.domNode, refDomNode); - } - this.parent = parentBlot; - this.attach(); - }; - ShadowBlot.prototype.isolate = function (index, length) { - var target = this.split(index); - target.split(length); - return target; - }; - ShadowBlot.prototype.length = function () { - return 1; - }; - ShadowBlot.prototype.offset = function (root) { - if (root === void 0) { root = this.parent; } - if (this.parent == null || this == root) - return 0; - return this.parent.children.offset(this) + this.parent.offset(root); - }; - ShadowBlot.prototype.optimize = function (context) { - // TODO clean up once we use WeakMap - // @ts-ignore - if (this.domNode[Registry.DATA_KEY] != null) { - // @ts-ignore - delete this.domNode[Registry.DATA_KEY].mutations; - } - }; - ShadowBlot.prototype.remove = function () { - if (this.domNode.parentNode != null) { - this.domNode.parentNode.removeChild(this.domNode); - } - this.detach(); - }; - ShadowBlot.prototype.replace = function (target) { - if (target.parent == null) - return; - target.parent.insertBefore(this, target.next); - target.remove(); - }; - ShadowBlot.prototype.replaceWith = function (name, value) { - var replacement = typeof name === 'string' ? Registry.create(name, value) : name; - replacement.replace(this); - return replacement; - }; - ShadowBlot.prototype.split = function (index, force) { - return index === 0 ? this : this.next; - }; - ShadowBlot.prototype.update = function (mutations, context) { - // Nothing to do by default - }; - ShadowBlot.prototype.wrap = function (name, value) { - var wrapper = typeof name === 'string' ? Registry.create(name, value) : name; - if (this.parent != null) { - this.parent.insertBefore(wrapper, this.next); - } - wrapper.appendChild(this); - return wrapper; - }; - ShadowBlot.blotName = 'abstract'; - return ShadowBlot; -}()); -exports.default = ShadowBlot; - - -/***/ }), -/* 31 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -var attributor_1 = __webpack_require__(12); -var class_1 = __webpack_require__(32); -var style_1 = __webpack_require__(33); -var Registry = __webpack_require__(1); -var AttributorStore = /** @class */ (function () { - function AttributorStore(domNode) { - this.attributes = {}; - this.domNode = domNode; - this.build(); - } - AttributorStore.prototype.attribute = function (attribute, value) { - // verb - if (value) { - if (attribute.add(this.domNode, value)) { - if (attribute.value(this.domNode) != null) { - this.attributes[attribute.attrName] = attribute; - } - else { - delete this.attributes[attribute.attrName]; - } - } - } - else { - attribute.remove(this.domNode); - delete this.attributes[attribute.attrName]; - } - }; - AttributorStore.prototype.build = function () { - var _this = this; - this.attributes = {}; - var attributes = attributor_1.default.keys(this.domNode); - var classes = class_1.default.keys(this.domNode); - var styles = style_1.default.keys(this.domNode); - attributes - .concat(classes) - .concat(styles) - .forEach(function (name) { - var attr = Registry.query(name, Registry.Scope.ATTRIBUTE); - if (attr instanceof attributor_1.default) { - _this.attributes[attr.attrName] = attr; - } - }); - }; - AttributorStore.prototype.copy = function (target) { - var _this = this; - Object.keys(this.attributes).forEach(function (key) { - var value = _this.attributes[key].value(_this.domNode); - target.format(key, value); - }); - }; - AttributorStore.prototype.move = function (target) { - var _this = this; - this.copy(target); - Object.keys(this.attributes).forEach(function (key) { - _this.attributes[key].remove(_this.domNode); - }); - this.attributes = {}; - }; - AttributorStore.prototype.values = function () { - var _this = this; - return Object.keys(this.attributes).reduce(function (attributes, name) { - attributes[name] = _this.attributes[name].value(_this.domNode); - return attributes; - }, {}); - }; - return AttributorStore; -}()); -exports.default = AttributorStore; - - -/***/ }), -/* 32 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -var attributor_1 = __webpack_require__(12); -function match(node, prefix) { - var className = node.getAttribute('class') || ''; - return className.split(/\s+/).filter(function (name) { - return name.indexOf(prefix + "-") === 0; - }); -} -var ClassAttributor = /** @class */ (function (_super) { - __extends(ClassAttributor, _super); - function ClassAttributor() { - return _super !== null && _super.apply(this, arguments) || this; - } - ClassAttributor.keys = function (node) { - return (node.getAttribute('class') || '').split(/\s+/).map(function (name) { - return name - .split('-') - .slice(0, -1) - .join('-'); - }); - }; - ClassAttributor.prototype.add = function (node, value) { - if (!this.canAdd(node, value)) - return false; - this.remove(node); - node.classList.add(this.keyName + "-" + value); - return true; - }; - ClassAttributor.prototype.remove = function (node) { - var matches = match(node, this.keyName); - matches.forEach(function (name) { - node.classList.remove(name); - }); - if (node.classList.length === 0) { - node.removeAttribute('class'); - } - }; - ClassAttributor.prototype.value = function (node) { - var result = match(node, this.keyName)[0] || ''; - var value = result.slice(this.keyName.length + 1); // +1 for hyphen - return this.canAdd(node, value) ? value : ''; - }; - return ClassAttributor; -}(attributor_1.default)); -exports.default = ClassAttributor; - - -/***/ }), -/* 33 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -var attributor_1 = __webpack_require__(12); -function camelize(name) { - var parts = name.split('-'); - var rest = parts - .slice(1) - .map(function (part) { - return part[0].toUpperCase() + part.slice(1); - }) - .join(''); - return parts[0] + rest; -} -var StyleAttributor = /** @class */ (function (_super) { - __extends(StyleAttributor, _super); - function StyleAttributor() { - return _super !== null && _super.apply(this, arguments) || this; - } - StyleAttributor.keys = function (node) { - return (node.getAttribute('style') || '').split(';').map(function (value) { - var arr = value.split(':'); - return arr[0].trim(); - }); - }; - StyleAttributor.prototype.add = function (node, value) { - if (!this.canAdd(node, value)) - return false; - // @ts-ignore - node.style[camelize(this.keyName)] = value; - return true; - }; - StyleAttributor.prototype.remove = function (node) { - // @ts-ignore - node.style[camelize(this.keyName)] = ''; - if (!node.getAttribute('style')) { - node.removeAttribute('style'); - } - }; - StyleAttributor.prototype.value = function (node) { - // @ts-ignore - var value = node.style[camelize(this.keyName)]; - return this.canAdd(node, value) ? value : ''; - }; - return StyleAttributor; -}(attributor_1.default)); -exports.default = StyleAttributor; - - -/***/ }), -/* 34 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Theme = function () { - function Theme(quill, options) { - _classCallCheck(this, Theme); - - this.quill = quill; - this.options = options; - this.modules = {}; - } - - _createClass(Theme, [{ - key: 'init', - value: function init() { - var _this = this; - - Object.keys(this.options.modules).forEach(function (name) { - if (_this.modules[name] == null) { - _this.addModule(name); - } - }); - } - }, { - key: 'addModule', - value: function addModule(name) { - var moduleClass = this.quill.constructor.import('modules/' + name); - this.modules[name] = new moduleClass(this.quill, this.options.modules[name] || {}); - return this.modules[name]; - } - }]); - - return Theme; -}(); - -Theme.DEFAULTS = { - modules: {} -}; -Theme.themes = { - 'default': Theme -}; - -exports.default = Theme; - -/***/ }), -/* 35 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _text = __webpack_require__(7); - -var _text2 = _interopRequireDefault(_text); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var GUARD_TEXT = '\uFEFF'; - -var Embed = function (_Parchment$Embed) { - _inherits(Embed, _Parchment$Embed); - - function Embed(node) { - _classCallCheck(this, Embed); - - var _this = _possibleConstructorReturn(this, (Embed.__proto__ || Object.getPrototypeOf(Embed)).call(this, node)); - - _this.contentNode = document.createElement('span'); - _this.contentNode.setAttribute('contenteditable', false); - [].slice.call(_this.domNode.childNodes).forEach(function (childNode) { - _this.contentNode.appendChild(childNode); - }); - _this.leftGuard = document.createTextNode(GUARD_TEXT); - _this.rightGuard = document.createTextNode(GUARD_TEXT); - _this.domNode.appendChild(_this.leftGuard); - _this.domNode.appendChild(_this.contentNode); - _this.domNode.appendChild(_this.rightGuard); - return _this; - } - - _createClass(Embed, [{ - key: 'index', - value: function index(node, offset) { - if (node === this.leftGuard) return 0; - if (node === this.rightGuard) return 1; - return _get(Embed.prototype.__proto__ || Object.getPrototypeOf(Embed.prototype), 'index', this).call(this, node, offset); - } - }, { - key: 'restore', - value: function restore(node) { - var range = void 0, - textNode = void 0; - var text = node.data.split(GUARD_TEXT).join(''); - if (node === this.leftGuard) { - if (this.prev instanceof _text2.default) { - var prevLength = this.prev.length(); - this.prev.insertAt(prevLength, text); - range = { - startNode: this.prev.domNode, - startOffset: prevLength + text.length - }; - } else { - textNode = document.createTextNode(text); - this.parent.insertBefore(_parchment2.default.create(textNode), this); - range = { - startNode: textNode, - startOffset: text.length - }; - } - } else if (node === this.rightGuard) { - if (this.next instanceof _text2.default) { - this.next.insertAt(0, text); - range = { - startNode: this.next.domNode, - startOffset: text.length - }; - } else { - textNode = document.createTextNode(text); - this.parent.insertBefore(_parchment2.default.create(textNode), this.next); - range = { - startNode: textNode, - startOffset: text.length - }; - } - } - node.data = GUARD_TEXT; - return range; - } - }, { - key: 'update', - value: function update(mutations, context) { - var _this2 = this; - - mutations.forEach(function (mutation) { - if (mutation.type === 'characterData' && (mutation.target === _this2.leftGuard || mutation.target === _this2.rightGuard)) { - var range = _this2.restore(mutation.target); - if (range) context.range = range; - } - }); - } - }]); - - return Embed; -}(_parchment2.default.Embed); - -exports.default = Embed; - -/***/ }), -/* 36 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.AlignStyle = exports.AlignClass = exports.AlignAttribute = undefined; - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var config = { - scope: _parchment2.default.Scope.BLOCK, - whitelist: ['right', 'center', 'justify'] -}; - -var AlignAttribute = new _parchment2.default.Attributor.Attribute('align', 'align', config); -var AlignClass = new _parchment2.default.Attributor.Class('align', 'ql-align', config); -var AlignStyle = new _parchment2.default.Attributor.Style('align', 'text-align', config); - -exports.AlignAttribute = AlignAttribute; -exports.AlignClass = AlignClass; -exports.AlignStyle = AlignStyle; - -/***/ }), -/* 37 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.BackgroundStyle = exports.BackgroundClass = undefined; - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _color = __webpack_require__(26); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var BackgroundClass = new _parchment2.default.Attributor.Class('background', 'ql-bg', { - scope: _parchment2.default.Scope.INLINE -}); -var BackgroundStyle = new _color.ColorAttributor('background', 'background-color', { - scope: _parchment2.default.Scope.INLINE -}); - -exports.BackgroundClass = BackgroundClass; -exports.BackgroundStyle = BackgroundStyle; - -/***/ }), -/* 38 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.DirectionStyle = exports.DirectionClass = exports.DirectionAttribute = undefined; - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var config = { - scope: _parchment2.default.Scope.BLOCK, - whitelist: ['rtl'] -}; - -var DirectionAttribute = new _parchment2.default.Attributor.Attribute('direction', 'dir', config); -var DirectionClass = new _parchment2.default.Attributor.Class('direction', 'ql-direction', config); -var DirectionStyle = new _parchment2.default.Attributor.Style('direction', 'direction', config); - -exports.DirectionAttribute = DirectionAttribute; -exports.DirectionClass = DirectionClass; -exports.DirectionStyle = DirectionStyle; - -/***/ }), -/* 39 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.FontClass = exports.FontStyle = undefined; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var config = { - scope: _parchment2.default.Scope.INLINE, - whitelist: ['serif', 'monospace'] -}; - -var FontClass = new _parchment2.default.Attributor.Class('font', 'ql-font', config); - -var FontStyleAttributor = function (_Parchment$Attributor) { - _inherits(FontStyleAttributor, _Parchment$Attributor); - - function FontStyleAttributor() { - _classCallCheck(this, FontStyleAttributor); - - return _possibleConstructorReturn(this, (FontStyleAttributor.__proto__ || Object.getPrototypeOf(FontStyleAttributor)).apply(this, arguments)); - } - - _createClass(FontStyleAttributor, [{ - key: 'value', - value: function value(node) { - return _get(FontStyleAttributor.prototype.__proto__ || Object.getPrototypeOf(FontStyleAttributor.prototype), 'value', this).call(this, node).replace(/["']/g, ''); - } - }]); - - return FontStyleAttributor; -}(_parchment2.default.Attributor.Style); - -var FontStyle = new FontStyleAttributor('font', 'font-family', config); - -exports.FontStyle = FontStyle; -exports.FontClass = FontClass; - -/***/ }), -/* 40 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.SizeStyle = exports.SizeClass = undefined; - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var SizeClass = new _parchment2.default.Attributor.Class('size', 'ql-size', { - scope: _parchment2.default.Scope.INLINE, - whitelist: ['small', 'large', 'huge'] -}); -var SizeStyle = new _parchment2.default.Attributor.Style('size', 'font-size', { - scope: _parchment2.default.Scope.INLINE, - whitelist: ['10px', '18px', '32px'] -}); - -exports.SizeClass = SizeClass; -exports.SizeStyle = SizeStyle; - -/***/ }), -/* 41 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = { - 'align': { - '': __webpack_require__(76), - 'center': __webpack_require__(77), - 'right': __webpack_require__(78), - 'justify': __webpack_require__(79) - }, - 'background': __webpack_require__(80), - 'blockquote': __webpack_require__(81), - 'bold': __webpack_require__(82), - 'clean': __webpack_require__(83), - 'code': __webpack_require__(58), - 'code-block': __webpack_require__(58), - 'color': __webpack_require__(84), - 'direction': { - '': __webpack_require__(85), - 'rtl': __webpack_require__(86) - }, - 'float': { - 'center': __webpack_require__(87), - 'full': __webpack_require__(88), - 'left': __webpack_require__(89), - 'right': __webpack_require__(90) - }, - 'formula': __webpack_require__(91), - 'header': { - '1': __webpack_require__(92), - '2': __webpack_require__(93) - }, - 'italic': __webpack_require__(94), - 'image': __webpack_require__(95), - 'indent': { - '+1': __webpack_require__(96), - '-1': __webpack_require__(97) - }, - 'link': __webpack_require__(98), - 'list': { - 'ordered': __webpack_require__(99), - 'bullet': __webpack_require__(100), - 'check': __webpack_require__(101) - }, - 'script': { - 'sub': __webpack_require__(102), - 'super': __webpack_require__(103) - }, - 'strike': __webpack_require__(104), - 'underline': __webpack_require__(105), - 'video': __webpack_require__(106) -}; - -/***/ }), -/* 42 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.getLastChangeIndex = exports.default = undefined; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _quill = __webpack_require__(5); - -var _quill2 = _interopRequireDefault(_quill); - -var _module = __webpack_require__(9); - -var _module2 = _interopRequireDefault(_module); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var History = function (_Module) { - _inherits(History, _Module); - - function History(quill, options) { - _classCallCheck(this, History); - - var _this = _possibleConstructorReturn(this, (History.__proto__ || Object.getPrototypeOf(History)).call(this, quill, options)); - - _this.lastRecorded = 0; - _this.ignoreChange = false; - _this.clear(); - _this.quill.on(_quill2.default.events.EDITOR_CHANGE, function (eventName, delta, oldDelta, source) { - if (eventName !== _quill2.default.events.TEXT_CHANGE || _this.ignoreChange) return; - if (!_this.options.userOnly || source === _quill2.default.sources.USER) { - _this.record(delta, oldDelta); - } else { - _this.transform(delta); - } - }); - _this.quill.keyboard.addBinding({ key: 'Z', shortKey: true }, _this.undo.bind(_this)); - _this.quill.keyboard.addBinding({ key: 'Z', shortKey: true, shiftKey: true }, _this.redo.bind(_this)); - if (/Win/i.test(navigator.platform)) { - _this.quill.keyboard.addBinding({ key: 'Y', shortKey: true }, _this.redo.bind(_this)); - } - return _this; - } - - _createClass(History, [{ - key: 'change', - value: function change(source, dest) { - if (this.stack[source].length === 0) return; - var delta = this.stack[source].pop(); - this.stack[dest].push(delta); - this.lastRecorded = 0; - this.ignoreChange = true; - this.quill.updateContents(delta[source], _quill2.default.sources.USER); - this.ignoreChange = false; - var index = getLastChangeIndex(delta[source]); - this.quill.setSelection(index); - } - }, { - key: 'clear', - value: function clear() { - this.stack = { undo: [], redo: [] }; - } - }, { - key: 'cutoff', - value: function cutoff() { - this.lastRecorded = 0; - } - }, { - key: 'record', - value: function record(changeDelta, oldDelta) { - if (changeDelta.ops.length === 0) return; - this.stack.redo = []; - var undoDelta = this.quill.getContents().diff(oldDelta); - var timestamp = Date.now(); - if (this.lastRecorded + this.options.delay > timestamp && this.stack.undo.length > 0) { - var delta = this.stack.undo.pop(); - undoDelta = undoDelta.compose(delta.undo); - changeDelta = delta.redo.compose(changeDelta); - } else { - this.lastRecorded = timestamp; - } - this.stack.undo.push({ - redo: changeDelta, - undo: undoDelta - }); - if (this.stack.undo.length > this.options.maxStack) { - this.stack.undo.shift(); - } - } - }, { - key: 'redo', - value: function redo() { - this.change('redo', 'undo'); - } - }, { - key: 'transform', - value: function transform(delta) { - this.stack.undo.forEach(function (change) { - change.undo = delta.transform(change.undo, true); - change.redo = delta.transform(change.redo, true); - }); - this.stack.redo.forEach(function (change) { - change.undo = delta.transform(change.undo, true); - change.redo = delta.transform(change.redo, true); - }); - } - }, { - key: 'undo', - value: function undo() { - this.change('undo', 'redo'); - } - }]); - - return History; -}(_module2.default); - -History.DEFAULTS = { - delay: 1000, - maxStack: 100, - userOnly: false -}; - -function endsWithNewlineChange(delta) { - var lastOp = delta.ops[delta.ops.length - 1]; - if (lastOp == null) return false; - if (lastOp.insert != null) { - return typeof lastOp.insert === 'string' && lastOp.insert.endsWith('\n'); - } - if (lastOp.attributes != null) { - return Object.keys(lastOp.attributes).some(function (attr) { - return _parchment2.default.query(attr, _parchment2.default.Scope.BLOCK) != null; - }); - } - return false; -} - -function getLastChangeIndex(delta) { - var deleteLength = delta.reduce(function (length, op) { - length += op.delete || 0; - return length; - }, 0); - var changeIndex = delta.length() - deleteLength; - if (endsWithNewlineChange(delta)) { - changeIndex -= 1; - } - return changeIndex; -} - -exports.default = History; -exports.getLastChangeIndex = getLastChangeIndex; - -/***/ }), -/* 43 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = exports.BaseTooltip = undefined; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _extend = __webpack_require__(3); - -var _extend2 = _interopRequireDefault(_extend); - -var _quillDelta = __webpack_require__(2); - -var _quillDelta2 = _interopRequireDefault(_quillDelta); - -var _emitter = __webpack_require__(8); - -var _emitter2 = _interopRequireDefault(_emitter); - -var _keyboard = __webpack_require__(23); - -var _keyboard2 = _interopRequireDefault(_keyboard); - -var _theme = __webpack_require__(34); - -var _theme2 = _interopRequireDefault(_theme); - -var _colorPicker = __webpack_require__(59); - -var _colorPicker2 = _interopRequireDefault(_colorPicker); - -var _iconPicker = __webpack_require__(60); - -var _iconPicker2 = _interopRequireDefault(_iconPicker); - -var _picker = __webpack_require__(28); - -var _picker2 = _interopRequireDefault(_picker); - -var _tooltip = __webpack_require__(61); - -var _tooltip2 = _interopRequireDefault(_tooltip); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ALIGNS = [false, 'center', 'right', 'justify']; - -var COLORS = ["#000000", "#e60000", "#ff9900", "#ffff00", "#008a00", "#0066cc", "#9933ff", "#ffffff", "#facccc", "#ffebcc", "#ffffcc", "#cce8cc", "#cce0f5", "#ebd6ff", "#bbbbbb", "#f06666", "#ffc266", "#ffff66", "#66b966", "#66a3e0", "#c285ff", "#888888", "#a10000", "#b26b00", "#b2b200", "#006100", "#0047b2", "#6b24b2", "#444444", "#5c0000", "#663d00", "#666600", "#003700", "#002966", "#3d1466"]; - -var FONTS = [false, 'serif', 'monospace']; - -var HEADERS = ['1', '2', '3', false]; - -var SIZES = ['small', false, 'large', 'huge']; - -var BaseTheme = function (_Theme) { - _inherits(BaseTheme, _Theme); - - function BaseTheme(quill, options) { - _classCallCheck(this, BaseTheme); - - var _this = _possibleConstructorReturn(this, (BaseTheme.__proto__ || Object.getPrototypeOf(BaseTheme)).call(this, quill, options)); - - var listener = function listener(e) { - if (!document.body.contains(quill.root)) { - return document.body.removeEventListener('click', listener); - } - if (_this.tooltip != null && !_this.tooltip.root.contains(e.target) && document.activeElement !== _this.tooltip.textbox && !_this.quill.hasFocus()) { - _this.tooltip.hide(); - } - if (_this.pickers != null) { - _this.pickers.forEach(function (picker) { - if (!picker.container.contains(e.target)) { - picker.close(); - } - }); - } - }; - quill.emitter.listenDOM('click', document.body, listener); - return _this; - } - - _createClass(BaseTheme, [{ - key: 'addModule', - value: function addModule(name) { - var module = _get(BaseTheme.prototype.__proto__ || Object.getPrototypeOf(BaseTheme.prototype), 'addModule', this).call(this, name); - if (name === 'toolbar') { - this.extendToolbar(module); - } - return module; - } - }, { - key: 'buildButtons', - value: function buildButtons(buttons, icons) { - buttons.forEach(function (button) { - var className = button.getAttribute('class') || ''; - className.split(/\s+/).forEach(function (name) { - if (!name.startsWith('ql-')) return; - name = name.slice('ql-'.length); - if (icons[name] == null) return; - if (name === 'direction') { - button.innerHTML = icons[name][''] + icons[name]['rtl']; - } else if (typeof icons[name] === 'string') { - button.innerHTML = icons[name]; - } else { - var value = button.value || ''; - if (value != null && icons[name][value]) { - button.innerHTML = icons[name][value]; - } - } - }); - }); - } - }, { - key: 'buildPickers', - value: function buildPickers(selects, icons) { - var _this2 = this; - - this.pickers = selects.map(function (select) { - if (select.classList.contains('ql-align')) { - if (select.querySelector('option') == null) { - fillSelect(select, ALIGNS); - } - return new _iconPicker2.default(select, icons.align); - } else if (select.classList.contains('ql-background') || select.classList.contains('ql-color')) { - var format = select.classList.contains('ql-background') ? 'background' : 'color'; - if (select.querySelector('option') == null) { - fillSelect(select, COLORS, format === 'background' ? '#ffffff' : '#000000'); - } - return new _colorPicker2.default(select, icons[format]); - } else { - if (select.querySelector('option') == null) { - if (select.classList.contains('ql-font')) { - fillSelect(select, FONTS); - } else if (select.classList.contains('ql-header')) { - fillSelect(select, HEADERS); - } else if (select.classList.contains('ql-size')) { - fillSelect(select, SIZES); - } - } - return new _picker2.default(select); - } - }); - var update = function update() { - _this2.pickers.forEach(function (picker) { - picker.update(); - }); - }; - this.quill.on(_emitter2.default.events.EDITOR_CHANGE, update); - } - }]); - - return BaseTheme; -}(_theme2.default); - -BaseTheme.DEFAULTS = (0, _extend2.default)(true, {}, _theme2.default.DEFAULTS, { - modules: { - toolbar: { - handlers: { - formula: function formula() { - this.quill.theme.tooltip.edit('formula'); - }, - image: function image() { - var _this3 = this; - - var fileInput = this.container.querySelector('input.ql-image[type=file]'); - if (fileInput == null) { - fileInput = document.createElement('input'); - fileInput.setAttribute('type', 'file'); - fileInput.setAttribute('accept', 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon'); - fileInput.classList.add('ql-image'); - fileInput.addEventListener('change', function () { - if (fileInput.files != null && fileInput.files[0] != null) { - var reader = new FileReader(); - reader.onload = function (e) { - var range = _this3.quill.getSelection(true); - _this3.quill.updateContents(new _quillDelta2.default().retain(range.index).delete(range.length).insert({ image: e.target.result }), _emitter2.default.sources.USER); - _this3.quill.setSelection(range.index + 1, _emitter2.default.sources.SILENT); - fileInput.value = ""; - }; - reader.readAsDataURL(fileInput.files[0]); - } - }); - this.container.appendChild(fileInput); - } - fileInput.click(); - }, - video: function video() { - this.quill.theme.tooltip.edit('video'); - } - } - } - } -}); - -var BaseTooltip = function (_Tooltip) { - _inherits(BaseTooltip, _Tooltip); - - function BaseTooltip(quill, boundsContainer) { - _classCallCheck(this, BaseTooltip); - - var _this4 = _possibleConstructorReturn(this, (BaseTooltip.__proto__ || Object.getPrototypeOf(BaseTooltip)).call(this, quill, boundsContainer)); - - _this4.textbox = _this4.root.querySelector('input[type="text"]'); - _this4.listen(); - return _this4; - } - - _createClass(BaseTooltip, [{ - key: 'listen', - value: function listen() { - var _this5 = this; - - this.textbox.addEventListener('keydown', function (event) { - if (_keyboard2.default.match(event, 'enter')) { - _this5.save(); - event.preventDefault(); - } else if (_keyboard2.default.match(event, 'escape')) { - _this5.cancel(); - event.preventDefault(); - } - }); - } - }, { - key: 'cancel', - value: function cancel() { - this.hide(); - } - }, { - key: 'edit', - value: function edit() { - var mode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'link'; - var preview = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - - this.root.classList.remove('ql-hidden'); - this.root.classList.add('ql-editing'); - if (preview != null) { - this.textbox.value = preview; - } else if (mode !== this.root.getAttribute('data-mode')) { - this.textbox.value = ''; - } - this.position(this.quill.getBounds(this.quill.selection.savedRange)); - this.textbox.select(); - this.textbox.setAttribute('placeholder', this.textbox.getAttribute('data-' + mode) || ''); - this.root.setAttribute('data-mode', mode); - } - }, { - key: 'restoreFocus', - value: function restoreFocus() { - var scrollTop = this.quill.scrollingContainer.scrollTop; - this.quill.focus(); - this.quill.scrollingContainer.scrollTop = scrollTop; - } - }, { - key: 'save', - value: function save() { - var value = this.textbox.value; - switch (this.root.getAttribute('data-mode')) { - case 'link': - { - var scrollTop = this.quill.root.scrollTop; - if (this.linkRange) { - this.quill.formatText(this.linkRange, 'link', value, _emitter2.default.sources.USER); - delete this.linkRange; - } else { - this.restoreFocus(); - this.quill.format('link', value, _emitter2.default.sources.USER); - } - this.quill.root.scrollTop = scrollTop; - break; - } - case 'video': - { - value = extractVideoUrl(value); - } // eslint-disable-next-line no-fallthrough - case 'formula': - { - if (!value) break; - var range = this.quill.getSelection(true); - if (range != null) { - var index = range.index + range.length; - this.quill.insertEmbed(index, this.root.getAttribute('data-mode'), value, _emitter2.default.sources.USER); - if (this.root.getAttribute('data-mode') === 'formula') { - this.quill.insertText(index + 1, ' ', _emitter2.default.sources.USER); - } - this.quill.setSelection(index + 2, _emitter2.default.sources.USER); - } - break; - } - default: - } - this.textbox.value = ''; - this.hide(); - } - }]); - - return BaseTooltip; -}(_tooltip2.default); - -function extractVideoUrl(url) { - var match = url.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/) || url.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/); - if (match) { - return (match[1] || 'https') + '://www.youtube.com/embed/' + match[2] + '?showinfo=0'; - } - if (match = url.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/)) { - // eslint-disable-line no-cond-assign - return (match[1] || 'https') + '://player.vimeo.com/video/' + match[2] + '/'; - } - return url; -} - -function fillSelect(select, values) { - var defaultValue = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - - values.forEach(function (value) { - var option = document.createElement('option'); - if (value === defaultValue) { - option.setAttribute('selected', 'selected'); - } else { - option.setAttribute('value', value); - } - select.appendChild(option); - }); -} - -exports.BaseTooltip = BaseTooltip; -exports.default = BaseTheme; - -/***/ }), -/* 44 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -var LinkedList = /** @class */ (function () { - function LinkedList() { - this.head = this.tail = null; - this.length = 0; - } - LinkedList.prototype.append = function () { - var nodes = []; - for (var _i = 0; _i < arguments.length; _i++) { - nodes[_i] = arguments[_i]; - } - this.insertBefore(nodes[0], null); - if (nodes.length > 1) { - this.append.apply(this, nodes.slice(1)); - } - }; - LinkedList.prototype.contains = function (node) { - var cur, next = this.iterator(); - while ((cur = next())) { - if (cur === node) - return true; - } - return false; - }; - LinkedList.prototype.insertBefore = function (node, refNode) { - if (!node) - return; - node.next = refNode; - if (refNode != null) { - node.prev = refNode.prev; - if (refNode.prev != null) { - refNode.prev.next = node; - } - refNode.prev = node; - if (refNode === this.head) { - this.head = node; - } - } - else if (this.tail != null) { - this.tail.next = node; - node.prev = this.tail; - this.tail = node; - } - else { - node.prev = null; - this.head = this.tail = node; - } - this.length += 1; - }; - LinkedList.prototype.offset = function (target) { - var index = 0, cur = this.head; - while (cur != null) { - if (cur === target) - return index; - index += cur.length(); - cur = cur.next; - } - return -1; - }; - LinkedList.prototype.remove = function (node) { - if (!this.contains(node)) - return; - if (node.prev != null) - node.prev.next = node.next; - if (node.next != null) - node.next.prev = node.prev; - if (node === this.head) - this.head = node.next; - if (node === this.tail) - this.tail = node.prev; - this.length -= 1; - }; - LinkedList.prototype.iterator = function (curNode) { - if (curNode === void 0) { curNode = this.head; } - // TODO use yield when we can - return function () { - var ret = curNode; - if (curNode != null) - curNode = curNode.next; - return ret; - }; - }; - LinkedList.prototype.find = function (index, inclusive) { - if (inclusive === void 0) { inclusive = false; } - var cur, next = this.iterator(); - while ((cur = next())) { - var length = cur.length(); - if (index < length || - (inclusive && index === length && (cur.next == null || cur.next.length() !== 0))) { - return [cur, index]; - } - index -= length; - } - return [null, 0]; - }; - LinkedList.prototype.forEach = function (callback) { - var cur, next = this.iterator(); - while ((cur = next())) { - callback(cur); - } - }; - LinkedList.prototype.forEachAt = function (index, length, callback) { - if (length <= 0) - return; - var _a = this.find(index), startNode = _a[0], offset = _a[1]; - var cur, curIndex = index - offset, next = this.iterator(startNode); - while ((cur = next()) && curIndex < index + length) { - var curLength = cur.length(); - if (index > curIndex) { - callback(cur, index - curIndex, Math.min(length, curIndex + curLength - index)); - } - else { - callback(cur, 0, Math.min(curLength, index + length - curIndex)); - } - curIndex += curLength; - } - }; - LinkedList.prototype.map = function (callback) { - return this.reduce(function (memo, cur) { - memo.push(callback(cur)); - return memo; - }, []); - }; - LinkedList.prototype.reduce = function (callback, memo) { - var cur, next = this.iterator(); - while ((cur = next())) { - memo = callback(memo, cur); - } - return memo; - }; - return LinkedList; -}()); -exports.default = LinkedList; - - -/***/ }), -/* 45 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -var container_1 = __webpack_require__(17); -var Registry = __webpack_require__(1); -var OBSERVER_CONFIG = { - attributes: true, - characterData: true, - characterDataOldValue: true, - childList: true, - subtree: true, -}; -var MAX_OPTIMIZE_ITERATIONS = 100; -var ScrollBlot = /** @class */ (function (_super) { - __extends(ScrollBlot, _super); - function ScrollBlot(node) { - var _this = _super.call(this, node) || this; - _this.scroll = _this; - _this.observer = new MutationObserver(function (mutations) { - _this.update(mutations); - }); - _this.observer.observe(_this.domNode, OBSERVER_CONFIG); - _this.attach(); - return _this; - } - ScrollBlot.prototype.detach = function () { - _super.prototype.detach.call(this); - this.observer.disconnect(); - }; - ScrollBlot.prototype.deleteAt = function (index, length) { - this.update(); - if (index === 0 && length === this.length()) { - this.children.forEach(function (child) { - child.remove(); - }); - } - else { - _super.prototype.deleteAt.call(this, index, length); - } - }; - ScrollBlot.prototype.formatAt = function (index, length, name, value) { - this.update(); - _super.prototype.formatAt.call(this, index, length, name, value); - }; - ScrollBlot.prototype.insertAt = function (index, value, def) { - this.update(); - _super.prototype.insertAt.call(this, index, value, def); - }; - ScrollBlot.prototype.optimize = function (mutations, context) { - var _this = this; - if (mutations === void 0) { mutations = []; } - if (context === void 0) { context = {}; } - _super.prototype.optimize.call(this, context); - // We must modify mutations directly, cannot make copy and then modify - var records = [].slice.call(this.observer.takeRecords()); - // Array.push currently seems to be implemented by a non-tail recursive function - // so we cannot just mutations.push.apply(mutations, this.observer.takeRecords()); - while (records.length > 0) - mutations.push(records.pop()); - // TODO use WeakMap - var mark = function (blot, markParent) { - if (markParent === void 0) { markParent = true; } - if (blot == null || blot === _this) - return; - if (blot.domNode.parentNode == null) - return; - // @ts-ignore - if (blot.domNode[Registry.DATA_KEY].mutations == null) { - // @ts-ignore - blot.domNode[Registry.DATA_KEY].mutations = []; - } - if (markParent) - mark(blot.parent); - }; - var optimize = function (blot) { - // Post-order traversal - if ( - // @ts-ignore - blot.domNode[Registry.DATA_KEY] == null || - // @ts-ignore - blot.domNode[Registry.DATA_KEY].mutations == null) { - return; - } - if (blot instanceof container_1.default) { - blot.children.forEach(optimize); - } - blot.optimize(context); - }; - var remaining = mutations; - for (var i = 0; remaining.length > 0; i += 1) { - if (i >= MAX_OPTIMIZE_ITERATIONS) { - throw new Error('[Parchment] Maximum optimize iterations reached'); - } - remaining.forEach(function (mutation) { - var blot = Registry.find(mutation.target, true); - if (blot == null) - return; - if (blot.domNode === mutation.target) { - if (mutation.type === 'childList') { - mark(Registry.find(mutation.previousSibling, false)); - [].forEach.call(mutation.addedNodes, function (node) { - var child = Registry.find(node, false); - mark(child, false); - if (child instanceof container_1.default) { - child.children.forEach(function (grandChild) { - mark(grandChild, false); - }); - } - }); - } - else if (mutation.type === 'attributes') { - mark(blot.prev); - } - } - mark(blot); - }); - this.children.forEach(optimize); - remaining = [].slice.call(this.observer.takeRecords()); - records = remaining.slice(); - while (records.length > 0) - mutations.push(records.pop()); - } - }; - ScrollBlot.prototype.update = function (mutations, context) { - var _this = this; - if (context === void 0) { context = {}; } - mutations = mutations || this.observer.takeRecords(); - // TODO use WeakMap - mutations - .map(function (mutation) { - var blot = Registry.find(mutation.target, true); - if (blot == null) - return null; - // @ts-ignore - if (blot.domNode[Registry.DATA_KEY].mutations == null) { - // @ts-ignore - blot.domNode[Registry.DATA_KEY].mutations = [mutation]; - return blot; - } - else { - // @ts-ignore - blot.domNode[Registry.DATA_KEY].mutations.push(mutation); - return null; - } - }) - .forEach(function (blot) { - if (blot == null || - blot === _this || - //@ts-ignore - blot.domNode[Registry.DATA_KEY] == null) - return; - // @ts-ignore - blot.update(blot.domNode[Registry.DATA_KEY].mutations || [], context); - }); - // @ts-ignore - if (this.domNode[Registry.DATA_KEY].mutations != null) { - // @ts-ignore - _super.prototype.update.call(this, this.domNode[Registry.DATA_KEY].mutations, context); - } - this.optimize(mutations, context); - }; - ScrollBlot.blotName = 'scroll'; - ScrollBlot.defaultChild = 'block'; - ScrollBlot.scope = Registry.Scope.BLOCK_BLOT; - ScrollBlot.tagName = 'DIV'; - return ScrollBlot; -}(container_1.default)); -exports.default = ScrollBlot; - - -/***/ }), -/* 46 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -var format_1 = __webpack_require__(18); -var Registry = __webpack_require__(1); -// Shallow object comparison -function isEqual(obj1, obj2) { - if (Object.keys(obj1).length !== Object.keys(obj2).length) - return false; - // @ts-ignore - for (var prop in obj1) { - // @ts-ignore - if (obj1[prop] !== obj2[prop]) - return false; - } - return true; -} -var InlineBlot = /** @class */ (function (_super) { - __extends(InlineBlot, _super); - function InlineBlot() { - return _super !== null && _super.apply(this, arguments) || this; - } - InlineBlot.formats = function (domNode) { - if (domNode.tagName === InlineBlot.tagName) - return undefined; - return _super.formats.call(this, domNode); - }; - InlineBlot.prototype.format = function (name, value) { - var _this = this; - if (name === this.statics.blotName && !value) { - this.children.forEach(function (child) { - if (!(child instanceof format_1.default)) { - child = child.wrap(InlineBlot.blotName, true); - } - _this.attributes.copy(child); - }); - this.unwrap(); - } - else { - _super.prototype.format.call(this, name, value); - } - }; - InlineBlot.prototype.formatAt = function (index, length, name, value) { - if (this.formats()[name] != null || Registry.query(name, Registry.Scope.ATTRIBUTE)) { - var blot = this.isolate(index, length); - blot.format(name, value); - } - else { - _super.prototype.formatAt.call(this, index, length, name, value); - } - }; - InlineBlot.prototype.optimize = function (context) { - _super.prototype.optimize.call(this, context); - var formats = this.formats(); - if (Object.keys(formats).length === 0) { - return this.unwrap(); // unformatted span - } - var next = this.next; - if (next instanceof InlineBlot && next.prev === this && isEqual(formats, next.formats())) { - next.moveChildren(this); - next.remove(); - } - }; - InlineBlot.blotName = 'inline'; - InlineBlot.scope = Registry.Scope.INLINE_BLOT; - InlineBlot.tagName = 'SPAN'; - return InlineBlot; -}(format_1.default)); -exports.default = InlineBlot; - - -/***/ }), -/* 47 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -var format_1 = __webpack_require__(18); -var Registry = __webpack_require__(1); -var BlockBlot = /** @class */ (function (_super) { - __extends(BlockBlot, _super); - function BlockBlot() { - return _super !== null && _super.apply(this, arguments) || this; - } - BlockBlot.formats = function (domNode) { - var tagName = Registry.query(BlockBlot.blotName).tagName; - if (domNode.tagName === tagName) - return undefined; - return _super.formats.call(this, domNode); - }; - BlockBlot.prototype.format = function (name, value) { - if (Registry.query(name, Registry.Scope.BLOCK) == null) { - return; - } - else if (name === this.statics.blotName && !value) { - this.replaceWith(BlockBlot.blotName); - } - else { - _super.prototype.format.call(this, name, value); - } - }; - BlockBlot.prototype.formatAt = function (index, length, name, value) { - if (Registry.query(name, Registry.Scope.BLOCK) != null) { - this.format(name, value); - } - else { - _super.prototype.formatAt.call(this, index, length, name, value); - } - }; - BlockBlot.prototype.insertAt = function (index, value, def) { - if (def == null || Registry.query(value, Registry.Scope.INLINE) != null) { - // Insert text or inline - _super.prototype.insertAt.call(this, index, value, def); - } - else { - var after = this.split(index); - var blot = Registry.create(value, def); - after.parent.insertBefore(blot, after); - } - }; - BlockBlot.prototype.update = function (mutations, context) { - if (navigator.userAgent.match(/Trident/)) { - this.build(); - } - else { - _super.prototype.update.call(this, mutations, context); - } - }; - BlockBlot.blotName = 'block'; - BlockBlot.scope = Registry.Scope.BLOCK_BLOT; - BlockBlot.tagName = 'P'; - return BlockBlot; -}(format_1.default)); -exports.default = BlockBlot; - - -/***/ }), -/* 48 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -var leaf_1 = __webpack_require__(19); -var EmbedBlot = /** @class */ (function (_super) { - __extends(EmbedBlot, _super); - function EmbedBlot() { - return _super !== null && _super.apply(this, arguments) || this; - } - EmbedBlot.formats = function (domNode) { - return undefined; - }; - EmbedBlot.prototype.format = function (name, value) { - // super.formatAt wraps, which is what we want in general, - // but this allows subclasses to overwrite for formats - // that just apply to particular embeds - _super.prototype.formatAt.call(this, 0, this.length(), name, value); - }; - EmbedBlot.prototype.formatAt = function (index, length, name, value) { - if (index === 0 && length === this.length()) { - this.format(name, value); - } - else { - _super.prototype.formatAt.call(this, index, length, name, value); - } - }; - EmbedBlot.prototype.formats = function () { - return this.statics.formats(this.domNode); - }; - return EmbedBlot; -}(leaf_1.default)); -exports.default = EmbedBlot; - - -/***/ }), -/* 49 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return function (d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -var leaf_1 = __webpack_require__(19); -var Registry = __webpack_require__(1); -var TextBlot = /** @class */ (function (_super) { - __extends(TextBlot, _super); - function TextBlot(node) { - var _this = _super.call(this, node) || this; - _this.text = _this.statics.value(_this.domNode); - return _this; - } - TextBlot.create = function (value) { - return document.createTextNode(value); - }; - TextBlot.value = function (domNode) { - var text = domNode.data; - // @ts-ignore - if (text['normalize']) - text = text['normalize'](); - return text; - }; - TextBlot.prototype.deleteAt = function (index, length) { - this.domNode.data = this.text = this.text.slice(0, index) + this.text.slice(index + length); - }; - TextBlot.prototype.index = function (node, offset) { - if (this.domNode === node) { - return offset; - } - return -1; - }; - TextBlot.prototype.insertAt = function (index, value, def) { - if (def == null) { - this.text = this.text.slice(0, index) + value + this.text.slice(index); - this.domNode.data = this.text; - } - else { - _super.prototype.insertAt.call(this, index, value, def); - } - }; - TextBlot.prototype.length = function () { - return this.text.length; - }; - TextBlot.prototype.optimize = function (context) { - _super.prototype.optimize.call(this, context); - this.text = this.statics.value(this.domNode); - if (this.text.length === 0) { - this.remove(); - } - else if (this.next instanceof TextBlot && this.next.prev === this) { - this.insertAt(this.length(), this.next.value()); - this.next.remove(); - } - }; - TextBlot.prototype.position = function (index, inclusive) { - if (inclusive === void 0) { inclusive = false; } - return [this.domNode, index]; - }; - TextBlot.prototype.split = function (index, force) { - if (force === void 0) { force = false; } - if (!force) { - if (index === 0) - return this; - if (index === this.length()) - return this.next; - } - var after = Registry.create(this.domNode.splitText(index)); - this.parent.insertBefore(after, this.next); - this.text = this.statics.value(this.domNode); - return after; - }; - TextBlot.prototype.update = function (mutations, context) { - var _this = this; - if (mutations.some(function (mutation) { - return mutation.type === 'characterData' && mutation.target === _this.domNode; - })) { - this.text = this.statics.value(this.domNode); - } - }; - TextBlot.prototype.value = function () { - return this.text; - }; - TextBlot.blotName = 'text'; - TextBlot.scope = Registry.Scope.INLINE_BLOT; - return TextBlot; -}(leaf_1.default)); -exports.default = TextBlot; - - -/***/ }), -/* 50 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var elem = document.createElement('div'); -elem.classList.toggle('test-class', false); -if (elem.classList.contains('test-class')) { - var _toggle = DOMTokenList.prototype.toggle; - DOMTokenList.prototype.toggle = function (token, force) { - if (arguments.length > 1 && !this.contains(token) === !force) { - return force; - } else { - return _toggle.call(this, token); - } - }; -} - -if (!String.prototype.startsWith) { - String.prototype.startsWith = function (searchString, position) { - position = position || 0; - return this.substr(position, searchString.length) === searchString; - }; -} - -if (!String.prototype.endsWith) { - String.prototype.endsWith = function (searchString, position) { - var subjectString = this.toString(); - if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { - position = subjectString.length; - } - position -= searchString.length; - var lastIndex = subjectString.indexOf(searchString, position); - return lastIndex !== -1 && lastIndex === position; - }; -} - -if (!Array.prototype.find) { - Object.defineProperty(Array.prototype, "find", { - value: function value(predicate) { - if (this === null) { - throw new TypeError('Array.prototype.find called on null or undefined'); - } - if (typeof predicate !== 'function') { - throw new TypeError('predicate must be a function'); - } - var list = Object(this); - var length = list.length >>> 0; - var thisArg = arguments[1]; - var value; - - for (var i = 0; i < length; i++) { - value = list[i]; - if (predicate.call(thisArg, value, i, list)) { - return value; - } - } - return undefined; - } - }); -} - -document.addEventListener("DOMContentLoaded", function () { - // Disable resizing in Firefox - document.execCommand("enableObjectResizing", false, false); - // Disable automatic linkifying in IE11 - document.execCommand("autoUrlDetect", false, false); -}); - -/***/ }), -/* 51 */ -/***/ (function(module, exports) { - -/** - * This library modifies the diff-patch-match library by Neil Fraser - * by removing the patch and match functionality and certain advanced - * options in the diff function. The original license is as follows: - * - * === - * - * Diff Match and Patch - * - * Copyright 2006 Google Inc. - * http://code.google.com/p/google-diff-match-patch/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/** - * The data structure representing a diff is an array of tuples: - * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']] - * which means: delete 'Hello', add 'Goodbye' and keep ' world.' - */ -var DIFF_DELETE = -1; -var DIFF_INSERT = 1; -var DIFF_EQUAL = 0; - - -/** - * Find the differences between two texts. Simplifies the problem by stripping - * any common prefix or suffix off the texts before diffing. - * @param {string} text1 Old string to be diffed. - * @param {string} text2 New string to be diffed. - * @param {Int} cursor_pos Expected edit position in text1 (optional) - * @return {Array} Array of diff tuples. - */ -function diff_main(text1, text2, cursor_pos) { - // Check for equality (speedup). - if (text1 == text2) { - if (text1) { - return [[DIFF_EQUAL, text1]]; - } - return []; - } - - // Check cursor_pos within bounds - if (cursor_pos < 0 || text1.length < cursor_pos) { - cursor_pos = null; - } - - // Trim off common prefix (speedup). - var commonlength = diff_commonPrefix(text1, text2); - var commonprefix = text1.substring(0, commonlength); - text1 = text1.substring(commonlength); - text2 = text2.substring(commonlength); - - // Trim off common suffix (speedup). - commonlength = diff_commonSuffix(text1, text2); - var commonsuffix = text1.substring(text1.length - commonlength); - text1 = text1.substring(0, text1.length - commonlength); - text2 = text2.substring(0, text2.length - commonlength); - - // Compute the diff on the middle block. - var diffs = diff_compute_(text1, text2); - - // Restore the prefix and suffix. - if (commonprefix) { - diffs.unshift([DIFF_EQUAL, commonprefix]); - } - if (commonsuffix) { - diffs.push([DIFF_EQUAL, commonsuffix]); - } - diff_cleanupMerge(diffs); - if (cursor_pos != null) { - diffs = fix_cursor(diffs, cursor_pos); - } - diffs = fix_emoji(diffs); - return diffs; -}; - - -/** - * Find the differences between two texts. Assumes that the texts do not - * have any common prefix or suffix. - * @param {string} text1 Old string to be diffed. - * @param {string} text2 New string to be diffed. - * @return {Array} Array of diff tuples. - */ -function diff_compute_(text1, text2) { - var diffs; - - if (!text1) { - // Just add some text (speedup). - return [[DIFF_INSERT, text2]]; - } - - if (!text2) { - // Just delete some text (speedup). - return [[DIFF_DELETE, text1]]; - } - - var longtext = text1.length > text2.length ? text1 : text2; - var shorttext = text1.length > text2.length ? text2 : text1; - var i = longtext.indexOf(shorttext); - if (i != -1) { - // Shorter text is inside the longer text (speedup). - diffs = [[DIFF_INSERT, longtext.substring(0, i)], - [DIFF_EQUAL, shorttext], - [DIFF_INSERT, longtext.substring(i + shorttext.length)]]; - // Swap insertions for deletions if diff is reversed. - if (text1.length > text2.length) { - diffs[0][0] = diffs[2][0] = DIFF_DELETE; - } - return diffs; - } - - if (shorttext.length == 1) { - // Single character string. - // After the previous speedup, the character can't be an equality. - return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]]; - } - - // Check to see if the problem can be split in two. - var hm = diff_halfMatch_(text1, text2); - if (hm) { - // A half-match was found, sort out the return data. - var text1_a = hm[0]; - var text1_b = hm[1]; - var text2_a = hm[2]; - var text2_b = hm[3]; - var mid_common = hm[4]; - // Send both pairs off for separate processing. - var diffs_a = diff_main(text1_a, text2_a); - var diffs_b = diff_main(text1_b, text2_b); - // Merge the results. - return diffs_a.concat([[DIFF_EQUAL, mid_common]], diffs_b); - } - - return diff_bisect_(text1, text2); -}; - - -/** - * Find the 'middle snake' of a diff, split the problem in two - * and return the recursively constructed diff. - * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations. - * @param {string} text1 Old string to be diffed. - * @param {string} text2 New string to be diffed. - * @return {Array} Array of diff tuples. - * @private - */ -function diff_bisect_(text1, text2) { - // Cache the text lengths to prevent multiple calls. - var text1_length = text1.length; - var text2_length = text2.length; - var max_d = Math.ceil((text1_length + text2_length) / 2); - var v_offset = max_d; - var v_length = 2 * max_d; - var v1 = new Array(v_length); - var v2 = new Array(v_length); - // Setting all elements to -1 is faster in Chrome & Firefox than mixing - // integers and undefined. - for (var x = 0; x < v_length; x++) { - v1[x] = -1; - v2[x] = -1; - } - v1[v_offset + 1] = 0; - v2[v_offset + 1] = 0; - var delta = text1_length - text2_length; - // If the total number of characters is odd, then the front path will collide - // with the reverse path. - var front = (delta % 2 != 0); - // Offsets for start and end of k loop. - // Prevents mapping of space beyond the grid. - var k1start = 0; - var k1end = 0; - var k2start = 0; - var k2end = 0; - for (var d = 0; d < max_d; d++) { - // Walk the front path one step. - for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) { - var k1_offset = v_offset + k1; - var x1; - if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) { - x1 = v1[k1_offset + 1]; - } else { - x1 = v1[k1_offset - 1] + 1; - } - var y1 = x1 - k1; - while (x1 < text1_length && y1 < text2_length && - text1.charAt(x1) == text2.charAt(y1)) { - x1++; - y1++; - } - v1[k1_offset] = x1; - if (x1 > text1_length) { - // Ran off the right of the graph. - k1end += 2; - } else if (y1 > text2_length) { - // Ran off the bottom of the graph. - k1start += 2; - } else if (front) { - var k2_offset = v_offset + delta - k1; - if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) { - // Mirror x2 onto top-left coordinate system. - var x2 = text1_length - v2[k2_offset]; - if (x1 >= x2) { - // Overlap detected. - return diff_bisectSplit_(text1, text2, x1, y1); - } - } - } - } - - // Walk the reverse path one step. - for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) { - var k2_offset = v_offset + k2; - var x2; - if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) { - x2 = v2[k2_offset + 1]; - } else { - x2 = v2[k2_offset - 1] + 1; - } - var y2 = x2 - k2; - while (x2 < text1_length && y2 < text2_length && - text1.charAt(text1_length - x2 - 1) == - text2.charAt(text2_length - y2 - 1)) { - x2++; - y2++; - } - v2[k2_offset] = x2; - if (x2 > text1_length) { - // Ran off the left of the graph. - k2end += 2; - } else if (y2 > text2_length) { - // Ran off the top of the graph. - k2start += 2; - } else if (!front) { - var k1_offset = v_offset + delta - k2; - if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) { - var x1 = v1[k1_offset]; - var y1 = v_offset + x1 - k1_offset; - // Mirror x2 onto top-left coordinate system. - x2 = text1_length - x2; - if (x1 >= x2) { - // Overlap detected. - return diff_bisectSplit_(text1, text2, x1, y1); - } - } - } - } - } - // Diff took too long and hit the deadline or - // number of diffs equals number of characters, no commonality at all. - return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]]; -}; - - -/** - * Given the location of the 'middle snake', split the diff in two parts - * and recurse. - * @param {string} text1 Old string to be diffed. - * @param {string} text2 New string to be diffed. - * @param {number} x Index of split point in text1. - * @param {number} y Index of split point in text2. - * @return {Array} Array of diff tuples. - */ -function diff_bisectSplit_(text1, text2, x, y) { - var text1a = text1.substring(0, x); - var text2a = text2.substring(0, y); - var text1b = text1.substring(x); - var text2b = text2.substring(y); - - // Compute both diffs serially. - var diffs = diff_main(text1a, text2a); - var diffsb = diff_main(text1b, text2b); - - return diffs.concat(diffsb); -}; - - -/** - * Determine the common prefix of two strings. - * @param {string} text1 First string. - * @param {string} text2 Second string. - * @return {number} The number of characters common to the start of each - * string. - */ -function diff_commonPrefix(text1, text2) { - // Quick check for common null cases. - if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) { - return 0; - } - // Binary search. - // Performance analysis: http://neil.fraser.name/news/2007/10/09/ - var pointermin = 0; - var pointermax = Math.min(text1.length, text2.length); - var pointermid = pointermax; - var pointerstart = 0; - while (pointermin < pointermid) { - if (text1.substring(pointerstart, pointermid) == - text2.substring(pointerstart, pointermid)) { - pointermin = pointermid; - pointerstart = pointermin; - } else { - pointermax = pointermid; - } - pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); - } - return pointermid; -}; - - -/** - * Determine the common suffix of two strings. - * @param {string} text1 First string. - * @param {string} text2 Second string. - * @return {number} The number of characters common to the end of each string. - */ -function diff_commonSuffix(text1, text2) { - // Quick check for common null cases. - if (!text1 || !text2 || - text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1)) { - return 0; - } - // Binary search. - // Performance analysis: http://neil.fraser.name/news/2007/10/09/ - var pointermin = 0; - var pointermax = Math.min(text1.length, text2.length); - var pointermid = pointermax; - var pointerend = 0; - while (pointermin < pointermid) { - if (text1.substring(text1.length - pointermid, text1.length - pointerend) == - text2.substring(text2.length - pointermid, text2.length - pointerend)) { - pointermin = pointermid; - pointerend = pointermin; - } else { - pointermax = pointermid; - } - pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); - } - return pointermid; -}; - - -/** - * Do the two texts share a substring which is at least half the length of the - * longer text? - * This speedup can produce non-minimal diffs. - * @param {string} text1 First string. - * @param {string} text2 Second string. - * @return {Array.} Five element Array, containing the prefix of - * text1, the suffix of text1, the prefix of text2, the suffix of - * text2 and the common middle. Or null if there was no match. - */ -function diff_halfMatch_(text1, text2) { - var longtext = text1.length > text2.length ? text1 : text2; - var shorttext = text1.length > text2.length ? text2 : text1; - if (longtext.length < 4 || shorttext.length * 2 < longtext.length) { - return null; // Pointless. - } - - /** - * Does a substring of shorttext exist within longtext such that the substring - * is at least half the length of longtext? - * Closure, but does not reference any external variables. - * @param {string} longtext Longer string. - * @param {string} shorttext Shorter string. - * @param {number} i Start index of quarter length substring within longtext. - * @return {Array.} Five element Array, containing the prefix of - * longtext, the suffix of longtext, the prefix of shorttext, the suffix - * of shorttext and the common middle. Or null if there was no match. - * @private - */ - function diff_halfMatchI_(longtext, shorttext, i) { - // Start with a 1/4 length substring at position i as a seed. - var seed = longtext.substring(i, i + Math.floor(longtext.length / 4)); - var j = -1; - var best_common = ''; - var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b; - while ((j = shorttext.indexOf(seed, j + 1)) != -1) { - var prefixLength = diff_commonPrefix(longtext.substring(i), - shorttext.substring(j)); - var suffixLength = diff_commonSuffix(longtext.substring(0, i), - shorttext.substring(0, j)); - if (best_common.length < suffixLength + prefixLength) { - best_common = shorttext.substring(j - suffixLength, j) + - shorttext.substring(j, j + prefixLength); - best_longtext_a = longtext.substring(0, i - suffixLength); - best_longtext_b = longtext.substring(i + prefixLength); - best_shorttext_a = shorttext.substring(0, j - suffixLength); - best_shorttext_b = shorttext.substring(j + prefixLength); - } - } - if (best_common.length * 2 >= longtext.length) { - return [best_longtext_a, best_longtext_b, - best_shorttext_a, best_shorttext_b, best_common]; - } else { - return null; - } - } - - // First check if the second quarter is the seed for a half-match. - var hm1 = diff_halfMatchI_(longtext, shorttext, - Math.ceil(longtext.length / 4)); - // Check again based on the third quarter. - var hm2 = diff_halfMatchI_(longtext, shorttext, - Math.ceil(longtext.length / 2)); - var hm; - if (!hm1 && !hm2) { - return null; - } else if (!hm2) { - hm = hm1; - } else if (!hm1) { - hm = hm2; - } else { - // Both matched. Select the longest. - hm = hm1[4].length > hm2[4].length ? hm1 : hm2; - } - - // A half-match was found, sort out the return data. - var text1_a, text1_b, text2_a, text2_b; - if (text1.length > text2.length) { - text1_a = hm[0]; - text1_b = hm[1]; - text2_a = hm[2]; - text2_b = hm[3]; - } else { - text2_a = hm[0]; - text2_b = hm[1]; - text1_a = hm[2]; - text1_b = hm[3]; - } - var mid_common = hm[4]; - return [text1_a, text1_b, text2_a, text2_b, mid_common]; -}; - - -/** - * Reorder and merge like edit sections. Merge equalities. - * Any edit section can move as long as it doesn't cross an equality. - * @param {Array} diffs Array of diff tuples. - */ -function diff_cleanupMerge(diffs) { - diffs.push([DIFF_EQUAL, '']); // Add a dummy entry at the end. - var pointer = 0; - var count_delete = 0; - var count_insert = 0; - var text_delete = ''; - var text_insert = ''; - var commonlength; - while (pointer < diffs.length) { - switch (diffs[pointer][0]) { - case DIFF_INSERT: - count_insert++; - text_insert += diffs[pointer][1]; - pointer++; - break; - case DIFF_DELETE: - count_delete++; - text_delete += diffs[pointer][1]; - pointer++; - break; - case DIFF_EQUAL: - // Upon reaching an equality, check for prior redundancies. - if (count_delete + count_insert > 1) { - if (count_delete !== 0 && count_insert !== 0) { - // Factor out any common prefixies. - commonlength = diff_commonPrefix(text_insert, text_delete); - if (commonlength !== 0) { - if ((pointer - count_delete - count_insert) > 0 && - diffs[pointer - count_delete - count_insert - 1][0] == - DIFF_EQUAL) { - diffs[pointer - count_delete - count_insert - 1][1] += - text_insert.substring(0, commonlength); - } else { - diffs.splice(0, 0, [DIFF_EQUAL, - text_insert.substring(0, commonlength)]); - pointer++; - } - text_insert = text_insert.substring(commonlength); - text_delete = text_delete.substring(commonlength); - } - // Factor out any common suffixies. - commonlength = diff_commonSuffix(text_insert, text_delete); - if (commonlength !== 0) { - diffs[pointer][1] = text_insert.substring(text_insert.length - - commonlength) + diffs[pointer][1]; - text_insert = text_insert.substring(0, text_insert.length - - commonlength); - text_delete = text_delete.substring(0, text_delete.length - - commonlength); - } - } - // Delete the offending records and add the merged ones. - if (count_delete === 0) { - diffs.splice(pointer - count_insert, - count_delete + count_insert, [DIFF_INSERT, text_insert]); - } else if (count_insert === 0) { - diffs.splice(pointer - count_delete, - count_delete + count_insert, [DIFF_DELETE, text_delete]); - } else { - diffs.splice(pointer - count_delete - count_insert, - count_delete + count_insert, [DIFF_DELETE, text_delete], - [DIFF_INSERT, text_insert]); - } - pointer = pointer - count_delete - count_insert + - (count_delete ? 1 : 0) + (count_insert ? 1 : 0) + 1; - } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) { - // Merge this equality with the previous one. - diffs[pointer - 1][1] += diffs[pointer][1]; - diffs.splice(pointer, 1); - } else { - pointer++; - } - count_insert = 0; - count_delete = 0; - text_delete = ''; - text_insert = ''; - break; - } - } - if (diffs[diffs.length - 1][1] === '') { - diffs.pop(); // Remove the dummy entry at the end. - } - - // Second pass: look for single edits surrounded on both sides by equalities - // which can be shifted sideways to eliminate an equality. - // e.g: ABAC -> ABAC - var changes = false; - pointer = 1; - // Intentionally ignore the first and last element (don't need checking). - while (pointer < diffs.length - 1) { - if (diffs[pointer - 1][0] == DIFF_EQUAL && - diffs[pointer + 1][0] == DIFF_EQUAL) { - // This is a single edit surrounded by equalities. - if (diffs[pointer][1].substring(diffs[pointer][1].length - - diffs[pointer - 1][1].length) == diffs[pointer - 1][1]) { - // Shift the edit over the previous equality. - diffs[pointer][1] = diffs[pointer - 1][1] + - diffs[pointer][1].substring(0, diffs[pointer][1].length - - diffs[pointer - 1][1].length); - diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1]; - diffs.splice(pointer - 1, 1); - changes = true; - } else if (diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) == - diffs[pointer + 1][1]) { - // Shift the edit over the next equality. - diffs[pointer - 1][1] += diffs[pointer + 1][1]; - diffs[pointer][1] = - diffs[pointer][1].substring(diffs[pointer + 1][1].length) + - diffs[pointer + 1][1]; - diffs.splice(pointer + 1, 1); - changes = true; - } - } - pointer++; - } - // If shifts were made, the diff needs reordering and another shift sweep. - if (changes) { - diff_cleanupMerge(diffs); - } -}; - - -var diff = diff_main; -diff.INSERT = DIFF_INSERT; -diff.DELETE = DIFF_DELETE; -diff.EQUAL = DIFF_EQUAL; - -module.exports = diff; - -/* - * Modify a diff such that the cursor position points to the start of a change: - * E.g. - * cursor_normalize_diff([[DIFF_EQUAL, 'abc']], 1) - * => [1, [[DIFF_EQUAL, 'a'], [DIFF_EQUAL, 'bc']]] - * cursor_normalize_diff([[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xyz']], 2) - * => [2, [[DIFF_INSERT, 'new'], [DIFF_DELETE, 'xy'], [DIFF_DELETE, 'z']]] - * - * @param {Array} diffs Array of diff tuples - * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds! - * @return {Array} A tuple [cursor location in the modified diff, modified diff] - */ -function cursor_normalize_diff (diffs, cursor_pos) { - if (cursor_pos === 0) { - return [DIFF_EQUAL, diffs]; - } - for (var current_pos = 0, i = 0; i < diffs.length; i++) { - var d = diffs[i]; - if (d[0] === DIFF_DELETE || d[0] === DIFF_EQUAL) { - var next_pos = current_pos + d[1].length; - if (cursor_pos === next_pos) { - return [i + 1, diffs]; - } else if (cursor_pos < next_pos) { - // copy to prevent side effects - diffs = diffs.slice(); - // split d into two diff changes - var split_pos = cursor_pos - current_pos; - var d_left = [d[0], d[1].slice(0, split_pos)]; - var d_right = [d[0], d[1].slice(split_pos)]; - diffs.splice(i, 1, d_left, d_right); - return [i + 1, diffs]; - } else { - current_pos = next_pos; - } - } - } - throw new Error('cursor_pos is out of bounds!') -} - -/* - * Modify a diff such that the edit position is "shifted" to the proposed edit location (cursor_position). - * - * Case 1) - * Check if a naive shift is possible: - * [0, X], [ 1, Y] -> [ 1, Y], [0, X] (if X + Y === Y + X) - * [0, X], [-1, Y] -> [-1, Y], [0, X] (if X + Y === Y + X) - holds same result - * Case 2) - * Check if the following shifts are possible: - * [0, 'pre'], [ 1, 'prefix'] -> [ 1, 'pre'], [0, 'pre'], [ 1, 'fix'] - * [0, 'pre'], [-1, 'prefix'] -> [-1, 'pre'], [0, 'pre'], [-1, 'fix'] - * ^ ^ - * d d_next - * - * @param {Array} diffs Array of diff tuples - * @param {Int} cursor_pos Suggested edit position. Must not be out of bounds! - * @return {Array} Array of diff tuples - */ -function fix_cursor (diffs, cursor_pos) { - var norm = cursor_normalize_diff(diffs, cursor_pos); - var ndiffs = norm[1]; - var cursor_pointer = norm[0]; - var d = ndiffs[cursor_pointer]; - var d_next = ndiffs[cursor_pointer + 1]; - - if (d == null) { - // Text was deleted from end of original string, - // cursor is now out of bounds in new string - return diffs; - } else if (d[0] !== DIFF_EQUAL) { - // A modification happened at the cursor location. - // This is the expected outcome, so we can return the original diff. - return diffs; - } else { - if (d_next != null && d[1] + d_next[1] === d_next[1] + d[1]) { - // Case 1) - // It is possible to perform a naive shift - ndiffs.splice(cursor_pointer, 2, d_next, d) - return merge_tuples(ndiffs, cursor_pointer, 2) - } else if (d_next != null && d_next[1].indexOf(d[1]) === 0) { - // Case 2) - // d[1] is a prefix of d_next[1] - // We can assume that d_next[0] !== 0, since d[0] === 0 - // Shift edit locations.. - ndiffs.splice(cursor_pointer, 2, [d_next[0], d[1]], [0, d[1]]); - var suffix = d_next[1].slice(d[1].length); - if (suffix.length > 0) { - ndiffs.splice(cursor_pointer + 2, 0, [d_next[0], suffix]); - } - return merge_tuples(ndiffs, cursor_pointer, 3) - } else { - // Not possible to perform any modification - return diffs; - } - } -} - -/* - * Check diff did not split surrogate pairs. - * Ex. [0, '\uD83D'], [-1, '\uDC36'], [1, '\uDC2F'] -> [-1, '\uD83D\uDC36'], [1, '\uD83D\uDC2F'] - * '\uD83D\uDC36' === '🐶', '\uD83D\uDC2F' === '🐯' - * - * @param {Array} diffs Array of diff tuples - * @return {Array} Array of diff tuples - */ -function fix_emoji (diffs) { - var compact = false; - var starts_with_pair_end = function(str) { - return str.charCodeAt(0) >= 0xDC00 && str.charCodeAt(0) <= 0xDFFF; - } - var ends_with_pair_start = function(str) { - return str.charCodeAt(str.length-1) >= 0xD800 && str.charCodeAt(str.length-1) <= 0xDBFF; - } - for (var i = 2; i < diffs.length; i += 1) { - if (diffs[i-2][0] === DIFF_EQUAL && ends_with_pair_start(diffs[i-2][1]) && - diffs[i-1][0] === DIFF_DELETE && starts_with_pair_end(diffs[i-1][1]) && - diffs[i][0] === DIFF_INSERT && starts_with_pair_end(diffs[i][1])) { - compact = true; - - diffs[i-1][1] = diffs[i-2][1].slice(-1) + diffs[i-1][1]; - diffs[i][1] = diffs[i-2][1].slice(-1) + diffs[i][1]; - - diffs[i-2][1] = diffs[i-2][1].slice(0, -1); - } - } - if (!compact) { - return diffs; - } - var fixed_diffs = []; - for (var i = 0; i < diffs.length; i += 1) { - if (diffs[i][1].length > 0) { - fixed_diffs.push(diffs[i]); - } - } - return fixed_diffs; -} - -/* - * Try to merge tuples with their neigbors in a given range. - * E.g. [0, 'a'], [0, 'b'] -> [0, 'ab'] - * - * @param {Array} diffs Array of diff tuples. - * @param {Int} start Position of the first element to merge (diffs[start] is also merged with diffs[start - 1]). - * @param {Int} length Number of consecutive elements to check. - * @return {Array} Array of merged diff tuples. - */ -function merge_tuples (diffs, start, length) { - // Check from (start-1) to (start+length). - for (var i = start + length - 1; i >= 0 && i >= start - 1; i--) { - if (i + 1 < diffs.length) { - var left_d = diffs[i]; - var right_d = diffs[i+1]; - if (left_d[0] === right_d[1]) { - diffs.splice(i, 2, [left_d[0], left_d[1] + right_d[1]]); - } - } - } - return diffs; -} - - -/***/ }), -/* 52 */ -/***/ (function(module, exports) { - -exports = module.exports = typeof Object.keys === 'function' - ? Object.keys : shim; - -exports.shim = shim; -function shim (obj) { - var keys = []; - for (var key in obj) keys.push(key); - return keys; -} - - -/***/ }), -/* 53 */ -/***/ (function(module, exports) { - -var supportsArgumentsClass = (function(){ - return Object.prototype.toString.call(arguments) -})() == '[object Arguments]'; - -exports = module.exports = supportsArgumentsClass ? supported : unsupported; - -exports.supported = supported; -function supported(object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -}; - -exports.unsupported = unsupported; -function unsupported(object){ - return object && - typeof object == 'object' && - typeof object.length == 'number' && - Object.prototype.hasOwnProperty.call(object, 'callee') && - !Object.prototype.propertyIsEnumerable.call(object, 'callee') || - false; -}; - - -/***/ }), -/* 54 */ -/***/ (function(module, exports) { - -'use strict'; - -var has = Object.prototype.hasOwnProperty - , prefix = '~'; - -/** - * Constructor to create a storage for our `EE` objects. - * An `Events` instance is a plain object whose properties are event names. - * - * @constructor - * @api private - */ -function Events() {} - -// -// We try to not inherit from `Object.prototype`. In some engines creating an -// instance in this way is faster than calling `Object.create(null)` directly. -// If `Object.create(null)` is not supported we prefix the event names with a -// character to make sure that the built-in object properties are not -// overridden or used as an attack vector. -// -if (Object.create) { - Events.prototype = Object.create(null); - - // - // This hack is needed because the `__proto__` property is still inherited in - // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5. - // - if (!new Events().__proto__) prefix = false; -} - -/** - * Representation of a single event listener. - * - * @param {Function} fn The listener function. - * @param {Mixed} context The context to invoke the listener with. - * @param {Boolean} [once=false] Specify if the listener is a one-time listener. - * @constructor - * @api private - */ -function EE(fn, context, once) { - this.fn = fn; - this.context = context; - this.once = once || false; -} - -/** - * Minimal `EventEmitter` interface that is molded against the Node.js - * `EventEmitter` interface. - * - * @constructor - * @api public - */ -function EventEmitter() { - this._events = new Events(); - this._eventsCount = 0; -} - -/** - * Return an array listing the events for which the emitter has registered - * listeners. - * - * @returns {Array} - * @api public - */ -EventEmitter.prototype.eventNames = function eventNames() { - var names = [] - , events - , name; - - if (this._eventsCount === 0) return names; - - for (name in (events = this._events)) { - if (has.call(events, name)) names.push(prefix ? name.slice(1) : name); - } - - if (Object.getOwnPropertySymbols) { - return names.concat(Object.getOwnPropertySymbols(events)); - } - - return names; -}; - -/** - * Return the listeners registered for a given event. - * - * @param {String|Symbol} event The event name. - * @param {Boolean} exists Only check if there are listeners. - * @returns {Array|Boolean} - * @api public - */ -EventEmitter.prototype.listeners = function listeners(event, exists) { - var evt = prefix ? prefix + event : event - , available = this._events[evt]; - - if (exists) return !!available; - if (!available) return []; - if (available.fn) return [available.fn]; - - for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) { - ee[i] = available[i].fn; - } - - return ee; -}; - -/** - * Calls each of the listeners registered for a given event. - * - * @param {String|Symbol} event The event name. - * @returns {Boolean} `true` if the event had listeners, else `false`. - * @api public - */ -EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) { - var evt = prefix ? prefix + event : event; - - if (!this._events[evt]) return false; - - var listeners = this._events[evt] - , len = arguments.length - , args - , i; - - if (listeners.fn) { - if (listeners.once) this.removeListener(event, listeners.fn, undefined, true); - - switch (len) { - case 1: return listeners.fn.call(listeners.context), true; - case 2: return listeners.fn.call(listeners.context, a1), true; - case 3: return listeners.fn.call(listeners.context, a1, a2), true; - case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true; - case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true; - case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true; - } - - for (i = 1, args = new Array(len -1); i < len; i++) { - args[i - 1] = arguments[i]; - } - - listeners.fn.apply(listeners.context, args); - } else { - var length = listeners.length - , j; - - for (i = 0; i < length; i++) { - if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true); - - switch (len) { - case 1: listeners[i].fn.call(listeners[i].context); break; - case 2: listeners[i].fn.call(listeners[i].context, a1); break; - case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break; - case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break; - default: - if (!args) for (j = 1, args = new Array(len -1); j < len; j++) { - args[j - 1] = arguments[j]; - } - - listeners[i].fn.apply(listeners[i].context, args); - } - } - } - - return true; -}; - -/** - * Add a listener for a given event. - * - * @param {String|Symbol} event The event name. - * @param {Function} fn The listener function. - * @param {Mixed} [context=this] The context to invoke the listener with. - * @returns {EventEmitter} `this`. - * @api public - */ -EventEmitter.prototype.on = function on(event, fn, context) { - var listener = new EE(fn, context || this) - , evt = prefix ? prefix + event : event; - - if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++; - else if (!this._events[evt].fn) this._events[evt].push(listener); - else this._events[evt] = [this._events[evt], listener]; - - return this; -}; - -/** - * Add a one-time listener for a given event. - * - * @param {String|Symbol} event The event name. - * @param {Function} fn The listener function. - * @param {Mixed} [context=this] The context to invoke the listener with. - * @returns {EventEmitter} `this`. - * @api public - */ -EventEmitter.prototype.once = function once(event, fn, context) { - var listener = new EE(fn, context || this, true) - , evt = prefix ? prefix + event : event; - - if (!this._events[evt]) this._events[evt] = listener, this._eventsCount++; - else if (!this._events[evt].fn) this._events[evt].push(listener); - else this._events[evt] = [this._events[evt], listener]; - - return this; -}; - -/** - * Remove the listeners of a given event. - * - * @param {String|Symbol} event The event name. - * @param {Function} fn Only remove the listeners that match this function. - * @param {Mixed} context Only remove the listeners that have this context. - * @param {Boolean} once Only remove one-time listeners. - * @returns {EventEmitter} `this`. - * @api public - */ -EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) { - var evt = prefix ? prefix + event : event; - - if (!this._events[evt]) return this; - if (!fn) { - if (--this._eventsCount === 0) this._events = new Events(); - else delete this._events[evt]; - return this; - } - - var listeners = this._events[evt]; - - if (listeners.fn) { - if ( - listeners.fn === fn - && (!once || listeners.once) - && (!context || listeners.context === context) - ) { - if (--this._eventsCount === 0) this._events = new Events(); - else delete this._events[evt]; - } - } else { - for (var i = 0, events = [], length = listeners.length; i < length; i++) { - if ( - listeners[i].fn !== fn - || (once && !listeners[i].once) - || (context && listeners[i].context !== context) - ) { - events.push(listeners[i]); - } - } - - // - // Reset the array, or remove it completely if we have no more listeners. - // - if (events.length) this._events[evt] = events.length === 1 ? events[0] : events; - else if (--this._eventsCount === 0) this._events = new Events(); - else delete this._events[evt]; - } - - return this; -}; - -/** - * Remove all listeners, or those of the specified event. - * - * @param {String|Symbol} [event] The event name. - * @returns {EventEmitter} `this`. - * @api public - */ -EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) { - var evt; - - if (event) { - evt = prefix ? prefix + event : event; - if (this._events[evt]) { - if (--this._eventsCount === 0) this._events = new Events(); - else delete this._events[evt]; - } - } else { - this._events = new Events(); - this._eventsCount = 0; - } - - return this; -}; - -// -// Alias methods names because people roll like that. -// -EventEmitter.prototype.off = EventEmitter.prototype.removeListener; -EventEmitter.prototype.addListener = EventEmitter.prototype.on; - -// -// This function doesn't apply anymore. -// -EventEmitter.prototype.setMaxListeners = function setMaxListeners() { - return this; -}; - -// -// Expose the prefix. -// -EventEmitter.prefixed = prefix; - -// -// Allow `EventEmitter` to be imported as module namespace. -// -EventEmitter.EventEmitter = EventEmitter; - -// -// Expose the module. -// -if ('undefined' !== typeof module) { - module.exports = EventEmitter; -} - - -/***/ }), -/* 55 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.matchText = exports.matchSpacing = exports.matchNewline = exports.matchBlot = exports.matchAttributor = exports.default = undefined; - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _extend2 = __webpack_require__(3); - -var _extend3 = _interopRequireDefault(_extend2); - -var _quillDelta = __webpack_require__(2); - -var _quillDelta2 = _interopRequireDefault(_quillDelta); - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _quill = __webpack_require__(5); - -var _quill2 = _interopRequireDefault(_quill); - -var _logger = __webpack_require__(10); - -var _logger2 = _interopRequireDefault(_logger); - -var _module = __webpack_require__(9); - -var _module2 = _interopRequireDefault(_module); - -var _align = __webpack_require__(36); - -var _background = __webpack_require__(37); - -var _code = __webpack_require__(13); - -var _code2 = _interopRequireDefault(_code); - -var _color = __webpack_require__(26); - -var _direction = __webpack_require__(38); - -var _font = __webpack_require__(39); - -var _size = __webpack_require__(40); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var debug = (0, _logger2.default)('quill:clipboard'); - -var DOM_KEY = '__ql-matcher'; - -var CLIPBOARD_CONFIG = [[Node.TEXT_NODE, matchText], [Node.TEXT_NODE, matchNewline], ['br', matchBreak], [Node.ELEMENT_NODE, matchNewline], [Node.ELEMENT_NODE, matchBlot], [Node.ELEMENT_NODE, matchSpacing], [Node.ELEMENT_NODE, matchAttributor], [Node.ELEMENT_NODE, matchStyles], ['li', matchIndent], ['b', matchAlias.bind(matchAlias, 'bold')], ['i', matchAlias.bind(matchAlias, 'italic')], ['style', matchIgnore]]; - -var ATTRIBUTE_ATTRIBUTORS = [_align.AlignAttribute, _direction.DirectionAttribute].reduce(function (memo, attr) { - memo[attr.keyName] = attr; - return memo; -}, {}); - -var STYLE_ATTRIBUTORS = [_align.AlignStyle, _background.BackgroundStyle, _color.ColorStyle, _direction.DirectionStyle, _font.FontStyle, _size.SizeStyle].reduce(function (memo, attr) { - memo[attr.keyName] = attr; - return memo; -}, {}); - -var Clipboard = function (_Module) { - _inherits(Clipboard, _Module); - - function Clipboard(quill, options) { - _classCallCheck(this, Clipboard); - - var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this, quill, options)); - - _this.quill.root.addEventListener('paste', _this.onPaste.bind(_this)); - _this.container = _this.quill.addContainer('ql-clipboard'); - _this.container.setAttribute('contenteditable', true); - _this.container.setAttribute('tabindex', -1); - _this.matchers = []; - CLIPBOARD_CONFIG.concat(_this.options.matchers).forEach(function (_ref) { - var _ref2 = _slicedToArray(_ref, 2), - selector = _ref2[0], - matcher = _ref2[1]; - - if (!options.matchVisual && matcher === matchSpacing) return; - _this.addMatcher(selector, matcher); - }); - return _this; - } - - _createClass(Clipboard, [{ - key: 'addMatcher', - value: function addMatcher(selector, matcher) { - this.matchers.push([selector, matcher]); - } - }, { - key: 'convert', - value: function convert(html) { - if (typeof html === 'string') { - this.container.innerHTML = html.replace(/\>\r?\n +\<'); // Remove spaces between tags - - return this.convert(); - } - - var formats = this.quill.getFormat(this.quill.selection.savedRange.index); - if (formats[_code2.default.blotName]) { - var text = this.container.innerText; - this.container.innerHTML = ''; - return new _quillDelta2.default().insert(text, _defineProperty({}, _code2.default.blotName, formats[_code2.default.blotName])); - } - - var _prepareMatching = this.prepareMatching(), - _prepareMatching2 = _slicedToArray(_prepareMatching, 2), - elementMatchers = _prepareMatching2[0], - textMatchers = _prepareMatching2[1]; - - var delta = traverse(this.container, elementMatchers, textMatchers); - // Remove trailing newline - if (deltaEndsWith(delta, '\n') && delta.ops[delta.ops.length - 1].attributes == null) { - delta = delta.compose(new _quillDelta2.default().retain(delta.length() - 1).delete(1)); - } - debug.log('convert', this.container.innerHTML, delta); - this.container.innerHTML = ''; - return delta; - } - }, { - key: 'dangerouslyPasteHTML', - value: function dangerouslyPasteHTML(index, html) { - var source = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _quill2.default.sources.API; - - if (typeof index === 'string') { - this.quill.setContents(this.convert(index), html); - this.quill.setSelection(0, _quill2.default.sources.SILENT); - } else { - var paste = this.convert(html); - this.quill.updateContents(new _quillDelta2.default().retain(index).concat(paste), source); - this.quill.setSelection(index + paste.length(), _quill2.default.sources.SILENT); - } - } - }, { - key: 'onPaste', - value: function onPaste(e) { - var _this2 = this; - - if (e.defaultPrevented || !this.quill.isEnabled()) return; - var range = this.quill.getSelection(); - var delta = new _quillDelta2.default().retain(range.index); - var scrollTop = this.quill.scrollingContainer.scrollTop; - this.container.focus(); - this.quill.selection.update(_quill2.default.sources.SILENT); - setTimeout(function () { - delta = delta.concat(_this2.convert()).delete(range.length); - _this2.quill.updateContents(delta, _quill2.default.sources.USER); - // range.length contributes to delta.length() - _this2.quill.setSelection(delta.length() - range.length, _quill2.default.sources.SILENT); - _this2.quill.scrollingContainer.scrollTop = scrollTop; - _this2.quill.focus(); - }, 1); - } - }, { - key: 'prepareMatching', - value: function prepareMatching() { - var _this3 = this; - - var elementMatchers = [], - textMatchers = []; - this.matchers.forEach(function (pair) { - var _pair = _slicedToArray(pair, 2), - selector = _pair[0], - matcher = _pair[1]; - - switch (selector) { - case Node.TEXT_NODE: - textMatchers.push(matcher); - break; - case Node.ELEMENT_NODE: - elementMatchers.push(matcher); - break; - default: - [].forEach.call(_this3.container.querySelectorAll(selector), function (node) { - // TODO use weakmap - node[DOM_KEY] = node[DOM_KEY] || []; - node[DOM_KEY].push(matcher); - }); - break; - } - }); - return [elementMatchers, textMatchers]; - } - }]); - - return Clipboard; -}(_module2.default); - -Clipboard.DEFAULTS = { - matchers: [], - matchVisual: true -}; - -function applyFormat(delta, format, value) { - if ((typeof format === 'undefined' ? 'undefined' : _typeof(format)) === 'object') { - return Object.keys(format).reduce(function (delta, key) { - return applyFormat(delta, key, format[key]); - }, delta); - } else { - return delta.reduce(function (delta, op) { - if (op.attributes && op.attributes[format]) { - return delta.push(op); - } else { - return delta.insert(op.insert, (0, _extend3.default)({}, _defineProperty({}, format, value), op.attributes)); - } - }, new _quillDelta2.default()); - } -} - -function computeStyle(node) { - if (node.nodeType !== Node.ELEMENT_NODE) return {}; - var DOM_KEY = '__ql-computed-style'; - return node[DOM_KEY] || (node[DOM_KEY] = window.getComputedStyle(node)); -} - -function deltaEndsWith(delta, text) { - var endText = ""; - for (var i = delta.ops.length - 1; i >= 0 && endText.length < text.length; --i) { - var op = delta.ops[i]; - if (typeof op.insert !== 'string') break; - endText = op.insert + endText; - } - return endText.slice(-1 * text.length) === text; -} - -function isLine(node) { - if (node.childNodes.length === 0) return false; // Exclude embed blocks - var style = computeStyle(node); - - // This is a fix. window.getComputedStyle(node) returns a CSSStyleDeclaration - // but all the properties are empty. This causes newline characters to be missed - if (node.nodeName === 'P' || node.nodeName === 'LI' || node.nodeName === 'UL') { - return true; - } - - return ['block', 'list-item'].indexOf(style.display) > -1; -} - -function traverse(node, elementMatchers, textMatchers) { - // Post-order - if (node.nodeType === node.TEXT_NODE) { - return textMatchers.reduce(function (delta, matcher) { - return matcher(node, delta); - }, new _quillDelta2.default()); - } else if (node.nodeType === node.ELEMENT_NODE) { - return [].reduce.call(node.childNodes || [], function (delta, childNode) { - var childrenDelta = traverse(childNode, elementMatchers, textMatchers); - if (childNode.nodeType === node.ELEMENT_NODE) { - childrenDelta = elementMatchers.reduce(function (childrenDelta, matcher) { - return matcher(childNode, childrenDelta); - }, childrenDelta); - childrenDelta = (childNode[DOM_KEY] || []).reduce(function (childrenDelta, matcher) { - return matcher(childNode, childrenDelta); - }, childrenDelta); - } - return delta.concat(childrenDelta); - }, new _quillDelta2.default()); - } else { - return new _quillDelta2.default(); - } -} - -function matchAlias(format, node, delta) { - return applyFormat(delta, format, true); -} - -function matchAttributor(node, delta) { - var attributes = _parchment2.default.Attributor.Attribute.keys(node); - var classes = _parchment2.default.Attributor.Class.keys(node); - var styles = _parchment2.default.Attributor.Style.keys(node); - var formats = {}; - attributes.concat(classes).concat(styles).forEach(function (name) { - var attr = _parchment2.default.query(name, _parchment2.default.Scope.ATTRIBUTE); - if (attr != null) { - formats[attr.attrName] = attr.value(node); - if (formats[attr.attrName]) return; - } - attr = ATTRIBUTE_ATTRIBUTORS[name]; - if (attr != null && (attr.attrName === name || attr.keyName === name)) { - formats[attr.attrName] = attr.value(node) || undefined; - } - attr = STYLE_ATTRIBUTORS[name]; - if (attr != null && (attr.attrName === name || attr.keyName === name)) { - attr = STYLE_ATTRIBUTORS[name]; - formats[attr.attrName] = attr.value(node) || undefined; - } - }); - if (Object.keys(formats).length > 0) { - delta = applyFormat(delta, formats); - } - return delta; -} - -function matchBlot(node, delta) { - var match = _parchment2.default.query(node); - if (match == null) return delta; - if (match.prototype instanceof _parchment2.default.Embed) { - var embed = {}; - var value = match.value(node); - if (value != null) { - embed[match.blotName] = value; - delta = new _quillDelta2.default().insert(embed, match.formats(node)); - } - } else if (typeof match.formats === 'function') { - delta = applyFormat(delta, match.blotName, match.formats(node)); - } - return delta; -} - -function matchBreak(node, delta) { - if (!deltaEndsWith(delta, '\n')) { - delta.insert('\n'); - } - return delta; -} - -function matchIgnore() { - return new _quillDelta2.default(); -} - -function matchIndent(node, delta) { - var match = _parchment2.default.query(node); - if (match == null || match.blotName !== 'list-item' || !deltaEndsWith(delta, '\n')) { - return delta; - } - var indent = -1, - parent = node.parentNode; - while (!parent.classList.contains('ql-clipboard')) { - if ((_parchment2.default.query(parent) || {}).blotName === 'list') { - indent += 1; - } - parent = parent.parentNode; - } - if (indent <= 0) return delta; - return delta.compose(new _quillDelta2.default().retain(delta.length() - 1).retain(1, { indent: indent })); -} - -function matchNewline(node, delta) { - if (!deltaEndsWith(delta, '\n')) { - if (isLine(node) || (delta.length() > 0 && node.nextSibling && isLine(node.nextSibling))) { - delta.insert('\n'); - } - } - return delta; -} - -function matchSpacing(node, delta) { - if (isLine(node) && node.nextElementSibling != null && !deltaEndsWith(delta, '\n\n')) { - var nodeHeight = node.offsetHeight + parseFloat(computeStyle(node).marginTop) + parseFloat(computeStyle(node).marginBottom); - if (node.nextElementSibling.offsetTop > node.offsetTop + nodeHeight * 1.5) { - delta.insert('\n'); - } - } - return delta; -} - -function matchStyles(node, delta) { - var formats = {}; - var style = node.style || {}; - if (style.fontStyle && computeStyle(node).fontStyle === 'italic') { - formats.italic = true; - } - if (style.fontWeight && (computeStyle(node).fontWeight.startsWith('bold') || parseInt(computeStyle(node).fontWeight) >= 700)) { - formats.bold = true; - } - if (Object.keys(formats).length > 0) { - delta = applyFormat(delta, formats); - } - if (parseFloat(style.textIndent || 0) > 0) { - // Could be 0.5in - delta = new _quillDelta2.default().insert('\t').concat(delta); - } - return delta; -} - -function matchText(node, delta) { - var text = node.data; - // Word represents empty line with   - if (node.parentNode.tagName === 'O:P') { - return delta.insert(text.trim()); - } - if (text.trim().length === 0 && node.parentNode.classList.contains('ql-clipboard')) { - return delta; - } - if (!computeStyle(node.parentNode).whiteSpace.startsWith('pre')) { - // eslint-disable-next-line func-style - var replacer = function replacer(collapse, match) { - match = match.replace(/[^\u00a0]/g, ''); // \u00a0 is nbsp; - return match.length < 1 && collapse ? ' ' : match; - }; - text = text.replace(/\r\n/g, ' ').replace(/\n/g, ' '); - text = text.replace(/\s\s+/g, replacer.bind(replacer, true)); // collapse whitespace - if (node.previousSibling == null && isLine(node.parentNode) || node.previousSibling != null && isLine(node.previousSibling)) { - text = text.replace(/^\s+/, replacer.bind(replacer, false)); - } - if (node.nextSibling == null && isLine(node.parentNode) || node.nextSibling != null && isLine(node.nextSibling)) { - text = text.replace(/\s+$/, replacer.bind(replacer, false)); - } - } - return delta.insert(text); -} - -exports.default = Clipboard; -exports.matchAttributor = matchAttributor; -exports.matchBlot = matchBlot; -exports.matchNewline = matchNewline; -exports.matchSpacing = matchSpacing; -exports.matchText = matchText; - -/***/ }), -/* 56 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _inline = __webpack_require__(6); - -var _inline2 = _interopRequireDefault(_inline); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Bold = function (_Inline) { - _inherits(Bold, _Inline); - - function Bold() { - _classCallCheck(this, Bold); - - return _possibleConstructorReturn(this, (Bold.__proto__ || Object.getPrototypeOf(Bold)).apply(this, arguments)); - } - - _createClass(Bold, [{ - key: 'optimize', - value: function optimize(context) { - _get(Bold.prototype.__proto__ || Object.getPrototypeOf(Bold.prototype), 'optimize', this).call(this, context); - if (this.domNode.tagName !== this.statics.tagName[0]) { - this.replaceWith(this.statics.blotName); - } - } - }], [{ - key: 'create', - value: function create() { - return _get(Bold.__proto__ || Object.getPrototypeOf(Bold), 'create', this).call(this); - } - }, { - key: 'formats', - value: function formats() { - return true; - } - }]); - - return Bold; -}(_inline2.default); - -Bold.blotName = 'bold'; -Bold.tagName = ['STRONG', 'B']; - -exports.default = Bold; - -/***/ }), -/* 57 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.addControls = exports.default = undefined; - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _quillDelta = __webpack_require__(2); - -var _quillDelta2 = _interopRequireDefault(_quillDelta); - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _quill = __webpack_require__(5); - -var _quill2 = _interopRequireDefault(_quill); - -var _logger = __webpack_require__(10); - -var _logger2 = _interopRequireDefault(_logger); - -var _module = __webpack_require__(9); - -var _module2 = _interopRequireDefault(_module); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var debug = (0, _logger2.default)('quill:toolbar'); - -var Toolbar = function (_Module) { - _inherits(Toolbar, _Module); - - function Toolbar(quill, options) { - _classCallCheck(this, Toolbar); - - var _this = _possibleConstructorReturn(this, (Toolbar.__proto__ || Object.getPrototypeOf(Toolbar)).call(this, quill, options)); - - if (Array.isArray(_this.options.container)) { - var container = document.createElement('div'); - addControls(container, _this.options.container); - quill.container.parentNode.insertBefore(container, quill.container); - _this.container = container; - } else if (typeof _this.options.container === 'string') { - _this.container = document.querySelector(_this.options.container); - } else { - _this.container = _this.options.container; - } - if (!(_this.container instanceof HTMLElement)) { - var _ret; - - return _ret = debug.error('Container required for toolbar', _this.options), _possibleConstructorReturn(_this, _ret); - } - _this.container.classList.add('ql-toolbar'); - _this.controls = []; - _this.handlers = {}; - Object.keys(_this.options.handlers).forEach(function (format) { - _this.addHandler(format, _this.options.handlers[format]); - }); - [].forEach.call(_this.container.querySelectorAll('button, select'), function (input) { - _this.attach(input); - }); - _this.quill.on(_quill2.default.events.EDITOR_CHANGE, function (type, range) { - if (type === _quill2.default.events.SELECTION_CHANGE) { - _this.update(range); - } - }); - _this.quill.on(_quill2.default.events.SCROLL_OPTIMIZE, function () { - var _this$quill$selection = _this.quill.selection.getRange(), - _this$quill$selection2 = _slicedToArray(_this$quill$selection, 1), - range = _this$quill$selection2[0]; // quill.getSelection triggers update - - - _this.update(range); - }); - return _this; - } - - _createClass(Toolbar, [{ - key: 'addHandler', - value: function addHandler(format, handler) { - this.handlers[format] = handler; - } - }, { - key: 'attach', - value: function attach(input) { - var _this2 = this; - - var format = [].find.call(input.classList, function (className) { - return className.indexOf('ql-') === 0; - }); - if (!format) return; - format = format.slice('ql-'.length); - if (input.tagName === 'BUTTON') { - input.setAttribute('type', 'button'); - } - if (this.handlers[format] == null) { - if (this.quill.scroll.whitelist != null && this.quill.scroll.whitelist[format] == null) { - debug.warn('ignoring attaching to disabled format', format, input); - return; - } - if (_parchment2.default.query(format) == null) { - debug.warn('ignoring attaching to nonexistent format', format, input); - return; - } - } - var eventName = input.tagName === 'SELECT' ? 'change' : 'click'; - input.addEventListener(eventName, function (e) { - var value = void 0; - if (input.tagName === 'SELECT') { - if (input.selectedIndex < 0) return; - var selected = input.options[input.selectedIndex]; - if (selected.hasAttribute('selected')) { - value = false; - } else { - value = selected.value || false; - } - } else { - if (input.classList.contains('ql-active')) { - value = false; - } else { - value = input.value || !input.hasAttribute('value'); - } - e.preventDefault(); - } - _this2.quill.focus(); - - var _quill$selection$getR = _this2.quill.selection.getRange(), - _quill$selection$getR2 = _slicedToArray(_quill$selection$getR, 1), - range = _quill$selection$getR2[0]; - - if (_this2.handlers[format] != null) { - _this2.handlers[format].call(_this2, value); - } else if (_parchment2.default.query(format).prototype instanceof _parchment2.default.Embed) { - value = prompt('Enter ' + format); - if (!value) return; - _this2.quill.updateContents(new _quillDelta2.default().retain(range.index).delete(range.length).insert(_defineProperty({}, format, value)), _quill2.default.sources.USER); - } else { - _this2.quill.format(format, value, _quill2.default.sources.USER); - } - _this2.update(range); - }); - // TODO use weakmap - this.controls.push([format, input]); - } - }, { - key: 'update', - value: function update(range) { - var formats = range == null ? {} : this.quill.getFormat(range); - this.controls.forEach(function (pair) { - var _pair = _slicedToArray(pair, 2), - format = _pair[0], - input = _pair[1]; - - if (input.tagName === 'SELECT') { - var option = void 0; - if (range == null) { - option = null; - } else if (formats[format] == null) { - option = input.querySelector('option[selected]'); - } else if (!Array.isArray(formats[format])) { - var value = formats[format]; - if (typeof value === 'string') { - value = value.replace(/\"/g, '\\"'); - } - option = input.querySelector('option[value="' + value + '"]'); - } - if (option == null) { - input.value = ''; // TODO make configurable? - input.selectedIndex = -1; - } else { - option.selected = true; - } - } else { - if (range == null) { - input.classList.remove('ql-active'); - } else if (input.hasAttribute('value')) { - // both being null should match (default values) - // '1' should match with 1 (headers) - var isActive = formats[format] === input.getAttribute('value') || formats[format] != null && formats[format].toString() === input.getAttribute('value') || formats[format] == null && !input.getAttribute('value'); - input.classList.toggle('ql-active', isActive); - } else { - input.classList.toggle('ql-active', formats[format] != null); - } - } - }); - } - }]); - - return Toolbar; -}(_module2.default); - -Toolbar.DEFAULTS = {}; - -function addButton(container, format, value) { - var input = document.createElement('button'); - input.setAttribute('type', 'button'); - input.classList.add('ql-' + format); - if (value != null) { - input.value = value; - } - container.appendChild(input); -} - -function addControls(container, groups) { - if (!Array.isArray(groups[0])) { - groups = [groups]; - } - groups.forEach(function (controls) { - var group = document.createElement('span'); - group.classList.add('ql-formats'); - controls.forEach(function (control) { - if (typeof control === 'string') { - addButton(group, control); - } else { - var format = Object.keys(control)[0]; - var value = control[format]; - if (Array.isArray(value)) { - addSelect(group, format, value); - } else { - addButton(group, format, value); - } - } - }); - container.appendChild(group); - }); -} - -function addSelect(container, format, values) { - var input = document.createElement('select'); - input.classList.add('ql-' + format); - values.forEach(function (value) { - var option = document.createElement('option'); - if (value !== false) { - option.setAttribute('value', value); - } else { - option.setAttribute('selected', 'selected'); - } - input.appendChild(option); - }); - container.appendChild(input); -} - -Toolbar.DEFAULTS = { - container: null, - handlers: { - clean: function clean() { - var _this3 = this; - - var range = this.quill.getSelection(); - if (range == null) return; - if (range.length == 0) { - var formats = this.quill.getFormat(); - Object.keys(formats).forEach(function (name) { - // Clean functionality in existing apps only clean inline formats - if (_parchment2.default.query(name, _parchment2.default.Scope.INLINE) != null) { - _this3.quill.format(name, false); - } - }); - } else { - this.quill.removeFormat(range, _quill2.default.sources.USER); - } - }, - direction: function direction(value) { - var align = this.quill.getFormat()['align']; - if (value === 'rtl' && align == null) { - this.quill.format('align', 'right', _quill2.default.sources.USER); - } else if (!value && align === 'right') { - this.quill.format('align', false, _quill2.default.sources.USER); - } - this.quill.format('direction', value, _quill2.default.sources.USER); - }, - indent: function indent(value) { - var range = this.quill.getSelection(); - var formats = this.quill.getFormat(range); - var indent = parseInt(formats.indent || 0); - if (value === '+1' || value === '-1') { - var modifier = value === '+1' ? 1 : -1; - if (formats.direction === 'rtl') modifier *= -1; - this.quill.format('indent', indent + modifier, _quill2.default.sources.USER); - } - }, - link: function link(value) { - if (value === true) { - value = prompt('Enter link URL:'); - } - this.quill.format('link', value, _quill2.default.sources.USER); - }, - list: function list(value) { - var range = this.quill.getSelection(); - var formats = this.quill.getFormat(range); - if (value === 'check') { - if (formats['list'] === 'checked' || formats['list'] === 'unchecked') { - this.quill.format('list', false, _quill2.default.sources.USER); - } else { - this.quill.format('list', 'unchecked', _quill2.default.sources.USER); - } - } else { - this.quill.format('list', value, _quill2.default.sources.USER); - } - } - } -}; - -exports.default = Toolbar; -exports.addControls = addControls; - -/***/ }), -/* 58 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 59 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _picker = __webpack_require__(28); - -var _picker2 = _interopRequireDefault(_picker); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ColorPicker = function (_Picker) { - _inherits(ColorPicker, _Picker); - - function ColorPicker(select, label) { - _classCallCheck(this, ColorPicker); - - var _this = _possibleConstructorReturn(this, (ColorPicker.__proto__ || Object.getPrototypeOf(ColorPicker)).call(this, select)); - - _this.label.innerHTML = label; - _this.container.classList.add('ql-color-picker'); - [].slice.call(_this.container.querySelectorAll('.ql-picker-item'), 0, 7).forEach(function (item) { - item.classList.add('ql-primary'); - }); - return _this; - } - - _createClass(ColorPicker, [{ - key: 'buildItem', - value: function buildItem(option) { - var item = _get(ColorPicker.prototype.__proto__ || Object.getPrototypeOf(ColorPicker.prototype), 'buildItem', this).call(this, option); - item.style.backgroundColor = option.getAttribute('value') || ''; - return item; - } - }, { - key: 'selectItem', - value: function selectItem(item, trigger) { - _get(ColorPicker.prototype.__proto__ || Object.getPrototypeOf(ColorPicker.prototype), 'selectItem', this).call(this, item, trigger); - var colorLabel = this.label.querySelector('.ql-color-label'); - var value = item ? item.getAttribute('data-value') || '' : ''; - if (colorLabel) { - if (colorLabel.tagName === 'line') { - colorLabel.style.stroke = value; - } else { - colorLabel.style.fill = value; - } - } - } - }]); - - return ColorPicker; -}(_picker2.default); - -exports.default = ColorPicker; - -/***/ }), -/* 60 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _picker = __webpack_require__(28); - -var _picker2 = _interopRequireDefault(_picker); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var IconPicker = function (_Picker) { - _inherits(IconPicker, _Picker); - - function IconPicker(select, icons) { - _classCallCheck(this, IconPicker); - - var _this = _possibleConstructorReturn(this, (IconPicker.__proto__ || Object.getPrototypeOf(IconPicker)).call(this, select)); - - _this.container.classList.add('ql-icon-picker'); - [].forEach.call(_this.container.querySelectorAll('.ql-picker-item'), function (item) { - item.innerHTML = icons[item.getAttribute('data-value') || '']; - }); - _this.defaultItem = _this.container.querySelector('.ql-selected'); - _this.selectItem(_this.defaultItem); - return _this; - } - - _createClass(IconPicker, [{ - key: 'selectItem', - value: function selectItem(item, trigger) { - _get(IconPicker.prototype.__proto__ || Object.getPrototypeOf(IconPicker.prototype), 'selectItem', this).call(this, item, trigger); - item = item || this.defaultItem; - this.label.innerHTML = item.innerHTML; - } - }]); - - return IconPicker; -}(_picker2.default); - -exports.default = IconPicker; - -/***/ }), -/* 61 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Tooltip = function () { - function Tooltip(quill, boundsContainer) { - var _this = this; - - _classCallCheck(this, Tooltip); - - this.quill = quill; - this.boundsContainer = boundsContainer || document.body; - this.root = quill.addContainer('ql-tooltip'); - this.root.innerHTML = this.constructor.TEMPLATE; - if (this.quill.root === this.quill.scrollingContainer) { - this.quill.root.addEventListener('scroll', function () { - _this.root.style.marginTop = -1 * _this.quill.root.scrollTop + 'px'; - }); - } - this.hide(); - } - - _createClass(Tooltip, [{ - key: 'hide', - value: function hide() { - this.root.classList.add('ql-hidden'); - } - }, { - key: 'position', - value: function position(reference) { - var left = reference.left + reference.width / 2 - this.root.offsetWidth / 2; - // root.scrollTop should be 0 if scrollContainer !== root - var top = reference.bottom + this.quill.root.scrollTop; - this.root.style.left = left + 'px'; - this.root.style.top = top + 'px'; - this.root.classList.remove('ql-flip'); - var containerBounds = this.boundsContainer.getBoundingClientRect(); - var rootBounds = this.root.getBoundingClientRect(); - var shift = 0; - if (rootBounds.right > containerBounds.right) { - shift = containerBounds.right - rootBounds.right; - this.root.style.left = left + shift + 'px'; - } - if (rootBounds.left < containerBounds.left) { - shift = containerBounds.left - rootBounds.left; - this.root.style.left = left + shift + 'px'; - } - if (rootBounds.bottom > containerBounds.bottom) { - var height = rootBounds.bottom - rootBounds.top; - var verticalShift = reference.bottom - reference.top + height; - this.root.style.top = top - verticalShift + 'px'; - this.root.classList.add('ql-flip'); - } - return shift; - } - }, { - key: 'show', - value: function show() { - this.root.classList.remove('ql-editing'); - this.root.classList.remove('ql-hidden'); - } - }]); - - return Tooltip; -}(); - -exports.default = Tooltip; - -/***/ }), -/* 62 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _extend = __webpack_require__(3); - -var _extend2 = _interopRequireDefault(_extend); - -var _emitter = __webpack_require__(8); - -var _emitter2 = _interopRequireDefault(_emitter); - -var _base = __webpack_require__(43); - -var _base2 = _interopRequireDefault(_base); - -var _link = __webpack_require__(27); - -var _link2 = _interopRequireDefault(_link); - -var _selection = __webpack_require__(15); - -var _icons = __webpack_require__(41); - -var _icons2 = _interopRequireDefault(_icons); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var TOOLBAR_CONFIG = [[{ header: ['1', '2', '3', false] }], ['bold', 'italic', 'underline', 'link'], [{ list: 'ordered' }, { list: 'bullet' }], ['clean']]; - -var SnowTheme = function (_BaseTheme) { - _inherits(SnowTheme, _BaseTheme); - - function SnowTheme(quill, options) { - _classCallCheck(this, SnowTheme); - - if (options.modules.toolbar != null && options.modules.toolbar.container == null) { - options.modules.toolbar.container = TOOLBAR_CONFIG; - } - - var _this = _possibleConstructorReturn(this, (SnowTheme.__proto__ || Object.getPrototypeOf(SnowTheme)).call(this, quill, options)); - - _this.quill.container.classList.add('ql-snow'); - return _this; - } - - _createClass(SnowTheme, [{ - key: 'extendToolbar', - value: function extendToolbar(toolbar) { - toolbar.container.classList.add('ql-snow'); - this.buildButtons([].slice.call(toolbar.container.querySelectorAll('button')), _icons2.default); - this.buildPickers([].slice.call(toolbar.container.querySelectorAll('select')), _icons2.default); - this.tooltip = new SnowTooltip(this.quill, this.options.bounds); - if (toolbar.container.querySelector('.ql-link')) { - this.quill.keyboard.addBinding({ key: 'K', shortKey: true }, function (range, context) { - toolbar.handlers['link'].call(toolbar, !context.format.link); - }); - } - } - }]); - - return SnowTheme; -}(_base2.default); - -SnowTheme.DEFAULTS = (0, _extend2.default)(true, {}, _base2.default.DEFAULTS, { - modules: { - toolbar: { - handlers: { - link: function link(value) { - if (value) { - var range = this.quill.getSelection(); - if (range == null || range.length == 0) return; - var preview = this.quill.getText(range); - if (/^\S+@\S+\.\S+$/.test(preview) && preview.indexOf('mailto:') !== 0) { - preview = 'mailto:' + preview; - } - var tooltip = this.quill.theme.tooltip; - tooltip.edit('link', preview); - } else { - this.quill.format('link', false); - } - } - } - } - } -}); - -var SnowTooltip = function (_BaseTooltip) { - _inherits(SnowTooltip, _BaseTooltip); - - function SnowTooltip(quill, bounds) { - _classCallCheck(this, SnowTooltip); - - var _this2 = _possibleConstructorReturn(this, (SnowTooltip.__proto__ || Object.getPrototypeOf(SnowTooltip)).call(this, quill, bounds)); - - _this2.preview = _this2.root.querySelector('a'); - return _this2; - } - - _createClass(SnowTooltip, [{ - key: 'listen', - value: function listen() { - var _this3 = this; - - _get(SnowTooltip.prototype.__proto__ || Object.getPrototypeOf(SnowTooltip.prototype), 'listen', this).call(this); - this.root.querySelector('a.ql-action').addEventListener('click', function (event) { - if (_this3.root.classList.contains('ql-editing')) { - _this3.save(); - } else { - _this3.edit('link', _this3.preview.textContent); - } - event.preventDefault(); - }); - this.root.querySelector('a.ql-remove').addEventListener('click', function (event) { - if (_this3.linkRange != null) { - var range = _this3.linkRange; - _this3.restoreFocus(); - _this3.quill.formatText(range, 'link', false, _emitter2.default.sources.USER); - delete _this3.linkRange; - } - event.preventDefault(); - _this3.hide(); - }); - this.quill.on(_emitter2.default.events.SELECTION_CHANGE, function (range, oldRange, source) { - if (range == null) return; - if (range.length === 0 && source === _emitter2.default.sources.USER) { - var _quill$scroll$descend = _this3.quill.scroll.descendant(_link2.default, range.index), - _quill$scroll$descend2 = _slicedToArray(_quill$scroll$descend, 2), - link = _quill$scroll$descend2[0], - offset = _quill$scroll$descend2[1]; - - if (link != null) { - _this3.linkRange = new _selection.Range(range.index - offset, link.length()); - var preview = _link2.default.formats(link.domNode); - _this3.preview.textContent = preview; - _this3.preview.setAttribute('href', preview); - _this3.show(); - _this3.position(_this3.quill.getBounds(_this3.linkRange)); - return; - } - } else { - delete _this3.linkRange; - } - _this3.hide(); - }); - } - }, { - key: 'show', - value: function show() { - _get(SnowTooltip.prototype.__proto__ || Object.getPrototypeOf(SnowTooltip.prototype), 'show', this).call(this); - this.root.removeAttribute('data-mode'); - } - }]); - - return SnowTooltip; -}(_base.BaseTooltip); - -SnowTooltip.TEMPLATE = ['
', '', '', ''].join(''); - -exports.default = SnowTheme; - -/***/ }), -/* 63 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _core = __webpack_require__(29); - -var _core2 = _interopRequireDefault(_core); - -var _align = __webpack_require__(36); - -var _direction = __webpack_require__(38); - -var _indent = __webpack_require__(64); - -var _blockquote = __webpack_require__(65); - -var _blockquote2 = _interopRequireDefault(_blockquote); - -var _header = __webpack_require__(66); - -var _header2 = _interopRequireDefault(_header); - -var _list = __webpack_require__(67); - -var _list2 = _interopRequireDefault(_list); - -var _background = __webpack_require__(37); - -var _color = __webpack_require__(26); - -var _font = __webpack_require__(39); - -var _size = __webpack_require__(40); - -var _bold = __webpack_require__(56); - -var _bold2 = _interopRequireDefault(_bold); - -var _italic = __webpack_require__(68); - -var _italic2 = _interopRequireDefault(_italic); - -var _link = __webpack_require__(27); - -var _link2 = _interopRequireDefault(_link); - -var _script = __webpack_require__(69); - -var _script2 = _interopRequireDefault(_script); - -var _strike = __webpack_require__(70); - -var _strike2 = _interopRequireDefault(_strike); - -var _underline = __webpack_require__(71); - -var _underline2 = _interopRequireDefault(_underline); - -var _image = __webpack_require__(72); - -var _image2 = _interopRequireDefault(_image); - -var _video = __webpack_require__(73); - -var _video2 = _interopRequireDefault(_video); - -var _code = __webpack_require__(13); - -var _code2 = _interopRequireDefault(_code); - -var _formula = __webpack_require__(74); - -var _formula2 = _interopRequireDefault(_formula); - -var _syntax = __webpack_require__(75); - -var _syntax2 = _interopRequireDefault(_syntax); - -var _toolbar = __webpack_require__(57); - -var _toolbar2 = _interopRequireDefault(_toolbar); - -var _icons = __webpack_require__(41); - -var _icons2 = _interopRequireDefault(_icons); - -var _picker = __webpack_require__(28); - -var _picker2 = _interopRequireDefault(_picker); - -var _colorPicker = __webpack_require__(59); - -var _colorPicker2 = _interopRequireDefault(_colorPicker); - -var _iconPicker = __webpack_require__(60); - -var _iconPicker2 = _interopRequireDefault(_iconPicker); - -var _tooltip = __webpack_require__(61); - -var _tooltip2 = _interopRequireDefault(_tooltip); - -var _bubble = __webpack_require__(108); - -var _bubble2 = _interopRequireDefault(_bubble); - -var _snow = __webpack_require__(62); - -var _snow2 = _interopRequireDefault(_snow); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -_core2.default.register({ - 'attributors/attribute/direction': _direction.DirectionAttribute, - - 'attributors/class/align': _align.AlignClass, - 'attributors/class/background': _background.BackgroundClass, - 'attributors/class/color': _color.ColorClass, - 'attributors/class/direction': _direction.DirectionClass, - 'attributors/class/font': _font.FontClass, - 'attributors/class/size': _size.SizeClass, - - 'attributors/style/align': _align.AlignStyle, - 'attributors/style/background': _background.BackgroundStyle, - 'attributors/style/color': _color.ColorStyle, - 'attributors/style/direction': _direction.DirectionStyle, - 'attributors/style/font': _font.FontStyle, - 'attributors/style/size': _size.SizeStyle -}, true); - -_core2.default.register({ - 'formats/align': _align.AlignClass, - 'formats/direction': _direction.DirectionClass, - 'formats/indent': _indent.IndentClass, - - 'formats/background': _background.BackgroundStyle, - 'formats/color': _color.ColorStyle, - 'formats/font': _font.FontClass, - 'formats/size': _size.SizeClass, - - 'formats/blockquote': _blockquote2.default, - 'formats/code-block': _code2.default, - 'formats/header': _header2.default, - 'formats/list': _list2.default, - - 'formats/bold': _bold2.default, - 'formats/code': _code.Code, - 'formats/italic': _italic2.default, - 'formats/link': _link2.default, - 'formats/script': _script2.default, - 'formats/strike': _strike2.default, - 'formats/underline': _underline2.default, - - 'formats/image': _image2.default, - 'formats/video': _video2.default, - - 'formats/list/item': _list.ListItem, - - 'modules/formula': _formula2.default, - 'modules/syntax': _syntax2.default, - 'modules/toolbar': _toolbar2.default, - - 'themes/bubble': _bubble2.default, - 'themes/snow': _snow2.default, - - 'ui/icons': _icons2.default, - 'ui/picker': _picker2.default, - 'ui/icon-picker': _iconPicker2.default, - 'ui/color-picker': _colorPicker2.default, - 'ui/tooltip': _tooltip2.default -}, true); - -exports.default = _core2.default; - -/***/ }), -/* 64 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.IndentClass = undefined; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var IdentAttributor = function (_Parchment$Attributor) { - _inherits(IdentAttributor, _Parchment$Attributor); - - function IdentAttributor() { - _classCallCheck(this, IdentAttributor); - - return _possibleConstructorReturn(this, (IdentAttributor.__proto__ || Object.getPrototypeOf(IdentAttributor)).apply(this, arguments)); - } - - _createClass(IdentAttributor, [{ - key: 'add', - value: function add(node, value) { - if (value === '+1' || value === '-1') { - var indent = this.value(node) || 0; - value = value === '+1' ? indent + 1 : indent - 1; - } - if (value === 0) { - this.remove(node); - return true; - } else { - return _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'add', this).call(this, node, value); - } - } - }, { - key: 'canAdd', - value: function canAdd(node, value) { - return _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'canAdd', this).call(this, node, value) || _get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'canAdd', this).call(this, node, parseInt(value)); - } - }, { - key: 'value', - value: function value(node) { - return parseInt(_get(IdentAttributor.prototype.__proto__ || Object.getPrototypeOf(IdentAttributor.prototype), 'value', this).call(this, node)) || undefined; // Don't return NaN - } - }]); - - return IdentAttributor; -}(_parchment2.default.Attributor.Class); - -var IndentClass = new IdentAttributor('indent', 'ql-indent', { - scope: _parchment2.default.Scope.BLOCK, - whitelist: [1, 2, 3, 4, 5, 6, 7, 8] -}); - -exports.IndentClass = IndentClass; - -/***/ }), -/* 65 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _block = __webpack_require__(4); - -var _block2 = _interopRequireDefault(_block); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Blockquote = function (_Block) { - _inherits(Blockquote, _Block); - - function Blockquote() { - _classCallCheck(this, Blockquote); - - return _possibleConstructorReturn(this, (Blockquote.__proto__ || Object.getPrototypeOf(Blockquote)).apply(this, arguments)); - } - - return Blockquote; -}(_block2.default); - -Blockquote.blotName = 'blockquote'; -Blockquote.tagName = 'blockquote'; - -exports.default = Blockquote; - -/***/ }), -/* 66 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _block = __webpack_require__(4); - -var _block2 = _interopRequireDefault(_block); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Header = function (_Block) { - _inherits(Header, _Block); - - function Header() { - _classCallCheck(this, Header); - - return _possibleConstructorReturn(this, (Header.__proto__ || Object.getPrototypeOf(Header)).apply(this, arguments)); - } - - _createClass(Header, null, [{ - key: 'formats', - value: function formats(domNode) { - return this.tagName.indexOf(domNode.tagName) + 1; - } - }]); - - return Header; -}(_block2.default); - -Header.blotName = 'header'; -Header.tagName = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6']; - -exports.default = Header; - -/***/ }), -/* 67 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = exports.ListItem = undefined; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _block = __webpack_require__(4); - -var _block2 = _interopRequireDefault(_block); - -var _container = __webpack_require__(25); - -var _container2 = _interopRequireDefault(_container); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ListItem = function (_Block) { - _inherits(ListItem, _Block); - - function ListItem() { - _classCallCheck(this, ListItem); - - return _possibleConstructorReturn(this, (ListItem.__proto__ || Object.getPrototypeOf(ListItem)).apply(this, arguments)); - } - - _createClass(ListItem, [{ - key: 'format', - value: function format(name, value) { - if (name === List.blotName && !value) { - this.replaceWith(_parchment2.default.create(this.statics.scope)); - } else { - _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'format', this).call(this, name, value); - } - } - }, { - key: 'remove', - value: function remove() { - if (this.prev == null && this.next == null) { - this.parent.remove(); - } else { - _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'remove', this).call(this); - } - } - }, { - key: 'replaceWith', - value: function replaceWith(name, value) { - this.parent.isolate(this.offset(this.parent), this.length()); - if (name === this.parent.statics.blotName) { - this.parent.replaceWith(name, value); - return this; - } else { - this.parent.unwrap(); - return _get(ListItem.prototype.__proto__ || Object.getPrototypeOf(ListItem.prototype), 'replaceWith', this).call(this, name, value); - } - } - }], [{ - key: 'formats', - value: function formats(domNode) { - return domNode.tagName === this.tagName ? undefined : _get(ListItem.__proto__ || Object.getPrototypeOf(ListItem), 'formats', this).call(this, domNode); - } - }]); - - return ListItem; -}(_block2.default); - -ListItem.blotName = 'list-item'; -ListItem.tagName = 'LI'; - -var List = function (_Container) { - _inherits(List, _Container); - - _createClass(List, null, [{ - key: 'create', - value: function create(value) { - var tagName = value === 'ordered' ? 'OL' : 'UL'; - var node = _get(List.__proto__ || Object.getPrototypeOf(List), 'create', this).call(this, tagName); - if (value === 'checked' || value === 'unchecked') { - node.setAttribute('data-checked', value === 'checked'); - } - return node; - } - }, { - key: 'formats', - value: function formats(domNode) { - if (domNode.tagName === 'OL') return 'ordered'; - if (domNode.tagName === 'UL') { - if (domNode.hasAttribute('data-checked')) { - return domNode.getAttribute('data-checked') === 'true' ? 'checked' : 'unchecked'; - } else { - return 'bullet'; - } - } - return undefined; - } - }]); - - function List(domNode) { - _classCallCheck(this, List); - - var _this2 = _possibleConstructorReturn(this, (List.__proto__ || Object.getPrototypeOf(List)).call(this, domNode)); - - var listEventHandler = function listEventHandler(e) { - if (e.target.parentNode !== domNode) return; - var format = _this2.statics.formats(domNode); - var blot = _parchment2.default.find(e.target); - if (format === 'checked') { - blot.format('list', 'unchecked'); - } else if (format === 'unchecked') { - blot.format('list', 'checked'); - } - }; - - domNode.addEventListener('touchstart', listEventHandler); - domNode.addEventListener('mousedown', listEventHandler); - return _this2; - } - - _createClass(List, [{ - key: 'format', - value: function format(name, value) { - if (this.children.length > 0) { - this.children.tail.format(name, value); - } - } - }, { - key: 'formats', - value: function formats() { - // We don't inherit from FormatBlot - return _defineProperty({}, this.statics.blotName, this.statics.formats(this.domNode)); - } - }, { - key: 'insertBefore', - value: function insertBefore(blot, ref) { - if (blot instanceof ListItem) { - _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'insertBefore', this).call(this, blot, ref); - } else { - var index = ref == null ? this.length() : ref.offset(this); - var after = this.split(index); - after.parent.insertBefore(blot, after); - } - } - }, { - key: 'optimize', - value: function optimize(context) { - _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'optimize', this).call(this, context); - var next = this.next; - if (next != null && next.prev === this && next.statics.blotName === this.statics.blotName && next.domNode.tagName === this.domNode.tagName && next.domNode.getAttribute('data-checked') === this.domNode.getAttribute('data-checked')) { - next.moveChildren(this); - next.remove(); - } - } - }, { - key: 'replace', - value: function replace(target) { - if (target.statics.blotName !== this.statics.blotName) { - var item = _parchment2.default.create(this.statics.defaultChild); - target.moveChildren(item); - this.appendChild(item); - } - _get(List.prototype.__proto__ || Object.getPrototypeOf(List.prototype), 'replace', this).call(this, target); - } - }]); - - return List; -}(_container2.default); - -List.blotName = 'list'; -List.scope = _parchment2.default.Scope.BLOCK_BLOT; -List.tagName = ['OL', 'UL']; -List.defaultChild = 'list-item'; -List.allowedChildren = [ListItem]; - -exports.ListItem = ListItem; -exports.default = List; - -/***/ }), -/* 68 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _bold = __webpack_require__(56); - -var _bold2 = _interopRequireDefault(_bold); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Italic = function (_Bold) { - _inherits(Italic, _Bold); - - function Italic() { - _classCallCheck(this, Italic); - - return _possibleConstructorReturn(this, (Italic.__proto__ || Object.getPrototypeOf(Italic)).apply(this, arguments)); - } - - return Italic; -}(_bold2.default); - -Italic.blotName = 'italic'; -Italic.tagName = ['EM', 'I']; - -exports.default = Italic; - -/***/ }), -/* 69 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _inline = __webpack_require__(6); - -var _inline2 = _interopRequireDefault(_inline); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Script = function (_Inline) { - _inherits(Script, _Inline); - - function Script() { - _classCallCheck(this, Script); - - return _possibleConstructorReturn(this, (Script.__proto__ || Object.getPrototypeOf(Script)).apply(this, arguments)); - } - - _createClass(Script, null, [{ - key: 'create', - value: function create(value) { - if (value === 'super') { - return document.createElement('sup'); - } else if (value === 'sub') { - return document.createElement('sub'); - } else { - return _get(Script.__proto__ || Object.getPrototypeOf(Script), 'create', this).call(this, value); - } - } - }, { - key: 'formats', - value: function formats(domNode) { - if (domNode.tagName === 'SUB') return 'sub'; - if (domNode.tagName === 'SUP') return 'super'; - return undefined; - } - }]); - - return Script; -}(_inline2.default); - -Script.blotName = 'script'; -Script.tagName = ['SUB', 'SUP']; - -exports.default = Script; - -/***/ }), -/* 70 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _inline = __webpack_require__(6); - -var _inline2 = _interopRequireDefault(_inline); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Strike = function (_Inline) { - _inherits(Strike, _Inline); - - function Strike() { - _classCallCheck(this, Strike); - - return _possibleConstructorReturn(this, (Strike.__proto__ || Object.getPrototypeOf(Strike)).apply(this, arguments)); - } - - return Strike; -}(_inline2.default); - -Strike.blotName = 'strike'; -Strike.tagName = 'S'; - -exports.default = Strike; - -/***/ }), -/* 71 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _inline = __webpack_require__(6); - -var _inline2 = _interopRequireDefault(_inline); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var Underline = function (_Inline) { - _inherits(Underline, _Inline); - - function Underline() { - _classCallCheck(this, Underline); - - return _possibleConstructorReturn(this, (Underline.__proto__ || Object.getPrototypeOf(Underline)).apply(this, arguments)); - } - - return Underline; -}(_inline2.default); - -Underline.blotName = 'underline'; -Underline.tagName = 'U'; - -exports.default = Underline; - -/***/ }), -/* 72 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _link = __webpack_require__(27); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ATTRIBUTES = ['alt', 'height', 'width']; - -var Image = function (_Parchment$Embed) { - _inherits(Image, _Parchment$Embed); - - function Image() { - _classCallCheck(this, Image); - - return _possibleConstructorReturn(this, (Image.__proto__ || Object.getPrototypeOf(Image)).apply(this, arguments)); - } - - _createClass(Image, [{ - key: 'format', - value: function format(name, value) { - if (ATTRIBUTES.indexOf(name) > -1) { - if (value) { - this.domNode.setAttribute(name, value); - } else { - this.domNode.removeAttribute(name); - } - } else { - _get(Image.prototype.__proto__ || Object.getPrototypeOf(Image.prototype), 'format', this).call(this, name, value); - } - } - }], [{ - key: 'create', - value: function create(value) { - var node = _get(Image.__proto__ || Object.getPrototypeOf(Image), 'create', this).call(this, value); - if (typeof value === 'string') { - node.setAttribute('src', this.sanitize(value)); - } - return node; - } - }, { - key: 'formats', - value: function formats(domNode) { - return ATTRIBUTES.reduce(function (formats, attribute) { - if (domNode.hasAttribute(attribute)) { - formats[attribute] = domNode.getAttribute(attribute); - } - return formats; - }, {}); - } - }, { - key: 'match', - value: function match(url) { - return (/\.(jpe?g|gif|png)$/.test(url) || /^data:image\/.+;base64/.test(url) - ); - } - }, { - key: 'sanitize', - value: function sanitize(url) { - return (0, _link.sanitize)(url, ['http', 'https', 'data']) ? url : '//:0'; - } - }, { - key: 'value', - value: function value(domNode) { - return domNode.getAttribute('src'); - } - }]); - - return Image; -}(_parchment2.default.Embed); - -Image.blotName = 'image'; -Image.tagName = 'IMG'; - -exports.default = Image; - -/***/ }), -/* 73 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _block = __webpack_require__(4); - -var _link = __webpack_require__(27); - -var _link2 = _interopRequireDefault(_link); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var ATTRIBUTES = ['height', 'width']; - -var Video = function (_BlockEmbed) { - _inherits(Video, _BlockEmbed); - - function Video() { - _classCallCheck(this, Video); - - return _possibleConstructorReturn(this, (Video.__proto__ || Object.getPrototypeOf(Video)).apply(this, arguments)); - } - - _createClass(Video, [{ - key: 'format', - value: function format(name, value) { - if (ATTRIBUTES.indexOf(name) > -1) { - if (value) { - this.domNode.setAttribute(name, value); - } else { - this.domNode.removeAttribute(name); - } - } else { - _get(Video.prototype.__proto__ || Object.getPrototypeOf(Video.prototype), 'format', this).call(this, name, value); - } - } - }], [{ - key: 'create', - value: function create(value) { - var node = _get(Video.__proto__ || Object.getPrototypeOf(Video), 'create', this).call(this, value); - node.setAttribute('frameborder', '0'); - node.setAttribute('allowfullscreen', true); - node.setAttribute('src', this.sanitize(value)); - return node; - } - }, { - key: 'formats', - value: function formats(domNode) { - return ATTRIBUTES.reduce(function (formats, attribute) { - if (domNode.hasAttribute(attribute)) { - formats[attribute] = domNode.getAttribute(attribute); - } - return formats; - }, {}); - } - }, { - key: 'sanitize', - value: function sanitize(url) { - return _link2.default.sanitize(url); - } - }, { - key: 'value', - value: function value(domNode) { - return domNode.getAttribute('src'); - } - }]); - - return Video; -}(_block.BlockEmbed); - -Video.blotName = 'video'; -Video.className = 'ql-video'; -Video.tagName = 'IFRAME'; - -exports.default = Video; - -/***/ }), -/* 74 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = exports.FormulaBlot = undefined; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _embed = __webpack_require__(35); - -var _embed2 = _interopRequireDefault(_embed); - -var _quill = __webpack_require__(5); - -var _quill2 = _interopRequireDefault(_quill); - -var _module = __webpack_require__(9); - -var _module2 = _interopRequireDefault(_module); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var FormulaBlot = function (_Embed) { - _inherits(FormulaBlot, _Embed); - - function FormulaBlot() { - _classCallCheck(this, FormulaBlot); - - return _possibleConstructorReturn(this, (FormulaBlot.__proto__ || Object.getPrototypeOf(FormulaBlot)).apply(this, arguments)); - } - - _createClass(FormulaBlot, null, [{ - key: 'create', - value: function create(value) { - var node = _get(FormulaBlot.__proto__ || Object.getPrototypeOf(FormulaBlot), 'create', this).call(this, value); - if (typeof value === 'string') { - window.katex.render(value, node, { - throwOnError: false, - errorColor: '#f00' - }); - node.setAttribute('data-value', value); - } - return node; - } - }, { - key: 'value', - value: function value(domNode) { - return domNode.getAttribute('data-value'); - } - }]); - - return FormulaBlot; -}(_embed2.default); - -FormulaBlot.blotName = 'formula'; -FormulaBlot.className = 'ql-formula'; -FormulaBlot.tagName = 'SPAN'; - -var Formula = function (_Module) { - _inherits(Formula, _Module); - - _createClass(Formula, null, [{ - key: 'register', - value: function register() { - _quill2.default.register(FormulaBlot, true); - } - }]); - - function Formula() { - _classCallCheck(this, Formula); - - var _this2 = _possibleConstructorReturn(this, (Formula.__proto__ || Object.getPrototypeOf(Formula)).call(this)); - - if (window.katex == null) { - throw new Error('Formula module requires KaTeX.'); - } - return _this2; - } - - return Formula; -}(_module2.default); - -exports.FormulaBlot = FormulaBlot; -exports.default = Formula; - -/***/ }), -/* 75 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = exports.CodeToken = exports.CodeBlock = undefined; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _parchment = __webpack_require__(0); - -var _parchment2 = _interopRequireDefault(_parchment); - -var _quill = __webpack_require__(5); - -var _quill2 = _interopRequireDefault(_quill); - -var _module = __webpack_require__(9); - -var _module2 = _interopRequireDefault(_module); - -var _code = __webpack_require__(13); - -var _code2 = _interopRequireDefault(_code); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var SyntaxCodeBlock = function (_CodeBlock) { - _inherits(SyntaxCodeBlock, _CodeBlock); - - function SyntaxCodeBlock() { - _classCallCheck(this, SyntaxCodeBlock); - - return _possibleConstructorReturn(this, (SyntaxCodeBlock.__proto__ || Object.getPrototypeOf(SyntaxCodeBlock)).apply(this, arguments)); - } - - _createClass(SyntaxCodeBlock, [{ - key: 'replaceWith', - value: function replaceWith(block) { - this.domNode.textContent = this.domNode.textContent; - this.attach(); - _get(SyntaxCodeBlock.prototype.__proto__ || Object.getPrototypeOf(SyntaxCodeBlock.prototype), 'replaceWith', this).call(this, block); - } - }, { - key: 'highlight', - value: function highlight(_highlight) { - var text = this.domNode.textContent; - if (this.cachedText !== text) { - if (text.trim().length > 0 || this.cachedText == null) { - this.domNode.innerHTML = _highlight(text); - this.domNode.normalize(); - this.attach(); - } - this.cachedText = text; - } - } - }]); - - return SyntaxCodeBlock; -}(_code2.default); - -SyntaxCodeBlock.className = 'ql-syntax'; - -var CodeToken = new _parchment2.default.Attributor.Class('token', 'hljs', { - scope: _parchment2.default.Scope.INLINE -}); - -var Syntax = function (_Module) { - _inherits(Syntax, _Module); - - _createClass(Syntax, null, [{ - key: 'register', - value: function register() { - _quill2.default.register(CodeToken, true); - _quill2.default.register(SyntaxCodeBlock, true); - } - }]); - - function Syntax(quill, options) { - _classCallCheck(this, Syntax); - - var _this2 = _possibleConstructorReturn(this, (Syntax.__proto__ || Object.getPrototypeOf(Syntax)).call(this, quill, options)); - - if (typeof _this2.options.highlight !== 'function') { - throw new Error('Syntax module requires highlight.js. Please include the library on the page before Quill.'); - } - var timer = null; - _this2.quill.on(_quill2.default.events.SCROLL_OPTIMIZE, function () { - clearTimeout(timer); - timer = setTimeout(function () { - _this2.highlight(); - timer = null; - }, _this2.options.interval); - }); - _this2.highlight(); - return _this2; - } - - _createClass(Syntax, [{ - key: 'highlight', - value: function highlight() { - var _this3 = this; - - if (this.quill.selection.composing) return; - this.quill.update(_quill2.default.sources.USER); - var range = this.quill.getSelection(); - this.quill.scroll.descendants(SyntaxCodeBlock).forEach(function (code) { - code.highlight(_this3.options.highlight); - }); - this.quill.update(_quill2.default.sources.SILENT); - if (range != null) { - this.quill.setSelection(range, _quill2.default.sources.SILENT); - } - } - }]); - - return Syntax; -}(_module2.default); - -Syntax.DEFAULTS = { - highlight: function () { - if (window.hljs == null) return null; - return function (text) { - var result = window.hljs.highlightAuto(text); - return result.value; - }; - }(), - interval: 1000 -}; - -exports.CodeBlock = SyntaxCodeBlock; -exports.CodeToken = CodeToken; -exports.default = Syntax; - -/***/ }), -/* 76 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 77 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 78 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 79 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 80 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 81 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 82 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 83 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 84 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 85 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 86 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 87 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 88 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 89 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 90 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 91 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 92 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 93 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 94 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 95 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 96 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 97 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 98 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 99 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 100 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 101 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 102 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 103 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 104 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 105 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 106 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 107 */ -/***/ (function(module, exports) { - -module.exports = " "; - -/***/ }), -/* 108 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = exports.BubbleTooltip = undefined; - -var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _extend = __webpack_require__(3); - -var _extend2 = _interopRequireDefault(_extend); - -var _emitter = __webpack_require__(8); - -var _emitter2 = _interopRequireDefault(_emitter); - -var _base = __webpack_require__(43); - -var _base2 = _interopRequireDefault(_base); - -var _selection = __webpack_require__(15); - -var _icons = __webpack_require__(41); - -var _icons2 = _interopRequireDefault(_icons); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var TOOLBAR_CONFIG = [['bold', 'italic', 'link'], [{ header: 1 }, { header: 2 }, 'blockquote']]; - -var BubbleTheme = function (_BaseTheme) { - _inherits(BubbleTheme, _BaseTheme); - - function BubbleTheme(quill, options) { - _classCallCheck(this, BubbleTheme); - - if (options.modules.toolbar != null && options.modules.toolbar.container == null) { - options.modules.toolbar.container = TOOLBAR_CONFIG; - } - - var _this = _possibleConstructorReturn(this, (BubbleTheme.__proto__ || Object.getPrototypeOf(BubbleTheme)).call(this, quill, options)); - - _this.quill.container.classList.add('ql-bubble'); - return _this; - } - - _createClass(BubbleTheme, [{ - key: 'extendToolbar', - value: function extendToolbar(toolbar) { - this.tooltip = new BubbleTooltip(this.quill, this.options.bounds); - this.tooltip.root.appendChild(toolbar.container); - this.buildButtons([].slice.call(toolbar.container.querySelectorAll('button')), _icons2.default); - this.buildPickers([].slice.call(toolbar.container.querySelectorAll('select')), _icons2.default); - } - }]); - - return BubbleTheme; -}(_base2.default); - -BubbleTheme.DEFAULTS = (0, _extend2.default)(true, {}, _base2.default.DEFAULTS, { - modules: { - toolbar: { - handlers: { - link: function link(value) { - if (!value) { - this.quill.format('link', false); - } else { - this.quill.theme.tooltip.edit(); - } - } - } - } - } -}); - -var BubbleTooltip = function (_BaseTooltip) { - _inherits(BubbleTooltip, _BaseTooltip); - - function BubbleTooltip(quill, bounds) { - _classCallCheck(this, BubbleTooltip); - - var _this2 = _possibleConstructorReturn(this, (BubbleTooltip.__proto__ || Object.getPrototypeOf(BubbleTooltip)).call(this, quill, bounds)); - - _this2.quill.on(_emitter2.default.events.EDITOR_CHANGE, function (type, range, oldRange, source) { - if (type !== _emitter2.default.events.SELECTION_CHANGE) return; - if (range != null && range.length > 0 && source === _emitter2.default.sources.USER) { - _this2.show(); - // Lock our width so we will expand beyond our offsetParent boundaries - _this2.root.style.left = '0px'; - _this2.root.style.width = ''; - _this2.root.style.width = _this2.root.offsetWidth + 'px'; - var lines = _this2.quill.getLines(range.index, range.length); - if (lines.length === 1) { - _this2.position(_this2.quill.getBounds(range)); - } else { - var lastLine = lines[lines.length - 1]; - var index = _this2.quill.getIndex(lastLine); - var length = Math.min(lastLine.length() - 1, range.index + range.length - index); - var _bounds = _this2.quill.getBounds(new _selection.Range(index, length)); - _this2.position(_bounds); - } - } else if (document.activeElement !== _this2.textbox && _this2.quill.hasFocus()) { - _this2.hide(); - } - }); - return _this2; - } - - _createClass(BubbleTooltip, [{ - key: 'listen', - value: function listen() { - var _this3 = this; - - _get(BubbleTooltip.prototype.__proto__ || Object.getPrototypeOf(BubbleTooltip.prototype), 'listen', this).call(this); - this.root.querySelector('.ql-close').addEventListener('click', function () { - _this3.root.classList.remove('ql-editing'); - }); - this.quill.on(_emitter2.default.events.SCROLL_OPTIMIZE, function () { - // Let selection be restored by toolbar handlers before repositioning - setTimeout(function () { - if (_this3.root.classList.contains('ql-hidden')) return; - var range = _this3.quill.getSelection(); - if (range != null) { - _this3.position(_this3.quill.getBounds(range)); - } - }, 1); - }); - } - }, { - key: 'cancel', - value: function cancel() { - this.show(); - } - }, { - key: 'position', - value: function position(reference) { - var shift = _get(BubbleTooltip.prototype.__proto__ || Object.getPrototypeOf(BubbleTooltip.prototype), 'position', this).call(this, reference); - var arrow = this.root.querySelector('.ql-tooltip-arrow'); - arrow.style.marginLeft = ''; - if (shift === 0) return shift; - arrow.style.marginLeft = -1 * shift - arrow.offsetWidth / 2 + 'px'; - } - }]); - - return BubbleTooltip; -}(_base.BaseTooltip); - -BubbleTooltip.TEMPLATE = ['', '
', '', '', '
'].join(''); - -exports.BubbleTooltip = BubbleTooltip; -exports.default = BubbleTheme; - -/***/ }), -/* 109 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(63); - - -/***/ }) -/******/ ])["default"]; -}); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Quill=e():t.Quill=e()}(self,(function(){return function(){var t={9698:function(t,e,n){"use strict";n.d(e,{Ay:function(){return c},Ji:function(){return d},mG:function(){return h},zo:function(){return u}});var r=n(6003),i=n(5232),s=n.n(i),o=n(3036),l=n(4850),a=n(5508);class c extends r.BlockBlot{cache={};delta(){return null==this.cache.delta&&(this.cache.delta=h(this)),this.cache.delta}deleteAt(t,e){super.deleteAt(t,e),this.cache={}}formatAt(t,e,n,i){e<=0||(this.scroll.query(n,r.Scope.BLOCK)?t+e===this.length()&&this.format(n,i):super.formatAt(t,Math.min(e,this.length()-t-1),n,i),this.cache={})}insertAt(t,e,n){if(null!=n)return super.insertAt(t,e,n),void(this.cache={});if(0===e.length)return;const r=e.split("\n"),i=r.shift();i.length>0&&(t(s=s.split(t,!0),s.insertAt(0,e),e.length)),t+i.length)}insertBefore(t,e){const{head:n}=this.children;super.insertBefore(t,e),n instanceof o.A&&n.remove(),this.cache={}}length(){return null==this.cache.length&&(this.cache.length=super.length()+1),this.cache.length}moveChildren(t,e){super.moveChildren(t,e),this.cache={}}optimize(t){super.optimize(t),this.cache={}}path(t){return super.path(t,!0)}removeChild(t){super.removeChild(t),this.cache={}}split(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e&&(0===t||t>=this.length()-1)){const e=this.clone();return 0===t?(this.parent.insertBefore(e,this),this):(this.parent.insertBefore(e,this.next),e)}const n=super.split(t,e);return this.cache={},n}}c.blotName="block",c.tagName="P",c.defaultChild=o.A,c.allowedChildren=[o.A,l.A,r.EmbedBlot,a.A];class u extends r.EmbedBlot{attach(){super.attach(),this.attributes=new r.AttributorStore(this.domNode)}delta(){return(new(s())).insert(this.value(),{...this.formats(),...this.attributes.values()})}format(t,e){const n=this.scroll.query(t,r.Scope.BLOCK_ATTRIBUTE);null!=n&&this.attributes.attribute(n,e)}formatAt(t,e,n,r){this.format(n,r)}insertAt(t,e,n){if(null!=n)return void super.insertAt(t,e,n);const r=e.split("\n"),i=r.pop(),s=r.map((t=>{const e=this.scroll.create(c.blotName);return e.insertAt(0,t),e})),o=this.split(t);s.forEach((t=>{this.parent.insertBefore(t,o)})),i&&this.parent.insertBefore(this.scroll.create("text",i),o)}}function h(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return t.descendants(r.LeafBlot).reduce(((t,n)=>0===n.length()?t:t.insert(n.value(),d(n,{},e))),new(s())).insert("\n",d(t))}function d(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];return null==t?e:("formats"in t&&"function"==typeof t.formats&&(e={...e,...t.formats()},n&&delete e["code-token"]),null==t.parent||"scroll"===t.parent.statics.blotName||t.parent.statics.scope!==t.statics.scope?e:d(t.parent,e,n))}u.scope=r.Scope.BLOCK_BLOT},3036:function(t,e,n){"use strict";var r=n(6003);class i extends r.EmbedBlot{static value(){}optimize(){(this.prev||this.next)&&this.remove()}length(){return 0}value(){return""}}i.blotName="break",i.tagName="BR",e.A=i},580:function(t,e,n){"use strict";var r=n(6003);class i extends r.ContainerBlot{}e.A=i},4541:function(t,e,n){"use strict";var r=n(6003),i=n(5508);class s extends r.EmbedBlot{static blotName="cursor";static className="ql-cursor";static tagName="span";static CONTENTS="\ufeff";static value(){}constructor(t,e,n){super(t,e),this.selection=n,this.textNode=document.createTextNode(s.CONTENTS),this.domNode.appendChild(this.textNode),this.savedLength=0}detach(){null!=this.parent&&this.parent.removeChild(this)}format(t,e){if(0!==this.savedLength)return void super.format(t,e);let n=this,i=0;for(;null!=n&&n.statics.scope!==r.Scope.BLOCK_BLOT;)i+=n.offset(n.parent),n=n.parent;null!=n&&(this.savedLength=s.CONTENTS.length,n.optimize(),n.formatAt(i,s.CONTENTS.length,t,e),this.savedLength=0)}index(t,e){return t===this.textNode?0:super.index(t,e)}length(){return this.savedLength}position(){return[this.textNode,this.textNode.data.length]}remove(){super.remove(),this.parent=null}restore(){if(this.selection.composing||null==this.parent)return null;const t=this.selection.getNativeRange();for(;null!=this.domNode.lastChild&&this.domNode.lastChild!==this.textNode;)this.domNode.parentNode.insertBefore(this.domNode.lastChild,this.domNode);const e=this.prev instanceof i.A?this.prev:null,n=e?e.length():0,r=this.next instanceof i.A?this.next:null,o=r?r.text:"",{textNode:l}=this,a=l.data.split(s.CONTENTS).join("");let c;if(l.data=s.CONTENTS,e)c=e,(a||r)&&(e.insertAt(e.length(),a+o),r&&r.remove());else if(r)c=r,r.insertAt(0,a);else{const t=document.createTextNode(a);c=this.scroll.create(t),this.parent.insertBefore(c,this)}if(this.remove(),t){const i=(t,i)=>e&&t===e.domNode?i:t===l?n+i-1:r&&t===r.domNode?n+a.length+i:null,s=i(t.start.node,t.start.offset),o=i(t.end.node,t.end.offset);if(null!==s&&null!==o)return{startNode:c.domNode,startOffset:s,endNode:c.domNode,endOffset:o}}return null}update(t,e){if(t.some((t=>"characterData"===t.type&&t.target===this.textNode))){const t=this.restore();t&&(e.range=t)}}optimize(t){super.optimize(t);let{parent:e}=this;for(;e;){if("A"===e.domNode.tagName){this.savedLength=s.CONTENTS.length,e.isolate(this.offset(e),this.length()).unwrap(),this.savedLength=0;break}e=e.parent}}value(){return""}}e.A=s},746:function(t,e,n){"use strict";var r=n(6003),i=n(5508);const s="\ufeff";class o extends r.EmbedBlot{constructor(t,e){super(t,e),this.contentNode=document.createElement("span"),this.contentNode.setAttribute("contenteditable","false"),Array.from(this.domNode.childNodes).forEach((t=>{this.contentNode.appendChild(t)})),this.leftGuard=document.createTextNode(s),this.rightGuard=document.createTextNode(s),this.domNode.appendChild(this.leftGuard),this.domNode.appendChild(this.contentNode),this.domNode.appendChild(this.rightGuard)}index(t,e){return t===this.leftGuard?0:t===this.rightGuard?1:super.index(t,e)}restore(t){let e,n=null;const r=t.data.split(s).join("");if(t===this.leftGuard)if(this.prev instanceof i.A){const t=this.prev.length();this.prev.insertAt(t,r),n={startNode:this.prev.domNode,startOffset:t+r.length}}else e=document.createTextNode(r),this.parent.insertBefore(this.scroll.create(e),this),n={startNode:e,startOffset:r.length};else t===this.rightGuard&&(this.next instanceof i.A?(this.next.insertAt(0,r),n={startNode:this.next.domNode,startOffset:r.length}):(e=document.createTextNode(r),this.parent.insertBefore(this.scroll.create(e),this.next),n={startNode:e,startOffset:r.length}));return t.data=s,n}update(t,e){t.forEach((t=>{if("characterData"===t.type&&(t.target===this.leftGuard||t.target===this.rightGuard)){const n=this.restore(t.target);n&&(e.range=n)}}))}}e.A=o},4850:function(t,e,n){"use strict";var r=n(6003),i=n(3036),s=n(5508);class o extends r.InlineBlot{static allowedChildren=[o,i.A,r.EmbedBlot,s.A];static order=["cursor","inline","link","underline","strike","italic","bold","script","code"];static compare(t,e){const n=o.order.indexOf(t),r=o.order.indexOf(e);return n>=0||r>=0?n-r:t===e?0:t0){const t=this.parent.isolate(this.offset(),this.length());this.moveChildren(t),t.wrap(this)}}}e.A=o},5508:function(t,e,n){"use strict";n.d(e,{A:function(){return i},X:function(){return s}});var r=n(6003);class i extends r.TextBlot{}function s(t){return t.replace(/[&<>"']/g,(t=>({"&":"&","<":"<",">":">",'"':""","'":"'"}[t])))}},3729:function(t,e,n){"use strict";n.d(e,{default:function(){return R}});var r=n(6142),i=n(9698),s=n(3036),o=n(580),l=n(4541),a=n(746),c=n(4850),u=n(6003),h=n(5232),d=n.n(h),f=n(5374);function p(t){return t instanceof i.Ay||t instanceof i.zo}function g(t){return"function"==typeof t.updateContent}class m extends u.ScrollBlot{static blotName="scroll";static className="ql-editor";static tagName="DIV";static defaultChild=i.Ay;static allowedChildren=[i.Ay,i.zo,o.A];constructor(t,e,n){let{emitter:r}=n;super(t,e),this.emitter=r,this.batch=!1,this.optimize(),this.enable(),this.domNode.addEventListener("dragstart",(t=>this.handleDragStart(t)))}batchStart(){Array.isArray(this.batch)||(this.batch=[])}batchEnd(){if(!this.batch)return;const t=this.batch;this.batch=!1,this.update(t)}emitMount(t){this.emitter.emit(f.A.events.SCROLL_BLOT_MOUNT,t)}emitUnmount(t){this.emitter.emit(f.A.events.SCROLL_BLOT_UNMOUNT,t)}emitEmbedUpdate(t,e){this.emitter.emit(f.A.events.SCROLL_EMBED_UPDATE,t,e)}deleteAt(t,e){const[n,r]=this.line(t),[o]=this.line(t+e);if(super.deleteAt(t,e),null!=o&&n!==o&&r>0){if(n instanceof i.zo||o instanceof i.zo)return void this.optimize();const t=o.children.head instanceof s.A?null:o.children.head;n.moveChildren(o,t),n.remove()}this.optimize()}enable(){let t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.domNode.setAttribute("contenteditable",t?"true":"false")}formatAt(t,e,n,r){super.formatAt(t,e,n,r),this.optimize()}insertAt(t,e,n){if(t>=this.length())if(null==n||null==this.scroll.query(e,u.Scope.BLOCK)){const t=this.scroll.create(this.statics.defaultChild.blotName);this.appendChild(t),null==n&&e.endsWith("\n")?t.insertAt(0,e.slice(0,-1),n):t.insertAt(0,e,n)}else{const t=this.scroll.create(e,n);this.appendChild(t)}else super.insertAt(t,e,n);this.optimize()}insertBefore(t,e){if(t.statics.scope===u.Scope.INLINE_BLOT){const n=this.scroll.create(this.statics.defaultChild.blotName);n.appendChild(t),super.insertBefore(n,e)}else super.insertBefore(t,e)}insertContents(t,e){const n=this.deltaToRenderBlocks(e.concat((new(d())).insert("\n"))),r=n.pop();if(null==r)return;this.batchStart();const s=n.shift();if(s){const e="block"===s.type&&(0===s.delta.length()||!this.descendant(i.zo,t)[0]&&t{this.formatAt(o-1,1,t,a[t])})),t=o}let[o,l]=this.children.find(t);n.length&&(o&&(o=o.split(l),l=0),n.forEach((t=>{if("block"===t.type)b(this.createBlock(t.attributes,o||void 0),0,t.delta);else{const e=this.create(t.key,t.value);this.insertBefore(e,o||void 0),Object.keys(t.attributes).forEach((n=>{e.format(n,t.attributes[n])}))}}))),"block"===r.type&&r.delta.length()&&b(this,o?o.offset(o.scroll)+l:this.length(),r.delta),this.batchEnd(),this.optimize()}isEnabled(){return"true"===this.domNode.getAttribute("contenteditable")}leaf(t){const e=this.path(t).pop();if(!e)return[null,-1];const[n,r]=e;return n instanceof u.LeafBlot?[n,r]:[null,-1]}line(t){return t===this.length()?this.line(t-1):this.descendant(p,t)}lines(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;const n=(t,e,r)=>{let i=[],s=r;return t.children.forEachAt(e,r,((t,e,r)=>{p(t)?i.push(t):t instanceof u.ContainerBlot&&(i=i.concat(n(t,e,s))),s-=r})),i};return n(this,t,e)}optimize(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.batch||(super.optimize(t,e),t.length>0&&this.emitter.emit(f.A.events.SCROLL_OPTIMIZE,t,e))}path(t){return super.path(t).slice(1)}remove(){}update(t){if(this.batch)return void(Array.isArray(t)&&(this.batch=this.batch.concat(t)));let e=f.A.sources.USER;"string"==typeof t&&(e=t),Array.isArray(t)||(t=this.observer.takeRecords()),(t=t.filter((t=>{let{target:e}=t;const n=this.find(e,!0);return n&&!g(n)}))).length>0&&this.emitter.emit(f.A.events.SCROLL_BEFORE_UPDATE,e,t),super.update(t.concat([])),t.length>0&&this.emitter.emit(f.A.events.SCROLL_UPDATE,e,t)}updateEmbedAt(t,e,n){const[r]=this.descendant((t=>t instanceof i.zo),t);r&&r.statics.blotName===e&&g(r)&&r.updateContent(n)}handleDragStart(t){t.preventDefault()}deltaToRenderBlocks(t){const e=[];let n=new(d());return t.forEach((t=>{const r=t?.insert;if(r)if("string"==typeof r){const i=r.split("\n");i.slice(0,-1).forEach((r=>{n.insert(r,t.attributes),e.push({type:"block",delta:n,attributes:t.attributes??{}}),n=new(d())}));const s=i[i.length-1];s&&n.insert(s,t.attributes)}else{const i=Object.keys(r)[0];if(!i)return;this.query(i,u.Scope.INLINE)?n.push(t):(n.length()&&e.push({type:"block",delta:n,attributes:{}}),n=new(d()),e.push({type:"blockEmbed",key:i,value:r[i],attributes:t.attributes??{}}))}})),n.length()&&e.push({type:"block",delta:n,attributes:{}}),e}createBlock(t,e){let n;const r={};Object.entries(t).forEach((t=>{let[e,i]=t;null!=this.query(e,u.Scope.BLOCK&u.Scope.BLOT)?n=e:r[e]=i}));const i=this.create(n||this.statics.defaultChild.blotName,n?t[n]:void 0);this.insertBefore(i,e||void 0);const s=i.length();return Object.entries(r).forEach((t=>{let[e,n]=t;i.formatAt(0,s,e,n)})),i}}function b(t,e,n){n.reduce(((e,n)=>{const r=h.Op.length(n);let s=n.attributes||{};if(null!=n.insert)if("string"==typeof n.insert){const r=n.insert;t.insertAt(e,r);const[o]=t.descendant(u.LeafBlot,e),l=(0,i.Ji)(o);s=h.AttributeMap.diff(l,s)||{}}else if("object"==typeof n.insert){const r=Object.keys(n.insert)[0];if(null==r)return e;if(t.insertAt(e,r,n.insert[r]),null!=t.scroll.query(r,u.Scope.INLINE)){const[n]=t.descendant(u.LeafBlot,e),r=(0,i.Ji)(n);s=h.AttributeMap.diff(r,s)||{}}}return Object.keys(s).forEach((n=>{t.formatAt(e,r,n,s[n])})),e+r}),e)}var y=m,v=n(5508),A=n(584),x=n(4266);class N extends x.A{static DEFAULTS={delay:1e3,maxStack:100,userOnly:!1};lastRecorded=0;ignoreChange=!1;stack={undo:[],redo:[]};currentRange=null;constructor(t,e){super(t,e),this.quill.on(r.Ay.events.EDITOR_CHANGE,((t,e,n,i)=>{t===r.Ay.events.SELECTION_CHANGE?e&&i!==r.Ay.sources.SILENT&&(this.currentRange=e):t===r.Ay.events.TEXT_CHANGE&&(this.ignoreChange||(this.options.userOnly&&i!==r.Ay.sources.USER?this.transform(e):this.record(e,n)),this.currentRange=w(this.currentRange,e))})),this.quill.keyboard.addBinding({key:"z",shortKey:!0},this.undo.bind(this)),this.quill.keyboard.addBinding({key:["z","Z"],shortKey:!0,shiftKey:!0},this.redo.bind(this)),/Win/i.test(navigator.platform)&&this.quill.keyboard.addBinding({key:"y",shortKey:!0},this.redo.bind(this)),this.quill.root.addEventListener("beforeinput",(t=>{"historyUndo"===t.inputType?(this.undo(),t.preventDefault()):"historyRedo"===t.inputType&&(this.redo(),t.preventDefault())}))}change(t,e){if(0===this.stack[t].length)return;const n=this.stack[t].pop();if(!n)return;const i=this.quill.getContents(),s=n.delta.invert(i);this.stack[e].push({delta:s,range:w(n.range,s)}),this.lastRecorded=0,this.ignoreChange=!0,this.quill.updateContents(n.delta,r.Ay.sources.USER),this.ignoreChange=!1,this.restoreSelection(n)}clear(){this.stack={undo:[],redo:[]}}cutoff(){this.lastRecorded=0}record(t,e){if(0===t.ops.length)return;this.stack.redo=[];let n=t.invert(e),r=this.currentRange;const i=Date.now();if(this.lastRecorded+this.options.delay>i&&this.stack.undo.length>0){const t=this.stack.undo.pop();t&&(n=n.compose(t.delta),r=t.range)}else this.lastRecorded=i;0!==n.length()&&(this.stack.undo.push({delta:n,range:r}),this.stack.undo.length>this.options.maxStack&&this.stack.undo.shift())}redo(){this.change("redo","undo")}transform(t){E(this.stack.undo,t),E(this.stack.redo,t)}undo(){this.change("undo","redo")}restoreSelection(t){if(t.range)this.quill.setSelection(t.range,r.Ay.sources.USER);else{const e=function(t,e){const n=e.reduce(((t,e)=>t+(e.delete||0)),0);let r=e.length()-n;return function(t,e){const n=e.ops[e.ops.length-1];return null!=n&&(null!=n.insert?"string"==typeof n.insert&&n.insert.endsWith("\n"):null!=n.attributes&&Object.keys(n.attributes).some((e=>null!=t.query(e,u.Scope.BLOCK))))}(t,e)&&(r-=1),r}(this.quill.scroll,t.delta);this.quill.setSelection(e,r.Ay.sources.USER)}}}function E(t,e){let n=e;for(let e=t.length-1;e>=0;e-=1){const r=t[e];t[e]={delta:n.transform(r.delta,!0),range:r.range&&w(r.range,n)},n=r.delta.transform(n),0===t[e].delta.length()&&t.splice(e,1)}}function w(t,e){if(!t)return t;const n=e.transformPosition(t.index);return{index:n,length:e.transformPosition(t.index+t.length)-n}}var q=n(8123);class k extends x.A{constructor(t,e){super(t,e),t.root.addEventListener("drop",(e=>{e.preventDefault();let n=null;if(document.caretRangeFromPoint)n=document.caretRangeFromPoint(e.clientX,e.clientY);else if(document.caretPositionFromPoint){const t=document.caretPositionFromPoint(e.clientX,e.clientY);n=document.createRange(),n.setStart(t.offsetNode,t.offset),n.setEnd(t.offsetNode,t.offset)}const r=n&&t.selection.normalizeNative(n);if(r){const n=t.selection.normalizedToRange(r);e.dataTransfer?.files&&this.upload(n,e.dataTransfer.files)}}))}upload(t,e){const n=[];Array.from(e).forEach((t=>{t&&this.options.mimetypes?.includes(t.type)&&n.push(t)})),n.length>0&&this.options.handler.call(this,t,n)}}k.DEFAULTS={mimetypes:["image/png","image/jpeg"],handler(t,e){if(!this.quill.scroll.query("image"))return;const n=e.map((t=>new Promise((e=>{const n=new FileReader;n.onload=()=>{e(n.result)},n.readAsDataURL(t)}))));Promise.all(n).then((e=>{const n=e.reduce(((t,e)=>t.insert({image:e})),(new(d())).retain(t.index).delete(t.length));this.quill.updateContents(n,f.A.sources.USER),this.quill.setSelection(t.index+e.length,f.A.sources.SILENT)}))}};var _=k;const L=["insertText","insertReplacementText"];class S extends x.A{constructor(t,e){super(t,e),t.root.addEventListener("beforeinput",(t=>{this.handleBeforeInput(t)})),/Android/i.test(navigator.userAgent)||t.on(r.Ay.events.COMPOSITION_BEFORE_START,(()=>{this.handleCompositionStart()}))}deleteRange(t){(0,q.Xo)({range:t,quill:this.quill})}replaceText(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(0===t.length)return!1;if(e){const n=this.quill.getFormat(t.index,1);this.deleteRange(t),this.quill.updateContents((new(d())).retain(t.index).insert(e,n),r.Ay.sources.USER)}else this.deleteRange(t);return this.quill.setSelection(t.index+e.length,0,r.Ay.sources.SILENT),!0}handleBeforeInput(t){if(this.quill.composition.isComposing||t.defaultPrevented||!L.includes(t.inputType))return;const e=t.getTargetRanges?t.getTargetRanges()[0]:null;if(!e||!0===e.collapsed)return;const n=function(t){return"string"==typeof t.data?t.data:t.dataTransfer?.types.includes("text/plain")?t.dataTransfer.getData("text/plain"):null}(t);if(null==n)return;const r=this.quill.selection.normalizeNative(e),i=r?this.quill.selection.normalizedToRange(r):null;i&&this.replaceText(i,n)&&t.preventDefault()}handleCompositionStart(){const t=this.quill.getSelection();t&&this.replaceText(t)}}var O=S;const T=/Mac/i.test(navigator.platform);class j extends x.A{isListening=!1;selectionChangeDeadline=0;constructor(t,e){super(t,e),this.handleArrowKeys(),this.handleNavigationShortcuts()}handleArrowKeys(){this.quill.keyboard.addBinding({key:["ArrowLeft","ArrowRight"],offset:0,shiftKey:null,handler(t,e){let{line:n,event:i}=e;if(!(n instanceof u.ParentBlot&&n.uiNode))return!0;const s="rtl"===getComputedStyle(n.domNode).direction;return!!(s&&"ArrowRight"!==i.key||!s&&"ArrowLeft"!==i.key)||(this.quill.setSelection(t.index-1,t.length+(i.shiftKey?1:0),r.Ay.sources.USER),!1)}})}handleNavigationShortcuts(){this.quill.root.addEventListener("keydown",(t=>{!t.defaultPrevented&&(t=>"ArrowLeft"===t.key||"ArrowRight"===t.key||"ArrowUp"===t.key||"ArrowDown"===t.key||"Home"===t.key||!(!T||"a"!==t.key||!0!==t.ctrlKey))(t)&&this.ensureListeningToSelectionChange()}))}ensureListeningToSelectionChange(){this.selectionChangeDeadline=Date.now()+100,this.isListening||(this.isListening=!0,document.addEventListener("selectionchange",(()=>{this.isListening=!1,Date.now()<=this.selectionChangeDeadline&&this.handleSelectionChange()}),{once:!0}))}handleSelectionChange(){const t=document.getSelection();if(!t)return;const e=t.getRangeAt(0);if(!0!==e.collapsed||0!==e.startOffset)return;const n=this.quill.scroll.find(e.startContainer);if(!(n instanceof u.ParentBlot&&n.uiNode))return;const r=document.createRange();r.setStartAfter(n.uiNode),r.setEndAfter(n.uiNode),t.removeAllRanges(),t.addRange(r)}}var C=j;r.Ay.register({"blots/block":i.Ay,"blots/block/embed":i.zo,"blots/break":s.A,"blots/container":o.A,"blots/cursor":l.A,"blots/embed":a.A,"blots/inline":c.A,"blots/scroll":y,"blots/text":v.A,"modules/clipboard":A.Ay,"modules/history":N,"modules/keyboard":q.Ay,"modules/uploader":_,"modules/input":O,"modules/uiNode":C});var R=r.Ay},5374:function(t,e,n){"use strict";n.d(e,{A:function(){return o}});var r=n(8920),i=n(7356);const s=(0,n(6078).A)("quill:events");["selectionchange","mousedown","mouseup","click"].forEach((t=>{document.addEventListener(t,(function(){for(var t=arguments.length,e=new Array(t),n=0;n{const n=i.A.get(t);n&&n.emitter&&n.emitter.handleDOM(...e)}))}))}));var o=class extends r{static events={EDITOR_CHANGE:"editor-change",SCROLL_BEFORE_UPDATE:"scroll-before-update",SCROLL_BLOT_MOUNT:"scroll-blot-mount",SCROLL_BLOT_UNMOUNT:"scroll-blot-unmount",SCROLL_OPTIMIZE:"scroll-optimize",SCROLL_UPDATE:"scroll-update",SCROLL_EMBED_UPDATE:"scroll-embed-update",SELECTION_CHANGE:"selection-change",TEXT_CHANGE:"text-change",COMPOSITION_BEFORE_START:"composition-before-start",COMPOSITION_START:"composition-start",COMPOSITION_BEFORE_END:"composition-before-end",COMPOSITION_END:"composition-end"};static sources={API:"api",SILENT:"silent",USER:"user"};constructor(){super(),this.domListeners={},this.on("error",s.error)}emit(){for(var t=arguments.length,e=new Array(t),n=0;n1?e-1:0),r=1;r{let{node:r,handler:i}=e;(t.target===r||r.contains(t.target))&&i(t,...n)}))}listenDOM(t,e,n){this.domListeners[t]||(this.domListeners[t]=[]),this.domListeners[t].push({node:e,handler:n})}}},7356:function(t,e){"use strict";e.A=new WeakMap},6078:function(t,e){"use strict";const n=["error","warn","log","info"];let r="warn";function i(t){if(r&&n.indexOf(t)<=n.indexOf(r)){for(var e=arguments.length,i=new Array(e>1?e-1:0),s=1;s(e[n]=i.bind(console,n,t),e)),{})}s.level=t=>{r=t},i.level=s.level,e.A=s},4266:function(t,e){"use strict";e.A=class{static DEFAULTS={};constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.quill=t,this.options=e}}},6142:function(t,e,n){"use strict";n.d(e,{Ay:function(){return I}});var r=n(8347),i=n(6003),s=n(5232),o=n.n(s),l=n(3707),a=n(5123),c=n(9698),u=n(3036),h=n(4541),d=n(5508),f=n(8298);const p=/^[ -~]*$/;function g(t,e,n){if(0===t.length){const[t]=y(n.pop());return e<=0?``:`${g([],e-1,n)}`}const[{child:r,offset:i,length:s,indent:o,type:l},...a]=t,[c,u]=y(l);if(o>e)return n.push(l),o===e+1?`<${c}>${m(r,i,s)}${g(a,o,n)}`:`<${c}>
  • ${g(t,e+1,n)}`;const h=n[n.length-1];if(o===e&&l===h)return`
  • ${m(r,i,s)}${g(a,o,n)}`;const[d]=y(n.pop());return`${g(t,e-1,n)}`}function m(t,e,n){let r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if("html"in t&&"function"==typeof t.html)return t.html(e,n);if(t instanceof d.A)return(0,d.X)(t.value().slice(e,e+n));if(t instanceof i.ParentBlot){if("list-container"===t.statics.blotName){const r=[];return t.children.forEachAt(e,n,((t,e,n)=>{const i="formats"in t&&"function"==typeof t.formats?t.formats():{};r.push({child:t,offset:e,length:n,indent:i.indent||0,type:i.list})})),g(r,-1,[])}const i=[];if(t.children.forEachAt(e,n,((t,e,n)=>{i.push(m(t,e,n))})),r||"list"===t.statics.blotName)return i.join("");const{outerHTML:s,innerHTML:o}=t.domNode,[l,a]=s.split(`>${o}<`);return"${i.join("")}<${a}`:`${l}>${i.join("")}<${a}`}return t.domNode instanceof Element?t.domNode.outerHTML:""}function b(t,e){return Object.keys(e).reduce(((n,r)=>{if(null==t[r])return n;const i=e[r];return i===t[r]?n[r]=i:Array.isArray(i)?i.indexOf(t[r])<0?n[r]=i.concat([t[r]]):n[r]=i:n[r]=[i,t[r]],n}),{})}function y(t){const e="ordered"===t?"ol":"ul";switch(t){case"checked":return[e,' data-list="checked"'];case"unchecked":return[e,' data-list="unchecked"'];default:return[e,""]}}function v(t){return t.reduce(((t,e)=>{if("string"==typeof e.insert){const n=e.insert.replace(/\r\n/g,"\n").replace(/\r/g,"\n");return t.insert(n,e.attributes)}return t.push(e)}),new(o()))}function A(t,e){let{index:n,length:r}=t;return new f.Q(n+e,r)}var x=class{constructor(t){this.scroll=t,this.delta=this.getDelta()}applyDelta(t){this.scroll.update();let e=this.scroll.length();this.scroll.batchStart();const n=v(t),l=new(o());return function(t){const e=[];return t.forEach((t=>{"string"==typeof t.insert?t.insert.split("\n").forEach(((n,r)=>{r&&e.push({insert:"\n",attributes:t.attributes}),n&&e.push({insert:n,attributes:t.attributes})})):e.push(t)})),e}(n.ops.slice()).reduce(((t,n)=>{const o=s.Op.length(n);let a=n.attributes||{},u=!1,h=!1;if(null!=n.insert){if(l.retain(o),"string"==typeof n.insert){const o=n.insert;h=!o.endsWith("\n")&&(e<=t||!!this.scroll.descendant(c.zo,t)[0]),this.scroll.insertAt(t,o);const[l,u]=this.scroll.line(t);let d=(0,r.A)({},(0,c.Ji)(l));if(l instanceof c.Ay){const[t]=l.descendant(i.LeafBlot,u);t&&(d=(0,r.A)(d,(0,c.Ji)(t)))}a=s.AttributeMap.diff(d,a)||{}}else if("object"==typeof n.insert){const o=Object.keys(n.insert)[0];if(null==o)return t;const l=null!=this.scroll.query(o,i.Scope.INLINE);if(l)(e<=t||this.scroll.descendant(c.zo,t)[0])&&(h=!0);else if(t>0){const[e,n]=this.scroll.descendant(i.LeafBlot,t-1);e instanceof d.A?"\n"!==e.value()[n]&&(u=!0):e instanceof i.EmbedBlot&&e.statics.scope===i.Scope.INLINE_BLOT&&(u=!0)}if(this.scroll.insertAt(t,o,n.insert[o]),l){const[e]=this.scroll.descendant(i.LeafBlot,t);if(e){const t=(0,r.A)({},(0,c.Ji)(e));a=s.AttributeMap.diff(t,a)||{}}}}e+=o}else if(l.push(n),null!==n.retain&&"object"==typeof n.retain){const e=Object.keys(n.retain)[0];if(null==e)return t;this.scroll.updateEmbedAt(t,e,n.retain[e])}Object.keys(a).forEach((e=>{this.scroll.formatAt(t,o,e,a[e])}));const f=u?1:0,p=h?1:0;return e+=f+p,l.retain(f),l.delete(p),t+o+f+p}),0),l.reduce(((t,e)=>"number"==typeof e.delete?(this.scroll.deleteAt(t,e.delete),t):t+s.Op.length(e)),0),this.scroll.batchEnd(),this.scroll.optimize(),this.update(n)}deleteText(t,e){return this.scroll.deleteAt(t,e),this.update((new(o())).retain(t).delete(e))}formatLine(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};this.scroll.update(),Object.keys(n).forEach((r=>{this.scroll.lines(t,Math.max(e,1)).forEach((t=>{t.format(r,n[r])}))})),this.scroll.optimize();const r=(new(o())).retain(t).retain(e,(0,l.A)(n));return this.update(r)}formatText(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};Object.keys(n).forEach((r=>{this.scroll.formatAt(t,e,r,n[r])}));const r=(new(o())).retain(t).retain(e,(0,l.A)(n));return this.update(r)}getContents(t,e){return this.delta.slice(t,t+e)}getDelta(){return this.scroll.lines().reduce(((t,e)=>t.concat(e.delta())),new(o()))}getFormat(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=[],r=[];0===e?this.scroll.path(t).forEach((t=>{const[e]=t;e instanceof c.Ay?n.push(e):e instanceof i.LeafBlot&&r.push(e)})):(n=this.scroll.lines(t,e),r=this.scroll.descendants(i.LeafBlot,t,e));const[s,o]=[n,r].map((t=>{const e=t.shift();if(null==e)return{};let n=(0,c.Ji)(e);for(;Object.keys(n).length>0;){const e=t.shift();if(null==e)return n;n=b((0,c.Ji)(e),n)}return n}));return{...s,...o}}getHTML(t,e){const[n,r]=this.scroll.line(t);if(n){const i=n.length();return n.length()>=r+e&&(0!==r||e!==i)?m(n,r,e,!0):m(this.scroll,t,e,!0)}return""}getText(t,e){return this.getContents(t,e).filter((t=>"string"==typeof t.insert)).map((t=>t.insert)).join("")}insertContents(t,e){const n=v(e),r=(new(o())).retain(t).concat(n);return this.scroll.insertContents(t,n),this.update(r)}insertEmbed(t,e,n){return this.scroll.insertAt(t,e,n),this.update((new(o())).retain(t).insert({[e]:n}))}insertText(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return e=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),this.scroll.insertAt(t,e),Object.keys(n).forEach((r=>{this.scroll.formatAt(t,e.length,r,n[r])})),this.update((new(o())).retain(t).insert(e,(0,l.A)(n)))}isBlank(){if(0===this.scroll.children.length)return!0;if(this.scroll.children.length>1)return!1;const t=this.scroll.children.head;if(t?.statics.blotName!==c.Ay.blotName)return!1;const e=t;return!(e.children.length>1)&&e.children.head instanceof u.A}removeFormat(t,e){const n=this.getText(t,e),[r,i]=this.scroll.line(t+e);let s=0,l=new(o());null!=r&&(s=r.length()-i,l=r.delta().slice(i,i+s-1).insert("\n"));const a=this.getContents(t,e+s).diff((new(o())).insert(n).concat(l)),c=(new(o())).retain(t).concat(a);return this.applyDelta(c)}update(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;const r=this.delta;if(1===e.length&&"characterData"===e[0].type&&e[0].target.data.match(p)&&this.scroll.find(e[0].target)){const i=this.scroll.find(e[0].target),s=(0,c.Ji)(i),l=i.offset(this.scroll),a=e[0].oldValue.replace(h.A.CONTENTS,""),u=(new(o())).insert(a),d=(new(o())).insert(i.value()),f=n&&{oldRange:A(n.oldRange,-l),newRange:A(n.newRange,-l)};t=(new(o())).retain(l).concat(u.diff(d,f)).reduce(((t,e)=>e.insert?t.insert(e.insert,s):t.push(e)),new(o())),this.delta=r.compose(t)}else this.delta=this.getDelta(),t&&(0,a.A)(r.compose(t),this.delta)||(t=r.diff(this.delta,n));return t}},N=n(5374),E=n(7356),w=n(6078),q=n(4266),k=n(746),_=class{isComposing=!1;constructor(t,e){this.scroll=t,this.emitter=e,this.setupListeners()}setupListeners(){this.scroll.domNode.addEventListener("compositionstart",(t=>{this.isComposing||this.handleCompositionStart(t)})),this.scroll.domNode.addEventListener("compositionend",(t=>{this.isComposing&&queueMicrotask((()=>{this.handleCompositionEnd(t)}))}))}handleCompositionStart(t){const e=t.target instanceof Node?this.scroll.find(t.target,!0):null;!e||e instanceof k.A||(this.emitter.emit(N.A.events.COMPOSITION_BEFORE_START,t),this.scroll.batchStart(),this.emitter.emit(N.A.events.COMPOSITION_START,t),this.isComposing=!0)}handleCompositionEnd(t){this.emitter.emit(N.A.events.COMPOSITION_BEFORE_END,t),this.scroll.batchEnd(),this.emitter.emit(N.A.events.COMPOSITION_END,t),this.isComposing=!1}},L=n(9609);const S=t=>{const e=t.getBoundingClientRect(),n="offsetWidth"in t&&Math.abs(e.width)/t.offsetWidth||1,r="offsetHeight"in t&&Math.abs(e.height)/t.offsetHeight||1;return{top:e.top,right:e.left+t.clientWidth*n,bottom:e.top+t.clientHeight*r,left:e.left}},O=t=>{const e=parseInt(t,10);return Number.isNaN(e)?0:e},T=(t,e,n,r,i,s)=>tr?0:tr?e-t>r-n?t+i-n:e-r+s:0;const j=["block","break","cursor","inline","scroll","text"];const C=(0,w.A)("quill"),R=new i.Registry;i.ParentBlot.uiClass="ql-ui";class I{static DEFAULTS={bounds:null,modules:{clipboard:!0,keyboard:!0,history:!0,uploader:!0},placeholder:"",readOnly:!1,registry:R,theme:"default"};static events=N.A.events;static sources=N.A.sources;static version="2.0.2";static imports={delta:o(),parchment:i,"core/module":q.A,"core/theme":L.A};static debug(t){!0===t&&(t="log"),w.A.level(t)}static find(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return E.A.get(t)||R.find(t,e)}static import(t){return null==this.imports[t]&&C.error(`Cannot import ${t}. Are you sure it was registered?`),this.imports[t]}static register(){if("string"!=typeof(arguments.length<=0?void 0:arguments[0])){const t=arguments.length<=0?void 0:arguments[0],e=!!(arguments.length<=1?void 0:arguments[1]),n="attrName"in t?t.attrName:t.blotName;"string"==typeof n?this.register(`formats/${n}`,t,e):Object.keys(t).forEach((n=>{this.register(n,t[n],e)}))}else{const t=arguments.length<=0?void 0:arguments[0],e=arguments.length<=1?void 0:arguments[1],n=!!(arguments.length<=2?void 0:arguments[2]);null==this.imports[t]||n||C.warn(`Overwriting ${t} with`,e),this.imports[t]=e,(t.startsWith("blots/")||t.startsWith("formats/"))&&e&&"boolean"!=typeof e&&"abstract"!==e.blotName&&R.register(e),"function"==typeof e.register&&e.register(R)}}constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(this.options=function(t,e){const n=B(t);if(!n)throw new Error("Invalid Quill container");const s=!e.theme||e.theme===I.DEFAULTS.theme?L.A:I.import(`themes/${e.theme}`);if(!s)throw new Error(`Invalid theme ${e.theme}. Did you register it?`);const{modules:o,...l}=I.DEFAULTS,{modules:a,...c}=s.DEFAULTS;let u=M(e.modules);null!=u&&u.toolbar&&u.toolbar.constructor!==Object&&(u={...u,toolbar:{container:u.toolbar}});const h=(0,r.A)({},M(o),M(a),u),d={...l,...U(c),...U(e)};let f=e.registry;return f?e.formats&&C.warn('Ignoring "formats" option because "registry" is specified'):f=e.formats?((t,e,n)=>{const r=new i.Registry;return j.forEach((t=>{const n=e.query(t);n&&r.register(n)})),t.forEach((t=>{let i=e.query(t);i||n.error(`Cannot register "${t}" specified in "formats" config. Are you sure it was registered?`);let s=0;for(;i;)if(r.register(i),i="blotName"in i?i.requiredContainer??null:null,s+=1,s>100){n.error(`Cycle detected in registering blot requiredContainer: "${t}"`);break}})),r})(e.formats,d.registry,C):d.registry,{...d,registry:f,container:n,theme:s,modules:Object.entries(h).reduce(((t,e)=>{let[n,i]=e;if(!i)return t;const s=I.import(`modules/${n}`);return null==s?(C.error(`Cannot load ${n} module. Are you sure you registered it?`),t):{...t,[n]:(0,r.A)({},s.DEFAULTS||{},i)}}),{}),bounds:B(d.bounds)}}(t,e),this.container=this.options.container,null==this.container)return void C.error("Invalid Quill container",t);this.options.debug&&I.debug(this.options.debug);const n=this.container.innerHTML.trim();this.container.classList.add("ql-container"),this.container.innerHTML="",E.A.set(this.container,this),this.root=this.addContainer("ql-editor"),this.root.classList.add("ql-blank"),this.emitter=new N.A;const s=i.ScrollBlot.blotName,l=this.options.registry.query(s);if(!l||!("blotName"in l))throw new Error(`Cannot initialize Quill without "${s}" blot`);if(this.scroll=new l(this.options.registry,this.root,{emitter:this.emitter}),this.editor=new x(this.scroll),this.selection=new f.A(this.scroll,this.emitter),this.composition=new _(this.scroll,this.emitter),this.theme=new this.options.theme(this,this.options),this.keyboard=this.theme.addModule("keyboard"),this.clipboard=this.theme.addModule("clipboard"),this.history=this.theme.addModule("history"),this.uploader=this.theme.addModule("uploader"),this.theme.addModule("input"),this.theme.addModule("uiNode"),this.theme.init(),this.emitter.on(N.A.events.EDITOR_CHANGE,(t=>{t===N.A.events.TEXT_CHANGE&&this.root.classList.toggle("ql-blank",this.editor.isBlank())})),this.emitter.on(N.A.events.SCROLL_UPDATE,((t,e)=>{const n=this.selection.lastRange,[r]=this.selection.getRange(),i=n&&r?{oldRange:n,newRange:r}:void 0;D.call(this,(()=>this.editor.update(null,e,i)),t)})),this.emitter.on(N.A.events.SCROLL_EMBED_UPDATE,((t,e)=>{const n=this.selection.lastRange,[r]=this.selection.getRange(),i=n&&r?{oldRange:n,newRange:r}:void 0;D.call(this,(()=>{const n=(new(o())).retain(t.offset(this)).retain({[t.statics.blotName]:e});return this.editor.update(n,[],i)}),I.sources.USER)})),n){const t=this.clipboard.convert({html:`${n}


    `,text:"\n"});this.setContents(t)}this.history.clear(),this.options.placeholder&&this.root.setAttribute("data-placeholder",this.options.placeholder),this.options.readOnly&&this.disable(),this.allowReadOnlyEdits=!1}addContainer(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if("string"==typeof t){const e=t;(t=document.createElement("div")).classList.add(e)}return this.container.insertBefore(t,e),t}blur(){this.selection.setRange(null)}deleteText(t,e,n){return[t,e,,n]=P(t,e,n),D.call(this,(()=>this.editor.deleteText(t,e)),n,t,-1*e)}disable(){this.enable(!1)}editReadOnly(t){this.allowReadOnlyEdits=!0;const e=t();return this.allowReadOnlyEdits=!1,e}enable(){let t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.scroll.enable(t),this.container.classList.toggle("ql-disabled",!t)}focus(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.selection.focus(),t.preventScroll||this.scrollSelectionIntoView()}format(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:N.A.sources.API;return D.call(this,(()=>{const n=this.getSelection(!0);let r=new(o());if(null==n)return r;if(this.scroll.query(t,i.Scope.BLOCK))r=this.editor.formatLine(n.index,n.length,{[t]:e});else{if(0===n.length)return this.selection.format(t,e),r;r=this.editor.formatText(n.index,n.length,{[t]:e})}return this.setSelection(n,N.A.sources.SILENT),r}),n)}formatLine(t,e,n,r,i){let s;return[t,e,s,i]=P(t,e,n,r,i),D.call(this,(()=>this.editor.formatLine(t,e,s)),i,t,0)}formatText(t,e,n,r,i){let s;return[t,e,s,i]=P(t,e,n,r,i),D.call(this,(()=>this.editor.formatText(t,e,s)),i,t,0)}getBounds(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=null;if(n="number"==typeof t?this.selection.getBounds(t,e):this.selection.getBounds(t.index,t.length),!n)return null;const r=this.container.getBoundingClientRect();return{bottom:n.bottom-r.top,height:n.height,left:n.left-r.left,right:n.right-r.left,top:n.top-r.top,width:n.width}}getContents(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.getLength()-t;return[t,e]=P(t,e),this.editor.getContents(t,e)}getFormat(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.getSelection(!0),e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return"number"==typeof t?this.editor.getFormat(t,e):this.editor.getFormat(t.index,t.length)}getIndex(t){return t.offset(this.scroll)}getLength(){return this.scroll.length()}getLeaf(t){return this.scroll.leaf(t)}getLine(t){return this.scroll.line(t)}getLines(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Number.MAX_VALUE;return"number"!=typeof t?this.scroll.lines(t.index,t.length):this.scroll.lines(t,e)}getModule(t){return this.theme.modules[t]}getSelection(){return arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.focus(),this.update(),this.selection.getRange()[0]}getSemanticHTML(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1?arguments[1]:void 0;return"number"==typeof t&&(e=e??this.getLength()-t),[t,e]=P(t,e),this.editor.getHTML(t,e)}getText(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1?arguments[1]:void 0;return"number"==typeof t&&(e=e??this.getLength()-t),[t,e]=P(t,e),this.editor.getText(t,e)}hasFocus(){return this.selection.hasFocus()}insertEmbed(t,e,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:I.sources.API;return D.call(this,(()=>this.editor.insertEmbed(t,e,n)),r,t)}insertText(t,e,n,r,i){let s;return[t,,s,i]=P(t,0,n,r,i),D.call(this,(()=>this.editor.insertText(t,e,s)),i,t,e.length)}isEnabled(){return this.scroll.isEnabled()}off(){return this.emitter.off(...arguments)}on(){return this.emitter.on(...arguments)}once(){return this.emitter.once(...arguments)}removeFormat(t,e,n){return[t,e,,n]=P(t,e,n),D.call(this,(()=>this.editor.removeFormat(t,e)),n,t)}scrollRectIntoView(t){((t,e)=>{const n=t.ownerDocument;let r=e,i=t;for(;i;){const t=i===n.body,e=t?{top:0,right:window.visualViewport?.width??n.documentElement.clientWidth,bottom:window.visualViewport?.height??n.documentElement.clientHeight,left:0}:S(i),o=getComputedStyle(i),l=T(r.left,r.right,e.left,e.right,O(o.scrollPaddingLeft),O(o.scrollPaddingRight)),a=T(r.top,r.bottom,e.top,e.bottom,O(o.scrollPaddingTop),O(o.scrollPaddingBottom));if(l||a)if(t)n.defaultView?.scrollBy(l,a);else{const{scrollLeft:t,scrollTop:e}=i;a&&(i.scrollTop+=a),l&&(i.scrollLeft+=l);const n=i.scrollLeft-t,s=i.scrollTop-e;r={left:r.left-n,top:r.top-s,right:r.right-n,bottom:r.bottom-s}}i=t||"fixed"===o.position?null:(s=i).parentElement||s.getRootNode().host||null}var s})(this.root,t)}scrollIntoView(){console.warn("Quill#scrollIntoView() has been deprecated and will be removed in the near future. Please use Quill#scrollSelectionIntoView() instead."),this.scrollSelectionIntoView()}scrollSelectionIntoView(){const t=this.selection.lastRange,e=t&&this.selection.getBounds(t.index,t.length);e&&this.scrollRectIntoView(e)}setContents(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:N.A.sources.API;return D.call(this,(()=>{t=new(o())(t);const e=this.getLength(),n=this.editor.deleteText(0,e),r=this.editor.insertContents(0,t),i=this.editor.deleteText(this.getLength()-1,1);return n.compose(r).compose(i)}),e)}setSelection(t,e,n){null==t?this.selection.setRange(null,e||I.sources.API):([t,e,,n]=P(t,e,n),this.selection.setRange(new f.Q(Math.max(0,t),e),n),n!==N.A.sources.SILENT&&this.scrollSelectionIntoView())}setText(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:N.A.sources.API;const n=(new(o())).insert(t);return this.setContents(n,e)}update(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:N.A.sources.USER;const e=this.scroll.update(t);return this.selection.update(t),e}updateContents(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:N.A.sources.API;return D.call(this,(()=>(t=new(o())(t),this.editor.applyDelta(t))),e,!0)}}function B(t){return"string"==typeof t?document.querySelector(t):t}function M(t){return Object.entries(t??{}).reduce(((t,e)=>{let[n,r]=e;return{...t,[n]:!0===r?{}:r}}),{})}function U(t){return Object.fromEntries(Object.entries(t).filter((t=>void 0!==t[1])))}function D(t,e,n,r){if(!this.isEnabled()&&e===N.A.sources.USER&&!this.allowReadOnlyEdits)return new(o());let i=null==n?null:this.getSelection();const s=this.editor.delta,l=t();if(null!=i&&(!0===n&&(n=i.index),null==r?i=z(i,l,e):0!==r&&(i=z(i,n,r,e)),this.setSelection(i,N.A.sources.SILENT)),l.length()>0){const t=[N.A.events.TEXT_CHANGE,l,s,e];this.emitter.emit(N.A.events.EDITOR_CHANGE,...t),e!==N.A.sources.SILENT&&this.emitter.emit(...t)}return l}function P(t,e,n,r,i){let s={};return"number"==typeof t.index&&"number"==typeof t.length?"number"!=typeof e?(i=r,r=n,n=e,e=t.length,t=t.index):(e=t.length,t=t.index):"number"!=typeof e&&(i=r,r=n,n=e,e=0),"object"==typeof n?(s=n,i=r):"string"==typeof n&&(null!=r?s[n]=r:i=n),[t,e,s,i=i||N.A.sources.API]}function z(t,e,n,r){const i="number"==typeof n?n:0;if(null==t)return null;let s,o;return e&&"function"==typeof e.transformPosition?[s,o]=[t.index,t.index+t.length].map((t=>e.transformPosition(t,r!==N.A.sources.USER))):[s,o]=[t.index,t.index+t.length].map((t=>t=0?t+i:Math.max(e,t+i))),new f.Q(s,o-s)}},8298:function(t,e,n){"use strict";n.d(e,{Q:function(){return a}});var r=n(6003),i=n(5123),s=n(3707),o=n(5374);const l=(0,n(6078).A)("quill:selection");class a{constructor(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.index=t,this.length=e}}function c(t,e){try{e.parentNode}catch(t){return!1}return t.contains(e)}e.A=class{constructor(t,e){this.emitter=e,this.scroll=t,this.composing=!1,this.mouseDown=!1,this.root=this.scroll.domNode,this.cursor=this.scroll.create("cursor",this),this.savedRange=new a(0,0),this.lastRange=this.savedRange,this.lastNative=null,this.handleComposition(),this.handleDragging(),this.emitter.listenDOM("selectionchange",document,(()=>{this.mouseDown||this.composing||setTimeout(this.update.bind(this,o.A.sources.USER),1)})),this.emitter.on(o.A.events.SCROLL_BEFORE_UPDATE,(()=>{if(!this.hasFocus())return;const t=this.getNativeRange();null!=t&&t.start.node!==this.cursor.textNode&&this.emitter.once(o.A.events.SCROLL_UPDATE,((e,n)=>{try{this.root.contains(t.start.node)&&this.root.contains(t.end.node)&&this.setNativeRange(t.start.node,t.start.offset,t.end.node,t.end.offset);const r=n.some((t=>"characterData"===t.type||"childList"===t.type||"attributes"===t.type&&t.target===this.root));this.update(r?o.A.sources.SILENT:e)}catch(t){}}))})),this.emitter.on(o.A.events.SCROLL_OPTIMIZE,((t,e)=>{if(e.range){const{startNode:t,startOffset:n,endNode:r,endOffset:i}=e.range;this.setNativeRange(t,n,r,i),this.update(o.A.sources.SILENT)}})),this.update(o.A.sources.SILENT)}handleComposition(){this.emitter.on(o.A.events.COMPOSITION_BEFORE_START,(()=>{this.composing=!0})),this.emitter.on(o.A.events.COMPOSITION_END,(()=>{if(this.composing=!1,this.cursor.parent){const t=this.cursor.restore();if(!t)return;setTimeout((()=>{this.setNativeRange(t.startNode,t.startOffset,t.endNode,t.endOffset)}),1)}}))}handleDragging(){this.emitter.listenDOM("mousedown",document.body,(()=>{this.mouseDown=!0})),this.emitter.listenDOM("mouseup",document.body,(()=>{this.mouseDown=!1,this.update(o.A.sources.USER)}))}focus(){this.hasFocus()||(this.root.focus({preventScroll:!0}),this.setRange(this.savedRange))}format(t,e){this.scroll.update();const n=this.getNativeRange();if(null!=n&&n.native.collapsed&&!this.scroll.query(t,r.Scope.BLOCK)){if(n.start.node!==this.cursor.textNode){const t=this.scroll.find(n.start.node,!1);if(null==t)return;if(t instanceof r.LeafBlot){const e=t.split(n.start.offset);t.parent.insertBefore(this.cursor,e)}else t.insertBefore(this.cursor,n.start.node);this.cursor.attach()}this.cursor.format(t,e),this.scroll.optimize(),this.setNativeRange(this.cursor.textNode,this.cursor.textNode.data.length),this.update()}}getBounds(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const n=this.scroll.length();let r;t=Math.min(t,n-1),e=Math.min(t+e,n-1)-t;let[i,s]=this.scroll.leaf(t);if(null==i)return null;if(e>0&&s===i.length()){const[e]=this.scroll.leaf(t+1);if(e){const[n]=this.scroll.line(t),[r]=this.scroll.line(t+1);n===r&&(i=e,s=0)}}[r,s]=i.position(s,!0);const o=document.createRange();if(e>0)return o.setStart(r,s),[i,s]=this.scroll.leaf(t+e),null==i?null:([r,s]=i.position(s,!0),o.setEnd(r,s),o.getBoundingClientRect());let l,a="left";if(r instanceof Text){if(!r.data.length)return null;s0&&(a="right")}return{bottom:l.top+l.height,height:l.height,left:l[a],right:l[a],top:l.top,width:0}}getNativeRange(){const t=document.getSelection();if(null==t||t.rangeCount<=0)return null;const e=t.getRangeAt(0);if(null==e)return null;const n=this.normalizeNative(e);return l.info("getNativeRange",n),n}getRange(){const t=this.scroll.domNode;if("isConnected"in t&&!t.isConnected)return[null,null];const e=this.getNativeRange();return null==e?[null,null]:[this.normalizedToRange(e),e]}hasFocus(){return document.activeElement===this.root||null!=document.activeElement&&c(this.root,document.activeElement)}normalizedToRange(t){const e=[[t.start.node,t.start.offset]];t.native.collapsed||e.push([t.end.node,t.end.offset]);const n=e.map((t=>{const[e,n]=t,i=this.scroll.find(e,!0),s=i.offset(this.scroll);return 0===n?s:i instanceof r.LeafBlot?s+i.index(e,n):s+i.length()})),i=Math.min(Math.max(...n),this.scroll.length()-1),s=Math.min(i,...n);return new a(s,i-s)}normalizeNative(t){if(!c(this.root,t.startContainer)||!t.collapsed&&!c(this.root,t.endContainer))return null;const e={start:{node:t.startContainer,offset:t.startOffset},end:{node:t.endContainer,offset:t.endOffset},native:t};return[e.start,e.end].forEach((t=>{let{node:e,offset:n}=t;for(;!(e instanceof Text)&&e.childNodes.length>0;)if(e.childNodes.length>n)e=e.childNodes[n],n=0;else{if(e.childNodes.length!==n)break;e=e.lastChild,n=e instanceof Text?e.data.length:e.childNodes.length>0?e.childNodes.length:e.childNodes.length+1}t.node=e,t.offset=n})),e}rangeToNative(t){const e=this.scroll.length(),n=(t,n)=>{t=Math.min(e-1,t);const[r,i]=this.scroll.leaf(t);return r?r.position(i,n):[null,-1]};return[...n(t.index,!1),...n(t.index+t.length,!0)]}setNativeRange(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:e,i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(l.info("setNativeRange",t,e,n,r),null!=t&&(null==this.root.parentNode||null==t.parentNode||null==n.parentNode))return;const s=document.getSelection();if(null!=s)if(null!=t){this.hasFocus()||this.root.focus({preventScroll:!0});const{native:o}=this.getNativeRange()||{};if(null==o||i||t!==o.startContainer||e!==o.startOffset||n!==o.endContainer||r!==o.endOffset){t instanceof Element&&"BR"===t.tagName&&(e=Array.from(t.parentNode.childNodes).indexOf(t),t=t.parentNode),n instanceof Element&&"BR"===n.tagName&&(r=Array.from(n.parentNode.childNodes).indexOf(n),n=n.parentNode);const i=document.createRange();i.setStart(t,e),i.setEnd(n,r),s.removeAllRanges(),s.addRange(i)}}else s.removeAllRanges(),this.root.blur()}setRange(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:o.A.sources.API;if("string"==typeof e&&(n=e,e=!1),l.info("setRange",t),null!=t){const n=this.rangeToNative(t);this.setNativeRange(...n,e)}else this.setNativeRange(null);this.update(n)}update(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o.A.sources.USER;const e=this.lastRange,[n,r]=this.getRange();if(this.lastRange=n,this.lastNative=r,null!=this.lastRange&&(this.savedRange=this.lastRange),!(0,i.A)(e,this.lastRange)){if(!this.composing&&null!=r&&r.native.collapsed&&r.start.node!==this.cursor.textNode){const t=this.cursor.restore();t&&this.setNativeRange(t.startNode,t.startOffset,t.endNode,t.endOffset)}const n=[o.A.events.SELECTION_CHANGE,(0,s.A)(this.lastRange),(0,s.A)(e),t];this.emitter.emit(o.A.events.EDITOR_CHANGE,...n),t!==o.A.sources.SILENT&&this.emitter.emit(...n)}}}},9609:function(t,e){"use strict";class n{static DEFAULTS={modules:{}};static themes={default:n};modules={};constructor(t,e){this.quill=t,this.options=e}init(){Object.keys(this.options.modules).forEach((t=>{null==this.modules[t]&&this.addModule(t)}))}addModule(t){const e=this.quill.constructor.import(`modules/${t}`);return this.modules[t]=new e(this.quill,this.options.modules[t]||{}),this.modules[t]}}e.A=n},8276:function(t,e,n){"use strict";n.d(e,{Hu:function(){return l},gS:function(){return s},qh:function(){return o}});var r=n(6003);const i={scope:r.Scope.BLOCK,whitelist:["right","center","justify"]},s=new r.Attributor("align","align",i),o=new r.ClassAttributor("align","ql-align",i),l=new r.StyleAttributor("align","text-align",i)},9541:function(t,e,n){"use strict";n.d(e,{l:function(){return s},s:function(){return o}});var r=n(6003),i=n(8638);const s=new r.ClassAttributor("background","ql-bg",{scope:r.Scope.INLINE}),o=new i.a2("background","background-color",{scope:r.Scope.INLINE})},9404:function(t,e,n){"use strict";n.d(e,{Ay:function(){return h},Cy:function(){return d},EJ:function(){return u}});var r=n(9698),i=n(3036),s=n(4541),o=n(4850),l=n(5508),a=n(580),c=n(6142);class u extends a.A{static create(t){const e=super.create(t);return e.setAttribute("spellcheck","false"),e}code(t,e){return this.children.map((t=>t.length()<=1?"":t.domNode.innerText)).join("\n").slice(t,t+e)}html(t,e){return`
    \n${(0,l.X)(this.code(t,e))}\n
    `}}class h extends r.Ay{static TAB=" ";static register(){c.Ay.register(u)}}class d extends o.A{}d.blotName="code",d.tagName="CODE",h.blotName="code-block",h.className="ql-code-block",h.tagName="DIV",u.blotName="code-block-container",u.className="ql-code-block-container",u.tagName="DIV",u.allowedChildren=[h],h.allowedChildren=[l.A,i.A,s.A],h.requiredContainer=u},8638:function(t,e,n){"use strict";n.d(e,{JM:function(){return o},a2:function(){return i},g3:function(){return s}});var r=n(6003);class i extends r.StyleAttributor{value(t){let e=super.value(t);return e.startsWith("rgb(")?(e=e.replace(/^[^\d]+/,"").replace(/[^\d]+$/,""),`#${e.split(",").map((t=>`00${parseInt(t,10).toString(16)}`.slice(-2))).join("")}`):e}}const s=new r.ClassAttributor("color","ql-color",{scope:r.Scope.INLINE}),o=new i("color","color",{scope:r.Scope.INLINE})},7912:function(t,e,n){"use strict";n.d(e,{Mc:function(){return s},VL:function(){return l},sY:function(){return o}});var r=n(6003);const i={scope:r.Scope.BLOCK,whitelist:["rtl"]},s=new r.Attributor("direction","dir",i),o=new r.ClassAttributor("direction","ql-direction",i),l=new r.StyleAttributor("direction","direction",i)},6772:function(t,e,n){"use strict";n.d(e,{q:function(){return s},z:function(){return l}});var r=n(6003);const i={scope:r.Scope.INLINE,whitelist:["serif","monospace"]},s=new r.ClassAttributor("font","ql-font",i);class o extends r.StyleAttributor{value(t){return super.value(t).replace(/["']/g,"")}}const l=new o("font","font-family",i)},664:function(t,e,n){"use strict";n.d(e,{U:function(){return i},r:function(){return s}});var r=n(6003);const i=new r.ClassAttributor("size","ql-size",{scope:r.Scope.INLINE,whitelist:["small","large","huge"]}),s=new r.StyleAttributor("size","font-size",{scope:r.Scope.INLINE,whitelist:["10px","18px","32px"]})},584:function(t,e,n){"use strict";n.d(e,{Ay:function(){return S},hV:function(){return I}});var r=n(6003),i=n(5232),s=n.n(i),o=n(9698),l=n(6078),a=n(4266),c=n(6142),u=n(8276),h=n(9541),d=n(9404),f=n(8638),p=n(7912),g=n(6772),m=n(664),b=n(8123);const y=/font-weight:\s*normal/,v=["P","OL","UL"],A=t=>t&&v.includes(t.tagName),x=/\bmso-list:[^;]*ignore/i,N=/\bmso-list:[^;]*\bl(\d+)/i,E=/\bmso-list:[^;]*\blevel(\d+)/i,w=[function(t){"urn:schemas-microsoft-com:office:word"===t.documentElement.getAttribute("xmlns:w")&&(t=>{const e=Array.from(t.querySelectorAll("[style*=mso-list]")),n=[],r=[];e.forEach((t=>{(t.getAttribute("style")||"").match(x)?n.push(t):r.push(t)})),n.forEach((t=>t.parentNode?.removeChild(t)));const i=t.documentElement.innerHTML,s=r.map((t=>((t,e)=>{const n=t.getAttribute("style"),r=n?.match(N);if(!r)return null;const i=Number(r[1]),s=n?.match(E),o=s?Number(s[1]):1,l=new RegExp(`@list l${i}:level${o}\\s*\\{[^\\}]*mso-level-number-format:\\s*([\\w-]+)`,"i"),a=e.match(l);return{id:i,indent:o,type:a&&"bullet"===a[1]?"bullet":"ordered",element:t}})(t,i))).filter((t=>t));for(;s.length;){const t=[];let e=s.shift();for(;e;)t.push(e),e=s.length&&s[0]?.element===e.element.nextElementSibling&&s[0].id===e.id?s.shift():null;const n=document.createElement("ul");t.forEach((t=>{const e=document.createElement("li");e.setAttribute("data-list",t.type),t.indent>1&&e.setAttribute("class","ql-indent-"+(t.indent-1)),e.innerHTML=t.element.innerHTML,n.appendChild(e)}));const r=t[0]?.element,{parentNode:i}=r??{};r&&i?.replaceChild(n,r),t.slice(1).forEach((t=>{let{element:e}=t;i?.removeChild(e)}))}})(t)},function(t){t.querySelector('[id^="docs-internal-guid-"]')&&((t=>{Array.from(t.querySelectorAll('b[style*="font-weight"]')).filter((t=>t.getAttribute("style")?.match(y))).forEach((e=>{const n=t.createDocumentFragment();n.append(...e.childNodes),e.parentNode?.replaceChild(n,e)}))})(t),(t=>{Array.from(t.querySelectorAll("br")).filter((t=>A(t.previousElementSibling)&&A(t.nextElementSibling))).forEach((t=>{t.parentNode?.removeChild(t)}))})(t))}];const q=(0,l.A)("quill:clipboard"),k=[[Node.TEXT_NODE,function(t,e,n){let r=t.data;if("O:P"===t.parentElement?.tagName)return e.insert(r.trim());if(!R(t)){if(0===r.trim().length&&r.includes("\n")&&!function(t,e){return t.previousElementSibling&&t.nextElementSibling&&!j(t.previousElementSibling,e)&&!j(t.nextElementSibling,e)}(t,n))return e;const i=(t,e)=>{const n=e.replace(/[^\u00a0]/g,"");return n.length<1&&t?" ":n};r=r.replace(/\r\n/g," ").replace(/\n/g," "),r=r.replace(/\s\s+/g,i.bind(i,!0)),(null==t.previousSibling&&null!=t.parentElement&&j(t.parentElement,n)||t.previousSibling instanceof Element&&j(t.previousSibling,n))&&(r=r.replace(/^\s+/,i.bind(i,!1))),(null==t.nextSibling&&null!=t.parentElement&&j(t.parentElement,n)||t.nextSibling instanceof Element&&j(t.nextSibling,n))&&(r=r.replace(/\s+$/,i.bind(i,!1)))}return e.insert(r)}],[Node.TEXT_NODE,M],["br",function(t,e){return T(e,"\n")||e.insert("\n"),e}],[Node.ELEMENT_NODE,M],[Node.ELEMENT_NODE,function(t,e,n){const i=n.query(t);if(null==i)return e;if(i.prototype instanceof r.EmbedBlot){const e={},r=i.value(t);if(null!=r)return e[i.blotName]=r,(new(s())).insert(e,i.formats(t,n))}else if(i.prototype instanceof r.BlockBlot&&!T(e,"\n")&&e.insert("\n"),"blotName"in i&&"formats"in i&&"function"==typeof i.formats)return O(e,i.blotName,i.formats(t,n),n);return e}],[Node.ELEMENT_NODE,function(t,e,n){const i=r.Attributor.keys(t),s=r.ClassAttributor.keys(t),o=r.StyleAttributor.keys(t),l={};return i.concat(s).concat(o).forEach((e=>{let i=n.query(e,r.Scope.ATTRIBUTE);null!=i&&(l[i.attrName]=i.value(t),l[i.attrName])||(i=_[e],null==i||i.attrName!==e&&i.keyName!==e||(l[i.attrName]=i.value(t)||void 0),i=L[e],null==i||i.attrName!==e&&i.keyName!==e||(i=L[e],l[i.attrName]=i.value(t)||void 0))})),Object.entries(l).reduce(((t,e)=>{let[r,i]=e;return O(t,r,i,n)}),e)}],[Node.ELEMENT_NODE,function(t,e,n){const r={},i=t.style||{};return"italic"===i.fontStyle&&(r.italic=!0),"underline"===i.textDecoration&&(r.underline=!0),"line-through"===i.textDecoration&&(r.strike=!0),(i.fontWeight?.startsWith("bold")||parseInt(i.fontWeight,10)>=700)&&(r.bold=!0),e=Object.entries(r).reduce(((t,e)=>{let[r,i]=e;return O(t,r,i,n)}),e),parseFloat(i.textIndent||0)>0?(new(s())).insert("\t").concat(e):e}],["li",function(t,e,n){const r=n.query(t);if(null==r||"list"!==r.blotName||!T(e,"\n"))return e;let i=-1,o=t.parentNode;for(;null!=o;)["OL","UL"].includes(o.tagName)&&(i+=1),o=o.parentNode;return i<=0?e:e.reduce(((t,e)=>e.insert?e.attributes&&"number"==typeof e.attributes.indent?t.push(e):t.insert(e.insert,{indent:i,...e.attributes||{}}):t),new(s()))}],["ol, ul",function(t,e,n){const r=t;let i="OL"===r.tagName?"ordered":"bullet";const s=r.getAttribute("data-checked");return s&&(i="true"===s?"checked":"unchecked"),O(e,"list",i,n)}],["pre",function(t,e,n){const r=n.query("code-block");return O(e,"code-block",!r||!("formats"in r)||"function"!=typeof r.formats||r.formats(t,n),n)}],["tr",function(t,e,n){const r="TABLE"===t.parentElement?.tagName?t.parentElement:t.parentElement?.parentElement;return null!=r?O(e,"table",Array.from(r.querySelectorAll("tr")).indexOf(t)+1,n):e}],["b",B("bold")],["i",B("italic")],["strike",B("strike")],["style",function(){return new(s())}]],_=[u.gS,p.Mc].reduce(((t,e)=>(t[e.keyName]=e,t)),{}),L=[u.Hu,h.s,f.JM,p.VL,g.z,m.r].reduce(((t,e)=>(t[e.keyName]=e,t)),{});class S extends a.A{static DEFAULTS={matchers:[]};constructor(t,e){super(t,e),this.quill.root.addEventListener("copy",(t=>this.onCaptureCopy(t,!1))),this.quill.root.addEventListener("cut",(t=>this.onCaptureCopy(t,!0))),this.quill.root.addEventListener("paste",this.onCapturePaste.bind(this)),this.matchers=[],k.concat(this.options.matchers??[]).forEach((t=>{let[e,n]=t;this.addMatcher(e,n)}))}addMatcher(t,e){this.matchers.push([t,e])}convert(t){let{html:e,text:n}=t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(r[d.Ay.blotName])return(new(s())).insert(n||"",{[d.Ay.blotName]:r[d.Ay.blotName]});if(!e)return(new(s())).insert(n||"",r);const i=this.convertHTML(e);return T(i,"\n")&&(null==i.ops[i.ops.length-1].attributes||r.table)?i.compose((new(s())).retain(i.length()-1).delete(1)):i}normalizeHTML(t){(t=>{t.documentElement&&w.forEach((e=>{e(t)}))})(t)}convertHTML(t){const e=(new DOMParser).parseFromString(t,"text/html");this.normalizeHTML(e);const n=e.body,r=new WeakMap,[i,s]=this.prepareMatching(n,r);return I(this.quill.scroll,n,i,s,r)}dangerouslyPasteHTML(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:c.Ay.sources.API;if("string"==typeof t){const n=this.convert({html:t,text:""});this.quill.setContents(n,e),this.quill.setSelection(0,c.Ay.sources.SILENT)}else{const r=this.convert({html:e,text:""});this.quill.updateContents((new(s())).retain(t).concat(r),n),this.quill.setSelection(t+r.length(),c.Ay.sources.SILENT)}}onCaptureCopy(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(t.defaultPrevented)return;t.preventDefault();const[n]=this.quill.selection.getRange();if(null==n)return;const{html:r,text:i}=this.onCopy(n,e);t.clipboardData?.setData("text/plain",i),t.clipboardData?.setData("text/html",r),e&&(0,b.Xo)({range:n,quill:this.quill})}normalizeURIList(t){return t.split(/\r?\n/).filter((t=>"#"!==t[0])).join("\n")}onCapturePaste(t){if(t.defaultPrevented||!this.quill.isEnabled())return;t.preventDefault();const e=this.quill.getSelection(!0);if(null==e)return;const n=t.clipboardData?.getData("text/html");let r=t.clipboardData?.getData("text/plain");if(!n&&!r){const e=t.clipboardData?.getData("text/uri-list");e&&(r=this.normalizeURIList(e))}const i=Array.from(t.clipboardData?.files||[]);if(!n&&i.length>0)this.quill.uploader.upload(e,i);else{if(n&&i.length>0){const t=(new DOMParser).parseFromString(n,"text/html");if(1===t.body.childElementCount&&"IMG"===t.body.firstElementChild?.tagName)return void this.quill.uploader.upload(e,i)}this.onPaste(e,{html:n,text:r})}}onCopy(t){const e=this.quill.getText(t);return{html:this.quill.getSemanticHTML(t),text:e}}onPaste(t,e){let{text:n,html:r}=e;const i=this.quill.getFormat(t.index),o=this.convert({text:n,html:r},i);q.log("onPaste",o,{text:n,html:r});const l=(new(s())).retain(t.index).delete(t.length).concat(o);this.quill.updateContents(l,c.Ay.sources.USER),this.quill.setSelection(l.length()-t.length,c.Ay.sources.SILENT),this.quill.scrollSelectionIntoView()}prepareMatching(t,e){const n=[],r=[];return this.matchers.forEach((i=>{const[s,o]=i;switch(s){case Node.TEXT_NODE:r.push(o);break;case Node.ELEMENT_NODE:n.push(o);break;default:Array.from(t.querySelectorAll(s)).forEach((t=>{if(e.has(t)){const n=e.get(t);n?.push(o)}else e.set(t,[o])}))}})),[n,r]}}function O(t,e,n,r){return r.query(e)?t.reduce(((t,r)=>{if(!r.insert)return t;if(r.attributes&&r.attributes[e])return t.push(r);const i=n?{[e]:n}:{};return t.insert(r.insert,{...i,...r.attributes})}),new(s())):t}function T(t,e){let n="";for(let r=t.ops.length-1;r>=0&&n.lengthr(e,n,t)),new(s())):e.nodeType===e.ELEMENT_NODE?Array.from(e.childNodes||[]).reduce(((s,o)=>{let l=I(t,o,n,r,i);return o.nodeType===e.ELEMENT_NODE&&(l=n.reduce(((e,n)=>n(o,e,t)),l),l=(i.get(o)||[]).reduce(((e,n)=>n(o,e,t)),l)),s.concat(l)}),new(s())):new(s())}function B(t){return(e,n,r)=>O(n,t,!0,r)}function M(t,e,n){if(!T(e,"\n")){if(j(t,n)&&(t.childNodes.length>0||t instanceof HTMLParagraphElement))return e.insert("\n");if(e.length()>0&&t.nextSibling){let r=t.nextSibling;for(;null!=r;){if(j(r,n))return e.insert("\n");const t=n.query(r);if(t&&t.prototype instanceof o.zo)return e.insert("\n");r=r.firstChild}}}return e}},8123:function(t,e,n){"use strict";n.d(e,{Ay:function(){return f},Xo:function(){return v}});var r=n(5123),i=n(3707),s=n(5232),o=n.n(s),l=n(6003),a=n(6142),c=n(6078),u=n(4266);const h=(0,c.A)("quill:keyboard"),d=/Mac/i.test(navigator.platform)?"metaKey":"ctrlKey";class f extends u.A{static match(t,e){return!["altKey","ctrlKey","metaKey","shiftKey"].some((n=>!!e[n]!==t[n]&&null!==e[n]))&&(e.key===t.key||e.key===t.which)}constructor(t,e){super(t,e),this.bindings={},Object.keys(this.options.bindings).forEach((t=>{this.options.bindings[t]&&this.addBinding(this.options.bindings[t])})),this.addBinding({key:"Enter",shiftKey:null},this.handleEnter),this.addBinding({key:"Enter",metaKey:null,ctrlKey:null,altKey:null},(()=>{})),/Firefox/i.test(navigator.userAgent)?(this.addBinding({key:"Backspace"},{collapsed:!0},this.handleBackspace),this.addBinding({key:"Delete"},{collapsed:!0},this.handleDelete)):(this.addBinding({key:"Backspace"},{collapsed:!0,prefix:/^.?$/},this.handleBackspace),this.addBinding({key:"Delete"},{collapsed:!0,suffix:/^.?$/},this.handleDelete)),this.addBinding({key:"Backspace"},{collapsed:!1},this.handleDeleteRange),this.addBinding({key:"Delete"},{collapsed:!1},this.handleDeleteRange),this.addBinding({key:"Backspace",altKey:null,ctrlKey:null,metaKey:null,shiftKey:null},{collapsed:!0,offset:0},this.handleBackspace),this.listen()}addBinding(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const r=function(t){if("string"==typeof t||"number"==typeof t)t={key:t};else{if("object"!=typeof t)return null;t=(0,i.A)(t)}return t.shortKey&&(t[d]=t.shortKey,delete t.shortKey),t}(t);null!=r?("function"==typeof e&&(e={handler:e}),"function"==typeof n&&(n={handler:n}),(Array.isArray(r.key)?r.key:[r.key]).forEach((t=>{const i={...r,key:t,...e,...n};this.bindings[i.key]=this.bindings[i.key]||[],this.bindings[i.key].push(i)}))):h.warn("Attempted to add invalid keyboard binding",r)}listen(){this.quill.root.addEventListener("keydown",(t=>{if(t.defaultPrevented||t.isComposing)return;if(229===t.keyCode&&("Enter"===t.key||"Backspace"===t.key))return;const e=(this.bindings[t.key]||[]).concat(this.bindings[t.which]||[]).filter((e=>f.match(t,e)));if(0===e.length)return;const n=a.Ay.find(t.target,!0);if(n&&n.scroll!==this.quill.scroll)return;const i=this.quill.getSelection();if(null==i||!this.quill.hasFocus())return;const[s,o]=this.quill.getLine(i.index),[c,u]=this.quill.getLeaf(i.index),[h,d]=0===i.length?[c,u]:this.quill.getLeaf(i.index+i.length),p=c instanceof l.TextBlot?c.value().slice(0,u):"",g=h instanceof l.TextBlot?h.value().slice(d):"",m={collapsed:0===i.length,empty:0===i.length&&s.length()<=1,format:this.quill.getFormat(i),line:s,offset:o,prefix:p,suffix:g,event:t};e.some((t=>{if(null!=t.collapsed&&t.collapsed!==m.collapsed)return!1;if(null!=t.empty&&t.empty!==m.empty)return!1;if(null!=t.offset&&t.offset!==m.offset)return!1;if(Array.isArray(t.format)){if(t.format.every((t=>null==m.format[t])))return!1}else if("object"==typeof t.format&&!Object.keys(t.format).every((e=>!0===t.format[e]?null!=m.format[e]:!1===t.format[e]?null==m.format[e]:(0,r.A)(t.format[e],m.format[e]))))return!1;return!(null!=t.prefix&&!t.prefix.test(m.prefix)||null!=t.suffix&&!t.suffix.test(m.suffix)||!0===t.handler.call(this,i,m,t))}))&&t.preventDefault()}))}handleBackspace(t,e){const n=/[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(e.prefix)?2:1;if(0===t.index||this.quill.getLength()<=1)return;let r={};const[i]=this.quill.getLine(t.index);let l=(new(o())).retain(t.index-n).delete(n);if(0===e.offset){const[e]=this.quill.getLine(t.index-1);if(e&&!("block"===e.statics.blotName&&e.length()<=1)){const e=i.formats(),n=this.quill.getFormat(t.index-1,1);if(r=s.AttributeMap.diff(e,n)||{},Object.keys(r).length>0){const e=(new(o())).retain(t.index+i.length()-2).retain(1,r);l=l.compose(e)}}}this.quill.updateContents(l,a.Ay.sources.USER),this.quill.focus()}handleDelete(t,e){const n=/^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(e.suffix)?2:1;if(t.index>=this.quill.getLength()-n)return;let r={};const[i]=this.quill.getLine(t.index);let l=(new(o())).retain(t.index).delete(n);if(e.offset>=i.length()-1){const[e]=this.quill.getLine(t.index+1);if(e){const n=i.formats(),o=this.quill.getFormat(t.index,1);r=s.AttributeMap.diff(n,o)||{},Object.keys(r).length>0&&(l=l.retain(e.length()-1).retain(1,r))}}this.quill.updateContents(l,a.Ay.sources.USER),this.quill.focus()}handleDeleteRange(t){v({range:t,quill:this.quill}),this.quill.focus()}handleEnter(t,e){const n=Object.keys(e.format).reduce(((t,n)=>(this.quill.scroll.query(n,l.Scope.BLOCK)&&!Array.isArray(e.format[n])&&(t[n]=e.format[n]),t)),{}),r=(new(o())).retain(t.index).delete(t.length).insert("\n",n);this.quill.updateContents(r,a.Ay.sources.USER),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),this.quill.focus()}}const p={bindings:{bold:b("bold"),italic:b("italic"),underline:b("underline"),indent:{key:"Tab",format:["blockquote","indent","list"],handler(t,e){return!(!e.collapsed||0===e.offset)||(this.quill.format("indent","+1",a.Ay.sources.USER),!1)}},outdent:{key:"Tab",shiftKey:!0,format:["blockquote","indent","list"],handler(t,e){return!(!e.collapsed||0===e.offset)||(this.quill.format("indent","-1",a.Ay.sources.USER),!1)}},"outdent backspace":{key:"Backspace",collapsed:!0,shiftKey:null,metaKey:null,ctrlKey:null,altKey:null,format:["indent","list"],offset:0,handler(t,e){null!=e.format.indent?this.quill.format("indent","-1",a.Ay.sources.USER):null!=e.format.list&&this.quill.format("list",!1,a.Ay.sources.USER)}},"indent code-block":g(!0),"outdent code-block":g(!1),"remove tab":{key:"Tab",shiftKey:!0,collapsed:!0,prefix:/\t$/,handler(t){this.quill.deleteText(t.index-1,1,a.Ay.sources.USER)}},tab:{key:"Tab",handler(t,e){if(e.format.table)return!0;this.quill.history.cutoff();const n=(new(o())).retain(t.index).delete(t.length).insert("\t");return this.quill.updateContents(n,a.Ay.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),!1}},"blockquote empty enter":{key:"Enter",collapsed:!0,format:["blockquote"],empty:!0,handler(){this.quill.format("blockquote",!1,a.Ay.sources.USER)}},"list empty enter":{key:"Enter",collapsed:!0,format:["list"],empty:!0,handler(t,e){const n={list:!1};e.format.indent&&(n.indent=!1),this.quill.formatLine(t.index,t.length,n,a.Ay.sources.USER)}},"checklist enter":{key:"Enter",collapsed:!0,format:{list:"checked"},handler(t){const[e,n]=this.quill.getLine(t.index),r={...e.formats(),list:"checked"},i=(new(o())).retain(t.index).insert("\n",r).retain(e.length()-n-1).retain(1,{list:"unchecked"});this.quill.updateContents(i,a.Ay.sources.USER),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),this.quill.scrollSelectionIntoView()}},"header enter":{key:"Enter",collapsed:!0,format:["header"],suffix:/^$/,handler(t,e){const[n,r]=this.quill.getLine(t.index),i=(new(o())).retain(t.index).insert("\n",e.format).retain(n.length()-r-1).retain(1,{header:null});this.quill.updateContents(i,a.Ay.sources.USER),this.quill.setSelection(t.index+1,a.Ay.sources.SILENT),this.quill.scrollSelectionIntoView()}},"table backspace":{key:"Backspace",format:["table"],collapsed:!0,offset:0,handler(){}},"table delete":{key:"Delete",format:["table"],collapsed:!0,suffix:/^$/,handler(){}},"table enter":{key:"Enter",shiftKey:null,format:["table"],handler(t){const e=this.quill.getModule("table");if(e){const[n,r,i,s]=e.getTable(t),l=function(t,e,n,r){return null==e.prev&&null==e.next?null==n.prev&&null==n.next?0===r?-1:1:null==n.prev?-1:1:null==e.prev?-1:null==e.next?1:null}(0,r,i,s);if(null==l)return;let c=n.offset();if(l<0){const e=(new(o())).retain(c).insert("\n");this.quill.updateContents(e,a.Ay.sources.USER),this.quill.setSelection(t.index+1,t.length,a.Ay.sources.SILENT)}else if(l>0){c+=n.length();const t=(new(o())).retain(c).insert("\n");this.quill.updateContents(t,a.Ay.sources.USER),this.quill.setSelection(c,a.Ay.sources.USER)}}}},"table tab":{key:"Tab",shiftKey:null,format:["table"],handler(t,e){const{event:n,line:r}=e,i=r.offset(this.quill.scroll);n.shiftKey?this.quill.setSelection(i-1,a.Ay.sources.USER):this.quill.setSelection(i+r.length(),a.Ay.sources.USER)}},"list autofill":{key:" ",shiftKey:null,collapsed:!0,format:{"code-block":!1,blockquote:!1,table:!1},prefix:/^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/,handler(t,e){if(null==this.quill.scroll.query("list"))return!0;const{length:n}=e.prefix,[r,i]=this.quill.getLine(t.index);if(i>n)return!0;let s;switch(e.prefix.trim()){case"[]":case"[ ]":s="unchecked";break;case"[x]":s="checked";break;case"-":case"*":s="bullet";break;default:s="ordered"}this.quill.insertText(t.index," ",a.Ay.sources.USER),this.quill.history.cutoff();const l=(new(o())).retain(t.index-i).delete(n+1).retain(r.length()-2-i).retain(1,{list:s});return this.quill.updateContents(l,a.Ay.sources.USER),this.quill.history.cutoff(),this.quill.setSelection(t.index-n,a.Ay.sources.SILENT),!1}},"code exit":{key:"Enter",collapsed:!0,format:["code-block"],prefix:/^$/,suffix:/^\s*$/,handler(t){const[e,n]=this.quill.getLine(t.index);let r=2,i=e;for(;null!=i&&i.length()<=1&&i.formats()["code-block"];)if(i=i.prev,r-=1,r<=0){const r=(new(o())).retain(t.index+e.length()-n-2).retain(1,{"code-block":null}).delete(1);return this.quill.updateContents(r,a.Ay.sources.USER),this.quill.setSelection(t.index-1,a.Ay.sources.SILENT),!1}return!0}},"embed left":m("ArrowLeft",!1),"embed left shift":m("ArrowLeft",!0),"embed right":m("ArrowRight",!1),"embed right shift":m("ArrowRight",!0),"table down":y(!1),"table up":y(!0)}};function g(t){return{key:"Tab",shiftKey:!t,format:{"code-block":!0},handler(e,n){let{event:r}=n;const i=this.quill.scroll.query("code-block"),{TAB:s}=i;if(0===e.length&&!r.shiftKey)return this.quill.insertText(e.index,s,a.Ay.sources.USER),void this.quill.setSelection(e.index+s.length,a.Ay.sources.SILENT);const o=0===e.length?this.quill.getLines(e.index,1):this.quill.getLines(e);let{index:l,length:c}=e;o.forEach(((e,n)=>{t?(e.insertAt(0,s),0===n?l+=s.length:c+=s.length):e.domNode.textContent.startsWith(s)&&(e.deleteAt(0,s.length),0===n?l-=s.length:c-=s.length)})),this.quill.update(a.Ay.sources.USER),this.quill.setSelection(l,c,a.Ay.sources.SILENT)}}}function m(t,e){return{key:t,shiftKey:e,altKey:null,["ArrowLeft"===t?"prefix":"suffix"]:/^$/,handler(n){let{index:r}=n;"ArrowRight"===t&&(r+=n.length+1);const[i]=this.quill.getLeaf(r);return!(i instanceof l.EmbedBlot&&("ArrowLeft"===t?e?this.quill.setSelection(n.index-1,n.length+1,a.Ay.sources.USER):this.quill.setSelection(n.index-1,a.Ay.sources.USER):e?this.quill.setSelection(n.index,n.length+1,a.Ay.sources.USER):this.quill.setSelection(n.index+n.length+1,a.Ay.sources.USER),1))}}}function b(t){return{key:t[0],shortKey:!0,handler(e,n){this.quill.format(t,!n.format[t],a.Ay.sources.USER)}}}function y(t){return{key:t?"ArrowUp":"ArrowDown",collapsed:!0,format:["table"],handler(e,n){const r=t?"prev":"next",i=n.line,s=i.parent[r];if(null!=s){if("table-row"===s.statics.blotName){let t=s.children.head,e=i;for(;null!=e.prev;)e=e.prev,t=t.next;const r=t.offset(this.quill.scroll)+Math.min(n.offset,t.length()-1);this.quill.setSelection(r,0,a.Ay.sources.USER)}}else{const e=i.table()[r];null!=e&&(t?this.quill.setSelection(e.offset(this.quill.scroll)+e.length()-1,0,a.Ay.sources.USER):this.quill.setSelection(e.offset(this.quill.scroll),0,a.Ay.sources.USER))}return!1}}}function v(t){let{quill:e,range:n}=t;const r=e.getLines(n);let i={};if(r.length>1){const t=r[0].formats(),e=r[r.length-1].formats();i=s.AttributeMap.diff(e,t)||{}}e.deleteText(n,a.Ay.sources.USER),Object.keys(i).length>0&&e.formatLine(n.index,1,i,a.Ay.sources.USER),e.setSelection(n.index,a.Ay.sources.SILENT)}f.DEFAULTS=p},8920:function(t){"use strict";var e=Object.prototype.hasOwnProperty,n="~";function r(){}function i(t,e,n){this.fn=t,this.context=e,this.once=n||!1}function s(t,e,r,s,o){if("function"!=typeof r)throw new TypeError("The listener must be a function");var l=new i(r,s||t,o),a=n?n+e:e;return t._events[a]?t._events[a].fn?t._events[a]=[t._events[a],l]:t._events[a].push(l):(t._events[a]=l,t._eventsCount++),t}function o(t,e){0==--t._eventsCount?t._events=new r:delete t._events[e]}function l(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),l.prototype.eventNames=function(){var t,r,i=[];if(0===this._eventsCount)return i;for(r in t=this._events)e.call(t,r)&&i.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?i.concat(Object.getOwnPropertySymbols(t)):i},l.prototype.listeners=function(t){var e=n?n+t:t,r=this._events[e];if(!r)return[];if(r.fn)return[r.fn];for(var i=0,s=r.length,o=new Array(s);io)){var d=e.slice(0,h);if((g=e.slice(h))===c){var f=Math.min(l,h);if((b=a.slice(0,f))===(A=d.slice(0,f)))return v(b,a.slice(f),d.slice(f),c)}}if(null===u||u===l){var p=l,g=(d=e.slice(0,p),e.slice(p));if(d===a){var m=Math.min(s-p,o-p);if((y=c.slice(c.length-m))===(x=g.slice(g.length-m)))return v(a,c.slice(0,c.length-m),g.slice(0,g.length-m),y)}}}if(r.length>0&&i&&0===i.length){var b=t.slice(0,r.index),y=t.slice(r.index+r.length);if(!(o<(f=b.length)+(m=y.length))){var A=e.slice(0,f),x=e.slice(o-m);if(b===A&&y===x)return v(b,t.slice(f,s-m),e.slice(f,o-m),y)}}return null}(t,g,m);if(A)return A}var x=o(t,g),N=t.substring(0,x);x=a(t=t.substring(x),g=g.substring(x));var E=t.substring(t.length-x),w=function(t,l){var c;if(!t)return[[n,l]];if(!l)return[[e,t]];var u=t.length>l.length?t:l,h=t.length>l.length?l:t,d=u.indexOf(h);if(-1!==d)return c=[[n,u.substring(0,d)],[r,h],[n,u.substring(d+h.length)]],t.length>l.length&&(c[0][0]=c[2][0]=e),c;if(1===h.length)return[[e,t],[n,l]];var f=function(t,e){var n=t.length>e.length?t:e,r=t.length>e.length?e:t;if(n.length<4||2*r.length=t.length?[r,i,s,l,h]:null}var s,l,c,u,h,d=i(n,r,Math.ceil(n.length/4)),f=i(n,r,Math.ceil(n.length/2));return d||f?(s=f?d&&d[4].length>f[4].length?d:f:d,t.length>e.length?(l=s[0],c=s[1],u=s[2],h=s[3]):(u=s[0],h=s[1],l=s[2],c=s[3]),[l,c,u,h,s[4]]):null}(t,l);if(f){var p=f[0],g=f[1],m=f[2],b=f[3],y=f[4],v=i(p,m),A=i(g,b);return v.concat([[r,y]],A)}return function(t,r){for(var i=t.length,o=r.length,l=Math.ceil((i+o)/2),a=l,c=2*l,u=new Array(c),h=new Array(c),d=0;di)m+=2;else if(N>o)g+=2;else if(p&&(q=a+f-A)>=0&&q=(w=i-h[q]))return s(t,r,_,N)}for(var E=-v+b;E<=v-y;E+=2){for(var w,q=a+E,k=(w=E===-v||E!==v&&h[q-1]i)y+=2;else if(k>o)b+=2;else if(!p){var _;if((x=a+f-E)>=0&&x=(w=i-w))return s(t,r,_,N)}}}return[[e,t],[n,r]]}(t,l)}(t=t.substring(0,t.length-x),g=g.substring(0,g.length-x));return N&&w.unshift([r,N]),E&&w.push([r,E]),p(w,y),b&&function(t){for(var i=!1,s=[],o=0,g=null,m=0,b=0,y=0,v=0,A=0;m0?s[o-1]:-1,b=0,y=0,v=0,A=0,g=null,i=!0)),m++;for(i&&p(t),function(t){function e(t,e){if(!t||!e)return 6;var n=t.charAt(t.length-1),r=e.charAt(0),i=n.match(c),s=r.match(c),o=i&&n.match(u),l=s&&r.match(u),a=o&&n.match(h),p=l&&r.match(h),g=a&&t.match(d),m=p&&e.match(f);return g||m?5:a||p?4:i&&!o&&l?3:o||l?2:i||s?1:0}for(var n=1;n=y&&(y=v,g=i,m=s,b=o)}t[n-1][1]!=g&&(g?t[n-1][1]=g:(t.splice(n-1,1),n--),t[n][1]=m,b?t[n+1][1]=b:(t.splice(n+1,1),n--))}n++}}(t),m=1;m=w?(E>=x.length/2||E>=N.length/2)&&(t.splice(m,0,[r,N.substring(0,E)]),t[m-1][1]=x.substring(0,x.length-E),t[m+1][1]=N.substring(E),m++):(w>=x.length/2||w>=N.length/2)&&(t.splice(m,0,[r,x.substring(0,w)]),t[m-1][0]=n,t[m-1][1]=N.substring(0,N.length-w),t[m+1][0]=e,t[m+1][1]=x.substring(w),m++),m++}m++}}(w),w}function s(t,e,n,r){var s=t.substring(0,n),o=e.substring(0,r),l=t.substring(n),a=e.substring(r),c=i(s,o),u=i(l,a);return c.concat(u)}function o(t,e){if(!t||!e||t.charAt(0)!==e.charAt(0))return 0;for(var n=0,r=Math.min(t.length,e.length),i=r,s=0;nr?t=t.substring(n-r):n=0&&y(t[f][1])){var g=t[f][1].slice(-1);if(t[f][1]=t[f][1].slice(0,-1),h=g+h,d=g+d,!t[f][1]){t.splice(f,1),l--;var m=f-1;t[m]&&t[m][0]===n&&(u++,d=t[m][1]+d,m--),t[m]&&t[m][0]===e&&(c++,h=t[m][1]+h,m--),f=m}}b(t[l][1])&&(g=t[l][1].charAt(0),t[l][1]=t[l][1].slice(1),h+=g,d+=g)}if(l0||d.length>0){h.length>0&&d.length>0&&(0!==(s=o(d,h))&&(f>=0?t[f][1]+=d.substring(0,s):(t.splice(0,0,[r,d.substring(0,s)]),l++),d=d.substring(s),h=h.substring(s)),0!==(s=a(d,h))&&(t[l][1]=d.substring(d.length-s)+t[l][1],d=d.substring(0,d.length-s),h=h.substring(0,h.length-s)));var v=u+c;0===h.length&&0===d.length?(t.splice(l-v,v),l-=v):0===h.length?(t.splice(l-v,v,[n,d]),l=l-v+1):0===d.length?(t.splice(l-v,v,[e,h]),l=l-v+1):(t.splice(l-v,v,[e,h],[n,d]),l=l-v+2)}0!==l&&t[l-1][0]===r?(t[l-1][1]+=t[l][1],t.splice(l,1)):l++,u=0,c=0,h="",d=""}""===t[t.length-1][1]&&t.pop();var A=!1;for(l=1;l=55296&&t<=56319}function m(t){return t>=56320&&t<=57343}function b(t){return m(t.charCodeAt(0))}function y(t){return g(t.charCodeAt(t.length-1))}function v(t,i,s,o){return y(t)||b(o)?null:function(t){for(var e=[],n=0;n0&&e.push(t[n]);return e}([[r,t],[e,i],[n,s],[r,o]])}function A(t,e,n,r){return i(t,e,n,r,!0)}A.INSERT=n,A.DELETE=e,A.EQUAL=r,t.exports=A},9629:function(t,e,n){t=n.nmd(t);var r="__lodash_hash_undefined__",i=9007199254740991,s="[object Arguments]",o="[object Boolean]",l="[object Date]",a="[object Function]",c="[object GeneratorFunction]",u="[object Map]",h="[object Number]",d="[object Object]",f="[object Promise]",p="[object RegExp]",g="[object Set]",m="[object String]",b="[object Symbol]",y="[object WeakMap]",v="[object ArrayBuffer]",A="[object DataView]",x="[object Float32Array]",N="[object Float64Array]",E="[object Int8Array]",w="[object Int16Array]",q="[object Int32Array]",k="[object Uint8Array]",_="[object Uint8ClampedArray]",L="[object Uint16Array]",S="[object Uint32Array]",O=/\w*$/,T=/^\[object .+?Constructor\]$/,j=/^(?:0|[1-9]\d*)$/,C={};C[s]=C["[object Array]"]=C[v]=C[A]=C[o]=C[l]=C[x]=C[N]=C[E]=C[w]=C[q]=C[u]=C[h]=C[d]=C[p]=C[g]=C[m]=C[b]=C[k]=C[_]=C[L]=C[S]=!0,C["[object Error]"]=C[a]=C[y]=!1;var R="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,I="object"==typeof self&&self&&self.Object===Object&&self,B=R||I||Function("return this")(),M=e&&!e.nodeType&&e,U=M&&t&&!t.nodeType&&t,D=U&&U.exports===M;function P(t,e){return t.set(e[0],e[1]),t}function z(t,e){return t.add(e),t}function F(t,e,n,r){var i=-1,s=t?t.length:0;for(r&&s&&(n=t[++i]);++i-1},_t.prototype.set=function(t,e){var n=this.__data__,r=Tt(n,t);return r<0?n.push([t,e]):n[r][1]=e,this},Lt.prototype.clear=function(){this.__data__={hash:new kt,map:new(pt||_t),string:new kt}},Lt.prototype.delete=function(t){return It(this,t).delete(t)},Lt.prototype.get=function(t){return It(this,t).get(t)},Lt.prototype.has=function(t){return It(this,t).has(t)},Lt.prototype.set=function(t,e){return It(this,t).set(t,e),this},St.prototype.clear=function(){this.__data__=new _t},St.prototype.delete=function(t){return this.__data__.delete(t)},St.prototype.get=function(t){return this.__data__.get(t)},St.prototype.has=function(t){return this.__data__.has(t)},St.prototype.set=function(t,e){var n=this.__data__;if(n instanceof _t){var r=n.__data__;if(!pt||r.length<199)return r.push([t,e]),this;n=this.__data__=new Lt(r)}return n.set(t,e),this};var Mt=ut?V(ut,Object):function(){return[]},Ut=function(t){return et.call(t)};function Dt(t,e){return!!(e=null==e?i:e)&&("number"==typeof t||j.test(t))&&t>-1&&t%1==0&&t-1&&t%1==0&&t<=i}(t.length)&&!Kt(t)}var Vt=ht||function(){return!1};function Kt(t){var e=Wt(t)?et.call(t):"";return e==a||e==c}function Wt(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function Zt(t){return $t(t)?function(t,e){var n=Ht(t)||function(t){return function(t){return function(t){return!!t&&"object"==typeof t}(t)&&$t(t)}(t)&&tt.call(t,"callee")&&(!at.call(t,"callee")||et.call(t)==s)}(t)?function(t,e){for(var n=-1,r=Array(t);++nc))return!1;var h=l.get(t);if(h&&l.get(e))return h==e;var d=-1,f=!0,p=n&s?new kt:void 0;for(l.set(t,e),l.set(e,t);++d-1},wt.prototype.set=function(t,e){var n=this.__data__,r=Lt(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this},qt.prototype.clear=function(){this.size=0,this.__data__={hash:new Et,map:new(ht||wt),string:new Et}},qt.prototype.delete=function(t){var e=Rt(this,t).delete(t);return this.size-=e?1:0,e},qt.prototype.get=function(t){return Rt(this,t).get(t)},qt.prototype.has=function(t){return Rt(this,t).has(t)},qt.prototype.set=function(t,e){var n=Rt(this,t),r=n.size;return n.set(t,e),this.size+=n.size==r?0:1,this},kt.prototype.add=kt.prototype.push=function(t){return this.__data__.set(t,r),this},kt.prototype.has=function(t){return this.__data__.has(t)},_t.prototype.clear=function(){this.__data__=new wt,this.size=0},_t.prototype.delete=function(t){var e=this.__data__,n=e.delete(t);return this.size=e.size,n},_t.prototype.get=function(t){return this.__data__.get(t)},_t.prototype.has=function(t){return this.__data__.has(t)},_t.prototype.set=function(t,e){var n=this.__data__;if(n instanceof wt){var r=n.__data__;if(!ht||r.length<199)return r.push([t,e]),this.size=++n.size,this;n=this.__data__=new qt(r)}return n.set(t,e),this.size=n.size,this};var Bt=lt?function(t){return null==t?[]:(t=Object(t),function(e,n){for(var r=-1,i=null==e?0:e.length,s=0,o=[];++r-1&&t%1==0&&t-1&&t%1==0&&t<=o}function Kt(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}function Wt(t){return null!=t&&"object"==typeof t}var Zt=D?function(t){return function(e){return t(e)}}(D):function(t){return Wt(t)&&Vt(t.length)&&!!O[St(t)]};function Gt(t){return null!=(e=t)&&Vt(e.length)&&!$t(e)?function(t,e){var n=Ft(t),r=!n&&zt(t),i=!n&&!r&&Ht(t),s=!n&&!r&&!i&&Zt(t),o=n||r||i||s,l=o?function(t,e){for(var n=-1,r=Array(t);++n(null!=i[e]&&(t[e]=i[e]),t)),{}));for(const n in t)void 0!==t[n]&&void 0===e[n]&&(i[n]=t[n]);return Object.keys(i).length>0?i:void 0},t.diff=function(t={},e={}){"object"!=typeof t&&(t={}),"object"!=typeof e&&(e={});const n=Object.keys(t).concat(Object.keys(e)).reduce(((n,r)=>(i(t[r],e[r])||(n[r]=void 0===e[r]?null:e[r]),n)),{});return Object.keys(n).length>0?n:void 0},t.invert=function(t={},e={}){t=t||{};const n=Object.keys(e).reduce(((n,r)=>(e[r]!==t[r]&&void 0!==t[r]&&(n[r]=e[r]),n)),{});return Object.keys(t).reduce(((n,r)=>(t[r]!==e[r]&&void 0===e[r]&&(n[r]=null),n)),n)},t.transform=function(t,e,n=!1){if("object"!=typeof t)return e;if("object"!=typeof e)return;if(!n)return e;const r=Object.keys(e).reduce(((n,r)=>(void 0===t[r]&&(n[r]=e[r]),n)),{});return Object.keys(r).length>0?r:void 0}}(s||(s={})),e.default=s},5232:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.AttributeMap=e.OpIterator=e.Op=void 0;const r=n(5090),i=n(9629),s=n(4162),o=n(1270);e.AttributeMap=o.default;const l=n(4123);e.Op=l.default;const a=n(7033);e.OpIterator=a.default;const c=String.fromCharCode(0),u=(t,e)=>{if("object"!=typeof t||null===t)throw new Error("cannot retain a "+typeof t);if("object"!=typeof e||null===e)throw new Error("cannot retain a "+typeof e);const n=Object.keys(t)[0];if(!n||n!==Object.keys(e)[0])throw new Error(`embed types not matched: ${n} != ${Object.keys(e)[0]}`);return[n,t[n],e[n]]};class h{constructor(t){Array.isArray(t)?this.ops=t:null!=t&&Array.isArray(t.ops)?this.ops=t.ops:this.ops=[]}static registerEmbed(t,e){this.handlers[t]=e}static unregisterEmbed(t){delete this.handlers[t]}static getHandler(t){const e=this.handlers[t];if(!e)throw new Error(`no handlers for embed type "${t}"`);return e}insert(t,e){const n={};return"string"==typeof t&&0===t.length?this:(n.insert=t,null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n))}delete(t){return t<=0?this:this.push({delete:t})}retain(t,e){if("number"==typeof t&&t<=0)return this;const n={retain:t};return null!=e&&"object"==typeof e&&Object.keys(e).length>0&&(n.attributes=e),this.push(n)}push(t){let e=this.ops.length,n=this.ops[e-1];if(t=i(t),"object"==typeof n){if("number"==typeof t.delete&&"number"==typeof n.delete)return this.ops[e-1]={delete:n.delete+t.delete},this;if("number"==typeof n.delete&&null!=t.insert&&(e-=1,n=this.ops[e-1],"object"!=typeof n))return this.ops.unshift(t),this;if(s(t.attributes,n.attributes)){if("string"==typeof t.insert&&"string"==typeof n.insert)return this.ops[e-1]={insert:n.insert+t.insert},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this;if("number"==typeof t.retain&&"number"==typeof n.retain)return this.ops[e-1]={retain:n.retain+t.retain},"object"==typeof t.attributes&&(this.ops[e-1].attributes=t.attributes),this}}return e===this.ops.length?this.ops.push(t):this.ops.splice(e,0,t),this}chop(){const t=this.ops[this.ops.length-1];return t&&"number"==typeof t.retain&&!t.attributes&&this.ops.pop(),this}filter(t){return this.ops.filter(t)}forEach(t){this.ops.forEach(t)}map(t){return this.ops.map(t)}partition(t){const e=[],n=[];return this.forEach((r=>{(t(r)?e:n).push(r)})),[e,n]}reduce(t,e){return this.ops.reduce(t,e)}changeLength(){return this.reduce(((t,e)=>e.insert?t+l.default.length(e):e.delete?t-e.delete:t),0)}length(){return this.reduce(((t,e)=>t+l.default.length(e)),0)}slice(t=0,e=1/0){const n=[],r=new a.default(this.ops);let i=0;for(;i0&&n.next(i.retain-t)}const l=new h(r);for(;e.hasNext()||n.hasNext();)if("insert"===n.peekType())l.push(n.next());else if("delete"===e.peekType())l.push(e.next());else{const t=Math.min(e.peekLength(),n.peekLength()),r=e.next(t),i=n.next(t);if(i.retain){const a={};if("number"==typeof r.retain)a.retain="number"==typeof i.retain?t:i.retain;else if("number"==typeof i.retain)null==r.retain?a.insert=r.insert:a.retain=r.retain;else{const t=null==r.retain?"insert":"retain",[e,n,s]=u(r[t],i.retain),o=h.getHandler(e);a[t]={[e]:o.compose(n,s,"retain"===t)}}const c=o.default.compose(r.attributes,i.attributes,"number"==typeof r.retain);if(c&&(a.attributes=c),l.push(a),!n.hasNext()&&s(l.ops[l.ops.length-1],a)){const t=new h(e.rest());return l.concat(t).chop()}}else"number"==typeof i.delete&&("number"==typeof r.retain||"object"==typeof r.retain&&null!==r.retain)&&l.push(i)}return l.chop()}concat(t){const e=new h(this.ops.slice());return t.ops.length>0&&(e.push(t.ops[0]),e.ops=e.ops.concat(t.ops.slice(1))),e}diff(t,e){if(this.ops===t.ops)return new h;const n=[this,t].map((e=>e.map((n=>{if(null!=n.insert)return"string"==typeof n.insert?n.insert:c;throw new Error("diff() called "+(e===t?"on":"with")+" non-document")})).join(""))),i=new h,l=r(n[0],n[1],e,!0),u=new a.default(this.ops),d=new a.default(t.ops);return l.forEach((t=>{let e=t[1].length;for(;e>0;){let n=0;switch(t[0]){case r.INSERT:n=Math.min(d.peekLength(),e),i.push(d.next(n));break;case r.DELETE:n=Math.min(e,u.peekLength()),u.next(n),i.delete(n);break;case r.EQUAL:n=Math.min(u.peekLength(),d.peekLength(),e);const t=u.next(n),l=d.next(n);s(t.insert,l.insert)?i.retain(n,o.default.diff(t.attributes,l.attributes)):i.push(l).delete(n)}e-=n}})),i.chop()}eachLine(t,e="\n"){const n=new a.default(this.ops);let r=new h,i=0;for(;n.hasNext();){if("insert"!==n.peekType())return;const s=n.peek(),o=l.default.length(s)-n.peekLength(),a="string"==typeof s.insert?s.insert.indexOf(e,o)-o:-1;if(a<0)r.push(n.next());else if(a>0)r.push(n.next(a));else{if(!1===t(r,n.next(1).attributes||{},i))return;i+=1,r=new h}}r.length()>0&&t(r,{},i)}invert(t){const e=new h;return this.reduce(((n,r)=>{if(r.insert)e.delete(l.default.length(r));else{if("number"==typeof r.retain&&null==r.attributes)return e.retain(r.retain),n+r.retain;if(r.delete||"number"==typeof r.retain){const i=r.delete||r.retain;return t.slice(n,n+i).forEach((t=>{r.delete?e.push(t):r.retain&&r.attributes&&e.retain(l.default.length(t),o.default.invert(r.attributes,t.attributes))})),n+i}if("object"==typeof r.retain&&null!==r.retain){const i=t.slice(n,n+1),s=new a.default(i.ops).next(),[l,c,d]=u(r.retain,s.insert),f=h.getHandler(l);return e.retain({[l]:f.invert(c,d)},o.default.invert(r.attributes,s.attributes)),n+1}}return n}),0),e.chop()}transform(t,e=!1){if(e=!!e,"number"==typeof t)return this.transformPosition(t,e);const n=t,r=new a.default(this.ops),i=new a.default(n.ops),s=new h;for(;r.hasNext()||i.hasNext();)if("insert"!==r.peekType()||!e&&"insert"===i.peekType())if("insert"===i.peekType())s.push(i.next());else{const t=Math.min(r.peekLength(),i.peekLength()),n=r.next(t),l=i.next(t);if(n.delete)continue;if(l.delete)s.push(l);else{const r=n.retain,i=l.retain;let a="object"==typeof i&&null!==i?i:t;if("object"==typeof r&&null!==r&&"object"==typeof i&&null!==i){const t=Object.keys(r)[0];if(t===Object.keys(i)[0]){const n=h.getHandler(t);n&&(a={[t]:n.transform(r[t],i[t],e)})}}s.retain(a,o.default.transform(n.attributes,l.attributes,e))}}else s.retain(l.default.length(r.next()));return s.chop()}transformPosition(t,e=!1){e=!!e;const n=new a.default(this.ops);let r=0;for(;n.hasNext()&&r<=t;){const i=n.peekLength(),s=n.peekType();n.next(),"delete"!==s?("insert"===s&&(r=i-n?(t=i-n,this.index+=1,this.offset=0):this.offset+=t,"number"==typeof e.delete)return{delete:t};{const r={};return e.attributes&&(r.attributes=e.attributes),"number"==typeof e.retain?r.retain=t:"object"==typeof e.retain&&null!==e.retain?r.retain=e.retain:"string"==typeof e.insert?r.insert=e.insert.substr(n,t):r.insert=e.insert,r}}return{retain:1/0}}peek(){return this.ops[this.index]}peekLength(){return this.ops[this.index]?r.default.length(this.ops[this.index])-this.offset:1/0}peekType(){const t=this.ops[this.index];return t?"number"==typeof t.delete?"delete":"number"==typeof t.retain||"object"==typeof t.retain&&null!==t.retain?"retain":"insert":"retain"}rest(){if(this.hasNext()){if(0===this.offset)return this.ops.slice(this.index);{const t=this.offset,e=this.index,n=this.next(),r=this.ops.slice(this.index);return this.offset=t,this.index=e,[n].concat(r)}}return[]}}},8820:function(t,e,n){"use strict";n.d(e,{A:function(){return l}});var r=n(8138),i=function(t,e){for(var n=t.length;n--;)if((0,r.A)(t[n][0],e))return n;return-1},s=Array.prototype.splice;function o(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1},o.prototype.set=function(t,e){var n=this.__data__,r=i(n,t);return r<0?(++this.size,n.push([t,e])):n[r][1]=e,this};var l=o},2461:function(t,e,n){"use strict";var r=n(2281),i=n(5507),s=(0,r.A)(i.A,"Map");e.A=s},3558:function(t,e,n){"use strict";n.d(e,{A:function(){return d}});var r=(0,n(2281).A)(Object,"create"),i=Object.prototype.hasOwnProperty,s=Object.prototype.hasOwnProperty;function o(t){var e=-1,n=null==t?0:t.length;for(this.clear();++e-1&&t%1==0&&tc))return!1;var h=s.get(t),d=s.get(e);if(h&&d)return h==e&&d==t;var f=-1,p=!0,g=2&n?new o:void 0;for(s.set(t,e),s.set(e,t);++f-1&&t%1==0&&t<=9007199254740991}},659:function(t,e){"use strict";e.A=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},7948:function(t,e){"use strict";e.A=function(t){return null!=t&&"object"==typeof t}},5755:function(t,e,n){"use strict";n.d(e,{A:function(){return u}});var r=n(2159),i=n(1628),s=n(7948),o={};o["[object Float32Array]"]=o["[object Float64Array]"]=o["[object Int8Array]"]=o["[object Int16Array]"]=o["[object Int32Array]"]=o["[object Uint8Array]"]=o["[object Uint8ClampedArray]"]=o["[object Uint16Array]"]=o["[object Uint32Array]"]=!0,o["[object Arguments]"]=o["[object Array]"]=o["[object ArrayBuffer]"]=o["[object Boolean]"]=o["[object DataView]"]=o["[object Date]"]=o["[object Error]"]=o["[object Function]"]=o["[object Map]"]=o["[object Number]"]=o["[object Object]"]=o["[object RegExp]"]=o["[object Set]"]=o["[object String]"]=o["[object WeakMap]"]=!1;var l=n(5771),a=n(8795),c=a.A&&a.A.isTypedArray,u=c?(0,l.A)(c):function(t){return(0,s.A)(t)&&(0,i.A)(t.length)&&!!o[(0,r.A)(t)]}},3169:function(t,e,n){"use strict";n.d(e,{A:function(){return a}});var r=n(6753),i=n(501),s=(0,n(2217).A)(Object.keys,Object),o=Object.prototype.hasOwnProperty,l=n(3628),a=function(t){return(0,l.A)(t)?(0,r.A)(t):function(t){if(!(0,i.A)(t))return s(t);var e=[];for(var n in Object(t))o.call(t,n)&&"constructor"!=n&&e.push(n);return e}(t)}},2624:function(t,e,n){"use strict";n.d(e,{A:function(){return c}});var r=n(6753),i=n(659),s=n(501),o=Object.prototype.hasOwnProperty,l=function(t){if(!(0,i.A)(t))return function(t){var e=[];if(null!=t)for(var n in Object(t))e.push(n);return e}(t);var e=(0,s.A)(t),n=[];for(var r in t)("constructor"!=r||!e&&o.call(t,r))&&n.push(r);return n},a=n(3628),c=function(t){return(0,a.A)(t)?(0,r.A)(t,!0):l(t)}},8347:function(t,e,n){"use strict";n.d(e,{A:function(){return $}});var r,i,s,o,l=n(2673),a=n(6770),c=n(8138),u=function(t,e,n){(void 0!==n&&!(0,c.A)(t[e],n)||void 0===n&&!(e in t))&&(0,a.A)(t,e,n)},h=function(t,e,n){for(var r=-1,i=Object(t),s=n(t),o=s.length;o--;){var l=s[++r];if(!1===e(i[l],l,i))break}return t},d=n(3812),f=n(1827),p=n(4405),g=n(1683),m=n(8412),b=n(723),y=n(3628),v=n(7948),A=n(776),x=n(7572),N=n(659),E=n(2159),w=n(8769),q=Function.prototype,k=Object.prototype,_=q.toString,L=k.hasOwnProperty,S=_.call(Object),O=n(5755),T=function(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__proto__"!=e)return t[e]},j=n(9601),C=n(2624),R=function(t,e,n,r,i,s,o){var l,a=T(t,n),c=T(e,n),h=o.get(c);if(h)u(t,n,h);else{var q=s?s(a,c,n+"",t,e,o):void 0,k=void 0===q;if(k){var R=(0,b.A)(c),I=!R&&(0,A.A)(c),B=!R&&!I&&(0,O.A)(c);q=c,R||I||B?(0,b.A)(a)?q=a:(l=a,(0,v.A)(l)&&(0,y.A)(l)?q=(0,p.A)(a):I?(k=!1,q=(0,d.A)(c,!0)):B?(k=!1,q=(0,f.A)(c,!0)):q=[]):function(t){if(!(0,v.A)(t)||"[object Object]"!=(0,E.A)(t))return!1;var e=(0,w.A)(t);if(null===e)return!0;var n=L.call(e,"constructor")&&e.constructor;return"function"==typeof n&&n instanceof n&&_.call(n)==S}(c)||(0,m.A)(c)?(q=a,(0,m.A)(a)?q=function(t){return(0,j.A)(t,(0,C.A)(t))}(a):(0,N.A)(a)&&!(0,x.A)(a)||(q=(0,g.A)(c))):k=!1}k&&(o.set(c,q),i(q,c,r,s,o),o.delete(c)),u(t,n,q)}},I=function t(e,n,r,i,s){e!==n&&h(n,(function(o,a){if(s||(s=new l.A),(0,N.A)(o))R(e,n,a,r,t,i,s);else{var c=i?i(T(e,a),o,a+"",e,n,s):void 0;void 0===c&&(c=o),u(e,a,c)}}),C.A)},B=function(t){return t},M=Math.max,U=n(7889),D=U.A?function(t,e){return(0,U.A)(t,"toString",{configurable:!0,enumerable:!1,value:(n=e,function(){return n}),writable:!0});var n}:B,P=Date.now,z=(r=D,i=0,s=0,function(){var t=P(),e=16-(t-s);if(s=t,e>0){if(++i>=800)return arguments[0]}else i=0;return r.apply(void 0,arguments)}),F=function(t,e){return z(function(t,e,n){return e=M(void 0===e?t.length-1:e,0),function(){for(var r=arguments,i=-1,s=M(r.length-e,0),o=Array(s);++i1?e[r-1]:void 0,s=r>2?e[2]:void 0;for(i=o.length>3&&"function"==typeof i?(r--,i):void 0,s&&function(t,e,n){if(!(0,N.A)(n))return!1;var r=typeof e;return!!("number"==r?(0,y.A)(n)&&(0,H.A)(e,n.length):"string"==r&&e in n)&&(0,c.A)(n[e],t)}(e[0],e[1],s)&&(i=r<3?void 0:i,r=1),t=Object(t);++n(t[t.TYPE=3]="TYPE",t[t.LEVEL=12]="LEVEL",t[t.ATTRIBUTE=13]="ATTRIBUTE",t[t.BLOT=14]="BLOT",t[t.INLINE=7]="INLINE",t[t.BLOCK=11]="BLOCK",t[t.BLOCK_BLOT=10]="BLOCK_BLOT",t[t.INLINE_BLOT=6]="INLINE_BLOT",t[t.BLOCK_ATTRIBUTE=9]="BLOCK_ATTRIBUTE",t[t.INLINE_ATTRIBUTE=5]="INLINE_ATTRIBUTE",t[t.ANY=15]="ANY",t))(r||{});class i{constructor(t,e,n={}){this.attrName=t,this.keyName=e;const i=r.TYPE&r.ATTRIBUTE;this.scope=null!=n.scope?n.scope&r.LEVEL|i:r.ATTRIBUTE,null!=n.whitelist&&(this.whitelist=n.whitelist)}static keys(t){return Array.from(t.attributes).map((t=>t.name))}add(t,e){return!!this.canAdd(t,e)&&(t.setAttribute(this.keyName,e),!0)}canAdd(t,e){return null==this.whitelist||("string"==typeof e?this.whitelist.indexOf(e.replace(/["']/g,""))>-1:this.whitelist.indexOf(e)>-1)}remove(t){t.removeAttribute(this.keyName)}value(t){const e=t.getAttribute(this.keyName);return this.canAdd(t,e)&&e?e:""}}class s extends Error{constructor(t){super(t="[Parchment] "+t),this.message=t,this.name=this.constructor.name}}const o=class t{constructor(){this.attributes={},this.classes={},this.tags={},this.types={}}static find(t,e=!1){if(null==t)return null;if(this.blots.has(t))return this.blots.get(t)||null;if(e){let n=null;try{n=t.parentNode}catch{return null}return this.find(n,e)}return null}create(e,n,r){const i=this.query(n);if(null==i)throw new s(`Unable to create ${n} blot`);const o=i,l=n instanceof Node||n.nodeType===Node.TEXT_NODE?n:o.create(r),a=new o(e,l,r);return t.blots.set(a.domNode,a),a}find(e,n=!1){return t.find(e,n)}query(t,e=r.ANY){let n;return"string"==typeof t?n=this.types[t]||this.attributes[t]:t instanceof Text||t.nodeType===Node.TEXT_NODE?n=this.types.text:"number"==typeof t?t&r.LEVEL&r.BLOCK?n=this.types.block:t&r.LEVEL&r.INLINE&&(n=this.types.inline):t instanceof Element&&((t.getAttribute("class")||"").split(/\s+/).some((t=>(n=this.classes[t],!!n))),n=n||this.tags[t.tagName]),null==n?null:"scope"in n&&e&r.LEVEL&n.scope&&e&r.TYPE&n.scope?n:null}register(...t){return t.map((t=>{const e="blotName"in t,n="attrName"in t;if(!e&&!n)throw new s("Invalid definition");if(e&&"abstract"===t.blotName)throw new s("Cannot register abstract class");const r=e?t.blotName:n?t.attrName:void 0;return this.types[r]=t,n?"string"==typeof t.keyName&&(this.attributes[t.keyName]=t):e&&(t.className&&(this.classes[t.className]=t),t.tagName&&(Array.isArray(t.tagName)?t.tagName=t.tagName.map((t=>t.toUpperCase())):t.tagName=t.tagName.toUpperCase(),(Array.isArray(t.tagName)?t.tagName:[t.tagName]).forEach((e=>{(null==this.tags[e]||null==t.className)&&(this.tags[e]=t)})))),t}))}};o.blots=new WeakMap;let l=o;function a(t,e){return(t.getAttribute("class")||"").split(/\s+/).filter((t=>0===t.indexOf(`${e}-`)))}const c=class extends i{static keys(t){return(t.getAttribute("class")||"").split(/\s+/).map((t=>t.split("-").slice(0,-1).join("-")))}add(t,e){return!!this.canAdd(t,e)&&(this.remove(t),t.classList.add(`${this.keyName}-${e}`),!0)}remove(t){a(t,this.keyName).forEach((e=>{t.classList.remove(e)})),0===t.classList.length&&t.removeAttribute("class")}value(t){const e=(a(t,this.keyName)[0]||"").slice(this.keyName.length+1);return this.canAdd(t,e)?e:""}};function u(t){const e=t.split("-"),n=e.slice(1).map((t=>t[0].toUpperCase()+t.slice(1))).join("");return e[0]+n}const h=class extends i{static keys(t){return(t.getAttribute("style")||"").split(";").map((t=>t.split(":")[0].trim()))}add(t,e){return!!this.canAdd(t,e)&&(t.style[u(this.keyName)]=e,!0)}remove(t){t.style[u(this.keyName)]="",t.getAttribute("style")||t.removeAttribute("style")}value(t){const e=t.style[u(this.keyName)];return this.canAdd(t,e)?e:""}},d=class{constructor(t){this.attributes={},this.domNode=t,this.build()}attribute(t,e){e?t.add(this.domNode,e)&&(null!=t.value(this.domNode)?this.attributes[t.attrName]=t:delete this.attributes[t.attrName]):(t.remove(this.domNode),delete this.attributes[t.attrName])}build(){this.attributes={};const t=l.find(this.domNode);if(null==t)return;const e=i.keys(this.domNode),n=c.keys(this.domNode),s=h.keys(this.domNode);e.concat(n).concat(s).forEach((e=>{const n=t.scroll.query(e,r.ATTRIBUTE);n instanceof i&&(this.attributes[n.attrName]=n)}))}copy(t){Object.keys(this.attributes).forEach((e=>{const n=this.attributes[e].value(this.domNode);t.format(e,n)}))}move(t){this.copy(t),Object.keys(this.attributes).forEach((t=>{this.attributes[t].remove(this.domNode)})),this.attributes={}}values(){return Object.keys(this.attributes).reduce(((t,e)=>(t[e]=this.attributes[e].value(this.domNode),t)),{})}},f=class{constructor(t,e){this.scroll=t,this.domNode=e,l.blots.set(e,this),this.prev=null,this.next=null}static create(t){if(null==this.tagName)throw new s("Blot definition missing tagName");let e,n;return Array.isArray(this.tagName)?("string"==typeof t?(n=t.toUpperCase(),parseInt(n,10).toString()===n&&(n=parseInt(n,10))):"number"==typeof t&&(n=t),e="number"==typeof n?document.createElement(this.tagName[n-1]):n&&this.tagName.indexOf(n)>-1?document.createElement(n):document.createElement(this.tagName[0])):e=document.createElement(this.tagName),this.className&&e.classList.add(this.className),e}get statics(){return this.constructor}attach(){}clone(){const t=this.domNode.cloneNode(!1);return this.scroll.create(t)}detach(){null!=this.parent&&this.parent.removeChild(this),l.blots.delete(this.domNode)}deleteAt(t,e){this.isolate(t,e).remove()}formatAt(t,e,n,i){const s=this.isolate(t,e);if(null!=this.scroll.query(n,r.BLOT)&&i)s.wrap(n,i);else if(null!=this.scroll.query(n,r.ATTRIBUTE)){const t=this.scroll.create(this.statics.scope);s.wrap(t),t.format(n,i)}}insertAt(t,e,n){const r=null==n?this.scroll.create("text",e):this.scroll.create(e,n),i=this.split(t);this.parent.insertBefore(r,i||void 0)}isolate(t,e){const n=this.split(t);if(null==n)throw new Error("Attempt to isolate at end");return n.split(e),n}length(){return 1}offset(t=this.parent){return null==this.parent||this===t?0:this.parent.children.offset(this)+this.parent.offset(t)}optimize(t){this.statics.requiredContainer&&!(this.parent instanceof this.statics.requiredContainer)&&this.wrap(this.statics.requiredContainer.blotName)}remove(){null!=this.domNode.parentNode&&this.domNode.parentNode.removeChild(this.domNode),this.detach()}replaceWith(t,e){const n="string"==typeof t?this.scroll.create(t,e):t;return null!=this.parent&&(this.parent.insertBefore(n,this.next||void 0),this.remove()),n}split(t,e){return 0===t?this:this.next}update(t,e){}wrap(t,e){const n="string"==typeof t?this.scroll.create(t,e):t;if(null!=this.parent&&this.parent.insertBefore(n,this.next||void 0),"function"!=typeof n.appendChild)throw new s(`Cannot wrap ${t}`);return n.appendChild(this),n}};f.blotName="abstract";let p=f;const g=class extends p{static value(t){return!0}index(t,e){return this.domNode===t||this.domNode.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY?Math.min(e,1):-1}position(t,e){let n=Array.from(this.parent.domNode.childNodes).indexOf(this.domNode);return t>0&&(n+=1),[this.parent.domNode,n]}value(){return{[this.statics.blotName]:this.statics.value(this.domNode)||!0}}};g.scope=r.INLINE_BLOT;const m=g;class b{constructor(){this.head=null,this.tail=null,this.length=0}append(...t){if(this.insertBefore(t[0],null),t.length>1){const e=t.slice(1);this.append(...e)}}at(t){const e=this.iterator();let n=e();for(;n&&t>0;)t-=1,n=e();return n}contains(t){const e=this.iterator();let n=e();for(;n;){if(n===t)return!0;n=e()}return!1}indexOf(t){const e=this.iterator();let n=e(),r=0;for(;n;){if(n===t)return r;r+=1,n=e()}return-1}insertBefore(t,e){null!=t&&(this.remove(t),t.next=e,null!=e?(t.prev=e.prev,null!=e.prev&&(e.prev.next=t),e.prev=t,e===this.head&&(this.head=t)):null!=this.tail?(this.tail.next=t,t.prev=this.tail,this.tail=t):(t.prev=null,this.head=this.tail=t),this.length+=1)}offset(t){let e=0,n=this.head;for(;null!=n;){if(n===t)return e;e+=n.length(),n=n.next}return-1}remove(t){this.contains(t)&&(null!=t.prev&&(t.prev.next=t.next),null!=t.next&&(t.next.prev=t.prev),t===this.head&&(this.head=t.next),t===this.tail&&(this.tail=t.prev),this.length-=1)}iterator(t=this.head){return()=>{const e=t;return null!=t&&(t=t.next),e}}find(t,e=!1){const n=this.iterator();let r=n();for(;r;){const i=r.length();if(ts?n(l,t-s,Math.min(e,s+r-t)):n(l,0,Math.min(r,t+e-s)),s+=r,l=o()}}map(t){return this.reduce(((e,n)=>(e.push(t(n)),e)),[])}reduce(t,e){const n=this.iterator();let r=n();for(;r;)e=t(e,r),r=n();return e}}function y(t,e){const n=e.find(t);if(n)return n;try{return e.create(t)}catch{const n=e.create(r.INLINE);return Array.from(t.childNodes).forEach((t=>{n.domNode.appendChild(t)})),t.parentNode&&t.parentNode.replaceChild(n.domNode,t),n.attach(),n}}const v=class t extends p{constructor(t,e){super(t,e),this.uiNode=null,this.build()}appendChild(t){this.insertBefore(t)}attach(){super.attach(),this.children.forEach((t=>{t.attach()}))}attachUI(e){null!=this.uiNode&&this.uiNode.remove(),this.uiNode=e,t.uiClass&&this.uiNode.classList.add(t.uiClass),this.uiNode.setAttribute("contenteditable","false"),this.domNode.insertBefore(this.uiNode,this.domNode.firstChild)}build(){this.children=new b,Array.from(this.domNode.childNodes).filter((t=>t!==this.uiNode)).reverse().forEach((t=>{try{const e=y(t,this.scroll);this.insertBefore(e,this.children.head||void 0)}catch(t){if(t instanceof s)return;throw t}}))}deleteAt(t,e){if(0===t&&e===this.length())return this.remove();this.children.forEachAt(t,e,((t,e,n)=>{t.deleteAt(e,n)}))}descendant(e,n=0){const[r,i]=this.children.find(n);return null==e.blotName&&e(r)||null!=e.blotName&&r instanceof e?[r,i]:r instanceof t?r.descendant(e,i):[null,-1]}descendants(e,n=0,r=Number.MAX_VALUE){let i=[],s=r;return this.children.forEachAt(n,r,((n,r,o)=>{(null==e.blotName&&e(n)||null!=e.blotName&&n instanceof e)&&i.push(n),n instanceof t&&(i=i.concat(n.descendants(e,r,s))),s-=o})),i}detach(){this.children.forEach((t=>{t.detach()})),super.detach()}enforceAllowedChildren(){let e=!1;this.children.forEach((n=>{e||this.statics.allowedChildren.some((t=>n instanceof t))||(n.statics.scope===r.BLOCK_BLOT?(null!=n.next&&this.splitAfter(n),null!=n.prev&&this.splitAfter(n.prev),n.parent.unwrap(),e=!0):n instanceof t?n.unwrap():n.remove())}))}formatAt(t,e,n,r){this.children.forEachAt(t,e,((t,e,i)=>{t.formatAt(e,i,n,r)}))}insertAt(t,e,n){const[r,i]=this.children.find(t);if(r)r.insertAt(i,e,n);else{const t=null==n?this.scroll.create("text",e):this.scroll.create(e,n);this.appendChild(t)}}insertBefore(t,e){null!=t.parent&&t.parent.children.remove(t);let n=null;this.children.insertBefore(t,e||null),t.parent=this,null!=e&&(n=e.domNode),(this.domNode.parentNode!==t.domNode||this.domNode.nextSibling!==n)&&this.domNode.insertBefore(t.domNode,n),t.attach()}length(){return this.children.reduce(((t,e)=>t+e.length()),0)}moveChildren(t,e){this.children.forEach((n=>{t.insertBefore(n,e)}))}optimize(t){if(super.optimize(t),this.enforceAllowedChildren(),null!=this.uiNode&&this.uiNode!==this.domNode.firstChild&&this.domNode.insertBefore(this.uiNode,this.domNode.firstChild),0===this.children.length)if(null!=this.statics.defaultChild){const t=this.scroll.create(this.statics.defaultChild.blotName);this.appendChild(t)}else this.remove()}path(e,n=!1){const[r,i]=this.children.find(e,n),s=[[this,e]];return r instanceof t?s.concat(r.path(i,n)):(null!=r&&s.push([r,i]),s)}removeChild(t){this.children.remove(t)}replaceWith(e,n){const r="string"==typeof e?this.scroll.create(e,n):e;return r instanceof t&&this.moveChildren(r),super.replaceWith(r)}split(t,e=!1){if(!e){if(0===t)return this;if(t===this.length())return this.next}const n=this.clone();return this.parent&&this.parent.insertBefore(n,this.next||void 0),this.children.forEachAt(t,this.length(),((t,r,i)=>{const s=t.split(r,e);null!=s&&n.appendChild(s)})),n}splitAfter(t){const e=this.clone();for(;null!=t.next;)e.appendChild(t.next);return this.parent&&this.parent.insertBefore(e,this.next||void 0),e}unwrap(){this.parent&&this.moveChildren(this.parent,this.next||void 0),this.remove()}update(t,e){const n=[],r=[];t.forEach((t=>{t.target===this.domNode&&"childList"===t.type&&(n.push(...t.addedNodes),r.push(...t.removedNodes))})),r.forEach((t=>{if(null!=t.parentNode&&"IFRAME"!==t.tagName&&document.body.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)return;const e=this.scroll.find(t);null!=e&&(null==e.domNode.parentNode||e.domNode.parentNode===this.domNode)&&e.detach()})),n.filter((t=>t.parentNode===this.domNode&&t!==this.uiNode)).sort(((t,e)=>t===e?0:t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING?1:-1)).forEach((t=>{let e=null;null!=t.nextSibling&&(e=this.scroll.find(t.nextSibling));const n=y(t,this.scroll);(n.next!==e||null==n.next)&&(null!=n.parent&&n.parent.removeChild(this),this.insertBefore(n,e||void 0))})),this.enforceAllowedChildren()}};v.uiClass="";const A=v,x=class t extends A{static create(t){return super.create(t)}static formats(e,n){const r=n.query(t.blotName);if(null==r||e.tagName!==r.tagName){if("string"==typeof this.tagName)return!0;if(Array.isArray(this.tagName))return e.tagName.toLowerCase()}}constructor(t,e){super(t,e),this.attributes=new d(this.domNode)}format(e,n){if(e!==this.statics.blotName||n){const t=this.scroll.query(e,r.INLINE);if(null==t)return;t instanceof i?this.attributes.attribute(t,n):n&&(e!==this.statics.blotName||this.formats()[e]!==n)&&this.replaceWith(e,n)}else this.children.forEach((e=>{e instanceof t||(e=e.wrap(t.blotName,!0)),this.attributes.copy(e)})),this.unwrap()}formats(){const t=this.attributes.values(),e=this.statics.formats(this.domNode,this.scroll);return null!=e&&(t[this.statics.blotName]=e),t}formatAt(t,e,n,i){null!=this.formats()[n]||this.scroll.query(n,r.ATTRIBUTE)?this.isolate(t,e).format(n,i):super.formatAt(t,e,n,i)}optimize(e){super.optimize(e);const n=this.formats();if(0===Object.keys(n).length)return this.unwrap();const r=this.next;r instanceof t&&r.prev===this&&function(t,e){if(Object.keys(t).length!==Object.keys(e).length)return!1;for(const n in t)if(t[n]!==e[n])return!1;return!0}(n,r.formats())&&(r.moveChildren(this),r.remove())}replaceWith(t,e){const n=super.replaceWith(t,e);return this.attributes.copy(n),n}update(t,e){super.update(t,e),t.some((t=>t.target===this.domNode&&"attributes"===t.type))&&this.attributes.build()}wrap(e,n){const r=super.wrap(e,n);return r instanceof t&&this.attributes.move(r),r}};x.allowedChildren=[x,m],x.blotName="inline",x.scope=r.INLINE_BLOT,x.tagName="SPAN";const N=x,E=class t extends A{static create(t){return super.create(t)}static formats(e,n){const r=n.query(t.blotName);if(null==r||e.tagName!==r.tagName){if("string"==typeof this.tagName)return!0;if(Array.isArray(this.tagName))return e.tagName.toLowerCase()}}constructor(t,e){super(t,e),this.attributes=new d(this.domNode)}format(e,n){const s=this.scroll.query(e,r.BLOCK);null!=s&&(s instanceof i?this.attributes.attribute(s,n):e!==this.statics.blotName||n?n&&(e!==this.statics.blotName||this.formats()[e]!==n)&&this.replaceWith(e,n):this.replaceWith(t.blotName))}formats(){const t=this.attributes.values(),e=this.statics.formats(this.domNode,this.scroll);return null!=e&&(t[this.statics.blotName]=e),t}formatAt(t,e,n,i){null!=this.scroll.query(n,r.BLOCK)?this.format(n,i):super.formatAt(t,e,n,i)}insertAt(t,e,n){if(null==n||null!=this.scroll.query(e,r.INLINE))super.insertAt(t,e,n);else{const r=this.split(t);if(null==r)throw new Error("Attempt to insertAt after block boundaries");{const t=this.scroll.create(e,n);r.parent.insertBefore(t,r)}}}replaceWith(t,e){const n=super.replaceWith(t,e);return this.attributes.copy(n),n}update(t,e){super.update(t,e),t.some((t=>t.target===this.domNode&&"attributes"===t.type))&&this.attributes.build()}};E.blotName="block",E.scope=r.BLOCK_BLOT,E.tagName="P",E.allowedChildren=[N,E,m];const w=E,q=class extends A{checkMerge(){return null!==this.next&&this.next.statics.blotName===this.statics.blotName}deleteAt(t,e){super.deleteAt(t,e),this.enforceAllowedChildren()}formatAt(t,e,n,r){super.formatAt(t,e,n,r),this.enforceAllowedChildren()}insertAt(t,e,n){super.insertAt(t,e,n),this.enforceAllowedChildren()}optimize(t){super.optimize(t),this.children.length>0&&null!=this.next&&this.checkMerge()&&(this.next.moveChildren(this),this.next.remove())}};q.blotName="container",q.scope=r.BLOCK_BLOT;const k=q,_=class extends m{static formats(t,e){}format(t,e){super.formatAt(0,this.length(),t,e)}formatAt(t,e,n,r){0===t&&e===this.length()?this.format(n,r):super.formatAt(t,e,n,r)}formats(){return this.statics.formats(this.domNode,this.scroll)}},L={attributes:!0,characterData:!0,characterDataOldValue:!0,childList:!0,subtree:!0},S=class extends A{constructor(t,e){super(null,e),this.registry=t,this.scroll=this,this.build(),this.observer=new MutationObserver((t=>{this.update(t)})),this.observer.observe(this.domNode,L),this.attach()}create(t,e){return this.registry.create(this,t,e)}find(t,e=!1){const n=this.registry.find(t,e);return n?n.scroll===this?n:e?this.find(n.scroll.domNode.parentNode,!0):null:null}query(t,e=r.ANY){return this.registry.query(t,e)}register(...t){return this.registry.register(...t)}build(){null!=this.scroll&&super.build()}detach(){super.detach(),this.observer.disconnect()}deleteAt(t,e){this.update(),0===t&&e===this.length()?this.children.forEach((t=>{t.remove()})):super.deleteAt(t,e)}formatAt(t,e,n,r){this.update(),super.formatAt(t,e,n,r)}insertAt(t,e,n){this.update(),super.insertAt(t,e,n)}optimize(t=[],e={}){super.optimize(e);const n=e.mutationsMap||new WeakMap;let r=Array.from(this.observer.takeRecords());for(;r.length>0;)t.push(r.pop());const i=(t,e=!0)=>{null==t||t===this||null!=t.domNode.parentNode&&(n.has(t.domNode)||n.set(t.domNode,[]),e&&i(t.parent))},s=t=>{n.has(t.domNode)&&(t instanceof A&&t.children.forEach(s),n.delete(t.domNode),t.optimize(e))};let o=t;for(let e=0;o.length>0;e+=1){if(e>=100)throw new Error("[Parchment] Maximum optimize iterations reached");for(o.forEach((t=>{const e=this.find(t.target,!0);null!=e&&(e.domNode===t.target&&("childList"===t.type?(i(this.find(t.previousSibling,!1)),Array.from(t.addedNodes).forEach((t=>{const e=this.find(t,!1);i(e,!1),e instanceof A&&e.children.forEach((t=>{i(t,!1)}))}))):"attributes"===t.type&&i(e.prev)),i(e))})),this.children.forEach(s),o=Array.from(this.observer.takeRecords()),r=o.slice();r.length>0;)t.push(r.pop())}}update(t,e={}){t=t||this.observer.takeRecords();const n=new WeakMap;t.map((t=>{const e=this.find(t.target,!0);return null==e?null:n.has(e.domNode)?(n.get(e.domNode).push(t),null):(n.set(e.domNode,[t]),e)})).forEach((t=>{null!=t&&t!==this&&n.has(t.domNode)&&t.update(n.get(t.domNode)||[],e)})),e.mutationsMap=n,n.has(this.domNode)&&super.update(n.get(this.domNode),e),this.optimize(t,e)}};S.blotName="scroll",S.defaultChild=w,S.allowedChildren=[w,k],S.scope=r.BLOCK_BLOT,S.tagName="DIV";const O=S,T=class t extends m{static create(t){return document.createTextNode(t)}static value(t){return t.data}constructor(t,e){super(t,e),this.text=this.statics.value(this.domNode)}deleteAt(t,e){this.domNode.data=this.text=this.text.slice(0,t)+this.text.slice(t+e)}index(t,e){return this.domNode===t?e:-1}insertAt(t,e,n){null==n?(this.text=this.text.slice(0,t)+e+this.text.slice(t),this.domNode.data=this.text):super.insertAt(t,e,n)}length(){return this.text.length}optimize(e){super.optimize(e),this.text=this.statics.value(this.domNode),0===this.text.length?this.remove():this.next instanceof t&&this.next.prev===this&&(this.insertAt(this.length(),this.next.value()),this.next.remove())}position(t,e=!1){return[this.domNode,t]}split(t,e=!1){if(!e){if(0===t)return this;if(t===this.length())return this.next}const n=this.scroll.create(this.domNode.splitText(t));return this.parent.insertBefore(n,this.next||void 0),this.text=this.statics.value(this.domNode),n}update(t,e){t.some((t=>"characterData"===t.type&&t.target===this.domNode))&&(this.text=this.statics.value(this.domNode))}value(){return this.text}};T.blotName="text",T.scope=r.INLINE_BLOT;const j=T}},e={};function n(r){var i=e[r];if(void 0!==i)return i.exports;var s=e[r]={id:r,loaded:!1,exports:{}};return t[r](s,s.exports,n),s.loaded=!0,s.exports}n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,{a:e}),e},n.d=function(t,e){for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.nmd=function(t){return t.paths=[],t.children||(t.children=[]),t};var r={};return function(){"use strict";n.d(r,{default:function(){return It}});var t=n(3729),e=n(8276),i=n(7912),s=n(6003);class o extends s.ClassAttributor{add(t,e){let n=0;if("+1"===e||"-1"===e){const r=this.value(t)||0;n="+1"===e?r+1:r-1}else"number"==typeof e&&(n=e);return 0===n?(this.remove(t),!0):super.add(t,n.toString())}canAdd(t,e){return super.canAdd(t,e)||super.canAdd(t,parseInt(e,10))}value(t){return parseInt(super.value(t),10)||void 0}}var l=new o("indent","ql-indent",{scope:s.Scope.BLOCK,whitelist:[1,2,3,4,5,6,7,8]}),a=n(9698);class c extends a.Ay{static blotName="blockquote";static tagName="blockquote"}var u=c;class h extends a.Ay{static blotName="header";static tagName=["H1","H2","H3","H4","H5","H6"];static formats(t){return this.tagName.indexOf(t.tagName)+1}}var d=h,f=n(580),p=n(6142);class g extends f.A{}g.blotName="list-container",g.tagName="OL";class m extends a.Ay{static create(t){const e=super.create();return e.setAttribute("data-list",t),e}static formats(t){return t.getAttribute("data-list")||void 0}static register(){p.Ay.register(g)}constructor(t,e){super(t,e);const n=e.ownerDocument.createElement("span"),r=n=>{if(!t.isEnabled())return;const r=this.statics.formats(e,t);"checked"===r?(this.format("list","unchecked"),n.preventDefault()):"unchecked"===r&&(this.format("list","checked"),n.preventDefault())};n.addEventListener("mousedown",r),n.addEventListener("touchstart",r),this.attachUI(n)}format(t,e){t===this.statics.blotName&&e?this.domNode.setAttribute("data-list",e):super.format(t,e)}}m.blotName="list",m.tagName="LI",g.allowedChildren=[m],m.requiredContainer=g;var b=n(9541),y=n(8638),v=n(6772),A=n(664),x=n(4850);class N extends x.A{static blotName="bold";static tagName=["STRONG","B"];static create(){return super.create()}static formats(){return!0}optimize(t){super.optimize(t),this.domNode.tagName!==this.statics.tagName[0]&&this.replaceWith(this.statics.blotName)}}var E=N;class w extends x.A{static blotName="link";static tagName="A";static SANITIZED_URL="about:blank";static PROTOCOL_WHITELIST=["http","https","mailto","tel","sms"];static create(t){const e=super.create(t);return e.setAttribute("href",this.sanitize(t)),e.setAttribute("rel","noopener noreferrer"),e.setAttribute("target","_blank"),e}static formats(t){return t.getAttribute("href")}static sanitize(t){return q(t,this.PROTOCOL_WHITELIST)?t:this.SANITIZED_URL}format(t,e){t===this.statics.blotName&&e?this.domNode.setAttribute("href",this.constructor.sanitize(e)):super.format(t,e)}}function q(t,e){const n=document.createElement("a");n.href=t;const r=n.href.slice(0,n.href.indexOf(":"));return e.indexOf(r)>-1}class k extends x.A{static blotName="script";static tagName=["SUB","SUP"];static create(t){return"super"===t?document.createElement("sup"):"sub"===t?document.createElement("sub"):super.create(t)}static formats(t){return"SUB"===t.tagName?"sub":"SUP"===t.tagName?"super":void 0}}var _=k;class L extends x.A{static blotName="underline";static tagName="U"}var S=L,O=n(746);class T extends O.A{static blotName="formula";static className="ql-formula";static tagName="SPAN";static create(t){if(null==window.katex)throw new Error("Formula module requires KaTeX.");const e=super.create(t);return"string"==typeof t&&(window.katex.render(t,e,{throwOnError:!1,errorColor:"#f00"}),e.setAttribute("data-value",t)),e}static value(t){return t.getAttribute("data-value")}html(){const{formula:t}=this.value();return`${t}`}}var j=T;const C=["alt","height","width"];class R extends s.EmbedBlot{static blotName="image";static tagName="IMG";static create(t){const e=super.create(t);return"string"==typeof t&&e.setAttribute("src",this.sanitize(t)),e}static formats(t){return C.reduce(((e,n)=>(t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e)),{})}static match(t){return/\.(jpe?g|gif|png)$/.test(t)||/^data:image\/.+;base64/.test(t)}static sanitize(t){return q(t,["http","https","data"])?t:"//:0"}static value(t){return t.getAttribute("src")}format(t,e){C.indexOf(t)>-1?e?this.domNode.setAttribute(t,e):this.domNode.removeAttribute(t):super.format(t,e)}}var I=R;const B=["height","width"];class M extends a.zo{static blotName="video";static className="ql-video";static tagName="IFRAME";static create(t){const e=super.create(t);return e.setAttribute("frameborder","0"),e.setAttribute("allowfullscreen","true"),e.setAttribute("src",this.sanitize(t)),e}static formats(t){return B.reduce(((e,n)=>(t.hasAttribute(n)&&(e[n]=t.getAttribute(n)),e)),{})}static sanitize(t){return w.sanitize(t)}static value(t){return t.getAttribute("src")}format(t,e){B.indexOf(t)>-1?e?this.domNode.setAttribute(t,e):this.domNode.removeAttribute(t):super.format(t,e)}html(){const{video:t}=this.value();return`${t}`}}var U=M,D=n(9404),P=n(5232),z=n.n(P),F=n(4266),H=n(3036),$=n(4541),V=n(5508),K=n(584);const W=new s.ClassAttributor("code-token","hljs",{scope:s.Scope.INLINE});class Z extends x.A{static formats(t,e){for(;null!=t&&t!==e.domNode;){if(t.classList&&t.classList.contains(D.Ay.className))return super.formats(t,e);t=t.parentNode}}constructor(t,e,n){super(t,e,n),W.add(this.domNode,n)}format(t,e){t!==Z.blotName?super.format(t,e):e?W.add(this.domNode,e):(W.remove(this.domNode),this.domNode.classList.remove(this.statics.className))}optimize(){super.optimize(...arguments),W.value(this.domNode)||this.unwrap()}}Z.blotName="code-token",Z.className="ql-token";class G extends D.Ay{static create(t){const e=super.create(t);return"string"==typeof t&&e.setAttribute("data-language",t),e}static formats(t){return t.getAttribute("data-language")||"plain"}static register(){}format(t,e){t===this.statics.blotName&&e?this.domNode.setAttribute("data-language",e):super.format(t,e)}replaceWith(t,e){return this.formatAt(0,this.length(),Z.blotName,!1),super.replaceWith(t,e)}}class X extends D.EJ{attach(){super.attach(),this.forceNext=!1,this.scroll.emitMount(this)}format(t,e){t===G.blotName&&(this.forceNext=!0,this.children.forEach((n=>{n.format(t,e)})))}formatAt(t,e,n,r){n===G.blotName&&(this.forceNext=!0),super.formatAt(t,e,n,r)}highlight(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(null==this.children.head)return;const n=`${Array.from(this.domNode.childNodes).filter((t=>t!==this.uiNode)).map((t=>t.textContent)).join("\n")}\n`,r=G.formats(this.children.head.domNode);if(e||this.forceNext||this.cachedText!==n){if(n.trim().length>0||null==this.cachedText){const e=this.children.reduce(((t,e)=>t.concat((0,a.mG)(e,!1))),new(z())),i=t(n,r);e.diff(i).reduce(((t,e)=>{let{retain:n,attributes:r}=e;return n?(r&&Object.keys(r).forEach((e=>{[G.blotName,Z.blotName].includes(e)&&this.formatAt(t,n,e,r[e])})),t+n):t}),0)}this.cachedText=n,this.forceNext=!1}}html(t,e){const[n]=this.children.find(t);return`
    \n${(0,V.X)(this.code(t,e))}\n
    `}optimize(t){if(super.optimize(t),null!=this.parent&&null!=this.children.head&&null!=this.uiNode){const t=G.formats(this.children.head.domNode);t!==this.uiNode.value&&(this.uiNode.value=t)}}}X.allowedChildren=[G],G.requiredContainer=X,G.allowedChildren=[Z,$.A,V.A,H.A];class Q extends F.A{static register(){p.Ay.register(Z,!0),p.Ay.register(G,!0),p.Ay.register(X,!0)}constructor(t,e){if(super(t,e),null==this.options.hljs)throw new Error("Syntax module requires highlight.js. Please include the library on the page before Quill.");this.languages=this.options.languages.reduce(((t,e)=>{let{key:n}=e;return t[n]=!0,t}),{}),this.highlightBlot=this.highlightBlot.bind(this),this.initListener(),this.initTimer()}initListener(){this.quill.on(p.Ay.events.SCROLL_BLOT_MOUNT,(t=>{if(!(t instanceof X))return;const e=this.quill.root.ownerDocument.createElement("select");this.options.languages.forEach((t=>{let{key:n,label:r}=t;const i=e.ownerDocument.createElement("option");i.textContent=r,i.setAttribute("value",n),e.appendChild(i)})),e.addEventListener("change",(()=>{t.format(G.blotName,e.value),this.quill.root.focus(),this.highlight(t,!0)})),null==t.uiNode&&(t.attachUI(e),t.children.head&&(e.value=G.formats(t.children.head.domNode)))}))}initTimer(){let t=null;this.quill.on(p.Ay.events.SCROLL_OPTIMIZE,(()=>{t&&clearTimeout(t),t=setTimeout((()=>{this.highlight(),t=null}),this.options.interval)}))}highlight(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.quill.selection.composing)return;this.quill.update(p.Ay.sources.USER);const n=this.quill.getSelection();(null==t?this.quill.scroll.descendants(X):[t]).forEach((t=>{t.highlight(this.highlightBlot,e)})),this.quill.update(p.Ay.sources.SILENT),null!=n&&this.quill.setSelection(n,p.Ay.sources.SILENT)}highlightBlot(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"plain";if(e=this.languages[e]?e:"plain","plain"===e)return(0,V.X)(t).split("\n").reduce(((t,n,r)=>(0!==r&&t.insert("\n",{[D.Ay.blotName]:e}),t.insert(n))),new(z()));const n=this.quill.root.ownerDocument.createElement("div");return n.classList.add(D.Ay.className),n.innerHTML=((t,e,n)=>{if("string"==typeof t.versionString){const r=t.versionString.split(".")[0];if(parseInt(r,10)>=11)return t.highlight(n,{language:e}).value}return t.highlight(e,n).value})(this.options.hljs,e,t),(0,K.hV)(this.quill.scroll,n,[(t,e)=>{const n=W.value(t);return n?e.compose((new(z())).retain(e.length(),{[Z.blotName]:n})):e}],[(t,n)=>t.data.split("\n").reduce(((t,n,r)=>(0!==r&&t.insert("\n",{[D.Ay.blotName]:e}),t.insert(n))),n)],new WeakMap)}}Q.DEFAULTS={hljs:window.hljs,interval:1e3,languages:[{key:"plain",label:"Plain"},{key:"r",label:"R"},{key:"bash",label:"Bash"},{key:"cpp",label:"C++"},{key:"cs",label:"C#"},{key:"css",label:"CSS"},{key:"diff",label:"Diff"},{key:"xml",label:"HTML/XML"},{key:"java",label:"Java"},{key:"javascript",label:"JavaScript"},{key:"markdown",label:"Markdown"},{key:"php",label:"PHP"},{key:"python",label:"Python"},{key:"ruby",label:"Ruby"},{key:"sql",label:"SQL"}]};class J extends a.Ay{static blotName="table";static tagName="TD";static create(t){const e=super.create();return t?e.setAttribute("data-row",t):e.setAttribute("data-row",nt()),e}static formats(t){if(t.hasAttribute("data-row"))return t.getAttribute("data-row")}cellOffset(){return this.parent?this.parent.children.indexOf(this):-1}format(t,e){t===J.blotName&&e?this.domNode.setAttribute("data-row",e):super.format(t,e)}row(){return this.parent}rowOffset(){return this.row()?this.row().rowOffset():-1}table(){return this.row()&&this.row().table()}}class Y extends f.A{static blotName="table-row";static tagName="TR";checkMerge(){if(super.checkMerge()&&null!=this.next.children.head){const t=this.children.head.formats(),e=this.children.tail.formats(),n=this.next.children.head.formats(),r=this.next.children.tail.formats();return t.table===e.table&&t.table===n.table&&t.table===r.table}return!1}optimize(t){super.optimize(t),this.children.forEach((t=>{if(null==t.next)return;const e=t.formats(),n=t.next.formats();if(e.table!==n.table){const e=this.splitAfter(t);e&&e.optimize(),this.prev&&this.prev.optimize()}}))}rowOffset(){return this.parent?this.parent.children.indexOf(this):-1}table(){return this.parent&&this.parent.parent}}class tt extends f.A{static blotName="table-body";static tagName="TBODY"}class et extends f.A{static blotName="table-container";static tagName="TABLE";balanceCells(){const t=this.descendants(Y),e=t.reduce(((t,e)=>Math.max(e.children.length,t)),0);t.forEach((t=>{new Array(e-t.children.length).fill(0).forEach((()=>{let e;null!=t.children.head&&(e=J.formats(t.children.head.domNode));const n=this.scroll.create(J.blotName,e);t.appendChild(n),n.optimize()}))}))}cells(t){return this.rows().map((e=>e.children.at(t)))}deleteColumn(t){const[e]=this.descendant(tt);null!=e&&null!=e.children.head&&e.children.forEach((e=>{const n=e.children.at(t);null!=n&&n.remove()}))}insertColumn(t){const[e]=this.descendant(tt);null!=e&&null!=e.children.head&&e.children.forEach((e=>{const n=e.children.at(t),r=J.formats(e.children.head.domNode),i=this.scroll.create(J.blotName,r);e.insertBefore(i,n)}))}insertRow(t){const[e]=this.descendant(tt);if(null==e||null==e.children.head)return;const n=nt(),r=this.scroll.create(Y.blotName);e.children.head.children.forEach((()=>{const t=this.scroll.create(J.blotName,n);r.appendChild(t)}));const i=e.children.at(t);e.insertBefore(r,i)}rows(){const t=this.children.head;return null==t?[]:t.children.map((t=>t))}}function nt(){return`row-${Math.random().toString(36).slice(2,6)}`}et.allowedChildren=[tt],tt.requiredContainer=et,tt.allowedChildren=[Y],Y.requiredContainer=tt,Y.allowedChildren=[J],J.requiredContainer=Y;class rt extends F.A{static register(){p.Ay.register(J),p.Ay.register(Y),p.Ay.register(tt),p.Ay.register(et)}constructor(){super(...arguments),this.listenBalanceCells()}balanceTables(){this.quill.scroll.descendants(et).forEach((t=>{t.balanceCells()}))}deleteColumn(){const[t,,e]=this.getTable();null!=e&&(t.deleteColumn(e.cellOffset()),this.quill.update(p.Ay.sources.USER))}deleteRow(){const[,t]=this.getTable();null!=t&&(t.remove(),this.quill.update(p.Ay.sources.USER))}deleteTable(){const[t]=this.getTable();if(null==t)return;const e=t.offset();t.remove(),this.quill.update(p.Ay.sources.USER),this.quill.setSelection(e,p.Ay.sources.SILENT)}getTable(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.quill.getSelection();if(null==t)return[null,null,null,-1];const[e,n]=this.quill.getLine(t.index);if(null==e||e.statics.blotName!==J.blotName)return[null,null,null,-1];const r=e.parent;return[r.parent.parent,r,e,n]}insertColumn(t){const e=this.quill.getSelection();if(!e)return;const[n,r,i]=this.getTable(e);if(null==i)return;const s=i.cellOffset();n.insertColumn(s+t),this.quill.update(p.Ay.sources.USER);let o=r.rowOffset();0===t&&(o+=1),this.quill.setSelection(e.index+o,e.length,p.Ay.sources.SILENT)}insertColumnLeft(){this.insertColumn(0)}insertColumnRight(){this.insertColumn(1)}insertRow(t){const e=this.quill.getSelection();if(!e)return;const[n,r,i]=this.getTable(e);if(null==i)return;const s=r.rowOffset();n.insertRow(s+t),this.quill.update(p.Ay.sources.USER),t>0?this.quill.setSelection(e,p.Ay.sources.SILENT):this.quill.setSelection(e.index+r.children.length,e.length,p.Ay.sources.SILENT)}insertRowAbove(){this.insertRow(0)}insertRowBelow(){this.insertRow(1)}insertTable(t,e){const n=this.quill.getSelection();if(null==n)return;const r=new Array(t).fill(0).reduce((t=>{const n=new Array(e).fill("\n").join("");return t.insert(n,{table:nt()})}),(new(z())).retain(n.index));this.quill.updateContents(r,p.Ay.sources.USER),this.quill.setSelection(n.index,p.Ay.sources.SILENT),this.balanceTables()}listenBalanceCells(){this.quill.on(p.Ay.events.SCROLL_OPTIMIZE,(t=>{t.some((t=>!!["TD","TR","TBODY","TABLE"].includes(t.target.tagName)&&(this.quill.once(p.Ay.events.TEXT_CHANGE,((t,e,n)=>{n===p.Ay.sources.USER&&this.balanceTables()})),!0)))}))}}var it=rt;const st=(0,n(6078).A)("quill:toolbar");class ot extends F.A{constructor(t,e){if(super(t,e),Array.isArray(this.options.container)){const e=document.createElement("div");e.setAttribute("role","toolbar"),function(t,e){Array.isArray(e[0])||(e=[e]),e.forEach((e=>{const n=document.createElement("span");n.classList.add("ql-formats"),e.forEach((t=>{if("string"==typeof t)lt(n,t);else{const e=Object.keys(t)[0],r=t[e];Array.isArray(r)?function(t,e,n){const r=document.createElement("select");r.classList.add(`ql-${e}`),n.forEach((t=>{const e=document.createElement("option");!1!==t?e.setAttribute("value",String(t)):e.setAttribute("selected","selected"),r.appendChild(e)})),t.appendChild(r)}(n,e,r):lt(n,e,r)}})),t.appendChild(n)}))}(e,this.options.container),t.container?.parentNode?.insertBefore(e,t.container),this.container=e}else"string"==typeof this.options.container?this.container=document.querySelector(this.options.container):this.container=this.options.container;this.container instanceof HTMLElement?(this.container.classList.add("ql-toolbar"),this.controls=[],this.handlers={},this.options.handlers&&Object.keys(this.options.handlers).forEach((t=>{const e=this.options.handlers?.[t];e&&this.addHandler(t,e)})),Array.from(this.container.querySelectorAll("button, select")).forEach((t=>{this.attach(t)})),this.quill.on(p.Ay.events.EDITOR_CHANGE,(()=>{const[t]=this.quill.selection.getRange();this.update(t)}))):st.error("Container required for toolbar",this.options)}addHandler(t,e){this.handlers[t]=e}attach(t){let e=Array.from(t.classList).find((t=>0===t.indexOf("ql-")));if(!e)return;if(e=e.slice(3),"BUTTON"===t.tagName&&t.setAttribute("type","button"),null==this.handlers[e]&&null==this.quill.scroll.query(e))return void st.warn("ignoring attaching to nonexistent format",e,t);const n="SELECT"===t.tagName?"change":"click";t.addEventListener(n,(n=>{let r;if("SELECT"===t.tagName){if(t.selectedIndex<0)return;const e=t.options[t.selectedIndex];r=!e.hasAttribute("selected")&&(e.value||!1)}else r=!t.classList.contains("ql-active")&&(t.value||!t.hasAttribute("value")),n.preventDefault();this.quill.focus();const[i]=this.quill.selection.getRange();if(null!=this.handlers[e])this.handlers[e].call(this,r);else if(this.quill.scroll.query(e).prototype instanceof s.EmbedBlot){if(r=prompt(`Enter ${e}`),!r)return;this.quill.updateContents((new(z())).retain(i.index).delete(i.length).insert({[e]:r}),p.Ay.sources.USER)}else this.quill.format(e,r,p.Ay.sources.USER);this.update(i)})),this.controls.push([e,t])}update(t){const e=null==t?{}:this.quill.getFormat(t);this.controls.forEach((n=>{const[r,i]=n;if("SELECT"===i.tagName){let n=null;if(null==t)n=null;else if(null==e[r])n=i.querySelector("option[selected]");else if(!Array.isArray(e[r])){let t=e[r];"string"==typeof t&&(t=t.replace(/"/g,'\\"')),n=i.querySelector(`option[value="${t}"]`)}null==n?(i.value="",i.selectedIndex=-1):n.selected=!0}else if(null==t)i.classList.remove("ql-active"),i.setAttribute("aria-pressed","false");else if(i.hasAttribute("value")){const t=e[r],n=t===i.getAttribute("value")||null!=t&&t.toString()===i.getAttribute("value")||null==t&&!i.getAttribute("value");i.classList.toggle("ql-active",n),i.setAttribute("aria-pressed",n.toString())}else{const t=null!=e[r];i.classList.toggle("ql-active",t),i.setAttribute("aria-pressed",t.toString())}}))}}function lt(t,e,n){const r=document.createElement("button");r.setAttribute("type","button"),r.classList.add(`ql-${e}`),r.setAttribute("aria-pressed","false"),null!=n?(r.value=n,r.setAttribute("aria-label",`${e}: ${n}`)):r.setAttribute("aria-label",e),t.appendChild(r)}ot.DEFAULTS={},ot.DEFAULTS={container:null,handlers:{clean(){const t=this.quill.getSelection();if(null!=t)if(0===t.length){const t=this.quill.getFormat();Object.keys(t).forEach((t=>{null!=this.quill.scroll.query(t,s.Scope.INLINE)&&this.quill.format(t,!1,p.Ay.sources.USER)}))}else this.quill.removeFormat(t.index,t.length,p.Ay.sources.USER)},direction(t){const{align:e}=this.quill.getFormat();"rtl"===t&&null==e?this.quill.format("align","right",p.Ay.sources.USER):t||"right"!==e||this.quill.format("align",!1,p.Ay.sources.USER),this.quill.format("direction",t,p.Ay.sources.USER)},indent(t){const e=this.quill.getSelection(),n=this.quill.getFormat(e),r=parseInt(n.indent||0,10);if("+1"===t||"-1"===t){let e="+1"===t?1:-1;"rtl"===n.direction&&(e*=-1),this.quill.format("indent",r+e,p.Ay.sources.USER)}},link(t){!0===t&&(t=prompt("Enter link URL:")),this.quill.format("link",t,p.Ay.sources.USER)},list(t){const e=this.quill.getSelection(),n=this.quill.getFormat(e);"check"===t?"checked"===n.list||"unchecked"===n.list?this.quill.format("list",!1,p.Ay.sources.USER):this.quill.format("list","unchecked",p.Ay.sources.USER):this.quill.format("list",t,p.Ay.sources.USER)}}};const at='';var ct={align:{"":'',center:'',right:'',justify:''},background:'',blockquote:'',bold:'',clean:'',code:at,"code-block":at,color:'',direction:{"":'',rtl:''},formula:'',header:{1:'',2:'',3:'',4:'',5:'',6:''},italic:'',image:'',indent:{"+1":'',"-1":''},link:'',list:{bullet:'',check:'',ordered:''},script:{sub:'',super:''},strike:'',table:'',underline:'',video:''};let ut=0;function ht(t,e){t.setAttribute(e,`${!("true"===t.getAttribute(e))}`)}var dt=class{constructor(t){this.select=t,this.container=document.createElement("span"),this.buildPicker(),this.select.style.display="none",this.select.parentNode.insertBefore(this.container,this.select),this.label.addEventListener("mousedown",(()=>{this.togglePicker()})),this.label.addEventListener("keydown",(t=>{switch(t.key){case"Enter":this.togglePicker();break;case"Escape":this.escape(),t.preventDefault()}})),this.select.addEventListener("change",this.update.bind(this))}togglePicker(){this.container.classList.toggle("ql-expanded"),ht(this.label,"aria-expanded"),ht(this.options,"aria-hidden")}buildItem(t){const e=document.createElement("span");e.tabIndex="0",e.setAttribute("role","button"),e.classList.add("ql-picker-item");const n=t.getAttribute("value");return n&&e.setAttribute("data-value",n),t.textContent&&e.setAttribute("data-label",t.textContent),e.addEventListener("click",(()=>{this.selectItem(e,!0)})),e.addEventListener("keydown",(t=>{switch(t.key){case"Enter":this.selectItem(e,!0),t.preventDefault();break;case"Escape":this.escape(),t.preventDefault()}})),e}buildLabel(){const t=document.createElement("span");return t.classList.add("ql-picker-label"),t.innerHTML='',t.tabIndex="0",t.setAttribute("role","button"),t.setAttribute("aria-expanded","false"),this.container.appendChild(t),t}buildOptions(){const t=document.createElement("span");t.classList.add("ql-picker-options"),t.setAttribute("aria-hidden","true"),t.tabIndex="-1",t.id=`ql-picker-options-${ut}`,ut+=1,this.label.setAttribute("aria-controls",t.id),this.options=t,Array.from(this.select.options).forEach((e=>{const n=this.buildItem(e);t.appendChild(n),!0===e.selected&&this.selectItem(n)})),this.container.appendChild(t)}buildPicker(){Array.from(this.select.attributes).forEach((t=>{this.container.setAttribute(t.name,t.value)})),this.container.classList.add("ql-picker"),this.label=this.buildLabel(),this.buildOptions()}escape(){this.close(),setTimeout((()=>this.label.focus()),1)}close(){this.container.classList.remove("ql-expanded"),this.label.setAttribute("aria-expanded","false"),this.options.setAttribute("aria-hidden","true")}selectItem(t){let e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=this.container.querySelector(".ql-selected");t!==n&&(null!=n&&n.classList.remove("ql-selected"),null!=t&&(t.classList.add("ql-selected"),this.select.selectedIndex=Array.from(t.parentNode.children).indexOf(t),t.hasAttribute("data-value")?this.label.setAttribute("data-value",t.getAttribute("data-value")):this.label.removeAttribute("data-value"),t.hasAttribute("data-label")?this.label.setAttribute("data-label",t.getAttribute("data-label")):this.label.removeAttribute("data-label"),e&&(this.select.dispatchEvent(new Event("change")),this.close())))}update(){let t;if(this.select.selectedIndex>-1){const e=this.container.querySelector(".ql-picker-options").children[this.select.selectedIndex];t=this.select.options[this.select.selectedIndex],this.selectItem(e)}else this.selectItem(null);const e=null!=t&&t!==this.select.querySelector("option[selected]");this.label.classList.toggle("ql-active",e)}},ft=class extends dt{constructor(t,e){super(t),this.label.innerHTML=e,this.container.classList.add("ql-color-picker"),Array.from(this.container.querySelectorAll(".ql-picker-item")).slice(0,7).forEach((t=>{t.classList.add("ql-primary")}))}buildItem(t){const e=super.buildItem(t);return e.style.backgroundColor=t.getAttribute("value")||"",e}selectItem(t,e){super.selectItem(t,e);const n=this.label.querySelector(".ql-color-label"),r=t&&t.getAttribute("data-value")||"";n&&("line"===n.tagName?n.style.stroke=r:n.style.fill=r)}},pt=class extends dt{constructor(t,e){super(t),this.container.classList.add("ql-icon-picker"),Array.from(this.container.querySelectorAll(".ql-picker-item")).forEach((t=>{t.innerHTML=e[t.getAttribute("data-value")||""]})),this.defaultItem=this.container.querySelector(".ql-selected"),this.selectItem(this.defaultItem)}selectItem(t,e){super.selectItem(t,e);const n=t||this.defaultItem;if(null!=n){if(this.label.innerHTML===n.innerHTML)return;this.label.innerHTML=n.innerHTML}}},gt=class{constructor(t,e){this.quill=t,this.boundsContainer=e||document.body,this.root=t.addContainer("ql-tooltip"),this.root.innerHTML=this.constructor.TEMPLATE,(t=>{const{overflowY:e}=getComputedStyle(t,null);return"visible"!==e&&"clip"!==e})(this.quill.root)&&this.quill.root.addEventListener("scroll",(()=>{this.root.style.marginTop=-1*this.quill.root.scrollTop+"px"})),this.hide()}hide(){this.root.classList.add("ql-hidden")}position(t){const e=t.left+t.width/2-this.root.offsetWidth/2,n=t.bottom+this.quill.root.scrollTop;this.root.style.left=`${e}px`,this.root.style.top=`${n}px`,this.root.classList.remove("ql-flip");const r=this.boundsContainer.getBoundingClientRect(),i=this.root.getBoundingClientRect();let s=0;if(i.right>r.right&&(s=r.right-i.right,this.root.style.left=`${e+s}px`),i.leftr.bottom){const e=i.bottom-i.top,r=t.bottom-t.top+e;this.root.style.top=n-r+"px",this.root.classList.add("ql-flip")}return s}show(){this.root.classList.remove("ql-editing"),this.root.classList.remove("ql-hidden")}},mt=n(8347),bt=n(5374),yt=n(9609);const vt=[!1,"center","right","justify"],At=["#000000","#e60000","#ff9900","#ffff00","#008a00","#0066cc","#9933ff","#ffffff","#facccc","#ffebcc","#ffffcc","#cce8cc","#cce0f5","#ebd6ff","#bbbbbb","#f06666","#ffc266","#ffff66","#66b966","#66a3e0","#c285ff","#888888","#a10000","#b26b00","#b2b200","#006100","#0047b2","#6b24b2","#444444","#5c0000","#663d00","#666600","#003700","#002966","#3d1466"],xt=[!1,"serif","monospace"],Nt=["1","2","3",!1],Et=["small",!1,"large","huge"];class wt extends yt.A{constructor(t,e){super(t,e);const n=e=>{document.body.contains(t.root)?(null==this.tooltip||this.tooltip.root.contains(e.target)||document.activeElement===this.tooltip.textbox||this.quill.hasFocus()||this.tooltip.hide(),null!=this.pickers&&this.pickers.forEach((t=>{t.container.contains(e.target)||t.close()}))):document.body.removeEventListener("click",n)};t.emitter.listenDOM("click",document.body,n)}addModule(t){const e=super.addModule(t);return"toolbar"===t&&this.extendToolbar(e),e}buildButtons(t,e){Array.from(t).forEach((t=>{(t.getAttribute("class")||"").split(/\s+/).forEach((n=>{if(n.startsWith("ql-")&&(n=n.slice(3),null!=e[n]))if("direction"===n)t.innerHTML=e[n][""]+e[n].rtl;else if("string"==typeof e[n])t.innerHTML=e[n];else{const r=t.value||"";null!=r&&e[n][r]&&(t.innerHTML=e[n][r])}}))}))}buildPickers(t,e){this.pickers=Array.from(t).map((t=>{if(t.classList.contains("ql-align")&&(null==t.querySelector("option")&&kt(t,vt),"object"==typeof e.align))return new pt(t,e.align);if(t.classList.contains("ql-background")||t.classList.contains("ql-color")){const n=t.classList.contains("ql-background")?"background":"color";return null==t.querySelector("option")&&kt(t,At,"background"===n?"#ffffff":"#000000"),new ft(t,e[n])}return null==t.querySelector("option")&&(t.classList.contains("ql-font")?kt(t,xt):t.classList.contains("ql-header")?kt(t,Nt):t.classList.contains("ql-size")&&kt(t,Et)),new dt(t)})),this.quill.on(bt.A.events.EDITOR_CHANGE,(()=>{this.pickers.forEach((t=>{t.update()}))}))}}wt.DEFAULTS=(0,mt.A)({},yt.A.DEFAULTS,{modules:{toolbar:{handlers:{formula(){this.quill.theme.tooltip.edit("formula")},image(){let t=this.container.querySelector("input.ql-image[type=file]");null==t&&(t=document.createElement("input"),t.setAttribute("type","file"),t.setAttribute("accept",this.quill.uploader.options.mimetypes.join(", ")),t.classList.add("ql-image"),t.addEventListener("change",(()=>{const e=this.quill.getSelection(!0);this.quill.uploader.upload(e,t.files),t.value=""})),this.container.appendChild(t)),t.click()},video(){this.quill.theme.tooltip.edit("video")}}}}});class qt extends gt{constructor(t,e){super(t,e),this.textbox=this.root.querySelector('input[type="text"]'),this.listen()}listen(){this.textbox.addEventListener("keydown",(t=>{"Enter"===t.key?(this.save(),t.preventDefault()):"Escape"===t.key&&(this.cancel(),t.preventDefault())}))}cancel(){this.hide(),this.restoreFocus()}edit(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"link",e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(this.root.classList.remove("ql-hidden"),this.root.classList.add("ql-editing"),null==this.textbox)return;null!=e?this.textbox.value=e:t!==this.root.getAttribute("data-mode")&&(this.textbox.value="");const n=this.quill.getBounds(this.quill.selection.savedRange);null!=n&&this.position(n),this.textbox.select(),this.textbox.setAttribute("placeholder",this.textbox.getAttribute(`data-${t}`)||""),this.root.setAttribute("data-mode",t)}restoreFocus(){this.quill.focus({preventScroll:!0})}save(){let{value:t}=this.textbox;switch(this.root.getAttribute("data-mode")){case"link":{const{scrollTop:e}=this.quill.root;this.linkRange?(this.quill.formatText(this.linkRange,"link",t,bt.A.sources.USER),delete this.linkRange):(this.restoreFocus(),this.quill.format("link",t,bt.A.sources.USER)),this.quill.root.scrollTop=e;break}case"video":t=function(t){let e=t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/)||t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/);return e?`${e[1]||"https"}://www.youtube.com/embed/${e[2]}?showinfo=0`:(e=t.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/))?`${e[1]||"https"}://player.vimeo.com/video/${e[2]}/`:t}(t);case"formula":{if(!t)break;const e=this.quill.getSelection(!0);if(null!=e){const n=e.index+e.length;this.quill.insertEmbed(n,this.root.getAttribute("data-mode"),t,bt.A.sources.USER),"formula"===this.root.getAttribute("data-mode")&&this.quill.insertText(n+1," ",bt.A.sources.USER),this.quill.setSelection(n+2,bt.A.sources.USER)}break}}this.textbox.value="",this.hide()}}function kt(t,e){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];e.forEach((e=>{const r=document.createElement("option");e===n?r.setAttribute("selected","selected"):r.setAttribute("value",String(e)),t.appendChild(r)}))}var _t=n(8298);const Lt=[["bold","italic","link"],[{header:1},{header:2},"blockquote"]];class St extends qt{static TEMPLATE=['','
    ','','',"
    "].join("");constructor(t,e){super(t,e),this.quill.on(bt.A.events.EDITOR_CHANGE,((t,e,n,r)=>{if(t===bt.A.events.SELECTION_CHANGE)if(null!=e&&e.length>0&&r===bt.A.sources.USER){this.show(),this.root.style.left="0px",this.root.style.width="",this.root.style.width=`${this.root.offsetWidth}px`;const t=this.quill.getLines(e.index,e.length);if(1===t.length){const t=this.quill.getBounds(e);null!=t&&this.position(t)}else{const n=t[t.length-1],r=this.quill.getIndex(n),i=Math.min(n.length()-1,e.index+e.length-r),s=this.quill.getBounds(new _t.Q(r,i));null!=s&&this.position(s)}}else document.activeElement!==this.textbox&&this.quill.hasFocus()&&this.hide()}))}listen(){super.listen(),this.root.querySelector(".ql-close").addEventListener("click",(()=>{this.root.classList.remove("ql-editing")})),this.quill.on(bt.A.events.SCROLL_OPTIMIZE,(()=>{setTimeout((()=>{if(this.root.classList.contains("ql-hidden"))return;const t=this.quill.getSelection();if(null!=t){const e=this.quill.getBounds(t);null!=e&&this.position(e)}}),1)}))}cancel(){this.show()}position(t){const e=super.position(t),n=this.root.querySelector(".ql-tooltip-arrow");return n.style.marginLeft="",0!==e&&(n.style.marginLeft=-1*e-n.offsetWidth/2+"px"),e}}class Ot extends wt{constructor(t,e){null!=e.modules.toolbar&&null==e.modules.toolbar.container&&(e.modules.toolbar.container=Lt),super(t,e),this.quill.container.classList.add("ql-bubble")}extendToolbar(t){this.tooltip=new St(this.quill,this.options.bounds),null!=t.container&&(this.tooltip.root.appendChild(t.container),this.buildButtons(t.container.querySelectorAll("button"),ct),this.buildPickers(t.container.querySelectorAll("select"),ct))}}Ot.DEFAULTS=(0,mt.A)({},wt.DEFAULTS,{modules:{toolbar:{handlers:{link(t){t?this.quill.theme.tooltip.edit():this.quill.format("link",!1,p.Ay.sources.USER)}}}}});const Tt=[[{header:["1","2","3",!1]}],["bold","italic","underline","link"],[{list:"ordered"},{list:"bullet"}],["clean"]];class jt extends qt{static TEMPLATE=['','','',''].join("");preview=this.root.querySelector("a.ql-preview");listen(){super.listen(),this.root.querySelector("a.ql-action").addEventListener("click",(t=>{this.root.classList.contains("ql-editing")?this.save():this.edit("link",this.preview.textContent),t.preventDefault()})),this.root.querySelector("a.ql-remove").addEventListener("click",(t=>{if(null!=this.linkRange){const t=this.linkRange;this.restoreFocus(),this.quill.formatText(t,"link",!1,bt.A.sources.USER),delete this.linkRange}t.preventDefault(),this.hide()})),this.quill.on(bt.A.events.SELECTION_CHANGE,((t,e,n)=>{if(null!=t){if(0===t.length&&n===bt.A.sources.USER){const[e,n]=this.quill.scroll.descendant(w,t.index);if(null!=e){this.linkRange=new _t.Q(t.index-n,e.length());const r=w.formats(e.domNode);this.preview.textContent=r,this.preview.setAttribute("href",r),this.show();const i=this.quill.getBounds(this.linkRange);return void(null!=i&&this.position(i))}}else delete this.linkRange;this.hide()}}))}show(){super.show(),this.root.removeAttribute("data-mode")}}class Ct extends wt{constructor(t,e){null!=e.modules.toolbar&&null==e.modules.toolbar.container&&(e.modules.toolbar.container=Tt),super(t,e),this.quill.container.classList.add("ql-snow")}extendToolbar(t){null!=t.container&&(t.container.classList.add("ql-snow"),this.buildButtons(t.container.querySelectorAll("button"),ct),this.buildPickers(t.container.querySelectorAll("select"),ct),this.tooltip=new jt(this.quill,this.options.bounds),t.container.querySelector(".ql-link")&&this.quill.keyboard.addBinding({key:"k",shortKey:!0},((e,n)=>{t.handlers.link.call(t,!n.format.link)})))}}Ct.DEFAULTS=(0,mt.A)({},wt.DEFAULTS,{modules:{toolbar:{handlers:{link(t){if(t){const t=this.quill.getSelection();if(null==t||0===t.length)return;let e=this.quill.getText(t);/^\S+@\S+\.\S+$/.test(e)&&0!==e.indexOf("mailto:")&&(e=`mailto:${e}`);const{tooltip:n}=this.quill.theme;n.edit("link",e)}else this.quill.format("link",!1,p.Ay.sources.USER)}}}}});var Rt=Ct;t.default.register({"attributors/attribute/direction":i.Mc,"attributors/class/align":e.qh,"attributors/class/background":b.l,"attributors/class/color":y.g3,"attributors/class/direction":i.sY,"attributors/class/font":v.q,"attributors/class/size":A.U,"attributors/style/align":e.Hu,"attributors/style/background":b.s,"attributors/style/color":y.JM,"attributors/style/direction":i.VL,"attributors/style/font":v.z,"attributors/style/size":A.r},!0),t.default.register({"formats/align":e.qh,"formats/direction":i.sY,"formats/indent":l,"formats/background":b.s,"formats/color":y.JM,"formats/font":v.q,"formats/size":A.U,"formats/blockquote":u,"formats/code-block":D.Ay,"formats/header":d,"formats/list":m,"formats/bold":E,"formats/code":D.Cy,"formats/italic":class extends E{static blotName="italic";static tagName=["EM","I"]},"formats/link":w,"formats/script":_,"formats/strike":class extends E{static blotName="strike";static tagName=["S","STRIKE"]},"formats/underline":S,"formats/formula":j,"formats/image":I,"formats/video":U,"modules/syntax":Q,"modules/table":it,"modules/toolbar":ot,"themes/bubble":Ot,"themes/snow":Rt,"ui/icons":ct,"ui/picker":dt,"ui/icon-picker":pt,"ui/color-picker":ft,"ui/tooltip":gt},!0);var It=t.default}(),r.default}()})); From 544c9e7c31d5692ac3362591a400d7ed84ae9dfc Mon Sep 17 00:00:00 2001 From: "Weblate (bot)" Date: Sat, 3 Aug 2024 04:53:52 +0200 Subject: [PATCH 07/70] Translated using Weblate (German) (#5634) Currently translated at 98.9% (1096 of 1108 strings) Translation: JASP/jaspDesktop Translate-URL: https://hosted.weblate.org/projects/jasp/jaspdesktop/de/ Co-authored-by: Johannes Keyser --- Desktop/po/jaspDesktop-de.po | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/Desktop/po/jaspDesktop-de.po b/Desktop/po/jaspDesktop-de.po index dca414bb63..10f1d80110 100644 --- a/Desktop/po/jaspDesktop-de.po +++ b/Desktop/po/jaspDesktop-de.po @@ -1,9 +1,15 @@ msgid "" msgstr "" +"PO-Revision-Date: 2024-07-31 10:09+0000\n" +"Last-Translator: Johannes Keyser \n" +"Language-Team: German \n" +"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.7-dev\n" "X-Language: en_US\n" "X-Source-Language: American English\n" "X-Qt-Contexts: true\n" @@ -2912,8 +2918,8 @@ msgid "" "href=\"http://%6\">%6

    " msgstr "" "

    %1

    Version %2

    %3



    Erstellt von %4 und " -"gepflegt von %5.
    Siehe Website für weitere Details: %6
    " +"gepflegt von %5.

    Siehe Webseite für weitere Details: %6
    " #, qt-format msgctxt "ListModelTableViewBase|" @@ -4819,20 +4825,20 @@ msgid "" "For individual donations: please visit the JASP website.\n" msgstr "" "

    Kontakt

    \n" -"Für Verbesserungsvorschläge und Fehlerberichte: Bitte öffnen Sie ein Ticket auf unserer " -"GitHub-Seite, wie hier erläutert.\n" +"Für Verbesserungsvorschläge und Fehlerberichte: Bitte öffnen Sie ein Ticket auf unserer GitHub-Seite, " +"wie hier erläutert.\n" "Dies bringt Sie in direkten Kontakt mit den JASP-Softwareentwicklern.\n" "\n" "Für statistische Fragen: Schreiben Sie bitte einen Beitrag im " "JASP-Forum.\n" "\n" "Für Informationen zur JASP-Gemeinschaft: Lesen Sie bitte die " -"Informationen auf der JASP-Website\n" +"Informationen auf der JASP-Webseite\n" "\n" "Um vorzuschlagen, dass wir Ihre Einrichtung zur JASP-" -"Weltkarte hinzufügen, senden Sie bitte eine E-Mail an communications@jasp-stats.org.\n" +"Weltkarte hinzufügen, senden Sie bitte eine E-Mail an communications@jasp-stats.org.\n" "\n" "Für individuelle Spenden: Besuchen Sie bitte die JASP-" "Webseite.\n" @@ -5225,7 +5231,7 @@ msgid "" "Click here for the current list of educators\n" msgstr "" "

    Gemeinschaft

    \n" -"The Institutionen der höheren Bildung, die sich an der JASP-Gemeinschaft " +"Die Institutionen der höheren Bildung, die sich an der JASP-Gemeinschaft " "beteiligen, unterstützen gemeinsam die Wartung und Weiterentwicklung von " "JASP und bieten damit einen unschätzbaren Bildungsdienst für ihre eigenen " "Studierenden und die anderer Institutionen weltweit.\n" From b731e618b3b9621c8591b9fb8637d1526bea5889 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 3 Aug 2024 02:57:34 +0000 Subject: [PATCH 08/70] updated translation files --- Desktop/po/jaspDesktop-de.po | 22 ++++++++-------------- Resources/Translations/jaspDesktop-de.qm | Bin 179337 -> 179341 bytes 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/Desktop/po/jaspDesktop-de.po b/Desktop/po/jaspDesktop-de.po index 10f1d80110..fcc874271f 100644 --- a/Desktop/po/jaspDesktop-de.po +++ b/Desktop/po/jaspDesktop-de.po @@ -1,15 +1,9 @@ msgid "" msgstr "" -"PO-Revision-Date: 2024-07-31 10:09+0000\n" -"Last-Translator: Johannes Keyser \n" -"Language-Team: German \n" -"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.7-dev\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Language: en_US\n" "X-Source-Language: American English\n" "X-Qt-Contexts: true\n" @@ -2918,8 +2912,8 @@ msgid "" "href=\"http://%6\">%6

    " msgstr "" "

    %1

    Version %2

    %3



    Erstellt von %4 und " -"gepflegt von %5.
    Siehe Webseite für weitere Details: %6
    " +"gepflegt von %5.

    Siehe Webseite für weitere Details: %6
    " #, qt-format msgctxt "ListModelTableViewBase|" @@ -4825,9 +4819,9 @@ msgid "" "For individual donations: please visit the JASP website.\n" msgstr "" "

    Kontakt

    \n" -"Für Verbesserungsvorschläge und Fehlerberichte: Bitte öffnen Sie ein Ticket auf unserer GitHub-Seite, " -"wie hier erläutert.\n" +"Für Verbesserungsvorschläge und Fehlerberichte: Bitte öffnen Sie ein Ticket auf unserer " +"GitHub-Seite, wie hier erläutert.\n" "Dies bringt Sie in direkten Kontakt mit den JASP-Softwareentwicklern.\n" "\n" "Für statistische Fragen: Schreiben Sie bitte einen Beitrag im " @@ -4837,8 +4831,8 @@ msgstr "" "Informationen auf der JASP-Webseite\n" "\n" "Um vorzuschlagen, dass wir Ihre Einrichtung zur JASP-" -"Weltkarte hinzufügen, senden Sie bitte eine E-Mail an communications@jasp-stats.org.\n" +"Weltkarte hinzufügen, senden Sie bitte eine E-Mail an communications@jasp-stats.org.\n" "\n" "Für individuelle Spenden: Besuchen Sie bitte die JASP-" "Webseite.\n" diff --git a/Resources/Translations/jaspDesktop-de.qm b/Resources/Translations/jaspDesktop-de.qm index c37193b1b44d68adfc9726a754a43cdbac161b81..d2e5b0dc4edd3de4647269c7a9ed9f48635a6428 100644 GIT binary patch delta 6500 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 delta 6496 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 From e20cba950dbac0d104d2015da1cc5bf1366aa8a3 Mon Sep 17 00:00:00 2001 From: RensDofferhoff <20978635+RensDofferhoff@users.noreply.github.com> Date: Mon, 5 Aug 2024 11:57:18 +0200 Subject: [PATCH 09/70] Fix max column (#5636) * add sqlite compile options to increase column limit * Fix CSV loader segfault --------- Co-authored-by: Rens --- Desktop/data/importers/csv/csv.cpp | 1 + conanfile.txt | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Desktop/data/importers/csv/csv.cpp b/Desktop/data/importers/csv/csv.cpp index 3d1ce29b5d..50009e39f2 100644 --- a/Desktop/data/importers/csv/csv.cpp +++ b/Desktop/data/importers/csv/csv.cpp @@ -402,6 +402,7 @@ void CSV::determineNumRows() if (i >= _utf8BufferEndPos - 1) { + _utf8BufferEndPos = 0; bool success = readUtf8(); if (success) i = -1; diff --git a/conanfile.txt b/conanfile.txt index f0e1d80fcf..f8f27a7ac8 100644 --- a/conanfile.txt +++ b/conanfile.txt @@ -15,7 +15,7 @@ jsoncpp/1.9.5 openssl/3.0.10 bison/3.7.6 brotli/1.0.9 -sqlite3/3.38.5 +sqlite3/3.46.0 gmp/6.3.0 mpfr/4.2.1 @@ -24,4 +24,5 @@ CMakeDeps CMakeToolchain [options] -brotli/:shared=True \ No newline at end of file +brotli/:shared=True +sqlite3*:max_column=32767 From d1b1497f377f206d7aea805e90d23a8eef7be9e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20O=2E=20Santos?= Date: Mon, 26 Aug 2024 12:53:15 +0100 Subject: [PATCH 10/70] Fix Arch Linux system deps install commands in linux build guide (#5640) * Fix Arch Linux install dep in Linux build guide JAGS is not available in the official repos only in the aur * Fix typo in Linux build guide --- Docs/development/jasp-build-guide-linux.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Docs/development/jasp-build-guide-linux.md b/Docs/development/jasp-build-guide-linux.md index 56f432415b..ad3576cca1 100644 --- a/Docs/development/jasp-build-guide-linux.md +++ b/Docs/development/jasp-build-guide-linux.md @@ -47,10 +47,10 @@ On Manjaro / Arch ``` sudo pacman -Syu autoconf bison boost cmake gcc gcc-fortran git glpk flex jags jsoncpp libarchive openssl patchelf r readstat zlib -# Google's V8 is only available through the aur consider using an aur helper +# JAGS and Google's V8 are only available through the aur # Note that only jaspProcess requires V8 and V8 takes a lot of time to compile -# To install it using the `yay` aur helper run: -yay -Syu v8-r +# To install them using the `yay` aur helper run: +yay -Syu jags v8-r ``` On Fedora/RHEL @@ -94,7 +94,7 @@ On Linux JASP's CMake script will download and install ReadStat and JAGS for you Similar to Windows and macOS, you can download and install the Qt Framework from Qt website, [here](https://www.qt.io/download). -> 💡 Sometimes, dependeing on your Linux distribution, you might be able to get the Qt libraries using your package manger. For instance, if you are running any variant of an Arch Linux, e.g., Manjaro, `pacman` readily offers the latest build of the Qt libraries, and you can download it by running the following command, `pacman -Syu qt6`. +> 💡 Sometimes, dependeing on your Linux distribution, you might be able to get the Qt libraries using your package manager. For instance, if you are running any variant of an Arch Linux, e.g., Manjaro, `pacman` readily offers the latest build of the Qt libraries, and you can download it by running the following command, `pacman -Syu qt6`. ### Configuring and Building JASP Desktop From 56add153d8a9d1ae75341628b566634ffe6e9157 Mon Sep 17 00:00:00 2001 From: Thomas Langkamp Date: Mon, 26 Aug 2024 14:06:28 +0200 Subject: [PATCH 11/70] Update Dev Guide for Linux specifics (#5601) * Update Linux Dev Guide * Update Docs/development/jasp-module-workflow.md Co-authored-by: Shun Wang * Update Docs/development/jasp-module-workflow.md Co-authored-by: Shun Wang --------- Co-authored-by: Shun Wang --- Docs/development/jasp-module-workflow.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Docs/development/jasp-module-workflow.md b/Docs/development/jasp-module-workflow.md index 6b10ae14ba..f9268f1343 100644 --- a/Docs/development/jasp-module-workflow.md +++ b/Docs/development/jasp-module-workflow.md @@ -5,10 +5,11 @@ So you want to develop a module for JASP? Great! The easiest way to do so is downloading the latest [nightly for your system](http://static.jasp-stats.org/Nightlies/) or (a bit harder) [building jasp yourself](./jasp-building-guide.md). ## Linux -To develop on Linux you currently need to compile JASP from source. We have a guide on how to do that [here](https://github.com/jasp-stats/jasp-desktop/blob/development/Docs/development/jasp-building-guide.md). +If you are on linux you can add the 'flathub-beta' repository with `flatpak remote-add --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo`. Then you can install the latest jasp beta as `flatpak install flathub-beta org.jaspstats.JASP` and run it as `flatpak run --branch=beta --devel org.jaspstats.JASP`. It will remember which branch btw, so to go back to the "normal" jasp run `flatpak run --branch=stable org.jaspstats.JASP`. +The hard way to develop on Linux is to compile JASP from source. We have a guide on how to do that [here](https://github.com/jasp-stats/jasp-desktop/blob/development/Docs/development/jasp-building-guide.md). ## Development Process -Then you either create a new module repository [based on this template](https://github.com/jasp-stats/jaspModuleTemplate) or by forking one of the existing modules in [jasp-stats](https://github.com/jasp-stats). +Then you either create a new module repository [based on this template](https://github.com/jasp-stats/jaspModuleTemplate) or by forking one of the existing modules in [jasp-stats](https://github.com/jasp-stats). For example, you can create the fork by downloading the .ZIP and repackage it as a TAR.GZ. To start developing your own module you should first understand the [structure of a module](jasp-adding-module.md). Initially you do not need to add any of the .qml, .R or icon files, but you should minimally have the Description.qml, DESCRIPTION and NAMESPACE. @@ -53,12 +54,11 @@ cd /to/your/module/repository/directory git tag -a v1.0 #It will open an editor where you can add some information on your release git push -u origin v1.0 ``` -If you now go to your GitHub repository you can select `Releases` and download the generated .tar.gz, see the following, ahum, visual guide for more details: -![Visual guide to finding a generated .tar.gz on GitHub](/Docs/development/img/FindingModuleTarGz.png) +If you now go to your GitHub repository you can select `Releases` within the right hand side panel. There you can download the tar.gz. ##### "Hard" way On linux and MacOS this is not so bad: simply open up a terminal and go to the directory containing your module and enter the following: "`tar -czf .tar.gz `". On Windows this is a bit more complicated but can be done through [7zip](https://www.7-zip.org/), first your select you folder `` and compress it to a `.tar` file and then you select that file and compress it to a `.gz` or "gzip" file leaving you with `.tar.gz`. -As you can see this implies that the folder containing your module-files has the same name as your module (aka what is specified in the field `name` in [Description.qml](#Description.qml) or in the `Package` field of [DESCRIPTION](#package-metadata). +This implies that the folder containing your module-files has the same name as your module (aka what is specified in the field `name` in [Description.qml](#Description.qml) or in the `Package` field of [DESCRIPTION](#package-metadata). From f5d07e9ac75d50271ffd7ce522bc30b2e2595844 Mon Sep 17 00:00:00 2001 From: bruno boutin Date: Tue, 27 Aug 2024 12:14:04 +0200 Subject: [PATCH 12/70] Encode non-latin character in QML. --- Docs/development/jasp-qml-guide.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Docs/development/jasp-qml-guide.md b/Docs/development/jasp-qml-guide.md index b4246fdcae..081f9aa550 100644 --- a/Docs/development/jasp-qml-guide.md +++ b/Docs/development/jasp-qml-guide.md @@ -56,12 +56,15 @@ Table of Contents: The components can roughly be divided in three classes. One that deals with general inputs (e.g., checkboxes), one that deals with assigning variables and one that groups components together. Each will be covered in the following section. Some remarks about these components: - They are all QML items, so they automatically get generic QML properties like `enabled` or `visible`. -- In several examples you may encounter `qsTr()`, it is important that this function wraps around all user-visible text, this function makes translating the interface possible. +- In several examples you may encounter `qsTr()`, it is important that this function wraps around all user-visible text, this function makes translating the interface possible. If you use non-latin characters, it is then better to use the `\uXXXX` encoding (XXXX being the Unicode code point of the character), to be sure that that it passes the translation process (avoid the HTML encoding `&#xxx;`). - The components described below may generally be nested to an arbitrary level (e.g., a checkbox in a group in a checkbox). ### Name All (well almost all) of these components have a property `name` that is also used in JASP-files to store the value the user selected. That means that whenever you change `name` for a component for a newer version of your analysis/module the stored value will be ignored. To make sure the user entered information isn't lost you can add an [Upgrades.qml to your module](jasp-upgrade-qml.md). +### Label or title +Most of the components have a label or a title (each word of a title should be capitalized). Unlike the name, the label or title must be translated via the `qsTr()` function. For non-latin characters, use the `\uXXXX` encoding. + ### Info Each component also has a field called `info` which is used to generate documentation from. By wrapping the text in the above mentioned `qsTr` this also allows us to translate the documentation for each module in parts. So you would have something like: ``` From 6c0f62facbec866c01afdeff9d40b76163848a25 Mon Sep 17 00:00:00 2001 From: RensDofferhoff <20978635+RensDofferhoff@users.noreply.github.com> Date: Tue, 27 Aug 2024 13:47:36 +0200 Subject: [PATCH 13/70] update submodules (#5642) --- Engine/jaspModuleInstaller | 2 +- Modules/jaspAcceptanceSampling | 2 +- Modules/jaspAnova | 2 +- Modules/jaspAudit | 2 +- Modules/jaspBain | 2 +- Modules/jaspBsts | 2 +- Modules/jaspCircular | 2 +- Modules/jaspCochrane | 2 +- Modules/jaspDescriptives | 2 +- Modules/jaspDistributions | 2 +- Modules/jaspEquivalenceTTests | 2 +- Modules/jaspFactor | 2 +- Modules/jaspFrequencies | 2 +- Modules/jaspJags | 2 +- Modules/jaspLearnBayes | 2 +- Modules/jaspLearnStats | 2 +- Modules/jaspMachineLearning | 2 +- Modules/jaspMetaAnalysis | 2 +- Modules/jaspMixedModels | 2 +- Modules/jaspNetwork | 2 +- Modules/jaspPower | 2 +- Modules/jaspPredictiveAnalytics | 2 +- Modules/jaspProcess | 2 +- Modules/jaspProphet | 2 +- Modules/jaspQualityControl | 2 +- Modules/jaspRegression | 2 +- Modules/jaspReliability | 2 +- Modules/jaspRobustTTests | 2 +- Modules/jaspSem | 2 +- Modules/jaspSummaryStatistics | 2 +- Modules/jaspSurvival | 2 +- Modules/jaspTTests | 2 +- Modules/jaspTimeSeries | 2 +- Modules/jaspVisualModeling | 2 +- 34 files changed, 34 insertions(+), 34 deletions(-) diff --git a/Engine/jaspModuleInstaller b/Engine/jaspModuleInstaller index 25027282aa..6758cb9283 160000 --- a/Engine/jaspModuleInstaller +++ b/Engine/jaspModuleInstaller @@ -1 +1 @@ -Subproject commit 25027282aa595ff78b61da862360bb3dcf2a883e +Subproject commit 6758cb9283bdcfa3c9d39607242135e765f01646 diff --git a/Modules/jaspAcceptanceSampling b/Modules/jaspAcceptanceSampling index dc1813419a..2a7aeebc05 160000 --- a/Modules/jaspAcceptanceSampling +++ b/Modules/jaspAcceptanceSampling @@ -1 +1 @@ -Subproject commit dc1813419a129df1f87c18360282e8a0351fbc24 +Subproject commit 2a7aeebc059b1dafa52db17e5bbeb3488eaf3b10 diff --git a/Modules/jaspAnova b/Modules/jaspAnova index 6d9c6ba191..04de0932b7 160000 --- a/Modules/jaspAnova +++ b/Modules/jaspAnova @@ -1 +1 @@ -Subproject commit 6d9c6ba1918637ce8246ce2ef92ad53f3ad4fc39 +Subproject commit 04de0932b7b1ec323e247bace6c24cb211d6f895 diff --git a/Modules/jaspAudit b/Modules/jaspAudit index 5991074685..61a849e032 160000 --- a/Modules/jaspAudit +++ b/Modules/jaspAudit @@ -1 +1 @@ -Subproject commit 59910746852ce3ac3376e9d437b15d37ee90c434 +Subproject commit 61a849e0329c9ed032650ac61650fc6f540562bd diff --git a/Modules/jaspBain b/Modules/jaspBain index 89b3be1ce9..50398cf89b 160000 --- a/Modules/jaspBain +++ b/Modules/jaspBain @@ -1 +1 @@ -Subproject commit 89b3be1ce9bca2238b348cdeea8b063d93465e01 +Subproject commit 50398cf89bb5d38b3f014f74f5deaa365ee58200 diff --git a/Modules/jaspBsts b/Modules/jaspBsts index 474d05b36c..8b3e171456 160000 --- a/Modules/jaspBsts +++ b/Modules/jaspBsts @@ -1 +1 @@ -Subproject commit 474d05b36c36323a5999458e7a73ad2f0e48c244 +Subproject commit 8b3e171456e3851ba2a89fc72d1aa114ee145994 diff --git a/Modules/jaspCircular b/Modules/jaspCircular index 874c3f54ed..5a6ad148ed 160000 --- a/Modules/jaspCircular +++ b/Modules/jaspCircular @@ -1 +1 @@ -Subproject commit 874c3f54ed301196f155eb8d6c6c470c3cd68a84 +Subproject commit 5a6ad148ed941f7fd503a121e37f5964fc4b0eb2 diff --git a/Modules/jaspCochrane b/Modules/jaspCochrane index cc0c017a55..0cdcfc4f71 160000 --- a/Modules/jaspCochrane +++ b/Modules/jaspCochrane @@ -1 +1 @@ -Subproject commit cc0c017a5550bfe105e1219fadd6dcbcef92baa0 +Subproject commit 0cdcfc4f71a0b673d07c0f1f645a513f3b524c26 diff --git a/Modules/jaspDescriptives b/Modules/jaspDescriptives index 9a802fd6d6..e9472067e7 160000 --- a/Modules/jaspDescriptives +++ b/Modules/jaspDescriptives @@ -1 +1 @@ -Subproject commit 9a802fd6d6936e724abc3f8c91780439f284d6dc +Subproject commit e9472067e787a3d6f953e48f8af1c25ddc3cacea diff --git a/Modules/jaspDistributions b/Modules/jaspDistributions index 2dd5a7cd94..7eed854b76 160000 --- a/Modules/jaspDistributions +++ b/Modules/jaspDistributions @@ -1 +1 @@ -Subproject commit 2dd5a7cd9453150ad0e247f19c31e2a74191d006 +Subproject commit 7eed854b7630377dc746fb66bd75d1f2752c0b01 diff --git a/Modules/jaspEquivalenceTTests b/Modules/jaspEquivalenceTTests index abf905da1a..ac8b565dc3 160000 --- a/Modules/jaspEquivalenceTTests +++ b/Modules/jaspEquivalenceTTests @@ -1 +1 @@ -Subproject commit abf905da1ac8347a4e484750ba796390d8cd3b83 +Subproject commit ac8b565dc34310a31e6d9124236bfd2c48130bf5 diff --git a/Modules/jaspFactor b/Modules/jaspFactor index 824c2388a7..a6f981580e 160000 --- a/Modules/jaspFactor +++ b/Modules/jaspFactor @@ -1 +1 @@ -Subproject commit 824c2388a771a7ff5c2ac4b1e27b4a497192032f +Subproject commit a6f981580ed658c8368fd93836005c8860f7f918 diff --git a/Modules/jaspFrequencies b/Modules/jaspFrequencies index 7d7d6a354c..98fcab3153 160000 --- a/Modules/jaspFrequencies +++ b/Modules/jaspFrequencies @@ -1 +1 @@ -Subproject commit 7d7d6a354c3ac061450e60bfe590418aab591b1d +Subproject commit 98fcab3153d96c9294da62bd6297579313994326 diff --git a/Modules/jaspJags b/Modules/jaspJags index cbe1694414..b5d93fd73a 160000 --- a/Modules/jaspJags +++ b/Modules/jaspJags @@ -1 +1 @@ -Subproject commit cbe169441437f4a66fd4619b320272b1d42d80de +Subproject commit b5d93fd73a1065f1a2a226c74042f7c88279e407 diff --git a/Modules/jaspLearnBayes b/Modules/jaspLearnBayes index 528e3e88da..a6ba7c50b1 160000 --- a/Modules/jaspLearnBayes +++ b/Modules/jaspLearnBayes @@ -1 +1 @@ -Subproject commit 528e3e88daceae1d12df1044de8390f40f0a3690 +Subproject commit a6ba7c50b1590883efdbf28be529ed45e40ee59f diff --git a/Modules/jaspLearnStats b/Modules/jaspLearnStats index 775a637a11..54a967ca28 160000 --- a/Modules/jaspLearnStats +++ b/Modules/jaspLearnStats @@ -1 +1 @@ -Subproject commit 775a637a1111cae419774a3c8f584e857ad7c0db +Subproject commit 54a967ca28ff26045d3d14afb3466fe25e0f7c53 diff --git a/Modules/jaspMachineLearning b/Modules/jaspMachineLearning index 73808f06a4..bb2e32bdac 160000 --- a/Modules/jaspMachineLearning +++ b/Modules/jaspMachineLearning @@ -1 +1 @@ -Subproject commit 73808f06a4a73ab3142f6db0a74030539fc3b09f +Subproject commit bb2e32bdac96d65f45c103e39d576b932b7adc2e diff --git a/Modules/jaspMetaAnalysis b/Modules/jaspMetaAnalysis index d78139a9e3..f2e6ec9b16 160000 --- a/Modules/jaspMetaAnalysis +++ b/Modules/jaspMetaAnalysis @@ -1 +1 @@ -Subproject commit d78139a9e3847f9675275de85320d84cdcd5e24e +Subproject commit f2e6ec9b16e515ce8fcfc522a232cc97d6f56515 diff --git a/Modules/jaspMixedModels b/Modules/jaspMixedModels index 609a5dd224..add707c947 160000 --- a/Modules/jaspMixedModels +++ b/Modules/jaspMixedModels @@ -1 +1 @@ -Subproject commit 609a5dd22463e742dac9033ec414594367fbab74 +Subproject commit add707c947ec4caca25d16bdf810b3974e75457d diff --git a/Modules/jaspNetwork b/Modules/jaspNetwork index cf3aa43611..cf68b8a3c7 160000 --- a/Modules/jaspNetwork +++ b/Modules/jaspNetwork @@ -1 +1 @@ -Subproject commit cf3aa4361177f5838f3c7abf138bae959effe145 +Subproject commit cf68b8a3c70a8a320617e6b55be3bcd22cd8bb93 diff --git a/Modules/jaspPower b/Modules/jaspPower index 3b6b275c1e..0863941aa6 160000 --- a/Modules/jaspPower +++ b/Modules/jaspPower @@ -1 +1 @@ -Subproject commit 3b6b275c1e09404a792730d705351cd93122becd +Subproject commit 0863941aa66d4e1b3e64826cbf3a68bfe8863a9d diff --git a/Modules/jaspPredictiveAnalytics b/Modules/jaspPredictiveAnalytics index 5ba9553e7a..4598d0c5dc 160000 --- a/Modules/jaspPredictiveAnalytics +++ b/Modules/jaspPredictiveAnalytics @@ -1 +1 @@ -Subproject commit 5ba9553e7a07090071fb4a7a6811d87c13f61268 +Subproject commit 4598d0c5dca9305498743c4f8462ed0e3afb9cf4 diff --git a/Modules/jaspProcess b/Modules/jaspProcess index 59e26f58f1..16754da0a2 160000 --- a/Modules/jaspProcess +++ b/Modules/jaspProcess @@ -1 +1 @@ -Subproject commit 59e26f58f16290aa9c9fa2e50aba8281cfb5b3f9 +Subproject commit 16754da0a246c67d9d95a22fed325f8ceb87fae9 diff --git a/Modules/jaspProphet b/Modules/jaspProphet index 9e349efa7f..bb1f0b5bd9 160000 --- a/Modules/jaspProphet +++ b/Modules/jaspProphet @@ -1 +1 @@ -Subproject commit 9e349efa7f719e6af201adf16b2a9015e90cc14b +Subproject commit bb1f0b5bd917a97832e5fa87f68589f7e142fb43 diff --git a/Modules/jaspQualityControl b/Modules/jaspQualityControl index 4cfbe35632..8b3cc98b9d 160000 --- a/Modules/jaspQualityControl +++ b/Modules/jaspQualityControl @@ -1 +1 @@ -Subproject commit 4cfbe35632be5636712e6f859135c4c6e5aa25f5 +Subproject commit 8b3cc98b9d25d3091982449f9e6986441c140b18 diff --git a/Modules/jaspRegression b/Modules/jaspRegression index a17cb15b50..92e7db0c5e 160000 --- a/Modules/jaspRegression +++ b/Modules/jaspRegression @@ -1 +1 @@ -Subproject commit a17cb15b5099aa0f2ab573935995626e02f155e3 +Subproject commit 92e7db0c5e6a9e1c5ea50a7fc854305b2c75ab9a diff --git a/Modules/jaspReliability b/Modules/jaspReliability index 4aa41d1a0e..af7018a0f0 160000 --- a/Modules/jaspReliability +++ b/Modules/jaspReliability @@ -1 +1 @@ -Subproject commit 4aa41d1a0eecb32787c972d6def7ca75392a1313 +Subproject commit af7018a0f030e1c8e41f302e818d402aa65e99c6 diff --git a/Modules/jaspRobustTTests b/Modules/jaspRobustTTests index 3d76c0ee43..428a951817 160000 --- a/Modules/jaspRobustTTests +++ b/Modules/jaspRobustTTests @@ -1 +1 @@ -Subproject commit 3d76c0ee4325b8425d49844cd21195117639c1bf +Subproject commit 428a95181719321d9f21487895a93437b559098b diff --git a/Modules/jaspSem b/Modules/jaspSem index 720d47a075..62ecdd1606 160000 --- a/Modules/jaspSem +++ b/Modules/jaspSem @@ -1 +1 @@ -Subproject commit 720d47a0756715a564771bc36be2590639afb589 +Subproject commit 62ecdd1606faed707b335930431081981300ad77 diff --git a/Modules/jaspSummaryStatistics b/Modules/jaspSummaryStatistics index f7f1ba2cda..8ebbb1f5ad 160000 --- a/Modules/jaspSummaryStatistics +++ b/Modules/jaspSummaryStatistics @@ -1 +1 @@ -Subproject commit f7f1ba2cdad3bff5adcb837917764445610435f7 +Subproject commit 8ebbb1f5adceed868becaf01e47f8f51e719468d diff --git a/Modules/jaspSurvival b/Modules/jaspSurvival index f26bf6aba9..edccffe30a 160000 --- a/Modules/jaspSurvival +++ b/Modules/jaspSurvival @@ -1 +1 @@ -Subproject commit f26bf6aba9d06b29679f726b7f3097ae8658104b +Subproject commit edccffe30a2ad0b7167c8cb967a2d2b6d5750564 diff --git a/Modules/jaspTTests b/Modules/jaspTTests index bf5e91576b..232d43df09 160000 --- a/Modules/jaspTTests +++ b/Modules/jaspTTests @@ -1 +1 @@ -Subproject commit bf5e91576bada4b8d98735b816842feeb9d7a8ce +Subproject commit 232d43df09f5dbb0fecc08462b018083be349268 diff --git a/Modules/jaspTimeSeries b/Modules/jaspTimeSeries index d32a8a0e7f..718e014128 160000 --- a/Modules/jaspTimeSeries +++ b/Modules/jaspTimeSeries @@ -1 +1 @@ -Subproject commit d32a8a0e7f7e422a12b950d564196af246597228 +Subproject commit 718e0141280d0bc6b268fd62e786c1242108f3ce diff --git a/Modules/jaspVisualModeling b/Modules/jaspVisualModeling index 9ddfff7c92..48587c567d 160000 --- a/Modules/jaspVisualModeling +++ b/Modules/jaspVisualModeling @@ -1 +1 @@ -Subproject commit 9ddfff7c922e31c0e8a37112a99007dcbdcccd10 +Subproject commit 48587c567da75c7d94fb495f2352aa5844375c01 From e5877e750eca076932dcf174be486a0d6523bdd7 Mon Sep 17 00:00:00 2001 From: Shun Wang Date: Tue, 27 Aug 2024 20:30:33 +0800 Subject: [PATCH 14/70] dependencies: upgrade marked.js (#5635) --- Resources/Help/marked-hljs-ext.js | 36 +- Resources/Help/marked.js | 5248 ++++++++++++++--------------- 2 files changed, 2600 insertions(+), 2684 deletions(-) diff --git a/Resources/Help/marked-hljs-ext.js b/Resources/Help/marked-hljs-ext.js index 8979915c53..d0b31092bf 100644 --- a/Resources/Help/marked-hljs-ext.js +++ b/Resources/Help/marked-hljs-ext.js @@ -1,9 +1,15 @@ /** - * Edit from marked-highlight at 2023-06-01 + * Edit from marked-highlight at 2024-08-04 * MIT Licensed * https://github.com/markedjs/marked-highlight */ -function markedHighlight(options) { +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.markedHighlight = {})); +})(this, (function (exports) { 'use strict'; + + function markedHighlight(options) { if (typeof options === 'function') { options = { highlight: options @@ -25,18 +31,28 @@ function markedHighlight(options) { return; } - const lang = getLang(token); + const lang = getLang(token.lang); if (options.async) { - return Promise.resolve(options.highlight(token.text, lang)).then(updateToken(token)); + return Promise.resolve(options.highlight(token.text, lang, token.lang || '')).then(updateToken(token)); } - const code = options.highlight(token.text, lang); + const code = options.highlight(token.text, lang, token.lang || ''); + if (code instanceof Promise) { + throw new Error('markedHighlight is not set to async but the highlight function is async. Set the async option to true on markedHighlight to await the async highlight function.'); + } updateToken(token)(code); }, + useNewRenderer: true, renderer: { code(code, infoString, escaped) { - const lang = (infoString || '').match(/\S*/)[0]; + // istanbul ignore next + if (typeof code === 'object') { + escaped = code.escaped; + infoString = code.lang; + code = code.text; + } + const lang = getLang(infoString); const classAttr = lang ? ` class="${options.langPrefix}${escape(lang)}"` : ''; @@ -47,8 +63,8 @@ function markedHighlight(options) { }; } - function getLang(token) { - return (token.lang || '').match(/\S*/)[0]; + function getLang(lang) { + return (lang || '').match(/\S*/)[0]; } function updateToken(token) { @@ -86,3 +102,7 @@ function markedHighlight(options) { return html; } + + exports.markedHighlight = markedHighlight; + +})); diff --git a/Resources/Help/marked.js b/Resources/Help/marked.js index d135da23cf..beafbda8c5 100644 --- a/Resources/Help/marked.js +++ b/Resources/Help/marked.js @@ -1,6 +1,6 @@ /** - * marked v5.0.1 - a markdown parser - * Copyright (c) 2011-2023, Christopher Jeffrey. (MIT Licensed) + * marked v13.0.3 - a markdown parser + * Copyright (c) 2011-2024, Christopher Jeffrey. (MIT Licensed) * https://github.com/markedjs/marked */ @@ -15,2816 +15,2712 @@ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.marked = {})); })(this, (function (exports) { 'use strict'; - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); - } - } - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - Object.defineProperty(Constructor, "prototype", { - writable: false - }); - return Constructor; - } - function _extends() { - _extends = Object.assign ? Object.assign.bind() : function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - return target; - }; - return _extends.apply(this, arguments); - } - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - return arr2; - } - function _createForOfIteratorHelperLoose(o, allowArrayLike) { - var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; - if (it) return (it = it.call(o)).next.bind(it); - if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { - if (it) o = it; - var i = 0; - return function () { - if (i >= o.length) return { - done: true - }; - return { - done: false, - value: o[i++] - }; + /** + * Gets the original marked default options. + */ + function _getDefaults() { + return { + async: false, + breaks: false, + extensions: null, + gfm: true, + hooks: null, + pedantic: false, + renderer: null, + silent: false, + tokenizer: null, + walkTokens: null, }; - } - throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - function _toPrimitive(input, hint) { - if (typeof input !== "object" || input === null) return input; - var prim = input[Symbol.toPrimitive]; - if (prim !== undefined) { - var res = prim.call(input, hint || "default"); - if (typeof res !== "object") return res; - throw new TypeError("@@toPrimitive must return a primitive value."); - } - return (hint === "string" ? String : Number)(input); } - function _toPropertyKey(arg) { - var key = _toPrimitive(arg, "string"); - return typeof key === "symbol" ? key : String(key); - } - - function getDefaults() { - return { - async: false, - baseUrl: null, - breaks: false, - extensions: null, - gfm: true, - headerIds: true, - headerPrefix: '', - highlight: null, - hooks: null, - langPrefix: 'language-', - mangle: true, - pedantic: false, - renderer: null, - sanitize: false, - sanitizer: null, - silent: false, - smartypants: false, - tokenizer: null, - walkTokens: null, - xhtml: false - }; - } - exports.defaults = getDefaults(); + exports.defaults = _getDefaults(); function changeDefaults(newDefaults) { - exports.defaults = newDefaults; + exports.defaults = newDefaults; } /** * Helpers */ - var escapeTest = /[&<>"']/; - var escapeReplace = new RegExp(escapeTest.source, 'g'); - var escapeTestNoEncode = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/; - var escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g'); - var escapeReplacements = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - }; - var getEscapeReplacement = function getEscapeReplacement(ch) { - return escapeReplacements[ch]; + const escapeTest = /[&<>"']/; + const escapeReplace = new RegExp(escapeTest.source, 'g'); + const escapeTestNoEncode = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/; + const escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g'); + const escapeReplacements = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', }; - function escape(html, encode) { - if (encode) { - if (escapeTest.test(html)) { - return html.replace(escapeReplace, getEscapeReplacement); + const getEscapeReplacement = (ch) => escapeReplacements[ch]; + function escape$1(html, encode) { + if (encode) { + if (escapeTest.test(html)) { + return html.replace(escapeReplace, getEscapeReplacement); + } } - } else { - if (escapeTestNoEncode.test(html)) { - return html.replace(escapeReplaceNoEncode, getEscapeReplacement); + else { + if (escapeTestNoEncode.test(html)) { + return html.replace(escapeReplaceNoEncode, getEscapeReplacement); + } } - } - return html; + return html; } - var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig; - - /** - * @param {string} html - */ + const unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig; function unescape(html) { - // explicitly match decimal, hex, and named HTML entities - return html.replace(unescapeTest, function (_, n) { - n = n.toLowerCase(); - if (n === 'colon') return ':'; - if (n.charAt(0) === '#') { - return n.charAt(1) === 'x' ? String.fromCharCode(parseInt(n.substring(2), 16)) : String.fromCharCode(+n.substring(1)); - } - return ''; - }); + // explicitly match decimal, hex, and named HTML entities + return html.replace(unescapeTest, (_, n) => { + n = n.toLowerCase(); + if (n === 'colon') + return ':'; + if (n.charAt(0) === '#') { + return n.charAt(1) === 'x' + ? String.fromCharCode(parseInt(n.substring(2), 16)) + : String.fromCharCode(+n.substring(1)); + } + return ''; + }); } - var caret = /(^|[^\[])\^/g; - - /** - * @param {string | RegExp} regex - * @param {string} opt - */ + const caret = /(^|[^\[])\^/g; function edit(regex, opt) { - regex = typeof regex === 'string' ? regex : regex.source; - opt = opt || ''; - var obj = { - replace: function replace(name, val) { - val = val.source || val; - val = val.replace(caret, '$1'); - regex = regex.replace(name, val); - return obj; - }, - getRegex: function getRegex() { - return new RegExp(regex, opt); - } - }; - return obj; + let source = typeof regex === 'string' ? regex : regex.source; + opt = opt || ''; + const obj = { + replace: (name, val) => { + let valSource = typeof val === 'string' ? val : val.source; + valSource = valSource.replace(caret, '$1'); + source = source.replace(name, valSource); + return obj; + }, + getRegex: () => { + return new RegExp(source, opt); + }, + }; + return obj; } - var nonWordAndColonTest = /[^\w:]/g; - var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i; - - /** - * @param {boolean} sanitize - * @param {string} base - * @param {string} href - */ - function cleanUrl(sanitize, base, href) { - if (sanitize) { - var prot; + function cleanUrl(href) { try { - prot = decodeURIComponent(unescape(href)).replace(nonWordAndColonTest, '').toLowerCase(); - } catch (e) { - return null; - } - if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) { - return null; - } - } - if (base && !originIndependentUrl.test(href)) { - href = resolveUrl(base, href); - } - try { - href = encodeURI(href).replace(/%25/g, '%'); - } catch (e) { - return null; - } - return href; - } - var baseUrls = {}; - var justDomain = /^[^:]+:\/*[^/]*$/; - var protocol = /^([^:]+:)[\s\S]*$/; - var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/; - - /** - * @param {string} base - * @param {string} href - */ - function resolveUrl(base, href) { - if (!baseUrls[' ' + base]) { - // we can ignore everything in base after the last slash of its path component, - // but we might need to add _that_ - // https://tools.ietf.org/html/rfc3986#section-3 - if (justDomain.test(base)) { - baseUrls[' ' + base] = base + '/'; - } else { - baseUrls[' ' + base] = rtrim(base, '/', true); - } - } - base = baseUrls[' ' + base]; - var relativeBase = base.indexOf(':') === -1; - if (href.substring(0, 2) === '//') { - if (relativeBase) { - return href; - } - return base.replace(protocol, '$1') + href; - } else if (href.charAt(0) === '/') { - if (relativeBase) { - return href; - } - return base.replace(domain, '$1') + href; - } else { - return base + href; - } + href = encodeURI(href).replace(/%25/g, '%'); + } + catch { + return null; + } + return href; } - var noopTest = { - exec: function noopTest() {} - }; + const noopTest = { exec: () => null }; function splitCells(tableRow, count) { - // ensure that every cell-delimiting pipe has a space - // before it to distinguish it from an escaped pipe - var row = tableRow.replace(/\|/g, function (match, offset, str) { - var escaped = false, - curr = offset; - while (--curr >= 0 && str[curr] === '\\') escaped = !escaped; - if (escaped) { - // odd number of slashes means | is escaped - // so we leave it alone - return '|'; - } else { - // add space before unescaped | - return ' |'; - } - }), - cells = row.split(/ \|/); - var i = 0; - - // First/last cell in a row cannot be empty if it has no leading/trailing pipe - if (!cells[0].trim()) { - cells.shift(); - } - if (cells.length > 0 && !cells[cells.length - 1].trim()) { - cells.pop(); - } - if (cells.length > count) { - cells.splice(count); - } else { - while (cells.length < count) cells.push(''); - } - for (; i < cells.length; i++) { - // leading or trailing whitespace is ignored per the gfm spec - cells[i] = cells[i].trim().replace(/\\\|/g, '|'); - } - return cells; + // ensure that every cell-delimiting pipe has a space + // before it to distinguish it from an escaped pipe + const row = tableRow.replace(/\|/g, (match, offset, str) => { + let escaped = false; + let curr = offset; + while (--curr >= 0 && str[curr] === '\\') + escaped = !escaped; + if (escaped) { + // odd number of slashes means | is escaped + // so we leave it alone + return '|'; + } + else { + // add space before unescaped | + return ' |'; + } + }), cells = row.split(/ \|/); + let i = 0; + // First/last cell in a row cannot be empty if it has no leading/trailing pipe + if (!cells[0].trim()) { + cells.shift(); + } + if (cells.length > 0 && !cells[cells.length - 1].trim()) { + cells.pop(); + } + if (count) { + if (cells.length > count) { + cells.splice(count); + } + else { + while (cells.length < count) + cells.push(''); + } + } + for (; i < cells.length; i++) { + // leading or trailing whitespace is ignored per the gfm spec + cells[i] = cells[i].trim().replace(/\\\|/g, '|'); + } + return cells; } - /** * Remove trailing 'c's. Equivalent to str.replace(/c*$/, ''). * /c*$/ is vulnerable to REDOS. * - * @param {string} str - * @param {string} c - * @param {boolean} invert Remove suffix of non-c chars instead. Default falsey. + * @param str + * @param c + * @param invert Remove suffix of non-c chars instead. Default falsey. */ function rtrim(str, c, invert) { - var l = str.length; - if (l === 0) { - return ''; - } - - // Length of suffix matching the invert condition. - var suffLen = 0; - - // Step left until we fail to match the invert condition. - while (suffLen < l) { - var currChar = str.charAt(l - suffLen - 1); - if (currChar === c && !invert) { - suffLen++; - } else if (currChar !== c && invert) { - suffLen++; - } else { - break; - } - } - return str.slice(0, l - suffLen); + const l = str.length; + if (l === 0) { + return ''; + } + // Length of suffix matching the invert condition. + let suffLen = 0; + // Step left until we fail to match the invert condition. + while (suffLen < l) { + const currChar = str.charAt(l - suffLen - 1); + if (currChar === c && !invert) { + suffLen++; + } + else if (currChar !== c && invert) { + suffLen++; + } + else { + break; + } + } + return str.slice(0, l - suffLen); } function findClosingBracket(str, b) { - if (str.indexOf(b[1]) === -1) { + if (str.indexOf(b[1]) === -1) { + return -1; + } + let level = 0; + for (let i = 0; i < str.length; i++) { + if (str[i] === '\\') { + i++; + } + else if (str[i] === b[0]) { + level++; + } + else if (str[i] === b[1]) { + level--; + if (level < 0) { + return i; + } + } + } return -1; - } - var l = str.length; - var level = 0, - i = 0; - for (; i < l; i++) { - if (str[i] === '\\') { - i++; - } else if (str[i] === b[0]) { - level++; - } else if (str[i] === b[1]) { - level--; - if (level < 0) { - return i; - } - } - } - return -1; - } - function checkDeprecations(opt, callback) { - if (!opt || opt.silent) { - return; - } - if (callback) { - console.warn('marked(): callback is deprecated since version 5.0.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/using_pro#async'); - } - if (opt.sanitize || opt.sanitizer) { - console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options'); - } - if (opt.highlight || opt.langPrefix !== 'language-') { - console.warn('marked(): highlight and langPrefix parameters are deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-highlight.'); - } - if (opt.mangle) { - console.warn('marked(): mangle parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-mangle.'); - } - if (opt.baseUrl) { - console.warn('marked(): baseUrl parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-base-url.'); - } - if (opt.smartypants) { - console.warn('marked(): smartypants parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-smartypants.'); - } - if (opt.xhtml) { - console.warn('marked(): xhtml parameter is deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-xhtml.'); - } - if (opt.headerIds || opt.headerPrefix) { - console.warn('marked(): headerIds and headerPrefix parameters are deprecated since version 5.0.0, should not be used and will be removed in the future. Instead use https://www.npmjs.com/package/marked-gfm-heading-id.'); - } - } - - // copied from https://stackoverflow.com/a/5450113/806777 - /** - * @param {string} pattern - * @param {number} count - */ - function repeatString(pattern, count) { - if (count < 1) { - return ''; - } - var result = ''; - while (count > 1) { - if (count & 1) { - result += pattern; - } - count >>= 1; - pattern += pattern; - } - return result + pattern; } function outputLink(cap, link, raw, lexer) { - var href = link.href; - var title = link.title ? escape(link.title) : null; - var text = cap[1].replace(/\\([\[\]])/g, '$1'); - if (cap[0].charAt(0) !== '!') { - lexer.state.inLink = true; - var token = { - type: 'link', - raw: raw, - href: href, - title: title, - text: text, - tokens: lexer.inlineTokens(text) + const href = link.href; + const title = link.title ? escape$1(link.title) : null; + const text = cap[1].replace(/\\([\[\]])/g, '$1'); + if (cap[0].charAt(0) !== '!') { + lexer.state.inLink = true; + const token = { + type: 'link', + raw, + href, + title, + text, + tokens: lexer.inlineTokens(text), + }; + lexer.state.inLink = false; + return token; + } + return { + type: 'image', + raw, + href, + title, + text: escape$1(text), }; - lexer.state.inLink = false; - return token; - } - return { - type: 'image', - raw: raw, - href: href, - title: title, - text: escape(text) - }; } function indentCodeCompensation(raw, text) { - var matchIndentToCode = raw.match(/^(\s+)(?:```)/); - if (matchIndentToCode === null) { - return text; - } - var indentToCode = matchIndentToCode[1]; - return text.split('\n').map(function (node) { - var matchIndentInNode = node.match(/^\s+/); - if (matchIndentInNode === null) { - return node; - } - var indentInNode = matchIndentInNode[0]; - if (indentInNode.length >= indentToCode.length) { - return node.slice(indentToCode.length); - } - return node; - }).join('\n'); + const matchIndentToCode = raw.match(/^(\s+)(?:```)/); + if (matchIndentToCode === null) { + return text; + } + const indentToCode = matchIndentToCode[1]; + return text + .split('\n') + .map(node => { + const matchIndentInNode = node.match(/^\s+/); + if (matchIndentInNode === null) { + return node; + } + const [indentInNode] = matchIndentInNode; + if (indentInNode.length >= indentToCode.length) { + return node.slice(indentToCode.length); + } + return node; + }) + .join('\n'); } - /** * Tokenizer */ - var Tokenizer = /*#__PURE__*/function () { - function Tokenizer(options) { - this.options = options || exports.defaults; - } - var _proto = Tokenizer.prototype; - _proto.space = function space(src) { - var cap = this.rules.block.newline.exec(src); - if (cap && cap[0].length > 0) { - return { - type: 'space', - raw: cap[0] - }; - } - }; - _proto.code = function code(src) { - var cap = this.rules.block.code.exec(src); - if (cap) { - var text = cap[0].replace(/^ {1,4}/gm, ''); - return { - type: 'code', - raw: cap[0], - codeBlockStyle: 'indented', - text: !this.options.pedantic ? rtrim(text, '\n') : text - }; - } - }; - _proto.fences = function fences(src) { - var cap = this.rules.block.fences.exec(src); - if (cap) { - var raw = cap[0]; - var text = indentCodeCompensation(raw, cap[3] || ''); - return { - type: 'code', - raw: raw, - lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, '$1') : cap[2], - text: text - }; - } - }; - _proto.heading = function heading(src) { - var cap = this.rules.block.heading.exec(src); - if (cap) { - var text = cap[2].trim(); - - // remove trailing #s - if (/#$/.test(text)) { - var trimmed = rtrim(text, '#'); - if (this.options.pedantic) { - text = trimmed.trim(); - } else if (!trimmed || / $/.test(trimmed)) { - // CommonMark requires space before trailing #s - text = trimmed.trim(); - } - } - return { - type: 'heading', - raw: cap[0], - depth: cap[1].length, - text: text, - tokens: this.lexer.inline(text) - }; - } - }; - _proto.hr = function hr(src) { - var cap = this.rules.block.hr.exec(src); - if (cap) { - return { - type: 'hr', - raw: cap[0] - }; - } - }; - _proto.blockquote = function blockquote(src) { - var cap = this.rules.block.blockquote.exec(src); - if (cap) { - var text = cap[0].replace(/^ *>[ \t]?/gm, ''); - var top = this.lexer.state.top; - this.lexer.state.top = true; - var tokens = this.lexer.blockTokens(text); - this.lexer.state.top = top; - return { - type: 'blockquote', - raw: cap[0], - tokens: tokens, - text: text - }; - } - }; - _proto.list = function list(src) { - var cap = this.rules.block.list.exec(src); - if (cap) { - var raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine, line, nextLine, rawLine, itemContents, endEarly; - var bull = cap[1].trim(); - var isordered = bull.length > 1; - var list = { - type: 'list', - raw: '', - ordered: isordered, - start: isordered ? +bull.slice(0, -1) : '', - loose: false, - items: [] - }; - bull = isordered ? "\\d{1,9}\\" + bull.slice(-1) : "\\" + bull; - if (this.options.pedantic) { - bull = isordered ? bull : '[*+-]'; - } - - // Get next list item - var itemRegex = new RegExp("^( {0,3}" + bull + ")((?:[\t ][^\\n]*)?(?:\\n|$))"); - - // Check if current bullet point can start a new List Item - while (src) { - endEarly = false; - if (!(cap = itemRegex.exec(src))) { - break; - } - if (this.rules.block.hr.test(src)) { - // End list if bullet was actually HR (possibly move into itemRegex?) - break; - } - raw = cap[0]; - src = src.substring(raw.length); - line = cap[2].split('\n', 1)[0].replace(/^\t+/, function (t) { - return ' '.repeat(3 * t.length); - }); - nextLine = src.split('\n', 1)[0]; - if (this.options.pedantic) { - indent = 2; - itemContents = line.trimLeft(); - } else { - indent = cap[2].search(/[^ ]/); // Find first non-space char - indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent - itemContents = line.slice(indent); - indent += cap[1].length; - } - blankLine = false; - if (!line && /^ *$/.test(nextLine)) { - // Items begin with at most one blank line - raw += nextLine + '\n'; - src = src.substring(nextLine.length + 1); - endEarly = true; - } - if (!endEarly) { - var nextBulletRegex = new RegExp("^ {0," + Math.min(3, indent - 1) + "}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))"); - var hrRegex = new RegExp("^ {0," + Math.min(3, indent - 1) + "}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)"); - var fencesBeginRegex = new RegExp("^ {0," + Math.min(3, indent - 1) + "}(?:```|~~~)"); - var headingBeginRegex = new RegExp("^ {0," + Math.min(3, indent - 1) + "}#"); - - // Check if following lines should be included in List Item - while (src) { - rawLine = src.split('\n', 1)[0]; - nextLine = rawLine; - - // Re-align to follow commonmark nesting rules + class _Tokenizer { + options; + rules; // set by the lexer + lexer; // set by the lexer + constructor(options) { + this.options = options || exports.defaults; + } + space(src) { + const cap = this.rules.block.newline.exec(src); + if (cap && cap[0].length > 0) { + return { + type: 'space', + raw: cap[0], + }; + } + } + code(src) { + const cap = this.rules.block.code.exec(src); + if (cap) { + const text = cap[0].replace(/^ {1,4}/gm, ''); + return { + type: 'code', + raw: cap[0], + codeBlockStyle: 'indented', + text: !this.options.pedantic + ? rtrim(text, '\n') + : text, + }; + } + } + fences(src) { + const cap = this.rules.block.fences.exec(src); + if (cap) { + const raw = cap[0]; + const text = indentCodeCompensation(raw, cap[3] || ''); + return { + type: 'code', + raw, + lang: cap[2] ? cap[2].trim().replace(this.rules.inline.anyPunctuation, '$1') : cap[2], + text, + }; + } + } + heading(src) { + const cap = this.rules.block.heading.exec(src); + if (cap) { + let text = cap[2].trim(); + // remove trailing #s + if (/#$/.test(text)) { + const trimmed = rtrim(text, '#'); + if (this.options.pedantic) { + text = trimmed.trim(); + } + else if (!trimmed || / $/.test(trimmed)) { + // CommonMark requires space before trailing #s + text = trimmed.trim(); + } + } + return { + type: 'heading', + raw: cap[0], + depth: cap[1].length, + text, + tokens: this.lexer.inline(text), + }; + } + } + hr(src) { + const cap = this.rules.block.hr.exec(src); + if (cap) { + return { + type: 'hr', + raw: rtrim(cap[0], '\n'), + }; + } + } + blockquote(src) { + const cap = this.rules.block.blockquote.exec(src); + if (cap) { + let lines = rtrim(cap[0], '\n').split('\n'); + let raw = ''; + let text = ''; + const tokens = []; + while (lines.length > 0) { + let inBlockquote = false; + const currentLines = []; + let i; + for (i = 0; i < lines.length; i++) { + // get lines up to a continuation + if (/^ {0,3}>/.test(lines[i])) { + currentLines.push(lines[i]); + inBlockquote = true; + } + else if (!inBlockquote) { + currentLines.push(lines[i]); + } + else { + break; + } + } + lines = lines.slice(i); + const currentRaw = currentLines.join('\n'); + const currentText = currentRaw + // precede setext continuation with 4 spaces so it isn't a setext + .replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g, '\n $1') + .replace(/^ {0,3}>[ \t]?/gm, ''); + raw = raw ? `${raw}\n${currentRaw}` : currentRaw; + text = text ? `${text}\n${currentText}` : currentText; + // parse blockquote lines as top level tokens + // merge paragraphs if this is a continuation + const top = this.lexer.state.top; + this.lexer.state.top = true; + this.lexer.blockTokens(currentText, tokens, true); + this.lexer.state.top = top; + // if there is no continuation then we are done + if (lines.length === 0) { + break; + } + const lastToken = tokens[tokens.length - 1]; + if (lastToken?.type === 'code') { + // blockquote continuation cannot be preceded by a code block + break; + } + else if (lastToken?.type === 'blockquote') { + // include continuation in nested blockquote + const oldToken = lastToken; + const newText = oldToken.raw + '\n' + lines.join('\n'); + const newToken = this.blockquote(newText); + tokens[tokens.length - 1] = newToken; + raw = raw.substring(0, raw.length - oldToken.raw.length) + newToken.raw; + text = text.substring(0, text.length - oldToken.text.length) + newToken.text; + break; + } + else if (lastToken?.type === 'list') { + // include continuation in nested list + const oldToken = lastToken; + const newText = oldToken.raw + '\n' + lines.join('\n'); + const newToken = this.list(newText); + tokens[tokens.length - 1] = newToken; + raw = raw.substring(0, raw.length - lastToken.raw.length) + newToken.raw; + text = text.substring(0, text.length - oldToken.raw.length) + newToken.raw; + lines = newText.substring(tokens[tokens.length - 1].raw.length).split('\n'); + continue; + } + } + return { + type: 'blockquote', + raw, + tokens, + text, + }; + } + } + list(src) { + let cap = this.rules.block.list.exec(src); + if (cap) { + let bull = cap[1].trim(); + const isordered = bull.length > 1; + const list = { + type: 'list', + raw: '', + ordered: isordered, + start: isordered ? +bull.slice(0, -1) : '', + loose: false, + items: [], + }; + bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`; if (this.options.pedantic) { - nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' '); + bull = isordered ? bull : '[*+-]'; } - - // End list item if found code fences - if (fencesBeginRegex.test(nextLine)) { - break; + // Get next list item + const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\t ][^\\n]*)?(?:\\n|$))`); + let endsWithBlankLine = false; + // Check if current bullet point can start a new List Item + while (src) { + let endEarly = false; + let raw = ''; + let itemContents = ''; + if (!(cap = itemRegex.exec(src))) { + break; + } + if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?) + break; + } + raw = cap[0]; + src = src.substring(raw.length); + let line = cap[2].split('\n', 1)[0].replace(/^\t+/, (t) => ' '.repeat(3 * t.length)); + let nextLine = src.split('\n', 1)[0]; + let blankLine = !line.trim(); + let indent = 0; + if (this.options.pedantic) { + indent = 2; + itemContents = line.trimStart(); + } + else if (blankLine) { + indent = cap[1].length + 1; + } + else { + indent = cap[2].search(/[^ ]/); // Find first non-space char + indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent + itemContents = line.slice(indent); + indent += cap[1].length; + } + if (blankLine && /^ *$/.test(nextLine)) { // Items begin with at most one blank line + raw += nextLine + '\n'; + src = src.substring(nextLine.length + 1); + endEarly = true; + } + if (!endEarly) { + const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`); + const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`); + const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\`\`\`|~~~)`); + const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`); + // Check if following lines should be included in List Item + while (src) { + const rawLine = src.split('\n', 1)[0]; + nextLine = rawLine; + // Re-align to follow commonmark nesting rules + if (this.options.pedantic) { + nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, ' '); + } + // End list item if found code fences + if (fencesBeginRegex.test(nextLine)) { + break; + } + // End list item if found start of new heading + if (headingBeginRegex.test(nextLine)) { + break; + } + // End list item if found start of new bullet + if (nextBulletRegex.test(nextLine)) { + break; + } + // Horizontal rule found + if (hrRegex.test(src)) { + break; + } + if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible + itemContents += '\n' + nextLine.slice(indent); + } + else { + // not enough indentation + if (blankLine) { + break; + } + // paragraph continuation unless last line was a different block level element + if (line.search(/[^ ]/) >= 4) { // indented code block + break; + } + if (fencesBeginRegex.test(line)) { + break; + } + if (headingBeginRegex.test(line)) { + break; + } + if (hrRegex.test(line)) { + break; + } + itemContents += '\n' + nextLine; + } + if (!blankLine && !nextLine.trim()) { // Check if current line is blank + blankLine = true; + } + raw += rawLine + '\n'; + src = src.substring(rawLine.length + 1); + line = nextLine.slice(indent); + } + } + if (!list.loose) { + // If the previous item ended with a blank line, the list is loose + if (endsWithBlankLine) { + list.loose = true; + } + else if (/\n *\n *$/.test(raw)) { + endsWithBlankLine = true; + } + } + let istask = null; + let ischecked; + // Check for task list items + if (this.options.gfm) { + istask = /^\[[ xX]\] /.exec(itemContents); + if (istask) { + ischecked = istask[0] !== '[ ] '; + itemContents = itemContents.replace(/^\[[ xX]\] +/, ''); + } + } + list.items.push({ + type: 'list_item', + raw, + task: !!istask, + checked: ischecked, + loose: false, + text: itemContents, + tokens: [], + }); + list.raw += raw; } - - // End list item if found start of new heading - if (headingBeginRegex.test(nextLine)) { - break; + // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic + list.items[list.items.length - 1].raw = list.items[list.items.length - 1].raw.trimEnd(); + list.items[list.items.length - 1].text = list.items[list.items.length - 1].text.trimEnd(); + list.raw = list.raw.trimEnd(); + // Item child tokens handled here at end because we needed to have the final item to trim it first + for (let i = 0; i < list.items.length; i++) { + this.lexer.state.top = false; + list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []); + if (!list.loose) { + // Check if list should be loose + const spacers = list.items[i].tokens.filter(t => t.type === 'space'); + const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\n.*\n/.test(t.raw)); + list.loose = hasMultipleLineBreaks; + } } - - // End list item if found start of new bullet - if (nextBulletRegex.test(nextLine)) { - break; + // Set all items to loose if list is loose + if (list.loose) { + for (let i = 0; i < list.items.length; i++) { + list.items[i].loose = true; + } } - - // Horizontal rule found - if (hrRegex.test(src)) { - break; - } - if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { - // Dedent if possible - itemContents += '\n' + nextLine.slice(indent); - } else { - // not enough indentation - if (blankLine) { - break; - } - - // paragraph continuation unless last line was a different block level element - if (line.search(/[^ ]/) >= 4) { - // indented code block - break; - } - if (fencesBeginRegex.test(line)) { - break; - } - if (headingBeginRegex.test(line)) { - break; - } - if (hrRegex.test(line)) { - break; - } - itemContents += '\n' + nextLine; - } - if (!blankLine && !nextLine.trim()) { - // Check if current line is blank - blankLine = true; - } - raw += rawLine + '\n'; - src = src.substring(rawLine.length + 1); - line = nextLine.slice(indent); - } - } - if (!list.loose) { - // If the previous item ended with a blank line, the list is loose - if (endsWithBlankLine) { - list.loose = true; - } else if (/\n *\n *$/.test(raw)) { - endsWithBlankLine = true; - } + return list; } - - // Check for task list items - if (this.options.gfm) { - istask = /^\[[ xX]\] /.exec(itemContents); - if (istask) { - ischecked = istask[0] !== '[ ] '; - itemContents = itemContents.replace(/^\[[ xX]\] +/, ''); - } - } - list.items.push({ - type: 'list_item', - raw: raw, - task: !!istask, - checked: ischecked, - loose: false, - text: itemContents - }); - list.raw += raw; - } - - // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic - list.items[list.items.length - 1].raw = raw.trimRight(); - list.items[list.items.length - 1].text = itemContents.trimRight(); - list.raw = list.raw.trimRight(); - var l = list.items.length; - - // Item child tokens handled here at end because we needed to have the final item to trim it first - for (i = 0; i < l; i++) { - this.lexer.state.top = false; - list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []); - if (!list.loose) { - // Check if list should be loose - var spacers = list.items[i].tokens.filter(function (t) { - return t.type === 'space'; - }); - var hasMultipleLineBreaks = spacers.length > 0 && spacers.some(function (t) { - return /\n.*\n/.test(t.raw); - }); - list.loose = hasMultipleLineBreaks; - } - } - - // Set all items to loose if list is loose - if (list.loose) { - for (i = 0; i < l; i++) { - list.items[i].loose = true; - } - } - return list; - } - }; - _proto.html = function html(src) { - var cap = this.rules.block.html.exec(src); - if (cap) { - var token = { - type: 'html', - block: true, - raw: cap[0], - pre: !this.options.sanitizer && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'), - text: cap[0] - }; - if (this.options.sanitize) { - var text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]); - token.type = 'paragraph'; - token.text = text; - token.tokens = this.lexer.inline(text); - } - return token; - } - }; - _proto.def = function def(src) { - var cap = this.rules.block.def.exec(src); - if (cap) { - var tag = cap[1].toLowerCase().replace(/\s+/g, ' '); - var href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline._escapes, '$1') : ''; - var title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, '$1') : cap[3]; - return { - type: 'def', - tag: tag, - raw: cap[0], - href: href, - title: title - }; - } - }; - _proto.table = function table(src) { - var cap = this.rules.block.table.exec(src); - if (cap) { - var item = { - type: 'table', - header: splitCells(cap[1]).map(function (c) { - return { - text: c - }; - }), - align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */), - rows: cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, '').split('\n') : [] - }; - if (item.header.length === item.align.length) { - item.raw = cap[0]; - var l = item.align.length; - var i, j, k, row; - for (i = 0; i < l; i++) { - if (/^ *-+: *$/.test(item.align[i])) { - item.align[i] = 'right'; - } else if (/^ *:-+: *$/.test(item.align[i])) { - item.align[i] = 'center'; - } else if (/^ *:-+ *$/.test(item.align[i])) { - item.align[i] = 'left'; - } else { - item.align[i] = null; - } - } - l = item.rows.length; - for (i = 0; i < l; i++) { - item.rows[i] = splitCells(item.rows[i], item.header.length).map(function (c) { + } + html(src) { + const cap = this.rules.block.html.exec(src); + if (cap) { + const token = { + type: 'html', + block: true, + raw: cap[0], + pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style', + text: cap[0], + }; + return token; + } + } + def(src) { + const cap = this.rules.block.def.exec(src); + if (cap) { + const tag = cap[1].toLowerCase().replace(/\s+/g, ' '); + const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline.anyPunctuation, '$1') : ''; + const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline.anyPunctuation, '$1') : cap[3]; return { - text: c + type: 'def', + tag, + raw: cap[0], + href, + title, }; - }); } - - // parse child tokens inside headers and cells - - // header child tokens - l = item.header.length; - for (j = 0; j < l; j++) { - item.header[j].tokens = this.lexer.inline(item.header[j].text); + } + table(src) { + const cap = this.rules.block.table.exec(src); + if (!cap) { + return; } - - // cell child tokens - l = item.rows.length; - for (j = 0; j < l; j++) { - row = item.rows[j]; - for (k = 0; k < row.length; k++) { - row[k].tokens = this.lexer.inline(row[k].text); - } + if (!/[:|]/.test(cap[2])) { + // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading + return; + } + const headers = splitCells(cap[1]); + const aligns = cap[2].replace(/^\||\| *$/g, '').split('|'); + const rows = cap[3] && cap[3].trim() ? cap[3].replace(/\n[ \t]*$/, '').split('\n') : []; + const item = { + type: 'table', + raw: cap[0], + header: [], + align: [], + rows: [], + }; + if (headers.length !== aligns.length) { + // header and align columns must be equal, rows can be different. + return; + } + for (const align of aligns) { + if (/^ *-+: *$/.test(align)) { + item.align.push('right'); + } + else if (/^ *:-+: *$/.test(align)) { + item.align.push('center'); + } + else if (/^ *:-+ *$/.test(align)) { + item.align.push('left'); + } + else { + item.align.push(null); + } + } + for (let i = 0; i < headers.length; i++) { + item.header.push({ + text: headers[i], + tokens: this.lexer.inline(headers[i]), + header: true, + align: item.align[i], + }); + } + for (const row of rows) { + item.rows.push(splitCells(row, item.header.length).map((cell, i) => { + return { + text: cell, + tokens: this.lexer.inline(cell), + header: false, + align: item.align[i], + }; + })); } return item; - } - } - }; - _proto.lheading = function lheading(src) { - var cap = this.rules.block.lheading.exec(src); - if (cap) { - return { - type: 'heading', - raw: cap[0], - depth: cap[2].charAt(0) === '=' ? 1 : 2, - text: cap[1], - tokens: this.lexer.inline(cap[1]) - }; - } - }; - _proto.paragraph = function paragraph(src) { - var cap = this.rules.block.paragraph.exec(src); - if (cap) { - var text = cap[1].charAt(cap[1].length - 1) === '\n' ? cap[1].slice(0, -1) : cap[1]; - return { - type: 'paragraph', - raw: cap[0], - text: text, - tokens: this.lexer.inline(text) - }; - } - }; - _proto.text = function text(src) { - var cap = this.rules.block.text.exec(src); - if (cap) { - return { - type: 'text', - raw: cap[0], - text: cap[0], - tokens: this.lexer.inline(cap[0]) - }; - } - }; - _proto.escape = function escape$1(src) { - var cap = this.rules.inline.escape.exec(src); - if (cap) { - return { - type: 'escape', - raw: cap[0], - text: escape(cap[1]) - }; - } - }; - _proto.tag = function tag(src) { - var cap = this.rules.inline.tag.exec(src); - if (cap) { - if (!this.lexer.state.inLink && /^/i.test(cap[0])) { - this.lexer.state.inLink = false; - } - if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { - this.lexer.state.inRawBlock = true; - } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { - this.lexer.state.inRawBlock = false; - } - return { - type: this.options.sanitize ? 'text' : 'html', - raw: cap[0], - inLink: this.lexer.state.inLink, - inRawBlock: this.lexer.state.inRawBlock, - block: false, - text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]) : cap[0] - }; - } - }; - _proto.link = function link(src) { - var cap = this.rules.inline.link.exec(src); - if (cap) { - var trimmedUrl = cap[2].trim(); - if (!this.options.pedantic && /^$/.test(trimmedUrl)) { - return; + } + lheading(src) { + const cap = this.rules.block.lheading.exec(src); + if (cap) { + return { + type: 'heading', + raw: cap[0], + depth: cap[2].charAt(0) === '=' ? 1 : 2, + text: cap[1], + tokens: this.lexer.inline(cap[1]), + }; } - - // ending angle bracket cannot be escaped - var rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\'); - if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) { - return; - } - } else { - // find closing parenthesis - var lastParenIndex = findClosingBracket(cap[2], '()'); - if (lastParenIndex > -1) { - var start = cap[0].indexOf('!') === 0 ? 5 : 4; - var linkLen = start + cap[1].length + lastParenIndex; - cap[2] = cap[2].substring(0, lastParenIndex); - cap[0] = cap[0].substring(0, linkLen).trim(); - cap[3] = ''; - } - } - var href = cap[2]; - var title = ''; - if (this.options.pedantic) { - // split pedantic href and title - var link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href); - if (link) { - href = link[1]; - title = link[3]; - } - } else { - title = cap[3] ? cap[3].slice(1, -1) : ''; - } - href = href.trim(); - if (/^$/.test(trimmedUrl)) { - // pedantic allows starting angle bracket without ending angle bracket - href = href.slice(1); - } else { - href = href.slice(1, -1); - } - } - return outputLink(cap, { - href: href ? href.replace(this.rules.inline._escapes, '$1') : href, - title: title ? title.replace(this.rules.inline._escapes, '$1') : title - }, cap[0], this.lexer); - } - }; - _proto.reflink = function reflink(src, links) { - var cap; - if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) { - var link = (cap[2] || cap[1]).replace(/\s+/g, ' '); - link = links[link.toLowerCase()]; - if (!link) { - var text = cap[0].charAt(0); - return { - type: 'text', - raw: text, - text: text - }; - } - return outputLink(cap, link, cap[0], this.lexer); } - }; - _proto.emStrong = function emStrong(src, maskedSrc, prevChar) { - if (prevChar === void 0) { - prevChar = ''; + paragraph(src) { + const cap = this.rules.block.paragraph.exec(src); + if (cap) { + const text = cap[1].charAt(cap[1].length - 1) === '\n' + ? cap[1].slice(0, -1) + : cap[1]; + return { + type: 'paragraph', + raw: cap[0], + text, + tokens: this.lexer.inline(text), + }; + } } - var match = this.rules.inline.emStrong.lDelim.exec(src); - if (!match) return; - - // _ can't be between two alphanumerics. \p{L}\p{N} includes non-english alphabet/numbers as well - if (match[3] && prevChar.match(/(?:[0-9A-Za-z\xAA\xB2\xB3\xB5\xB9\xBA\xBC-\xBE\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u0660-\u0669\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07C0-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u0870-\u0887\u0889-\u088E\u08A0-\u08C9\u0904-\u0939\u093D\u0950\u0958-\u0961\u0966-\u096F\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09E6-\u09F1\u09F4-\u09F9\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A66-\u0A6F\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AE6-\u0AEF\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B66-\u0B6F\u0B71-\u0B77\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0BE6-\u0BF2\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C5D\u0C60\u0C61\u0C66-\u0C6F\u0C78-\u0C7E\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDD\u0CDE\u0CE0\u0CE1\u0CE6-\u0CEF\u0CF1\u0CF2\u0D04-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D58-\u0D61\u0D66-\u0D78\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DE6-\u0DEF\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F20-\u0F33\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F-\u1049\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u1090-\u1099\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1369-\u137C\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u1711\u171F-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u17E0-\u17E9\u17F0-\u17F9\u1810-\u1819\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A16\u1A20-\u1A54\u1A80-\u1A89\u1A90-\u1A99\u1AA7\u1B05-\u1B33\u1B45-\u1B4C\u1B50-\u1B59\u1B83-\u1BA0\u1BAE-\u1BE5\u1C00-\u1C23\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2070\u2071\u2074-\u2079\u207F-\u2089\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2150-\u2189\u2460-\u249B\u24EA-\u24FF\u2776-\u2793\u2C00-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2CFD\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u3192-\u3195\u31A0-\u31BF\u31F0-\u31FF\u3220-\u3229\u3248-\u324F\u3251-\u325F\u3280-\u3289\u32B1-\u32BF\u3400-\u4DBF\u4E00-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7CA\uA7D0\uA7D1\uA7D3\uA7D5-\uA7D9\uA7F2-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA830-\uA835\uA840-\uA873\uA882-\uA8B3\uA8D0-\uA8D9\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA900-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF-\uA9D9\uA9E0-\uA9E4\uA9E6-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABE2\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD07-\uDD33\uDD40-\uDD78\uDD8A\uDD8B\uDE80-\uDE9C\uDEA0-\uDED0\uDEE1-\uDEFB\uDF00-\uDF23\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDD70-\uDD7A\uDD7C-\uDD8A\uDD8C-\uDD92\uDD94\uDD95\uDD97-\uDDA1\uDDA3-\uDDB1\uDDB3-\uDDB9\uDDBB\uDDBC\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67\uDF80-\uDF85\uDF87-\uDFB0\uDFB2-\uDFBA]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC58-\uDC76\uDC79-\uDC9E\uDCA7-\uDCAF\uDCE0-\uDCF2\uDCF4\uDCF5\uDCFB-\uDD1B\uDD20-\uDD39\uDD80-\uDDB7\uDDBC-\uDDCF\uDDD2-\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE40-\uDE48\uDE60-\uDE7E\uDE80-\uDE9F\uDEC0-\uDEC7\uDEC9-\uDEE4\uDEEB-\uDEEF\uDF00-\uDF35\uDF40-\uDF55\uDF58-\uDF72\uDF78-\uDF91\uDFA9-\uDFAF]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDCFA-\uDD23\uDD30-\uDD39\uDE60-\uDE7E\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF27\uDF30-\uDF45\uDF51-\uDF54\uDF70-\uDF81\uDFB0-\uDFCB\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC52-\uDC6F\uDC71\uDC72\uDC75\uDC83-\uDCAF\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD03-\uDD26\uDD36-\uDD3F\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDD0-\uDDDA\uDDDC\uDDE1-\uDDF4\uDE00-\uDE11\uDE13-\uDE2B\uDE3F\uDE40\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDEF0-\uDEF9\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC50-\uDC59\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE50-\uDE59\uDE80-\uDEAA\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF30-\uDF3B\uDF40-\uDF46]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCF2\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEB0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC50-\uDC6C\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF2\uDF02\uDF04-\uDF10\uDF12-\uDF33\uDF50-\uDF59\uDFB0\uDFC0-\uDFD4]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|\uD80B[\uDF90-\uDFF0]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883\uD885-\uD887][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2F\uDC41-\uDC46]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDE70-\uDEBE\uDEC0-\uDEC9\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF50-\uDF59\uDF5B-\uDF61\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE96\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82B[\uDFF0-\uDFF3\uDFF5-\uDFFB\uDFFD\uDFFE]|\uD82C[\uDC00-\uDD22\uDD32\uDD50-\uDD52\uDD55\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD834[\uDEC0-\uDED3\uDEE0-\uDEF3\uDF60-\uDF78]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD837[\uDF00-\uDF1E\uDF25-\uDF2A]|\uD838[\uDC30-\uDC6D\uDD00-\uDD2C\uDD37-\uDD3D\uDD40-\uDD49\uDD4E\uDE90-\uDEAD\uDEC0-\uDEEB\uDEF0-\uDEF9]|\uD839[\uDCD0-\uDCEB\uDCF0-\uDCF9\uDFE0-\uDFE6\uDFE8-\uDFEB\uDFED\uDFEE\uDFF0-\uDFFE]|\uD83A[\uDC00-\uDCC4\uDCC7-\uDCCF\uDD00-\uDD43\uDD4B\uDD50-\uDD59]|\uD83B[\uDC71-\uDCAB\uDCAD-\uDCAF\uDCB1-\uDCB4\uDD01-\uDD2D\uDD2F-\uDD3D\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83C[\uDD00-\uDD0C]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDF\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF39\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A\uDF50-\uDFFF]|\uD888[\uDC00-\uDFAF])/)) return; - var nextChar = match[1] || match[2] || ''; - if (!nextChar || nextChar && (prevChar === '' || this.rules.inline.punctuation.exec(prevChar))) { - var lLength = match[0].length - 1; - var rDelim, - rLength, - delimTotal = lLength, - midDelimTotal = 0; - var endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd; - endReg.lastIndex = 0; - - // Clip maskedSrc to same section of string as src (move to lexer?) - maskedSrc = maskedSrc.slice(-1 * src.length + lLength); - while ((match = endReg.exec(maskedSrc)) != null) { - rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6]; - if (!rDelim) continue; // skip single * in __abc*abc__ - - rLength = rDelim.length; - if (match[3] || match[4]) { - // found another Left Delim - delimTotal += rLength; - continue; - } else if (match[5] || match[6]) { - // either Left or Right Delim - if (lLength % 3 && !((lLength + rLength) % 3)) { - midDelimTotal += rLength; - continue; // CommonMark Emphasis Rules 9-10 - } + text(src) { + const cap = this.rules.block.text.exec(src); + if (cap) { + return { + type: 'text', + raw: cap[0], + text: cap[0], + tokens: this.lexer.inline(cap[0]), + }; } - - delimTotal -= rLength; - if (delimTotal > 0) continue; // Haven't found enough closing delimiters - - // Remove extra characters. *a*** -> *a* - rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); - var raw = src.slice(0, lLength + match.index + (match[0].length - rDelim.length) + rLength); - - // Create `em` if smallest delimiter has odd char count. *a*** - if (Math.min(lLength, rLength) % 2) { - var _text = raw.slice(1, -1); - return { - type: 'em', - raw: raw, - text: _text, - tokens: this.lexer.inlineTokens(_text) - }; + } + escape(src) { + const cap = this.rules.inline.escape.exec(src); + if (cap) { + return { + type: 'escape', + raw: cap[0], + text: escape$1(cap[1]), + }; } - - // Create 'strong' if smallest delimiter has even char count. **a*** - var text = raw.slice(2, -2); - return { - type: 'strong', - raw: raw, - text: text, - tokens: this.lexer.inlineTokens(text) - }; - } - } - }; - _proto.codespan = function codespan(src) { - var cap = this.rules.inline.code.exec(src); - if (cap) { - var text = cap[2].replace(/\n/g, ' '); - var hasNonSpaceChars = /[^ ]/.test(text); - var hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text); - if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) { - text = text.substring(1, text.length - 1); - } - text = escape(text, true); - return { - type: 'codespan', - raw: cap[0], - text: text - }; - } - }; - _proto.br = function br(src) { - var cap = this.rules.inline.br.exec(src); - if (cap) { - return { - type: 'br', - raw: cap[0] - }; - } - }; - _proto.del = function del(src) { - var cap = this.rules.inline.del.exec(src); - if (cap) { - return { - type: 'del', - raw: cap[0], - text: cap[2], - tokens: this.lexer.inlineTokens(cap[2]) - }; - } - }; - _proto.autolink = function autolink(src, mangle) { - var cap = this.rules.inline.autolink.exec(src); - if (cap) { - var text, href; - if (cap[2] === '@') { - text = escape(this.options.mangle ? mangle(cap[1]) : cap[1]); - href = 'mailto:' + text; - } else { - text = escape(cap[1]); - href = text; - } - return { - type: 'link', - raw: cap[0], - text: text, - href: href, - tokens: [{ - type: 'text', - raw: text, - text: text - }] - }; - } - }; - _proto.url = function url(src, mangle) { - var cap; - if (cap = this.rules.inline.url.exec(src)) { - var text, href; - if (cap[2] === '@') { - text = escape(this.options.mangle ? mangle(cap[0]) : cap[0]); - href = 'mailto:' + text; - } else { - // do extended autolink path validation - var prevCapZero; - do { - prevCapZero = cap[0]; - cap[0] = this.rules.inline._backpedal.exec(cap[0])[0]; - } while (prevCapZero !== cap[0]); - text = escape(cap[0]); - if (cap[1] === 'www.') { - href = 'http://' + cap[0]; - } else { - href = cap[0]; - } - } - return { - type: 'link', - raw: cap[0], - text: text, - href: href, - tokens: [{ - type: 'text', - raw: text, - text: text - }] - }; - } - }; - _proto.inlineText = function inlineText(src, smartypants) { - var cap = this.rules.inline.text.exec(src); - if (cap) { - var text; - if (this.lexer.state.inRawBlock) { - text = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0]) : cap[0]; - } else { - text = escape(this.options.smartypants ? smartypants(cap[0]) : cap[0]); - } - return { - type: 'text', - raw: cap[0], - text: text - }; - } - }; - return Tokenizer; - }(); + } + tag(src) { + const cap = this.rules.inline.tag.exec(src); + if (cap) { + if (!this.lexer.state.inLink && /^/i.test(cap[0])) { + this.lexer.state.inLink = false; + } + if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { + this.lexer.state.inRawBlock = true; + } + else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { + this.lexer.state.inRawBlock = false; + } + return { + type: 'html', + raw: cap[0], + inLink: this.lexer.state.inLink, + inRawBlock: this.lexer.state.inRawBlock, + block: false, + text: cap[0], + }; + } + } + link(src) { + const cap = this.rules.inline.link.exec(src); + if (cap) { + const trimmedUrl = cap[2].trim(); + if (!this.options.pedantic && /^$/.test(trimmedUrl))) { + return; + } + // ending angle bracket cannot be escaped + const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\'); + if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) { + return; + } + } + else { + // find closing parenthesis + const lastParenIndex = findClosingBracket(cap[2], '()'); + if (lastParenIndex > -1) { + const start = cap[0].indexOf('!') === 0 ? 5 : 4; + const linkLen = start + cap[1].length + lastParenIndex; + cap[2] = cap[2].substring(0, lastParenIndex); + cap[0] = cap[0].substring(0, linkLen).trim(); + cap[3] = ''; + } + } + let href = cap[2]; + let title = ''; + if (this.options.pedantic) { + // split pedantic href and title + const link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href); + if (link) { + href = link[1]; + title = link[3]; + } + } + else { + title = cap[3] ? cap[3].slice(1, -1) : ''; + } + href = href.trim(); + if (/^$/.test(trimmedUrl))) { + // pedantic allows starting angle bracket without ending angle bracket + href = href.slice(1); + } + else { + href = href.slice(1, -1); + } + } + return outputLink(cap, { + href: href ? href.replace(this.rules.inline.anyPunctuation, '$1') : href, + title: title ? title.replace(this.rules.inline.anyPunctuation, '$1') : title, + }, cap[0], this.lexer); + } + } + reflink(src, links) { + let cap; + if ((cap = this.rules.inline.reflink.exec(src)) + || (cap = this.rules.inline.nolink.exec(src))) { + const linkString = (cap[2] || cap[1]).replace(/\s+/g, ' '); + const link = links[linkString.toLowerCase()]; + if (!link) { + const text = cap[0].charAt(0); + return { + type: 'text', + raw: text, + text, + }; + } + return outputLink(cap, link, cap[0], this.lexer); + } + } + emStrong(src, maskedSrc, prevChar = '') { + let match = this.rules.inline.emStrongLDelim.exec(src); + if (!match) + return; + // _ can't be between two alphanumerics. \p{L}\p{N} includes non-english alphabet/numbers as well + if (match[3] && prevChar.match(/[\p{L}\p{N}]/u)) + return; + const nextChar = match[1] || match[2] || ''; + if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) { + // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below) + const lLength = [...match[0]].length - 1; + let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0; + const endReg = match[0][0] === '*' ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; + endReg.lastIndex = 0; + // Clip maskedSrc to same section of string as src (move to lexer?) + maskedSrc = maskedSrc.slice(-1 * src.length + lLength); + while ((match = endReg.exec(maskedSrc)) != null) { + rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6]; + if (!rDelim) + continue; // skip single * in __abc*abc__ + rLength = [...rDelim].length; + if (match[3] || match[4]) { // found another Left Delim + delimTotal += rLength; + continue; + } + else if (match[5] || match[6]) { // either Left or Right Delim + if (lLength % 3 && !((lLength + rLength) % 3)) { + midDelimTotal += rLength; + continue; // CommonMark Emphasis Rules 9-10 + } + } + delimTotal -= rLength; + if (delimTotal > 0) + continue; // Haven't found enough closing delimiters + // Remove extra characters. *a*** -> *a* + rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); + // char length can be >1 for unicode characters; + const lastCharLength = [...match[0]][0].length; + const raw = src.slice(0, lLength + match.index + lastCharLength + rLength); + // Create `em` if smallest delimiter has odd char count. *a*** + if (Math.min(lLength, rLength) % 2) { + const text = raw.slice(1, -1); + return { + type: 'em', + raw, + text, + tokens: this.lexer.inlineTokens(text), + }; + } + // Create 'strong' if smallest delimiter has even char count. **a*** + const text = raw.slice(2, -2); + return { + type: 'strong', + raw, + text, + tokens: this.lexer.inlineTokens(text), + }; + } + } + } + codespan(src) { + const cap = this.rules.inline.code.exec(src); + if (cap) { + let text = cap[2].replace(/\n/g, ' '); + const hasNonSpaceChars = /[^ ]/.test(text); + const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text); + if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) { + text = text.substring(1, text.length - 1); + } + text = escape$1(text, true); + return { + type: 'codespan', + raw: cap[0], + text, + }; + } + } + br(src) { + const cap = this.rules.inline.br.exec(src); + if (cap) { + return { + type: 'br', + raw: cap[0], + }; + } + } + del(src) { + const cap = this.rules.inline.del.exec(src); + if (cap) { + return { + type: 'del', + raw: cap[0], + text: cap[2], + tokens: this.lexer.inlineTokens(cap[2]), + }; + } + } + autolink(src) { + const cap = this.rules.inline.autolink.exec(src); + if (cap) { + let text, href; + if (cap[2] === '@') { + text = escape$1(cap[1]); + href = 'mailto:' + text; + } + else { + text = escape$1(cap[1]); + href = text; + } + return { + type: 'link', + raw: cap[0], + text, + href, + tokens: [ + { + type: 'text', + raw: text, + text, + }, + ], + }; + } + } + url(src) { + let cap; + if (cap = this.rules.inline.url.exec(src)) { + let text, href; + if (cap[2] === '@') { + text = escape$1(cap[0]); + href = 'mailto:' + text; + } + else { + // do extended autolink path validation + let prevCapZero; + do { + prevCapZero = cap[0]; + cap[0] = this.rules.inline._backpedal.exec(cap[0])?.[0] ?? ''; + } while (prevCapZero !== cap[0]); + text = escape$1(cap[0]); + if (cap[1] === 'www.') { + href = 'http://' + cap[0]; + } + else { + href = cap[0]; + } + } + return { + type: 'link', + raw: cap[0], + text, + href, + tokens: [ + { + type: 'text', + raw: text, + text, + }, + ], + }; + } + } + inlineText(src) { + const cap = this.rules.inline.text.exec(src); + if (cap) { + let text; + if (this.lexer.state.inRawBlock) { + text = cap[0]; + } + else { + text = escape$1(cap[0]); + } + return { + type: 'text', + raw: cap[0], + text, + }; + } + } + } /** * Block-Level Grammar */ - var block = { - newline: /^(?: *(?:\n|$))+/, - code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/, - fences: /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, - hr: /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, - heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, - blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/, - list: /^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/, - html: '^ {0,3}(?:' // optional indentation - + '<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)' // (1) - + '|comment[^\\n]*(\\n+|$)' // (2) - + '|<\\?[\\s\\S]*?(?:\\?>\\n*|$)' // (3) - + '|\\n*|$)' // (4) - + '|\\n*|$)' // (5) - + '|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (6) - + '|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) open tag - + '|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag - + ')', - def: /^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/, - table: noopTest, - lheading: /^((?:.|\n(?!\n))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, - // regex template, placeholders will be replaced according to different paragraph - // interruption rules of commonmark and the original markdown spec: - _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, - text: /^[^\n]+/ - }; - block._label = /(?!\s*\])(?:\\.|[^\[\]\\])+/; - block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/; - block.def = edit(block.def).replace('label', block._label).replace('title', block._title).getRegex(); - block.bullet = /(?:[*+-]|\d{1,9}[.)])/; - block.listItemStart = edit(/^( *)(bull) */).replace('bull', block.bullet).getRegex(); - block.list = edit(block.list).replace(/bull/g, block.bullet).replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))').replace('def', '\\n+(?=' + block.def.source + ')').getRegex(); - block._tag = 'address|article|aside|base|basefont|blockquote|body|caption' + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr' + '|track|ul'; - block._comment = /|$)/; - block.html = edit(block.html, 'i').replace('comment', block._comment).replace('tag', block._tag).replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); - block.paragraph = edit(block._paragraph).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs - .replace('|table', '').replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt - .replace('html', ')|<(?:script|pre|style|textarea|!--)').replace('tag', block._tag) // pars can be interrupted by type (6) html blocks - .getRegex(); - block.blockquote = edit(block.blockquote).replace('paragraph', block.paragraph).getRegex(); - + const newline = /^(?: *(?:\n|$))+/; + const blockCode = /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/; + const fences = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/; + const hr = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/; + const heading = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/; + const bullet = /(?:[*+-]|\d{1,9}[.)])/; + const lheading = edit(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/) + .replace(/bull/g, bullet) // lists can interrupt + .replace(/blockCode/g, / {4}/) // indented code blocks can interrupt + .replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/) // fenced code blocks can interrupt + .replace(/blockquote/g, / {0,3}>/) // blockquote can interrupt + .replace(/heading/g, / {0,3}#{1,6}/) // ATX heading can interrupt + .replace(/html/g, / {0,3}<[^\n>]+>\n/) // block html can interrupt + .getRegex(); + const _paragraph = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/; + const blockText = /^[^\n]+/; + const _blockLabel = /(?!\s*\])(?:\\.|[^\[\]\\])+/; + const def = edit(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/) + .replace('label', _blockLabel) + .replace('title', /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/) + .getRegex(); + const list = edit(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/) + .replace(/bull/g, bullet) + .getRegex(); + const _tag = 'address|article|aside|base|basefont|blockquote|body|caption' + + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption' + + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe' + + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option' + + '|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title' + + '|tr|track|ul'; + const _comment = /|$))/; + const html = edit('^ {0,3}(?:' // optional indentation + + '<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)' // (1) + + '|comment[^\\n]*(\\n+|$)' // (2) + + '|<\\?[\\s\\S]*?(?:\\?>\\n*|$)' // (3) + + '|\\n*|$)' // (4) + + '|\\n*|$)' // (5) + + '|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (6) + + '|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) open tag + + '|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)' // (7) closing tag + + ')', 'i') + .replace('comment', _comment) + .replace('tag', _tag) + .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/) + .getRegex(); + const paragraph = edit(_paragraph) + .replace('hr', hr) + .replace('heading', ' {0,3}#{1,6}(?:\\s|$)') + .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs + .replace('|table', '') + .replace('blockquote', ' {0,3}>') + .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') + .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt + .replace('html', ')|<(?:script|pre|style|textarea|!--)') + .replace('tag', _tag) // pars can be interrupted by type (6) html blocks + .getRegex(); + const blockquote = edit(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/) + .replace('paragraph', paragraph) + .getRegex(); /** * Normal Block Grammar */ - - block.normal = _extends({}, block); - + const blockNormal = { + blockquote, + code: blockCode, + def, + fences, + heading, + hr, + html, + lheading, + list, + newline, + paragraph, + table: noopTest, + text: blockText, + }; /** * GFM Block Grammar */ - - block.gfm = _extends({}, block.normal, { - table: '^ *([^\\n ].*\\|.*)\\n' // Header - + ' {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?' // Align - + '(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells - }); - - block.gfm.table = edit(block.gfm.table).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('blockquote', ' {0,3}>').replace('code', ' {4}[^\\n]').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt - .replace('html', ')|<(?:script|pre|style|textarea|!--)').replace('tag', block._tag) // tables can be interrupted by type (6) html blocks - .getRegex(); - block.gfm.paragraph = edit(block._paragraph).replace('hr', block.hr).replace('heading', ' {0,3}#{1,6} ').replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs - .replace('table', block.gfm.table) // interrupt paragraphs with table - .replace('blockquote', ' {0,3}>').replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n').replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt - .replace('html', ')|<(?:script|pre|style|textarea|!--)').replace('tag', block._tag) // pars can be interrupted by type (6) html blocks - .getRegex(); + const gfmTable = edit('^ *([^\\n ].*)\\n' // Header + + ' {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)' // Align + + '(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)') // Cells + .replace('hr', hr) + .replace('heading', ' {0,3}#{1,6}(?:\\s|$)') + .replace('blockquote', ' {0,3}>') + .replace('code', ' {4}[^\\n]') + .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') + .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt + .replace('html', ')|<(?:script|pre|style|textarea|!--)') + .replace('tag', _tag) // tables can be interrupted by type (6) html blocks + .getRegex(); + const blockGfm = { + ...blockNormal, + table: gfmTable, + paragraph: edit(_paragraph) + .replace('hr', hr) + .replace('heading', ' {0,3}#{1,6}(?:\\s|$)') + .replace('|lheading', '') // setext headings don't interrupt commonmark paragraphs + .replace('table', gfmTable) // interrupt paragraphs with table + .replace('blockquote', ' {0,3}>') + .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n') + .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt + .replace('html', ')|<(?:script|pre|style|textarea|!--)') + .replace('tag', _tag) // pars can be interrupted by type (6) html blocks + .getRegex(), + }; /** * Pedantic grammar (original John Gruber's loose markdown specification) */ - - block.pedantic = _extends({}, block.normal, { - html: edit('^ *(?:comment *(?:\\n|\\s*$)' + '|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)' // closed tag - + '|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))').replace('comment', block._comment).replace(/tag/g, '(?!(?:' + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b').getRegex(), - def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, - heading: /^(#{1,6})(.*)(?:\n+|$)/, - fences: noopTest, - // fences not supported - lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, - paragraph: edit(block.normal._paragraph).replace('hr', block.hr).replace('heading', ' *#{1,6} *[^\n]').replace('lheading', block.lheading).replace('blockquote', ' {0,3}>').replace('|fences', '').replace('|list', '').replace('|html', '').getRegex() - }); - + const blockPedantic = { + ...blockNormal, + html: edit('^ *(?:comment *(?:\\n|\\s*$)' + + '|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)' // closed tag + + '|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))') + .replace('comment', _comment) + .replace(/tag/g, '(?!(?:' + + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub' + + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)' + + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b') + .getRegex(), + def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, + heading: /^(#{1,6})(.*)(?:\n+|$)/, + fences: noopTest, // fences not supported + lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, + paragraph: edit(_paragraph) + .replace('hr', hr) + .replace('heading', ' *#{1,6} *[^\n]') + .replace('lheading', lheading) + .replace('|table', '') + .replace('blockquote', ' {0,3}>') + .replace('|fences', '') + .replace('|list', '') + .replace('|html', '') + .replace('|tag', '') + .getRegex(), + }; /** * Inline-Level Grammar */ - var inline = { - escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, - autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/, - url: noopTest, - tag: '^comment' + '|^' // self-closing tag - + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag - + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. - + '|^' // declaration, e.g. - + '|^', - // CDATA section - link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/, - reflink: /^!?\[(label)\]\[(ref)\]/, - nolink: /^!?\[(ref)\](?:\[\])?/, - reflinkSearch: 'reflink|nolink(?!\\()', - emStrong: { - lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/, - // (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left. (5) and (6) can be either Left or Right. - // () Skip orphan inside strong () Consume to delim (1) #*** (2) a***#, a*** (3) #***a, ***a (4) ***# (5) #***# (6) a***a - rDelimAst: /^(?:[^_*\\]|\\.)*?\_\_(?:[^_*\\]|\\.)*?\*(?:[^_*\\]|\\.)*?(?=\_\_)|(?:[^*\\]|\\.)+(?=[^*])|[punct_](\*+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|(?:[^punct*_\s\\]|\\.)(\*+)(?=[^punct*_\s])/, - rDelimUnd: /^(?:[^_*\\]|\\.)*?\*\*(?:[^_*\\]|\\.)*?\_(?:[^_*\\]|\\.)*?(?=\*\*)|(?:[^_\\]|\\.)+(?=[^_])|[punct*](\_+)(?=[\s]|$)|(?:[^punct*_\s\\]|\\.)(\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ // ^- Not allowed for _ - }, - - code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, - br: /^( {2,}|\\)\n(?!\s*$)/, - del: noopTest, - text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~'; - inline.punctuation = edit(inline.punctuation).replace(/punctuation/g, inline._punctuation).getRegex(); - + const escape = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/; + const inlineCode = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/; + const br = /^( {2,}|\\)\n(?!\s*$)/; + const inlineText = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\ - inline.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g; - // lookbehind is not available on Safari as of version 16 - // inline.escapedEmSt = /(?<=(?:^|[^\\)(?:\\[^])*)\\[*_]/g; - inline.escapedEmSt = /(?:^|[^\\])(?:\\\\)*\\[*_]/g; - inline._comment = edit(block._comment).replace('(?:-->|$)', '-->').getRegex(); - inline.emStrong.lDelim = edit(inline.emStrong.lDelim).replace(/punct/g, inline._punctuation).getRegex(); - inline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, 'g').replace(/punct/g, inline._punctuation).getRegex(); - inline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, 'g').replace(/punct/g, inline._punctuation).getRegex(); - inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g; - inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/; - inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/; - inline.autolink = edit(inline.autolink).replace('scheme', inline._scheme).replace('email', inline._email).getRegex(); - inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/; - inline.tag = edit(inline.tag).replace('comment', inline._comment).replace('attribute', inline._attribute).getRegex(); - inline._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/; - inline._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/; - inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/; - inline.link = edit(inline.link).replace('label', inline._label).replace('href', inline._href).replace('title', inline._title).getRegex(); - inline.reflink = edit(inline.reflink).replace('label', inline._label).replace('ref', block._label).getRegex(); - inline.nolink = edit(inline.nolink).replace('ref', block._label).getRegex(); - inline.reflinkSearch = edit(inline.reflinkSearch, 'g').replace('reflink', inline.reflink).replace('nolink', inline.nolink).getRegex(); - + const blockSkip = /\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g; + const emStrongLDelim = edit(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/, 'u') + .replace(/punct/g, _punctuation) + .getRegex(); + const emStrongRDelimAst = edit('^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)' // Skip orphan inside strong + + '|[^*]+(?=[^*])' // Consume to delim + + '|(?!\\*)[punct](\\*+)(?=[\\s]|$)' // (1) #*** can only be a Right Delimiter + + '|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)' // (2) a***#, a*** can only be a Right Delimiter + + '|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])' // (3) #***a, ***a can only be Left Delimiter + + '|[\\s](\\*+)(?!\\*)(?=[punct])' // (4) ***# can only be Left Delimiter + + '|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])' // (5) #***# can be either Left or Right Delimiter + + '|[^punct\\s](\\*+)(?=[^punct\\s])', 'gu') // (6) a***a can be either Left or Right Delimiter + .replace(/punct/g, _punctuation) + .getRegex(); + // (6) Not allowed for _ + const emStrongRDelimUnd = edit('^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)' // Skip orphan inside strong + + '|[^_]+(?=[^_])' // Consume to delim + + '|(?!_)[punct](_+)(?=[\\s]|$)' // (1) #___ can only be a Right Delimiter + + '|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)' // (2) a___#, a___ can only be a Right Delimiter + + '|(?!_)[punct\\s](_+)(?=[^punct\\s])' // (3) #___a, ___a can only be Left Delimiter + + '|[\\s](_+)(?!_)(?=[punct])' // (4) ___# can only be Left Delimiter + + '|(?!_)[punct](_+)(?!_)(?=[punct])', 'gu') // (5) #___# can be either Left or Right Delimiter + .replace(/punct/g, _punctuation) + .getRegex(); + const anyPunctuation = edit(/\\([punct])/, 'gu') + .replace(/punct/g, _punctuation) + .getRegex(); + const autolink = edit(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/) + .replace('scheme', /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/) + .replace('email', /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/) + .getRegex(); + const _inlineComment = edit(_comment).replace('(?:-->|$)', '-->').getRegex(); + const tag = edit('^comment' + + '|^' // self-closing tag + + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag + + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. + + '|^' // declaration, e.g. + + '|^') // CDATA section + .replace('comment', _inlineComment) + .replace('attribute', /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/) + .getRegex(); + const _inlineLabel = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/; + const link = edit(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/) + .replace('label', _inlineLabel) + .replace('href', /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/) + .replace('title', /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/) + .getRegex(); + const reflink = edit(/^!?\[(label)\]\[(ref)\]/) + .replace('label', _inlineLabel) + .replace('ref', _blockLabel) + .getRegex(); + const nolink = edit(/^!?\[(ref)\](?:\[\])?/) + .replace('ref', _blockLabel) + .getRegex(); + const reflinkSearch = edit('reflink|nolink(?!\\()', 'g') + .replace('reflink', reflink) + .replace('nolink', nolink) + .getRegex(); /** * Normal Inline Grammar */ - - inline.normal = _extends({}, inline); - + const inlineNormal = { + _backpedal: noopTest, // only used for GFM url + anyPunctuation, + autolink, + blockSkip, + br, + code: inlineCode, + del: noopTest, + emStrongLDelim, + emStrongRDelimAst, + emStrongRDelimUnd, + escape, + link, + nolink, + punctuation, + reflink, + reflinkSearch, + tag, + text: inlineText, + url: noopTest, + }; /** * Pedantic Inline Grammar */ - - inline.pedantic = _extends({}, inline.normal, { - strong: { - start: /^__|\*\*/, - middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, - endAst: /\*\*(?!\*)/g, - endUnd: /__(?!_)/g - }, - em: { - start: /^_|\*/, - middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/, - endAst: /\*(?!\*)/g, - endUnd: /_(?!_)/g - }, - link: edit(/^!?\[(label)\]\((.*?)\)/).replace('label', inline._label).getRegex(), - reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace('label', inline._label).getRegex() - }); - + const inlinePedantic = { + ...inlineNormal, + link: edit(/^!?\[(label)\]\((.*?)\)/) + .replace('label', _inlineLabel) + .getRegex(), + reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/) + .replace('label', _inlineLabel) + .getRegex(), + }; /** * GFM Inline Grammar */ - - inline.gfm = _extends({}, inline.normal, { - escape: edit(inline.escape).replace('])', '~|])').getRegex(), - _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/, - url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, - _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, - del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/, - text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\ 0.5) { - ch = 'x' + ch.toString(16); - } - out += '&#' + ch + ';'; - } - return out; - } + const block = { + normal: blockNormal, + gfm: blockGfm, + pedantic: blockPedantic, + }; + const inline = { + normal: inlineNormal, + gfm: inlineGfm, + breaks: inlineBreaks, + pedantic: inlinePedantic, + }; /** * Block Lexer */ - var Lexer = /*#__PURE__*/function () { - function Lexer(options) { - this.tokens = []; - this.tokens.links = Object.create(null); - this.options = options || exports.defaults; - this.options.tokenizer = this.options.tokenizer || new Tokenizer(); - this.tokenizer = this.options.tokenizer; - this.tokenizer.options = this.options; - this.tokenizer.lexer = this; - this.inlineQueue = []; - this.state = { - inLink: false, - inRawBlock: false, - top: true - }; - var rules = { - block: block.normal, - inline: inline.normal - }; - if (this.options.pedantic) { - rules.block = block.pedantic; - rules.inline = inline.pedantic; - } else if (this.options.gfm) { - rules.block = block.gfm; - if (this.options.breaks) { - rules.inline = inline.breaks; - } else { - rules.inline = inline.gfm; - } - } - this.tokenizer.rules = rules; - } - - /** - * Expose Rules - */ - /** - * Static Lex Method - */ - Lexer.lex = function lex(src, options) { - var lexer = new Lexer(options); - return lexer.lex(src); - } - - /** - * Static Lex Inline Method - */; - Lexer.lexInline = function lexInline(src, options) { - var lexer = new Lexer(options); - return lexer.inlineTokens(src); - } - - /** - * Preprocessing - */; - var _proto = Lexer.prototype; - _proto.lex = function lex(src) { - src = src.replace(/\r\n|\r/g, '\n'); - this.blockTokens(src, this.tokens); - var next; - while (next = this.inlineQueue.shift()) { - this.inlineTokens(next.src, next.tokens); - } - return this.tokens; - } - - /** - * Lexing - */; - _proto.blockTokens = function blockTokens(src, tokens) { - var _this = this; - if (tokens === void 0) { - tokens = []; - } - if (this.options.pedantic) { - src = src.replace(/\t/g, ' ').replace(/^ +$/gm, ''); - } else { - src = src.replace(/^( *)(\t+)/gm, function (_, leading, tabs) { - return leading + ' '.repeat(tabs.length); - }); - } - var token, lastToken, cutSrc, lastParagraphClipped; - var _loop = function _loop() { - if (_this.options.extensions && _this.options.extensions.block && _this.options.extensions.block.some(function (extTokenizer) { - if (token = extTokenizer.call({ - lexer: _this - }, src, tokens)) { - src = src.substring(token.raw.length); - tokens.push(token); - return true; - } - return false; - })) { - return "continue"; - } - - // newline - if (token = _this.tokenizer.space(src)) { - src = src.substring(token.raw.length); - if (token.raw.length === 1 && tokens.length > 0) { - // if there's a single \n as a spacer, it's terminating the last line, - // so move it there so that we don't get unecessary paragraph tags - tokens[tokens.length - 1].raw += '\n'; - } else { - tokens.push(token); - } - return "continue"; - } - - // code - if (token = _this.tokenizer.code(src)) { - src = src.substring(token.raw.length); - lastToken = tokens[tokens.length - 1]; - // An indented code block cannot interrupt a paragraph. - if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) { - lastToken.raw += '\n' + token.raw; - lastToken.text += '\n' + token.text; - _this.inlineQueue[_this.inlineQueue.length - 1].src = lastToken.text; - } else { - tokens.push(token); - } - return "continue"; - } - - // fences - if (token = _this.tokenizer.fences(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // heading - if (token = _this.tokenizer.heading(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // hr - if (token = _this.tokenizer.hr(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // blockquote - if (token = _this.tokenizer.blockquote(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // list - if (token = _this.tokenizer.list(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // html - if (token = _this.tokenizer.html(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // def - if (token = _this.tokenizer.def(src)) { - src = src.substring(token.raw.length); - lastToken = tokens[tokens.length - 1]; - if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) { - lastToken.raw += '\n' + token.raw; - lastToken.text += '\n' + token.raw; - _this.inlineQueue[_this.inlineQueue.length - 1].src = lastToken.text; - } else if (!_this.tokens.links[token.tag]) { - _this.tokens.links[token.tag] = { - href: token.href, - title: token.title - }; - } - return "continue"; - } - - // table (gfm) - if (token = _this.tokenizer.table(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // lheading - if (token = _this.tokenizer.lheading(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // top-level paragraph - // prevent paragraph consuming extensions by clipping 'src' to extension start - cutSrc = src; - if (_this.options.extensions && _this.options.extensions.startBlock) { - var startIndex = Infinity; - var tempSrc = src.slice(1); - var tempStart; - _this.options.extensions.startBlock.forEach(function (getStartIndex) { - tempStart = getStartIndex.call({ - lexer: this - }, tempSrc); - if (typeof tempStart === 'number' && tempStart >= 0) { - startIndex = Math.min(startIndex, tempStart); - } - }); - if (startIndex < Infinity && startIndex >= 0) { - cutSrc = src.substring(0, startIndex + 1); - } - } - if (_this.state.top && (token = _this.tokenizer.paragraph(cutSrc))) { - lastToken = tokens[tokens.length - 1]; - if (lastParagraphClipped && lastToken.type === 'paragraph') { - lastToken.raw += '\n' + token.raw; - lastToken.text += '\n' + token.text; - _this.inlineQueue.pop(); - _this.inlineQueue[_this.inlineQueue.length - 1].src = lastToken.text; - } else { - tokens.push(token); - } - lastParagraphClipped = cutSrc.length !== src.length; - src = src.substring(token.raw.length); - return "continue"; - } - - // text - if (token = _this.tokenizer.text(src)) { - src = src.substring(token.raw.length); - lastToken = tokens[tokens.length - 1]; - if (lastToken && lastToken.type === 'text') { - lastToken.raw += '\n' + token.raw; - lastToken.text += '\n' + token.text; - _this.inlineQueue.pop(); - _this.inlineQueue[_this.inlineQueue.length - 1].src = lastToken.text; - } else { - tokens.push(token); - } - return "continue"; - } - if (src) { - var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0); - if (_this.options.silent) { - console.error(errMsg); - return "break"; - } else { - throw new Error(errMsg); - } - } - }; - while (src) { - var _ret = _loop(); - if (_ret === "continue") continue; - if (_ret === "break") break; - } - this.state.top = true; - return tokens; - }; - _proto.inline = function inline(src, tokens) { - if (tokens === void 0) { - tokens = []; - } - this.inlineQueue.push({ - src: src, - tokens: tokens - }); - return tokens; - } - - /** - * Lexing/Compiling - */; - _proto.inlineTokens = function inlineTokens(src, tokens) { - var _this2 = this; - if (tokens === void 0) { - tokens = []; - } - var token, lastToken, cutSrc; - - // String with links masked to avoid interference with em and strong - var maskedSrc = src; - var match; - var keepPrevChar, prevChar; - - // Mask out reflinks - if (this.tokens.links) { - var links = Object.keys(this.tokens.links); - if (links.length > 0) { - while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) { - if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) { - maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex); - } + class _Lexer { + tokens; + options; + state; + tokenizer; + inlineQueue; + constructor(options) { + // TokenList cannot be created in one go + this.tokens = []; + this.tokens.links = Object.create(null); + this.options = options || exports.defaults; + this.options.tokenizer = this.options.tokenizer || new _Tokenizer(); + this.tokenizer = this.options.tokenizer; + this.tokenizer.options = this.options; + this.tokenizer.lexer = this; + this.inlineQueue = []; + this.state = { + inLink: false, + inRawBlock: false, + top: true, + }; + const rules = { + block: block.normal, + inline: inline.normal, + }; + if (this.options.pedantic) { + rules.block = block.pedantic; + rules.inline = inline.pedantic; + } + else if (this.options.gfm) { + rules.block = block.gfm; + if (this.options.breaks) { + rules.inline = inline.breaks; + } + else { + rules.inline = inline.gfm; + } } - } + this.tokenizer.rules = rules; } - // Mask out other blocks - while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) { - maskedSrc = maskedSrc.slice(0, match.index) + '[' + repeatString('a', match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + /** + * Expose Rules + */ + static get rules() { + return { + block, + inline, + }; } - - // Mask out escaped em & strong delimiters - while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) { - maskedSrc = maskedSrc.slice(0, match.index + match[0].length - 2) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex); - this.tokenizer.rules.inline.escapedEmSt.lastIndex--; - } - var _loop2 = function _loop2() { - if (!keepPrevChar) { - prevChar = ''; - } - keepPrevChar = false; - - // extensions - if (_this2.options.extensions && _this2.options.extensions.inline && _this2.options.extensions.inline.some(function (extTokenizer) { - if (token = extTokenizer.call({ - lexer: _this2 - }, src, tokens)) { - src = src.substring(token.raw.length); - tokens.push(token); - return true; - } - return false; - })) { - return "continue"; - } - - // escape - if (token = _this2.tokenizer.escape(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // tag - if (token = _this2.tokenizer.tag(src)) { - src = src.substring(token.raw.length); - lastToken = tokens[tokens.length - 1]; - if (lastToken && token.type === 'text' && lastToken.type === 'text') { - lastToken.raw += token.raw; - lastToken.text += token.text; - } else { - tokens.push(token); - } - return "continue"; - } - - // link - if (token = _this2.tokenizer.link(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // reflink, nolink - if (token = _this2.tokenizer.reflink(src, _this2.tokens.links)) { - src = src.substring(token.raw.length); - lastToken = tokens[tokens.length - 1]; - if (lastToken && token.type === 'text' && lastToken.type === 'text') { - lastToken.raw += token.raw; - lastToken.text += token.text; - } else { - tokens.push(token); - } - return "continue"; - } - - // em & strong - if (token = _this2.tokenizer.emStrong(src, maskedSrc, prevChar)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // code - if (token = _this2.tokenizer.codespan(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // br - if (token = _this2.tokenizer.br(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // del (gfm) - if (token = _this2.tokenizer.del(src)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // autolink - if (token = _this2.tokenizer.autolink(src, mangle)) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // url (gfm) - if (!_this2.state.inLink && (token = _this2.tokenizer.url(src, mangle))) { - src = src.substring(token.raw.length); - tokens.push(token); - return "continue"; - } - - // text - // prevent inlineText consuming extensions by clipping 'src' to extension start - cutSrc = src; - if (_this2.options.extensions && _this2.options.extensions.startInline) { - var startIndex = Infinity; - var tempSrc = src.slice(1); - var tempStart; - _this2.options.extensions.startInline.forEach(function (getStartIndex) { - tempStart = getStartIndex.call({ - lexer: this - }, tempSrc); - if (typeof tempStart === 'number' && tempStart >= 0) { - startIndex = Math.min(startIndex, tempStart); - } - }); - if (startIndex < Infinity && startIndex >= 0) { - cutSrc = src.substring(0, startIndex + 1); - } - } - if (token = _this2.tokenizer.inlineText(cutSrc, smartypants)) { - src = src.substring(token.raw.length); - if (token.raw.slice(-1) !== '_') { - // Track prevChar before string of ____ started - prevChar = token.raw.slice(-1); - } - keepPrevChar = true; - lastToken = tokens[tokens.length - 1]; - if (lastToken && lastToken.type === 'text') { - lastToken.raw += token.raw; - lastToken.text += token.text; - } else { - tokens.push(token); - } - return "continue"; - } - if (src) { - var errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0); - if (_this2.options.silent) { - console.error(errMsg); - return "break"; - } else { - throw new Error(errMsg); - } - } - }; - while (src) { - var _ret2 = _loop2(); - if (_ret2 === "continue") continue; - if (_ret2 === "break") break; - } - return tokens; - }; - _createClass(Lexer, null, [{ - key: "rules", - get: function get() { - return { - block: block, - inline: inline - }; - } - }]); - return Lexer; - }(); + /** + * Static Lex Method + */ + static lex(src, options) { + const lexer = new _Lexer(options); + return lexer.lex(src); + } + /** + * Static Lex Inline Method + */ + static lexInline(src, options) { + const lexer = new _Lexer(options); + return lexer.inlineTokens(src); + } + /** + * Preprocessing + */ + lex(src) { + src = src + .replace(/\r\n|\r/g, '\n'); + this.blockTokens(src, this.tokens); + for (let i = 0; i < this.inlineQueue.length; i++) { + const next = this.inlineQueue[i]; + this.inlineTokens(next.src, next.tokens); + } + this.inlineQueue = []; + return this.tokens; + } + blockTokens(src, tokens = [], lastParagraphClipped = false) { + if (this.options.pedantic) { + src = src.replace(/\t/g, ' ').replace(/^ +$/gm, ''); + } + else { + src = src.replace(/^( *)(\t+)/gm, (_, leading, tabs) => { + return leading + ' '.repeat(tabs.length); + }); + } + let token; + let lastToken; + let cutSrc; + while (src) { + if (this.options.extensions + && this.options.extensions.block + && this.options.extensions.block.some((extTokenizer) => { + if (token = extTokenizer.call({ lexer: this }, src, tokens)) { + src = src.substring(token.raw.length); + tokens.push(token); + return true; + } + return false; + })) { + continue; + } + // newline + if (token = this.tokenizer.space(src)) { + src = src.substring(token.raw.length); + if (token.raw.length === 1 && tokens.length > 0) { + // if there's a single \n as a spacer, it's terminating the last line, + // so move it there so that we don't get unnecessary paragraph tags + tokens[tokens.length - 1].raw += '\n'; + } + else { + tokens.push(token); + } + continue; + } + // code + if (token = this.tokenizer.code(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + // An indented code block cannot interrupt a paragraph. + if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) { + lastToken.raw += '\n' + token.raw; + lastToken.text += '\n' + token.text; + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } + else { + tokens.push(token); + } + continue; + } + // fences + if (token = this.tokenizer.fences(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // heading + if (token = this.tokenizer.heading(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // hr + if (token = this.tokenizer.hr(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // blockquote + if (token = this.tokenizer.blockquote(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // list + if (token = this.tokenizer.list(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // html + if (token = this.tokenizer.html(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // def + if (token = this.tokenizer.def(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) { + lastToken.raw += '\n' + token.raw; + lastToken.text += '\n' + token.raw; + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } + else if (!this.tokens.links[token.tag]) { + this.tokens.links[token.tag] = { + href: token.href, + title: token.title, + }; + } + continue; + } + // table (gfm) + if (token = this.tokenizer.table(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // lheading + if (token = this.tokenizer.lheading(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // top-level paragraph + // prevent paragraph consuming extensions by clipping 'src' to extension start + cutSrc = src; + if (this.options.extensions && this.options.extensions.startBlock) { + let startIndex = Infinity; + const tempSrc = src.slice(1); + let tempStart; + this.options.extensions.startBlock.forEach((getStartIndex) => { + tempStart = getStartIndex.call({ lexer: this }, tempSrc); + if (typeof tempStart === 'number' && tempStart >= 0) { + startIndex = Math.min(startIndex, tempStart); + } + }); + if (startIndex < Infinity && startIndex >= 0) { + cutSrc = src.substring(0, startIndex + 1); + } + } + if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) { + lastToken = tokens[tokens.length - 1]; + if (lastParagraphClipped && lastToken?.type === 'paragraph') { + lastToken.raw += '\n' + token.raw; + lastToken.text += '\n' + token.text; + this.inlineQueue.pop(); + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } + else { + tokens.push(token); + } + lastParagraphClipped = (cutSrc.length !== src.length); + src = src.substring(token.raw.length); + continue; + } + // text + if (token = this.tokenizer.text(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && lastToken.type === 'text') { + lastToken.raw += '\n' + token.raw; + lastToken.text += '\n' + token.text; + this.inlineQueue.pop(); + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } + else { + tokens.push(token); + } + continue; + } + if (src) { + const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0); + if (this.options.silent) { + console.error(errMsg); + break; + } + else { + throw new Error(errMsg); + } + } + } + this.state.top = true; + return tokens; + } + inline(src, tokens = []) { + this.inlineQueue.push({ src, tokens }); + return tokens; + } + /** + * Lexing/Compiling + */ + inlineTokens(src, tokens = []) { + let token, lastToken, cutSrc; + // String with links masked to avoid interference with em and strong + let maskedSrc = src; + let match; + let keepPrevChar, prevChar; + // Mask out reflinks + if (this.tokens.links) { + const links = Object.keys(this.tokens.links); + if (links.length > 0) { + while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) { + if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) { + maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex); + } + } + } + } + // Mask out other blocks + while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) { + maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + } + // Mask out escaped characters + while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) { + maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); + } + while (src) { + if (!keepPrevChar) { + prevChar = ''; + } + keepPrevChar = false; + // extensions + if (this.options.extensions + && this.options.extensions.inline + && this.options.extensions.inline.some((extTokenizer) => { + if (token = extTokenizer.call({ lexer: this }, src, tokens)) { + src = src.substring(token.raw.length); + tokens.push(token); + return true; + } + return false; + })) { + continue; + } + // escape + if (token = this.tokenizer.escape(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // tag + if (token = this.tokenizer.tag(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && token.type === 'text' && lastToken.type === 'text') { + lastToken.raw += token.raw; + lastToken.text += token.text; + } + else { + tokens.push(token); + } + continue; + } + // link + if (token = this.tokenizer.link(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // reflink, nolink + if (token = this.tokenizer.reflink(src, this.tokens.links)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && token.type === 'text' && lastToken.type === 'text') { + lastToken.raw += token.raw; + lastToken.text += token.text; + } + else { + tokens.push(token); + } + continue; + } + // em & strong + if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // code + if (token = this.tokenizer.codespan(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // br + if (token = this.tokenizer.br(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // del (gfm) + if (token = this.tokenizer.del(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // autolink + if (token = this.tokenizer.autolink(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // url (gfm) + if (!this.state.inLink && (token = this.tokenizer.url(src))) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + // text + // prevent inlineText consuming extensions by clipping 'src' to extension start + cutSrc = src; + if (this.options.extensions && this.options.extensions.startInline) { + let startIndex = Infinity; + const tempSrc = src.slice(1); + let tempStart; + this.options.extensions.startInline.forEach((getStartIndex) => { + tempStart = getStartIndex.call({ lexer: this }, tempSrc); + if (typeof tempStart === 'number' && tempStart >= 0) { + startIndex = Math.min(startIndex, tempStart); + } + }); + if (startIndex < Infinity && startIndex >= 0) { + cutSrc = src.substring(0, startIndex + 1); + } + } + if (token = this.tokenizer.inlineText(cutSrc)) { + src = src.substring(token.raw.length); + if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started + prevChar = token.raw.slice(-1); + } + keepPrevChar = true; + lastToken = tokens[tokens.length - 1]; + if (lastToken && lastToken.type === 'text') { + lastToken.raw += token.raw; + lastToken.text += token.text; + } + else { + tokens.push(token); + } + continue; + } + if (src) { + const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0); + if (this.options.silent) { + console.error(errMsg); + break; + } + else { + throw new Error(errMsg); + } + } + } + return tokens; + } + } /** * Renderer */ - var Renderer = /*#__PURE__*/function () { - function Renderer(options) { - this.options = options || exports.defaults; - } - var _proto = Renderer.prototype; - _proto.code = function code(_code, infostring, escaped) { - var lang = (infostring || '').match(/\S*/)[0]; - if (this.options.highlight) { - var out = this.options.highlight(_code, lang); - if (out != null && out !== _code) { - escaped = true; - _code = out; - } - } - _code = _code.replace(/\n$/, '') + '\n'; - if (!lang) { - return '
    ' + (escaped ? _code : escape(_code, true)) + '
    \n'; - } - return '
    ' + (escaped ? _code : escape(_code, true)) + '
    \n'; - } - - /** - * @param {string} quote - */; - _proto.blockquote = function blockquote(quote) { - return "
    \n" + quote + "
    \n"; - }; - _proto.html = function html(_html, block) { - return _html; - } - - /** - * @param {string} text - * @param {string} level - * @param {string} raw - * @param {any} slugger - */; - _proto.heading = function heading(text, level, raw, slugger) { - if (this.options.headerIds) { - var id = this.options.headerPrefix + slugger.slug(raw); - return "" + text + "\n"; + class _Renderer { + options; + parser; // set by the parser + constructor(options) { + this.options = options || exports.defaults; + } + space(token) { + return ''; + } + code({ text, lang, escaped }) { + const langString = (lang || '').match(/^\S*/)?.[0]; + const code = text.replace(/\n$/, '') + '\n'; + if (!langString) { + return '
    '
    +                  + (escaped ? code : escape$1(code, true))
    +                  + '
    \n'; + } + return '
    '
    +              + (escaped ? code : escape$1(code, true))
    +              + '
    \n'; + } + blockquote({ tokens }) { + const body = this.parser.parse(tokens); + return `
    \n${body}
    \n`; + } + html({ text }) { + return text; + } + heading({ tokens, depth }) { + return `${this.parser.parseInline(tokens)}\n`; + } + hr(token) { + return '
    \n'; + } + list(token) { + const ordered = token.ordered; + const start = token.start; + let body = ''; + for (let j = 0; j < token.items.length; j++) { + const item = token.items[j]; + body += this.listitem(item); + } + const type = ordered ? 'ol' : 'ul'; + const startAttr = (ordered && start !== 1) ? (' start="' + start + '"') : ''; + return '<' + type + startAttr + '>\n' + body + '\n'; + } + listitem(item) { + let itemBody = ''; + if (item.task) { + const checkbox = this.checkbox({ checked: !!item.checked }); + if (item.loose) { + if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') { + item.tokens[0].text = checkbox + ' ' + item.tokens[0].text; + if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') { + item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text; + } + } + else { + item.tokens.unshift({ + type: 'text', + raw: checkbox + ' ', + text: checkbox + ' ', + }); + } + } + else { + itemBody += checkbox + ' '; + } + } + itemBody += this.parser.parse(item.tokens, !!item.loose); + return `
  • ${itemBody}
  • \n`; + } + checkbox({ checked }) { + return ''; + } + paragraph({ tokens }) { + return `

    ${this.parser.parseInline(tokens)}

    \n`; + } + table(token) { + let header = ''; + // header + let cell = ''; + for (let j = 0; j < token.header.length; j++) { + cell += this.tablecell(token.header[j]); + } + header += this.tablerow({ text: cell }); + let body = ''; + for (let j = 0; j < token.rows.length; j++) { + const row = token.rows[j]; + cell = ''; + for (let k = 0; k < row.length; k++) { + cell += this.tablecell(row[k]); + } + body += this.tablerow({ text: cell }); + } + if (body) + body = `${body}`; + return '\n' + + '\n' + + header + + '\n' + + body + + '
    \n'; + } + tablerow({ text }) { + return `\n${text}\n`; + } + tablecell(token) { + const content = this.parser.parseInline(token.tokens); + const type = token.header ? 'th' : 'td'; + const tag = token.align + ? `<${type} align="${token.align}">` + : `<${type}>`; + return tag + content + `\n`; + } + /** + * span level renderer + */ + strong({ tokens }) { + return `${this.parser.parseInline(tokens)}`; + } + em({ tokens }) { + return `${this.parser.parseInline(tokens)}`; + } + codespan({ text }) { + return `${text}`; + } + br(token) { + return '
    '; + } + del({ tokens }) { + return `${this.parser.parseInline(tokens)}`; + } + link({ href, title, tokens }) { + const text = this.parser.parseInline(tokens); + const cleanHref = cleanUrl(href); + if (cleanHref === null) { + return text; + } + href = cleanHref; + let out = '
    '; + return out; } - - // ignore IDs - return "" + text + "\n"; - }; - _proto.hr = function hr() { - return this.options.xhtml ? '
    \n' : '
    \n'; - }; - _proto.list = function list(body, ordered, start) { - var type = ordered ? 'ol' : 'ul', - startatt = ordered && start !== 1 ? ' start="' + start + '"' : ''; - return '<' + type + startatt + '>\n' + body + '\n'; - } - - /** - * @param {string} text - */; - _proto.listitem = function listitem(text) { - return "
  • " + text + "
  • \n"; - }; - _proto.checkbox = function checkbox(checked) { - return ' '; - } - - /** - * @param {string} text - */; - _proto.paragraph = function paragraph(text) { - return "

    " + text + "

    \n"; - } - - /** - * @param {string} header - * @param {string} body - */; - _proto.table = function table(header, body) { - if (body) body = "" + body + ""; - return '\n' + '\n' + header + '\n' + body + '
    \n'; - } - - /** - * @param {string} content - */; - _proto.tablerow = function tablerow(content) { - return "\n" + content + "\n"; - }; - _proto.tablecell = function tablecell(content, flags) { - var type = flags.header ? 'th' : 'td'; - var tag = flags.align ? "<" + type + " align=\"" + flags.align + "\">" : "<" + type + ">"; - return tag + content + ("\n"); - } - - /** - * span level renderer - * @param {string} text - */; - _proto.strong = function strong(text) { - return "" + text + ""; - } - - /** - * @param {string} text - */; - _proto.em = function em(text) { - return "" + text + ""; - } - - /** - * @param {string} text - */; - _proto.codespan = function codespan(text) { - return "" + text + ""; - }; - _proto.br = function br() { - return this.options.xhtml ? '
    ' : '
    '; - } - - /** - * @param {string} text - */; - _proto.del = function del(text) { - return "" + text + ""; - } - - /** - * @param {string} href - * @param {string} title - * @param {string} text - */; - _proto.link = function link(href, title, text) { - href = cleanUrl(this.options.sanitize, this.options.baseUrl, href); - if (href === null) { - return text; - } - var out = '
    '; - return out; - } - - /** - * @param {string} href - * @param {string} title - * @param {string} text - */; - _proto.image = function image(href, title, text) { - href = cleanUrl(this.options.sanitize, this.options.baseUrl, href); - if (href === null) { - return text; - } - var out = "\""' : '>'; - return out; - }; - _proto.text = function text(_text) { - return _text; - }; - return Renderer; - }(); + image({ href, title, text }) { + const cleanHref = cleanUrl(href); + if (cleanHref === null) { + return text; + } + href = cleanHref; + let out = `${text}/ig, '') - // remove unwanted chars - .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '').replace(/\s/g, '-'); - } - - /** - * Finds the next safe (unique) slug to use - * @param {string} originalSlug - * @param {boolean} isDryRun - */; - _proto.getNextSafeSlug = function getNextSafeSlug(originalSlug, isDryRun) { - var slug = originalSlug; - var occurenceAccumulator = 0; - if (this.seen.hasOwnProperty(slug)) { - occurenceAccumulator = this.seen[originalSlug]; - do { - occurenceAccumulator++; - slug = originalSlug + '-' + occurenceAccumulator; - } while (this.seen.hasOwnProperty(slug)); - } - if (!isDryRun) { - this.seen[originalSlug] = occurenceAccumulator; - this.seen[slug] = 0; - } - return slug; - } - - /** - * Convert string to unique id - * @param {object} [options] - * @param {boolean} [options.dryrun] Generates the next unique slug without - * updating the internal accumulator. - */; - _proto.slug = function slug(value, options) { - if (options === void 0) { - options = {}; - } - var slug = this.serialize(value); - return this.getNextSafeSlug(slug, options.dryrun); - }; - return Slugger; - }(); + class _TextRenderer { + // no need for block level renderers + strong({ text }) { + return text; + } + em({ text }) { + return text; + } + codespan({ text }) { + return text; + } + del({ text }) { + return text; + } + html({ text }) { + return text; + } + text({ text }) { + return text; + } + link({ text }) { + return '' + text; + } + image({ text }) { + return '' + text; + } + br() { + return ''; + } + } /** * Parsing & Compiling */ - var Parser = /*#__PURE__*/function () { - function Parser(options) { - this.options = options || exports.defaults; - this.options.renderer = this.options.renderer || new Renderer(); - this.renderer = this.options.renderer; - this.renderer.options = this.options; - this.textRenderer = new TextRenderer(); - this.slugger = new Slugger(); - } - - /** - * Static Parse Method - */ - Parser.parse = function parse(tokens, options) { - var parser = new Parser(options); - return parser.parse(tokens); - } - - /** - * Static Parse Inline Method - */; - Parser.parseInline = function parseInline(tokens, options) { - var parser = new Parser(options); - return parser.parseInline(tokens); - } - - /** - * Parse Loop - */; - var _proto = Parser.prototype; - _proto.parse = function parse(tokens, top) { - if (top === void 0) { - top = true; - } - var out = '', - i, - j, - k, - l2, - l3, - row, - cell, - header, - body, - token, - ordered, - start, - loose, - itemBody, - item, - checked, - task, - checkbox, - ret; - var l = tokens.length; - for (i = 0; i < l; i++) { - token = tokens[i]; - - // Run any renderer extensions - if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) { - ret = this.options.extensions.renderers[token.type].call({ - parser: this - }, token); - if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(token.type)) { - out += ret || ''; - continue; - } - } - switch (token.type) { - case 'space': - { - continue; - } - case 'hr': - { - out += this.renderer.hr(); - continue; - } - case 'heading': - { - out += this.renderer.heading(this.parseInline(token.tokens), token.depth, unescape(this.parseInline(token.tokens, this.textRenderer)), this.slugger); - continue; - } - case 'code': - { - out += this.renderer.code(token.text, token.lang, token.escaped); - continue; - } - case 'table': - { - header = ''; - - // header - cell = ''; - l2 = token.header.length; - for (j = 0; j < l2; j++) { - cell += this.renderer.tablecell(this.parseInline(token.header[j].tokens), { - header: true, - align: token.align[j] - }); - } - header += this.renderer.tablerow(cell); - body = ''; - l2 = token.rows.length; - for (j = 0; j < l2; j++) { - row = token.rows[j]; - cell = ''; - l3 = row.length; - for (k = 0; k < l3; k++) { - cell += this.renderer.tablecell(this.parseInline(row[k].tokens), { - header: false, - align: token.align[k] - }); - } - body += this.renderer.tablerow(cell); - } - out += this.renderer.table(header, body); - continue; - } - case 'blockquote': - { - body = this.parse(token.tokens); - out += this.renderer.blockquote(body); - continue; - } - case 'list': - { - ordered = token.ordered; - start = token.start; - loose = token.loose; - l2 = token.items.length; - body = ''; - for (j = 0; j < l2; j++) { - item = token.items[j]; - checked = item.checked; - task = item.task; - itemBody = ''; - if (item.task) { - checkbox = this.renderer.checkbox(checked); - if (loose) { - if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') { - item.tokens[0].text = checkbox + ' ' + item.tokens[0].text; - if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') { - item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text; + class _Parser { + options; + renderer; + textRenderer; + constructor(options) { + this.options = options || exports.defaults; + this.options.renderer = this.options.renderer || new _Renderer(); + this.renderer = this.options.renderer; + this.renderer.options = this.options; + this.renderer.parser = this; + this.textRenderer = new _TextRenderer(); + } + /** + * Static Parse Method + */ + static parse(tokens, options) { + const parser = new _Parser(options); + return parser.parse(tokens); + } + /** + * Static Parse Inline Method + */ + static parseInline(tokens, options) { + const parser = new _Parser(options); + return parser.parseInline(tokens); + } + /** + * Parse Loop + */ + parse(tokens, top = true) { + let out = ''; + for (let i = 0; i < tokens.length; i++) { + const anyToken = tokens[i]; + // Run any renderer extensions + if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[anyToken.type]) { + const genericToken = anyToken; + const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken); + if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(genericToken.type)) { + out += ret || ''; + continue; + } + } + const token = anyToken; + switch (token.type) { + case 'space': { + out += this.renderer.space(token); + continue; + } + case 'hr': { + out += this.renderer.hr(token); + continue; + } + case 'heading': { + out += this.renderer.heading(token); + continue; + } + case 'code': { + out += this.renderer.code(token); + continue; + } + case 'table': { + out += this.renderer.table(token); + continue; + } + case 'blockquote': { + out += this.renderer.blockquote(token); + continue; + } + case 'list': { + out += this.renderer.list(token); + continue; + } + case 'html': { + out += this.renderer.html(token); + continue; + } + case 'paragraph': { + out += this.renderer.paragraph(token); + continue; + } + case 'text': { + let textToken = token; + let body = this.renderer.text(textToken); + while (i + 1 < tokens.length && tokens[i + 1].type === 'text') { + textToken = tokens[++i]; + body += '\n' + this.renderer.text(textToken); } - } else { - item.tokens.unshift({ - type: 'text', - text: checkbox - }); - } - } else { - itemBody += checkbox; - } - } - itemBody += this.parse(item.tokens, loose); - body += this.renderer.listitem(itemBody, task, checked); - } - out += this.renderer.list(body, ordered, start); - continue; - } - case 'html': - { - out += this.renderer.html(token.text, token.block); - continue; - } - case 'paragraph': - { - out += this.renderer.paragraph(this.parseInline(token.tokens)); - continue; - } - case 'text': - { - body = token.tokens ? this.parseInline(token.tokens) : token.text; - while (i + 1 < l && tokens[i + 1].type === 'text') { - token = tokens[++i]; - body += '\n' + (token.tokens ? this.parseInline(token.tokens) : token.text); - } - out += top ? this.renderer.paragraph(body) : body; - continue; - } - default: - { - var errMsg = 'Token with "' + token.type + '" type was not found.'; - if (this.options.silent) { - console.error(errMsg); - return; - } else { - throw new Error(errMsg); - } - } - } - } - return out; - } - - /** - * Parse Inline Tokens - */; - _proto.parseInline = function parseInline(tokens, renderer) { - renderer = renderer || this.renderer; - var out = '', - i, - token, - ret; - var l = tokens.length; - for (i = 0; i < l; i++) { - token = tokens[i]; - - // Run any renderer extensions - if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) { - ret = this.options.extensions.renderers[token.type].call({ - parser: this - }, token); - if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) { - out += ret || ''; - continue; - } - } - switch (token.type) { - case 'escape': - { - out += renderer.text(token.text); - break; - } - case 'html': - { - out += renderer.html(token.text); - break; - } - case 'link': - { - out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer)); - break; - } - case 'image': - { - out += renderer.image(token.href, token.title, token.text); - break; - } - case 'strong': - { - out += renderer.strong(this.parseInline(token.tokens, renderer)); - break; - } - case 'em': - { - out += renderer.em(this.parseInline(token.tokens, renderer)); - break; - } - case 'codespan': - { - out += renderer.codespan(token.text); - break; - } - case 'br': - { - out += renderer.br(); - break; - } - case 'del': - { - out += renderer.del(this.parseInline(token.tokens, renderer)); - break; - } - case 'text': - { - out += renderer.text(token.text); - break; - } - default: - { - var errMsg = 'Token with "' + token.type + '" type was not found.'; - if (this.options.silent) { - console.error(errMsg); - return; - } else { - throw new Error(errMsg); - } - } - } - } - return out; - }; - return Parser; - }(); - - var Hooks = /*#__PURE__*/function () { - function Hooks(options) { - this.options = options || exports.defaults; - } - var _proto = Hooks.prototype; - /** - * Process markdown before marked - */ - _proto.preprocess = function preprocess(markdown) { - return markdown; - } - - /** - * Process HTML after marked is finished - */; - _proto.postprocess = function postprocess(html) { - return html; - }; - return Hooks; - }(); - Hooks.passThroughHooks = new Set(['preprocess', 'postprocess']); + if (top) { + out += this.renderer.paragraph({ + type: 'paragraph', + raw: body, + text: body, + tokens: [{ type: 'text', raw: body, text: body }], + }); + } + else { + out += body; + } + continue; + } + default: { + const errMsg = 'Token with "' + token.type + '" type was not found.'; + if (this.options.silent) { + console.error(errMsg); + return ''; + } + else { + throw new Error(errMsg); + } + } + } + } + return out; + } + /** + * Parse Inline Tokens + */ + parseInline(tokens, renderer) { + renderer = renderer || this.renderer; + let out = ''; + for (let i = 0; i < tokens.length; i++) { + const anyToken = tokens[i]; + // Run any renderer extensions + if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[anyToken.type]) { + const ret = this.options.extensions.renderers[anyToken.type].call({ parser: this }, anyToken); + if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(anyToken.type)) { + out += ret || ''; + continue; + } + } + const token = anyToken; + switch (token.type) { + case 'escape': { + out += renderer.text(token); + break; + } + case 'html': { + out += renderer.html(token); + break; + } + case 'link': { + out += renderer.link(token); + break; + } + case 'image': { + out += renderer.image(token); + break; + } + case 'strong': { + out += renderer.strong(token); + break; + } + case 'em': { + out += renderer.em(token); + break; + } + case 'codespan': { + out += renderer.codespan(token); + break; + } + case 'br': { + out += renderer.br(token); + break; + } + case 'del': { + out += renderer.del(token); + break; + } + case 'text': { + out += renderer.text(token); + break; + } + default: { + const errMsg = 'Token with "' + token.type + '" type was not found.'; + if (this.options.silent) { + console.error(errMsg); + return ''; + } + else { + throw new Error(errMsg); + } + } + } + } + return out; + } + } - function onError(silent, async, callback) { - return function (e) { - e.message += '\nPlease report this to https://github.com/markedjs/marked.'; - if (silent) { - var msg = '

    An error occurred:

    ' + escape(e.message + '', true) + '
    '; - if (async) { - return Promise.resolve(msg); - } - if (callback) { - callback(null, msg); - return; - } - return msg; - } - if (async) { - return Promise.reject(e); - } - if (callback) { - callback(e); - return; - } - throw e; - }; + class _Hooks { + options; + constructor(options) { + this.options = options || exports.defaults; + } + static passThroughHooks = new Set([ + 'preprocess', + 'postprocess', + 'processAllTokens', + ]); + /** + * Process markdown before marked + */ + preprocess(markdown) { + return markdown; + } + /** + * Process HTML after marked is finished + */ + postprocess(html) { + return html; + } + /** + * Process all tokens before walk tokens + */ + processAllTokens(tokens) { + return tokens; + } } - function parseMarkdown(lexer, parser) { - return function (src, opt, callback) { - if (typeof opt === 'function') { - callback = opt; - opt = null; - } - var origOpt = _extends({}, opt); - opt = _extends({}, marked.defaults, origOpt); - var throwError = onError(opt.silent, opt.async, callback); - // throw error in case of non string input - if (typeof src === 'undefined' || src === null) { - return throwError(new Error('marked(): input parameter is undefined or null')); - } - if (typeof src !== 'string') { - return throwError(new Error('marked(): input parameter is of type ' + Object.prototype.toString.call(src) + ', string expected')); - } - checkDeprecations(opt, callback); - if (opt.hooks) { - opt.hooks.options = opt; - } - if (callback) { - var highlight = opt.highlight; - var tokens; - try { - if (opt.hooks) { - src = opt.hooks.preprocess(src); - } - tokens = lexer(src, opt); - } catch (e) { - return throwError(e); - } - var done = function done(err) { - var out; - if (!err) { - try { - if (opt.walkTokens) { - marked.walkTokens(tokens, opt.walkTokens); - } - out = parser(tokens, opt); + class Marked { + defaults = _getDefaults(); + options = this.setOptions; + parse = this.#parseMarkdown(_Lexer.lex, _Parser.parse); + parseInline = this.#parseMarkdown(_Lexer.lexInline, _Parser.parseInline); + Parser = _Parser; + Renderer = _Renderer; + TextRenderer = _TextRenderer; + Lexer = _Lexer; + Tokenizer = _Tokenizer; + Hooks = _Hooks; + constructor(...args) { + this.use(...args); + } + /** + * Run callback for every token + */ + walkTokens(tokens, callback) { + let values = []; + for (const token of tokens) { + values = values.concat(callback.call(this, token)); + switch (token.type) { + case 'table': { + const tableToken = token; + for (const cell of tableToken.header) { + values = values.concat(this.walkTokens(cell.tokens, callback)); + } + for (const row of tableToken.rows) { + for (const cell of row) { + values = values.concat(this.walkTokens(cell.tokens, callback)); + } + } + break; + } + case 'list': { + const listToken = token; + values = values.concat(this.walkTokens(listToken.items, callback)); + break; + } + default: { + const genericToken = token; + if (this.defaults.extensions?.childTokens?.[genericToken.type]) { + this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => { + const tokens = genericToken[childTokens].flat(Infinity); + values = values.concat(this.walkTokens(tokens, callback)); + }); + } + else if (genericToken.tokens) { + values = values.concat(this.walkTokens(genericToken.tokens, callback)); + } + } + } + } + return values; + } + use(...args) { + const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} }; + args.forEach((pack) => { + // copy options to new object + const opts = { ...pack }; + // set async to true if it was set to true before + opts.async = this.defaults.async || opts.async || false; + // ==-- Parse "addon" extensions --== // + if (pack.extensions) { + pack.extensions.forEach((ext) => { + if (!ext.name) { + throw new Error('extension name required'); + } + if ('renderer' in ext) { // Renderer extensions + const prevRenderer = extensions.renderers[ext.name]; + if (prevRenderer) { + // Replace extension with func to run new extension but fall back if false + extensions.renderers[ext.name] = function (...args) { + let ret = ext.renderer.apply(this, args); + if (ret === false) { + ret = prevRenderer.apply(this, args); + } + return ret; + }; + } + else { + extensions.renderers[ext.name] = ext.renderer; + } + } + if ('tokenizer' in ext) { // Tokenizer Extensions + if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) { + throw new Error("extension level must be 'block' or 'inline'"); + } + const extLevel = extensions[ext.level]; + if (extLevel) { + extLevel.unshift(ext.tokenizer); + } + else { + extensions[ext.level] = [ext.tokenizer]; + } + if (ext.start) { // Function to check for start of token + if (ext.level === 'block') { + if (extensions.startBlock) { + extensions.startBlock.push(ext.start); + } + else { + extensions.startBlock = [ext.start]; + } + } + else if (ext.level === 'inline') { + if (extensions.startInline) { + extensions.startInline.push(ext.start); + } + else { + extensions.startInline = [ext.start]; + } + } + } + } + if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens + extensions.childTokens[ext.name] = ext.childTokens; + } + }); + opts.extensions = extensions; + } + // ==-- Parse "overwrite" extensions --== // + if (pack.renderer) { + const renderer = this.defaults.renderer || new _Renderer(this.defaults); + for (const prop in pack.renderer) { + if (!(prop in renderer)) { + throw new Error(`renderer '${prop}' does not exist`); + } + if (['options', 'parser'].includes(prop)) { + // ignore options property + continue; + } + const rendererProp = prop; + let rendererFunc = pack.renderer[rendererProp]; + if (!pack.useNewRenderer) { + // TODO: Remove this in next major version + rendererFunc = this.#convertRendererFunction(rendererFunc, rendererProp, renderer); + } + const prevRenderer = renderer[rendererProp]; + // Replace renderer with func to run extension, but fall back if false + renderer[rendererProp] = (...args) => { + let ret = rendererFunc.apply(renderer, args); + if (ret === false) { + ret = prevRenderer.apply(renderer, args); + } + return ret || ''; + }; + } + opts.renderer = renderer; + } + if (pack.tokenizer) { + const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults); + for (const prop in pack.tokenizer) { + if (!(prop in tokenizer)) { + throw new Error(`tokenizer '${prop}' does not exist`); + } + if (['options', 'rules', 'lexer'].includes(prop)) { + // ignore options, rules, and lexer properties + continue; + } + const tokenizerProp = prop; + const tokenizerFunc = pack.tokenizer[tokenizerProp]; + const prevTokenizer = tokenizer[tokenizerProp]; + // Replace tokenizer with func to run extension, but fall back if false + // @ts-expect-error cannot type tokenizer function dynamically + tokenizer[tokenizerProp] = (...args) => { + let ret = tokenizerFunc.apply(tokenizer, args); + if (ret === false) { + ret = prevTokenizer.apply(tokenizer, args); + } + return ret; + }; + } + opts.tokenizer = tokenizer; + } + // ==-- Parse Hooks extensions --== // + if (pack.hooks) { + const hooks = this.defaults.hooks || new _Hooks(); + for (const prop in pack.hooks) { + if (!(prop in hooks)) { + throw new Error(`hook '${prop}' does not exist`); + } + if (prop === 'options') { + // ignore options property + continue; + } + const hooksProp = prop; + const hooksFunc = pack.hooks[hooksProp]; + const prevHook = hooks[hooksProp]; + if (_Hooks.passThroughHooks.has(prop)) { + // @ts-expect-error cannot type hook function dynamically + hooks[hooksProp] = (arg) => { + if (this.defaults.async) { + return Promise.resolve(hooksFunc.call(hooks, arg)).then(ret => { + return prevHook.call(hooks, ret); + }); + } + const ret = hooksFunc.call(hooks, arg); + return prevHook.call(hooks, ret); + }; + } + else { + // @ts-expect-error cannot type hook function dynamically + hooks[hooksProp] = (...args) => { + let ret = hooksFunc.apply(hooks, args); + if (ret === false) { + ret = prevHook.apply(hooks, args); + } + return ret; + }; + } + } + opts.hooks = hooks; + } + // ==-- Parse WalkTokens extensions --== // + if (pack.walkTokens) { + const walkTokens = this.defaults.walkTokens; + const packWalktokens = pack.walkTokens; + opts.walkTokens = function (token) { + let values = []; + values.push(packWalktokens.call(this, token)); + if (walkTokens) { + values = values.concat(walkTokens.call(this, token)); + } + return values; + }; + } + this.defaults = { ...this.defaults, ...opts }; + }); + return this; + } + // TODO: Remove this in next major release + #convertRendererFunction(func, prop, renderer) { + switch (prop) { + case 'heading': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + return func.call(this, renderer.parser.parseInline(token.tokens), token.depth, unescape(renderer.parser.parseInline(token.tokens, renderer.parser.textRenderer))); + }; + case 'code': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + return func.call(this, token.text, token.lang, !!token.escaped); + }; + case 'table': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + let header = ''; + // header + let cell = ''; + for (let j = 0; j < token.header.length; j++) { + cell += this.tablecell({ + text: token.header[j].text, + tokens: token.header[j].tokens, + header: true, + align: token.align[j], + }); + } + header += this.tablerow({ text: cell }); + let body = ''; + for (let j = 0; j < token.rows.length; j++) { + const row = token.rows[j]; + cell = ''; + for (let k = 0; k < row.length; k++) { + cell += this.tablecell({ + text: row[k].text, + tokens: row[k].tokens, + header: false, + align: token.align[k], + }); + } + body += this.tablerow({ text: cell }); + } + return func.call(this, header, body); + }; + case 'blockquote': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + const body = this.parser.parse(token.tokens); + return func.call(this, body); + }; + case 'list': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + const ordered = token.ordered; + const start = token.start; + const loose = token.loose; + let body = ''; + for (let j = 0; j < token.items.length; j++) { + const item = token.items[j]; + const checked = item.checked; + const task = item.task; + let itemBody = ''; + if (item.task) { + const checkbox = this.checkbox({ checked: !!checked }); + if (loose) { + if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') { + item.tokens[0].text = checkbox + ' ' + item.tokens[0].text; + if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') { + item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text; + } + } + else { + item.tokens.unshift({ + type: 'text', + text: checkbox + ' ', + }); + } + } + else { + itemBody += checkbox + ' '; + } + } + itemBody += this.parser.parse(item.tokens, loose); + body += this.listitem({ + type: 'list_item', + raw: itemBody, + text: itemBody, + task, + checked: !!checked, + loose, + tokens: item.tokens, + }); + } + return func.call(this, body, ordered, start); + }; + case 'html': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + return func.call(this, token.text, token.block); + }; + case 'paragraph': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + return func.call(this, this.parser.parseInline(token.tokens)); + }; + case 'escape': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + return func.call(this, token.text); + }; + case 'link': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + return func.call(this, token.href, token.title, this.parser.parseInline(token.tokens)); + }; + case 'image': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + return func.call(this, token.href, token.title, token.text); + }; + case 'strong': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + return func.call(this, this.parser.parseInline(token.tokens)); + }; + case 'em': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + return func.call(this, this.parser.parseInline(token.tokens)); + }; + case 'codespan': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + return func.call(this, token.text); + }; + case 'del': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + return func.call(this, this.parser.parseInline(token.tokens)); + }; + case 'text': + return function (token) { + if (!token.type || token.type !== prop) { + // @ts-ignore + // eslint-disable-next-line prefer-rest-params + return func.apply(this, arguments); + } + return func.call(this, token.text); + }; + // do nothing + } + return func; + } + setOptions(opt) { + this.defaults = { ...this.defaults, ...opt }; + return this; + } + lexer(src, options) { + return _Lexer.lex(src, options ?? this.defaults); + } + parser(tokens, options) { + return _Parser.parse(tokens, options ?? this.defaults); + } + #parseMarkdown(lexer, parser) { + return (src, options) => { + const origOpt = { ...options }; + const opt = { ...this.defaults, ...origOpt }; + // Show warning if an extension set async to true but the parse was called with async: false + if (this.defaults.async === true && origOpt.async === false) { + if (!opt.silent) { + console.warn('marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored.'); + } + opt.async = true; + } + const throwError = this.#onError(!!opt.silent, !!opt.async); + // throw error in case of non string input + if (typeof src === 'undefined' || src === null) { + return throwError(new Error('marked(): input parameter is undefined or null')); + } + if (typeof src !== 'string') { + return throwError(new Error('marked(): input parameter is of type ' + + Object.prototype.toString.call(src) + ', string expected')); + } if (opt.hooks) { - out = opt.hooks.postprocess(out); - } - } catch (e) { - err = e; - } - } - opt.highlight = highlight; - return err ? throwError(err) : callback(null, out); - }; - if (!highlight || highlight.length < 3) { - return done(); - } - delete opt.highlight; - if (!tokens.length) return done(); - var pending = 0; - marked.walkTokens(tokens, function (token) { - if (token.type === 'code') { - pending++; - setTimeout(function () { - highlight(token.text, token.lang, function (err, code) { - if (err) { - return done(err); - } - if (code != null && code !== token.text) { - token.text = code; - token.escaped = true; - } - pending--; - if (pending === 0) { - done(); - } - }); - }, 0); - } - }); - if (pending === 0) { - done(); - } - return; - } - if (opt.async) { - return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src).then(function (src) { - return lexer(src, opt); - }).then(function (tokens) { - return opt.walkTokens ? Promise.all(marked.walkTokens(tokens, opt.walkTokens)).then(function () { - return tokens; - }) : tokens; - }).then(function (tokens) { - return parser(tokens, opt); - }).then(function (html) { - return opt.hooks ? opt.hooks.postprocess(html) : html; - })["catch"](throwError); + opt.hooks.options = opt; + } + if (opt.async) { + return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src) + .then(src => lexer(src, opt)) + .then(tokens => opt.hooks ? opt.hooks.processAllTokens(tokens) : tokens) + .then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens) + .then(tokens => parser(tokens, opt)) + .then(html => opt.hooks ? opt.hooks.postprocess(html) : html) + .catch(throwError); + } + try { + if (opt.hooks) { + src = opt.hooks.preprocess(src); + } + let tokens = lexer(src, opt); + if (opt.hooks) { + tokens = opt.hooks.processAllTokens(tokens); + } + if (opt.walkTokens) { + this.walkTokens(tokens, opt.walkTokens); + } + let html = parser(tokens, opt); + if (opt.hooks) { + html = opt.hooks.postprocess(html); + } + return html; + } + catch (e) { + return throwError(e); + } + }; + } + #onError(silent, async) { + return (e) => { + e.message += '\nPlease report this to https://github.com/markedjs/marked.'; + if (silent) { + const msg = '

    An error occurred:

    '
    +                      + escape$1(e.message + '', true)
    +                      + '
    '; + if (async) { + return Promise.resolve(msg); + } + return msg; + } + if (async) { + return Promise.reject(e); + } + throw e; + }; } - try { - if (opt.hooks) { - src = opt.hooks.preprocess(src); - } - var _tokens = lexer(src, opt); - if (opt.walkTokens) { - marked.walkTokens(_tokens, opt.walkTokens); - } - var html = parser(_tokens, opt); - if (opt.hooks) { - html = opt.hooks.postprocess(html); - } - return html; - } catch (e) { - return throwError(e); - } - }; } + const markedInstance = new Marked(); + function marked(src, opt) { + return markedInstance.parse(src, opt); + } /** - * Marked + * Sets the default options. + * + * @param options Hash of options */ - function marked(src, opt, callback) { - return parseMarkdown(Lexer.lex, Parser.parse)(src, opt, callback); - } - + marked.options = + marked.setOptions = function (options) { + markedInstance.setOptions(options); + marked.defaults = markedInstance.defaults; + changeDefaults(marked.defaults); + return marked; + }; /** - * Options + * Gets the original marked default options. */ - - marked.options = marked.setOptions = function (opt) { - marked.defaults = _extends({}, marked.defaults, opt); - changeDefaults(marked.defaults); - return marked; - }; - marked.getDefaults = getDefaults; + marked.getDefaults = _getDefaults; marked.defaults = exports.defaults; - /** * Use Extension */ - - marked.use = function () { - var extensions = marked.defaults.extensions || { - renderers: {}, - childTokens: {} - }; - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - args.forEach(function (pack) { - // copy options to new object - var opts = _extends({}, pack); - - // set async to true if it was set to true before - opts.async = marked.defaults.async || opts.async || false; - - // ==-- Parse "addon" extensions --== // - if (pack.extensions) { - pack.extensions.forEach(function (ext) { - if (!ext.name) { - throw new Error('extension name required'); - } - if (ext.renderer) { - // Renderer extensions - var prevRenderer = extensions.renderers[ext.name]; - if (prevRenderer) { - // Replace extension with func to run new extension but fall back if false - extensions.renderers[ext.name] = function () { - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - var ret = ext.renderer.apply(this, args); - if (ret === false) { - ret = prevRenderer.apply(this, args); - } - return ret; - }; - } else { - extensions.renderers[ext.name] = ext.renderer; - } - } - if (ext.tokenizer) { - // Tokenizer Extensions - if (!ext.level || ext.level !== 'block' && ext.level !== 'inline') { - throw new Error("extension level must be 'block' or 'inline'"); - } - if (extensions[ext.level]) { - extensions[ext.level].unshift(ext.tokenizer); - } else { - extensions[ext.level] = [ext.tokenizer]; - } - if (ext.start) { - // Function to check for start of token - if (ext.level === 'block') { - if (extensions.startBlock) { - extensions.startBlock.push(ext.start); - } else { - extensions.startBlock = [ext.start]; - } - } else if (ext.level === 'inline') { - if (extensions.startInline) { - extensions.startInline.push(ext.start); - } else { - extensions.startInline = [ext.start]; - } - } - } - } - if (ext.childTokens) { - // Child tokens to be visited by walkTokens - extensions.childTokens[ext.name] = ext.childTokens; - } - }); - opts.extensions = extensions; - } - - // ==-- Parse "overwrite" extensions --== // - if (pack.renderer) { - var renderer = marked.defaults.renderer || new Renderer(); - var _loop = function _loop(prop) { - var prevRenderer = renderer[prop]; - // Replace renderer with func to run extension, but fall back if false - renderer[prop] = function () { - for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - args[_key3] = arguments[_key3]; - } - var ret = pack.renderer[prop].apply(renderer, args); - if (ret === false) { - ret = prevRenderer.apply(renderer, args); - } - return ret; - }; - }; - for (var prop in pack.renderer) { - _loop(prop); - } - opts.renderer = renderer; - } - if (pack.tokenizer) { - var tokenizer = marked.defaults.tokenizer || new Tokenizer(); - var _loop2 = function _loop2(_prop) { - var prevTokenizer = tokenizer[_prop]; - // Replace tokenizer with func to run extension, but fall back if false - tokenizer[_prop] = function () { - for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { - args[_key4] = arguments[_key4]; - } - var ret = pack.tokenizer[_prop].apply(tokenizer, args); - if (ret === false) { - ret = prevTokenizer.apply(tokenizer, args); - } - return ret; - }; - }; - for (var _prop in pack.tokenizer) { - _loop2(_prop); - } - opts.tokenizer = tokenizer; - } - - // ==-- Parse Hooks extensions --== // - if (pack.hooks) { - var hooks = marked.defaults.hooks || new Hooks(); - var _loop3 = function _loop3(_prop2) { - var prevHook = hooks[_prop2]; - if (Hooks.passThroughHooks.has(_prop2)) { - hooks[_prop2] = function (arg) { - if (marked.defaults.async) { - return Promise.resolve(pack.hooks[_prop2].call(hooks, arg)).then(function (ret) { - return prevHook.call(hooks, ret); - }); - } - var ret = pack.hooks[_prop2].call(hooks, arg); - return prevHook.call(hooks, ret); - }; - } else { - hooks[_prop2] = function () { - for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { - args[_key5] = arguments[_key5]; - } - var ret = pack.hooks[_prop2].apply(hooks, args); - if (ret === false) { - ret = prevHook.apply(hooks, args); - } - return ret; - }; - } - }; - for (var _prop2 in pack.hooks) { - _loop3(_prop2); - } - opts.hooks = hooks; - } - - // ==-- Parse WalkTokens extensions --== // - if (pack.walkTokens) { - var _walkTokens = marked.defaults.walkTokens; - opts.walkTokens = function (token) { - var values = []; - values.push(pack.walkTokens.call(this, token)); - if (_walkTokens) { - values = values.concat(_walkTokens.call(this, token)); - } - return values; - }; - } - marked.setOptions(opts); - }); + marked.use = function (...args) { + markedInstance.use(...args); + marked.defaults = markedInstance.defaults; + changeDefaults(marked.defaults); + return marked; }; - /** * Run callback for every token */ - marked.walkTokens = function (tokens, callback) { - var values = []; - var _loop4 = function _loop4() { - var token = _step.value; - values = values.concat(callback.call(marked, token)); - switch (token.type) { - case 'table': - { - for (var _iterator2 = _createForOfIteratorHelperLoose(token.header), _step2; !(_step2 = _iterator2()).done;) { - var cell = _step2.value; - values = values.concat(marked.walkTokens(cell.tokens, callback)); - } - for (var _iterator3 = _createForOfIteratorHelperLoose(token.rows), _step3; !(_step3 = _iterator3()).done;) { - var row = _step3.value; - for (var _iterator4 = _createForOfIteratorHelperLoose(row), _step4; !(_step4 = _iterator4()).done;) { - var _cell = _step4.value; - values = values.concat(marked.walkTokens(_cell.tokens, callback)); - } - } - break; - } - case 'list': - { - values = values.concat(marked.walkTokens(token.items, callback)); - break; - } - default: - { - if (marked.defaults.extensions && marked.defaults.extensions.childTokens && marked.defaults.extensions.childTokens[token.type]) { - // Walk any extensions - marked.defaults.extensions.childTokens[token.type].forEach(function (childTokens) { - values = values.concat(marked.walkTokens(token[childTokens], callback)); - }); - } else if (token.tokens) { - values = values.concat(marked.walkTokens(token.tokens, callback)); - } - } - } - }; - for (var _iterator = _createForOfIteratorHelperLoose(tokens), _step; !(_step = _iterator()).done;) { - _loop4(); - } - return values; + return markedInstance.walkTokens(tokens, callback); }; - /** - * Parse Inline - * @param {string} src + * Compiles markdown to HTML without enclosing `p` tag. + * + * @param src String of markdown source to be compiled + * @param options Hash of options + * @return String of compiled HTML */ - marked.parseInline = parseMarkdown(Lexer.lexInline, Parser.parseInline); - + marked.parseInline = markedInstance.parseInline; /** * Expose */ - marked.Parser = Parser; - marked.parser = Parser.parse; - marked.Renderer = Renderer; - marked.TextRenderer = TextRenderer; - marked.Lexer = Lexer; - marked.lexer = Lexer.lex; - marked.Tokenizer = Tokenizer; - marked.Slugger = Slugger; - marked.Hooks = Hooks; + marked.Parser = _Parser; + marked.parser = _Parser.parse; + marked.Renderer = _Renderer; + marked.TextRenderer = _TextRenderer; + marked.Lexer = _Lexer; + marked.lexer = _Lexer.lex; + marked.Tokenizer = _Tokenizer; + marked.Hooks = _Hooks; marked.parse = marked; - var options = marked.options; - var setOptions = marked.setOptions; - var use = marked.use; - var walkTokens = marked.walkTokens; - var parseInline = marked.parseInline; - var parse = marked; - var parser = Parser.parse; - var lexer = Lexer.lex; - - exports.Hooks = Hooks; - exports.Lexer = Lexer; - exports.Parser = Parser; - exports.Renderer = Renderer; - exports.Slugger = Slugger; - exports.TextRenderer = TextRenderer; - exports.Tokenizer = Tokenizer; - exports.getDefaults = getDefaults; + const options = marked.options; + const setOptions = marked.setOptions; + const use = marked.use; + const walkTokens = marked.walkTokens; + const parseInline = marked.parseInline; + const parse = marked; + const parser = _Parser.parse; + const lexer = _Lexer.lex; + + exports.Hooks = _Hooks; + exports.Lexer = _Lexer; + exports.Marked = Marked; + exports.Parser = _Parser; + exports.Renderer = _Renderer; + exports.TextRenderer = _TextRenderer; + exports.Tokenizer = _Tokenizer; + exports.getDefaults = _getDefaults; exports.lexer = lexer; exports.marked = marked; exports.options = options; From a69105bbccb7c17e6ff1e394f0743c304ce9d23c Mon Sep 17 00:00:00 2001 From: RensDofferhoff <20978635+RensDofferhoff@users.noreply.github.com> Date: Tue, 27 Aug 2024 21:59:13 +0200 Subject: [PATCH 15/70] Fix OpenMX compilation --- Modules/install-module.R.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/install-module.R.in b/Modules/install-module.R.in index 2d1217e601..bbbb0ca730 100644 --- a/Modules/install-module.R.in +++ b/Modules/install-module.R.in @@ -31,7 +31,8 @@ options("JASP_RENV_INSTALL_OPTIONS" = list( rstanarm = list(before = setMakeFlagsToOne, after = defaultMakeFlags), stanova = list(before = setMakeFlagsToOne, after = defaultMakeFlags), rpf = list(before = setMakeFlagsToOne, after = defaultMakeFlags), - cubature = list(before = setMakeFlagsToOne, after = defaultMakeFlags) + cubature = list(before = setMakeFlagsToOne, after = defaultMakeFlags), + OpenMx = list(before = setMakeFlagsToOne, after = defaultMakeFlags) )) options(renv.config.install.verbose = TRUE) configureVars = NULL From f0ef5d49e17181bcdf6029e295d4bbfc20f68305 Mon Sep 17 00:00:00 2001 From: RensDofferhoff <20978635+RensDofferhoff@users.noreply.github.com> Date: Tue, 27 Aug 2024 22:23:28 +0200 Subject: [PATCH 16/70] submodules (#5643) --- Engine/jaspModuleInstaller | 2 +- Modules/jaspAcceptanceSampling | 2 +- Modules/jaspAnova | 2 +- Modules/jaspAudit | 2 +- Modules/jaspBain | 2 +- Modules/jaspBsts | 2 +- Modules/jaspCircular | 2 +- Modules/jaspCochrane | 2 +- Modules/jaspDescriptives | 2 +- Modules/jaspDistributions | 2 +- Modules/jaspEquivalenceTTests | 2 +- Modules/jaspFactor | 2 +- Modules/jaspFrequencies | 2 +- Modules/jaspJags | 2 +- Modules/jaspLearnBayes | 2 +- Modules/jaspLearnStats | 2 +- Modules/jaspMachineLearning | 2 +- Modules/jaspMetaAnalysis | 2 +- Modules/jaspMixedModels | 2 +- Modules/jaspNetwork | 2 +- Modules/jaspPower | 2 +- Modules/jaspPredictiveAnalytics | 2 +- Modules/jaspProcess | 2 +- Modules/jaspProphet | 2 +- Modules/jaspQualityControl | 2 +- Modules/jaspRegression | 2 +- Modules/jaspReliability | 2 +- Modules/jaspRobustTTests | 2 +- Modules/jaspSem | 2 +- Modules/jaspSummaryStatistics | 2 +- Modules/jaspSurvival | 2 +- Modules/jaspTTests | 2 +- Modules/jaspTimeSeries | 2 +- Modules/jaspVisualModeling | 2 +- 34 files changed, 34 insertions(+), 34 deletions(-) diff --git a/Engine/jaspModuleInstaller b/Engine/jaspModuleInstaller index 6758cb9283..8d0666d706 160000 --- a/Engine/jaspModuleInstaller +++ b/Engine/jaspModuleInstaller @@ -1 +1 @@ -Subproject commit 6758cb9283bdcfa3c9d39607242135e765f01646 +Subproject commit 8d0666d70641bd3515eb05cd231ac3647b894fc9 diff --git a/Modules/jaspAcceptanceSampling b/Modules/jaspAcceptanceSampling index 2a7aeebc05..75e1b64792 160000 --- a/Modules/jaspAcceptanceSampling +++ b/Modules/jaspAcceptanceSampling @@ -1 +1 @@ -Subproject commit 2a7aeebc059b1dafa52db17e5bbeb3488eaf3b10 +Subproject commit 75e1b64792ef07e8382b8517b53c1d1bc5a75996 diff --git a/Modules/jaspAnova b/Modules/jaspAnova index 04de0932b7..b989e0e00c 160000 --- a/Modules/jaspAnova +++ b/Modules/jaspAnova @@ -1 +1 @@ -Subproject commit 04de0932b7b1ec323e247bace6c24cb211d6f895 +Subproject commit b989e0e00c87731d6332604e82477a6e4fe2704d diff --git a/Modules/jaspAudit b/Modules/jaspAudit index 61a849e032..71e1f74634 160000 --- a/Modules/jaspAudit +++ b/Modules/jaspAudit @@ -1 +1 @@ -Subproject commit 61a849e0329c9ed032650ac61650fc6f540562bd +Subproject commit 71e1f7463488e2195ea54662499a44944baf2353 diff --git a/Modules/jaspBain b/Modules/jaspBain index 50398cf89b..a505d5616f 160000 --- a/Modules/jaspBain +++ b/Modules/jaspBain @@ -1 +1 @@ -Subproject commit 50398cf89bb5d38b3f014f74f5deaa365ee58200 +Subproject commit a505d5616f6120cc815dde57274a10eb2c2d99b5 diff --git a/Modules/jaspBsts b/Modules/jaspBsts index 8b3e171456..262ab27ae3 160000 --- a/Modules/jaspBsts +++ b/Modules/jaspBsts @@ -1 +1 @@ -Subproject commit 8b3e171456e3851ba2a89fc72d1aa114ee145994 +Subproject commit 262ab27ae3ee822f7ddd547cdb1107ba6c440b10 diff --git a/Modules/jaspCircular b/Modules/jaspCircular index 5a6ad148ed..6c314542ca 160000 --- a/Modules/jaspCircular +++ b/Modules/jaspCircular @@ -1 +1 @@ -Subproject commit 5a6ad148ed941f7fd503a121e37f5964fc4b0eb2 +Subproject commit 6c314542ca79b53269c54771eb39e8948be16548 diff --git a/Modules/jaspCochrane b/Modules/jaspCochrane index 0cdcfc4f71..43438fd825 160000 --- a/Modules/jaspCochrane +++ b/Modules/jaspCochrane @@ -1 +1 @@ -Subproject commit 0cdcfc4f71a0b673d07c0f1f645a513f3b524c26 +Subproject commit 43438fd8259305c574a81be799788b77e6db0fc7 diff --git a/Modules/jaspDescriptives b/Modules/jaspDescriptives index e9472067e7..9e9c562e41 160000 --- a/Modules/jaspDescriptives +++ b/Modules/jaspDescriptives @@ -1 +1 @@ -Subproject commit e9472067e787a3d6f953e48f8af1c25ddc3cacea +Subproject commit 9e9c562e41cbf45f36a7121479e098c34b348abd diff --git a/Modules/jaspDistributions b/Modules/jaspDistributions index 7eed854b76..07067abce3 160000 --- a/Modules/jaspDistributions +++ b/Modules/jaspDistributions @@ -1 +1 @@ -Subproject commit 7eed854b7630377dc746fb66bd75d1f2752c0b01 +Subproject commit 07067abce34b5a61fe32ac19442cd99ac543c86d diff --git a/Modules/jaspEquivalenceTTests b/Modules/jaspEquivalenceTTests index ac8b565dc3..08a2bfa15d 160000 --- a/Modules/jaspEquivalenceTTests +++ b/Modules/jaspEquivalenceTTests @@ -1 +1 @@ -Subproject commit ac8b565dc34310a31e6d9124236bfd2c48130bf5 +Subproject commit 08a2bfa15d79a8a1097d8424c31b9729cb66b62f diff --git a/Modules/jaspFactor b/Modules/jaspFactor index a6f981580e..131ba6bf7c 160000 --- a/Modules/jaspFactor +++ b/Modules/jaspFactor @@ -1 +1 @@ -Subproject commit a6f981580ed658c8368fd93836005c8860f7f918 +Subproject commit 131ba6bf7c8c07d4c493bb1621ff109a5b0cad4e diff --git a/Modules/jaspFrequencies b/Modules/jaspFrequencies index 98fcab3153..831e7ef114 160000 --- a/Modules/jaspFrequencies +++ b/Modules/jaspFrequencies @@ -1 +1 @@ -Subproject commit 98fcab3153d96c9294da62bd6297579313994326 +Subproject commit 831e7ef11450c7b6b4e140dedb83e6f72a34cf14 diff --git a/Modules/jaspJags b/Modules/jaspJags index b5d93fd73a..bad5c8ed66 160000 --- a/Modules/jaspJags +++ b/Modules/jaspJags @@ -1 +1 @@ -Subproject commit b5d93fd73a1065f1a2a226c74042f7c88279e407 +Subproject commit bad5c8ed666975ae611f6a165b98c9c88d142f06 diff --git a/Modules/jaspLearnBayes b/Modules/jaspLearnBayes index a6ba7c50b1..001549c15f 160000 --- a/Modules/jaspLearnBayes +++ b/Modules/jaspLearnBayes @@ -1 +1 @@ -Subproject commit a6ba7c50b1590883efdbf28be529ed45e40ee59f +Subproject commit 001549c15fcca7fcc51883b42fe9e9e176cd0055 diff --git a/Modules/jaspLearnStats b/Modules/jaspLearnStats index 54a967ca28..deb63579a7 160000 --- a/Modules/jaspLearnStats +++ b/Modules/jaspLearnStats @@ -1 +1 @@ -Subproject commit 54a967ca28ff26045d3d14afb3466fe25e0f7c53 +Subproject commit deb63579a7d637e68a8c14fcb36fe5f809182729 diff --git a/Modules/jaspMachineLearning b/Modules/jaspMachineLearning index bb2e32bdac..ec0f769b08 160000 --- a/Modules/jaspMachineLearning +++ b/Modules/jaspMachineLearning @@ -1 +1 @@ -Subproject commit bb2e32bdac96d65f45c103e39d576b932b7adc2e +Subproject commit ec0f769b0849d810b82513aa0bfef8489830f112 diff --git a/Modules/jaspMetaAnalysis b/Modules/jaspMetaAnalysis index f2e6ec9b16..82c43a5d8d 160000 --- a/Modules/jaspMetaAnalysis +++ b/Modules/jaspMetaAnalysis @@ -1 +1 @@ -Subproject commit f2e6ec9b16e515ce8fcfc522a232cc97d6f56515 +Subproject commit 82c43a5d8d14abe8f4ea8253cba7fa9384cafc56 diff --git a/Modules/jaspMixedModels b/Modules/jaspMixedModels index add707c947..abb2559f3f 160000 --- a/Modules/jaspMixedModels +++ b/Modules/jaspMixedModels @@ -1 +1 @@ -Subproject commit add707c947ec4caca25d16bdf810b3974e75457d +Subproject commit abb2559f3f9b490f1127e4def37525c85b67647b diff --git a/Modules/jaspNetwork b/Modules/jaspNetwork index cf68b8a3c7..0dd597d3cd 160000 --- a/Modules/jaspNetwork +++ b/Modules/jaspNetwork @@ -1 +1 @@ -Subproject commit cf68b8a3c70a8a320617e6b55be3bcd22cd8bb93 +Subproject commit 0dd597d3cd855588577e6afba8f7815120605230 diff --git a/Modules/jaspPower b/Modules/jaspPower index 0863941aa6..5f0da63e2a 160000 --- a/Modules/jaspPower +++ b/Modules/jaspPower @@ -1 +1 @@ -Subproject commit 0863941aa66d4e1b3e64826cbf3a68bfe8863a9d +Subproject commit 5f0da63e2aa862a91d827e402b83a20613a4ac71 diff --git a/Modules/jaspPredictiveAnalytics b/Modules/jaspPredictiveAnalytics index 4598d0c5dc..db4f43b791 160000 --- a/Modules/jaspPredictiveAnalytics +++ b/Modules/jaspPredictiveAnalytics @@ -1 +1 @@ -Subproject commit 4598d0c5dca9305498743c4f8462ed0e3afb9cf4 +Subproject commit db4f43b79151c7f82b64e221e8901c87b1e78e3f diff --git a/Modules/jaspProcess b/Modules/jaspProcess index 16754da0a2..56389c731d 160000 --- a/Modules/jaspProcess +++ b/Modules/jaspProcess @@ -1 +1 @@ -Subproject commit 16754da0a246c67d9d95a22fed325f8ceb87fae9 +Subproject commit 56389c731d9fd3a6b41b67ba640a5581aeeb89cf diff --git a/Modules/jaspProphet b/Modules/jaspProphet index bb1f0b5bd9..b8b5027cc8 160000 --- a/Modules/jaspProphet +++ b/Modules/jaspProphet @@ -1 +1 @@ -Subproject commit bb1f0b5bd917a97832e5fa87f68589f7e142fb43 +Subproject commit b8b5027cc8c82e57eb746592fed8bcc5cd81b5f7 diff --git a/Modules/jaspQualityControl b/Modules/jaspQualityControl index 8b3cc98b9d..b18664738e 160000 --- a/Modules/jaspQualityControl +++ b/Modules/jaspQualityControl @@ -1 +1 @@ -Subproject commit 8b3cc98b9d25d3091982449f9e6986441c140b18 +Subproject commit b18664738e0922c05ef7d3dcec79822deb710b10 diff --git a/Modules/jaspRegression b/Modules/jaspRegression index 92e7db0c5e..89b2ef96fc 160000 --- a/Modules/jaspRegression +++ b/Modules/jaspRegression @@ -1 +1 @@ -Subproject commit 92e7db0c5e6a9e1c5ea50a7fc854305b2c75ab9a +Subproject commit 89b2ef96fc8a142b85e6803a1deea0b61ed43b8e diff --git a/Modules/jaspReliability b/Modules/jaspReliability index af7018a0f0..c029d413fb 160000 --- a/Modules/jaspReliability +++ b/Modules/jaspReliability @@ -1 +1 @@ -Subproject commit af7018a0f030e1c8e41f302e818d402aa65e99c6 +Subproject commit c029d413fb519147b9cb98a18702d5738e68632c diff --git a/Modules/jaspRobustTTests b/Modules/jaspRobustTTests index 428a951817..888c19221c 160000 --- a/Modules/jaspRobustTTests +++ b/Modules/jaspRobustTTests @@ -1 +1 @@ -Subproject commit 428a95181719321d9f21487895a93437b559098b +Subproject commit 888c19221ca488e7a619f56319a19974df11f1b5 diff --git a/Modules/jaspSem b/Modules/jaspSem index 62ecdd1606..f4d869f841 160000 --- a/Modules/jaspSem +++ b/Modules/jaspSem @@ -1 +1 @@ -Subproject commit 62ecdd1606faed707b335930431081981300ad77 +Subproject commit f4d869f841bcd40f00399aceec0b656a5d316f6b diff --git a/Modules/jaspSummaryStatistics b/Modules/jaspSummaryStatistics index 8ebbb1f5ad..ef974f7e86 160000 --- a/Modules/jaspSummaryStatistics +++ b/Modules/jaspSummaryStatistics @@ -1 +1 @@ -Subproject commit 8ebbb1f5adceed868becaf01e47f8f51e719468d +Subproject commit ef974f7e86d6975bebd2e67ec3f61d3de2655553 diff --git a/Modules/jaspSurvival b/Modules/jaspSurvival index edccffe30a..5096f540c6 160000 --- a/Modules/jaspSurvival +++ b/Modules/jaspSurvival @@ -1 +1 @@ -Subproject commit edccffe30a2ad0b7167c8cb967a2d2b6d5750564 +Subproject commit 5096f540c6bc4b862d57c5dfd3fb87068e37c64a diff --git a/Modules/jaspTTests b/Modules/jaspTTests index 232d43df09..6bea253cc0 160000 --- a/Modules/jaspTTests +++ b/Modules/jaspTTests @@ -1 +1 @@ -Subproject commit 232d43df09f5dbb0fecc08462b018083be349268 +Subproject commit 6bea253cc072cd786e90186aeeb94dbf13dc8e10 diff --git a/Modules/jaspTimeSeries b/Modules/jaspTimeSeries index 718e014128..2dfd0c3daa 160000 --- a/Modules/jaspTimeSeries +++ b/Modules/jaspTimeSeries @@ -1 +1 @@ -Subproject commit 718e0141280d0bc6b268fd62e786c1242108f3ce +Subproject commit 2dfd0c3daa23eb90114018ba3ac6e36799ec9789 diff --git a/Modules/jaspVisualModeling b/Modules/jaspVisualModeling index 48587c567d..75c6d3aebf 160000 --- a/Modules/jaspVisualModeling +++ b/Modules/jaspVisualModeling @@ -1 +1 @@ -Subproject commit 48587c567da75c7d94fb495f2352aa5844375c01 +Subproject commit 75c6d3aebf9ebc3906ba9c671f3070617b9da05f From 0faa32db92d663ce6e9c0f8aae5a7f5ad1b5e629 Mon Sep 17 00:00:00 2001 From: RensDofferhoff <20978635+RensDofferhoff@users.noreply.github.com> Date: Wed, 28 Aug 2024 15:02:17 +0200 Subject: [PATCH 17/70] add jaspBFF (#5644) --- .gitmodules | 3 +++ Modules/jaspBFF | 1 + Tools/CMake/Modules.cmake | 1 + 3 files changed, 5 insertions(+) create mode 160000 Modules/jaspBFF diff --git a/.gitmodules b/.gitmodules index 834cf863a8..9eeb0864f4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -153,3 +153,6 @@ [submodule "Engine/jaspModuleInstaller"] path = Engine/jaspModuleInstaller url = https://github.com/jasp-stats/jaspModuleInstaller.git +[submodule "Modules/jaspBFF"] + path = Modules/jaspBFF + url = https://github.com/jasp-stats/jaspBFF diff --git a/Modules/jaspBFF b/Modules/jaspBFF new file mode 160000 index 0000000000..4c0ad92b4b --- /dev/null +++ b/Modules/jaspBFF @@ -0,0 +1 @@ +Subproject commit 4c0ad92b4b3e8eb23661f2ce0307c33bae045b4f diff --git a/Tools/CMake/Modules.cmake b/Tools/CMake/Modules.cmake index e1559093e0..01514337dd 100644 --- a/Tools/CMake/Modules.cmake +++ b/Tools/CMake/Modules.cmake @@ -36,6 +36,7 @@ set(JASP_EXTRA_MODULES "jaspAcceptanceSampling" "jaspAudit" "jaspBain" + "jaspBFF" "jaspBsts" "jaspCircular" "jaspCochrane" From 86a256cd84b0ac9c855e54a3db06e5123d8cb055 Mon Sep 17 00:00:00 2001 From: bruno boutin Date: Thu, 29 Aug 2024 15:10:28 +0200 Subject: [PATCH 18/70] removeInvisibles properties should also remove dropdown in VariablesForm (#5646) --- .../components/JASP/Controls/VariablesForm.qml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/QMLComponents/components/JASP/Controls/VariablesForm.qml b/QMLComponents/components/JASP/Controls/VariablesForm.qml index f2e0962129..00c3e0297a 100644 --- a/QMLComponents/components/JASP/Controls/VariablesForm.qml +++ b/QMLComponents/components/JASP/Controls/VariablesForm.qml @@ -49,6 +49,7 @@ VariablesFormBase property bool removeInvisibles : false property double _lastListWidth : 0 + property double _comboBoxHeight : 0 Item { id: items } @@ -153,24 +154,22 @@ VariablesFormBase for (var key in allJASPControls) { var control = allJASPControls[key] - var isControlList = ((control.controlType === JASPControl.VariablesListView) || (control.controlType === JASPControl.FactorLevelList) || (control.controlType === JASPControl.InputListView)) if (removeInvisibles && !control.visible) - control.height = 0 + control.anchors.top = variablesForm.top; else { control.anchors.top = anchorTop; control.anchors.topMargin = firstControl ? 0 : marginBetweenVariablesLists; anchorTop = control.bottom; - if (removeInvisibles && control.visible && control.height == 0) // Reset the height of the control when it bocomes visible again - control.height = control.maxRows === 1 ? jaspTheme.defaultSingleItemListHeight : jaspTheme.defaultVariablesFormHeight - if (!firstControl) minHeightOfAssignedControls += marginBetweenVariablesLists; firstControl = false; + var isControlList = ((control.controlType === JASPControl.VariablesListView) || (control.controlType === JASPControl.FactorLevelList) || (control.controlType === JASPControl.InputListView)) + if (!isControlList) minHeightOfAssignedControls += control.height; else if (control.maxRows === 1 || !heightSetByForm(control)) @@ -186,7 +185,7 @@ VariablesFormBase } } } - + // Set the height of controls (that have not singleVariable set or where the height is already specifically set) // so that the AssignedVariablesList column is as long as the AvailableVariablesList column. if (changeableHeightControls.length > 0) From 243b226fd7c89a4a7ee24ed1d1809f9416d851f3 Mon Sep 17 00:00:00 2001 From: Shun Wang Date: Fri, 30 Aug 2024 20:21:05 +0800 Subject: [PATCH 19/70] docs: remove deprecated `suggestedColumns` in docs (#5626) * docs: deprecated `suggestedColumns` in docs * suggestedColumns -> allowedColumns --- Docs/development/jasp-qml-guide.md | 9 +-------- Docs/development/jasp-qml-style-example.qml | 2 +- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/Docs/development/jasp-qml-guide.md b/Docs/development/jasp-qml-guide.md index 081f9aa550..2b3d6933f5 100644 --- a/Docs/development/jasp-qml-guide.md +++ b/Docs/development/jasp-qml-guide.md @@ -448,14 +448,7 @@ Properties - `name`: identifier of the particular variable field (in your R code you will be able to retrieve the assigned variable(s) through this identifier) - `label`: [optional, default: `""`] text that will be shown above the variable field - `columns`: [optional, default: 1] number of columns of the list. -- `allowedColumns`: [optional, default: empty, possible values: `["scale", "ordinal", "nominal"]` ] array specifying the allowed column types. -- `suggestedColumns`: [optional, default: empty, possible values: `["scale", "ordinal", "nominal"]` ] array specifying the suggested column types. The difference between `allowedColumns` and `suggestedColumns` is that `allowedColumns` sets explicitly the types that are allowed, and `suggestedColumns` sets the allowed types in a looser way, with these rules: - * if `suggestedColumns` contains the `scale` type, then `nominal` and `ordinal` types are also allowed - * if `suggestedColumns` contains the `nominal` type, then `ordinal` tyes are also allowed - -The `suggestedColumns` types are displayed as icons at the bottom-right of the VariablesList, indicating which kind of columns may be added in this VariablesList. If `suggestedColumns` is empty and `allowedColumns` is specified, then the `allowedColumns` is used to display the type icons. -If `suggestedColumns` and `allowedColumns` are empty, then all column types are allowed.\ -To avoid confusion, use either the `allowedColumns` property or the `suggestedColumns` property, and not both properties, to set which columns might be inserted in the VariablesList. `allowedColumns` sets the types explicitly, `suggestedColumns` indicates more which types should be used, but permits other types that can be converted implicitly to the right type. +- `allowedColumns`: [optional, default: empty, possible values: `["scale", "ordinal", "nominal"]` ] array specifying the allowed column types, which displayed as icons at the bottom-right of the VariablesList. Other type of columns can be converted automatically to the right type, all column types would be allowed if set it empty. - `maxRows`: [optional, default: `-1`] maximum number of rows the list can accept. -1 means no limit. - `singleVariable`: [optional, default: `false`] if true, set the maxRows to 1 - `listViewType`: [optional] enumerative that specifies the type of `AssignedVariablesList`, when omitted we get a normal list, options are `JASP.Layers` (see Contingency Tables), `JASP.Interaction` (see ANOVA) and `JASP.RepeatedMeasures` (see Repeated Measures ANOVA) diff --git a/Docs/development/jasp-qml-style-example.qml b/Docs/development/jasp-qml-style-example.qml index 9aa01f499f..1a8638cce0 100644 --- a/Docs/development/jasp-qml-style-example.qml +++ b/Docs/development/jasp-qml-style-example.qml @@ -47,7 +47,7 @@ Form { AvailableVariablesList { name: "availbleVariables" } AssignedVariablesList { name: "variables"; title: qsTr("Variables") } - AssignedVariablesList { name: "splitby"; title: qsTr("Split"); singleVariable: true; suggestedColumns: ["ordinal", "nominal"] } + AssignedVariablesList { name: "splitby"; title: qsTr("Split"); singleVariable: true; allowedColumns: ["ordinal", "nominal"] } } //But in most cases you should follow the style documented at "theRightWayForSpecifyingProperties" From 0dffcf98a3730950fffa9b656e673d3fe97dae14 Mon Sep 17 00:00:00 2001 From: RensDofferhoff <20978635+RensDofferhoff@users.noreply.github.com> Date: Sun, 1 Sep 2024 19:40:24 +0200 Subject: [PATCH 20/70] update submodules (#5647) --- Modules/jaspAcceptanceSampling | 2 +- Modules/jaspAnova | 2 +- Modules/jaspAudit | 2 +- Modules/jaspBFF | 2 +- Modules/jaspBain | 2 +- Modules/jaspBsts | 2 +- Modules/jaspCircular | 2 +- Modules/jaspCochrane | 2 +- Modules/jaspDescriptives | 2 +- Modules/jaspDistributions | 2 +- Modules/jaspEquivalenceTTests | 2 +- Modules/jaspFactor | 2 +- Modules/jaspFrequencies | 2 +- Modules/jaspJags | 2 +- Modules/jaspLearnBayes | 2 +- Modules/jaspLearnStats | 2 +- Modules/jaspMachineLearning | 2 +- Modules/jaspMetaAnalysis | 2 +- Modules/jaspMixedModels | 2 +- Modules/jaspNetwork | 2 +- Modules/jaspPower | 2 +- Modules/jaspPredictiveAnalytics | 2 +- Modules/jaspProcess | 2 +- Modules/jaspProphet | 2 +- Modules/jaspQualityControl | 2 +- Modules/jaspRegression | 2 +- Modules/jaspReliability | 2 +- Modules/jaspRobustTTests | 2 +- Modules/jaspSem | 2 +- Modules/jaspSummaryStatistics | 2 +- Modules/jaspSurvival | 2 +- Modules/jaspTTests | 2 +- Modules/jaspTimeSeries | 2 +- Modules/jaspVisualModeling | 2 +- 34 files changed, 34 insertions(+), 34 deletions(-) diff --git a/Modules/jaspAcceptanceSampling b/Modules/jaspAcceptanceSampling index 75e1b64792..6c05756022 160000 --- a/Modules/jaspAcceptanceSampling +++ b/Modules/jaspAcceptanceSampling @@ -1 +1 @@ -Subproject commit 75e1b64792ef07e8382b8517b53c1d1bc5a75996 +Subproject commit 6c05756022ec34ab67faad625a5344c79e3da945 diff --git a/Modules/jaspAnova b/Modules/jaspAnova index b989e0e00c..2a5245da1d 160000 --- a/Modules/jaspAnova +++ b/Modules/jaspAnova @@ -1 +1 @@ -Subproject commit b989e0e00c87731d6332604e82477a6e4fe2704d +Subproject commit 2a5245da1d766f3d4dd7fcc9552adc8c0d7ddfdc diff --git a/Modules/jaspAudit b/Modules/jaspAudit index 71e1f74634..eb5527f24d 160000 --- a/Modules/jaspAudit +++ b/Modules/jaspAudit @@ -1 +1 @@ -Subproject commit 71e1f7463488e2195ea54662499a44944baf2353 +Subproject commit eb5527f24d6652f1339a739c8b95fb519748e960 diff --git a/Modules/jaspBFF b/Modules/jaspBFF index 4c0ad92b4b..8fa02a3e0e 160000 --- a/Modules/jaspBFF +++ b/Modules/jaspBFF @@ -1 +1 @@ -Subproject commit 4c0ad92b4b3e8eb23661f2ce0307c33bae045b4f +Subproject commit 8fa02a3e0ee2d8d7ea6bbefb2cdb9c30b6d2327e diff --git a/Modules/jaspBain b/Modules/jaspBain index a505d5616f..ead1c8acb3 160000 --- a/Modules/jaspBain +++ b/Modules/jaspBain @@ -1 +1 @@ -Subproject commit a505d5616f6120cc815dde57274a10eb2c2d99b5 +Subproject commit ead1c8acb39e7879f57f5362aa7d26c881fb5d2f diff --git a/Modules/jaspBsts b/Modules/jaspBsts index 262ab27ae3..707fcf06b0 160000 --- a/Modules/jaspBsts +++ b/Modules/jaspBsts @@ -1 +1 @@ -Subproject commit 262ab27ae3ee822f7ddd547cdb1107ba6c440b10 +Subproject commit 707fcf06b086b300bc4c4921eff5bb07f43d4854 diff --git a/Modules/jaspCircular b/Modules/jaspCircular index 6c314542ca..38425b34bb 160000 --- a/Modules/jaspCircular +++ b/Modules/jaspCircular @@ -1 +1 @@ -Subproject commit 6c314542ca79b53269c54771eb39e8948be16548 +Subproject commit 38425b34bbf0f90affa0d7757470e4527be24528 diff --git a/Modules/jaspCochrane b/Modules/jaspCochrane index 43438fd825..5e1766f1f9 160000 --- a/Modules/jaspCochrane +++ b/Modules/jaspCochrane @@ -1 +1 @@ -Subproject commit 43438fd8259305c574a81be799788b77e6db0fc7 +Subproject commit 5e1766f1f90664cd8dd8391c4af2a0697393d99e diff --git a/Modules/jaspDescriptives b/Modules/jaspDescriptives index 9e9c562e41..176070f013 160000 --- a/Modules/jaspDescriptives +++ b/Modules/jaspDescriptives @@ -1 +1 @@ -Subproject commit 9e9c562e41cbf45f36a7121479e098c34b348abd +Subproject commit 176070f01349e5c4c92c9d1258b4d885367bf698 diff --git a/Modules/jaspDistributions b/Modules/jaspDistributions index 07067abce3..0819492508 160000 --- a/Modules/jaspDistributions +++ b/Modules/jaspDistributions @@ -1 +1 @@ -Subproject commit 07067abce34b5a61fe32ac19442cd99ac543c86d +Subproject commit 0819492508f265b092203364e08548542783744b diff --git a/Modules/jaspEquivalenceTTests b/Modules/jaspEquivalenceTTests index 08a2bfa15d..3a84c10975 160000 --- a/Modules/jaspEquivalenceTTests +++ b/Modules/jaspEquivalenceTTests @@ -1 +1 @@ -Subproject commit 08a2bfa15d79a8a1097d8424c31b9729cb66b62f +Subproject commit 3a84c1097597a13ff79200573ad767ffad2a6dce diff --git a/Modules/jaspFactor b/Modules/jaspFactor index 131ba6bf7c..f4f3395873 160000 --- a/Modules/jaspFactor +++ b/Modules/jaspFactor @@ -1 +1 @@ -Subproject commit 131ba6bf7c8c07d4c493bb1621ff109a5b0cad4e +Subproject commit f4f3395873b8ddb2d8bfcc1b6be3645aa0c59f96 diff --git a/Modules/jaspFrequencies b/Modules/jaspFrequencies index 831e7ef114..f0f469b3cf 160000 --- a/Modules/jaspFrequencies +++ b/Modules/jaspFrequencies @@ -1 +1 @@ -Subproject commit 831e7ef11450c7b6b4e140dedb83e6f72a34cf14 +Subproject commit f0f469b3cf7b6e25c641af62216c56d28b4173fc diff --git a/Modules/jaspJags b/Modules/jaspJags index bad5c8ed66..249ca55305 160000 --- a/Modules/jaspJags +++ b/Modules/jaspJags @@ -1 +1 @@ -Subproject commit bad5c8ed666975ae611f6a165b98c9c88d142f06 +Subproject commit 249ca553051992417febdd6ee1f8c67e2e7d0869 diff --git a/Modules/jaspLearnBayes b/Modules/jaspLearnBayes index 001549c15f..93992d032e 160000 --- a/Modules/jaspLearnBayes +++ b/Modules/jaspLearnBayes @@ -1 +1 @@ -Subproject commit 001549c15fcca7fcc51883b42fe9e9e176cd0055 +Subproject commit 93992d032e053edfe30636be3c11f075ac1b4ffe diff --git a/Modules/jaspLearnStats b/Modules/jaspLearnStats index deb63579a7..a6320cd6e2 160000 --- a/Modules/jaspLearnStats +++ b/Modules/jaspLearnStats @@ -1 +1 @@ -Subproject commit deb63579a7d637e68a8c14fcb36fe5f809182729 +Subproject commit a6320cd6e298ad74d40050c0184dbf4ea95f6592 diff --git a/Modules/jaspMachineLearning b/Modules/jaspMachineLearning index ec0f769b08..0487a2adc7 160000 --- a/Modules/jaspMachineLearning +++ b/Modules/jaspMachineLearning @@ -1 +1 @@ -Subproject commit ec0f769b0849d810b82513aa0bfef8489830f112 +Subproject commit 0487a2adc7b520e15929ea6cfd817dd2166aaa20 diff --git a/Modules/jaspMetaAnalysis b/Modules/jaspMetaAnalysis index 82c43a5d8d..4b979ec451 160000 --- a/Modules/jaspMetaAnalysis +++ b/Modules/jaspMetaAnalysis @@ -1 +1 @@ -Subproject commit 82c43a5d8d14abe8f4ea8253cba7fa9384cafc56 +Subproject commit 4b979ec4518a4a3eafd2b30ba852240bbf4deb23 diff --git a/Modules/jaspMixedModels b/Modules/jaspMixedModels index abb2559f3f..808ef713a3 160000 --- a/Modules/jaspMixedModels +++ b/Modules/jaspMixedModels @@ -1 +1 @@ -Subproject commit abb2559f3f9b490f1127e4def37525c85b67647b +Subproject commit 808ef713a3a4d6c9d4d3ef00295a3a650672ab8d diff --git a/Modules/jaspNetwork b/Modules/jaspNetwork index 0dd597d3cd..666c7a2f5b 160000 --- a/Modules/jaspNetwork +++ b/Modules/jaspNetwork @@ -1 +1 @@ -Subproject commit 0dd597d3cd855588577e6afba8f7815120605230 +Subproject commit 666c7a2f5bb8b88b48758c7c32e177c605b807ad diff --git a/Modules/jaspPower b/Modules/jaspPower index 5f0da63e2a..e543360d2b 160000 --- a/Modules/jaspPower +++ b/Modules/jaspPower @@ -1 +1 @@ -Subproject commit 5f0da63e2aa862a91d827e402b83a20613a4ac71 +Subproject commit e543360d2bf0b0b5639f7922e68153316972e082 diff --git a/Modules/jaspPredictiveAnalytics b/Modules/jaspPredictiveAnalytics index db4f43b791..32d889a82b 160000 --- a/Modules/jaspPredictiveAnalytics +++ b/Modules/jaspPredictiveAnalytics @@ -1 +1 @@ -Subproject commit db4f43b79151c7f82b64e221e8901c87b1e78e3f +Subproject commit 32d889a82b015745c8e3932b8db1eceb7b5dd008 diff --git a/Modules/jaspProcess b/Modules/jaspProcess index 56389c731d..90f2ee4208 160000 --- a/Modules/jaspProcess +++ b/Modules/jaspProcess @@ -1 +1 @@ -Subproject commit 56389c731d9fd3a6b41b67ba640a5581aeeb89cf +Subproject commit 90f2ee4208fb7514d37b9200525a1a563f0eb29d diff --git a/Modules/jaspProphet b/Modules/jaspProphet index b8b5027cc8..134b796d13 160000 --- a/Modules/jaspProphet +++ b/Modules/jaspProphet @@ -1 +1 @@ -Subproject commit b8b5027cc8c82e57eb746592fed8bcc5cd81b5f7 +Subproject commit 134b796d134fed0d9c605315facbfd2628c39c4b diff --git a/Modules/jaspQualityControl b/Modules/jaspQualityControl index b18664738e..014e3e8f86 160000 --- a/Modules/jaspQualityControl +++ b/Modules/jaspQualityControl @@ -1 +1 @@ -Subproject commit b18664738e0922c05ef7d3dcec79822deb710b10 +Subproject commit 014e3e8f8639fdf40d8531d82874fc3dff181f8c diff --git a/Modules/jaspRegression b/Modules/jaspRegression index 89b2ef96fc..dc4b1af011 160000 --- a/Modules/jaspRegression +++ b/Modules/jaspRegression @@ -1 +1 @@ -Subproject commit 89b2ef96fc8a142b85e6803a1deea0b61ed43b8e +Subproject commit dc4b1af0118324e8ce973b2129af4fa076d81e9a diff --git a/Modules/jaspReliability b/Modules/jaspReliability index c029d413fb..c58495ffb5 160000 --- a/Modules/jaspReliability +++ b/Modules/jaspReliability @@ -1 +1 @@ -Subproject commit c029d413fb519147b9cb98a18702d5738e68632c +Subproject commit c58495ffb5722f1f5e9d4b3ff5dccb6e42512069 diff --git a/Modules/jaspRobustTTests b/Modules/jaspRobustTTests index 888c19221c..9ae85ac051 160000 --- a/Modules/jaspRobustTTests +++ b/Modules/jaspRobustTTests @@ -1 +1 @@ -Subproject commit 888c19221ca488e7a619f56319a19974df11f1b5 +Subproject commit 9ae85ac0515ca1031531bf016c6fb6d5e7256029 diff --git a/Modules/jaspSem b/Modules/jaspSem index f4d869f841..cdbc4249cd 160000 --- a/Modules/jaspSem +++ b/Modules/jaspSem @@ -1 +1 @@ -Subproject commit f4d869f841bcd40f00399aceec0b656a5d316f6b +Subproject commit cdbc4249cd466613a09c2565200bf63f4161e4f7 diff --git a/Modules/jaspSummaryStatistics b/Modules/jaspSummaryStatistics index ef974f7e86..4346b51ebd 160000 --- a/Modules/jaspSummaryStatistics +++ b/Modules/jaspSummaryStatistics @@ -1 +1 @@ -Subproject commit ef974f7e86d6975bebd2e67ec3f61d3de2655553 +Subproject commit 4346b51ebdff34427e1ebaf24569b8fba4f954ed diff --git a/Modules/jaspSurvival b/Modules/jaspSurvival index 5096f540c6..3caad0df36 160000 --- a/Modules/jaspSurvival +++ b/Modules/jaspSurvival @@ -1 +1 @@ -Subproject commit 5096f540c6bc4b862d57c5dfd3fb87068e37c64a +Subproject commit 3caad0df3677bc094f87fc55a116fe7f4e12cc78 diff --git a/Modules/jaspTTests b/Modules/jaspTTests index 6bea253cc0..a5620b4f73 160000 --- a/Modules/jaspTTests +++ b/Modules/jaspTTests @@ -1 +1 @@ -Subproject commit 6bea253cc072cd786e90186aeeb94dbf13dc8e10 +Subproject commit a5620b4f739d6950f4b98679f38dc7176b16e38a diff --git a/Modules/jaspTimeSeries b/Modules/jaspTimeSeries index 2dfd0c3daa..8defd626d2 160000 --- a/Modules/jaspTimeSeries +++ b/Modules/jaspTimeSeries @@ -1 +1 @@ -Subproject commit 2dfd0c3daa23eb90114018ba3ac6e36799ec9789 +Subproject commit 8defd626d2f27fe340a02c2f54c4ee675ea9f750 diff --git a/Modules/jaspVisualModeling b/Modules/jaspVisualModeling index 75c6d3aebf..c39bc7ef27 160000 --- a/Modules/jaspVisualModeling +++ b/Modules/jaspVisualModeling @@ -1 +1 @@ -Subproject commit 75c6d3aebf9ebc3906ba9c671f3070617b9da05f +Subproject commit c39bc7ef27a47d7584d325039ffda337b897f95f From 6bc2d54a69f338e169dabde43b7ac5be47f94002 Mon Sep 17 00:00:00 2001 From: RensDofferhoff <20978635+RensDofferhoff@users.noreply.github.com> Date: Sun, 1 Sep 2024 20:35:28 +0200 Subject: [PATCH 21/70] update submodules (#5648) --- Modules/jaspTestModule | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/jaspTestModule b/Modules/jaspTestModule index 5b77601d9b..31537a74c5 160000 --- a/Modules/jaspTestModule +++ b/Modules/jaspTestModule @@ -1 +1 @@ -Subproject commit 5b77601d9b7272e16a795c0e59fe0c821c79e7ae +Subproject commit 31537a74c56d15a9e02b9f0cf8fa8af47b8a8d87 From 6294f2279f3a5d9a2498048fa1a27770587c4cfe Mon Sep 17 00:00:00 2001 From: bruno boutin Date: Mon, 2 Sep 2024 14:14:16 +0200 Subject: [PATCH 22/70] Create checkPOFiles.sh --- Tools/checkPOFiles.sh | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Tools/checkPOFiles.sh diff --git a/Tools/checkPOFiles.sh b/Tools/checkPOFiles.sh new file mode 100644 index 0000000000..7f08f5c920 --- /dev/null +++ b/Tools/checkPOFiles.sh @@ -0,0 +1,17 @@ +function checkPO { + for LANGUAGE in cs de eo es eu fr gl id ja nl pl pt_BR pt ru zh_Hans hs_Hant + do + PO_FILE="po/QML-${LANGUAGE}.po" + if [ -e ${PO_FILE} ] + then + if ! grep X-Language ${PO_FILE} >> /dev/null 2>&1 + then + echo "No X-Language for ${LANGUAGE}" + fi + fi + done +} + +export -f checkPO + +git submodule foreach checkPO From d5c365329eef7c3ab3ba01dd89456c68b10ce3f1 Mon Sep 17 00:00:00 2001 From: RensDofferhoff <20978635+RensDofferhoff@users.noreply.github.com> Date: Mon, 2 Sep 2024 17:36:43 +0200 Subject: [PATCH 23/70] fix ZIP issue and fix some windows build thing (#5649) --- Tools/CMake/Programs.cmake | 11 +++++------ Tools/windows/zip/ZIP.cmd.in | 9 ++++++++- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Tools/CMake/Programs.cmake b/Tools/CMake/Programs.cmake index ca257375f6..bfdc8dc63c 100644 --- a/Tools/CMake/Programs.cmake +++ b/Tools/CMake/Programs.cmake @@ -166,12 +166,11 @@ if(WIN32) ) endif() - set(WIX_PATH - "C:/Program Files (x86)/WiX Toolset v3.11/bin" - CACHE - PATH - "Path to your WIX installation, e.g., C:\\Program Files (x86)\\WiX Toolset v3.11\\bin" - ) + if(DEFINED ENV{WIX}) + set(WIX_PATH "$ENV{WIX}/bin" CACHE PATH "Path to your WIX installation, e.g., C:\\Program Files (x86)\\WiX Toolset v3.11\\bin") + else() + set(WIX_PATH "C:/Program Files (x86)/WiX Toolset v3.11/bin" CACHE PATH "Path to your WIX installation, e.g., C:\\Program Files (x86)\\WiX Toolset v3.11\\bin") + endif() find_program( HEAT_EXECUTABLE diff --git a/Tools/windows/zip/ZIP.cmd.in b/Tools/windows/zip/ZIP.cmd.in index e63f3eaae9..bb1bff0638 100644 --- a/Tools/windows/zip/ZIP.cmd.in +++ b/Tools/windows/zip/ZIP.cmd.in @@ -12,6 +12,13 @@ setlocal EnableDelayedExpansion rem ---------------------- Packing ------------------------------- echo Making zip-version of installer +where /q zip +IF ERRORLEVEL 1 ( powershell Compress-Archive -Update "@JASP_INSTALL_DIR_NATIVE@\*" "@JASP_BINARY_DIR_NATIVE@\JASP\JASP.zip" - +) ELSE ( +pushd . +cd /d "@JASP_INSTALL_DIR_NATIVE@\*" +zip -9 -q -r "@JASP_BINARY_DIR_NATIVE@\JASP\JASP.zip" . +popd +) endlocal \ No newline at end of file From 9a02d64f918bd12163eff880be5ba1479e04e476 Mon Sep 17 00:00:00 2001 From: RensDofferhoff <20978635+RensDofferhoff@users.noreply.github.com> Date: Mon, 2 Sep 2024 21:26:37 +0200 Subject: [PATCH 24/70] Update ZIP.cmd.in --- Tools/windows/zip/ZIP.cmd.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Tools/windows/zip/ZIP.cmd.in b/Tools/windows/zip/ZIP.cmd.in index bb1bff0638..bb856fc180 100644 --- a/Tools/windows/zip/ZIP.cmd.in +++ b/Tools/windows/zip/ZIP.cmd.in @@ -16,9 +16,10 @@ where /q zip IF ERRORLEVEL 1 ( powershell Compress-Archive -Update "@JASP_INSTALL_DIR_NATIVE@\*" "@JASP_BINARY_DIR_NATIVE@\JASP\JASP.zip" ) ELSE ( +rem Using gnu zip pushd . cd /d "@JASP_INSTALL_DIR_NATIVE@\*" zip -9 -q -r "@JASP_BINARY_DIR_NATIVE@\JASP\JASP.zip" . popd ) -endlocal \ No newline at end of file +endlocal From a14bef4fdc99dfcfe8eb2dde6962bdfd5356388f Mon Sep 17 00:00:00 2001 From: RensDofferhoff <20978635+RensDofferhoff@users.noreply.github.com> Date: Mon, 2 Sep 2024 21:29:47 +0200 Subject: [PATCH 25/70] Update BuildBotScript.cmd --- Tools/windows/BuildBotScript.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tools/windows/BuildBotScript.cmd b/Tools/windows/BuildBotScript.cmd index ccab8ca44c..1cd574c76b 100644 --- a/Tools/windows/BuildBotScript.cmd +++ b/Tools/windows/BuildBotScript.cmd @@ -35,14 +35,14 @@ cmake --build build --target install cmake --build build --target collect-junctions -robocopy .\build\Install .\build\InstallClean /e +robocopy .\build\Install .\build\InstallClean /e /nfl cmake --build build --target wix cmake --build build --target zip rmdir .\build\Install /s /q -robocopy .\build\InstallClean .\build\Install /e +robocopy .\build\InstallClean .\build\Install /e /nfl cmake --install build --component MSIX From 0685f80bb21b930191a71cb4e33db5f41bb67093 Mon Sep 17 00:00:00 2001 From: bruno boutin Date: Tue, 3 Sep 2024 09:37:37 +0200 Subject: [PATCH 26/70] Update checkPOFiles.sh --- Tools/checkPOFiles.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/checkPOFiles.sh b/Tools/checkPOFiles.sh index 7f08f5c920..1d24d546e0 100644 --- a/Tools/checkPOFiles.sh +++ b/Tools/checkPOFiles.sh @@ -1,5 +1,5 @@ function checkPO { - for LANGUAGE in cs de eo es eu fr gl id ja nl pl pt_BR pt ru zh_Hans hs_Hant + for LANGUAGE in cs de eo es eu fr gl id ja nl pl pt_BR pt ru zh_Hans zh_Hant do PO_FILE="po/QML-${LANGUAGE}.po" if [ -e ${PO_FILE} ] From a4332f1f7143e1e5e60f031696b842323dd2d226 Mon Sep 17 00:00:00 2001 From: RensDofferhoff <20978635+RensDofferhoff@users.noreply.github.com> Date: Tue, 3 Sep 2024 16:51:14 +0200 Subject: [PATCH 27/70] Update JASP.cmake --- Tools/CMake/JASP.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/CMake/JASP.cmake b/Tools/CMake/JASP.cmake index 2b7a618c4b..79d4cc381e 100644 --- a/Tools/CMake/JASP.cmake +++ b/Tools/CMake/JASP.cmake @@ -65,7 +65,7 @@ set(MSIX_NIGHTLY_PUBLISHER CACHE STRING "Publisher set for nightly msix package") set(MSIX_SIGN_CERT_PATH - "D:\\JASPSelfSign.pfx" + "C:\\JASPSelfSign.pfx" CACHE STRING "Path to selfsign cert for Nightlies") set(MSIX_SIGN_CERT_PASSWORD From 4cfe6197714440b0ab6936891fa5ff7cc8ac19b6 Mon Sep 17 00:00:00 2001 From: Joris Goosen Date: Tue, 3 Sep 2024 17:37:38 +0200 Subject: [PATCH 28/70] add some pragmas to speed it all up (#5651) dont add each column separately but just create the table from scratch, making sure that the filter-column is still first --- CommonData/column.cpp | 7 ++-- CommonData/column.h | 2 +- CommonData/databaseinterface.cpp | 63 +++++++++++++++++++++++--------- CommonData/databaseinterface.h | 5 ++- CommonData/dataset.cpp | 13 +++++-- CommonData/dataset.h | 4 +- 6 files changed, 67 insertions(+), 27 deletions(-) diff --git a/CommonData/column.cpp b/CommonData/column.cpp index 4bd1d1f89a..74c4b48a71 100644 --- a/CommonData/column.cpp +++ b/CommonData/column.cpp @@ -82,7 +82,7 @@ void Column::dbDelete(bool cleanUpRest) { assert(_id != -1); - labelsClear(); + labelsClear(false); db().columnDelete(_id, cleanUpRest); _id = -1; @@ -649,13 +649,14 @@ void Column::_sortLabelsByOrder() std::sort(_labels.begin(), _labels.end(), [](const Label * l, const Label * r) { return l->order() < r->order(); }); } -void Column::labelsClear() +void Column::labelsClear(bool doIncRevision) { db().labelsClear(_id); _labels.clear(); _labelByIntsIdMap.clear(); - incRevision(false); + if(doIncRevision) + incRevision(false); } void Column::beginBatchedLabelsDB() diff --git a/CommonData/column.h b/CommonData/column.h index 10b8fc8202..eb204e3f07 100644 --- a/CommonData/column.h +++ b/CommonData/column.h @@ -109,7 +109,7 @@ class Column : public DataSetBaseNode void upgradeSetDoubleLabelsInInts(); ///< Used by upgrade 0.18.* -> 0.19 void upgradeExtractDoublesIntsFromLabels(); ///< Used by upgrade 0.18.* -> 0.19 - void labelsClear(); + void labelsClear(bool doIncRevision=true); int labelsAdd( int display); int labelsAdd( const std::string & display); int labelsAdd( const std::string & display, const std::string & description, const Json::Value & originalValue); diff --git a/CommonData/databaseinterface.cpp b/CommonData/databaseinterface.cpp index 7e9415c1bd..e0fea761fa 100644 --- a/CommonData/databaseinterface.cpp +++ b/CommonData/databaseinterface.cpp @@ -75,7 +75,7 @@ int DatabaseInterface::dataSetInsert(const std::string & dataFilePath, long data transactionWriteBegin(); int id = runStatementsId("INSERT INTO DataSets (dataFilePath, dataFileTimestamp, description, databaseJson, emptyValuesJson, dataFileSynch) VALUES (?, ?, ?, ?, ?, ?) RETURNING id;", prepare); - runStatements("CREATE TABLE " + dataSetName(id) + " (rowNumber INTEGER PRIMARY KEY);"); + runStatements("CREATE TABLE " + dataSetName(id) + " (rowNumber INTEGER PRIMARY KEY);"); // Can be overwritten through dataSetCreateTable transactionWriteEnd(); return id; @@ -183,6 +183,7 @@ void DatabaseInterface::filterDelete(int filterIndex) if(dataSetId != -1) runStatements("ALTER TABLE " + dataSetName(dataSetId) + " DROP COLUMN " + filterName(filterIndex) + ";"); + runStatements("DELETE FROM Filters WHERE id = " + std::to_string(filterIndex) + ";"); transactionWriteEnd(); @@ -391,7 +392,7 @@ void DatabaseInterface::filterWrite(int filterIndex, const std::vector & v transactionWriteEnd(); } -int DatabaseInterface::columnInsert(int dataSetId, int index, const std::string & name, columnType colType) +int DatabaseInterface::columnInsert(int dataSetId, int index, const std::string & name, columnType colType, bool alterTable) { JASPTIMER_SCOPE(DatabaseInterface::columnInsert); transactionWriteBegin(); @@ -419,19 +420,38 @@ int DatabaseInterface::columnInsert(int dataSetId, int index, const std::string Log::log() << "Inserting column failed!" << std::endl; #endif - //Add a scalar and ordinal/nominal column to DataSet_# for the column - const std::string alterDatasetPrefix = "ALTER TABLE " + dataSetName(dataSetId); - const std::string addColumnFragment = " ADD " + columnBaseName(columnId); - - runStatements(alterDatasetPrefix + addColumnFragment + "_DBL REAL NULL;"); - runStatements(alterDatasetPrefix + addColumnFragment + "_INT INT NULL;"); - + + if(alterTable) //If not then via dataSetCreateTable + { + //Add a scalar and ordinal/nominal column to DataSet_# for the column + const std::string alterDatasetPrefix = "ALTER TABLE " + dataSetName(dataSetId); + const std::string addColumnFragment = " ADD " + columnBaseName(columnId); + + runStatements(alterDatasetPrefix + addColumnFragment + "_DBL REAL NULL;"); + runStatements(alterDatasetPrefix + addColumnFragment + "_INT INT NULL;"); + } + //The labels will be added separately later transactionWriteEnd(); return columnId; } +void DatabaseInterface::dataSetCreateTable(DataSet * dataSet) +{ + runStatements("DROP TABLE " + dataSetName(dataSet->id()) + ";"); + + std::stringstream statements; + statements << "CREATE TABLE " + dataSetName(dataSet->id()) + " (rowNumber INTEGER PRIMARY KEY, "+ filterName(dataSet->filter()->id()) + " INT NOT NULL DEFAULT 1"; + + for(Column * column : dataSet->columns()) + statements << ", " << columnBaseName(column->id()) << "_DBL REAL NULL, " << columnBaseName(column->id()) << "_INT INT NULL"; + + statements << ");"; + + runStatements(statements.str()); +} + int DatabaseInterface::columnGetDataSetId(int columnId) { JASPTIMER_SCOPE(DatabaseInterface::columnGetDataSetId); @@ -1438,19 +1458,19 @@ void DatabaseInterface::_runStatements(const std::string & statements, bindParam } while(remain > 1 && (ret == SQLITE_OK && ret != SQLITE_DONE)); + const int maxLenStatementError = 200; + std::string shortStatements = statements.size() <= maxLenStatementError ? statements : statements.substr(0, maxLenStatementError); + if(ret == SQLITE_ERROR) { - std::string errorMsg = "Running ```\n"+statements+"\n``` failed because of: `" + sqlite3_errmsg(_db); - Log::log() << errorMsg << std::endl; - - throw std::runtime_error(errorMsg); + Log::log() << "Running ```\n"+statements +"\n``` failed because of: `" + sqlite3_errmsg(_db) << std::endl; + throw std::runtime_error( "Running ```\n"+shortStatements +"\n``` failed because of: `" + sqlite3_errmsg(_db)); } if(ret == SQLITE_READONLY) { - std::string errorMsg = "Running ```\n"+statements+"\n``` failed because the database is readonly..."; - Log::log() << errorMsg << std::endl; - throw std::runtime_error(errorMsg); + Log::log() << "Running ```\n"+statements +"\n``` failed because the database is readonly..." << std::endl; + throw std::runtime_error( "Running ```\n"+shortStatements +"\n``` failed because the database is readonly..."); } } @@ -1570,7 +1590,8 @@ void DatabaseInterface::create() else Log::log() << "Opened internal sqlite database for creation at '" << dbFile() << "'." << std::endl; - + dbStartUpPragmas(); + transactionWriteBegin(); runStatements(_dbConstructionSql); transactionWriteEnd(); @@ -1593,6 +1614,14 @@ void DatabaseInterface::load() } else Log::log() << "Opened internal sqlite database for loading at '" << dbFile() << "'." << std::endl; + + dbStartUpPragmas(); +} + +void DatabaseInterface::dbStartUpPragmas() +{ + runStatements("pragma journal_mode = WAL;"); + runStatements("pragma synchronous = normal;"); } void DatabaseInterface::close() diff --git a/CommonData/databaseinterface.h b/CommonData/databaseinterface.h index b4fdfad644..98dfaed722 100644 --- a/CommonData/databaseinterface.h +++ b/CommonData/databaseinterface.h @@ -87,6 +87,7 @@ class DatabaseInterface int dataSetGetRevision( int dataSetId); int dataSetGetFilter( int dataSetId); void dataSetInsertEmptyRow( int dataSetId, size_t row); + void dataSetCreateTable( DataSet * dataSet); ///< Assumes you are importing fresh data and havent created any DataSet_? table yet void dataSetBatchedValuesUpdate(DataSet * data, std::vector columns, std::function progressCallback = [](float){}); void dataSetBatchedValuesUpdate(DataSet * data, std::function progressCallback = [](float){}); @@ -109,7 +110,7 @@ class DatabaseInterface //Columns & Data/Values //Index stuff: - int columnInsert( int dataSetId, int index = -1, const std::string & name = "", columnType colType = columnType::unknown); ///< Insert a row into Columns and create the corresponding columns in DataSet_? Also makes sure the indices are correct + int columnInsert( int dataSetId, int index = -1, const std::string & name = "", columnType colType = columnType::unknown, bool alterTable=true); ///< Insert a row into Columns and create the corresponding columns in DataSet_? Also makes sure the indices are correct int columnLastFreeIndex( int dataSetId); void columnIndexIncrements( int dataSetId, int index); ///< If index already is in use that column and all after are incremented by 1 void columnIndexDecrements( int dataSetId, int index); ///< Indices bigger than index are decremented, assumption is that the previous one using it has been removed already @@ -158,6 +159,7 @@ class DatabaseInterface void transactionReadBegin(); ///< runs BEGIN DEFERRED and waits for sqlite to not be busy anymore if some other process is writing Tracks whether nested and only does BEGIN+COMMIT at lowest depth void transactionReadEnd(); ///< runs COMMIT and ends the transaction. Tracks whether nested and only does BEGIN+COMMIT at lowest depth + private: void _doubleTroubleBinder(sqlite3_stmt *stmt, int param, double dbl); ///< Needed to work around the lack of support for NAN, INF and NEG_INF in sqlite, converts those to string to make use of sqlite flexibility double _doubleTroubleReader(sqlite3_stmt *stmt, int colI); ///< The reading counterpart to _doubleTroubleBinder to convert string representations of NAN, INF and NEG_INF back to double @@ -168,6 +170,7 @@ class DatabaseInterface void load(); ///< Loads a sqlite database from sessiondir (after loading a jaspfile) void close(); ///< Closes the loaded database and disconnects bool tableHasColumn(const std::string & tableName, const std::string & columnName); + void dbStartUpPragmas(); int _transactionWriteDepth = 0, _transactionReadDepth = 0; diff --git a/CommonData/dataset.cpp b/CommonData/dataset.cpp index 5dde9073e4..59f82d2301 100644 --- a/CommonData/dataset.cpp +++ b/CommonData/dataset.cpp @@ -59,6 +59,7 @@ void DataSet::dbDelete() _dataSetID = -1; + db().transactionWriteEnd(); } @@ -171,12 +172,12 @@ void DataSet::removeColumn(const std::string & name) } } -void DataSet::insertColumn(size_t index) +void DataSet::insertColumn(size_t index, bool alterDataSetTable) { assert(_dataSetID > 0); - Column * newColumn = new Column(this, db().columnInsert(_dataSetID, index)); + Column * newColumn = new Column(this, db().columnInsert(_dataSetID, index, "", columnType::unknown, alterDataSetTable)); _columns.insert(_columns.begin()+index, newColumn); @@ -382,18 +383,24 @@ void DataSet::setColumnCount(size_t colCount) db().transactionWriteBegin(); int curCount = columns().size(); + + bool alterTableAfterwards = curCount == 0 && colCount > 0; if(colCount > curCount) for(size_t i=curCount; i=colCount; i--) removeColumn(i); + incRevision(); db().transactionWriteEnd(); + + if(alterTableAfterwards) + db().dataSetCreateTable(this); } void DataSet::setRowCount(size_t rowCount) diff --git a/CommonData/dataset.h b/CommonData/dataset.h index 62f5bacffc..04d59b3252 100644 --- a/CommonData/dataset.h +++ b/CommonData/dataset.h @@ -40,11 +40,11 @@ class DataSet : public DataSetBaseNode void beginBatchedToDB(); void endBatchedToDB(std::function progressCallback = [](float){}, Columns columns={}); void endBatchedToDB(Columns columns) { endBatchedToDB([](float){}, columns); } - + void removeColumn( const std::string & name ); void removeColumn( size_t index ); void removeColumnById( size_t id ); - void insertColumn( size_t index ); + void insertColumn( size_t index, bool alterDataSetTable = true); Column * newColumn( const std::string & name); int getColumnIndex( const std::string & name ) const; int columnIndex( const Column * col ) const; From 63b8cefdd5c93426b7c46c7bc8faa29832c4a0df Mon Sep 17 00:00:00 2001 From: bruno boutin Date: Wed, 4 Sep 2024 11:35:18 +0200 Subject: [PATCH 29/70] Add New in Menu (#5650) * Add New in Menu --- Desktop/data/asyncloader.cpp | 5 +++++ Desktop/data/fileevent.h | 2 +- Desktop/main.cpp | 17 ++++++-------- Desktop/mainwindow.cpp | 23 +++++++++++++++---- Desktop/mainwindow.h | 2 ++ Desktop/modules/ribbonmodel.cpp | 2 +- Desktop/modules/ribbonmodel.h | 3 +-- Desktop/utilities/application.cpp | 26 +++++++++++++++------- Desktop/utilities/application.h | 2 +- Desktop/widgets/filemenu/actionbuttons.cpp | 1 + Desktop/widgets/filemenu/actionbuttons.h | 2 +- Desktop/widgets/filemenu/filemenu.cpp | 13 +++++++++++ Desktop/widgets/filemenu/filemenu.h | 1 + 13 files changed, 71 insertions(+), 28 deletions(-) diff --git a/Desktop/data/asyncloader.cpp b/Desktop/data/asyncloader.cpp index 41851948ec..11b13fcfa7 100644 --- a/Desktop/data/asyncloader.cpp +++ b/Desktop/data/asyncloader.cpp @@ -44,6 +44,11 @@ void AsyncLoader::io(FileEvent *event) switch (event->operation()) { + case FileEvent::FileNew: + emit progress(tr("Loading New Data Set"), 0); + emit beginLoad(event); + break; + case FileEvent::FileOpen: emit progress(tr("Loading Data Set"), 0); emit beginLoad(event); diff --git a/Desktop/data/fileevent.h b/Desktop/data/fileevent.h index 5bd0f8329b..548db9adc1 100644 --- a/Desktop/data/fileevent.h +++ b/Desktop/data/fileevent.h @@ -33,7 +33,7 @@ class FileEvent : public QObject Q_OBJECT public: - enum FileMode { FileSave, FileOpen, FileExportResults, FileExportData, FileGenerateData, FileSyncData, FileClose }; + enum FileMode { FileSave, FileNew, FileOpen, FileExportResults, FileExportData, FileGenerateData, FileSyncData, FileClose }; FileEvent(QObject *parent = nullptr, FileMode fileMode = FileEvent::FileOpen); virtual ~FileEvent(); diff --git a/Desktop/main.cpp b/Desktop/main.cpp index 106b6ab107..6ab2a84578 100644 --- a/Desktop/main.cpp +++ b/Desktop/main.cpp @@ -121,7 +121,7 @@ bool runJaspEngineJunctionFixer(int argc, char *argv[], bool removeJunctions = f #endif -void parseArguments(int argc, char *argv[], std::string & filePath, bool & unitTest, bool & dirTest, int & timeOut, bool & save, bool & logToFile, bool & hideJASP, bool & safeGraphics, Json::Value & dbJson, QString & reportingDir) +void parseArguments(int argc, char *argv[], std::string & filePath, bool & newData, bool & unitTest, bool & dirTest, int & timeOut, bool & save, bool & logToFile, bool & hideJASP, bool & safeGraphics, Json::Value & dbJson, QString & reportingDir) { filePath = ""; unitTest = false; @@ -130,6 +130,7 @@ void parseArguments(int argc, char *argv[], std::string & filePath, bool & unitT logToFile = false; hideJASP = false; safeGraphics = false; + newData = false; reportingDir = ""; timeOut = 10; dbJson = Json::nullValue; @@ -145,6 +146,7 @@ void parseArguments(int argc, char *argv[], std::string & filePath, bool & unitT else if(args[arg] == "--logToFile") logToFile = true; else if(args[arg] == "--hide") hideJASP = true; else if(args[arg] == "--safeGraphics") safeGraphics = true; + else if(args[arg] == "--newData") newData = true; #ifdef _WIN32 else if(args[arg] == junctionArg) runJaspEngineJunctionFixer(argc, argv, false); //Run the junctionfixer, it will exit the application btw! else if(args[arg] == removeJunctionsArg) runJaspEngineJunctionFixer(argc, argv, true); //Remove the junctions @@ -408,7 +410,8 @@ int main(int argc, char *argv[]) save, logToFile, hideJASP, - safeGraphics; + safeGraphics, + newData; int timeOut; Json::Value dbJson; @@ -416,7 +419,7 @@ int main(int argc, char *argv[]) QCoreApplication::setOrganizationDomain("jasp-stats.org"); QCoreApplication::setApplicationName("JASP"); - parseArguments(argc, argv, filePath, unitTest, dirTest, timeOut, save, logToFile, hideJASP, safeGraphics, dbJson, reportingDir); + parseArguments(argc, argv, filePath, newData, unitTest, dirTest, timeOut, save, logToFile, hideJASP, safeGraphics, dbJson, reportingDir); if(safeGraphics) Settings::setValue(Settings::SAFE_GRAPHICS_MODE, true); else safeGraphics = Settings::value(Settings::SAFE_GRAPHICS_MODE).toBool(); @@ -448,12 +451,6 @@ int main(int argc, char *argv[]) args.push_back("minimal"); } - if(hideJASP) - { - args.push_back("-platform"); - args.push_back("minimal"); - } - PlotSchemeHandler::createUrlScheme(); //Needs to be done *before* creating PlotSchemeHandler instance and also before QApplication is instantiated ImgSchemeHandler::createUrlScheme(); @@ -526,7 +523,7 @@ int main(int argc, char *argv[]) msgBox->hide(); } #endif - a.init(filePathQ, unitTest, timeOut, save, logToFile, dbJson, reportingDir); + a.init(filePathQ, newData, unitTest, timeOut, save, logToFile, dbJson, reportingDir); try { diff --git a/Desktop/mainwindow.cpp b/Desktop/mainwindow.cpp index 88c4c07f14..e3ea97c017 100644 --- a/Desktop/mainwindow.cpp +++ b/Desktop/mainwindow.cpp @@ -552,7 +552,6 @@ void MainWindow::makeConnections() connect(_ribbonModel, &RibbonModel::analysisClickedSignal, _analyses, &Analyses::analysisClickedHandler ); connect(_ribbonModel, &RibbonModel::showRCommander, this, &MainWindow::showRCommander ); - connect(_ribbonModel, &RibbonModel::generateEmptyData, _package, &DataSetPackage::generateEmptyData ); connect(_ribbonModel, &RibbonModel::dataModeChanged, _package, &DataSetPackage::dataModeChanged ); connect(_ribbonModel, &RibbonModel::setDataSynchronisation, _package, &DataSetPackage::setSynchingExternallyFriendly ); @@ -727,7 +726,7 @@ void MainWindow::loadQML() connect(_ribbonModel, &RibbonModel::dataUndo, DataSetView::mainDataViewer(), &DataSetView::undo); connect(_ribbonModel, &RibbonModel::dataRedo, DataSetView::mainDataViewer(), &DataSetView::redo); connect(this, &MainWindow::resizeData, DataSetView::mainDataViewer(), &DataSetView::resizeData); - + connect(_ribbonModel, &RibbonModel::showNewData, this, &MainWindow::showNewData); //connect(DataSetView::lastInstancedDataSetView(), &DataSetView::selectionStartChanged, _columnModel, &ColumnModel::changeSelectedColumn); @@ -902,6 +901,11 @@ void MainWindow::open(QString filepath) else _openOnLoadFilename = filepath; } +void MainWindow::showNewData() +{ + _package->generateEmptyData(); + _ribbonModel->showData(); +} void MainWindow::open(const Json::Value & dbJson) { @@ -1175,7 +1179,14 @@ void MainWindow::connectFileEventCompleted(FileEvent * event) void MainWindow::dataSetIORequestHandler(FileEvent *event) { - if (event->operation() == FileEvent::FileOpen) + if (event->operation() == FileEvent::FileNew) + { + if (_package->isLoaded()) + QProcess::startDetached(QCoreApplication::applicationFilePath(), QStringList("--newData")); + else + showNewData(); + } + else if (event->operation() == FileEvent::FileOpen) { if (_package->isLoaded()) { @@ -1301,7 +1312,10 @@ void MainWindow::dataSetIOCompleted(FileEvent *event) { hideProgress(); - if (event->operation() == FileEvent::FileOpen) + if (event->operation() == FileEvent::FileNew) + { + } + else if (event->operation() == FileEvent::FileOpen) { if (event->isSuccessful()) { @@ -1467,6 +1481,7 @@ void MainWindow::qmlLoaded() { Log::log() << "MainWindow::qmlLoaded()" << std::endl; _qmlLoaded = true; + emit qmlLoadedChanged(); handleDeferredFileLoad(); } diff --git a/Desktop/mainwindow.h b/Desktop/mainwindow.h index 87cc37c94a..3f3deb1bca 100644 --- a/Desktop/mainwindow.h +++ b/Desktop/mainwindow.h @@ -102,6 +102,7 @@ class MainWindow : public QObject static MainWindow * singleton() { return _singleton; } + void showNewData(); void open(QString filepath); void open(const Json::Value & dbJson); void testLoadedJaspFile(int timeOut, bool save); @@ -249,6 +250,7 @@ public slots: void communityVisibleChanged(); void contactTextChanged(); void resizeData(int row, int col); + void qmlLoadedChanged(); private slots: void resultsPageLoaded(); diff --git a/Desktop/modules/ribbonmodel.cpp b/Desktop/modules/ribbonmodel.cpp index 8d20f5168e..be7cba2e13 100644 --- a/Desktop/modules/ribbonmodel.cpp +++ b/Desktop/modules/ribbonmodel.cpp @@ -147,7 +147,7 @@ void RibbonModel::addSpecialRibbonButtonsEarly() _analysesButton = new RibbonButton(this, "Analyses", fq(tr("Analyses")), "JASP_logo_green.svg", false, [&](){ emit finishCurrentEdit(); emit showStatistics(); }, fq(tr("Switch JASP to analyses mode")), true); _dataSwitchButton = new RibbonButton(this, "Data", fq(tr("Edit Data")), "data-button.svg", false, [&](){ emit showData(); }, fq(tr("Switch JASP to data editing mode")), false, false, false); - _dataNewButton = new RibbonButton(this, "Data-New", fq(tr("New Data")), "data-button-new.svg", false, [&](){ emit genShowEmptyData(); }, fq(tr("Open a workspace without data")), true, false, false); + _dataNewButton = new RibbonButton(this, "Data-New", fq(tr("New Data")), "data-button-new.svg", false, [&](){ emit showNewData(); }, fq(tr("Open a workspace without data")), true, false, false); _dataResizeButton = new RibbonButton(this, "Data-Resize", fq(tr("Resize Data")), "data-button-resize.svg", false, [&](){ emit resizeData(); }, fq(tr("Resize your dataset")), false); _insertButton = new RibbonButton(this, "Data-Insert", fq(tr("Insert")), "data-button-insert.svg", _entriesInsert, fq(tr("Insert empty columns or rows"))); _removeButton = new RibbonButton(this, "Data-Remove", fq(tr("Remove")), "data-button-erase.svg", _entriesDelete, fq(tr("Remove columns or rows"))); diff --git a/Desktop/modules/ribbonmodel.h b/Desktop/modules/ribbonmodel.h index 94aceea947..c4634b86da 100644 --- a/Desktop/modules/ribbonmodel.h +++ b/Desktop/modules/ribbonmodel.h @@ -72,7 +72,6 @@ class RibbonModel : public QAbstractListModel void setDataMode(bool data); Q_INVOKABLE void showData() { setCurrentRow(int(RowType::Data)); } Q_INVOKABLE void showStatistics() { setCurrentRow(int(RowType::Analyses)); } - void genShowEmptyData() { generateEmptyData(); showData(); } void removeRibbonButtonModel(std::string moduleName); @@ -105,7 +104,6 @@ class RibbonModel : public QAbstractListModel void invalidateFilterModel(); void currentRowChanged(); void dataLoadedChanged(bool loaded); - void generateEmptyData(); void dataModeChanged(bool dataMode); void startExternalEdit(); void stopExternalEdit(); @@ -124,6 +122,7 @@ class RibbonModel : public QAbstractListModel void cellsClear(); void dataUndo(); void dataRedo(); + void showNewData(); public slots: void addRibbonButtonModelFromDynamicModule(Modules::DynamicModule * module); diff --git a/Desktop/utilities/application.cpp b/Desktop/utilities/application.cpp index d83da04d65..6486939dc1 100644 --- a/Desktop/utilities/application.cpp +++ b/Desktop/utilities/application.cpp @@ -25,7 +25,7 @@ #include "utilities/settings.h" #include -void Application::init(QString filePath, bool unitTest, int timeOut, bool save, bool logToFile, const Json::Value & dbJson, QString reportingPath) +void Application::init(QString filePath, bool newData, bool unitTest, int timeOut, bool save, bool logToFile, const Json::Value & dbJson, QString reportingPath) { std::cout << "Application init entered" << std::endl; @@ -36,14 +36,24 @@ void Application::init(QString filePath, bool unitTest, int timeOut, bool save, _mainWindow = new MainWindow(this); - if(unitTest) - _mainWindow->testLoadedJaspFile(timeOut, save); + connect(_mainWindow, &MainWindow::qmlLoadedChanged, this, [=]() { + // The QML files are not yet laoded when MainWindow is just created (loadQML is called via a QTmer::singleShot) + // But to correctly work, the following calls need the QML files to be loaded. + if (newData) + _mainWindow->showNewData(); + else + { + if(unitTest) + _mainWindow->testLoadedJaspFile(timeOut, save); - if(filePath.size() > 0) - _mainWindow->open(filePath); - - if(!dbJson.isNull()) - _mainWindow->open(dbJson); + if(filePath.size() > 0) + _mainWindow->open(filePath); + + if(!dbJson.isNull()) + _mainWindow->open(dbJson); + } + + }); if(reportingPath != "") _mainWindow->reportHere(reportingPath); diff --git a/Desktop/utilities/application.h b/Desktop/utilities/application.h index d8585440b9..3fd8f52d41 100644 --- a/Desktop/utilities/application.h +++ b/Desktop/utilities/application.h @@ -34,7 +34,7 @@ class Application : public QApplication virtual bool notify(QObject *receiver, QEvent *event) OVERRIDE; virtual bool event(QEvent *event) OVERRIDE; - void init(QString filePath, bool unitTest, int timeOut, bool save, bool logToFile, const Json::Value & dbJson, QString reportingPath); + void init(QString filePath, bool newData, bool unitTest, int timeOut, bool save, bool logToFile, const Json::Value & dbJson, QString reportingPath); signals: diff --git a/Desktop/widgets/filemenu/actionbuttons.cpp b/Desktop/widgets/filemenu/actionbuttons.cpp index 889aa9f8ec..5f358f3a85 100644 --- a/Desktop/widgets/filemenu/actionbuttons.cpp +++ b/Desktop/widgets/filemenu/actionbuttons.cpp @@ -22,6 +22,7 @@ void ActionButtons::loadButtonData() _data = { + {FileOperation::New, tr("New"), true, {} }, {FileOperation::Open, tr("Open"), true, {ResourceButtons::Computer, ResourceButtons::OSF, ResourceButtons::Database, ResourceButtons::RecentFiles, ResourceButtons::DataLibrary } }, {FileOperation::Save, tr("Save"), false, {} }, {FileOperation::SaveAs, tr("Save As"), false, {ResourceButtons::Computer, ResourceButtons::OSF } }, diff --git a/Desktop/widgets/filemenu/actionbuttons.h b/Desktop/widgets/filemenu/actionbuttons.h index ec3dc12809..ed0cb2fc56 100644 --- a/Desktop/widgets/filemenu/actionbuttons.h +++ b/Desktop/widgets/filemenu/actionbuttons.h @@ -13,7 +13,7 @@ class ActionButtons : public QAbstractListModel Q_PROPERTY(int width READ width WRITE setWidth NOTIFY widthChanged ) public: - enum FileOperation {None = 0, Open, Save, SaveAs, ExportResults, ExportData, SyncData, Close, Preferences, Contact, Community, About}; + enum FileOperation {None = 0, New, Open, Save, SaveAs, ExportResults, ExportData, SyncData, Close, Preferences, Contact, Community, About}; Q_ENUM(FileOperation) struct DataRow { FileOperation operation; QString name; bool enabled; std::set resourceButtons; }; diff --git a/Desktop/widgets/filemenu/filemenu.cpp b/Desktop/widgets/filemenu/filemenu.cpp index f6702aa28c..c044de713d 100644 --- a/Desktop/widgets/filemenu/filemenu.cpp +++ b/Desktop/widgets/filemenu/filemenu.cpp @@ -47,6 +47,7 @@ FileMenu::FileMenu(QObject *parent) : QObject(parent) connect(_resourceButtons, &ResourceButtons::selectedButtonChanged, this, &FileMenu::resourceButtonClicked ); connect(_currentDataFile, &CurrentDataFile::setCheckAutomaticSync, _mainWindow, &MainWindow::setCheckAutomaticSync ); + _actionButtons->setEnabled(ActionButtons::New, true); _actionButtons->setEnabled(ActionButtons::Open, true); _actionButtons->setEnabled(ActionButtons::Save, false); _actionButtons->setEnabled(ActionButtons::SaveAs, false); @@ -116,6 +117,15 @@ FileEvent *FileMenu::saveAs() return _computer->browseSave(); } +FileEvent *FileMenu::newData() +{ + FileEvent *event = new FileEvent(this, FileEvent::FileNew); + + dataSetIORequestHandler(event); + + return event; +} + FileEvent *FileMenu::save() { FileEvent *event = nullptr; @@ -410,6 +420,9 @@ void FileMenu::actionButtonClicked(const ActionButtons::FileOperation action) else setMode(FileEvent::FileSave); break; + case ActionButtons::FileOperation::New: + newData(); + break; case ActionButtons::FileOperation::About: setVisible(false); diff --git a/Desktop/widgets/filemenu/filemenu.h b/Desktop/widgets/filemenu/filemenu.h index 85495c67e5..ae4719bc6c 100644 --- a/Desktop/widgets/filemenu/filemenu.h +++ b/Desktop/widgets/filemenu/filemenu.h @@ -71,6 +71,7 @@ class FileMenu : public QObject void setResourceButtonsVisibleFor(FileOperation fo); void setOnlineDataManager(OnlineDataManager *odm); + FileEvent * newData(); FileEvent * open(const QString &filepath); FileEvent * open(const Json::Value & databaseInfo); FileEvent * save(); From acc0d0a40af5eb852c26592ca04901835308e62d Mon Sep 17 00:00:00 2001 From: Shun Wang Date: Tue, 3 Sep 2024 14:02:34 +0000 Subject: [PATCH 30/70] fix note editor image delect behavior --- Desktop/html/js/jaspNotes.js | 37 ++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/Desktop/html/js/jaspNotes.js b/Desktop/html/js/jaspNotes.js index 5fab5b553b..5ba081a339 100644 --- a/Desktop/html/js/jaspNotes.js +++ b/Desktop/html/js/jaspNotes.js @@ -30,12 +30,36 @@ if (insideJASP) { // using https://github.com/Fandom-OSS/quill-blot-formatter to format image Quill.register('modules/blotFormatter', QuillBlotFormatter.default); + + // custom delet behaviors becaus of https://github.com/jasp-stats/jasp-issues/issues/2776 + class _CustomDeleteAction extends QuillBlotFormatter.DeleteAction { + constructor(formatter) { + super(formatter); + } + + onKeyUp = (e) => { + if (!this.formatter.currentSpec) + return; + + if (e.key === 'Backspace' || e.key === 'Delete') { + const blot = Quill.find(this.formatter.currentSpec.getTargetElement()); + if (blot) + blot.deleteAt(0); + this.formatter.hide(); + } + }; + } + class _CustomImageSpec extends QuillBlotFormatter.ImageSpec { constructor(formatter) { super(formatter); this.img = null; } + getActions() { + return [QuillBlotFormatter.AlignAction, QuillBlotFormatter.ResizeAction, _CustomDeleteAction]; + } + onClick = (event) => { const el = event.target; @@ -45,6 +69,11 @@ if (insideJASP) { this.img = el; this.formatter.show(this); + + const $thisOverlay = $(this.formatter.overlay); + // auto show/hide image editor toolbar with mouse action + $thisOverlay.on("mouseenter", () => { $thisOverlay.show() }).on("mouseleave", () => { $thisOverlay.hide() }); + $(this.img).on( "mouseenter", () => { $thisOverlay.show() }).on("mouseleave", () => { $thisOverlay.hide() }); }; } var CustomImageSpec = _CustomImageSpec @@ -491,14 +520,6 @@ JASPWidgets.NoteBox = JASPWidgets.View.extend({ self.oldBlot = self.formulaBlot // Get legacy formula range to remove while save }); - ////--- Image resizer ---//// - let $imgBlot = this.$el.find('.ql-editor p img'); - let $blotResizer = this.$el.find('.blot-formatter__overlay'); - let $resizeHandles = this.$el.find('[class^="blot-formatter"]'); - - $blotResizer.on("mouseenter", () => { $resizeHandles.show() }).on("mouseleave", () => { $resizeHandles.hide() }); - $imgBlot.on( "mouseenter", () => { $resizeHandles.show() }).on("mouseleave", () => { $resizeHandles.hide() }); - }); quillEditorElement.addEventListener('focusin', () => { From a37d96d0ece0af659dff88476b7e4ab6155d131b Mon Sep 17 00:00:00 2001 From: Joris Goosen Date: Wed, 4 Sep 2024 15:29:42 +0200 Subject: [PATCH 31/70] Using lambda to define titles and tooltips allows for dynamic translations in "special ribbonbuttons" (#5653) Fixes jasp-stats/INTERNAL-jasp#2372 without the need for destroying and recreating buttons --- Desktop/modules/analysisentry.cpp | 4 +- Desktop/modules/analysisentry.h | 33 +++++++-------- Desktop/modules/ribbonbutton.cpp | 24 ++++++----- Desktop/modules/ribbonbutton.h | 52 ++++++++++++------------ Desktop/modules/ribbonmodel.cpp | 67 ++++++++++++++++--------------- Desktop/modules/ribbonmodel.h | 2 +- 6 files changed, 97 insertions(+), 85 deletions(-) diff --git a/Desktop/modules/analysisentry.cpp b/Desktop/modules/analysisentry.cpp index 95d5598aff..fdfcbbe6e2 100644 --- a/Desktop/modules/analysisentry.cpp +++ b/Desktop/modules/analysisentry.cpp @@ -23,8 +23,8 @@ namespace Modules { -AnalysisEntry::AnalysisEntry(std::function specialFunc, std::string internalTitle, std::string menuTitle, bool requiresData, std::string icon) - : _title(internalTitle), _function(internalTitle), _menu(menuTitle), _isSeparator(false), _isGroupTitle(!specialFunc), _requiresData(requiresData), _icon(icon), _specialFunc(specialFunc) +AnalysisEntry::AnalysisEntry(std::function specialFunc, std::string internalTitle, std::function menuTitleF, bool requiresData, std::string icon) + : _title(internalTitle), _function(internalTitle), _menuF(menuTitleF), _isSeparator(false), _isGroupTitle(!specialFunc), _requiresData(requiresData), _icon(icon), _specialFunc(specialFunc) {} AnalysisEntry::AnalysisEntry(std::string menuTitle, std::string icon, bool smallIcon) diff --git a/Desktop/modules/analysisentry.h b/Desktop/modules/analysisentry.h index cc773ebf2e..3545861925 100644 --- a/Desktop/modules/analysisentry.h +++ b/Desktop/modules/analysisentry.h @@ -39,12 +39,12 @@ class AnalysisEntry { friend EntryBase; public: - AnalysisEntry(std::function specialFunc, std::string internalTitle, std::string menuTitle, bool requiresData=true, std::string icon = ""); ///< AnalysisEntry with a callbackfunction to JASP, if !specialFunc then a grouptitle + AnalysisEntry(std::function specialFunc, std::string internalTitle, std::function menuTitleF, bool requiresData=true, std::string icon = ""); ///< AnalysisEntry with a callbackfunction to JASP, if !specialFunc then a grouptitle AnalysisEntry(std::string menuTitle, std::string icon = "", bool small=false); ///< AnalysisEntry grouptitle AnalysisEntry(Json::Value & analysisEntry, DynamicModule * dynamicModule, bool defaultRequiresData = true); ///< AnalysisEntry from a modules Description.qml AnalysisEntry(); ///< AnalysisEntry separator - std::string menu() const { return _menu; } + std::string menu() const { return _menuF ? _menuF() : _menu; } std::string title() const { return _title; } std::string function() const { return _function; } std::string qml() const { return _qml != "" ? _qml : _function + ".qml"; } @@ -75,20 +75,21 @@ class AnalysisEntry static bool requiresDataEntries(const AnalysisEntries & entries); private: - std::string _title = "???" , - _function = "???" , - _qml = "???" , - _menu = "???" , - _icon = "" ; - DynamicModule* _dynamicModule = nullptr ; - bool _isSeparator = true , - _isGroupTitle = false , - _isAnalysis = false , - _isEnabled = true , - _requiresData = true , - _hasWrapper = false , - _smallIcon = false ; - std::function _specialFunc = nullptr ; + std::string _title = "???" , + _function = "???" , + _qml = "???" , + _menu = "???" , + _icon = "" ; + DynamicModule* _dynamicModule = nullptr ; + bool _isSeparator = true , + _isGroupTitle = false , + _isAnalysis = false , + _isEnabled = true , + _requiresData = true , + _hasWrapper = false , + _smallIcon = false ; + std::function _specialFunc = nullptr ; + std::function _menuF = nullptr ; //To make it translatable }; } diff --git a/Desktop/modules/ribbonbutton.cpp b/Desktop/modules/ribbonbutton.cpp index ed9c558c7a..1d8ccdca65 100644 --- a/Desktop/modules/ribbonbutton.cpp +++ b/Desktop/modules/ribbonbutton.cpp @@ -17,7 +17,6 @@ // #include "ribbonbutton.h" -#include "enginedefinitions.h" #include "modules/dynamicmodule.h" #include "modules/analysisentry.h" #include "utilities/qutils.h" @@ -49,14 +48,14 @@ RibbonButton::RibbonButton(QObject *parent, DynamicModule * module) : QObject(p bindYourself(); } -RibbonButton::RibbonButton(QObject *parent, std::string name, std::string title, std::string icon, bool requiresData, std::function justThisFunction, std::string toolTip, bool enabled, bool remember, bool defaultActiveBinding) +RibbonButton::RibbonButton(QObject *parent, std::string name, std::function titleF, std::string icon, bool requiresData, std::function justThisFunction, std::function toolTipF, bool enabled, bool remember, bool defaultActiveBinding) : QObject(parent), _enabled(enabled), _defaultActiveBinding(defaultActiveBinding), _remember(remember), _special(true), _module(nullptr), _specialButtonFunc(justThisFunction) { _menuModel = new MenuModel(this); setModuleName(name); - setTitle(title); - setToolTip(tq(toolTip)); + _titleF = titleF; + _toolTipF = toolTipF; setIconSource(tq(icon)); setRequiresData(requiresData); //setRequiresData because setMenu changes it based on the menu entries, but that doesnt work for this special dummy @@ -64,16 +63,16 @@ RibbonButton::RibbonButton(QObject *parent, std::string name, std::string title, bindYourself(); } -RibbonButton::RibbonButton(QObject *parent, std::string name, std::string title, std::string icon, Modules::AnalysisEntries * funcEntries, std::string toolTip, bool enabled, bool remember, bool defaultActiveBinding) +RibbonButton::RibbonButton(QObject *parent, std::string name, std::function titleF, std::string icon, Modules::AnalysisEntries * funcEntries, std::function toolTipF, bool enabled, bool remember, bool defaultActiveBinding) : QObject(parent), _enabled(enabled), _defaultActiveBinding(defaultActiveBinding), _remember(remember), _special(true), _module(nullptr) { _menuModel = new MenuModel(this, funcEntries); setRequiresData(AnalysisEntry::requiresDataEntries(*funcEntries)); setModuleName(name); - setTitle(title); + _titleF = titleF; + _toolTipF = toolTipF; setIconSource(tq(icon)); - setToolTip(tq(toolTip)); bindYourself(); } @@ -150,8 +149,6 @@ void RibbonButton::setReady(bool ready) setEnabled(true); } - - RibbonButton::~RibbonButton() { @@ -291,6 +288,15 @@ void RibbonButton::setToolTip(QString toolTip) emit toolTipChanged(_toolTip); } +void RibbonButton::setToolTipF(std::function toolTipF) +{ + if ((!_toolTipF && !toolTipF) || (_toolTipF && toolTipF && _toolTipF() == toolTipF())) + return; + + _toolTipF = toolTipF; + emit toolTipChanged(_toolTipF()); +} + bool RibbonButton::separator() const { return _separator; diff --git a/Desktop/modules/ribbonbutton.h b/Desktop/modules/ribbonbutton.h index c168e21f74..6c90bcab19 100644 --- a/Desktop/modules/ribbonbutton.h +++ b/Desktop/modules/ribbonbutton.h @@ -56,15 +56,15 @@ class RibbonButton : public QObject RibbonButton(QObject *parent); RibbonButton(QObject *parent, Modules::DynamicModule * module); - RibbonButton(QObject *parent, std::string name, std::string title, std::string icon, bool requiresData, std::function justThisFunction, std::string toolTip = "", bool enabled = true, bool remember = false, bool defaultActiveBinding = true); - RibbonButton(QObject *parent, std::string name, std::string title, std::string icon, Modules::AnalysisEntries * funcEntries, std::string toolTip = "", bool enabled = true, bool remember = false, bool defaultActiveBinding = true); + RibbonButton(QObject *parent, std::string name, std::function titleF, std::string icon, bool requiresData, std::function justThisFunction, std::function toolTipF = [](){return "";}, bool enabled = true, bool remember = false, bool defaultActiveBinding = true); + RibbonButton(QObject *parent, std::string name, std::function titleF, std::string icon, Modules::AnalysisEntries * funcEntries, std::function toolTipF = [](){return "";}, bool enabled = true, bool remember = false, bool defaultActiveBinding = true); ~RibbonButton(); bool requiresData() const { return _requiresData; } bool isCommon() const { return _isCommonModule; } - std::string title() const { return _title; } - QString titleQ() const { return QString::fromStdString(_title); } + std::string title() const { return _titleF ? _titleF() : _title; } + QString titleQ() const { return QString::fromStdString(title()); } QString iconSource() const { return _iconSource; } bool enabled() const { return _enabled; } std::string name() const { return _name; } @@ -75,7 +75,7 @@ class RibbonButton : public QObject stringvec getAllEntries() const; bool dataLoaded() const { return Modules::DynamicModules::dynMods() && Modules::DynamicModules::dynMods()->dataLoaded(); } bool active() const { return _active; } - QString toolTip() const { return _toolTip; } + QString toolTip() const { return _toolTipF ? _toolTipF() : _toolTip; } bool isBundled() const { return _module && _module->isBundled(); } QString version() const { return !_module ? "?" : _module->versionQ(); } bool ready() const { return _ready; } @@ -83,31 +83,31 @@ class RibbonButton : public QObject bool remember() const { return _remember; } bool isSpecial() const { return _special; } - static QString getJsonDescriptionFilename(); + static QString getJsonDescriptionFilename(); bool separator() const; void setSeparator(bool newSeparator); + public slots: - void setDynamicModule(Modules::DynamicModule * module); - void setRequiresData(bool requiresData); - void setIsCommon(bool isCommonModule); - void setTitle(std::string title); - void setTitleQ(QString title) { setTitle(title.toStdString()); } - void setIconSource(QString iconSource); - void setEnabled(bool enabled); - void setModuleName(std::string moduleName); - void setModuleNameQ(QString moduleName) { setModuleName(moduleName.toStdString()); } - void somePropertyChanged() { emit iChanged(this); } - void setToolTip(QString toolTip); - void setReady(bool ready); - void setError(bool error); - void setRemember(bool remember); - void setActive(bool active); - - - void runSpecial(QString func);; - void reloadDynamicModule(Modules::DynamicModule * dynMod); + void setDynamicModule( Modules::DynamicModule * module); + void setRequiresData( bool requiresData); + void setIsCommon( bool isCommonModule); + void setTitle( std::string title); + void setTitleQ( QString title) { setTitle(title.toStdString()); } + void setIconSource( QString iconSource); + void setEnabled( bool enabled); + void setModuleName( std::string moduleName); + void setModuleNameQ( QString moduleName) { setModuleName(moduleName.toStdString()); } + void somePropertyChanged() { emit iChanged(this); } + void setToolTip( QString toolTip); + void setToolTipF( std::function toolTipF); + void setReady( bool ready); + void setError( bool error); + void setRemember( bool remember); + void setActive( bool active); + void runSpecial( QString func); + void reloadDynamicModule( Modules::DynamicModule * dynMod); signals: @@ -152,6 +152,8 @@ public slots: QString _iconSource, _toolTip; std::function _specialButtonFunc = nullptr; + std::function _titleF = nullptr; + std::function _toolTipF = nullptr; }; diff --git a/Desktop/modules/ribbonmodel.cpp b/Desktop/modules/ribbonmodel.cpp index be7cba2e13..22db4f3a7f 100644 --- a/Desktop/modules/ribbonmodel.cpp +++ b/Desktop/modules/ribbonmodel.cpp @@ -38,6 +38,7 @@ RibbonModel::RibbonModel() : QAbstractListModel(DynamicModules::dynMods()) connect(DynamicModules::dynMods(), &DynamicModules::dynamicModuleUninstalled, this, &RibbonModel::removeDynamicRibbonButtonModel ); connect(DynamicModules::dynMods(), &DynamicModules::dynamicModuleReplaced, this, &RibbonModel::dynamicModuleReplaced ); connect(DynamicModules::dynMods(), &DynamicModules::dynamicModuleChanged, this, &RibbonModel::dynamicModuleChanged ); + connect(PreferencesModel::prefs(), &PreferencesModel::languageCodeChanged, this, &RibbonModel::refreshButtons ); } void RibbonModel::loadModules(std::vector commonModulesToLoad, std::vector extraModulesToLoad) @@ -120,42 +121,41 @@ void RibbonModel::addSpecialRibbonButtonsEarly() //_entriesInsert and _entriesDelete are destroyed by the menumodel destructor when the button gets destroyed. _entriesInsert = new AnalysisEntries( { - new AnalysisEntry([&](){ emit this->dataInsertRowBefore( -1); }, "insert-row-before", fq(tr("Insert row above")), true, "menu-row-insert-before"), - new AnalysisEntry([&](){ emit this->dataInsertRowAfter( -1); }, "insert-row-after", fq(tr("Insert row below")), true, "menu-row-insert-after"), + new AnalysisEntry([&](){ emit this->dataInsertRowBefore( -1); }, "insert-row-before", [&](){ return fq(tr("Insert row above"));}, true, "menu-row-insert-before"), + new AnalysisEntry([&](){ emit this->dataInsertRowAfter( -1); }, "insert-row-after", [&](){ return fq(tr("Insert row below"));}, true, "menu-row-insert-after"), new AnalysisEntry(), - new AnalysisEntry([&](){ emit this->dataInsertColumnBefore( -1,false,false); }, "insert-column-before", fq(tr("Insert column before")), true, "menu-column-insert-before"), - new AnalysisEntry([&](){ emit this->dataInsertColumnAfter( -1,false,false); }, "insert-column-after", fq(tr("Insert column after")), true, "menu-column-insert-after"), + new AnalysisEntry([&](){ emit this->dataInsertColumnBefore( -1,false,false); }, "insert-column-before", [&](){ return fq(tr("Insert column before"));}, true, "menu-column-insert-before"), + new AnalysisEntry([&](){ emit this->dataInsertColumnAfter( -1,false,false); }, "insert-column-after", [&](){ return fq(tr("Insert column after"));}, true, "menu-column-insert-after"), new AnalysisEntry(), - new AnalysisEntry([&](){ emit this->dataInsertColumnBefore( -1,true ,false); }, "insert-c-column-before", fq(tr("Insert constructor column before")), true, "menu-column-insert-before"), - new AnalysisEntry([&](){ emit this->dataInsertColumnAfter( -1,true ,false); }, "insert-c-column-after", fq(tr("Insert constructor column after")), true, "menu-column-insert-after"), - new AnalysisEntry([&](){ emit this->dataInsertColumnBefore( -1,true ,true); }, "insert-r-column-before", fq(tr("Insert R column before")), true, "menu-column-insert-before"), - new AnalysisEntry([&](){ emit this->dataInsertColumnAfter( -1,true ,true); }, "insert-r-column-after", fq(tr("Insert R column after")), true, "menu-column-insert-after"), + new AnalysisEntry([&](){ emit this->dataInsertColumnBefore( -1,true ,false); }, "insert-c-column-before", [&](){ return fq(tr("Insert constructor column before"));}, true, "menu-column-insert-before"), + new AnalysisEntry([&](){ emit this->dataInsertColumnAfter( -1,true ,false); }, "insert-c-column-after", [&](){ return fq(tr("Insert constructor column after"));}, true, "menu-column-insert-after"), + new AnalysisEntry([&](){ emit this->dataInsertColumnBefore( -1,true ,true); }, "insert-r-column-before", [&](){ return fq(tr("Insert R column before"));}, true, "menu-column-insert-before"), + new AnalysisEntry([&](){ emit this->dataInsertColumnAfter( -1,true ,true); }, "insert-r-column-after", [&](){ return fq(tr("Insert R column after"));}, true, "menu-column-insert-after"), }); _entriesDelete = new AnalysisEntries( { - new AnalysisEntry([&](){ emit this->dataRemoveColumn(); }, "delete-column", fq(tr("Delete column")), true, "menu-column-remove"), - new AnalysisEntry([&](){ emit this->dataRemoveRow(); }, "delete-row", fq(tr("Delete row")), true, "menu-row-remove"), - new AnalysisEntry([&](){ emit this->cellsClear(); }, "clear-cells", fq(tr("Clear cells")), true, "menu-cells-clear") + new AnalysisEntry([&](){ emit this->dataRemoveColumn(); }, "delete-column", [&](){ return fq(tr("Delete column"));}, true, "menu-column-remove"), + new AnalysisEntry([&](){ emit this->dataRemoveRow(); }, "delete-row", [&](){ return fq(tr("Delete row"));}, true, "menu-row-remove"), + new AnalysisEntry([&](){ emit this->cellsClear(); }, "clear-cells", [&](){ return fq(tr("Clear cells"));}, true, "menu-cells-clear") }); _entriesSynchOn = new AnalysisEntries( { - new AnalysisEntry([&]() { MainWindow::singleton()->startDataEditorHandler(); }, "open-datafile", fq(tr("Open datafile with default spreadsheet editor")), true, ""), - new AnalysisEntry([&]() { emit setDataSynchronisation(false); }, "stop-externaledit", fq(tr("Turn external data synchronisation off")), true, "") + new AnalysisEntry([&]() { MainWindow::singleton()->startDataEditorHandler(); }, "open-datafile", [](){ return fq(tr("Open datafile with default spreadsheet editor"));}, true, ""), + new AnalysisEntry([&]() { emit setDataSynchronisation(false); }, "stop-externaledit", [](){ return fq(tr("Turn external data synchronisation off"));}, true, "") }); - _analysesButton = new RibbonButton(this, "Analyses", fq(tr("Analyses")), "JASP_logo_green.svg", false, [&](){ emit finishCurrentEdit(); emit showStatistics(); }, fq(tr("Switch JASP to analyses mode")), true); - _dataSwitchButton = new RibbonButton(this, "Data", fq(tr("Edit Data")), "data-button.svg", false, [&](){ emit showData(); }, fq(tr("Switch JASP to data editing mode")), false, false, false); - _dataNewButton = new RibbonButton(this, "Data-New", fq(tr("New Data")), "data-button-new.svg", false, [&](){ emit showNewData(); }, fq(tr("Open a workspace without data")), true, false, false); - _dataResizeButton = new RibbonButton(this, "Data-Resize", fq(tr("Resize Data")), "data-button-resize.svg", false, [&](){ emit resizeData(); }, fq(tr("Resize your dataset")), false); - _insertButton = new RibbonButton(this, "Data-Insert", fq(tr("Insert")), "data-button-insert.svg", _entriesInsert, fq(tr("Insert empty columns or rows"))); - _removeButton = new RibbonButton(this, "Data-Remove", fq(tr("Remove")), "data-button-erase.svg", _entriesDelete, fq(tr("Remove columns or rows"))); - _synchroniseOnButton = new RibbonButton(this, "Data-Synch-On", fq(tr("Synchronisation")), "data-button-sync-off.svg", true, [&](){ emit setDataSynchronisation(true); }, fq(tr("Turn external data synchronisation on")), false); - _synchroniseOffButton = new RibbonButton(this, "Data-Synch-Off", fq(tr("Synchronisation")), "data-button-sync-on.svg", _entriesSynchOn, fq(tr("Turn external data synchronisation off")), true); - - _undoButton = new RibbonButton(this, "Data-Undo", fq(tr("Undo")), "menu-undo.svg", true, [&](){ emit dataUndo(); }, fq(tr("Undo changes, %1+Z").arg(getShortCutKey())), true, false, false); - _redoButton = new RibbonButton(this, "Data-Redo", fq(tr("Redo")), "menu-redo.svg", true, [&](){ emit dataRedo(); }, fq(tr("Redo changes, %1+shift+Z or %1+Y").arg(getShortCutKey())), true, false, false); + _analysesButton = new RibbonButton(this, "Analyses", [&](){ return fq(tr("Analyses"));}, "JASP_logo_green.svg", false, [&](){ emit finishCurrentEdit(); emit showStatistics(); }, [&](){return tr("Switch JASP to analyses mode");}, true); + _dataSwitchButton = new RibbonButton(this, "Data", [&](){ return fq(tr("Edit Data"));}, "data-button.svg", false, [&](){ emit showData(); }, [&](){return tr("Switch JASP to data editing mode");}, false, false, false); + _dataNewButton = new RibbonButton(this, "Data-New", [&](){ return fq(tr("New Data"));}, "data-button-new.svg", false, [&](){ emit showNewData(); }, [&](){return tr("Open a workspace without data");}, true, false, false); + _dataResizeButton = new RibbonButton(this, "Data-Resize", [&](){ return fq(tr("Resize Data"));}, "data-button-resize.svg", false, [&](){ emit resizeData(); }, [&](){return tr("Resize your dataset");}, false); + _insertButton = new RibbonButton(this, "Data-Insert", [&](){ return fq(tr("Insert"));}, "data-button-insert.svg", _entriesInsert, [&](){return tr("Insert empty columns or rows");}); + _removeButton = new RibbonButton(this, "Data-Remove", [&](){ return fq(tr("Remove"));}, "data-button-erase.svg", _entriesDelete, [&](){return tr("Remove columns or rows");}); + _synchroniseOnButton = new RibbonButton(this, "Data-Synch-On", [&](){ return fq(tr("Synchronisation"));}, "data-button-sync-off.svg", true, [&](){ emit setDataSynchronisation(true); }, [&](){return tr("Turn external data synchronisation on");}, false); + _synchroniseOffButton = new RibbonButton(this, "Data-Synch-Off", [&](){ return fq(tr("Synchronisation"));}, "data-button-sync-on.svg", _entriesSynchOn, [&](){return tr("Turn external data synchronisation off");}, true); + _undoButton = new RibbonButton(this, "Data-Undo", [&](){ return fq(tr("Undo"));}, "menu-undo.svg", true, [&](){ emit dataUndo(); }, [&](){return tr("Undo changes, %1+Z").arg(getShortCutKey());}, true, false, false); + _redoButton = new RibbonButton(this, "Data-Redo", [&](){ return fq(tr("Redo"));}, "menu-redo.svg", true, [&](){ emit dataRedo(); }, [&](){return tr("Redo changes, %1+shift+Z or %1+Y").arg(getShortCutKey());}, true, false, false); _dataNewButton->setActive(true); connect(this, &RibbonModel::dataLoadedChanged, _dataSwitchButton, [=](bool loaded) { _dataSwitchButton ->setEnabled(loaded); }); @@ -173,14 +173,11 @@ void RibbonModel::addSpecialRibbonButtonsEarly() auto setUnAndRedoButtonLambda = [&,view]() { - QString undoText = view->undoText(), - redoText = view->redoText(); - - _undoButton->setActive(!undoText.isEmpty()); - _redoButton->setActive(!redoText.isEmpty()); + _undoButton->setActive(!view->undoText().isEmpty()); + _redoButton->setActive(!view->redoText().isEmpty()); - _undoButton->setToolTip(tr("Undo %2 (%1+Z)") .arg(getShortCutKey()).arg(undoText)); - _redoButton->setToolTip(tr("Redo %2 (%1+shift+Z or %1+Y)") .arg(getShortCutKey()).arg(redoText)); + _undoButton->setToolTipF([&,view](){return tr("Undo %2 (%1+Z)") .arg(getShortCutKey()).arg(view->undoText());}); + _redoButton->setToolTipF([&,view](){return tr("Redo %2 (%1+shift+Z or %1+Y)") .arg(getShortCutKey()).arg(view->redoText());}); }; @@ -207,7 +204,7 @@ void RibbonModel::addSpecialRibbonButtonsEarly() void RibbonModel::addSpecialRibbonButtonsLate() { - addRibbonButtonModel(new RibbonButton(this, "R", fq(tr("R console")), "Rlogo.svg", false, [&](){ emit showRCommander(); }, fq(tr("Execute R code in a console")), false, true), size_t(RowType::Analyses)); + addRibbonButtonModel(new RibbonButton(this, "R", [&](){return fq(tr("R console")); }, "Rlogo.svg", false, [&](){ emit showRCommander(); }, [&](){ return tr("Execute R code in a console");}, false, true), size_t(RowType::Analyses)); } void RibbonModel::setDataMode(bool data) @@ -455,3 +452,9 @@ void RibbonModel::ribbonButtonModelChanged(RibbonButton* model) if(row > -1) emit dataChanged(index(row), index(row)); } + +void RibbonModel::refreshButtons() +{ + beginResetModel(); + endResetModel(); +} diff --git a/Desktop/modules/ribbonmodel.h b/Desktop/modules/ribbonmodel.h index c4634b86da..e37c6369bf 100644 --- a/Desktop/modules/ribbonmodel.h +++ b/Desktop/modules/ribbonmodel.h @@ -130,7 +130,7 @@ public slots: void setHighlightedModuleIndex(int highlightedModuleIndex); void analysisClicked(QString analysisFunction, QString analysisQML, QString analysisTitle, QString module); void setCurrentRow(int currentRow); - + void refreshButtons(); private slots: void dynamicModuleChanged( Modules::DynamicModule * module); From 21c2e0d11e1473fad37396bab8f1ae45934b90e8 Mon Sep 17 00:00:00 2001 From: Joris Goosen Date: Wed, 4 Sep 2024 15:56:23 +0200 Subject: [PATCH 32/70] Turning WAL on necessitates checkpoints, otherwise it wont properly save the db --- CommonData/databaseinterface.cpp | 8 ++++++++ CommonData/databaseinterface.h | 2 ++ Desktop/data/exporters/jaspexporter.cpp | 1 + 3 files changed, 11 insertions(+) diff --git a/CommonData/databaseinterface.cpp b/CommonData/databaseinterface.cpp index e0fea761fa..d7257e3f5a 100644 --- a/CommonData/databaseinterface.cpp +++ b/CommonData/databaseinterface.cpp @@ -1624,6 +1624,13 @@ void DatabaseInterface::dbStartUpPragmas() runStatements("pragma synchronous = normal;"); } + +void DatabaseInterface::doWALCheckpoint() +{ + // https://www.sqlite.org/pragma.html#pragma_wal_checkpoint + runStatements("PRAGMA wal_checkpoint(TRUNCATE);"); +} + void DatabaseInterface::close() { JASPTIMER_SCOPE(DatabaseInterface::close); @@ -1691,3 +1698,4 @@ void DatabaseInterface::transactionReadEnd() runStatements("COMMIT"); } + diff --git a/CommonData/databaseinterface.h b/CommonData/databaseinterface.h index 98dfaed722..92c82d64bc 100644 --- a/CommonData/databaseinterface.h +++ b/CommonData/databaseinterface.h @@ -159,6 +159,8 @@ class DatabaseInterface void transactionReadBegin(); ///< runs BEGIN DEFERRED and waits for sqlite to not be busy anymore if some other process is writing Tracks whether nested and only does BEGIN+COMMIT at lowest depth void transactionReadEnd(); ///< runs COMMIT and ends the transaction. Tracks whether nested and only does BEGIN+COMMIT at lowest depth + //WAL handling, was added in https://github.com/jasp-stats/jasp-desktop/commit/4cfe6197714440b0ab6936891fa5ff7cc8ac19b6, see docs: https://www.sqlite.org/wal.html + void doWALCheckpoint(); ///< Writes all pending changes to the db-file private: void _doubleTroubleBinder(sqlite3_stmt *stmt, int param, double dbl); ///< Needed to work around the lack of support for NAN, INF and NEG_INF in sqlite, converts those to string to make use of sqlite flexibility diff --git a/Desktop/data/exporters/jaspexporter.cpp b/Desktop/data/exporters/jaspexporter.cpp index 8d35f21ec0..9fc31388bc 100644 --- a/Desktop/data/exporters/jaspexporter.cpp +++ b/Desktop/data/exporters/jaspexporter.cpp @@ -163,5 +163,6 @@ void JASPExporter::saveAnalyses(archive *a) void JASPExporter::saveDatabase(archive * a) { + DatabaseInterface::singleton()->doWALCheckpoint(); saveTempFile(a, DatabaseInterface::singleton()->dbFile(true)); } From cbdc331fb0e8524b21d4cfea68c9a5862c939547 Mon Sep 17 00:00:00 2001 From: vandenman Date: Thu, 29 Feb 2024 11:36:29 +0100 Subject: [PATCH 33/70] squashed js changes --- Desktop/html/js/utils.js | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/Desktop/html/js/utils.js b/Desktop/html/js/utils.js index 9f64ccea2a..2ce66105b5 100644 --- a/Desktop/html/js/utils.js +++ b/Desktop/html/js/utils.js @@ -1,4 +1,4 @@ -function formatColumn(column, type, format, alignNumbers, combine, modelFootnotes, html = true) { +function formatColumn(column, type, format, alignNumbers, combine, modelFootnotes, html = true, errorOnMixed = false) { /** * Prepares the columns of a table to the required format * @param column @@ -8,15 +8,33 @@ function formatColumn(column, type, format, alignNumbers, combine, modelFootnote * @param combine * @param modelFootnotes * @param html html render or latex code. Default is true + * @param errorOnMixed internal, used to avoid infinite loops */ let columnCells = Array(column.length); - if (type === "string" || typeof format == "undefined") { + if (type === "mixed") { + if (errorOnMixed) { + // or throw an error? But how? + return "Error: nested mixed columns are not supported!"; + } + + // call formatColumn for each row of the mixed column for (let rowNo = 0; rowNo < column.length; rowNo++) { + // we need to construct the array [column[rowNo].content.value] because column.length otherwise does not exist. + columnCells[rowNo] = formatColumn([{content: column[rowNo].content.value}], column[rowNo].content.type, column[rowNo].content.format, alignNumbers, combine, modelFootnotes, html, true)[0]; + } + + return columnCells; + + } - let clazz = (type == "string") ? "text" : "number"; + if (type === "string" || typeof format == "undefined" || format === null) { + + for (let rowNo = 0; rowNo < column.length; rowNo++) { + + let clazz = (type === "string" && !errorOnMixed) ? "text" : "number"; let cell = column[rowNo]; let content = cell.content; let formatted; @@ -453,7 +471,7 @@ function formatColumn(column, type, format, alignNumbers, combine, modelFootnote } else { - for (var rowNo = 0; rowNo < column.length; rowNo++) { + for (let rowNo = 0; rowNo < column.length; rowNo++) { var cell = column[rowNo] var content = cell.content From 3d01a0986f4485a19874a16426174ecfcb7342a6 Mon Sep 17 00:00:00 2001 From: Joris Goosen Date: Wed, 4 Sep 2024 16:40:55 +0200 Subject: [PATCH 34/70] update submodules --- Engine/jaspBase | 2 +- Engine/jaspModuleInstaller | 2 +- Modules/jaspAcceptanceSampling | 2 +- Modules/jaspAnova | 2 +- Modules/jaspAudit | 2 +- Modules/jaspBFF | 2 +- Modules/jaspBain | 2 +- Modules/jaspBsts | 2 +- Modules/jaspCircular | 2 +- Modules/jaspDescriptives | 2 +- Modules/jaspDistributions | 2 +- Modules/jaspJags | 2 +- Modules/jaspLearnBayes | 2 +- Modules/jaspLearnStats | 2 +- Modules/jaspMachineLearning | 2 +- Modules/jaspNetwork | 2 +- Modules/jaspPredictiveAnalytics | 2 +- Modules/jaspProphet | 2 +- Modules/jaspQualityControl | 2 +- Modules/jaspRegression | 2 +- Modules/jaspSem | 2 +- Modules/jaspTTests | 2 +- Modules/jaspTestModule | 2 +- Modules/jaspTimeSeries | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Engine/jaspBase b/Engine/jaspBase index 7de02c4424..a3cd37290c 160000 --- a/Engine/jaspBase +++ b/Engine/jaspBase @@ -1 +1 @@ -Subproject commit 7de02c442478e028fe2036e3b906059bf504c13e +Subproject commit a3cd37290c87bc5b77fca5887285034ff4833700 diff --git a/Engine/jaspModuleInstaller b/Engine/jaspModuleInstaller index 8d0666d706..89ee61df92 160000 --- a/Engine/jaspModuleInstaller +++ b/Engine/jaspModuleInstaller @@ -1 +1 @@ -Subproject commit 8d0666d70641bd3515eb05cd231ac3647b894fc9 +Subproject commit 89ee61df92b76a85b5d5f237674b185cee63e0b7 diff --git a/Modules/jaspAcceptanceSampling b/Modules/jaspAcceptanceSampling index 6c05756022..8abb46b7d3 160000 --- a/Modules/jaspAcceptanceSampling +++ b/Modules/jaspAcceptanceSampling @@ -1 +1 @@ -Subproject commit 6c05756022ec34ab67faad625a5344c79e3da945 +Subproject commit 8abb46b7d3b6ad3527c74da6c75b0f565b4e9bdd diff --git a/Modules/jaspAnova b/Modules/jaspAnova index 2a5245da1d..fe668b9ed0 160000 --- a/Modules/jaspAnova +++ b/Modules/jaspAnova @@ -1 +1 @@ -Subproject commit 2a5245da1d766f3d4dd7fcc9552adc8c0d7ddfdc +Subproject commit fe668b9ed042af8979f9d8512cc057694caf7b9b diff --git a/Modules/jaspAudit b/Modules/jaspAudit index eb5527f24d..56bece6b64 160000 --- a/Modules/jaspAudit +++ b/Modules/jaspAudit @@ -1 +1 @@ -Subproject commit eb5527f24d6652f1339a739c8b95fb519748e960 +Subproject commit 56bece6b64b2c44e17094a619d90cc41b089507b diff --git a/Modules/jaspBFF b/Modules/jaspBFF index 8fa02a3e0e..1361ded37c 160000 --- a/Modules/jaspBFF +++ b/Modules/jaspBFF @@ -1 +1 @@ -Subproject commit 8fa02a3e0ee2d8d7ea6bbefb2cdb9c30b6d2327e +Subproject commit 1361ded37c11ac292a024eacb75c89d37b748aae diff --git a/Modules/jaspBain b/Modules/jaspBain index ead1c8acb3..09f562d726 160000 --- a/Modules/jaspBain +++ b/Modules/jaspBain @@ -1 +1 @@ -Subproject commit ead1c8acb39e7879f57f5362aa7d26c881fb5d2f +Subproject commit 09f562d72635e0765436d67f189c3190998c5cbe diff --git a/Modules/jaspBsts b/Modules/jaspBsts index 707fcf06b0..ded16328f9 160000 --- a/Modules/jaspBsts +++ b/Modules/jaspBsts @@ -1 +1 @@ -Subproject commit 707fcf06b086b300bc4c4921eff5bb07f43d4854 +Subproject commit ded16328f97b8bdff63dda2ce40712677404d7fa diff --git a/Modules/jaspCircular b/Modules/jaspCircular index 38425b34bb..083f0cb8de 160000 --- a/Modules/jaspCircular +++ b/Modules/jaspCircular @@ -1 +1 @@ -Subproject commit 38425b34bbf0f90affa0d7757470e4527be24528 +Subproject commit 083f0cb8deba9699e775096310aaf08870428180 diff --git a/Modules/jaspDescriptives b/Modules/jaspDescriptives index 176070f013..6ca3caf300 160000 --- a/Modules/jaspDescriptives +++ b/Modules/jaspDescriptives @@ -1 +1 @@ -Subproject commit 176070f01349e5c4c92c9d1258b4d885367bf698 +Subproject commit 6ca3caf30033bb0b798dfd5f1aae5c57821e290d diff --git a/Modules/jaspDistributions b/Modules/jaspDistributions index 0819492508..f81638e2ac 160000 --- a/Modules/jaspDistributions +++ b/Modules/jaspDistributions @@ -1 +1 @@ -Subproject commit 0819492508f265b092203364e08548542783744b +Subproject commit f81638e2ac6b09da8f8818f021ed675dbe2473f7 diff --git a/Modules/jaspJags b/Modules/jaspJags index 249ca55305..a40277b4a4 160000 --- a/Modules/jaspJags +++ b/Modules/jaspJags @@ -1 +1 @@ -Subproject commit 249ca553051992417febdd6ee1f8c67e2e7d0869 +Subproject commit a40277b4a404803a9e235bf9324bd6a9c70197d9 diff --git a/Modules/jaspLearnBayes b/Modules/jaspLearnBayes index 93992d032e..01dcf43dfe 160000 --- a/Modules/jaspLearnBayes +++ b/Modules/jaspLearnBayes @@ -1 +1 @@ -Subproject commit 93992d032e053edfe30636be3c11f075ac1b4ffe +Subproject commit 01dcf43dfe1d692c17906509ea3f39d6a698abd5 diff --git a/Modules/jaspLearnStats b/Modules/jaspLearnStats index a6320cd6e2..cd2568ddca 160000 --- a/Modules/jaspLearnStats +++ b/Modules/jaspLearnStats @@ -1 +1 @@ -Subproject commit a6320cd6e298ad74d40050c0184dbf4ea95f6592 +Subproject commit cd2568ddca61c2a0127a5479d53555aac1e73650 diff --git a/Modules/jaspMachineLearning b/Modules/jaspMachineLearning index 0487a2adc7..e2b278957a 160000 --- a/Modules/jaspMachineLearning +++ b/Modules/jaspMachineLearning @@ -1 +1 @@ -Subproject commit 0487a2adc7b520e15929ea6cfd817dd2166aaa20 +Subproject commit e2b278957a562f679c483841e509c4188587af9e diff --git a/Modules/jaspNetwork b/Modules/jaspNetwork index 666c7a2f5b..df01b1f006 160000 --- a/Modules/jaspNetwork +++ b/Modules/jaspNetwork @@ -1 +1 @@ -Subproject commit 666c7a2f5bb8b88b48758c7c32e177c605b807ad +Subproject commit df01b1f006ed8ee82e17bf48ae011af71c78096b diff --git a/Modules/jaspPredictiveAnalytics b/Modules/jaspPredictiveAnalytics index 32d889a82b..a9838a1bf6 160000 --- a/Modules/jaspPredictiveAnalytics +++ b/Modules/jaspPredictiveAnalytics @@ -1 +1 @@ -Subproject commit 32d889a82b015745c8e3932b8db1eceb7b5dd008 +Subproject commit a9838a1bf6f87899c3884649434e1df4ca643866 diff --git a/Modules/jaspProphet b/Modules/jaspProphet index 134b796d13..019f30e6e1 160000 --- a/Modules/jaspProphet +++ b/Modules/jaspProphet @@ -1 +1 @@ -Subproject commit 134b796d134fed0d9c605315facbfd2628c39c4b +Subproject commit 019f30e6e1cb5f35360e5936e5c6fffdb098d9ec diff --git a/Modules/jaspQualityControl b/Modules/jaspQualityControl index 014e3e8f86..3546047b6d 160000 --- a/Modules/jaspQualityControl +++ b/Modules/jaspQualityControl @@ -1 +1 @@ -Subproject commit 014e3e8f8639fdf40d8531d82874fc3dff181f8c +Subproject commit 3546047b6d03fca9a84c550d9014ce11ea9fac13 diff --git a/Modules/jaspRegression b/Modules/jaspRegression index dc4b1af011..128726f9ee 160000 --- a/Modules/jaspRegression +++ b/Modules/jaspRegression @@ -1 +1 @@ -Subproject commit dc4b1af0118324e8ce973b2129af4fa076d81e9a +Subproject commit 128726f9eec2393d366cd8a7be4713845a4c74cb diff --git a/Modules/jaspSem b/Modules/jaspSem index cdbc4249cd..9dc3157b2f 160000 --- a/Modules/jaspSem +++ b/Modules/jaspSem @@ -1 +1 @@ -Subproject commit cdbc4249cd466613a09c2565200bf63f4161e4f7 +Subproject commit 9dc3157b2fa83e064316bd82dbca8b6909ab908a diff --git a/Modules/jaspTTests b/Modules/jaspTTests index a5620b4f73..4074015b3a 160000 --- a/Modules/jaspTTests +++ b/Modules/jaspTTests @@ -1 +1 @@ -Subproject commit a5620b4f739d6950f4b98679f38dc7176b16e38a +Subproject commit 4074015b3a4732236371f60e13a7407d4ce8d7a7 diff --git a/Modules/jaspTestModule b/Modules/jaspTestModule index 31537a74c5..0954e3b712 160000 --- a/Modules/jaspTestModule +++ b/Modules/jaspTestModule @@ -1 +1 @@ -Subproject commit 31537a74c56d15a9e02b9f0cf8fa8af47b8a8d87 +Subproject commit 0954e3b712940fcffe8335ed54a5171902190128 diff --git a/Modules/jaspTimeSeries b/Modules/jaspTimeSeries index 8defd626d2..d40bcfb10a 160000 --- a/Modules/jaspTimeSeries +++ b/Modules/jaspTimeSeries @@ -1 +1 @@ -Subproject commit 8defd626d2f27fe340a02c2f54c4ee675ea9f750 +Subproject commit d40bcfb10a3b583fe4b1a9f2543aee8aca1d6139 From 3e14bd428a3fcc75b3fb5ca76d430e3ae53b2e8a Mon Sep 17 00:00:00 2001 From: Shun Wang Date: Thu, 5 Sep 2024 20:37:26 +0800 Subject: [PATCH 35/70] Feat: add line numbers to code editors (#5474) * feat: add line number view for code editor * determine width of linenumbers a bit better * make it a binding to set the leftPadding for the lineNumbers --------- Co-authored-by: Joris Goosen --- Modules/jaspJags | 2 +- .../components/JASP/Controls/JAGSTextArea.qml | 1 + .../components/JASP/Controls/TextArea.qml | 51 ++++++++++++++++++- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/Modules/jaspJags b/Modules/jaspJags index a40277b4a4..9f23814672 160000 --- a/Modules/jaspJags +++ b/Modules/jaspJags @@ -1 +1 @@ -Subproject commit a40277b4a404803a9e235bf9324bd6a9c70197d9 +Subproject commit 9f23814672ca7802318c0113e382a2da03d088b8 diff --git a/QMLComponents/components/JASP/Controls/JAGSTextArea.qml b/QMLComponents/components/JASP/Controls/JAGSTextArea.qml index 82693572fe..aa2ec73c76 100644 --- a/QMLComponents/components/JASP/Controls/JAGSTextArea.qml +++ b/QMLComponents/components/JASP/Controls/JAGSTextArea.qml @@ -5,4 +5,5 @@ import JASP 1.0 TextArea { textType: JASP.TextTypeJAGSmodel + showLineNumber: true } diff --git a/QMLComponents/components/JASP/Controls/TextArea.qml b/QMLComponents/components/JASP/Controls/TextArea.qml index 81c5118351..944dd37dbb 100644 --- a/QMLComponents/components/JASP/Controls/TextArea.qml +++ b/QMLComponents/components/JASP/Controls/TextArea.qml @@ -29,6 +29,7 @@ TextAreaBase property var undoModel property bool useTabAsSpaces : true property var nextTabItem + property bool showLineNumber : false Component.onCompleted: control.editingFinished.connect(editingFinished) @@ -86,16 +87,62 @@ TextAreaBase boundsBehavior: Flickable.StopAtBounds anchors.fill: parent + Rectangle + { + id: lineNumbersRect + anchors.top: parent.top + anchors.left: parent.left + anchors.topMargin: jaspTheme.contentMargin + anchors.leftMargin: 2 + visible: textArea.showLineNumber + width: lineNumbersRect.visible ? lineNumbers.width : 0 + height: Math.max(flickableRectangle.height, control.contentHeight) + 10 + color: "transparent" + + FontMetrics + { + font: jaspTheme.fontCode + id: lineNumberWidthDeterminer + } + + ListView + { + id: lineNumbers + width: lineNumberWidthDeterminer.advanceWidth(control.lineCount) + jaspTheme.itemPadding + height: parent.height + model: control.lineCount + delegate: Text + { + text: "%1".arg(index + 1) + font: jaspTheme.fontCode + color: jaspTheme.grayDarker + height: control.contentHeight / control.lineCount + anchors.right: parent.right + anchors.rightMargin: jaspTheme.itemPadding / 2 + } + } + + Rectangle + { + id: separator + anchors.top: parent.top + anchors.left: parent.right + width: 2 * preferencesModel.uiScale + height: Math.max(flickableRectangle.height, control.contentHeight) + 10 + color: jaspTheme.borderColor + } + } + QTC.TextArea.flickable: QTC.TextArea { id: control selectByMouse: true selectedTextColor: jaspTheme.white selectionColor: jaspTheme.itemSelectedColor - font: textArea.textType === JASP.TextTypeDefault || textArea.textType === JASP.TextTypeSource ? jaspTheme.font : jaspTheme.fontCode color: textArea.enabled ? jaspTheme.textEnabled : jaspTheme.textDisabled - + leftPadding: !textArea.showLineNumber ? 0 : lineNumbers.width + 2 * jaspTheme.contentMargin + Component.onCompleted: { if (textArea.nextTabItem) From 89f12d84718c83d57a62d03263e5f989a9a66619 Mon Sep 17 00:00:00 2001 From: Shun Wang Date: Thu, 5 Sep 2024 23:18:13 +0800 Subject: [PATCH 36/70] feat: R syntax highlighter in analysis panel controls (#5538) * init r language highlighter * rename lavaan bound contorls to r lang * add special number case * also enable highlighter for R syntax text area * fix strings format and also styles * add rsyntaxhighlighter quickitem, to make non jasp textareas highlighted easily --- .../JASP/Widgets/ComputeColumnWindow.qml | 7 + .../components/JASP/Widgets/FilterWindow.qml | 11 ++ .../JASP/Widgets/RCommanderWindow.qml | 12 ++ Desktop/mainwindow.cpp | 5 +- .../boundcontrols/boundcontrolcsemtextarea.h | 6 +- ...area.cpp => boundcontrolrlangtextarea.cpp} | 16 +-- ...textarea.h => boundcontrolrlangtextarea.h} | 14 +- .../components/JASP/Controls/Form.qml | 1 + .../controls/lavaansyntaxhighlighter.cpp | 64 --------- .../controls/lavaansyntaxhighlighter.h | 43 ------ QMLComponents/controls/rsyntaxhighlighter.cpp | 123 ++++++++++++++++++ QMLComponents/controls/rsyntaxhighlighter.h | 74 +++++++++++ QMLComponents/controls/textareabase.cpp | 5 +- 13 files changed, 252 insertions(+), 129 deletions(-) rename QMLComponents/boundcontrols/{boundcontrollavaantextarea.cpp => boundcontrolrlangtextarea.cpp} (86%) rename QMLComponents/boundcontrols/{boundcontrollavaantextarea.h => boundcontrolrlangtextarea.h} (78%) delete mode 100644 QMLComponents/controls/lavaansyntaxhighlighter.cpp delete mode 100644 QMLComponents/controls/lavaansyntaxhighlighter.h create mode 100644 QMLComponents/controls/rsyntaxhighlighter.cpp create mode 100644 QMLComponents/controls/rsyntaxhighlighter.h diff --git a/Desktop/components/JASP/Widgets/ComputeColumnWindow.qml b/Desktop/components/JASP/Widgets/ComputeColumnWindow.qml index 5ab87cced6..4f32ffe940 100644 --- a/Desktop/components/JASP/Widgets/ComputeColumnWindow.qml +++ b/Desktop/components/JASP/Widgets/ComputeColumnWindow.qml @@ -2,6 +2,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.12 import QtQuick.Layouts 1.3 import JASP.Controls 1.0 as JaspControls +import JASP import "FilterConstructor" @@ -103,6 +104,12 @@ FocusScope TextArea { id: computeColumnEdit + + RSyntaxHighlighterQuick + { + textDocument: computeColumnEdit.textDocument + } + anchors.top: parent.top anchors.left: parent.left diff --git a/Desktop/components/JASP/Widgets/FilterWindow.qml b/Desktop/components/JASP/Widgets/FilterWindow.qml index f908f3e79b..af2116b8f5 100644 --- a/Desktop/components/JASP/Widgets/FilterWindow.qml +++ b/Desktop/components/JASP/Widgets/FilterWindow.qml @@ -2,6 +2,7 @@ import QtQuick 2.12 import QtQuick.Controls 2.12 import JASP.Controls 1.0 as JaspControls import "FilterConstructor" +import JASP FocusScope { @@ -302,6 +303,11 @@ FocusScope TextArea { + RSyntaxHighlighterQuick + { + textDocument: filterGeneratedEdit.textDocument + } + id: filterGeneratedEdit anchors.top: filterGeneratedBox.top anchors.left: resetAllGeneratedFilters.right @@ -347,6 +353,11 @@ FocusScope TextArea { + RSyntaxHighlighterQuick + { + textDocument: filterEdit.textDocument + } + id: filterEdit height: contentHeight + 30 selectByMouse: true diff --git a/Desktop/components/JASP/Widgets/RCommanderWindow.qml b/Desktop/components/JASP/Widgets/RCommanderWindow.qml index 134b16be52..9d3a051085 100644 --- a/Desktop/components/JASP/Widgets/RCommanderWindow.qml +++ b/Desktop/components/JASP/Widgets/RCommanderWindow.qml @@ -110,6 +110,11 @@ Window TextArea { + RSyntaxHighlighterQuick + { + textDocument: outputWindow.textDocument + } + id: outputWindow text: rCmd.output font: jaspTheme.fontRCode @@ -192,6 +197,13 @@ Window TextArea { + + RSyntaxHighlighterQuick + { + textDocument: codeEntry.textDocument + } + + id: codeEntry font: jaspTheme.fontRCode color: jaspTheme.textEnabled diff --git a/Desktop/mainwindow.cpp b/Desktop/mainwindow.cpp index e3ea97c017..8df39b3c65 100644 --- a/Desktop/mainwindow.cpp +++ b/Desktop/mainwindow.cpp @@ -32,12 +32,11 @@ #include #include "log.h" -#include "dirs.h" #include "timers.h" #include "appinfo.h" #include "tempfiles.h" #include "processinfo.h" -#include "columnutils.h" + #include "mainwindow.h" #include "analysisform.h" @@ -46,6 +45,7 @@ #include "controls/comboboxbase.h" #include "controls/textinputbase.h" #include "controls/componentslistbase.h" +#include "controls/rsyntaxhighlighter.h" #include "controls/factorsformbase.h" #include "controls/inputlistbase.h" #include "controls/textareabase.h" @@ -180,6 +180,7 @@ MainWindow::MainWindow(QApplication * application) : QObject(application), _appl qmlRegisterType ("JASP", 1, 0, "ComboBoxBase" ); qmlRegisterType ("JASP", 1, 0, "RadioButtonBase" ); qmlRegisterType ("JASP", 1, 0, "RadioButtonsGroupBase" ); + qmlRegisterType ("JASP", 1, 0, "RSyntaxHighlighterQuick" ); qmlRegisterType ("JASP", 1, 0, "ComponentsListBase" ); qmlRegisterType ("JASP", 1, 0, "FactorsFormBase" ); qmlRegisterType ("JASP", 1, 0, "InputListBase" ); diff --git a/QMLComponents/boundcontrols/boundcontrolcsemtextarea.h b/QMLComponents/boundcontrols/boundcontrolcsemtextarea.h index 2476702760..1209d3aa2c 100644 --- a/QMLComponents/boundcontrols/boundcontrolcsemtextarea.h +++ b/QMLComponents/boundcontrols/boundcontrolcsemtextarea.h @@ -1,12 +1,12 @@ #ifndef BOUNDCONTROLCSEMTEXTAREA_H #define BOUNDCONTROLCSEMTEXTAREA_H -#include "boundcontrollavaantextarea.h" +#include "boundcontrolrlangtextarea.h" -class BoundControlCSemTextArea : public BoundControlLavaanTextArea +class BoundControlCSemTextArea : public BoundControlRlangTextArea { public: - using BoundControlLavaanTextArea::BoundControlLavaanTextArea; + using BoundControlRlangTextArea::BoundControlRlangTextArea; protected: const char * _checkSyntaxRFunctionName() override { return "jaspSem:::checkCSemModel"; } diff --git a/QMLComponents/boundcontrols/boundcontrollavaantextarea.cpp b/QMLComponents/boundcontrols/boundcontrolrlangtextarea.cpp similarity index 86% rename from QMLComponents/boundcontrols/boundcontrollavaantextarea.cpp rename to QMLComponents/boundcontrols/boundcontrolrlangtextarea.cpp index 4de9bdc5ed..ba8a502b3f 100644 --- a/QMLComponents/boundcontrols/boundcontrollavaantextarea.cpp +++ b/QMLComponents/boundcontrols/boundcontrolrlangtextarea.cpp @@ -16,14 +16,14 @@ // . // -#include "boundcontrollavaantextarea.h" +#include "boundcontrolrlangtextarea.h" #include "controls/textareabase.h" #include "log.h" #include "columnencoder.h" #include "analysisform.h" #include -BoundControlLavaanTextArea::BoundControlLavaanTextArea(TextAreaBase *textArea) +BoundControlRlangTextArea::BoundControlRlangTextArea(TextAreaBase *textArea) : BoundControlTextArea(textArea) { @@ -32,14 +32,14 @@ BoundControlLavaanTextArea::BoundControlLavaanTextArea(TextAreaBase *textArea) if (textDocumentQQuick) { QTextDocument* doc = textDocumentQQuick->textDocument(); - _lavaanHighlighter = new LavaanSyntaxHighlighter(doc); + _rLangHighlighter = new RSyntaxHighlighter(doc); //connect(doc, &QTextDocument::contentsChanged, this, &BoundQMLTextArea::contentsChangedHandler); } else Log::log() << "No document object found!" << std::endl; } -void BoundControlLavaanTextArea::bindTo(const Json::Value &value) +void BoundControlRlangTextArea::bindTo(const Json::Value &value) { if (value.type() != Json::objectValue) return; BoundControlBase::bindTo(value); @@ -50,7 +50,7 @@ void BoundControlLavaanTextArea::bindTo(const Json::Value &value) } -Json::Value BoundControlLavaanTextArea::createJson() const +Json::Value BoundControlRlangTextArea::createJson() const { Json::Value result; std::string text = _textArea->text().toStdString(); @@ -62,7 +62,7 @@ Json::Value BoundControlLavaanTextArea::createJson() const return result; } -bool BoundControlLavaanTextArea::isJsonValid(const Json::Value &value) const +bool BoundControlRlangTextArea::isJsonValid(const Json::Value &value) const { if (!value.isObject()) return false; if (!value["modelOriginal"].isString()) return false; @@ -73,7 +73,7 @@ bool BoundControlLavaanTextArea::isJsonValid(const Json::Value &value) const return true; } -void BoundControlLavaanTextArea::checkSyntax() +void BoundControlRlangTextArea::checkSyntax() { QString text = _textArea->text(); @@ -103,7 +103,7 @@ void BoundControlLavaanTextArea::checkSyntax() } -QString BoundControlLavaanTextArea::rScriptDoneHandler(const QString & result) +QString BoundControlRlangTextArea::rScriptDoneHandler(const QString & result) { if (!result.isEmpty()) return result; diff --git a/QMLComponents/boundcontrols/boundcontrollavaantextarea.h b/QMLComponents/boundcontrols/boundcontrolrlangtextarea.h similarity index 78% rename from QMLComponents/boundcontrols/boundcontrollavaantextarea.h rename to QMLComponents/boundcontrols/boundcontrolrlangtextarea.h index bdcc78e79d..07600b2ffe 100644 --- a/QMLComponents/boundcontrols/boundcontrollavaantextarea.h +++ b/QMLComponents/boundcontrols/boundcontrolrlangtextarea.h @@ -16,16 +16,16 @@ // . // -#ifndef BOUNDCONTROLLAVAANTEXTAREA_H -#define BOUNDCONTROLLAVAANTEXTAREA_H +#ifndef BOUNDCONTROLRLANGTEXTAREA_H +#define BOUNDCONTROLRLANGTEXTAREA_H #include "boundcontroltextarea.h" -#include "controls/lavaansyntaxhighlighter.h" +#include "controls/rsyntaxhighlighter.h" -class BoundControlLavaanTextArea : public BoundControlTextArea +class BoundControlRlangTextArea : public BoundControlTextArea { public: - BoundControlLavaanTextArea(TextAreaBase* textArea); + BoundControlRlangTextArea(TextAreaBase* textArea); bool isJsonValid(const Json::Value& optionValue) const override; Json::Value createJson() const override; @@ -35,7 +35,7 @@ class BoundControlLavaanTextArea : public BoundControlTextArea QString rScriptDoneHandler(const QString &result) override; protected: - LavaanSyntaxHighlighter* _lavaanHighlighter = nullptr; + RSyntaxHighlighter* _rLangHighlighter = nullptr; std::set _usedColumnNames; QString _textEncoded; @@ -43,4 +43,4 @@ class BoundControlLavaanTextArea : public BoundControlTextArea }; -#endif // BOUNDCONTROLLAVAANTEXTAREA_H +#endif // BOUNDCONTROLRLANGTEXTAREA_H diff --git a/QMLComponents/components/JASP/Controls/Form.qml b/QMLComponents/components/JASP/Controls/Form.qml index 36cf1a3b35..4e19f5dd90 100644 --- a/QMLComponents/components/JASP/Controls/Form.qml +++ b/QMLComponents/components/JASP/Controls/Form.qml @@ -240,6 +240,7 @@ AnalysisForm width: parent.width height: visible ? 100 * preferencesModel.uiScale : 0 text: form.rSyntaxText + textType: JASPControl.TextTypeRcode isBound: false onApplyRequest: form.sendRSyntax(text) diff --git a/QMLComponents/controls/lavaansyntaxhighlighter.cpp b/QMLComponents/controls/lavaansyntaxhighlighter.cpp deleted file mode 100644 index cc0424a5f1..0000000000 --- a/QMLComponents/controls/lavaansyntaxhighlighter.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// -// Copyright (C) 2013-2018 University of Amsterdam -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public -// License along with this program. If not, see -// . -// - -#include "lavaansyntaxhighlighter.h" - -LavaanSyntaxHighlighter::LavaanSyntaxHighlighter(QTextDocument *parent) - : QSyntaxHighlighter(parent) -{ - - HighlightingRule rule; - - // operators - operatorFormat.setForeground(Qt::darkGreen); - QStringList operatorPatterns; - operatorPatterns << "\\=" << "\\~" << "\\<" - << "\\*" << "\\>" << "\\:" - << "\\%" << "\\|" << "\\+"; - for (const QString &pattern : operatorPatterns) { - rule.pattern = QRegularExpression(pattern); - rule.format = operatorFormat; - highlightingRules.append(rule); - } - - // variables - variableFormat.setToolTip("variable"); - rule.pattern = QRegularExpression("\\b\\w*\\b"); - rule.format = variableFormat; - highlightingRules.append(rule); - - // comments - commentFormat.setForeground(Qt::darkGray); - commentFormat.setFontItalic(true); - rule.pattern = QRegularExpression("#[^\n]*"); - rule.format = commentFormat; - highlightingRules.append(rule); -} - -void LavaanSyntaxHighlighter::highlightBlock(const QString &text) -{ - for (const HighlightingRule &rule : highlightingRules) - { - QRegularExpressionMatchIterator matchIterator = rule.pattern.globalMatch(text); - while (matchIterator.hasNext()) - { - QRegularExpressionMatch match = matchIterator.next(); - setFormat(match.capturedStart(), match.capturedLength(), rule.format); - } - } -} diff --git a/QMLComponents/controls/lavaansyntaxhighlighter.h b/QMLComponents/controls/lavaansyntaxhighlighter.h deleted file mode 100644 index badfcb1b9e..0000000000 --- a/QMLComponents/controls/lavaansyntaxhighlighter.h +++ /dev/null @@ -1,43 +0,0 @@ -// -// Copyright (C) 2013-2018 University of Amsterdam -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public -// License along with this program. If not, see -// . -// - -#ifndef LAVAANSYNTAXHIGHLIGHTER_H -#define LAVAANSYNTAXHIGHLIGHTER_H - -#include -#include -#include - -class LavaanSyntaxHighlighter : public QSyntaxHighlighter -{ -public: - LavaanSyntaxHighlighter(QTextDocument *parent); - virtual void highlightBlock(const QString &text) override; -private: - struct HighlightingRule - { - QRegularExpression pattern; - QTextCharFormat format; - }; - QVector highlightingRules; - QTextCharFormat operatorFormat; - QTextCharFormat variableFormat; - QTextCharFormat commentFormat; -}; - -#endif // LAVAANSYNTAXHIGHLIGHTER_H diff --git a/QMLComponents/controls/rsyntaxhighlighter.cpp b/QMLComponents/controls/rsyntaxhighlighter.cpp new file mode 100644 index 0000000000..3b0787e63f --- /dev/null +++ b/QMLComponents/controls/rsyntaxhighlighter.cpp @@ -0,0 +1,123 @@ +// +// Copyright (C) 2013-2018 University of Amsterdam +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public +// License along with this program. If not, see +// . +// + +#include "rsyntaxhighlighter.h" + +RSyntaxHighlighter::RSyntaxHighlighter(QTextDocument *parent) + : QSyntaxHighlighter(parent) +{ + + HighlightingRule rule; + // all these R regExp are copied from: https://github.com/PrismJS/prism/blob/master/components/prism-r.js + + // operators + operatorFormat.setForeground(Qt::red); + rule.pattern = QRegularExpression(R"(->?>?|<(?:=|=!]=?|::?|&&?|\|\|?|[+*\/^$@~]|%[^%\s]*%)"); + rule.format = operatorFormat; + highlightingRules.append(rule); + + // variables + variableFormat.setToolTip("variable"); + rule.pattern = QRegularExpression(R"(\b\w*\b)"); + rule.format = variableFormat; + highlightingRules.append(rule); + + // string + stringFormat.setForeground(Qt::darkGreen); + rule.pattern = QRegularExpression(R"((['"])(?:\\.|(?!\1)[^\\\r\n])*\1)"); + rule.format = stringFormat; + highlightingRules.append(rule); + + // keyword + keywordFormat.setForeground(Qt::darkCyan); + rule.pattern = QRegularExpression(R"(\b(?:NA|NA_character_|NA_complex_|NA_integer_|NA_real_|NULL|break|else|for|function|if|in|next|repeat|while)\b)"); + rule.format = keywordFormat; + highlightingRules.append(rule); + + // boolean and special number + booleanFormat.setForeground(Qt::magenta); + rule.pattern = QRegularExpression(R"(\b(?:FALSE|TRUE|Inf|NaN)\b)"); + rule.format = booleanFormat; + highlightingRules.append(rule); + + // number + numberFormat.setForeground(Qt::darkMagenta); + rule.pattern = QRegularExpression(R"((?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?)"); + rule.format = numberFormat; + highlightingRules.append(rule); + + // punctuation + punctuationFormat.setForeground(Qt::blue); + rule.pattern = QRegularExpression(R"([(){}\[\],;])"); + rule.format = punctuationFormat; + highlightingRules.append(rule); + + // comments + commentFormat.setForeground(Qt::darkGray); + commentFormat.setFontItalic(true); + rule.pattern = QRegularExpression(R"(#.*)"); + rule.format = commentFormat; + highlightingRules.append(rule); +} + +void RSyntaxHighlighter::highlightBlock(const QString &text) +{ + for (const HighlightingRule &rule : highlightingRules) + { + QRegularExpressionMatchIterator matchIterator = rule.pattern.globalMatch(text); + + while (matchIterator.hasNext()) + { + QRegularExpressionMatch match = matchIterator.next(); + setFormat(match.capturedStart(), match.capturedLength(), rule.format); + setStringsFormat(text, '"'); + setStringsFormat(text, '\''); + } + } +} + +void RSyntaxHighlighter::setStringsFormat(const QString &text, QChar c) +{ + int start = -1; + for (int i = 0; i < text.size(); ++i) + { + if (text[i] == c && (i == 0 || text[i - 1] != '\\')) + { + if (start == -1) + start = i; + else + { + setFormat(start, i - start + 1, stringFormat); + start = -1; + } + } + } +} + +void RSyntaxHighlighterQuick::setTextDocument(QQuickTextDocument *textDocument) +{ + if(_textDocument == textDocument) + return; + + _textDocument = textDocument; + + if(_textDocument) + _highlighter = new RSyntaxHighlighter(_textDocument->textDocument()); + + emit textDocumentChanged(); +} diff --git a/QMLComponents/controls/rsyntaxhighlighter.h b/QMLComponents/controls/rsyntaxhighlighter.h new file mode 100644 index 0000000000..19236f46d7 --- /dev/null +++ b/QMLComponents/controls/rsyntaxhighlighter.h @@ -0,0 +1,74 @@ +// +// Copyright (C) 2013-2018 University of Amsterdam +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public +// License along with this program. If not, see +// . +// + +#ifndef RLANGSYNTAXHIGHLIGHTER_H +#define RLANGSYNTAXHIGHLIGHTER_H + +#include +#include +#include +#include +#include + +class RSyntaxHighlighter : public QSyntaxHighlighter +{ +public: + RSyntaxHighlighter(QTextDocument *parent); + + void highlightBlock(const QString &text) override; + void setStringsFormat(const QString &text, QChar c); + +private: + struct HighlightingRule + { + QRegularExpression pattern; + QTextCharFormat format; + }; + + QVector highlightingRules; + QTextCharFormat operatorFormat, + variableFormat, + commentFormat, + keywordFormat, + stringFormat, + booleanFormat, + numberFormat, + punctuationFormat; +}; + +class RSyntaxHighlighterQuick : public QQuickItem +{ + Q_OBJECT + Q_PROPERTY(QQuickTextDocument* textDocument READ textDocument WRITE setTextDocument NOTIFY textDocumentChanged) + +public: + RSyntaxHighlighterQuick(QQuickItem * parent = nullptr) : QQuickItem(parent) {} + + QQuickTextDocument * textDocument() { return _textDocument; } + + void setTextDocument(QQuickTextDocument * textDocument); + +signals: + void textDocumentChanged(); + +private: + RSyntaxHighlighter * _highlighter = nullptr; + QQuickTextDocument * _textDocument = nullptr; +}; + +#endif // RLANGSYNTAXHIGHLIGHTER_H diff --git a/QMLComponents/controls/textareabase.cpp b/QMLComponents/controls/textareabase.cpp index 3394c08ae5..8c43f69b55 100644 --- a/QMLComponents/controls/textareabase.cpp +++ b/QMLComponents/controls/textareabase.cpp @@ -20,7 +20,7 @@ #include "analysisform.h" #include "boundcontrols/boundcontrolsourcetextarea.h" #include "boundcontrols/boundcontroljagstextarea.h" -#include "boundcontrols/boundcontrollavaantextarea.h" +#include "boundcontrols/boundcontrolrlangtextarea.h" #include "boundcontrols/boundcontrolcsemtextarea.h" @@ -53,7 +53,8 @@ void TextAreaBase::setUp() switch (_textType) { case TextType::TextTypeSource: _boundControl = new BoundControlSourceTextArea(this); break; - case TextType::TextTypeLavaan: _boundControl = new BoundControlLavaanTextArea(this); break; + case TextType::TextTypeLavaan: _boundControl = new BoundControlRlangTextArea(this); break; + case TextType::TextTypeRcode: _boundControl = new BoundControlRlangTextArea(this); break; case TextType::TextTypeJAGSmodel: _boundControl = new BoundControlJAGSTextArea(this); break; case TextType::TextTypeCSem: _boundControl = new BoundControlCSemTextArea(this); break; default: _boundControl = new BoundControlTextArea(this); break; From 72667a76532d49d933bb6635ec480aeb4604296d Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 7 Sep 2024 03:00:37 +0000 Subject: [PATCH 37/70] updated translation files --- Desktop/po/jaspDesktop-de.po | 8 ++++++++ Desktop/po/jaspDesktop-eo.po | 8 ++++++++ Desktop/po/jaspDesktop-es.po | 8 ++++++++ Desktop/po/jaspDesktop-fr.po | 8 ++++++++ Desktop/po/jaspDesktop-gl.po | 8 ++++++++ Desktop/po/jaspDesktop-id.po | 8 ++++++++ Desktop/po/jaspDesktop-ja.po | 8 ++++++++ Desktop/po/jaspDesktop-nl.po | 8 ++++++++ Desktop/po/jaspDesktop-pl.po | 8 ++++++++ Desktop/po/jaspDesktop-pt.po | 8 ++++++++ Desktop/po/jaspDesktop-pt_BR.po | 8 ++++++++ Desktop/po/jaspDesktop-ru.po | 8 ++++++++ Desktop/po/jaspDesktop-tr.po | 8 ++++++++ Desktop/po/jaspDesktop-zh_Hans.po | 8 ++++++++ Desktop/po/jaspDesktop-zh_Hant.po | 8 ++++++++ Desktop/po/jaspDesktop.pot | 8 ++++++++ 16 files changed, 128 insertions(+) diff --git a/Desktop/po/jaspDesktop-de.po b/Desktop/po/jaspDesktop-de.po index fcc874271f..f2b9b97769 100644 --- a/Desktop/po/jaspDesktop-de.po +++ b/Desktop/po/jaspDesktop-de.po @@ -5516,3 +5516,11 @@ msgid "" msgstr "" "Die minimale Anzahl von numerischen Werten ist %1. Variable %2 hat nur %3 " "verschiedene numerische Werte" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop-eo.po b/Desktop/po/jaspDesktop-eo.po index 06c0ebc4fe..f99d219f99 100644 --- a/Desktop/po/jaspDesktop-eo.po +++ b/Desktop/po/jaspDesktop-eo.po @@ -5050,3 +5050,11 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop-es.po b/Desktop/po/jaspDesktop-es.po index b5f67fd809..7eefe3531b 100644 --- a/Desktop/po/jaspDesktop-es.po +++ b/Desktop/po/jaspDesktop-es.po @@ -5521,3 +5521,11 @@ msgid "" msgstr "" "El número mínimo de valores numéricos es %1. La variable %2 tiene solo %3 " "valores numéricos diferentes" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop-fr.po b/Desktop/po/jaspDesktop-fr.po index bb3ce6b4fe..47032c7bf9 100644 --- a/Desktop/po/jaspDesktop-fr.po +++ b/Desktop/po/jaspDesktop-fr.po @@ -5467,3 +5467,11 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop-gl.po b/Desktop/po/jaspDesktop-gl.po index b49825ad7d..d7235b18ed 100644 --- a/Desktop/po/jaspDesktop-gl.po +++ b/Desktop/po/jaspDesktop-gl.po @@ -5494,3 +5494,11 @@ msgid "" msgstr "" "O número mínimo de valores numéricos é %1. A variable %2 ten só %3 valores " "numéricos diferentes" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop-id.po b/Desktop/po/jaspDesktop-id.po index bb494e5930..a567dd1a3a 100644 --- a/Desktop/po/jaspDesktop-id.po +++ b/Desktop/po/jaspDesktop-id.po @@ -5119,3 +5119,11 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop-ja.po b/Desktop/po/jaspDesktop-ja.po index d7b5a407e6..224f3f826b 100644 --- a/Desktop/po/jaspDesktop-ja.po +++ b/Desktop/po/jaspDesktop-ja.po @@ -5407,3 +5407,11 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop-nl.po b/Desktop/po/jaspDesktop-nl.po index 42a85a3e4e..93dd8280aa 100644 --- a/Desktop/po/jaspDesktop-nl.po +++ b/Desktop/po/jaspDesktop-nl.po @@ -5431,3 +5431,11 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop-pl.po b/Desktop/po/jaspDesktop-pl.po index d629437d7a..21d628614e 100644 --- a/Desktop/po/jaspDesktop-pl.po +++ b/Desktop/po/jaspDesktop-pl.po @@ -5440,3 +5440,11 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop-pt.po b/Desktop/po/jaspDesktop-pt.po index cd860cd44d..76ea2596f3 100644 --- a/Desktop/po/jaspDesktop-pt.po +++ b/Desktop/po/jaspDesktop-pt.po @@ -5346,3 +5346,11 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop-pt_BR.po b/Desktop/po/jaspDesktop-pt_BR.po index 4d28a9423c..01f3fb8f8f 100644 --- a/Desktop/po/jaspDesktop-pt_BR.po +++ b/Desktop/po/jaspDesktop-pt_BR.po @@ -5346,3 +5346,11 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop-ru.po b/Desktop/po/jaspDesktop-ru.po index f0b5a6072d..6b28a71944 100644 --- a/Desktop/po/jaspDesktop-ru.po +++ b/Desktop/po/jaspDesktop-ru.po @@ -5390,3 +5390,11 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop-tr.po b/Desktop/po/jaspDesktop-tr.po index 74d1fd00d6..4eb657fd0a 100644 --- a/Desktop/po/jaspDesktop-tr.po +++ b/Desktop/po/jaspDesktop-tr.po @@ -5064,3 +5064,11 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop-zh_Hans.po b/Desktop/po/jaspDesktop-zh_Hans.po index ab8f097b4c..f476f11e2b 100644 --- a/Desktop/po/jaspDesktop-zh_Hans.po +++ b/Desktop/po/jaspDesktop-zh_Hans.po @@ -5272,3 +5272,11 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "数值的最小数量为 %1。变量 %2 仅有 %3 个不同的数值" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop-zh_Hant.po b/Desktop/po/jaspDesktop-zh_Hant.po index 84c6ff2602..df4b4f3892 100644 --- a/Desktop/po/jaspDesktop-zh_Hant.po +++ b/Desktop/po/jaspDesktop-zh_Hant.po @@ -5206,3 +5206,11 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" diff --git a/Desktop/po/jaspDesktop.pot b/Desktop/po/jaspDesktop.pot index c67886a932..89158c13a9 100644 --- a/Desktop/po/jaspDesktop.pot +++ b/Desktop/po/jaspDesktop.pot @@ -5020,3 +5020,11 @@ msgid "" "Minimum number of numeric values is %1. Variable %2 has only %3 different " "numeric values" msgstr "" + +msgctxt "AsyncLoader|" +msgid "Loading New Data Set" +msgstr "" + +msgctxt "ActionButtons|" +msgid "New" +msgstr "" From 3ef092b4b134001ac5f918750dfebe58905740fe Mon Sep 17 00:00:00 2001 From: Julius Pfadt <38500953+juliuspfadt@users.noreply.github.com> Date: Mon, 9 Sep 2024 09:49:17 +0200 Subject: [PATCH 38/70] add sem data example (#5637) * update SEm example * delete empty data library files in SEM * delete traces of social participatio data and add translationn * add reliability csv file * add reliability jasp file * Add json files * add description * add Chinese description Co-authored-by: Shun Wang --------- Co-authored-by: boutinb Co-authored-by: Shun Wang --- .../13. Reliability/ADD symptoms.csv | 1163 +++++++++++++++++ .../13. Reliability/ADD symptoms.jasp | Bin 0 -> 3392945 bytes .../14. SEM/Grand Point Average.jasp | Bin 9297915 -> 9915669 bytes .../14. SEM/Political Democracy.jasp | Bin 228751 -> 283630 bytes Resources/Data Sets/index.json | 7 + Resources/Data Sets/index_de.json | 7 + Resources/Data Sets/index_nl.json | 7 + Resources/Data Sets/index_zh_Hans.json | 9 +- 8 files changed, 1192 insertions(+), 1 deletion(-) create mode 100644 Resources/Data Sets/Data Library/13. Reliability/ADD symptoms.csv create mode 100644 Resources/Data Sets/Data Library/13. Reliability/ADD symptoms.jasp diff --git a/Resources/Data Sets/Data Library/13. Reliability/ADD symptoms.csv b/Resources/Data Sets/Data Library/13. Reliability/ADD symptoms.csv new file mode 100644 index 0000000000..67a9cf64d3 --- /dev/null +++ b/Resources/Data Sets/Data Library/13. Reliability/ADD symptoms.csv @@ -0,0 +1,1163 @@ +ASSK_1,ASSK_2,ASSK_3,ASSK_4,ASSK_5,ASSK_6,ASSK_7,ASSK_8,ASSK_9 +2,2,1,2,3,2,2,3,4 +0,0,0,0,2,4,1,3,2 +1,0,1,1,1,0,2,0,0 +0,2,0,0,2,0,0,3,0 +1,1,1,0,1,0,1,2,0 +2,3,1,2,2,1,1,3,3 +1,1,1,1,1,1,1,2,1 +1,1,2,2,2,3,1,2,2 +1,1,2,0,0,1,0,1,0 +2,1,3,2,2,2,0,3,1 +1,1,0,0,2,0,0,2,0 +3,3,4,4,4,4,1,4,1 +1,2,2,0,2,2,1,3,0 +1,1,0,1,3,2,2,3,1 +1,1,0,0,1,1,0,1,0 +3,3,0,2,3,3,1,3,2 +1,0,0,0,0,0,0,1,0 +3,2,2,1,2,2,3,3,2 +2,1,2,1,2,3,1,2,1 +0,0,0,0,0,0,0,1,0 +3,3,2,3,2,3,4,3,3 +2,2,2,1,1,2,1,2,1 +3,3,2,3,3,2,2,4,2 +2,1,0,2,1,1,3,3,2 +1,1,3,0,2,2,2,2,2 +2,1,2,1,0,1,0,0,0 +0,1,2,1,1,1,2,2,0 +0,1,2,0,1,1,1,1,1 +2,0,2,0,3,0,3,2,2 +2,1,1,1,0,1,2,1,2 +0,0,0,0,0,0,0,0,0 +2,2,2,2,3,3,3,3,2 +1,1,1,1,1,1,1,1,0 +2,2,0,0,1,2,0,2,1 +2,2,2,2,2,0,1,2,1 +1,0,3,0,0,1,1,1,0 +1,2,0,0,0,0,0,2,0 +2,2,0,0,1,0,0,1,1 +1,1,3,1,1,1,1,2,1 +3,2,2,0,0,2,0,1,0 +1,0,1,0,1,0,1,1,0 +1,2,2,1,1,1,1,2,2 +1,1,2,0,1,1,1,2,1 +2,1,0,1,1,1,2,1,1 +2,1,0,0,1,0,0,1,0 +2,1,2,1,1,0,2,1,0 +1,1,2,1,2,0,0,2,1 +1,2,2,2,0,1,4,4,0 +1,1,1,1,1,1,3,3,2 +1,1,1,1,1,2,2,2,2 +0,1,0,0,2,0,0,2,0 +2,2,2,0,2,1,0,2,0 +3,2,3,2,3,2,2,4,2 +2,2,3,2,2,0,1,3,0 +2,1,2,2,2,4,1,2,1 +0,1,1,0,0,0,0,1,0 +1,1,3,0,1,2,1,2,1 +0,1,0,0,0,0,0,0,0 +0,1,0,0,1,0,1,1,0 +1,1,1,1,2,1,0,2,0 +1,2,1,0,1,1,2,1,0 +2,3,2,1,1,2,1,3,1 +0,0,0,0,0,0,0,0,0 +3,4,2,2,4,3,4,4,2 +0,0,0,0,0,0,0,1,0 +1,1,0,1,1,0,1,2,1 +3,1,2,1,2,2,1,0,1 +1,3,2,1,3,2,2,3,1 +1,3,3,3,2,2,1,4,0 +0,1,0,0,0,0,0,2,0 +3,3,1,3,3,3,3,3,1 +1,1,0,0,1,0,0,2,1 +1,0,1,0,1,0,0,1,1 +1,1,0,1,0,0,0,3,0 +0,0,0,0,0,0,0,1,0 +2,2,2,2,2,2,1,2,2 +2,1,1,0,3,1,4,3,1 +1,1,0,0,1,0,1,1,0 +2,1,2,1,1,1,0,1,0 +1,1,0,1,1,0,1,2,1 +2,1,1,2,2,2,1,1,2 +1,1,1,0,1,1,2,1,1 +2,2,2,1,4,3,0,4,2 +1,1,1,2,0,0,2,0,0 +1,0,0,0,2,2,0,2,0 +2,2,1,2,1,2,2,2,1 +0,2,0,1,2,3,0,1,0 +1,1,2,0,2,0,0,2,0 +0,0,0,0,0,0,0,0,0 +2,2,3,2,2,0,2,3,2 +1,2,0,0,1,1,1,2,2 +1,1,1,1,0,1,0,2,0 +0,0,0,0,0,0,0,0,0 +3,3,2,1,1,3,1,4,3 +2,3,1,1,1,2,1,3,2 +3,1,0,1,1,2,0,2,1 +2,3,1,1,4,4,4,4,4 +2,2,2,1,2,2,1,2,2 +2,2,0,0,1,3,1,2,0 +2,3,3,3,3,3,2,4,4 +4,4,3,4,4,4,4,4,4 +3,2,2,1,1,2,2,2,2 +3,0,3,2,0,2,2,2,3 +2,4,2,1,2,3,0,4,3 +3,2,2,0,0,0,0,1,2 +1,2,2,1,2,1,2,2,1 +3,3,2,2,3,4,2,3,2 +2,1,1,0,2,1,3,1,2 +1,1,0,0,0,0,2,0,0 +3,1,2,2,1,0,1,2,0 +2,0,0,1,2,1,1,2,0 +2,3,2,2,4,3,2,3,2 +1,2,2,1,2,2,2,2,1 +2,2,2,2,2,3,2,3,2 +0,0,0,0,0,0,0,0,0 +2,3,3,1,2,1,2,3,1 +3,2,0,3,4,4,3,1,4 +1,1,2,1,2,2,1,2,2 +3,3,2,3,3,3,3,3,3 +3,3,3,3,2,2,4,4,3 +1,2,0,1,2,1,0,2,0 +1,1,1,1,1,1,1,1,0 +1,1,2,0,2,2,2,3,0 +0,1,1,0,2,0,2,1,0 +2,2,2,2,3,3,1,2,2 +1,1,1,0,0,1,2,1,0 +3,3,1,2,2,3,0,3,0 +2,2,0,1,3,2,0,2,0 +2,0,0,0,0,2,0,0,0 +1,0,0,0,1,1,1,1,0 +0,1,2,2,1,1,1,1,1 +2,1,1,1,0,2,1,2,0 +1,1,1,1,1,1,1,1,1 +1,1,2,1,2,0,2,2,2 +0,2,1,0,0,0,0,2,0 +1,2,2,1,2,2,0,2,0 +2,2,1,1,1,3,0,4,1 +1,1,0,1,1,1,2,1,1 +1,1,2,2,2,0,3,2,0 +2,2,1,2,2,2,1,2,1 +1,2,1,1,1,0,0,1,0 +1,2,2,0,1,1,1,1,1 +2,1,2,1,1,0,1,2,1 +3,2,3,1,2,2,3,4,1 +0,2,3,1,3,1,3,3,2 +1,1,1,1,2,2,2,1,0 +2,2,0,2,2,3,1,2,0 +1,1,2,1,2,1,2,1,2 +1,1,0,1,1,1,0,3,0 +0,0,0,0,0,0,0,0,1 +2,1,0,1,0,0,2,2,0 +2,3,2,1,0,0,3,4,2 +2,2,1,0,1,1,1,2,1 +0,0,1,1,0,0,1,0,0 +2,2,2,1,2,1,2,3,1 +1,1,2,1,1,0,2,2,0 +1,1,1,0,1,1,1,1,1 +1,2,1,1,1,1,1,2,1 +3,4,1,3,4,2,4,4,2 +2,2,2,2,2,2,1,2,0 +1,2,2,1,1,1,1,3,1 +2,1,2,1,1,1,0,2,0 +2,1,2,2,1,1,1,2,0 +1,0,1,1,0,2,2,1,0 +0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,1,1,1 +1,1,1,0,1,0,1,1,0 +0,2,2,2,1,1,2,2,1 +1,1,0,0,0,1,1,1,1 +0,0,1,0,1,0,0,2,0 +0,0,0,0,2,0,0,2,0 +2,3,2,3,2,2,3,4,2 +2,2,2,3,3,3,2,2,2 +1,0,2,1,0,1,0,1,0 +2,1,2,1,1,1,2,2,1 +2,0,0,0,1,0,0,0,0 +0,0,0,0,0,0,0,1,0 +0,1,0,2,0,0,1,3,1 +0,0,0,0,0,0,0,0,0 +2,1,1,1,1,1,1,2,1 +1,2,0,1,0,2,1,0,2 +2,1,0,0,1,2,0,2,1 +0,1,1,1,0,0,1,1,1 +2,1,2,2,0,0,0,2,2 +0,0,0,0,0,0,0,0,0 +1,1,2,1,2,1,1,2,2 +3,3,3,3,3,2,2,3,3 +2,2,2,1,2,3,1,2,2 +3,2,2,1,3,0,2,1,0 +2,2,3,2,2,2,2,2,1 +1,2,2,1,1,0,1,1,1 +2,1,1,1,2,3,0,3,1 +1,0,0,0,0,0,0,1,0 +1,0,0,0,0,1,2,1,0 +1,1,0,1,2,0,1,2,1 +2,1,2,1,2,0,2,2,2 +2,4,1,2,3,3,1,4,0 +3,2,2,3,3,4,2,3,3 +0,0,1,0,0,0,0,0,0 +1,1,0,0,0,1,2,1,1 +3,3,3,3,2,3,3,3,3 +2,2,0,2,2,2,3,2,2 +0,0,0,1,0,0,0,1,0 +0,1,1,0,0,1,0,0,1 +2,3,0,1,2,1,0,3,0 +1,1,0,1,0,0,0,1,0 +1,0,0,1,2,0,2,2,2 +1,1,1,1,1,1,1,0,0 +2,0,0,1,0,0,0,2,0 +2,2,2,1,1,2,1,1,0 +1,1,2,2,1,0,2,2,1 +2,1,2,1,1,0,1,1,1 +0,0,0,0,0,0,2,2,0 +2,0,0,0,2,1,0,1,2 +3,3,1,3,2,2,2,2,2 +3,3,3,1,1,3,1,4,2 +2,3,1,2,3,2,2,2,2 +2,2,2,2,2,1,3,2,3 +1,0,2,0,0,0,2,2,0 +1,1,2,2,0,1,1,2,1 +1,0,2,1,2,0,1,1,1 +1,1,1,0,0,0,1,1,0 +1,2,1,1,2,1,0,2,1 +0,1,2,0,0,0,1,0,0 +1,0,0,0,1,1,0,1,1 +0,1,1,0,1,1,0,2,0 +2,3,2,2,3,1,2,3,2 +0,0,0,1,0,0,0,0,1 +1,2,2,0,1,1,1,3,0 +4,3,3,2,1,4,1,3,1 +3,3,2,2,3,4,0,4,4 +1,2,0,1,0,2,0,3,0 +1,0,2,0,1,1,1,2,0 +2,2,1,2,2,2,0,3,0 +3,2,2,1,1,2,2,3,2 +2,2,1,1,2,2,1,2,0 +0,0,4,1,2,4,0,0,0 +2,1,3,2,3,2,1,2,2 +1,1,0,0,1,0,1,1,0 +2,3,0,3,3,2,4,3,2 +2,3,1,1,2,3,2,4,1 +3,3,1,3,3,4,3,3,3 +1,0,0,0,1,0,1,1,1 +1,1,0,1,0,1,0,1,0 +2,1,0,1,2,2,2,2,0 +2,1,1,1,1,1,1,1,0 +2,0,0,0,1,1,0,3,1 +1,1,2,1,1,0,0,1,1 +2,1,1,0,1,1,1,1,1 +2,0,0,0,0,0,0,0,0 +2,1,1,1,1,2,2,1,1 +2,1,2,0,0,0,2,2,1 +1,1,0,0,1,1,1,2,1 +1,2,2,3,3,2,3,4,3 +2,2,1,1,2,2,1,2,1 +1,1,0,0,1,0,0,0,0 +2,2,1,1,1,1,1,1,1 +1,1,1,1,1,1,2,2,2 +1,1,2,0,0,0,0,2,1 +4,4,2,3,4,3,3,4,3 +0,2,1,0,0,0,1,0,0 +2,1,1,1,1,2,2,2,1 +1,1,1,1,1,2,2,1,1 +2,1,2,0,0,0,0,2,2 +2,2,0,0,2,2,2,3,2 +1,0,1,1,0,1,1,1,0 +1,0,1,0,1,0,1,0,1 +0,2,2,2,4,2,1,4,0 +1,1,0,0,1,1,1,0,1 +2,2,2,1,3,1,3,3,3 +2,1,2,1,2,3,1,3,1 +1,0,2,0,0,0,0,2,0 +1,2,2,0,2,1,3,2,1 +1,1,0,0,1,1,2,0,0 +3,2,2,1,2,1,2,2,2 +2,2,2,1,2,1,2,2,2 +1,1,0,1,2,2,1,2,2 +0,0,1,0,0,1,1,1,1 +2,1,1,1,1,2,2,1,0 +2,2,1,1,3,1,0,3,1 +2,1,3,1,1,2,3,3,1 +2,2,3,1,2,1,0,3,1 +1,1,0,1,2,2,1,3,0 +2,2,0,2,1,2,2,1,0 +2,1,2,0,2,1,2,2,1 +3,3,2,1,3,3,3,3,2 +1,1,0,0,2,0,0,1,1 +2,2,0,0,1,2,2,3,2 +1,1,1,1,1,1,2,1,1 +2,1,0,1,0,2,1,1,1 +0,2,3,2,2,2,2,2,1 +1,1,2,1,1,2,0,0,0 +0,0,0,0,0,0,0,0,0 +0,0,1,0,1,0,1,1,0 +1,1,1,1,0,1,0,1,0 +1,2,2,1,3,1,0,3,2 +1,1,0,3,0,0,0,3,0 +0,1,1,0,0,0,0,1,0 +2,1,1,1,1,2,1,2,1 +1,0,0,0,0,0,0,2,0 +2,1,2,2,1,2,1,1,0 +1,1,0,1,2,0,2,2,0 +2,3,1,2,2,2,0,3,0 +0,0,0,1,0,1,0,0,0 +0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,0,1,0 +3,2,1,2,1,2,2,3,0 +2,1,2,1,3,3,2,3,2 +0,0,0,0,0,0,0,0,0 +2,1,0,1,1,0,3,1,2 +3,3,1,3,3,3,1,3,3 +0,1,0,0,2,0,1,1,0 +2,1,0,0,0,1,0,0,0 +1,1,1,1,1,1,2,1,0 +2,2,3,1,1,2,1,2,1 +1,0,2,0,1,0,1,0,0 +1,0,2,0,2,0,4,0,1 +0,0,0,0,0,0,0,0,0 +2,1,0,1,0,1,2,2,1 +3,3,2,2,2,3,2,3,1 +1,1,1,0,1,0,0,2,1 +1,0,0,1,0,0,1,0,0 +1,1,3,2,0,0,2,1,1 +2,2,2,1,3,3,2,3,1 +1,1,0,0,1,0,2,0,1 +0,2,2,1,0,2,0,2,0 +1,0,0,0,0,0,0,2,0 +2,2,0,0,2,2,3,2,3 +0,0,2,1,0,0,0,0,0 +1,1,1,1,0,1,0,2,1 +3,3,3,3,2,4,3,3,3 +3,4,4,4,4,2,4,2,4 +0,1,2,0,0,0,0,0,0 +1,0,2,0,2,0,0,0,0 +2,1,2,2,1,3,0,2,3 +2,2,0,1,4,2,0,4,1 +1,2,3,1,1,1,1,3,1 +2,3,3,1,3,3,4,4,4 +4,4,3,4,4,4,2,3,3 +1,2,2,0,1,0,2,3,2 +0,0,0,1,1,1,1,2,1 +3,2,1,1,3,3,0,4,0 +2,2,2,2,2,2,2,3,2 +0,2,1,1,2,1,2,1,1 +1,1,2,1,0,0,0,2,0 +2,1,0,0,1,1,0,1,0 +1,0,1,0,0,1,1,0,0 +1,2,0,0,2,1,2,2,1 +0,0,0,0,2,0,0,1,0 +2,2,2,1,1,1,0,2,0 +1,1,2,1,1,1,1,1,1 +1,3,2,2,1,2,1,3,1 +2,1,0,1,2,0,2,3,1 +1,1,1,1,0,0,1,0,0 +0,1,0,0,1,0,0,2,0 +2,3,3,3,3,2,3,4,3 +1,0,1,1,1,1,1,1,0 +1,1,1,0,0,1,1,1,0 +2,1,2,2,0,0,2,2,2 +0,0,1,0,0,0,0,1,0 +1,1,2,1,1,1,1,2,1 +1,0,1,1,1,2,1,2,1 +1,1,2,1,2,3,2,2,2 +0,0,0,0,0,0,0,0,0 +0,0,0,0,2,0,0,0,0 +0,0,0,0,2,0,0,0,0 +0,0,0,0,0,0,0,0,0 +2,2,0,0,0,2,0,3,0 +2,2,1,1,1,1,2,2,1 +2,3,2,2,1,3,2,3,2 +2,3,1,2,2,1,2,3,2 +1,0,1,1,1,0,1,0,1 +1,0,0,2,0,0,0,2,3 +1,0,2,0,1,1,0,0,0 +2,2,2,2,2,2,1,2,3 +1,0,0,0,0,0,0,2,0 +0,0,0,0,0,0,0,1,0 +2,2,1,0,0,0,2,4,0 +1,0,1,1,1,0,2,2,2 +1,1,1,0,2,2,3,2,0 +0,1,0,0,1,0,0,1,1 +2,2,2,2,3,3,2,3,1 +1,0,0,1,0,0,1,1,0 +0,3,0,2,1,2,0,2,0 +3,3,3,2,3,3,3,3,3 +2,2,1,0,0,1,0,1,0 +1,3,1,1,4,3,4,4,1 +1,3,0,4,4,3,1,3,2 +4,4,2,0,3,2,1,4,4 +2,2,3,2,2,3,4,4,2 +1,1,1,0,1,1,1,1,1 +1,3,0,1,3,2,0,3,0 +2,0,1,1,0,2,1,3,0 +0,0,0,0,0,1,1,1,0 +0,1,2,1,0,0,2,2,2 +1,1,1,1,2,2,1,3,1 +1,1,1,1,1,1,1,1,1 +0,0,1,0,0,0,2,1,1 +3,3,2,3,2,4,4,4,2 +2,3,2,1,2,2,0,3,0 +0,0,1,0,0,0,0,0,0 +1,1,2,0,0,0,1,2,0 +1,1,0,1,1,1,1,1,1 +0,0,1,0,0,0,0,0,0 +1,1,0,1,1,0,0,1,0 +1,0,0,0,0,1,1,1,0 +1,2,2,1,0,0,3,3,2 +3,2,2,2,2,3,2,3,1 +1,2,3,2,3,1,2,4,2 +2,2,1,1,1,3,1,2,0 +1,1,0,0,1,2,1,1,1 +3,4,2,3,3,2,2,4,2 +1,0,3,0,1,2,1,1,2 +1,2,1,1,1,2,2,3,0 +3,3,0,2,2,3,2,3,1 +1,1,2,1,1,0,1,1,0 +2,2,2,3,2,1,2,3,1 +2,2,2,1,2,1,2,1,1 +1,1,2,1,2,1,1,2,0 +2,2,3,2,1,4,1,2,2 +0,0,0,0,0,0,0,0,0 +1,1,2,1,2,1,1,2,3 +2,2,2,1,0,0,1,2,1 +2,2,1,2,1,0,2,2,2 +1,1,1,1,1,1,1,1,1 +2,2,1,1,1,2,1,3,2 +1,2,2,0,0,1,2,2,0 +2,2,2,2,2,1,1,2,3 +1,1,2,0,1,0,2,2,0 +1,1,0,0,1,0,2,1,0 +1,1,1,1,1,1,2,1,2 +2,1,0,1,2,2,1,1,1 +2,1,2,2,0,1,2,3,0 +3,2,2,0,1,1,0,2,2 +2,2,0,2,0,2,0,2,2 +2,2,2,1,1,0,1,3,1 +0,1,1,0,1,0,1,1,0 +1,0,1,2,1,1,1,1,0 +2,2,2,1,1,1,4,2,2 +2,2,2,2,2,3,2,4,2 +2,2,3,1,1,1,1,3,1 +2,1,0,0,1,2,0,1,0 +2,2,2,2,2,2,2,2,2 +3,3,2,3,2,3,2,3,1 +3,2,1,1,2,2,1,2,1 +2,2,2,1,1,1,0,2,2 +2,1,3,2,0,2,1,1,0 +2,2,2,0,2,2,1,1,0 +1,3,2,2,2,2,2,3,3 +3,2,2,2,3,3,3,4,3 +2,2,1,2,2,2,2,2,1 +1,2,2,0,2,3,0,4,0 +1,0,1,0,1,0,1,2,0 +2,3,3,3,3,2,3,3,3 +1,1,2,1,0,1,1,1,1 +2,2,2,2,3,1,3,2,2 +0,0,2,0,0,0,2,2,0 +2,3,2,2,3,3,3,4,2 +2,0,1,2,2,2,0,2,0 +1,0,0,0,1,1,1,1,1 +2,1,0,0,2,0,3,2,0 +1,1,1,1,1,0,2,1,1 +1,1,0,1,1,1,1,1,0 +2,1,2,0,1,2,1,2,0 +2,2,1,0,2,3,3,3,0 +1,2,1,1,0,1,0,2,0 +1,1,2,1,0,0,1,0,0 +1,2,1,2,3,3,1,3,3 +2,3,2,2,3,2,2,3,2 +1,2,3,1,1,1,1,2,1 +1,0,0,0,0,0,0,0,0 +2,2,1,1,2,1,2,3,2 +3,4,2,2,4,4,0,4,2 +0,0,2,0,1,0,2,2,0 +2,2,1,1,1,1,1,1,1 +1,1,1,0,1,0,1,0,0 +1,0,1,1,2,0,0,0,0 +2,1,1,2,1,1,1,1,1 +1,1,1,1,1,1,2,1,1 +4,4,3,3,4,3,4,4,4 +1,2,2,0,1,0,0,2,0 +2,2,2,1,1,0,3,2,0 +2,3,2,0,2,2,3,4,2 +1,2,2,2,2,1,1,2,1 +2,2,2,1,2,2,2,2,2 +2,2,0,2,0,0,3,3,0 +0,0,1,1,2,1,0,2,0 +2,1,1,1,1,1,2,2,1 +1,1,2,0,1,1,1,1,2 +2,1,2,1,0,2,0,2,0 +1,2,1,1,2,2,2,2,1 +1,1,1,2,1,1,3,2,2 +2,2,2,1,3,0,3,3,2 +2,1,0,0,1,0,1,1,0 +2,2,1,1,3,2,3,2,2 +2,1,2,0,1,0,0,2,0 +2,3,1,2,2,3,1,3,2 +1,2,0,2,0,0,0,0,0 +0,0,0,0,2,1,0,1,0 +3,1,2,2,1,4,0,2,0 +1,0,1,0,1,0,2,0,0 +1,1,1,1,1,1,2,2,2 +1,1,2,0,2,0,0,2,0 +1,1,1,2,1,0,1,1,0 +2,3,2,2,2,3,1,4,2 +2,2,2,2,2,2,2,2,2 +2,2,3,2,2,1,1,3,0 +1,2,2,0,3,0,2,2,1 +0,2,0,1,2,0,1,2,1 +2,1,1,0,1,1,0,2,1 +2,3,2,3,2,3,2,4,2 +1,1,1,0,1,1,1,1,0 +1,1,2,1,1,1,2,2,2 +2,2,0,0,1,1,1,2,1 +1,2,2,2,1,2,0,3,0 +0,0,0,0,0,0,0,0,0 +1,2,2,0,1,1,2,2,0 +0,1,1,0,1,0,1,1,1 +2,2,2,2,1,1,1,1,1 +2,2,2,1,2,2,1,2,0 +1,1,1,1,1,1,2,0,2 +2,2,1,2,2,2,0,2,0 +2,3,3,3,3,3,3,3,3 +2,2,2,2,2,2,2,2,2 +3,2,3,3,3,3,3,4,3 +1,1,0,0,0,1,0,2,2 +2,2,0,0,2,2,1,3,0 +0,2,1,0,0,1,0,2,0 +1,2,2,1,2,1,2,2,1 +1,2,1,1,3,2,2,3,1 +1,1,2,1,1,0,1,2,0 +2,3,2,1,1,1,0,2,2 +1,0,0,0,0,0,0,0,0 +2,0,1,0,1,1,2,2,0 +2,2,2,0,4,3,3,4,1 +2,1,0,0,0,3,0,2,1 +2,2,0,2,0,0,2,2,0 +2,2,4,1,2,3,1,2,3 +1,1,1,0,2,1,2,2,0 +2,2,1,1,0,2,1,2,1 +2,3,1,2,3,2,1,3,1 +2,2,2,2,3,2,1,3,2 +2,2,3,1,1,1,1,2,2 +2,2,1,2,2,1,1,1,0 +1,0,2,0,1,1,1,0,1 +0,1,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0 +3,2,1,2,3,1,0,2,1 +1,0,0,0,1,0,1,0,0 +1,1,1,0,0,0,1,2,1 +2,2,2,2,2,2,2,2,2 +1,2,1,1,2,1,1,3,0 +2,2,2,1,2,1,1,1,0 +0,1,0,0,1,1,1,2,0 +1,0,0,1,0,1,0,0,0 +1,1,3,1,1,2,4,1,0 +1,1,1,0,1,0,0,1,1 +1,1,1,0,0,0,1,2,1 +3,2,2,2,2,1,1,1,2 +1,1,3,1,1,2,1,3,1 +1,1,0,1,0,0,0,2,0 +2,2,0,2,2,2,2,2,0 +2,1,2,1,2,1,0,2,1 +2,3,1,3,3,2,3,3,2 +2,2,0,0,0,2,1,3,1 +2,2,2,2,2,2,2,2,2 +2,2,2,0,1,0,1,1,0 +1,0,3,1,1,2,0,1,0 +1,2,3,1,0,0,2,3,0 +2,0,2,0,0,2,0,1,0 +3,3,0,1,2,2,2,3,0 +2,2,1,2,2,2,1,3,0 +1,2,2,1,2,1,3,3,1 +1,2,1,1,1,1,3,2,2 +2,2,2,2,2,3,1,2,1 +1,2,3,0,1,1,1,3,0 +3,2,3,2,2,3,0,4,2 +1,1,2,2,0,2,0,3,1 +1,1,1,0,0,1,1,0,0 +1,2,2,2,2,0,1,2,2 +0,2,1,0,0,0,1,1,0 +1,1,1,0,0,0,0,1,0 +1,0,2,2,2,0,1,1,1 +2,0,0,1,1,2,1,1,0 +1,2,1,1,2,1,0,3,1 +2,2,2,3,2,2,1,2,1 +2,2,2,1,3,3,2,4,3 +2,2,0,0,1,0,0,2,0 +1,1,0,1,1,1,1,1,2 +1,0,0,0,0,0,0,0,0 +2,2,2,2,2,2,1,2,1 +2,2,2,1,2,2,2,2,1 +2,2,2,2,2,2,2,3,2 +0,0,0,0,0,1,0,0,0 +0,1,1,0,0,0,0,0,0 +0,1,0,0,0,0,0,0,0 +1,3,2,2,1,3,2,3,1 +1,2,2,1,1,0,0,2,0 +1,1,1,0,1,0,1,1,0 +1,1,0,0,1,0,0,1,1 +1,0,2,1,2,0,0,1,0 +2,2,1,1,2,1,2,2,2 +1,2,1,1,2,1,1,2,1 +2,2,2,2,2,2,2,2,2 +2,2,3,1,3,2,2,4,2 +1,2,2,1,0,0,0,0,0 +1,1,2,1,1,2,2,2,1 +2,2,2,1,2,2,2,2,0 +2,2,2,2,2,2,2,2,1 +3,0,3,0,0,0,1,0,0 +1,1,1,1,1,1,1,1,1 +2,3,3,2,3,2,2,2,1 +1,2,1,1,1,2,2,2,0 +1,3,1,0,1,0,3,4,0 +3,3,2,2,3,3,2,3,1 +1,1,0,1,1,2,0,3,0 +2,1,0,1,0,1,1,1,0 +2,2,2,2,2,2,2,2,2 +2,1,0,0,0,2,0,2,0 +1,1,1,0,1,1,0,1,0 +0,0,0,0,0,0,0,0,0 +1,2,0,1,1,1,2,2,1 +0,0,0,0,0,0,0,1,0 +2,2,2,1,1,2,1,2,0 +1,0,1,0,1,0,1,0,0 +2,1,1,1,1,1,1,1,2 +1,1,2,1,2,1,2,2,1 +1,1,2,1,1,1,1,2,1 +2,0,2,0,0,0,0,2,0 +1,1,1,0,0,1,1,2,0 +2,3,3,2,2,2,1,3,1 +2,2,2,2,1,2,2,2,2 +2,2,2,1,2,1,2,2,1 +1,2,2,0,3,2,2,3,2 +1,3,4,3,3,4,3,4,1 +2,1,2,1,2,2,2,2,2 +0,0,0,0,0,0,1,0,0 +2,2,1,1,2,1,1,2,1 +0,0,2,0,0,0,0,1,0 +1,2,0,0,1,1,1,2,0 +1,2,3,0,1,1,0,1,1 +1,3,2,2,2,0,1,3,0 +2,2,1,1,2,1,2,3,2 +2,1,1,2,2,2,2,3,2 +2,0,2,1,1,2,2,1,1 +2,2,2,2,2,3,3,2,2 +2,3,1,2,1,0,2,3,0 +2,4,2,3,2,2,2,4,2 +1,1,1,1,2,1,1,1,0 +2,1,1,0,0,0,2,0,2 +0,2,2,0,0,0,0,2,0 +1,2,1,1,1,1,1,3,1 +1,1,2,1,2,2,3,2,2 +2,2,2,1,2,2,2,2,2 +1,1,1,1,0,1,1,2,2 +1,1,0,0,0,1,0,1,0 +1,2,2,1,2,0,2,2,2 +1,2,1,1,0,0,2,0,1 +1,2,2,2,1,0,0,2,0 +3,2,1,1,1,1,2,3,0 +0,0,0,0,0,0,0,0,0 +2,1,2,1,1,2,1,2,2 +1,2,1,0,0,0,1,2,0 +2,2,4,2,2,2,3,4,0 +2,2,2,2,2,0,1,2,2 +0,4,4,0,4,4,0,4,4 +0,0,0,0,0,0,0,0,0 +2,2,2,2,2,2,2,2,2 +0,1,0,0,0,0,1,0,0 +3,3,1,1,2,2,3,3,2 +4,2,3,2,4,2,4,2,4 +2,3,1,2,2,3,2,4,2 +2,1,1,1,2,0,0,2,0 +1,2,2,1,2,1,2,2,2 +2,2,2,2,2,2,2,2,2 +2,2,0,0,2,2,2,2,0 +2,1,0,0,1,2,0,2,2 +2,2,1,1,1,2,1,2,2 +2,1,1,0,2,0,1,2,0 +1,1,2,2,2,2,1,2,2 +0,1,0,0,0,0,0,0,0 +2,2,0,0,0,1,1,3,2 +2,1,2,1,2,0,1,2,0 +1,2,1,2,2,2,2,3,1 +1,0,2,0,1,0,1,2,1 +2,3,2,1,1,0,2,4,0 +0,0,0,0,0,0,0,0,0 +1,1,2,0,1,2,1,3,0 +1,2,1,1,2,1,2,2,1 +2,1,2,1,1,3,1,2,2 +2,2,2,2,2,2,2,2,2 +2,2,3,2,3,0,2,4,3 +2,2,2,1,2,2,1,2,2 +2,2,3,2,1,1,3,3,2 +1,2,0,0,3,2,3,3,2 +2,2,2,3,2,3,2,2,2 +1,0,0,0,0,0,0,0,0 +3,1,0,2,1,3,0,1,1 +1,1,0,1,0,0,0,1,1 +1,2,1,1,1,1,1,2,1 +1,1,2,0,1,1,0,1,0 +2,2,1,1,1,2,1,3,1 +0,0,2,1,2,1,0,2,1 +1,3,2,0,1,0,0,1,0 +2,2,2,2,3,0,0,3,1 +2,1,3,2,2,3,1,1,4 +1,2,2,2,2,1,2,1,0 +0,1,1,2,1,1,1,1,0 +1,2,1,3,3,2,2,3,2 +3,2,2,3,3,2,3,2,1 +3,1,3,2,3,3,2,2,1 +1,2,0,1,2,0,0,3,0 +1,1,0,0,0,0,1,1,0 +1,2,2,1,1,1,1,2,1 +1,1,0,1,1,1,0,2,1 +0,1,1,1,1,0,1,2,1 +1,1,0,0,2,0,0,2,0 +1,0,2,1,1,1,1,2,1 +1,1,0,1,1,1,0,0,0 +0,0,0,0,1,0,0,0,0 +0,0,0,0,1,0,0,1,0 +2,2,2,0,3,2,4,2,0 +2,3,3,3,3,2,1,4,1 +1,2,2,2,2,1,1,2,2 +1,0,1,0,1,1,0,1,1 +0,1,1,0,1,1,0,1,1 +1,2,2,2,2,2,3,2,1 +1,2,2,0,0,1,2,2,1 +1,0,0,0,0,0,2,0,0 +2,2,1,1,1,0,0,2,0 +3,2,2,2,2,2,2,2,2 +2,1,3,1,1,2,2,4,1 +1,1,1,1,2,2,2,2,2 +1,2,2,1,2,2,1,3,2 +2,2,0,1,2,1,1,4,0 +1,1,0,1,1,2,1,2,0 +1,2,1,1,1,2,1,2,1 +2,2,3,1,2,3,0,3,2 +1,1,2,0,0,0,2,1,2 +0,0,0,0,1,0,0,2,0 +3,3,2,3,4,3,2,4,3 +1,1,1,1,1,1,1,2,0 +1,2,1,1,2,2,2,2,2 +0,1,0,1,1,2,1,2,1 +1,2,2,1,1,1,2,2,2 +1,1,2,1,1,1,0,1,0 +2,2,3,3,2,2,1,2,0 +0,2,3,2,1,0,1,3,0 +1,1,1,1,1,1,1,2,1 +1,2,0,1,2,2,1,2,1 +2,2,2,1,1,2,0,2,2 +1,1,2,2,1,2,0,2,0 +1,1,4,2,0,0,2,2,1 +2,3,0,2,0,1,0,3,0 +3,1,2,2,1,1,1,3,2 +1,1,1,2,2,2,1,1,1 +1,2,0,2,2,0,0,3,0 +0,0,0,0,0,0,0,0,0 +2,3,0,0,2,2,0,4,0 +2,2,1,1,2,1,1,2,1 +2,2,2,2,2,2,2,2,2 +0,0,0,0,0,0,0,0,0 +1,2,0,0,0,1,2,2,2 +0,2,2,0,0,0,2,2,2 +2,2,1,1,2,2,1,1,1 +1,1,2,1,1,1,1,1,1 +1,2,2,1,2,2,2,2,0 +2,1,0,1,1,1,1,2,1 +0,1,2,0,1,1,2,3,1 +0,2,2,0,0,0,0,3,1 +2,2,2,2,2,3,2,3,1 +1,1,0,1,1,1,2,0,0 +1,0,0,0,0,0,0,0,1 +0,2,1,1,1,2,0,3,0 +0,1,1,0,0,1,0,1,0 +1,1,1,1,0,0,0,1,0 +0,0,0,0,0,1,1,2,1 +1,0,2,0,0,0,1,1,0 +2,2,0,0,1,0,2,3,2 +1,1,2,2,1,2,2,2,1 +1,1,1,2,1,1,0,0,1 +1,2,2,2,2,2,0,2,0 +2,1,1,0,1,0,2,1,1 +2,1,0,1,1,2,1,2,1 +2,1,2,2,2,2,2,2,2 +1,0,2,0,0,1,0,2,0 +0,0,0,0,0,0,0,1,0 +1,1,0,1,0,0,1,0,0 +2,2,3,2,1,3,1,3,1 +2,2,1,0,0,0,0,0,0 +2,2,2,0,1,2,2,2,1 +2,0,2,0,2,4,1,3,1 +3,2,2,3,2,3,2,2,2 +0,0,1,0,0,0,0,0,0 +1,0,0,1,0,1,0,1,0 +2,2,3,1,3,2,1,4,2 +1,1,1,1,1,0,1,1,1 +1,2,2,2,2,1,2,2,2 +1,1,2,0,0,2,0,2,2 +2,2,3,2,1,3,3,4,2 +1,2,2,0,1,0,2,3,1 +2,3,2,2,3,1,3,3,2 +0,0,0,0,0,0,0,1,0 +1,1,0,1,1,0,0,0,0 +2,3,0,2,2,1,0,3,0 +1,2,1,1,2,1,0,2,2 +1,1,1,0,1,0,0,2,1 +1,3,2,1,0,1,2,3,0 +1,1,0,0,1,0,0,1,0 +2,3,2,1,3,2,1,3,1 +2,1,1,1,2,2,2,2,1 +2,3,3,0,2,0,2,4,0 +1,0,2,1,0,1,1,0,2 +2,2,1,2,2,1,2,1,0 +1,0,1,0,1,0,1,1,0 +1,1,0,1,0,2,1,1,1 +3,2,1,1,2,2,1,3,1 +0,1,2,0,1,2,0,1,0 +0,1,0,0,1,0,1,1,2 +3,1,1,1,0,1,2,2,0 +3,3,3,3,3,4,2,3,3 +4,3,4,3,4,4,3,4,2 +2,1,1,0,2,0,0,1,0 +1,2,1,1,0,1,1,3,0 +0,0,1,1,1,0,3,0,2 +2,1,1,0,1,0,3,3,2 +0,2,2,0,1,1,2,2,0 +1,1,1,1,1,1,1,2,1 +2,2,2,2,3,3,0,3,2 +3,2,2,2,2,2,2,2,2 +1,1,2,0,1,1,2,2,1 +1,1,2,0,0,2,0,2,1 +2,2,2,3,2,3,2,3,2 +1,0,1,0,0,0,2,0,0 +1,1,1,0,2,0,1,1,0 +0,0,0,0,0,0,0,1,0 +0,1,1,1,1,1,1,1,1 +2,3,1,1,0,2,0,3,2 +2,2,1,2,0,0,1,2,2 +3,3,2,2,2,3,1,3,2 +1,1,2,0,1,0,0,1,0 +2,1,1,2,3,3,2,1,2 +0,0,0,0,0,0,0,0,0 +1,2,1,0,2,1,0,2,1 +2,2,1,0,1,0,2,3,0 +2,2,2,2,0,0,1,2,2 +2,2,2,1,0,0,2,0,0 +1,0,1,0,0,1,0,2,0 +1,1,2,1,2,1,2,2,1 +1,0,1,1,1,1,1,1,1 +2,1,1,1,0,1,2,0,1 +3,2,2,2,2,0,2,0,2 +1,1,1,0,0,1,0,1,0 +2,2,2,2,1,1,3,2,1 +1,1,0,1,1,1,0,1,0 +1,1,2,1,0,0,2,0,0 +3,3,2,2,2,2,1,3,0 +0,0,0,0,0,0,0,2,0 +1,2,1,2,1,1,1,1,1 +1,1,0,1,1,0,0,1,0 +0,0,1,0,0,0,0,1,0 +0,1,0,0,0,0,0,0,0 +2,2,2,0,1,1,2,1,1 +1,2,2,0,2,1,0,3,0 +2,1,2,3,2,2,0,3,0 +2,2,3,2,4,2,2,4,2 +1,2,0,1,1,1,1,2,1 +2,2,1,0,0,0,0,0,0 +1,1,2,1,1,0,2,2,1 +2,2,2,3,2,3,2,4,0 +2,2,2,2,2,0,2,3,1 +1,1,1,1,1,1,0,1,0 +0,2,2,0,2,0,0,2,0 +2,2,1,1,2,2,2,3,1 +1,1,1,1,1,1,1,2,2 +2,2,2,2,1,3,2,1,1 +1,1,1,1,1,1,1,1,1 +1,2,2,1,1,1,1,2,1 +2,2,2,1,2,3,1,3,2 +1,0,0,1,2,0,0,0,1 +1,1,1,3,4,3,4,4,4 +2,2,0,2,0,2,0,3,0 +2,2,2,1,2,1,1,3,1 +2,2,0,1,2,2,2,2,0 +1,3,2,1,2,2,2,3,1 +0,1,0,1,0,0,0,2,0 +2,2,3,2,2,2,2,3,2 +0,0,0,1,0,0,0,0,0 +2,2,3,0,2,0,2,3,3 +2,2,2,2,2,1,0,3,0 +2,2,1,2,2,2,1,2,1 +2,1,2,2,1,2,1,3,1 +1,1,2,1,1,1,1,2,2 +1,1,2,0,0,0,1,2,2 +2,1,1,0,0,0,1,2,1 +1,2,2,0,1,2,1,1,1 +2,3,2,2,2,2,2,3,2 +1,2,2,0,0,1,0,2,0 +1,1,1,2,2,0,1,1,1 +3,1,1,1,1,2,1,3,1 +2,3,2,2,2,2,2,3,2 +2,3,2,2,2,2,2,2,2 +1,0,0,1,0,0,1,0,0 +2,2,0,0,1,2,3,2,2 +1,2,3,0,2,1,2,3,1 +2,2,2,1,1,2,2,2,1 +1,1,2,0,1,2,0,3,2 +0,2,2,0,0,0,0,2,0 +0,0,3,0,0,1,0,0,0 +0,0,0,0,0,0,0,0,0 +2,1,2,1,0,0,1,1,0 +1,0,0,0,0,1,0,1,0 +0,1,0,0,1,0,1,0,1 +1,1,2,1,0,2,0,1,0 +2,2,1,2,2,2,1,3,2 +2,1,2,1,1,1,1,1,1 +0,1,0,0,1,0,0,2,0 +2,2,1,2,2,1,2,2,0 +2,2,1,1,2,2,1,3,1 +3,3,2,1,2,1,1,3,2 +0,1,0,1,0,4,1,2,0 +3,2,3,3,3,4,3,3,3 +1,2,2,1,2,2,0,1,0 +0,0,0,0,1,0,0,1,0 +3,3,1,2,3,3,1,2,0 +0,2,0,0,0,0,0,1,2 +2,0,0,1,1,1,2,3,2 +2,2,1,1,2,2,2,3,3 +2,2,2,1,0,2,2,2,2 +1,1,1,0,1,1,1,1,1 +2,2,2,1,2,1,0,2,2 +2,2,1,1,2,2,1,3,0 +2,2,2,2,1,2,1,3,2 +2,2,1,1,1,1,2,1,1 +1,1,0,0,1,1,1,2,0 +1,0,0,0,0,0,0,0,0 +1,1,0,1,2,0,2,1,2 +1,1,1,2,1,0,2,1,0 +2,2,1,1,1,0,0,1,0 +2,0,2,1,3,4,0,1,0 +2,0,0,0,0,0,0,1,0 +1,2,2,1,2,2,1,2,1 +1,1,0,0,1,1,1,1,0 +3,2,1,1,2,2,1,1,2 +3,2,1,2,3,0,3,4,2 +0,0,0,0,0,0,0,0,0 +2,2,2,1,1,1,1,2,0 +2,2,4,2,0,0,0,4,2 +2,2,0,3,2,3,2,3,2 +2,3,2,3,2,3,2,3,3 +2,2,0,3,2,2,3,2,2 +1,2,2,0,2,2,2,2,1 +2,1,2,0,1,2,2,2,0 +2,2,2,0,0,2,0,3,0 +2,2,1,1,1,0,2,2,0 +0,1,1,1,0,1,1,1,1 +3,3,2,2,1,3,1,3,3 +1,2,3,1,0,0,0,3,2 +2,2,2,2,1,2,0,2,1 +0,1,1,1,1,1,1,1,1 +1,1,0,1,1,1,1,1,1 +2,0,1,0,2,2,1,1,1 +1,1,0,0,0,1,0,1,0 +1,0,2,2,1,1,0,2,1 +1,2,0,0,1,0,1,1,1 +2,2,2,2,0,2,2,2,1 +1,0,0,1,3,0,1,0,0 +2,4,3,3,3,3,4,4,3 +2,2,2,1,1,2,2,2,2 +3,0,3,3,2,3,2,3,3 +1,3,1,2,4,1,2,4,3 +2,1,1,2,2,0,2,2,2 +0,1,0,0,0,0,0,1,0 +1,1,3,1,1,0,1,2,1 +2,2,0,1,1,1,0,2,1 +2,2,2,2,1,1,0,3,0 +2,2,1,1,2,2,2,2,2 +1,1,1,0,1,1,1,1,1 +0,0,1,0,1,1,1,1,1 +0,0,0,0,1,2,3,0,1 +2,3,2,2,2,2,1,3,1 +2,1,2,1,2,1,2,2,1 +0,0,2,0,2,1,1,0,0 +2,2,2,2,2,2,1,2,0 +2,2,1,1,2,2,2,2,2 +0,1,3,1,2,2,1,3,1 +2,2,2,3,2,1,2,3,2 +2,1,2,0,2,2,2,2,1 +1,1,1,1,1,1,0,1,1 +2,2,0,0,0,2,2,2,0 +3,2,2,2,3,3,3,3,2 +2,2,3,2,2,2,1,3,1 +0,2,2,0,1,0,2,3,0 +2,2,0,0,2,0,0,2,0 +2,1,0,0,0,0,0,2,0 +0,2,3,1,0,0,2,2,1 +0,0,2,0,0,1,0,2,1 +2,1,1,1,1,1,1,1,1 +2,2,3,2,3,2,2,2,2 +1,2,1,0,0,1,2,2,3 +1,2,3,0,0,0,0,3,0 +2,1,2,1,2,1,1,3,0 +2,1,1,1,1,2,1,2,0 +1,2,0,0,0,0,0,2,0 +0,0,0,0,0,0,0,0,0 +2,2,2,3,3,2,2,3,2 +1,1,1,0,1,1,0,1,0 +1,1,0,0,0,0,0,0,0 +0,1,2,1,0,2,0,3,2 +1,2,2,2,2,2,2,2,2 +1,0,0,0,0,0,1,1,0 +1,1,0,0,0,0,1,1,1 +2,2,2,1,0,0,0,0,0 +2,2,3,2,2,2,3,3,1 +1,2,0,1,2,3,1,3,1 +1,1,0,0,2,1,0,2,0 +2,2,2,2,2,3,2,4,2 +1,1,2,2,2,2,2,2,1 +3,3,1,2,2,2,2,4,2 +1,2,3,3,3,1,1,3,2 +1,1,0,1,1,1,0,1,0 +1,0,1,0,0,1,1,2,0 +0,1,0,1,0,1,0,1,0 +1,2,0,0,1,2,1,2,0 +1,0,2,2,1,0,0,1,0 +2,2,2,2,3,2,2,3,3 +3,2,2,1,1,0,1,2,2 +2,2,1,2,3,4,4,3,3 +0,0,0,0,0,0,0,0,0 +2,2,2,0,1,0,2,2,1 +2,2,1,1,1,1,1,1,1 +3,3,3,3,2,3,2,3,2 +3,3,2,2,3,2,1,3,1 +0,0,0,0,0,0,0,0,0 +1,1,1,1,1,1,1,2,1 +1,1,1,1,2,1,0,2,0 +0,0,0,0,0,0,0,1,1 +2,2,2,1,2,3,2,2,2 +2,2,1,1,2,1,1,3,1 +1,1,1,1,1,1,1,1,1 +0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0 +1,1,1,0,0,0,0,1,0 +2,2,1,1,1,0,2,2,1 +1,2,0,1,1,1,1,2,1 +1,3,2,2,2,0,0,3,1 +2,1,1,1,2,1,1,1,1 +1,2,2,0,2,1,2,2,1 +2,1,2,2,1,1,1,2,1 +2,1,2,3,2,3,2,3,2 +1,1,1,1,1,1,1,1,1 +1,0,1,1,1,1,1,0,0 +2,2,2,2,2,2,2,2,2 +2,0,2,0,2,0,0,1,1 +2,2,1,1,2,2,1,3,1 +1,1,2,1,1,1,0,1,0 +1,0,1,1,1,0,1,1,0 +2,2,1,0,1,1,2,2,2 +2,2,2,2,1,1,2,3,1 +1,2,2,2,1,2,2,1,2 +1,0,0,1,1,1,3,2,0 +3,3,2,1,3,1,2,1,2 +0,0,0,0,0,0,0,0,0 +0,0,0,0,0,0,0,0,0 +1,2,1,1,1,1,2,2,1 +3,3,3,3,3,2,3,4,3 +2,2,3,2,2,3,2,2,2 +0,0,0,0,0,1,1,0,0 +2,1,1,2,2,2,1,2,1 +2,2,2,2,1,2,1,2,1 +1,1,3,3,1,1,1,1,1 +2,3,3,3,1,2,4,4,3 +1,2,1,2,2,1,2,2,1 +1,1,2,2,1,2,1,2,1 +0,0,0,0,0,0,0,0,0 +2,1,2,2,2,2,2,2,2 +2,2,1,2,1,2,0,3,0 +0,0,0,0,1,1,0,1,0 +2,1,1,2,2,3,2,2,1 +1,2,3,2,2,0,2,2,0 +2,2,2,1,1,2,1,3,1 +2,2,1,1,1,1,1,3,2 +1,1,2,1,0,2,2,2,1 +2,2,1,2,0,0,0,2,3 +1,1,1,0,0,1,2,3,1 +1,0,0,1,1,1,1,0,0 +2,2,1,1,2,1,2,2,0 +1,1,2,1,1,1,1,1,0 +1,2,2,1,1,0,2,3,1 +1,1,1,1,0,1,1,1,0 +2,2,0,0,2,3,2,4,0 +1,2,3,2,2,0,1,3,1 +1,1,1,1,1,1,1,1,1 +3,2,2,3,2,1,2,2,2 +3,0,0,0,0,0,0,0,0 +0,1,1,0,0,0,1,2,0 +1,1,0,0,2,1,2,1,3 +1,2,0,0,2,0,0,3,2 +0,0,0,0,0,0,0,0,0 +0,2,0,2,3,2,2,2,0 +1,1,2,0,1,1,2,0,2 +2,0,0,0,0,0,2,2,0 +1,1,2,2,2,2,2,2,2 +1,2,2,0,1,0,1,1,0 +2,1,2,1,1,1,1,1,1 +0,1,3,1,1,0,1,3,2 +1,1,1,1,1,0,1,1,1 +2,2,0,0,1,3,3,3,0 +2,2,1,1,2,0,1,2,1 +2,1,1,0,1,1,0,1,1 +0,0,0,0,0,0,0,0,0 +3,3,2,2,4,3,1,4,0 +0,1,1,1,0,1,0,1,0 +1,1,1,1,0,0,1,1,0 +2,2,2,1,2,2,1,2,1 +1,0,2,0,0,0,0,2,0 +1,1,1,1,0,1,0,2,0 +1,2,0,1,2,3,1,2,1 +0,0,2,1,0,0,3,0,0 +1,2,0,1,1,1,1,2,1 +0,0,2,0,2,0,0,0,0 +0,1,0,1,0,0,0,0,0 +2,2,2,3,4,0,2,3,2 +0,1,2,0,0,0,1,2,1 +2,2,2,2,2,2,2,2,2 +2,1,2,1,1,1,0,2,0 +1,0,4,0,0,0,0,0,0 +2,3,2,3,3,0,4,4,3 +2,0,3,1,1,1,0,2,1 +2,2,1,2,2,3,1,4,2 +2,1,0,0,1,2,1,2,1 +1,2,0,0,0,0,2,2,0 +1,3,2,3,2,2,1,3,2 +2,2,1,1,2,1,1,2,2 +1,2,1,2,1,0,2,2,1 +1,1,1,0,1,1,1,1,0 +1,2,2,2,2,2,2,3,0 +1,1,2,1,1,1,2,1,1 +1,2,0,2,2,2,3,3,3 +2,3,4,3,2,0,3,3,2 +0,2,2,1,0,1,1,2,0 +2,2,2,0,0,0,0,3,0 +1,0,0,0,0,0,0,0,0 +2,2,1,1,2,2,1,2,2 +1,2,4,1,2,3,4,3,2 +2,2,0,2,2,2,2,2,1 +0,2,0,0,0,0,0,2,0 +2,2,2,2,1,1,2,3,1 +1,1,1,0,1,1,1,2,1 +2,2,1,1,0,1,2,3,1 +1,1,1,1,2,2,1,2,0 +2,1,0,0,1,0,1,1,0 +1,1,1,0,1,1,1,1,0 +2,2,2,2,2,2,2,2,2 +2,1,1,1,1,2,1,2,1 +1,1,2,1,2,1,1,0,1 +2,3,2,1,0,1,0,3,0 +1,1,1,0,1,2,0,2,0 +0,0,0,0,0,0,0,0,0 +2,2,2,1,2,1,2,2,1 +1,0,0,0,1,0,0,1,0 +1,1,0,0,0,0,0,1,0 \ No newline at end of file diff --git a/Resources/Data Sets/Data Library/13. Reliability/ADD symptoms.jasp b/Resources/Data Sets/Data Library/13. Reliability/ADD symptoms.jasp new file mode 100644 index 0000000000000000000000000000000000000000..2294ef7184e08d4a4693eac46397f7727ebde719 GIT binary patch literal 3392945 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

    p#J7iPHjc6OB?U1op0&-HmWvHIiHS+&_mF@i&c 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

    F#>DV8AyMGwS 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

    1AoycQ0g%_ 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

    N`UMBt&gON zAD@Kzip_qj1iQnC8)aQ?VN%lcd*+NAQ#u&TaEWJf{&z4_(5+-unq_uacyfL>Fr!l^ zYrLt*Ec6){ffpvfm@frZh;p0I%>O-&O9`Dv0vKdYp7c0DqtsLhYz|2C&vzqexeZ43 zCZEJJv?@6EfsaWQC077Th(`-X&UZj&oS>JEJb%FoLdJf6Vziy%%R=B0FYUw~bZb6H z@gFM^0zEhW7WkuLcxd=4T0V!cIovSfL8pmd1&bo~Set4-m6+bHJWFlqCK<+gy;>UV zT>6ZHf~KRRV{#Z!(cp?wxZ3xTQrk75X~vC({vx!IG>DDRH-x7^GkCIzp2>`v?FC}F zxw%}NoON0#9d8)bAA~EPD=_RxNeNuqLtBSqBdgm3m1jQ;0fRUm#BJ2c!qd>)>{~N- zIWK4wE#wBRrmGbktWC9Jbqwp&Anw2HhR6vY2ASU808LKqRhTszD7HLXe+U!HRxfEq zq}Tz<|7{fr4aFpWuH5zJdvbDeD7n&pu}Hr&?TL02D+2>Vn!-g{a1T_*$zgA^E{G0f z)j|BX^nk9}obMsKut>vK9~>O4WSCG`SePP!>jQef+o@*uC+Bpr&jefh>(_K!Vl(&= z@EkmD&!g`YH1#4hwZ5t8T&)y&E^R_obM%^7E_urM<-SLX(q zbZ2P?c_o7YoaxHcnnnh2@p3{!DO#HFATN{2Z~xJ)k|dXfwgcR;JU(ZPH3qrD5c#sw zeyL2kr82^-yhv#2Z{S65`GpuK@(tSPc~~}vhlqMhZC@pa$%p9ArGdd_>(+FFT?;)% z*{&zJ`(>q&%mh+?R*M>ODoTrVf)(T(Fz|g#8Wh z*RBJd(zhj&yf;{*<_Qy9M#$ret+FN1W3vO+LqT#d zq_gP3Pw?qh+-Vh)s^8ga@Wa;H{ioT%z9R&qN~ie<&41H7X7gSv39G zOK6c4+ygpWb+mXcgXE;sikH?oa`GSzPV>>~6EwH4xucXWH2WTZkibZ$VDyfHRka@! z?7I<^h*2~Z&Doi$QL+h=m9z;>`zK{gqU<{(Z!ZEcu-j<*L=!y-5g3Ty)Ha0eL z#@w8o&3}{2j$O4*>tE=Cjz`MyuT+yOtII|IM3YtE@WJ{Mnl*Gz`+y|C*z2^=#xMtU zsq|8ZOxwk+oGHf;;Mu?=!npLMd3C3r=tpfVmMqmJp?n&^VOd{Vfz`D&R3(oS)zW<4 zn`hv(Q?IpYF9k4v=}C2aZ}OAe=VT1h>bcJwA&Q`A0j>eQ1Bm&0u5;mQpQ&2mOKnF- zyz?O<{{ecqut7Q63I$X-{NNu?v>)n$XXt&l^I)BT%YQ z?c(7pafOB3U`G-%*47MrmlK5C5b)IcUq`!qzV%teE12a;Yl*d)8qwRBLjA?&0{mBDGKp=Cqrhk8q2Mmbfvo-~Z zoI~@^3j=uYsivs4)m8t2qYtFvPcE*BGn-fcNL;wewxH?m|3-5Lao#BJ3Pc{TWG_l~ z%_56u($Y;^6$Bhm3N$Y#5yCbz<2WO1Lgri3m9Dmh2cO-Ui~y0jHE3_9qW?AG(Pdy& zPIKu66f7#sgZ4`f>n)-{kfo~JPoNnhGHITXyf*2%ff8$Uh{Z08noHnm-x_65jPT(` z@XMLjcr=;z(}xDURkgs>p06n-2}Q^uC|g>lTqukwd0e9-~A_;8u+@=1ik?0h^-^Y(~?_~0@Xzj3$6M`WfZd!Cg%c)h2q3mCz zzw4|kGisn!a!QS2$vefBh@t(-4}6PB4@OK12CTLQtd;ZXIxjs|WJAmCKq2;ho%VG_ zQjLA?G)46K<7#-ft-^gHiV(Mq+MCw@Gh1fcx-nil8)+;X^U8T8Psz zcC*Rk%t{bEuTN64sh?Mp%#V1)3e+YB#?+A@RhkL6_*uU2jv@NS6mbuAyUw1Yj2?){ ziL`vIr&n^87W_?ucj$sE!#4soIBi$QpVmGL(NN+_7s4K6PUw|tx1&^ld4HMVD}=p? z&SgE{ zZT^i(&83%>i!0Z9Y4CfP{LWfQH}(AW1R(=AH@7dMz9*X^!LW(b#ARgY(C&-LF#YIb zMO=@tR%Djn`dLUfb^BpaT3fxBD$&-h-PG4SlVyAVzjTS8;XM89TL-6< zQ`_O9YA(f3L8E@xHZ@&5Bw>8wY_;Nz^mgtG?*A2a;-aX_El2q`T}WBip(VLIY!b;^ z_D^CmGJ@lN!Y5U9jQlP^`ytMfp5(J$RLA!!$OvG0)bn1*@d(^E%!x=MK}X~^qSA8n zXVqL(Q4uI$STdweyKOPRVV9gAe?4+chv`i{aD1gq&5Mz|`^#1JT7v)#!!PmsJ0p3A z8Go66{$TU(_V@*74|c|~6|Ob$xl{o;y_i+qdFhd)n^|phGdosc_L=&#ISBbLc|f?H zwtL&I$1Nwy4_Ey@0_IcisOX)3KYc4v5I55zN+(4c1H||sQ>E_DMHn}v+~?=#SNTKP zJ^?NLJ_59mR$9&PE$YO~^4-~k-4^|?+oTRgLI-3qnzIM{2@VC4W`B^V)!s|}_cI9p zp270g5rI?5ukZi6ZGEb$sz;;lr({Fth~xJ5&}=?1wR*N}Y?2gOZ3eUlsm!XHHw_dz zl=GSRs4uEIJ?h1d4m5~N%)uT#t1zO5_T63xo}vwk1xgbbjxqtHrKKPDy*&pHJSRZd zUjwRov`I3Wf5(}?@)i5YQbYtD&y8x}FHdmX2S7ytiR435SMB^Wqtn+CDhnVCT;)Oa zpxx@YxFnX)p`t09e<#h^8hcq~IpgUwkvBc}-5d1;;3V zb|WQQ5`&?xL%9IW(E{H`%AF>HOop^RQ=AunJp6EBCshlV5;^hph~;k@3`+oJ${QlU3519m4?|JxW}e-B-$oK)J*{@1^4 z);lm1=5&?p(WEaQdb6~Jb)L5;$xYZY=)Fz9p90Lyy9NfY^Z>G70EU3bLL0)(9M>X* zPx4+Xv;c+;Ol<}DWci$0+WoIb?t@)RfVh8KC4VZ4FSap)J0zTOBlUg~-#oox45+Es zv+V|OrFUWAb3PY%bA%Yc2C%KIt(=^kFy#Gzjxro{+*?2?o2Wc0oprzY_h-lq;WnFP zy-(h!-}ehWKGX{2cK9X013A-Bo`J&4(1?gRvFY|F(8~=VpJeXtj8}_%0{7|3)hBd0 z;gm(1b&X`b;^X5l+RtaBseh0}G?6hJx<3i{B|@-<(I0cjGab0Y)1Rv^<5uoe0ZL*x zOSk63zkKrc4$8N*Sst#=0&WIU+5iTc*&IMlm0dsp_nnw-f5q47LS*S;@mw8VuHerQ zZaRo{m2de4j{Iv&9`V`Pb0zOo#{jPj=X2`MRsqdr(JJ3ZssH^w#wTXq=H=yqp1Z}9 z`{$&}3U2_COC03o=p?0heDMB%*ra#=H~`N@dg(};i6CWq_lta1phv~LC|H>s0J!g5 zVQ0^T4*wpOqnmQjd-13WI?p~BaNU#hzBQmY2Zkj>*ffNUNaXzn9;Dc#Eq;POJuX=M zs&pfv!5S+5XzK+KHZU-VH}xg}4XOj@eRNvkQ{HfauTFM12otTQ%8B|A;+TTyh=@L5 zJ%5n&W9!}RVV8f1i0R$aRrBo#xGi)TPtIo9SGo|JdryNY2ip`PY%FH%Up~ zQu`!J-;yS~bK*q0-08e(i942gV!Dd{hi=_I&T-rSe7oU8>iTpcaiXjK;g>j>UR*nV z{4cqq)>d0M-63u1X14mChzsL;J6=;GMJwOr93$0?(}I+bc;CJtbw0k`&{9&;dl{ER zMMZ_j<2$Kigo$*&1JuvX&bnfA^_y=Gx(O4xcqTg^0@_lkgX&>@b6#N+^`$j2FrZ>V zbrpQ??j}i55PLJh1$}^2XgqnstFpefrdD7YWtlkq`g?b|nPd-E6fY8)Zl zT`fCu&#J$_|HzRe;t~>;KQc1d(2253HAaSp?>~H?7(6GZqB6a>XgX*4*Vnf0?$EF> zUKQlss}uE&=RLk0`ywqYTm^XIimmab+uGR3Uu3yJZBs~2Nm)}1)pLs;AJ+?*9R2MqpV~1? zxOV6_1X!)S7a!L*Wdt@9pF9ck^72{;{#zwPDb>=-sxwnLwS(H{p~}@=lY5D=vEP2> zs|dj(l7sdP2nY}fI^wkL^TOCTlE?gW_0J2`=UL?y6ttXhmRxu6v&t2BEXF;fq70g= zM}D6lvvEE9v;llgLPFv?J^-ELvASx3cc@NkGxNOhzYfz)RMgSk-Mu4KnZ|(2pfwIG0M)1CXFhxn#`LDAFwqww z3kwSagBgfK@TR-T{PgrTD243wbQ1`b;_?quuoxK*&#@KHa~6zr4KM%4+{uw^Fwg=KR$_)pV=4E)2%GAA9Q- zs_#@(RP-|fe*J)-pD0*_lhFi(x*%ZEbBW{l@P0n6Iv`u1Q`ThZ~OA znZr}?)?b*X4L^Noq#7S(UD>3={JeykDO?9yR6>HRQ!F(8IIfcUJmgYYn@!DJ9I6; zoSmIf=~@bQt#W<{dS}#|RjU5)cb)NgM+OE4?M4U`Wo5WW>H2BfghNkR#?FXiFz0`_ zv|LUZ5r{l>7Tt`BFiM1Z>WqI^^7H4zRPX-w_VH^s?Kh1X%fPo?%iJ9pr@g7TTo=?- zRb68irl)_^*1q%ciMnHnYWRHdy^BsX18EQ)9sTJ@yJ7xRbBv6b*fCPl*Vfh`jNj<# zjcegoLw0xV80WZy7B+`szkdCSwhTsan`!2~XlZubmLX=<83#;MY-68@K=)6B7hUPD{6k<)4bp8WW@ z;JxwjJkZ?Q#Pf4=dtDXypuoU$=g*_#GvQW(f)!{!v8Sg8NHmwFE#~PnRSYIp^h=AU z^w4#Bdevv+pxTalY;0|Xw5Appt9Bc0%y#_jlL_M#>Ba+S74I%CF0!h9CEZZ_r=-MQ zOza*0#pB119UUEoH^e0+;htQUbl$lGcrW$Bm)hUo9+r1}CV%4`%H**6=I?(tNc`EG z3w(Sfz-`dEgsok??c69gakpR|9dP>4o%;NF8(={L{r%o)FWVBNz*1U6h%uc%dcbr^ zWtoCtf=vaqm#HL}D!J%AK+?Db=U6N?UPVZQ335LE=KGAXzPox zu&{@nk&&61*~^z%FTVNt`Bhd{PEJ10S50quVP|Itc8pGZ0t$XC0x12$w||Hd9FJkK zSQq^W0RaKDx(o)txwSRN7Ti~Cnd%q<9ydJvbVMp$PEHOTzie+`^6-mXY6oBu*tReK z>aV9R#l^)^5x2vNZ)39Fek_|jkHPR785o?wce1Vjq%nJKX&J^b>DeDKySR9Fdj-}0 zZ+Y=xL2z%LtA%pAk$Z^rNXquM4UUhzf`GS|3rR^~n%TSL#=5DM+EKn-NwQ1yTwgz; ztVvnZR)i-oDheG)?QYmVFi>XP!`U*goT1Kf*KL~SjzR0S0b=NHc#h{RoUE*kPjfdn zt+ceXwCjN}Fpd#9lcO|>n+e(3Ex;U~%3Hj8#rJypH=vgo(T7Kp9oYp1nMp}EyEW65 zN(u{)((v86Gkf=uj0~M&Fc|I8k~gch4D#g^0V)oJ`uh3}4{AfTxZf4-Kr*{*DDzb> z($cccbLux;z*Ss4O11C4*qtprdPPJ~5FK6f@#p6~KaiC-%qcKg6u@aP-_DzvEdc}Z z^gN1_v9z>=2m(^RC@JYtYRBE>_^^3F!cKFWjG)P~f|ZpO2M0%GIN+_DP&Qa0(ks~E z(H~xJKR|%1>V^@jX7^$O1Fxl^a$2%|S470c-)9wCOo+Es#jL|Py<615O-7h8F)>Mo zbF;Cb%(qEaPAs!(kb@7%e= z#3cSYT+tLLTeR&Y)zuS@D_&ZjhNEL+KBZ+3KgoJFy|Q}!I<$=cYFZ)T#EBE1Z%vPl zt@RDzJLmKB^YYG}J9pG*&~A>E@gjp{XqMH2sYWTV>gG}^3sMSZt{hgh`AtBr< z>VVd+$H=^`ZD-;`jtDLSDO@aBipxBKVG)I(^VCK>-U7F~;p5};*$7JvBEa6>o{rx} zHhL=R?AfzQ>8j64eSq?2CCMjmE)AKL)(^XV|N1-~M=2tHa3F&r_{L`C1NPi79`jL< z=hruVyu8RLkTnia88d#k$Vcz6hQu@rn^yUoZnm~W8A=Lv^}|6oXFc2!R~dVd z`OU=8FlVH(sPNDOf8UWg2yX@>JREeRVgsW+~Ni#y#@Xl{J3 zWAf@%?)5p2M}n`y@4I(p6WJ6ZFU|Uu_9PdbOz7l=wxN$(%`6Fv?c(PWu|WML5<2OA zx0l$$bGrQ)9MqKP)b&$M|N6#{cr%R!^Bd8>r;L=8s7RZutLsr_EVU1w$o?tG*)1)C zX&>lAiOG(NG3%#Kzr~$-pwFnGuFmqr_x^6}4j#9sO7<@L++obuhlt@EpI=x&XSvA5 zPn%rNy2yy?GvBED2Ou|CGR5fwNR`I8GeFPWe$>#~H~4RyABXqfw}Ejg#T>?@c>(`) zwnRBoOhMu*YhWnWaTHuf#CiyzS+rOBi(UmcBq=gM=yAgW&*L<34G*W*ZfS0A_TM1A ze)Fa*%5BK~!Gd`zg6L!#JtwEU%Kl0XT{<>rLgqUaiTeNn;6ppRyc`cr4{qQw8|2rP zTc4#ID=sNPR0@kgg!M^->;vvaT0W}=id@Ve6wIPlR#w)QBOJ@yy;ffEe5xtxd4>TC zl@%d`<;j&45Ss;hKix%>{@(D7g9Exww8Q2TZ4Mwe`S~3bWQUydPaj;Y zrS?{fu*2&>@%XG86Fz}XdwoM6Xax*MdVjvv-XhE-##p_2Mb>HDU)bWWKf&#Q&aOZSxR4lSxD;&uqjaTmEoYN zb3?QvU0kXn%*q+lZ0FJoKo36uGK2YMfjXEpDJ`wPz)TBb+&bG_XF3@L#FDDY%Jm3a z8yn9-Z+T^9?)K2@*ROx>W2`yaw?HVioZ}Y|aKj!ub_`-;knNn}jdRJ#$(5rYuZq6+ z^7656d2y>*U@J1~VZ1!rUh_OtTLl=S!}v#0SM24>mp}9A9=dn;fYAIN7>GJJdwn~I zSvfc;h^m6^_0y-97#U|E29PV!^1Qr9aJzooO(wSy{h;fG>n(p!9`>Jlc&Q@!`jV z8WHTGsc13*Jst)I(bw2Q%c8l?oaR5R{61us4D1Kjc;ONVxOrACe{~O zHV1=r@<@E2%baXM^-lW=@Xy?)oO05fq z4X&<#Yp*PiR7Ko2X)Uu*NbLZoPAg!yUds@J&V|fCQ^y}J@ajyk8wY0nz>A8Cnhlmd zQQRpR!kPBw86-+a6@%$4${_lao}OM>`UZ^@y`)Ov%Mq}j6DJFu2#zCdzPo#Sx;i=( z?3(IIN>&8CgU0Rx&~%6;gZ4{hVgd9~yssX15a!si zo&B|D8fxkz?01)DXNw(ic2-uKz@BS-XbKEFm@-ZuS$6Ijmv+ElXgLk@ce}H7&&G_Q zISQxs7SV^&A4DELJaYIjDh}#`wcngSBjS1g%$YL~?b6cIv6hXe$mSL+gg&8c7LXd{ z4tuUa04hL0Z|d3tvj%x{ij*`hGm|c@p&tFvd|g8OpNzYo{)~J6NK8!b#<|Q2d~sF| zJpRt=#Hr_pFqh8gqo{G|)~#EDfTQm8zb23$cau-LfKLSl)+QzkrM7GChBs|j$Js0PSBJm5+_n>Y*U)1}uml!iHc)(hLVYylaq4jr zk^p~y?>uwRP_HH>@8AEPl_{8?n=2tHX>4k$S!S1C9j_|);6Zg1pY@>Qo(bT*Hch5_ z(JJtG;iy?+3=NeRVGa6Y0HXWW(ooFDk8&CsQ6VA900~M;ot>SNz=EfyP;DIWh3V-R zLE_i#9G9|CQs?UGYF%AjmB*-#-;D><_6jTR0|Iup9Gauvf@Kg(XNgTjWRo|pdi}T zMaixS-I1W0?g);B+uxsTj-ewX<8s2kX|aDtdsA5%o%WLu7l)2G-`UxTkB<)l4eqe_ z6~HTyQQ@z@{;I610=5saqh>hl4aOq&)~YPu!R!X@O++u@=hsoB@G+Q6R}WGlFwWix ztl@`KNb>)n5Bwq=BC1FkH=7PcTh%dQBGL~sgr2_rzW`862M8EOe!575003H>002-+ z0|XQR2mlBGQ;-H(0000000000Qshnp5da_na%FRGb#h~6b1yJ2b97;JWmQxS00$pQ zvSuGivSuGivSxL73jhHG000001ONa40PKASU>w!a@HS0x2YjlF&j8A@o2XBtSw74k0xE_ikry zXXkd`?w;;!@+Sx5r?+q3%)EKM&Z@Z^#uscT5JF^&oE)FXZWH@cv{}1m{-`NJ zK9M8x<;RA`Kx0sdtfH7F3*64&=Eev}w;i}SG3XG3p#Q?&=k{6F^>P12)81(}`_`fU zZ~yYS#n-iK|Im=>eeQk!Z2yl&U9xs|?=Sp!L}sn1-uSrxCqwW4%ilkmK|f?jeb7N|3LZkla`HH?*EPddnG3vTJ3-2!G0foI{pd& z<9~jx?fnD$`k#LN^+6+R?)E=>Z{GWjHRb;2`~K^#;>UaYU+&rGwr~D^fd93JFU!63 zF9rTLZurev?fReZf9uUl?tgLUm;QHdf2Gsz1#A585BO~P)BhOa|L6xB<~&jQg8%Rj zell~xywm-k_Uk|5=5Gx0e^IonUHLzMp@~H~-|YXbhqbJyFI`x$<$SHp_kY}DeAX;2 zujSJxF7h>L?T4(rYhZZ|^fdPwV{V-x}6x&05jt_a55x`97`t=yNvST>p&L z^T3QN-l_Yk*87id-8t>TnOfg9_w{>l(79Ui%X2UN+pXto{ik#eHlDmi8*t8LlYckv zJ#FA0hhE-!$v=AYm%rVh4gOC4zDMrL*M|Hf@2Zg_MrgxU?7j2s_Y1V)Kbp9G z#qWhSvOxQ-@0Fd}sLB`pdFRg5%6@U)w3pxdvo@w}pAvsyx;Eyv3!1a99HNa~_j;S& z-&m-P{qm$YUOn?PZQOOw{q(Z;Zq~*x-ZJ4g5AV~)e^hn2v}dU{;qnf@xqDK7ZDP6h ztD+xF)F!@jW6z%z|6QAO(LLAA{rSJN$y46^*TOp|X_NnW%I4pF(MOwd+UEsNv^=U! z9q{(EXYQD-O}+2mpZ)OkL)x@WM}EIJBZCzG$dVXh3JAdWV*S&MErv3QK-Y@^_ zdQE$N)z5$Q#b8bQG|=hk>d9Jp_t`(Y{H-sv^09qyy|3mBt$b1c*PQ!D>J|A>#)Owh`I_~hw>yAIXL?>zF_ zEw4O}^`+(Mmv3Bm(Uy-}p83aFkG|NH)$(kgaby1W??1Hse%&488&2=h^4yI@EuVaP zf6Ma)k)Ko!Jk;{S882M@`%l`pywp9o^z_Gjx4e8`@dx?;{8`JZr)N*<{`6m4UaR<^ z?@#X=-17R(Pdu_X5^ed@U30!YBk;HdMSx@2$5 zUji3}PdxFymcQOy{OjgzkGH)2x#K8?^iV4^~G?CC=+yGjflgQ6JMiMz_vtfQKHJgq;T?+)T`*%_%LfPl{=tcV5iNiJ<@4nyTzsJA z?f19OxVCOW%bTB`Js?teeap)S*Uj!%wYBAu=ceaA{p;8LcimF^-tye7{+E2~+O|2c z)&KVOb1UDzeTx4dj|6}B*1Yrl|9;`X3%6ey%ieoBhyPIeEiLD^Q6q%)a23oi|L;1_e%<_f+w(wbFZ6 zJU9B2Ds4!w<39Oj))(5)T?_saX} z$$+o^@^5YYInS>;ZPFNR!o(r#!~c3roACOAl8y_n&?cUH=WXAwdRm(_w#$$c2G?nm z{xIf;cZFKC$$P(ObL#A0YEycJ|NVhuZWm1N-0Hv6D9an#ykP|9G=DV`%RBwiB+@X59R%HTl>4L7O>zQUAp! zy`;^&uHnb;e|VKPt4H2Tk-S0LtTUcH*#7=Iv{`@uUcVh{{;2tv&HnPGpAFOeKfLDk zf!{n;^M7^wyd}4`*R;V8R(|!x?=9T(e znHJQv`|EDmdD)qo_Tq7OhOhmrroI16=Tj!0m*`)9_p4=Z&-eTNzwhY-`(OI?%Ejki+0XyV6D3pnEV(v*zx+j;@Y>n_4-TH(_RQUH`#&n(^X|HrKllIRwg+D7e(pT~;i|vh zx_IBK{!bPkzvhJHn*Y<_=aG9(o9+MX-n*ZOOqk*Sa?=NYZT#J1ni%kAJO5+Vn(u+V zf9rSBXq%M&%a*leC_Jm$Cr-OimIR4eb>D|(z-4G!N?88n%3il=TBPm_8D5Qv%Y`B!)ITm z^?CZb!*9Oyw$^XrN6QbrKU*u=c+;rvcOB6BfB%jTj;wk_8*q5>zWpS@po;+@mIgF?ohTi@~1m| zcMi$Y$_6}E{n_X5Yojl?vGkLjuW4iUeROWW&wi$j9no_2^8Dwuu`jP*{Ko&CrHwmh zf8*o%Pif=F_qnR%-j!q!rX5~7uV3U9ZTfeg`R&E0HfS>@lx`pNK(039$tUkEJNprBX7IeTK0p6m zZRV%iyxYHjhBoW0_fA{&?OQc}=L_EIGIWvVzf3HDUk%EMmD9_vzoekM zrk#EI&qn{fpQhb+TFsKH4{F*c>!ysZ>#3Cwedeq4vTxSP*FW|0D>vq9<)@D?ELzc| zl^=TZ(m(y?Qmy>SCpI*Ep0Aa^|Hje_FaNzZyIt{wPEYO7W)J*U;~f{)YqO`Uts45o ztJ>^E-~0ZZ^&7R>>+d>kK+Y6x_O>^tytMzIHhbr(%MnQ z<0sneePjAu)Z=|^_Ws)z`Q`<**(Y_lc~8eTWB%q@)?8vHy-=ncp*O z9Q)_Ukt0`f)|KHv1G2`C1yzB@Kv{J(7C+|uDh4>~k|2NoAm97yf1Aj*tqs)Iha%fy z!j>KTKUYV|IRebG5Or5mT|-kMrERP0qP0!o03+DGY+ht{C|Vb(4MrM?ApZszsdd~D zXsBNm42J^SLg7&3KGf2fvawUk#&9X?ni^Mx>yVyLPnZd%V_8K-Fj5(=Ylu0!D=HMM z^Caupfrg-xXS*1|KxJcScTf_GPjB;LxY-OXw;@^?4OYkWR;Xk60=nMf?g7wY%q?22 zgE?Wb*wvwMP@Q95!Nej@(vRpRgqEF((Q6xm(T366nnK~KJ$2EY!RTn+sR~6$OBIc( z3O4L)tg9cjG*DT-YU!j2rmv&tMYe|`!O^J9(W^%9-@ku-G$6}-L)og-L{ApKE*gsQ z354CL$P_ngPZdk_@-!#fhH;y43@KJwbJ`H8KjTQz-GOL>MeOWo(CTx}?m*ZQy$R(o z7p+(|sHv;l8T%Y7vptWnU|%Hm&*vb2w-}5Q@dn5z|85_H9#GMwg0sPuNf{ikN%}XL zyzVjRD*44g(#!>VoAv4-cEC3u(98!K1rWC#(CrF;&jea^LLaLPCA7luZ5H5Qyw1Q| zX7vQdyA$x~0{FclPFMKWKL$fU=4`-SNWvF^+&v-Pi%FQo?M3MJfv{dcw=3uk|L#Zr zE+)K>16n0OOY$24aR-503VIs|I%)@aL*U!C7z~5IXA!+hoZ&!YB)Fr1)(E1*5=d)V z3`WP`_!vx&!C26XEFYKI;8J-e5P2p64$33-cRA!2=Q||^Qwd)Q8)7gy2DjMYZiH|t z-;5ai0`g#{Fv?SZ(BUA^l^^7|hsfbnCbSrQAoQ|W4tX^j;!1vVfyR7cE;kFoMS2T_ zk^fdWU4d?Y(B)#tuO*OQ#}mAEgzi#E(}y;?T^@rKM7OIzx65MHGTR1sqaGelf2`Z` zb%M06Vf;%$hIP6OzRpYriRS};vK^4^jS!?EIthfA0f!;b3Nb5G%`km7n1#W;p@znW zMUnY1GRiWL`W-R*jgCClUdH~1uU|1%S$0Bg+GM6TfYFch;}i*{Vv2tl^liy$#wZ)f zeL+Sd$A(0k+MVVUTBWp&Ir1PXANf9zrPEcqW4}_X?}vf59bcM=?47}VENWY|Xhu{$ z^>$KPNtNePs+?f5So!9-B|N7KgmpHx4KqyX-;%mO)!fq+Ermwy3^lBt;3BmiXis-)i;8Wul3%tc(in{D zlVuvA#3n+!hG66B3Cp+b2v)M*rj)0*K!8#o9eK5Z zoxvrs4wm5$Hsfb;dP9V=9NP~tWM>{5Us$zXF6sxTJKJVxIg86X)J%6Q4HL>N4zi8*Td&w_-Js)81nhLfqYpG(1t);VXQnN zyFz;9?8%04y5|2`nHm&jx26gX3+0;~{7aP+!XltQ7i&mxN^mtZ*@GHG#Db zu$nEH2`L(=B{v}xnV6Lh=NE?KK4;plf<*~GH3W~%YO37EKa z+8%7Ih}1=@n{UD=f4Vjixi;-0K*&Tz37 z_d4@|hHOe@69U7*c>KP?y!R-Fay1~!FhWaKGufoB5sBe6U;Iv5P!i^F+XbaIQdfyaQOn zC@c|IP}7-!v(o6j)EcgifNY^X3Ax5UR;79VrN!N~STI2N=L=*O|*F3`wSm1r0;dFh4aQrKFjh%@VEl|sMPpqB9Q>dg<5;&azvl|`(yg50W&_COKw0mw z50o+%L-~^aJn-j(zX1HQ+{pTgXR@)s!#NW6n}x#Y_prb0AdF?B@qjO7k<<05fDhM0 z;(t#N=00^YNeh0PM)>0S>AoOCUr48vw--^ihdwr`e`0;=6xQBvvYKr=s3_2|7``|lv=A=Wb!tb(hxfm2| zq4?<<6d+v}{5NNa|7Mr`0~z9~w-z{KE37(Y4)f!*#(I%5>V7?k7*V?WqO z_WTOmrF|vEKZ*mIzuY*3*D5Xfw)Ek=WgVFePQn+|(xv1MV6sZYDLvjdbHGMA@_CuI~s$ow%aXHvSESeX{y~Y!B;7i9XdZt zwcT!!I6slIHWILrKsDD4?f)(MX4itWlV!~)M0U#It`A7^?hwOCGh9QPd(y;)U<vOIP1Lnx@coyTl{tinVy-azm?&-NH7^G(Ev`@^TfAQQI5KkJfY!O_2^or zRYTYvTzZEt8~6=jab(%(0C75k3?qbbFBZS!JPbGfWLkS# z3gQPWaI3-H&T#P!hpxa6^&f(C?TBTeEH|=_>?C+Nu#sy4*cjb|nkKN4Q-e!5T$!REQEiWB97BPF|9RwC53tiMp!vi&M`sal``F4fpxZ}%G-qfM1u zhwSR?PAl1XOT??BUF#Y9)j1Ufb|tpeEl8VqT5Xt>s)?RtM>LOgnX1GLRwPDPv^VU2 zt}%Y94Mw*ID|QDf8|$KcNXjnBIwit1QuZ=}9;QxAQX|D~%AUf**-cp|xp&#f?Ks3{ zH*OspH+GFENp6Q5xLoe2jog-laaB6lUD^|D3KMQo?zS5vj8W6s<(AG^p>74o33V$t zUMO2ZgK{F~XQm{XiDoicZn9M+)+8ITI?KEKcolMJYmeHnR-N3d2 z%Q*73l!5PK_<#=XXW+ht59r~(2JTn*fG*kBh@d}Ln63sl9?{(f42SjpF#2IjIdPmo z&KzBA?KV*SbZ_V5u>v3DHEtn)403t75)9k!8MzYdgYxh($RS<3r<$?{@%!luSTSx7 ze!M+y8r%9HoRB`9#kZWU+R^(Mk|^EIYPwv`J&bOc$+^ctPF{VT=+&Z%y9(phvUIx$ z<0h{M`S&t@wT$0hkMcXw+lTV^5U#3LJ;gtYr!|@~!B^758`r(u$&qOCdL5(mr<1Rw z*Haj`xn0PSXxjT6qx7efucX&om~OG}Kt6qS|9c`1Kp)(KgBUzO~1QZ{!&9t;+;oA560(-2uXQRlo;BKTevenyz}v+Ee@C(%z1PqTi83FEa4ulgx7 z>nC~)^^@pFN2OUmBlUPEApOzq+bn=z-#)CT! z+_5^H#OpZ|b$>JZC+Pmu&_BtY{LK_U-Fj;$%=J0~{N;389+8ptdk2vT>-l71)G?G1 zWoyS|qrWTw^2=C$r&C{&9$T(*>i0Xcd7)`3$Oqvb`h6#Q2Ql4Kjdc5#vUFz=$RU8? zR<9V@9TDYs&ao^ZV4Ok%ctRd=_(^%pQ@21*!1wk5eF^jg=qC&_90>ggU>XMyK>7Jg zM1zI-g`yzj`XdfK3E8J3s}%90mao5cB|e{&VN~qtwfU8mQ&I;GE zv%tl(ns|;G~*`d~6$Vn(U>%akqnPrFBpI>EV$1S&Vp6vJ}-=s5Lbw!uPX9p;i zS7oi@vjdZflw=1Y4mM7Ll$F~g(7j7q<^{pA6IYeBPPcJAzOQWgraak3OWeMMv0!2> z4r83eO-Q`H1M}Cj@q4Z?#wb(=xOIkGbU5zuk?=hB9mYQK@#myw9na0}M5`-0R)FI$ zGNw)NSJCHVH9C&78nekQH2%sY8OyciogleZW&LiP?9li{9^W=$ZaiV7I&Mo5M~*V5 z@qoR|%?-l1c+(p+hj`eq;oF#!$rRAUMu;clOCbhA{B{=c+XGL0%^w?FGziy;$kYXB zb_73_sS}}D#ANCU^gBX)nJWvKOf-HsB9p|W4Y%CkSu2dk7X|78Ou+N%+;rp>JEWeJ zSL}2E&nwF`+PQ8<40aZxavB=z>RCEzk2BqLl5tuI{83Wd)X-S6Em#r^HP!^9CCk<> zSyECLEs2lKON?`mP9jUu*co?z-Y@B~$gXDm8mnUNrMRfhz*AM_RYmLSD?(L!S$sR2 zR0UN{_2E!upwVRdOvYfx)E$SA2??sBb+tFPYW1QSxe=ZidgcrBBOZ8?35+_Ni+F`1`6LmZV8UZM z^w^HjWlQBb*%rw)j(iB8 zC5%2o(x#6SgMQLodtH@Bi`sis%cYM!a!bc0LYT{=(O)KRj3L zBHjX3JS@chn)Pp43ZPrGxO|5L54(W|hUYLK0~ODm8?Siem(q(xJ(?34mFTwki$zYa z7Ac@LOOnkzUcstK6_tVdhNk$tKZq@xg@JmE5RcJeN1&m8PF9#d(*9Q_yj}W&6H4+i~KfId44V=Lc7!(r?|%&@hz z*Dfx11-u>SY7eJvL$I+bR9$VRcnPae%~q`gx-rt1($>I5uW|{+KZ<9Onlr(drbiIE zg+N!;z+fv*AeC1H<7aW{eh8~n2|DfLZ)m|2DCPogjFhW_!FmgNQopA_`f7x^=cZ2t z$#3}7aa&=mVCORz^GMEKWKTUn=#>M`nBR8lH$3wp|Ly{D=v#yZz`uy_?zABxRSQ5LwyrZR*9sJYt}H*EsN9 zMA9}B;sznUl&Olv$8U>478y@IPc#Tz#0|r@SwuHnwv%jR8w_-DCuJz;Wf;(rIvHU> z@0&LCMuC3%Tg17_MZOGTP)b~xXJsJgXpnOZ$cc32w{gPQDwp{>F;<-MMNpJSmXZ5} zeokZ@$TJD#nN0Fa?h;KE#{5w7ep1BCLY$^76Hf{Au1>xMua`aWqV<8(dCvnK`L`?+ zeqpY6_&ghyL0Oi{W9dN?ALEEV<+)sWW+trTB$Y8MT$%?`KX(dqotX!^oFC)42ENJi zCU@W##J)`dJuVbUWym*5sLQeZdokn})^qu7qfR@{cS(%SG7H*sJRQZ9Vz65x#8_=5pHu@ML>e0q$0yeIn86 z7Kk4pG6q1#%9xCoG8rpD#wwD&piSHxZQ^bx>8r7cdzVez9q?Vo-AU41OZ1CrqxzL) zQPvMxZesms);fqMpNErea)SdM{9E2-mwlOBypPq5EZm(Q1GJlBvcC)Z-wk@-3wqxJ za>MG2?|q27lYGZ@sZ9{~WN=Rb_f&A3fu`Kup9#8?={p!BEoore64t-P>pSMLeDY4V zV>lk8dg$p=pR#V< z!d&;HJ}!f>%Z0h_%RIgkbafTz>Iz}o-(>9(>V5+IgCeHy^J8((VsX!hxZhxL10eI& zp!3T?N7uw?T*`EG4d@8dC3O@Q=I0Z6I%hGp+#7^mw!cq!+(>vx z8aD#&4*>Tjq1V43#&912oI`+f3*g)g`S_?Xx98Yr-5Lvfp3%Pz;{HhJZSAeV=k^%x z8;sA70rw8z^QJJ5C-6iHj;({j7+c>3dGHfq)Tujx*WED($8tXvdb#>Jp?eSD{}S@= z=OEX;!dNxC55i}WxDw}nko`e$e=UsDD8GU9JfNp1yN89|qoK-eytg%SrBP5Lv z1C3aoWG@Grj~&A_t`LdmY_nGj^IpLd5dSHN^CZX;gz#sGEYCvtEMe{+<==8n_MGsv zz+nG2S2S1~sJDC)&0=NYB1$HUY$JRw%zM%vtPk>DOlv!Xr_N*n`7afSa|R{Iwg zcwE4*%g%xwefwhum?PHllqQy!oN7#JlFYR2({8!s;$|Tn0VrAK#c3tJN*Y*3OlEhe5b(h3Mls4O5;&-d#N@-{}T4i`lQ8qT&;Nio%8L=$pBE5Du5i)K!%uY7J z?1d>#A2_ACRrbLMos{f?d1+VJIR{>LzQ@}YcK-Mv56`s;PxOiUqtyCqa~21Vjp0LC zL({f~VBxv4N=ESDbw#0jPgyLQ=S!8jHIce*h9b-;99?Xs( z8~cNyhBC4X&0?_){SllhJCw{j*6(rs*&PNZIM=B(<5bx!4nm)&%EMvtEuf*p5{D3D z!>4etsze?cEeS+QR!u6Y+qNTE*;wX6D2r3nuAULJI9;6%Meem~$t+G;+l`Xkj-Fbb z$#ybZ$*y{ST>cWfzcqn|3gcOAN`f8gPO2&FWOdRZbas+DlWOwZN;sU#PBLx4PGKkM zf}Od(hKI8=(wWr74R*zuox472#n#THvN=3CezjK_Bu(}#xiQ1oQxggY89_RFbklgU zH_DT`8D{=AsdDra>UOT!A-qI*$~3!~nqB*Hz~#I@NiY4);oo=DNy&Hvgsc8QnNCS( zps>z#-v|qZxG7Oq!m`K2a5!}XoARW)!)R3|W&xg*U-i)W*I0i1-rjAY8Z6wmDg^I` zskT0DWMYrH^Qq3|HZmnuw4n+*GJKdhd>Z3(6US%ov#;Uds`uHCMK5nPm?@BlkSgLs zRf5S~H`;Z0CH~M+sxht6%AwZI57;?dr4A%MdkLQ}ZY7Qb!s6CK>US%biv^5nHs5b# z@-MW~o81`Ct}D08W2Eo4)k-1#>#e?fkjEGg@d}d#&5-=5E&!dO!{%C+(atK6mu8RIP>$y2mrIkln*VTK=U6Vg>$HmIl$MH?F9J9rJ@ zP$i#oG9wYZ2{G2Iq*9Q8{6U)%X=R&YD}26{#1=z9K9sR61`5Hr05{nP+S{K}8|=kG;s9Mma5~Q3^TlNJYP?4$wsFOY@yJc&WAl z$~NymrQEyF+mF*BcLwy5(R!tz>$bev=`Gdr)~d0<*G;b(klU&K@|5m$%iG#?2-wn0 zclt8j?q*OQPVHh!?UM`rq&t0<^-b8A9!^zn7W8ko;j7exoMnwy=tKSzqsI7*&2FwX z!AynE)ow%SU~0C9`S&va9n`PTn%maUXmdgZn)DuL{u~9Pqqn9LQw=HGSgndIQ!^_R#Ne@iUHiz?r zncuS;7C6bS+6$Uv4(G@Hujcr3&G_`?h+SnN(+X5VG|dppLL_A}y(DFxuvfouxq>O_ z%ooa%c?ZW|V8$QI!xsv5bFxTyYA;=Fw%fUG(!bb4`eVPJx^0_}SJ3rPRV~vm=`S(U z`3X;st2vb;wQEusx?;TZTw-x#JD;vB^UE*bZ9n$YXFV0(_vAP>_ zEVwzf+k4sn>ktw>Qtt@o$}n6`R#2NCD`tIosrhkP^8ovhrh~wpTqQ@ze8@i zosrWJ3|A|{+a}NRI7*v_rutx1fuOj>PISX*h?+OQg_qgPj z(y`7IGhiwWR^7#!< zw;=d-ZY$Ek#|{rOzuN|m_lkD>GPOU>^Zl2t%y(lht-m14-vc61`Exw?Fh6f&O(RtI zkB!(L^9?m5p1HM(XnP>pR}GY4{ov6f#IKOVtqzCU;PIDUew$(^YIhat{}|q*R&~xr zdh8nYYh0$2XZ)j9^1Dd4tIHJf=jGl5=SSlUn{bzPG1bA2({$2nK0W3pUs4^+I1Q47 zbGb9xm~dU?&e=)(wF=dxW!$9@t+mIoQY`|O-Q(A&2-qFONVNz&?ov-_={CK(ZmYgr z>E0leU4f}jl=vIX_y<)@p~OEyxbF%i{wAU95-j(6RQorZ73otn`Ft#3yTP}`LLXTm zr;GVdx^6LFnYbX;!`2h4Q%5@b^S+h)e+ z8?8z8snU$^>R^MFoK{Hvt@KWd9i77ERfi&haA?2P^?f%ws2BEKiy(YDBcEu+o@k)nyz?Om?J^VM z^S;v7Oz#xRDNR*5Tn49bnZ~F>S&Av1I+#MQRfERYABM$xAxB6?A0y9-*#Mdxf&p@S{a(ty24h zvPwP4@%M|PQggh%wBf0yIlNd1Q5>HmNoR#kS4AcGPr2-Ao_1)#u?Rea^jfoaB8$*T z?$Vp1>d`5^1L}CUsPw?;GV7A@_rk$C?3M6$9FH1%llpLD>)naNo8c7D=z=durnk zi=Gl6_Vi#LhQk6dzLHrLo(SqX9C z-?{aguMB!y;cYqwQ>LljQi2+W0F3zOpXhIJ|=}%KLc0m$JyQ@Kj;gOvLf-1i(Qa zlSx|e+caUeP1h6T?G0`pkhd4nYZ}L>t+LkRVvM?pZ)jA@hf!N#yb9?r(3 z8Mo?VG0s(5_pun~y0Y?PG5&3pwI7S|Y)V#teDEFHJ~FPW@;I*BlA&>3oURN0n={0J zvrGPg4DnCUg>mgx^ydm=Jl#Pg*8v>+k}+>39rFrd9=qZg*au|^$ADhO^aW{5y9>UX zGQk(=%w=?NT?nB~D*?xJ*$g@;fR8b|5WsN?9oyl$4*D@IJy=``cH>6^DUGQhuTEg) z_#mC1k@9>!Eu%ho>8TUrX|V<7gEL1yI1}lEEijzQk!o-wEjBpSNK_$m#ssG&7SqG? zkVc_}c%JN0eGHL57D;xe_}ak&=C?f*Luj1tKw~eThjns6N8)u%jm~_pY04t+wI?>t zhwpBztsm}=gX3FGgu}D6mz1gK3T_d&UE)&co9ogKBhJKXLJx46Nu_JJ_IfgZFDB!E z%IX1(>LZx`Zo<6U(pwlaTBIw#_W`#A++uM1={N^4eqV5p1Ghi8gTO7-@!KQ*0O7v0 zN&JDrTxtiA^tmllPINF_x`TCjFGsu~;KHs(Vzq5JxFhuMhw%GQaHRkW`k-AK6HCBV_UoEggJ!(>yqQ5ZdPKBSMv!4;O{ zgke3r5b)Xyqnt_Jbe8~{YHsDOwKK43JeL4pLi7p&Q6N!2UtG$W#AV(OZ5S-nRZv198+DOz(nPwab zj%e27@sSz@GTKb6oYB!#%+hsQtno;?%=~p)ty)O>MQXV-Vx33w?JCk!?j1~M-^uZr3GJkIgqhI( zud?1F)6dqk9NRmUId7+QWI#_}3u``7FAk=}lk~{UgeR3tX6gIC+RBgA2ivhvd%M`L z6?$+Ze{l-(%XlSeNT0B=t0C$4PeZyXy#XRU?L4!n?pj}i6yYB9WjlUR88Nq@?|HmE zIK^}iQG{E_<;i-Gq|Xe0r`3uO-8F~U3hOt;D#o)BYQK| zj^I8n?n~o-HSXJbmHRle+&5%W?%u-KN5=i*)|7*OAV_P=0i}cc-HLwFQZ5?5#9O-d zaC!O@dU(o4b=srE1HDxBE!g>sRQ1j2;JEE z%m&5~Xsu2p;J*G?0^pe{I9(jKNmwbYU;V&+Z2IyCJ&Qr{^DOY&0zRHek?omm7wNusA$*%9%zL-8 zOyRi>dfR6b38!@M8`6=oP8P{~%rk|tFO9c;W)T^C10a5XNK+g5mQTLPzh&L&L-f#! zedg;pKHFzbi#=c$`^`6SIc#nYCBoT$bF1tGTkKCC6??%>`_>lw(MkL6Z2vhec7!eV zt&fR4VW)j=g&eK2D{Qe}o|1iGx{ihCS>3Kj_(b~Gv2g8=oVRahkUYoBF7rmsn?qIZeErt!&nDQk^rYfS!BBxfDI`ia^i7;yl3a zMihqQxQX7H$8Y==6pq_)E@d~*>XSO8G#;Fw=gUtpU&ezw3EauTXh%?YxGoogyv0`q zWd7`cZ*-k*itdl!ZLqoyh2@}Kvk{lC*ZU%GGoCH7_}i?p`UiI*=Xf;%1DX?plw z7(Nx;nfmv;@%s#L{rdNx;`dp)KXG$&Hn`>BYI^w3Fnli6zh)>>hRp$Yo-prAEg-tX zdeRm0A_6**`M(+TxI>uNZ1KJYwwnvVT_lV$;e&fUd=IMw=pOT)k(D78hJkU{=FHT3XZge~O`yTRl+^QCxyJNkD`skB&%4+=x z@A%oRA6ebyq4xxF{ijeEx8a8XpN_z%voPP~=|p%)enW-%?o3y}?@r__hOoiHxFz3{ z#K9L~@Qz1c!0iL_^@BK=)~*m=zU$u~^t2hm*T6T>_;9l!JkgAOTfS4fkT zTi)HNhxo%G-bg0vC}FJ2l>yBWgr?NdE~X<~7as@ic!)PP#e9?F)%#gGCxJT|Xio&0 zrU+vlZW{2KB8)q!c+X3Yx8xWL?;OnndK$RpOm@F8`j~5k(dQt2Nl%W&@V*J&U%~q( z^MNnkJ;D1(vq6Us2=iJa>Id(qpiY*8PGW7kuPw;F9AsT7lIzS0(90@|{Fi0vLze&R zz+DgS28;Y(OK3{jKVtchd9(@K%@FSdCJQYq72s|K+!J-$zC5Ov0LZ>A7S;qbDj{wV z+-jlkv1|ugRlv6f=*V)v1HOeta(R*E8p}%r@=e-$h?N)LY~UFNUc11J0b_;WvYJxPDlQhQ4mrvF&TE6xG%~(6>i!xbP5n1uY*!>`DEtB;CxF-YulYs6i zG2ER@)@GI;r-H0uChIz3ym03e#!Gel?}MUMYumr#_-t+aULKw$lw%X+S>`N{mP9Sq zxRcg?*&27!+AmuZOS*H#)|QjbVzyO;TckH5_L(i#upRS}t*Kq=gwNKxvUs@aB~^>N zP#Mvalm1-XrMi#H&CV>|Z=0noHQZ?*sSzHOfRvC7-xbnjdE+?hS z;R=xFs~K!dJ0lj)zYg7AKcOr?4{`irVP6lNuHd-1LX%Ruz0|t_X8uactrk~ncs+Q? zN)DC2*_E5qocOaVG<>P+A*=WbdD4DWYp}2{KdN%z@d}RDa`2FwdSP)@Cu#UQOxV|V z89rRt*LxX0LY>amUYSiQUn7OGK0nOyN15>-;o)VikUy2_$Y^1oAHqYwIL4zM#+vb! z{i4JlCzS1irDbQrx7GdQc#r9uAne<1jxSuaqZ7^ac>kQlf0FQ2-#uRioGg^(=9g~E z%@m>3>!Tchsu`af`{EXndHZb|T4zUsdmNHEO)cJIT)gRKd~RFpx2WdNb^oK(&-vS_ zO(D-v8$51b0XBXO2)dx2|ul&lTRv%RHehFP7b|ivN5?I%N0)p)M~Ag}S^f5}xwI?xd>c z^0HWDq`bK5mc6<@SOw=NRNdaJ1b@bFR{CH#>w{HGJi+QCH|*iYdE$g?uI}%Me)<+Y zo_zJe>M@?wba67|R}??pCsOcM5w#7N1^Ukhx#&x{xQm0l@f0fbC0R$9j@mOFwIe#h zv~+AXXH*t|-P`l6$yYo%>x0#4>F?k%A3CHlAAGPH?t}jCW081~;6e1$8~6D(`Ni`E z%Ul<8zT8Lkp3n4d^J~>fr%psSC{vLz9+1y5t!A^8Ytt&V?TR$2h-XQb0VzE);DeQA z>F+4am&Bo&N|;URVUcu;B6J_cKZ=LT?#TpSNe>=FPdp;rQ}_QG{rG6CgM5c5{!!G+ zeVO3vgBic13ucuPrXc8J0&e8$lL38re8k}POn0@C7e0DlOytA|p{bnME!Z96EfMDK zr@t_|AKvYtX*Em(X)jup9xwH=SfsVwJ%n`o38UGU{(-u`8T|uv|7qwS1on8q`i ztk=K9^iJ0O-$MUXkNGw=1Nu_%9heEe+*TOueE48R3-95vGyCyf0yvxhDEysB2CRg{ z#k4w;KNzyVJ0us+sLHNLo3+OqHRhxs$L+2CshbOjalh5Yzl03`(Q{l)$SiUH6+fB+u@ zbD;0=;hTrU2#iPpMgt6EFxCZl$+rmvCOQCpJ8-%JW-{=*1RhVq6aakhZ=MA#Ah3u4 z#+kqX^~2x(TMDp@zzP?zngHhi8UkxmfQ;c$IV4ni^GdRfsP9bor15jMf2Z72-@+qaU%av&z=@@r4d8A9_XKdafGfuZWbWem9gZ#fcRt7Dboe1uB^~KM5!?#V`mLC)y8l`j z&m8slWbnOUl)DCq;rj+z!o0pCzu}vgZH2M4O;5Vu9dwjEAJQ5SM*jQATSnVR+I{2= zq)OfYJ*tzQ3Y}zIK&}EPUTgJ;OaG`xd_!wI&_5BrBj8*H-KC<{|wWck@6YtyBCJvv*M=ZJL6OoriDS*8`YVCC@&xlWDt zTiM#6a*fww4flH1?w9hlMY}W#fAJBBtmk`NwST}R3HfBhvuimB0`6S9+ zult`ue*?Ht{rkm7%sRZ7>Fi0~cQz3HDB>+p#f$NM8oxIRZ|y>(NMAj0!S~5b@QvX= zgLIp~-2?7kaOE2$PIayg$lq1CuXFSytNa`1e^?jufd+e@!E0Six&WEw5YF~TJk@2z z9eonT?y&jqthO@HrA+`73CkwH=1?ZA;_qdx$nWSb0G6t*&AQ)fOF>^$Wh=%hwIKV! z-KWc%gR;t3X}pXm4v6&jSSKao!Wr4haG;@KhCJUw3eN9YLAi@JL14h&Nm$8!vG~ZxjKyaj1Sqx&&M#q>Fz@cRT^U zxQFskLl|i6gc}TzFol5JV4{nCXk^1~5wJD9W~PbGECN=Gj2ggf0!SP6$qkNZ1nh9< z0$44k;^O6e0=UR)wV>&>9Mi>3x+sctsj-vR(8fhmq_rFX7f0ta@LGRX5%4M}T{v9_ zuz>(BnrlC!N83^&jg_H&SHRh zdNu*Owg$t`A#g6h`3#T-{q_wD_$Gmi2z;9W(n3G-M%l)z;St{{MQ|4M+X z7+ekDwV$|}0P0(%E2^KXE#UtEzDEFQpdWE~8m_WP=d}#J?-6)>2{+lm4+-3C13zSd zeb%i6eq;j}emj9XY~XeVcLMyx1>8yCZUR38_yvJqGWZohiw*pWzyluOZU(5ghX_0j z@Q4d|n82e1ehct8fuog1D#t?%p0t6d0e)u#PZJ0l;B^Wt@#W@CPHZ~6^oZ_H#LF%# zlUF0?8jP&!aw;ghcX|$&p1;Lg#JDblZv^9>g`By|^=>&u$`i@!H*y+>=V;qO-1fp) zbH%r^I{yVIH8ZXgS$QObb!)=-vSAWKh><#-~C zEY`gt{&Db4#+BzV&>mx7kVVoc2HXJ_xOVSpWN<&o2-M}+ZSbvEeuCZI6`Ta zOI>{KpbIxLpf0+?-6BBF)u3mJhq_oB(@!7xR?gzez4r|yuGHmm!u*c+ z3Bq{4Te@37-c2Cei55J!#^_9C@wb6n3Go9EzY6$H6XrT3ry|&v)d1aCJ@YMRba#Rq z2D<4)dFg;kc=`kGN>%v^OPmX=N26&tz%?`UJCAI zfP0BB${WYM65Oi*_X=SyLw^$HI`Myi|2=T8g>-)(;$LHddp)=}Fx=}za{ak6#wP6V7!lHbl;nQ#x5^enjxF&fF&S@d6B!vnGHHKL*}E z0rxI&?*%7w z-}lG91wj4>K;B=2ybl83ZLAC+-a~-*8^EJ)<5M27A#&FFOrKRmpO1h(9|e7$1$-U@ zK97U@1n~PU(c{UWN6G&JVQ%k`*NKGJlfdgK;B_tI^$fVb171%PUYD^v8%OjnY5ZR3 zOXE^se}HhB7gDC@h0&Mcc;`is?FFINy_X37D}etJNyDq4*FVN&dJ1^U@Dh;uHPFX9 z!f5v;&YuX*8-(8L!sr8JS$-4f|2anEZDAgF{srQ{MR-u1zoJOzJHYR4!uzklD>i1y zmi@1+7k>jiyhrGM0Qet*&ff#M{y}tp7{X_fxDw}|kf;9w_fui?1^SZ%f7Z(m{iDjWtq@^>xw4 zz_xI(q%K+#sf&z4zmqbV1q@!}j3X1#U}aOZA+$SKQ5%eI4>B^$kOhCr)mW3M+lJ?G zKW9O0_SA$bYe*m$*RBHDl?6pbeZlH<3Bgag=&H&~67Lin{?A)|SCpw2m|xkj#eOe3 zq=#P+=Ja25Q)ZpQWjW|1l*Q@WylyeWB&YCjW|-u8hq`B~Gllg{+rpvBit11>Tt!c` zae-6`DpDsX!K?$k0cUWdRJuAOlNk{4l+0w#7U_IRmBCi&W+q7Z8>%@r1wE-}>)}#= z`uU(BS6okXbZ%fK#Mv>6Bh{)7+D@Tat0uWnk}A>6jtNin%Whg1&QH>1c1LWLnO75N zsF1~i#b>T#Hb6|Vn!F7FsK{yr5x%BkYd zEUh@|i&3ERf=P8^mKi_E*rVSZ z&dn6m+obUlr!t_K=^EqdY15dt5+)(H1sb@$$Ha0#Rd8F=b_bT_4yv22R$Wr{oa3On zxoXwzN=0>q-X9sg*O>oxrz~I=D3bIsU#*X%YRW83B;P}4by`A>FgFIFn#6&78~Dl>l4I@W4$^4WDY^-glH zQOljwuCH~Fd!0AA?b`WWPI9kT%bnEzZg7x$qc^$j+GES%ohltCnE7%8dsuEZ0bSea z$tE?OZ@Z<#-YQ9X+P_6D&n_lUt(`n4s_DF>qQhNEw?dK56#6gauwJF7t>$n?%UA(3 zzN>M9ivKoqxTB%kN;5v+4&l=cJBwDXr~6eRE&YI<0a;~zrE&yQlY{sB?QP_E)vo+k z3uS#w4D#ED>ne9v)NR`ltTgRWtMY!kns(9@y~d0`&uUDg(qTv)-*uVT;X!Uy`gaO% zbuTQGbeT75981V}_1@B9nV*#2F5#+9<*4YA?=RcQ z9aZp=zr-SZC=zN6;fp4eLW7wCf2D!fa?>W5nW{=3jl#ZM%kU<1_!`Fb4X zjNWrj`M1YG-o57Vvv~MEbNE&szTX^v(2IQX*P5lIlg#1DBPIShfp9ojRT2sA89J7a)OxB=R>dbdezO^$pN1*LB9O`{7ljU5{e)7M&37Iy(|DRfC*(VS zs{cv5=I)?5-cwH1_;fS=(+=eU^XM6*>*nct%I^$eUw(y$?)yvy9T|R>P}hUAg|ZAJ z?YyP49-Je*)q``zQK<(bY;mw#8 zz;JB@{p=L0^3*HhTP4Jo;qM{^e5%+2aPisGLJNhq>NG8T=PiDe672rG2!F?gp>}_| z3-kM=#|z`_P?=GkNdnso^Sv0EY4RXe9=MX`V3Dxq?CI?{VbS5RGxV;G${vQlNjy(S zW)F*`v-U}Ao9wLp^E{lMnLiAFE7mm9a->%BVQ1}Ib+pz8_}Ic>%ZA~kMLPxYq~5s6 zQM||A7x4QE!>*KoFlyb~2l{kly7V|3I&GNzxx#3%@g=!qXtMN0lq*N1?`1olE*HO} zYFZT9gm|8y4vxlq*2tqfNeZw~u93Z9F5jzT_tV=)4trK;LS}M1zO9O;` zUFsr|>yn~OCPpt^MEc4k@7$7(y&tVYt4R2_slwCvFl&NtCvdxp)@5inky?g!OJllt zh9)2I{~F}zOPKPmX-qk#TLkgZ50=|&(BD({hoGse#_zp6=3K7~=A3?$zz2)Gl3Ndu z1RE%L1UO;X32d0Zg8n|>_64_}9$tmvB_y@E!u+r>wRwxvqyD;o0__-bn}yxaYwm4^ z+}HwcEy`I8?g0IJ7{3n$x71y(H69`OX)JZGBHcmY4hDA!xWnAZmq_ohG|DIG4FwnN zM~?uPohx>-d%XwzXs?=2x8vaodY0#r?dVDQMuA(Vrpx8r%jniJIrn;$(}~_b%r|+S z*hN0qQ~aa&!1=40;7ij(?RiUgygRve9U=I~LLcemOVa~3!lUS)1nxv|CxAP}oxBM; zQ;w0I(#coSo2xnLmGJ|f3BxMF_(>czW;s<4OW2y8LDJG$m?uDZFIdVY`%s+Z z=71~5Z-XJdYe@Rr0_~Z?DCa&n$SS|jB0TejH~aB^-H-O;>uH~w-z?nx(w)zj&~&AH z(%YHQp+7#Mvh;HQoP5lf9|c~fWuC}fxtK4Ej);~EYB|=@<$QRZ8h z3BHovQgB!3@lQrR?DmJ#B=-QFlp;N00d?k)>fGNl|_IHyG@Cb!3|jrrTOR2=_3qQ__?21=aMpeC-*%SDAe6 z9ptmT9j2i7C(M^>aJTE&p9R_!&PUmstSL;r`W{Q6- z+SPROmGtVsMeEn~9`#UvboCI<1Yb!HtVI8w)k|&!HO%Uv>1LTC-U3xTA2F%hAd(l% z&G*E7a34!zgU#wS=ttYhjo|JE7cAEvL_D-;yBFL&;GSf`Jq>r5B@hAh@yq0w40;~X-M!u~CSVLeX0o27>0_6Z`zj`A9 z{I-_CCI_e>fIPPn2si-R;oQog8bD6lYXCw7b~r#SK!`z|0(JqQZRrLAO)g-s3)t@f z4GgT>bZT!J>-Nb6PE7-x1%NcqZUvydV@U^XRbN2hLI7$P`a%L1JHU4dT;c$i6S%?w zt_I*XzOV5B*LeV}KQ|Jvv#)Fghg`yq46N$ftpsjU0JpV#r%SN1(~NTb6oA@R#&5SW zSO{3( zc-jFtz67*K{w%0T}i=z#A6uIsxnh-URqFfwydc;z(Y9 z1$f&9{FT7F1pW^2K7kJzd<5{Z4SYo46A$n%11!Uz5%?V73m5P?fiDRh(Sc0jk6s$7 z9G@|mYk-&eo5YPDcS_u$+YxA}U*6PM-_*E#+m2NRRsthG)KDQ`qYGAvggNoV;)2u% zUmQU_vB|n=aX=6T1@X7;;*SkL2+XP9IwI1yobr{CwD^+_1!g+(0#%12X1oN=94Vni z>a&FTf|;BQR={_-VaqMpIlV&gU8beCxYktfh!n7J)FEF)$R)aD=P*+-G%qhZp;43x0E>_`LlW;M$%_?DUX3w5M(dX-J;mgyyy)bzjF+~%Mly?xed|EXt3Jg+TjTAk1Ffy zm&fgF(hZUxpqFomqbc{&Y_KhzSbcK9c1o59-f=8m9~Q4K z#Ouf6m9TilEM9+zH-N<(#NrKP@k$}yU>0vEi#LSClW83Wcq4%4NWdQj_`?alEGKfw z`$MBVqn=IWdXV8F#LM+_UdwfYs+`EhN}BHj-H)w9(H~;)C$CgFb^@#2o|?LFa5bPJ zb8OxcRaJ<@{(Ndx)$L$mJr8Gt1HxfXs4;FeS1~l;PZ7V(ySBvBF{@%NM}?d!tq9jO zisW&G#khg@YsQ2M>8vs%Tx-X@AU;QnzXk3fXNQEGYvikJBBckx%zWd793*}3h=W{R z5^~L{i!=s8kziCL4|XgDC$_S6FcE95d>x5=;ilS%NFE9Ck&H^Xb_S)^N@nEf>c&7L z<|rLPNq>8nf)ykPwN@^pMl5Ws4TBgsqeHQn4Q+LekaW^l&Q{ijSJyQ~D^X+A4!87o zaw%E|6S4G_vsFR)bRq~tjXg_0Gw!S|XF8=+B}0})W|pQ0vSoNzVcpKQZK#iiB8}Bd zLfY8RSrpkF2#2alDg)tgNn>3}ymr*ruc=!#sjOt)-uhU(7OX1K)6&osZfq#g4IjkM zsco-oEGcbZ(y%F}vK_a|huo^V+E~K@q45EGvq=0LCK!pAmtYYiGhMRe^fsN!;P5=( zx=*t10PLGzn}*N2)v>Je_EpZNuN8hum~OH&nhWV#e&lq> zWY3aLdtC~CA}n5yW9|o-dYqiL@u;;n|4mx^2veOWjH$gBZMFSx($>dxp#m2;yl5-` zze!vF#8kHz#&VArZMFMv($>E))g8bs^r)@E|0Zqy8&lm0+>Rc#)$zYcTc2a9yMRj{ zv2~*@`UdO&_u5K4tY1X5Wc8Yq9ADu>I)jP!aCscIe7`u7QSI@g)M=Vjs9yHL!}0WG z9~^GM-gi!B6ODxvIpjl@JN!~APDndT4X%qA(#_O6VVu5$+@54l?BW3JSU!A-)kO$n zCnXZcVT^~o&(0~1<;#79|d4MJaFHSK(PWaUVmX+n?V?;0E|}( zFqps)1z^14E&=h&Qmji@*0TQx{{#2nwq3Q{_5Fv4w+}vf;H{1RcYN13){_>!ot9nS zHu2}-MZy?O{I;Q$F&e)}eit7{J(6H|5D^dF;6^WQzT*ZXZY;`~-Aup>3S)CuHkDEy zd7fW3ld}2P479`WP2R020^C_Z1NnBdper|Rdl9;_nVZ7s_5r$m0T=1wfh*ah@r}$J zmQ}+H7a^WifA*SH397KZ5_d~LqL^FsmJTUWg}tS?TMkrXZqZ+KNRjG4fvR+e1J#&Y z^j95Px9R#0sTKlvSg~3NVeGJ`R4v@@u=3+rUvYf99oK@YU}arZa9N->XhA`c7<}&` zOCbUIK9Eb2EtK0Ndzt?|Duv*~^!)ga4WK66cLgPGW3 z@WuW^&N=S#XCcMUoP=Me{K3scMLp$j6`2|{+!(^`FhXa(108JMOh=3Ckvn}960+%KYdD|kN~c7;3`IM3pkDd(nUXA ztzau6DYaavGdHunyki92GY74jz5Ywj>nvP_!`bUQF*w|s+3Qz)lG+nW&t<~fBvo>e z6GVL1FhVqnlfxbGP2T#DZ@|i0F@nX%6XG&{2jEBJcM!%c6RCxbKu4AuIgyl?)#Su> zCeXx*Yj>cF6W1PqLnp5Co1D1z0^C_ZL#B70Fs#C=(!0tgz0*O5GTm~5yxk$)RW|9~ z2=QflWz9U7(UI$iCBj%F7yvr#??NZ?#PC6;lR*ldoM)pGo|a23(jv>0?Em;eKpR%- z2N*6wywtyw^5ptcy~M=b5@C$L-_;>Ss-FQ>S(k>1#N#JLe~-a?DO3Fls7ma$KsDwT z#k5xRQL0q4U|TKj4gsn$x9DRX(!acrXt#tgmKRcLw=%W7aKs8<7=EY41gG0y(|9;L z#XW_GvqgZU`L@HTFQr8Zt8}taVbU!!c91$L9r;3?4u`YOmZLMb=}@JM-41iT&f#zb zIwg7Ox`>n9g+g8K*jebLa@SGV=ciph+UX-x<&WcKPOj9-6V)d>;O)8`brzW`NBnHJ z#ldUW>vQeMfd?B_?96sjQrRi$j1(0sxw@PAuKzj|9n}(LS_dYrTB1y^Bwwc`Fup{I zOH9T>V)Bw@T8DOtB^$b!hL5}F3*$sAU7DfiiE$B65PA+*os~;KtyuCgm2B0LPy5v9 zd@YuI@DyobriSH-6O?%F6i>^=N+6*OA&6PNIW{_5`c>( z3F0P|_4KC+kB8A?WEda)^tc$(phv{;+(S2E zee{gJv5K_OPZw5^20wz9N_z457(H5+O1d#_KLSXnm_UCE7zkjclTrfw2pZK1(w zWpJC8At}~=ESGK;pjF2f|9^zz{s&1g*gLrGB_v)J;$>S+wcvC_L$Gmv{8$~i{16|n#E?|6m3iI103ke_jK1eUXmCfTi78i>k zzHhSLLO-2A2l8!@eh^nS;Y~oZ1aKuiykpQG@MKe52Q&r&k6qv|h4kQV&rcZ7p}=z( z(2^_p7rWpocY7`X8Y6-Bh2S6Mz;iV490Rn*3jO(1C!X?2&YKAh%Hs~E^NA2PfyjV5 zm+>b-{3#?Kra^pJCVmU_WV4E)Q1#$u4`AHrPLSA^Se5S# zd9nubVJ)Ov(vamXR*rpzghp8Z7T48EoxiUO<3E7#h}B8obi!jG@YzK81VP>{G2Ed{ zUTJktwx1ypw?yX~1L2bAI{jN*&aJVq$xP0zOwJ8NJ}ce}Y!YFF`a>S<26ZXVH+MnRsG~b8TF5I zRyD3{AB1l~C#bjC9<6JtXOY<^Nm6pyX2u#u+%hkCvO4I=s?d$EH7GC(0W*H3rNJU6 zI4db)4~Hc56shM3Y412|RhIM;sx0xf<@mi7NocM1J3sW zGKonvMvWSyCPt&iC5t9;NnB#0W|>J$CYdBNneF>${+ZElX1>Wc;k)&2)w^};o^$T< z?rU)3`~B*7-aSiIojUtg)zY%L+?Qy*Rb#>!oO6vTI)$3l^z_pine(w=uW=r(p1OvP zbIQ8VSH~Y8j(@8wKG#UiuZiyoPCmpg43;?#{<_E~f_dmh-RRAoT`KmZaO{u9WqWcs z{>Nmv+$1XOAo71OE`4hCvYsjPBF+YY5Pu+@43nH9l5?VuZH;s%Owbtd`<;( zSJ|(*^~&bXW?v7lMo>@&CZt9l+}zRnZW3(b@RgYYO&Nu9#TWP+`AlHY_DvZ-uWLe@ z?ok34U$o&pWqJIAzfUH27P+U8t5%+RC1vE-z+bRQwBd|tP85~xkqWD)7*Q4m%XAoTP9{9*iU904 z)>9RM#)JILb>nl&2~sF?n3n>N*HsN-`Qc)gT2^7xK|c<+EU}V;o))N6AXQKH77%yu zk*5h9KZy#;!3w16NomYXDrn&Qz#NuD^`urJkVgHaR`kH~(W)p%gZtjEzWbDWD5j3q!-36}}jV1SJTtH8}K!e#;7w)wkJ0H@_|rontLe_IKX&~6gIwE5db zn`t23?NLZGgTc7J#<+a>w-EUMR{DeQ*Y5e14KaHEjY>_P_w!Ns8HAOZJmJCjvM2|L zs^siy?rJHiWS}AqY$~;vyll2^Yc8Lv{ZWPYZEx#r#@!J^SkLCx?QI7CLCvkrU5ndV zS{mCs(V(@KP5CtxFO66gG0Np?2w$FN)gd_M^?5fH^mq=1U`(A( zX<4nx5C|@nVmvnHIFZU?IPqrE2g)izG(8@ZFg}hiytFBIPJuuT z%RJ(Dt|}L#{rjM8l;;qAR2#V=a2d*NO!rppWl1czI~}c4n+UCaix+b*_)^HoWM;OPR6$gs`GJmauwm z!z(^y#QG*-MRzb^_1uP6eW-ypSniPl0(C8!dSvTi9R6H~p6cRp$%nob<5j!NSjrMgwfw{d;F3#^+)QiMhOiLTn3ajS*AgGn8M=@uuRBr?-7)ET{ zS=zRHX$hUpXo#y;8!r9l z-1-Vfo9LVPNO}K1*pzPWoZh;3PpLz_ohS^owflr>pj3|ioW$YR{wDhB#X%&ewigGO z)0Va!&D$DV!W0{9IaTiqvgXu?U;CTrr+j-58S&Ml0yW|n>f`9E_X1h-UvJ5OEPeSN z!SGr@x2bDvokL%Lxq6{lVS3>x6Mu0dTY=i_pjxdFLbqEA5IxS!eU^k&%KZ{wR}wNv zs~kGipE>ZvDTg-BN(a?yMkg+26^5}SdMS#z&Mc79aHiBpQOb3;kwCkZKibuvlOs#J zmET|KJ8HSl%PP0jvbU=6Y#@893ghu4FoGq}Ur8X>{RyNrlqvDmIW?Pz(_b}Ic0ooYS*uV`D&F*)*IIo!loQK zob^!2Gjpl0iVYWVI@5W1y#?giHlL51bZJR_TP}S)qXmp2C=!enz<#3@$n)%p0@$C= zx2FhTzljR?JQ~le^;xw%ujVsmd3MZx(-oM`pXXYD$|X|`<~mXr1HBW%KnOHI)daGB_2K>R1v5XR>SQ)>XTQ^2V{B<-DyXShEHf4>vmS^j@?8@}&Dwlmzy3?EBV zUTEf1Pds7co(uouk9#dOD-Ery4JQv-capcLaWtYyGhfN@dbtp2(%d2`@^x6*ujg@f zSL2WC6H<(JAsuLSm3^(&=C0<(mgcJ}FK=2(tvkAQLZyaax}O~i?iQ5$25{gEOw19D zUD8P29|gziW`hKbvkS|L^ruDYC>sKim+pH&aM>J3kckxEaLGLGge`N0lV zXS>w5(e-9n$MFmcAkn?p9Ws9RU2yjEQ>zQ`0|-xonr*G!j*IUY|5u{kRCMjh2MawQ z{9wUWhq(T1hG4d3==0+0(kE5@xJAcTr>~WK_S)O(--EFw25>99@haU&F3bWXD*Rhy z{BEpt2WvrB<_82`eua^8%9Zx|)-4>D%Y*zoxH~OahWTGYd755!5BmSnZFs|n>{qo` z>!v{4R^^F0mds>PD)<{hrNx@=c;T{w($WE7ISw|91r(QU9`&dAcqt1n^$dXELK81! z7E&5+Uh3!}a&!Tq@Ir6ZB37HG5Qb(JnX1$|!Xf#woApR2%VE3Wusm13w7l3g9T?t$o@BjoTKjxnS;`knfChT6cIEFZ-R{ z*jbvfX2zb2 z$S<5!i+NTzh`A|$F>hE;wv=a|5=eO^Q$Z<@^P@LwiS?y*>>5A( z1QnY6u2;MjJ zC;AP7{?UX7{czEYZEP;#$McL`DYv9n~2LMWETqAXx^^2@HP$t0I4 zga>6Z)qw9WEcm98e8w2k+>xMM^#1(>;bNIhCq7xpJWoy-FZ!KKe)UwYUY}nWuK2+^ z@+|mo#!e=F<`O^iM0w%<{b>*=Mn~Fs$DxjJVx4#$f;z!%LDTwq3RZ2zJ}$AXKSb^zr~Lesbi+NvJ6l@k3+c4oI|o)>d{-3 z#P)&prrj&nizyu%@xVU0GX@X;$MqGCWq2CmwT-$y6n`e+-s|!H&m{jVN$&ee?)!-E z1K`)If1$Lyg+ISB+(2osCHFdVuP65);k*X?_TNbPyTL<^IJj?V@%_r}oy&M2owV_M zOUi-o6U50A>-YOb*!xH>H40z ze&xEzTb67vg~wYom~tBZ|0so_oNo4TtyFTlIVz{RF(fBk>zm-u z!?%JzM|y_Jj?-eC=ZN!hm(~!rPMIK)w z9A269xR7vu_b}#h6;v!m_P9vo7x8?b((|3z*NB%Ah5tbC@*@gg2;uP&|Kpkr?@*@L z6VT6}J{_|spp{O4g!cgc;D6sPzafaHH>E>-34f&o+sAK+r}M|Ha?Uz%UpImCRzK;4VHLK z0P>u2V62*6}xFl-(&NS;XN@ z)32!O5W4Q%t@{=An*0VG-rF30?;$Y00{@(%w@=Gi?%NNUzIk)0bz4hYr{`R`d2={R z_ZS6c&I$S-lirh?5&#Cp$cefTzx%!{^dyqd>{P((K z5Z6o$Pq>|SKBjmj(^{H5rJ^H!TVqR0sj0ZVqis*Iu@&|3x0NrhCN;v5<<+<0wRRqY z3{@scOTGNI&0~_zZ>lb28_y=*)zvWF_8-u4RjyC-X@nPINzqwDXLGm64swz7<|5CQv((-w@_-FrtN$b)?NZx$6=Mh zv=lPH_{zAQ-dn2NZ==1X|eyXmC)`Lc!X99O+|$j4TmN#*l+mHZ^tMER(zei+g>S@`7r{Lr0b&1VhyHtsh# z`2KPlzH{W$xb|@H`B)bDW}W9i?domTcJ1u1-YNCIivA}R-!+g+P1}_NZ_@f^lUvsM zR@FFuq{+1ge8=@)sq&pSzt!dg=pZle{MEYOt)V>P`o&EBQv&(qoj+rH1GR3hR&ECT zk6P$D<$&uSW%^I|drurv@#lo&$E}z4sqg*j`!V_LkWbQn`d&-Cs^&Wh=-!uvu5EtZ z4fDf$)wi+#vH2(1uS&Fjgyi#xs`?{Cer@}UwVLq8dvo)0=jPpW&-Zgg{FvG7y~-YE+UtiMK(^eGbq_T3 z%b&pd3T1)B4x&z$!-5efr{op=>EYhX4R-c_d8k511JAsgu?m7u7TW*#;db3wzMfdb6p0FCU@`>V06`G(yY zwXFLQZwQTf+JQpysbK9z#bYMJyz`Bt&zt(0$6TJ7M{+f(MzcMK+s229pL#7yP7da+ z|LlE%PG6LotITb#emTO);b$e;dVJ~pSM6Ex2BiA=4Ms|4sW9C=&e|nnV;P?-pyiIN zJdkw5eZo91|2VHmoiOV%YL@rZo6Yq$tFyrQ%%WgS_7op)_sz?l(+w!eGzpd!CmlUl+4V#zK(Q^vxP`7cDA+*^!({k%GG#zX2B@i4|bAxBHxAu7K)VS`Q$3R zByF9RyC$Mc3i#(fIocu;JiCPH8@)KdAXf&a!RUV?6is z$JTndyx4l}KbTAS;sRpxQy`rtv}s}28y;YA-11CtI>!ASs+)8E^ew@h7tKx=y@`Q{ zN<=rreDvVLVt7&6KdIb%1dEV&sX21+h|+b&0`zTKuSNEKWz7nsC3UIg5RizgW+IfV znh_0a<%r(w6`jgW%*Q+-7JOPv@zkT|yoRL+%I_cHR?=**2^8UiyJmJJEi3PK?WYOX zgvO=HcNFxe=cC6daQ>DQ2(UvfvB;iS&v#2L5#{~2Y>AB8roU97JL74SZ}bxBKiwX? zEg~yI9@dCHt{2uN187-rLae&zGT(vg?h#$g!dXgt^<*z3Ctf5pw?jS%Q1UkRZ%A-3 zg;d^l)wQ5p^|Yfe2PVkftKxcSjK`sN)DKGdSY*;5F2)dvXUs!X#I25n6>TWPAHYv0TzJNiFo`XpvZ5!jrQCP}JN`fzP%7Ro&^Um1vZtm40K>a=nCP_u2y|%XIvaq>}r=>&{AK-r6_v^KdNWn}9 z$sA#2c(eR_$~Dya5ljVbu$^x39>(EtwYE`r4zPRMZRHM4Wh3Dpi%%u|U3 zG=bA|Ag0tf?XDale)5vueDcmNf*)M7mCbKF|t`?)O=6z^rgnoFDQqu|j z0MrXhS?0{!3d`v*0nQ&r`>z zV=A=cU#=Vc2mK60(WFdc7uzr7v89BuXqb^bVz zi|XGC>4^r)!D}+{uH6v&r-S|kZ3klKYbBK213f+c?ApNKNR#5&dxW^55^lxlA(!H! z``)LLHCc?_!p|kFf@agPw(g(?k^bK`ZrCz#NJYVrQ{E5?E&zA@7e z_bELqPs{OYB6sfNm32N+{K@YwsTmO`hyYI0AQPVg*o?mOj4v^68g%Mc525EubGp+r@)W~e2=E90R`6A;HHE*KJ^C>y{@@d+GsNoB>;C(V%m-4y2 zrxM(wY5RsVB}l5rYLZ^-99{NFE=iUmZCNlumSFhSyMNMrL4rIcX5?4l(RC2*ME-k$ zLMy$yWlc7}x(g)JgBAxRK2uG{k$ekPY0 zE=9QomuSNHC{N}an*Hw8OK3S_>P>&Orxf~l1m?&7aH8L@EBNOzYP^=Bd+SWSW|z00 z|B)xL!oTp73$ax$$q=)?b39w*AIHXXs#EjsHbIV_?b5;;YJZ`&aOzUGJ3MJS__c$K zj|l_cy}H=CO`z%q)f`Y}`o;zv^niayhDu0_rZXL6XATI9gH9FRJjD5XB2yP{C|~_V zjr?Sk3$z;#pq`hmg7-_0dgg2cWPgC|#pG`#lfQ*le}YPK-h1*TL|uyW-o=!w_#znL zhp(5n*+kC?wL^K8Lvt9c$MDxME@k|HEv=^ z6NtnDT$6Th;90N<`S01@Qoly7oKg4P-u(K2#K@4l7Sv5M324M3w5q)|qU=z%2a$G$?w+|tXK&{t6qh`_v$Um1>9smB zGMedjsgcxV2D|1TJgAYLkO}0W_+Bi6*T%-<`epSM$%s@L4=V@uoh$3|zLONVW_nU( z{SigE^tbjIXq@M*-gWvn9fgkhym;b_?gzAzj1$^(OtHiis=4de=3xD-FfXCB2>&)J z_}3^cI%1IUOB2#^Ze^uLLC?1z!eE&#n0Vgj zp~*HqM+^+6hQ6nM`IIi)8v!?XFl>1&oKf~Lk#S_IW*x@Don{}G^L(E)4fCilK0Zu$zKhfL2b4|enX;(&!JG&r>{(EMMH!%}9Atl=a`BM>6Zt^=ROPcB`jqt$ z0gJYc?=BM{p!|F^{db)G9CU{`b+C_Sn7JyvN)35OyQCKabc6tKLK9x z_(L3_0Tl=R07JgF$z7w$3}!&3qvgulpc6KT{)-^0xp%t7Rs_sN$fI#9=WG$F;HPXk z8S);&*^e^8O?mGGpvMTjSq@501{pyOrfk&^mq|kb#}G2k>>!^|n%1eYSfwIP!kC*! ztbwV$P-{TrJ+aKhzL$ec^MTh|doUy8!2{3;5<-W5I2jyjq9IMCn4o7&$i^UZ;hT{D z0cd@1*&BSeh)5uY!ORj*LzRRufDMqB4~0p3kR^YZ*^A;4gV#yw&kp5cB<$4L7=WX@FWoBdc8@1U@3PlZUZvME-Z19hp@6I*iAO1@9^7DBri2wL` zr04dF5CN^<+}Tz+4{J;GHAH>fa$kl5Y^Tx7_%RFtZSlX*+EmE6s0~zrC9SiKFxjP)Ra-J8F@|4X6^IbhWZW8?)ur<91cjV-T z`R;5#E;pQtXrFPoZoJI8I~p|j`y2zM(NokYb2Ks4YwH=_51n@64ghD$Z$|F>gq`7& z#a#ER0MqScAJ1bCUHY?H8{0nE#;9KpiHG(`4ebl(ulMZDMV2sr`FjO4;mzbfB_4$Q zRSfkkKG#F`Av%X{Uc{Xag+rP4+uERrN>2#qq zJ-ETh>J=oO=lsnhX!r^D@nYI|wr$Gv{kdT%%s@OiHUnuG&Lre4)N?2YGjYsKq3=rn zqDRrlM#_gwWScN0+HBj0QmnfPaQb1O`;^ID1l~|DS)@s44{$|JKKkFz1Oq!V*1e{r z8PonC6D^vNlvI$wsNZna4M|2w{WbQHj8D#yj6QDfH!W(vq#(d#U{{t}=nIx>l*EY| z)s1J{fgqb7c@OWDsnWTTXD0DZw`eJIh)&KEi~HP~)jWNM&~A6Y%v%Yt(<~(Z-|OZn zlw^KcA8u%_p)2)eMV&eKrPyiq`0k2mpdJEXgb*~YNOSUY?fT7tyHch8poAEo?*v!} z&ai^9Ay4y6Seqa%772xKbJ|#-eR0*Fa)Ig02wz*OF-8FxoyHeZW`9aRg7S!j1uSs_ zo6L{xN;Gc4-7Mx~pk9}3^j>@F@N!yll~B^9CJ~G?4bNu%O9tm2E%>}$_nwq{LnUt6 zf#~0i24{gThGxbua@7z0f}z4aZQL6T3H#C4e-8Cz4$~x)-HYEz72*uZtOu9*@SwZt zzzZqoy4;h-+>$6rfNhhe75=iM5kdz7SmSi#$uM_;@e2*uBMwN^P}LiLh7D4Z$hU?` zML}r{We_r7Z9Gw?Mo$-UL%uJ_W%|Nm_jy(SNr#POH-}EJ~mQ@yA64n$wnxfnbSJeVc z*dRxLno&Ci4MBIrn$5+0-dtwOSZ0Pw|2~bLGK`(R-7{0WY3Ar(4)E~fH6yHpbQk%% zeC#*F3)k#JMejYnLDH7g4V<|h!5rNl@+JBS3cS)y5|?Q2x>(d((E7Vk7PqF~ zo1S|Dwv0;M&qkOQRp*tFBz~oi>Vr4FZYv5+i`xPlwb5PLZ&P&(5G4JTf%?~t=X^4D zsf#Z={IX~0Lq}+NW-qSu%zd(d+HQzieoz_k2$YYh@AHrSAwaXqbf$Ow&IwplSebQ} zbSZO2KWiZ3n@RUE(C6Gm&_|3#OxJO z<8+bX`eVt&OPV4Q8{r6Ne@n7_!rL2;`j6IDKIAub!g0?2kn%)wB?$R7I@j$Yo==4- z=`L7l_`4`h!R?_UJ>bpCGa-hw0A0&ocwbVZkCwLTqCL;i->7_TD4s*c1fs9yx=E^J zE?xS|*i(?!}}NTu(U)Sp;&Ky}!_fE6s(!VO9#^QUm$ zvG~V_lVz1H=Xt?n*y8Y&`O@}c{g&*Er}fK~88n@Q_}9AAU-ZR*UM8b3&d4_NS4N*G zyz3bl?W%u(>ApkPBxKl*l(evS7k9m)o=lYgZ0gEl6kyH;UaKzzdhv+u-^V2ZjKqK< z7nO~~r%#e^I?jI?tx~4X!d>rx^?xO$>CBBugEGgS7tjyn@W$h{(St3!R`#M!E=XN{ zuXyxn#S&;IA;Q4vaVAU4biFwTrj_DG3n125`|}x+emq3Nu#7kV!Y)9uN)&hSZz4@L zb<;r~(ZBteZM*0Z*0X)S@7avef)RQfIcNLsJiE8b(0{Ks`V&?-^UiZ&hIn)5B3CoF z>?uva0<^h%OFCcEn`{Y4`1Z`8sd-jpAFv@zZ~seQZC)?10QYUJU~Ke$yKA`b&@KL- z3PIlEz5_vC+&6{%KbzRW7X05R?{0SbJx4makkV10%DVs{+^A&33Rs)FWjiTqjp%o) zxU6S!!2h1K2abfL<+;PjVjQmd^=Q;i2)L>7^@M4dtVaW=Jztq<`=E=sT>r`71sCxD zJbx2PsA)(L>BSd=dKOJ-j|jr$p}{uWa)a*xi!1xRd)y1_3A1O~bj}|$*7-qot`hX@ z)+17HHh3T7!pLbwI&*9ZZv?yl6gr?NUkg+p>V z^Ku}RWtSd9zAG8L`-~1nNG~Bn2?5Dk<4}2O*^9v3Tas(^RKJ53NdY0sC!SO# z+EwP{zTe_eKsdz89&v;wI#Crou!(YYbZgc2OmracWh}mRc)a+by}x%MlN%SufEdw62@j)^;K_B(!eaIHi)b{p8eDa6}fB z7>K9#6ThEl_pnIeNPUdAL z_-^vdVS6NsDd{A=UKT4zak(?|<+E-w2|a2cOaN&dt22SSu7iA!tKsq`(DU5QwBqxb z(>{~p1BJ^XYEyX9-ZnBpPWVf3j^=7^91>KKtS|RuxxH=8J`lH9C~)(Xik2 z{=H}vTw<@8kG!#}NxlQ0DKbnfwfrr;mdA{Y>^Ty9>8) zGT!vw7CrhABs=ZIioS17)SJ*5*H0NmP~q|f-O%Bf5VKwwc`-oGwEKxyY4hGryp^Ew zZxnzOe%;%zviG+_33oT+JrFJ?H}67@bU3^Q+ZkSjy}zD{u|`N8cC0;mAHI4joPq`D zjL)YRo9>-!jw_AbU7Z)e?K!&GsTs*l)%nG*f2q3CzVE7jaCLKaadrUKz4vf`E}>W? zy$SUu#A+tqPo<8&GNHbnR{HKgfC{bs8(P0g>wSJjbLTEwegB9Z==Lj1iO8eEn5m$j z@H10^2L$z7)0gyy+Q6^Oi=RWDcN(02`1K(lB>;YDYugXtU@pFq{LCL_i&l2kDaouG z!Uht_=d}O87{~Wt1ty#6*-9Ra_>Tgw0E7O}w7%r^$GtLwv~H2*co^f$skMUssW@c7 zG9@j!i6*10{3Vg#|!v0-{A1n7+b#v8I#|cW>if_8XK$%TRHE; z^kGHRU|)o1SMt>yMTy^a4x-XXONV=r*A_4t#e=KpPxo4q(xs*)%)V? zhzt0`Jldo>zNWUJuj~jgzd9>|xbEwq^w&GB4yhX_@4Hs5W7zaB^s2n=4#>{%FjXGx zD^(+}aFKOFuh`c;&oEQ}Zua6L&6O<0yG!r9VVYiN^X&#lSiqiJk8ZE2Tw1#%`lRU+ zn}Z*=J@M9Rq77Zu#tH$3fRwOVHfrZ4o1Y`pFw9RzoZ&*?nt=D-G@WEq;nECcy$YVc zYrjdnSFZA2ThZ zGeV;?0TGl9GZP>0cc%y!cU*8gd;L+bBE&xEuD3*Yi!}c2@B4%Ig@07{o1IDZKsGE# z^~>Tnj-6sne>;**>M|2s;-~a)OH=PpKa`Dy{x~%m79t$ZYcf2TBy7qwiCU2h7V0aERgbeCq%sIEt&6@FA-rA& zb36&US4f&)Cbz;A68O?C2V1E=AjOLp+)&_OWIX6SiKh(5tqdEk_g<$VC~DjNhk<4l ziiQk?UtBh_g(jeD-;H;Ea**rT}^ciQ1wOsI_{cJuNa z4kb^2-;@h;e?w1@Bv4H`5#fP#vDiN6OmyANeV&+Gpf zdchgW@JUQoPGGK+y18>e&hgq8|3q z9v{eD*ZR0_%v9qhaelV9DeobRzb$d&gw+*0uZ`%N8i;{B8ma=ang4VBXpId}mYp4j zCjWbt`Ezld0H|IXbL9xBuqmwAtTHuJzm1QS#8afF79?yiWpShrd}YGfBP+_NOABiB=3iO$tPitxat zkrv~r2l4slR2ZNL_9$}ofck5r?&QTpQ0h)d%#I2^EG=48u<0Qs%`QFVaE5K(K)Fbi zr10YTNPP$?gVv?&cCaZ`AirQi{nVY(OKxd?1s2+Gl-oastuvA|ilR4a)e1`*PBMBR zs1T3t8O!F+GA-`jF(*-ijTAT_-T#3b=5k@j@?@@yD2|mvMC{$GC08%UibPY!9)g$y z5TxjjGUM=$Z`ZWp7Y0NLD4(;DS(nJdm|aF@sS8AqD$-b9VH(j)4@Yp8L6alyWQq9Q z<`&Q<%$+Hb@q3q&;ZS5X48)m>OoH8uGGBLb2bU_xdpwC|9s^Pyiir|1kk7uRi_p-( zf)@u82=k)0&9n){XsIXj)CpOlB;;LzPsW5S!?={0dcY_$yAEL)5Rg6{At9~#aPJnA z)T~+Wmzxx36Rao;S=B5wQ~G^yhZo}%KO|{#V+z-AMz93mz7#b-8J{)p*^37K%nO`d zALCCfESynotV|kj>P(`d=7}d|^xiJ|UfJVgS6klWq~kgD>8%EB~E<9OpKe#9aq@u6&`j%0x ztx5FKbaiILxzLX-buKv|=sDGGmfv-KFSh@}B}ryPda5OUT@ib$@!vAdD6G+)p8u>` z=O`MM3ax1xCO&Rz`-zO50)JEqtpgTHlVbH4!WJ(4-#&?^>kW6i^Ien=8p_HvoyN2> zdKMBG+$n^TEatpRw9tOoY~-I^6LE7B=y)>~Z%>O(jCtrtBq$356(r_yl3Kt#5)@1<5g`svaS4JL8} zflPK{I{_E(H`1f^d;t4?KqFi`OP1kV{RC%NTZVCZ7KBT*2&=e!1HM|mOF43t&lSAO z{K{w{r(E^X^U2pCC;Mi+YD;TZXq)zMeAzP9i>o-`z^y;O*xVk@J44G1>^EO7B@4C> zHMw0M?rM2lw^UO==8VAXV9wqvwz|WV7MWbwM+&8a z+XA>+#IlXys8IOg&7I+gYKnB(g~FG|_l7ntY`n#tYrlea#wl%v-p_zcuO(m8A;WlO zu8+%_`Ep06)eMDyAGUfYp3&UF!uRP*id_RYlU~Zc)2&v_Uz-kE0i3paL9#~u~zlep7 z=IrEdySuzB*+`o(-Z>dG{L&B7^GALNLGloQ%cyz^o>NLI&iIp3XGpqCnkHGYrS?mI zh`!%z`OTlKOsjW5%>vOrpl+9vAc&DNff%CPb-JBCIJP9#{ZO(tV=cs-leu-IM?%M3<=p1XzYy{%%!Y2*c&SGkk3SH~w; zDTDe8r``MbKLnveuUs3jCzAh(n`R`*u8A!$OhAo9!KtAkrg&h=>fN=ad2`|kD7!0= z_3`4K3Mi;C(bXs`GPhv@@8(lCFs|MWYzx0MT4tbK_m?RmOV+tb4bTAe}%tb8>U?l!e`;GdnA#wb!n4236SLQw3BAg zCK<8=0cS?I89ezZ^!hHL&iUHXb-mgsa+jzUf1OWf3bEJ7O&0N!Nw|KgzFZ{0I1b5x zHHE!DtFFdvzC`vUUJzi?UqEU3i|5>f8~f$Dz(1$-kO$9(e%pK=5|v8ae;rgK(CCrn zyzV7`(~ie!cbFR)5R|~%7$Sr?CyW8tj1WeRbRAvR4{wWBY!d?h{CiaxG6? z^tFj4h~vY*<%oei3z$#JfN)>?2^;b0?Uu8D^Dzu_b)Cm!vcz%roeu?o zJ}DqLS%G8N-03@DcByBBND~@p@;cN_?1@(BHhks?GeI==gP+Pph($9f#qxV72#qir zjCJnoPAYaPw>QW)?|X@&yiD+f*IP-i-Z8m(0I0CPQdwPxINGY@8#Lx;DiD;4e+(DM z!zNdhgwZl-PtF^qL^+m&cKrP_^_&!iO^L|^n(ljR6P#YN{iH=j!@;1bz3OWY2ahgm z;tmU={q=I$ck{vj9pI9&n=h0tt6dZ1`bz!VHqA#q64VdwpKlo|FJE!I4r5sU+`LN|nT`=otMCsh<4x;N94hC><<;PFSob%>>t2+I!&@On*GrHLhxsnfDWyE zfjg#RuLtj4(quc-{2KZ{1)3R*o1@!`scV}=OI^GgLlB640#aIu0B?XW;w-!KMnuQK zMDv{C!0SzqRS1&ej#246%DQsNM|pIJ z7w?*ZZPY*?C_74cuUThJ$|WVK%?;>Ct_WkKAQimV3RP{Aupoiwx=G2Hb=~wU;~}q; zFKN0(-o#)jS<|sBoWEXt<{J$wwBcJZ9xLO!4xyjN(66ak1QnS3UswhSO;RS6_D`Ov z2+V;wbV8To5K!iIT&9{sjNY=iCtM7T&c?Lg4fnZEqWPcPvaK9JktuuGe&S%3>r7~w zU(GNpAW*)#bXDrKM{16B=Kx{{2ZOAQ(#+-?6ARfR0nJqlO9Kl>>Wx(^lUpn`re9@g zBa+nhVPh!+!|AKIP0ytkD&(O;i20h!oNTWW-&;#=bhOk4%7qfg)j;`i-5xV)bAU%DPoy{9=4cY355=-{GrYF7?m;595-D)o(~CPlGBxWM)h) zqA%CgnE!|ch&ySzUk%DSuJNPyh+lWwE6cc&*WO&NFxiv1+J@3FcgYYj80c%8NVwG9 zoKebaAKtKaC8t&1@0%87DxT0xc1ane_X$J>3lPj4#*J_lPnY?a&Or>-&hPOcJ#YAm zlm2Vl2@08m^o(lxQSXBIsAbQDpSF*ZuPcm8{CK|kDG1BR2<$Q@Ar4h2uUy!m5bI#Q z)zkfre5CY$>Zb^Mxw-hxU+)}9A*bnR*IzAz2^j6;vraiM_McAarZIl;tWmj%+YEg9 zjvoQc2(aGl9ZB&{^DV6ICn^rCCKqj{EhC_PckvyEtjN;ra5M&yxej{+KqCj5b3MHr zzqAX6?hitp1hUWe&MzMqX})Z-?j9NfXQz$~P7J)}ZvJ9<agVL`2w8v%X z9vz=YkU4FSGg+^6CEaSD0RjJiU7hszEQtL@@rOX+Vv_DSt7m~cs`9VqH`kmPa4h+e zG{rcF?wk`mUjxT4HHf{(`seM-q={%VX!^6-QIG%I%YP)Q=D)fKG;9||TCmXD!Mz?=GeCz;MEOXF0Q3AU_W6&YBcnsaaqY%wjZQkR1gxsNuk(p-X zg%rwRbyz04y6&{4hbqI0@S7dOci-bIfS1M^-}MI_QTXD0P$`JNXCA6yd-a5zDqL4dhcxP0I z0Zz9lhWkU0dDtvY3pRr~7L@l@M@I~X)Xoc+RM=INMXT+P;NY)vMohM#7;-*N|Gcey z)FO&Y{s=pa@BPK3mk}66x|j60Qck7J{KS2H6d+VvwK0*OSLQkvZCnYLy%D08auZ4x z^&7G*Fg09+@}L&!;5-Im7zIRjDf)8jyE!pp`~`?)&}tA&f+!3F8_A8!8$H)uBx7$e zq9fYEkjY!-=m@hR5J|sHIDq`}f_tl&+@1bO5Cy;l17U9wqCOc9GBb{{03RS+aF`&5 z8me+z=t%eesU`pqh@5+{bz03dMf*{+d24}E^U2@-&&6YCeW%I{IN&S}3pkTUeIIkR zC0R4X0|2;9o6|>uqqikoU&9x7Kf5&YYlaVUYIvsf5etwrJ$@3K(P%~n;lgWqGYt7^ zFC@t(F+fP>*an*3kNSwVDV$y{eZm~;kszE!rrgSa3>4#pG5U@fWnWgV{$i|&jShSw zDLf@aH=0s%y@GyHkhWn$%rx$=6byK2Mv~v9Sdy@pPld5#Fo?il`W1^UrQX1ARjGsz z-PVDXQmk_<<>PL84h_d!^A)ogSG>Fl#PA!h#V(pPVTa5B+TjlrSH@?T8&U?#}^jyDHPz61H$O>`zL+=ZQ3#2Lo^a++Q5Z0y#sl#ruC|7D!D zK6^5P8z#q@(#lLDZV{H_zKjx0DWU%sGylMRjeF!`SeKI#T#^@S`ldg;b^Gee`*1N! zf|v9SQA#gA8BYBXTr?)B%G@ha2uod(lU)vEF{$3gU;TI@(bdxSINaE$y4K6|X16^& zrsk)@4?Lcerf-w-SD@gz2zt zw|y$%6QdnggLf!jYjX55iP1}CvlZyk?usm62i z2VvW#?y$&62^PK=7$4Ei5g8ULvNw?jlXA&Q(FVW!RiOT+nn*y3y+<5H8)On2M{MG&nbzh|=Yt@WhQ5_hW4t-GOdk18Fk} z@O6y|MOqNYwkgvy(C$M1^V@ZnI8e?`vBp*QH!%}rc4}Y2j=)!oB}6li`QgX)>*EL1 zdovX5ku)qDQ52GKwhz`PZZ{jsPzMn%jW7?WOb3|fVbZ7AX;Lq+b zQ+W9ply}ClLkpzce3VT7reDNR%=9OflD7z!1p5xuQ}En+OwcTC9Jj>Za{Knv*Icrs zH-dMM)4{G+!w1|lU0gEDxKHZs*@pJ4PcCM#uMxiS7Y3yvEs?%j(|}k=5*q7WhbnO> z&!6xT{kCX_NZrSqqp`%s^xn9j)x5keMlKNwPLsr_31U;XKW_Km=u7c+O(|3B`9VVe zW%1G)-{BmrNv<|IyYf)`%&M_W^8`h~qn}Oee_(HP<#!h{Or;OMyLYc@@!b5n`tzj6 zhB?jED^g}b2AZ3)(7`(bhn#tjwj0&?kw>(4F-%3YHW$?qy+>wNk!8f*t>|cv|8|K^ z7ghmaIbFq50`#`cN#MNkXT)$`+_PgEd24rNmeA}(X#39l;Buw_4~}^hO9uR@pxQE7 z4+m#Qp8DubVAr3K^(CW!j=WV2?=Ywxtf|~$&=A_{1s)2*@;sYy7uF%rwX-(unmL^-!hSV(Ah6`^icr?eR z=5^QMu$&?wOhv%QB1@M9u7TpGRqZ@<+H)tL-cJutxN(~9>}%^fV!WZy6!^U}ng8hQ zw7zD@Bl1itkWfw3z>Moo{_J?hBhtmAH!Glr7AIK|8^#9tq{_|;DWo8f{S?D%lWe4L z4`e(0u;caDb6!G>?dJyz#(;H$|DO~!M|C=H@@{a#WRx4sdjxN{+yzE__ACMtj%X$;>uEE)iYxm2ATQ4C z(W;Kt^(MakP{I9e4=yvRC;eu_`u|{N<~~sWS^WHrnNbldo%WaN;V9fZN)oY9Ze7`W zGr$+|24_Ca*o#1;hkADgBsc>)0vOzMB;Up(^q&|ARRZ%~fc=l=x)SB3r_%*?Xb*QU z=3$&Tp{+S?xqEi zv@TDHUjB(sAnJ?KOKaS8)bA`a?~YpKPz?!FuCCKMfLwzh1`2J^?=H=^U_%d~A|vjf z{6B~B_oc&4OkkBCi9G&4q|7TWdn|srMP)n3B$E$S%~!bV=nW!%nDve*iF=bvoBtOn z6UP&uyH|(tPp5ZSD*^L)c`5(yowzy|e%2gSDsOnygcY0j|b?yD)@yzxmZl zVN)xH&h|wHy8o-q0(Jj|sf~xn$%1BY&t?A

    *Y{rg*rK|LP@EVF33fnf;fznWEm$PRirEmM{$TU62Lp>+a;vN_uM(;Iiu)^& zZ}uybp%(NBY$}KFU9#`NFdGC{#4prwvB4XiA`mB$I?FRbCf$54-)y?iUXy%Ka2Fm# zGvtl>Oq+rGJgP?+qME$Xq8JpjCH;=1!&Roq0W6*dhYl1Sus{7Dri_ExN;8qW>xa*! zVdj<1B(GA#Kp%(B6;W^0yhBTYW-oTP+>*RfBU;d53y;DmRg`D6*!to5=25e#-7eRD zFQ!w$cr@Fo)}|c#%c9-nH_SyD?+KUq!*#a!;Vlr>%!l$X^Mg{9IRH zwz>LpdSB5~kY^n-hw!f}(7<+j61(}n-INgc^&2a8rydZFOU5~CTCS4adB*R1?!2}Z zLCa;Tm|Qt7uukE`f5v-Ww;s;0TMlz$AetGLz{+Ig$D65m`A1zj@E|t={uFnNY7?DH z&n29GneEUq;eCTQh@#TmO6zpI!RGCKxBzIzYzF;};c;?UwWC_qYwFL@e{747BY*uw zAYGoqUjpf@7%1=QP^4Zzc>xw+>Dd{M(u}H_*(IQnL2;a+l=bf5dUWx0H<5msbC*tgi+Loj=l+;XCsC z_-5t_w3A2*kPU@3Ei^p+5KNcQJ1FUr4d`pu{EgBdJx6&Goo)iJ6MdREU0i|FE3_&U z^i3uU&K<+L-%t_C7xz6oFP^j&g6Vkdbk@tcL($L|0rZRk;*mRyN>|CH-K_Xma7USO zMvW`25}0Dz1V)_b4@%iGdM(Ispl=73x#D&@cQDTOhuqx^I?UB)t>Hs^weB;0ytj|s zw7}P@D@OM?{a99W$RjUA>PkA>z2Kc#(?_vroJ}p(P4|;W-JLUUtfKeoY=)KvuZIlK zt#;9h-xu)1KEFGrBxM9B?t3I{MRsLoli>G9Bc+LxFg>I)LshQ)WVR0vUw-}oRvBWH zt^BNl7~tBAx}_qo$0O;V@ieyL?)pTA)L_5fes^&C&D<@{tXp}?x;temFm8U)Dmd_} zm<$lf{Pdx$C47e^QKOr)%pYvI9nv-*RN5Tw_nWLQa~iFB3C3n=gC__Z9XbWzlpoV- z@hsnm?srR);XB9Anjvago&>Nhu~l{QPk+1p)J zPbhKIfcyp*9{$OPFO7qVF2S-_K^-NcIvL2@QK-D&8KEMK2Lfn5M1Gl`|1&!B5E}#i zSU@`FhN1C2zCajExl$4@>5plr&{bfQ4lz-<`Jb4L2wMvla+-(u+$JZKCT;2C7Ie~U=F{2)y&FZYU&2B`^n0)Fu8zYLO88q)<3%1a`Z zJdv^X2sFLbAo?XI=Zgky+ZtH1YE>v>1M~Ft4A7DP3VWMm%LtWu!>BBRoIR%eI+94I z(CFee_}0&Q{GRAbpx&3;`_lV)+wpsw;hTivlT5S6Y+4H`Ls7Mnj-Swo;C~P@U{HipF;1RlhuLVybK1GYd-mtj=d!4#nGqWzu zlX7@d{(8O;+5QY|3Jrf%+L!hefwVZnF#MvuV9)S#j*UzJ>APx5_53ML)i- z*3{Gyvir;7-NM-g!vCkS@UPZywRR=mS*w>ymk{{YD*dh1NvR*t`1)E|o*L!y_Tk+ zNRxTfexgn(5%=Nu>8N3qx`OI8{ZJkDcV|Y1U-A;4-eYw!R_ZW2J>;G{%C2hYT(kh` z*iBFyULT)oVDK_H<1zWY{%>5y{D&Sp9HM8cf!1RB*$o(|3KX<0w6U};Oz}UnB*!|> zbf=;J;zHMQ*2NX)G$U>9DU@ZjG>mXx5$X=IR4((6xG-qvL}WM@#;+=abz9bdM(WeA zmi$HiyHtGgn8Dz6@f(sunuMgzmU2F8%dWd_`#RHxmB?YWP<48d<-FJ)tq_RbuG4wnG4F*G;q>rN=>yVfUW zGk>$W_W1(^ktIpZn@wLcX4za8d--3itflGfl);Ug;JCcTvH$*P>K$7hKSw$OePz1G zKlcguEiwmy-<}jao^8G<*9(35s?oFr@UQG?}^E3oKj7XRx2bUt8{BK>8RU zR08=eaPv>qJ^!V1=N32(o$%=;Hh08j*Uz?nBu6}8YKJjH&Oqt9C}g|MP_nD_pE@0< z55}Cf@gTo;lNxJjT)nV<+)Ca&s-GJW>!0w%W!uo7wFjj~6u{pt z%q6=JR+gD-HvQdVb-|z)-oozf*k8G_Zs_dHzo7l;ncbmXkZ@nZ6Jy6oZu~z0F$%k^ zPw|;|?S26t$CC<$Z6rpUzp#O3n5B$Aqino37R#Iep>IS0Nf&u-eQ)AUc@VJeJ}}rp zaRA@;UYh;gs}qk>KI$!x7sESbxM8~{)=!jX&}F)G@;oPzewujpFF0~%vU;C6|2r91 z?N;3@i(VVzG)CCvpJd0*|KY9(Df+Z3mVDu?K<@m%NV}`3wz{ZM*l2+kr??k)Dee^a z;_gtOxVsdJyO(0ci$ie>P$ak(cb8y60|fHt{mvQZ>WpzN{+m6L++>fv*Unm5bIxZ@ z)`|vcUf#U@1>JA+5J@6AR?RnV7=oMBMx#HzH&KqrO5r zk;FZMKUkY3TClDO1DN6u?t71? z-3fvEH}*{4PIW{!0sC*^CIF9ZzO5?8rB&CPAM&Bd>-?Qg=sY?@e;nB*@Db_H~^4H>XvsJ*G;K z;2NKVY^?RIai`0{Z9H*)FLv8G4zFYt5hVao5;GoYHBmZ8?x?bTl`fC6H0@tZZtp?{Ktx{3&PWo~B>ML`ZI&8<#%T z;;WU$L91P4f;if_2**L!Rz*bMo3Pz@#yI~dQ(S&spd3l%pW-$|8)es_o4i@fEpVqF zik3hgA>8wn>4z_klHu2o6MhZXJ|D?o4cnR2R)d9KzKV}Sx>xZv*glz^pW^){K;vFI z@YN8ozA3!6Y2s#M3FQ|XXBRv`ExzWw+Hf*f3)kA=ONh8^oY8r#`Z6QNvlM}!UQ-`#Q?i>f_S+!qHx+Sx zl-J%ae@d`Pvvax4xod5cl{VXuC0Nx%5H561wvMtgqt@OUjkIN&pI;rWY(GZzCI3ljJA`50{b=$;NXR|xOnfd(a7qXE%Gn30YdA*T+zbI$^8C} z)=j3FormXvV@DrcNkG#-hUx8evrQQ)R}}qcj=WSW0R1dHh_gBoe}MG9oW^R=hRyrn zuRfK?PB~N=^U=GMccbg`Xz!2b# zOQM|d-cvVO+rQKHvwZmAN|c`K(BMl-i9kL&f&3jEY5)p^2!(OviM7>37f4_^UhFq$ z?eyW}A{x@WxU@zS{wG&PGv~2wG~9DSpBrycM>Huve`jd>lZuqcJF6 z`iYSdO~ztaOKU>6Ut#E!zEg&l+s6>sM~55}U!^|fZ~51)Qf+a4Z@Rg(FLD)~uBt`c znZ41{onRXSHDQUgVS=1-lRI?1iO^y;=LDi-M81$@9g6*`gAYov8pl-XNu~I}b*c)F zXO#WlRmE1rEm9ie;AcNgDyK~w5+%e3-xW6$$9McWg3@9oed`tbg%PtM*kca^bN@;; z`47$%tCSL~f9(!g`lW~F_}PkhkJ7rEz4cY-2?fdZO3m^j(ZPI=$MttW79H8tZ!4ShDdmGhsAX@Cv<}mwQ5Kj^DCGSs^)&F zT1s?Oqy}~tNeoJgXNw(H(G*S0hkMvtzEMG?ZUQE=Nq6LHYGWstx-)#!$%36IMb^*F z%mzN9fN?%qHRI@AUO#i}3_EgBZ^qf9uSWlMs2S01Gj zU3kGxgRFn;I(c}LLb+h#vC?>{$K*dCVlaju9 z6s6X@rGiU#MWa`KEs=2kLsj&)A`=b-OHjdRt#?uJ?VEjj!r!VpP9DUmfmy{rs=uc4 zMl$SkGWxR6uS!?twR6_~HzaVPI>e*bZE??Mzn01GbEK6r-K86zj%#PlT}xJKi6pOk z2D40jVae0D7_*tHE;W8+V(57{(t}&<-5uziO+#F*m9bsLOMh|j$u?siFJZ(Xh_oqx2 zCt6=m;VhUGRd3tV7T1*^EBB~TS1$BY#I);XauVKC5=6?n@eNC<5k;EqH!}F?Q_qj> zxvKoq`6-F?DXSsVIGx%94|6R+H`5L23!g36hkI9S6$W!tdnG;6^seZ1I)}`nGG4i> z0WN~iMe2~jY5lwp8qhZc1q`_7fw+PX;v-vbe<$^hpW!8$AIw5`DcvV&*RvnXGy$M~ zurL03BW~V(ErTQ}+Ccf+JjWBs0?b{B%Qt@$`P@FV|L_|S-@^M2LfL&mxz1Jew=2+; z@Qd@q+$kYwxu*Ipp%$cH`1$Y0F)|PVZ=PnA9el%5i`QEqN4YX(=Zx1%v0Op5U8JO2 zGrDV*6YThNp3W!A@~3E1Xj+HogYt#jbpA7jiAu4U+^@E|xVm z@FD~_C*yuCSXlJY%s*uMX0*immvkQw3X(=Such$4B0BQxk<6;+YaZdc_m+_g6x&!M z###CzJ*g~!@jT2GA4OmE1ppfUpBI{jc zPkA1NQWJcQFb`^!Xp^`WD{tOc}vLMZ=w_zSgqbX;1}_2PF&(L2+-`nvOft5u2iQU{Mqy$u(k!r6@>RO`C>@hUXW8XAf`2FqTdFs{hk zU7^UkE*<1H(K(1M4Nc;o%9BU zfFh!8X)ls~T*Pi$V0#o=N+r92fKuBD$rGT7=5Em#(Am)CTE`J`8B;50u4(NB;_zkZ zNpIUc^pp%m?a*g+;7@7x;5pJSZ^&K`#y$7Ene!_EzF7<5c5OIdOJyf_LhFMMQ1U5? z>R07+;m_Le`PJ~RXk{?$#HFFEi6e|3@)dn)+XO4Ad{w&ozq@3t{3jx6`2DWWjJ-US z)|=>%I?Cpo5#4d{NEtPH^pSPYx9pU1ekZ_CExCLogK@Q2t;MmvE=Z#hUs1eiYAHnS zp+y=Ts4!7ek9sp9^54nYEmnAjh7fivu{j)k4eC_g5%IwJ)Vy=#R7RhSaUa+x)<31s zZOFJR80H^t3P02IaAk(hqW?xzdbqFFN7#J6MfN%3=-XIQ;M>@WFkSK<1-ycOU0BaP zVC%uW@74ZoOfK$a@*lEoy)?RMXhYHE2g#Kg*Z0j|v&qM$kq9Wi@t*1 z%#U=L=@=sjQf48=OoVTZ%1J>$W-u!?fgcd#vHBdcMJ#d<4sT3Qj|{hw5Z$4* zd||5f4!j!G_#b-`=MMTkxmKs+b1*S4slhG!0mNFBkfP|?uq@VL_u^i7rsDBkz& z2sww=hdmf>%OeUhpd`7DJr`m?QV@R>O8WLGptyxdRBc-mLE6JK=uwiWvkQ$ee?3|O zBs1}`S()+Iclz^D3h~^skuPW=HDQ6;f9(jxw!^r>T(59_>A;rBUE6I`_; z7tr{r_G`23kRt&O!j4eH3i04cL{`d>g0M@`ZEr+Zo9|16P$34WYTq>F)jP!A3H092 zpXni@sO3Jd#)z8E z6PUmJbBU4P;rAJm(qNcjj3?7r6zDObaLmVBZO_q>kXc&-jI-6ff~4kh!W-t47@V=|C92_%SECybclS?3eh{@Hkoi zoON*-#!SM{!GuI;$;MCnhs*t-SSc$- zMcv!;&s(NXtf`|MxKse?eGwVPb1_kPVYhk!!OVFT>V_DOwiDm)I;iqLLa4;=`uw}F zZSFx`*Y>IHFYHtTnBTUkWUrr)3w7@Hh$wq;2MH%wF&A;v)Vk5nKpRa14TO-Iq#qZJ_1umIevP8(bRz;lh zYI3?rTBNz&?eZ)t=Sh?;vK>tqdh-&#d3{YJ>AQGB`DpDPMo-2kn){^&#P01iwcOd( zQRZN747|_+Vs1Hnz4-C1H5aPqQrUluyg#P3AeBMi0`m)t>{l<72Dn>a#59! zixbOBv+KG>jTP<+4o^Rw@_5?@#9Wg9^S;rW)e}OWv?ZmSM`$x&WP zFmRrBJdoCwP5vgg$--y7w^zO$$@mc5rIYVyH^OPVme9S}2hHuaX@cMDQw$P;WXE-h zMO~lvoe|48Gz0c4mCEdTJ!6SgqnS4MMi1IK_S-&>$lv(1M7G6#e-KL>vPm0%|2Kj+ z=WE{sF;URGqJ%Z3!-e8!&OJg^T+XZ&uU*eKVBvI#P4_YICL@4#NxLsJk@4|=*l$7d z|HFQRCx70c6VDA(ei!*0>%HrZe)?S}j>F+a43%Srimza+tS0r z=G)UDkp*o4>|o{C7Hn10 z0}pU3Wg;E6>wu6#S0Z;&g_92u(W%ZfE!8Zna-dq|ym*zwKXuZ1eVLI@8kg%&3z<{_h*rLbbA@0sf zIoh?nQR5<^e*org7->!FV&v~!Qin5CsMP)t&<*=I3R6yd4oQ2K*v)NLCVq{ayC8ZM zXE}eP9LUkJlo}}Bfri1fX=5byX8^jfT_jJj-qs8WIk=y)Jxe@CJp=jy7!LXb`S$i> z@19>ioCVWolPhsn>*j3kKdPYxnm3InYjf`5gqgPqnTxfC%nZ1Te1BG(t~Vi8$+#c* zo(nYYmiGF;(%M~^vifVIl2m%(jFh#v9?yIW zC6o$42o;|DsN<7Iv?r#}-79s`)?Zj**#p5oIP#a26qhI2kAn6b3p=v=uRDzFjekhy z!o#jt4KPs@>J22hX^*>(fpOtK%86}N+}3OV{J-Jf8o#v8Fzm5h3X@g{AU`l4)|0QO z`lz9oYX^cT;IX(6js!p4ob^X5Znh9e1CkZapdBhN*p(j zyPa~27?a=N2}g>XXDz`2)pe@7g<|2r;2g>AN(6k_5Tz9X3nhrU--AJBIy6%-&J2<{@?ib8;*Lp z{FacNE1@-m2hdeR*3wl<^v)Pj7S+?mVlj(8>|-d-bwwP^EE{w8C&o1&GsUa4K3Em3 zT;9S5ul|`fYmPBtb#ZiZVBsfh^KCw75ojfX=lr#1UJ|Qm^!;1Q=tuEPjG>9%=NkEJ zo7SAHxH}W=%0*+Y8 z3PCw3LsTC|cO{HB#9N>J+Uy_+Sdk{ z-5#tulX4%E=;UPy{u_9LoX+oc1ekoV39T6z`;ETw@bm+ zdc`7*e=@ReW`161<6&e%5EbX^N~pzLCm&wg1GWDmA+bh!-=;aj2A$FzfKl|y0+Qhd z36f*ttt%u+>eY+Zi2S*jIB~;u`C!pPu%6y$s6lmBe(!Ez%gqsq$^Clk7Sz+G)3GHV zs4{-ws|CP6qn>DkY}G@|UD9%$FTRl1JKIh`((g4%uR~);B~c~Kbsl>Yd)1x|+@axe z1@0$%S5`eg5vKwmGnV$A4>@C6*JAUNHv`dKh1_7V@yVNPuRuxCyz>{lg-zpXr^}y( z3LM~1fhyrijT00>LQ6fu_XNqmFLfMsfZat4pCl`TsGA0JGkMG%1oQbM&0A;k_o|k# zAD72IRt8bkrxnUR>-{}F<*K>$-8cH6khZAn7!dKtI}MEebl=y6bF6=z9Y!6bSCU_gKpDt&pWqrn6=h|D(3lG-UYqW)>FSk8ee!7#s_%l6R7^Z8`PV&R(hbmWVnDvcDgL$U? z3;O60p6;DO6m<2T*pdITOCy+kO>!{VGk`kmX6PlslOkrExb;Yz;t{#ik$G>L|3)99 zkQh7ptSyfWd)iv#H=Jbua6Z58AFOpFLVaeNuv5`>BuV5kDu4gBx804FmqPfcT&Yi1{}6T|gd#!Vty zh0Gtf3gOj!M{-p9AsZ6%YBvH4)VC^0L`NVZ_gkkYR6Xj+titRNG)eOo)rRd8eNMA0 zb^$|kN`JFCjZ~^FeFdkJe=E=3N+HQ!f%*SIg*wcnV2}G9NJwaJH*TZ$xo+$Xr(X2 zXRij=#sfD_g1E<*-=7F{&OiTf4R~NEZDS#$>I&YVz*^#BJlS|0`B!~36;SvQ?ZjiNJ+xoWE zj`se#qQEYH!Sem)ga}RtfI`{<)yWsYBy(auj)lu}h2#?OX2`9OX#o7VoC+v~pjP#= z)YOJZ?dp&9t;kAOlYftz)LCoOYV&=GRi~U4&e_Fc6oEE`5Pp~Mbu)akCKseixF!?y z9)6gh3o>Y6`i}F@S~PATSpvoB78{2Io9;D&Wl9k*Ix!+o9?FeP?%0pK41w%{x9uq6 z=C+gq6TbmJy-TLeC|G$eO&@|vUf_F!8$#8>#_6+vMo6$fvP+#DUw}K3PxsS zdz$Sj1<(s%>IN$qIzNGKx7wUTDXnmPE57cTM=wVJVpWn(rMLd9LYHV4vw^qOR0uxz zh%xnM2Z@xNdiB>n4uxURh3a10J1oWNJ7u@BXY~DgGuk>ubIo4?L(Wd${&pmCr2uA< z@A^xU4OqaQeDaT)|TYt`rz(OnMrAsNXmYEEizN=p&v&m6yok$O;W z8B<*HjoWi>f2hD9k8Y6l9(kE_44He*AI9}V10{En zUPl=+*Qnd&F!@opD1jfA#Y*m?Sd1gB-+)6p(;{4|9=ZP;8OJWW?%Qj{!)?w#zEpZO z+rLx`snHiQ`!dk6&bR~lOa?hs2x{cK66%)xeh~b2r-WUIr~sp=pO5NNoq^(z$FwxE zcQX99Wfg(aX8I_l{B;5S?aw`u7WM&JD(in(Waf#QZ2uYK<%uUUiIyPmcCvK6^}ZO( zJP;qB70FQm+!#*?9fup^B>!WK|GHeik9FTj%Gm2vBP3h$p1a%bZTtik47jeZ#)aXV zk}bK|hGKo+J9)*eM;5y$wB9`Tn0SXv*>z3QE@c}F409O1?eSFYLfgX1+#dHLViD=) z9GvM<-R3bBM17(B1^fYgx9uKBu?FtMeir7C(KSI?gJ?>X^AH{^1n4HYX54(#ERduf zxBo^37FGxIIr$SF-)ekQXCks6kFW43CR=BU$I{?e)>X{A-*$+#41k!G&rZ{ru_BAs zYwj=6d{I=Wr)1X*0fFC3@0FvFMc;~@3E_yu2-1+}4>`>15K7p*P_9G^+cQdZTbIOo z;4u2)b{Gi0Z4OQfA+yd}#ED9)#vEENyYnu-E-bZydKz;5at|V?2t}7&(pQgi!yfkn zKXZFHj#5frTp=8B10^%pwMQtGE=W9pZy>>>q3|?ehDe-ojoDn*WIL4*TdI@tkF_GC=y%pn5>}*0*cx$GRxDg2?k5 zk+BNe4-^lme%(o)(m^zD$$Qyo&LRRepKK`1w1rVWS@*x7*K>V8!1NyvM*N!BQdH-0 zWYXl-{!_-El$Lv<%qpt%-#XJ5S;fiV&OxDXmg?Re*x5IQrQSgid4&8%G>bOM`2va5 z%6CbNzAER^{NMMm3#Ma|p69;?X;x+b_(Jupc8b1x(wKw717NSs90i-=?5=2UkKQRH z%^ORZzq{3Uw}qZ2?D0|ss$$y&hTXY+*$z#4feYg;qJ@O#>gg`N>hEq1NZ!l_>p9^l zq+CEG$EE}8m{K;|#id?2=w2)X+ObY$+JjMDLW|?A@x@k!GQ7S8W87~o-(!~gMbMb| zl6`_|(2%g&UoTTUpBxZD(`ijqL?R)Up#oWRg5iF94=WiGL4#lE%N($S2X4(VXIogx z1&5_vn~MdLc6r3rtc$-5qsUp~m+6n){+UC~%6!fYnWhi0+pi&*LW3qBY&*Tpe$=Te z;7*+WeXGjQ%_4j=cakH&Ws^tBij%hcZ~ozic@w+%W3K%+%%A9IUd6k(g(izxZ~Q{J z?{>S||C|x;*q;5$LnU^;KB=H*pKz63LSP@FB{W0s3=HSm`yILmxs#a3V`71;&S&jG zkw9`=Qeh<#Ndy)uejQMKY%*CDSm{htre*3sV!ZSQ`4`oKU>=Se87nOR-H$ZjDm7I0%_EPQGxo`U#CWMBZ?u<6KnYEu51bgkUtA(l@Ov9<2;}07n0)h8 z30&LbEf4IbTc^=yE#ZQnjqub0Bz~Q#l%KC>^Z_?oW*f%->|o{>^WtIp`Qk`N+DkIx zo_6|+cH1gD+;rXS14V{BxVLT<4Er(T3_q(|KbdBGZq; z_v4dONQv+KkhKdQND#~dFOwCa-P3_2_n+XfIyOztme)Mbq6#_XChTTLL+KLP^B>M- zb@|MAkBB&O)5(xh^n;4{trly2gvVn1Pilsf1FHN2>6P2vQo4t9_>RCi`o`$K&;IAK zRlH5$L9oMS{bBH0vqvF*=JTfVSTOJR=aKGE6Lnz{_3#X1YcXjOak|yVAY8 z1rJqRFTbsSnRQ^6W83p=nm}Qvx>g(Jo444w~tc z{9oI$h}~%H)4L8(OCMfSu49(Sh$&W6O2` zg}v(FLz9HAfHT3Z>Vt-LLe|LYm%~2^0J8gvu0e?79H7NgQl#~=?!M5I=dI&%n*`&q zW%_*wrALM>{bGZ8!Kguv32^tO1^~iC9SNn3UwYjamh~^JdQ)t-Kg{;%w~@AVX8<5e zo4!(EJL+Mlp4`FtW4Q0VNnAHca~xcmIfk6YLCCI9kU6%)(8&)m-4 zQq7IP=Q~D+%{N(3$G`NA>?(xS?1YV1@V0I8KXynJ1Riu`h+U4+O!r@l_4%O14fwCq zUyj}g24BK=V8yckOg2T?Myu}iS4snd3T|xQcEINiY)jFf<^we2TUg2m_x4tNBXO|IoKVovt@0ZQw$Gc9(JfZ$sQ0@4?DCi z>b=XObWuUbs|GY!eVc1z!9?mJ$m0lg2R5-2U;26!88_Gvxo?Ir8(hio$=5{VjkXzI zsya7JFpcU#%4;&~(%7x5BLkl0krj)y0h$docu{)Dd-#B3b+os@b@RGt+g&~=6 zV4Mp^Og{HS#Bx*ir;Xy8?S?9dT2wxWx(>y>v?4*2X+v_~w=GNAAHix5Q4I*m=uE_Z z;$rYch38{*MXfLFv(gPJ`F^6iRI-GQ_X)dbti!d1g!EyKXzxz_+&f}pJF`q=O5=bk zt-6m*o4hkhx&W;i_bfOh)aY`X0)e$dwj5HGr#3n^wSw6#@_B2i!IY9~PpK!I$=ysN zAjub+ZkR*?1d~PrnKmH%NT?tAQ7!CvBd7m+Xn2YzN+i52#0(ny0lOD*z*kJ2Vcn7* z9(5mZpi~8eJ6=*tD-z!WegYh*N@6bzq(doAKJQ|e^A)Z8`Bp^k7RrOw_5Z+^45k;D z#llK6vXtlgBD>yT&yoC3;Hjw}u0m$P%4MEp9rLmG9rW{<=u10a@ajo%HI(~R*InBQlSG-qITFk_)|H!7uRgL+WYWRY zatArfW&lGxJDc&yhH`r@@@iy(GM6{~bF0-dVsT^s?qYfuLAZF9sjMR!ctg#rVg0hm zH4&GK%b>2Kn@kxL>yeI@>GezQqWCYCSL==Tl4@V7_#2n=*;-mDMB`Tm z@LUvKwk%LFYOHroZEkS(HMld@Bq7c~pOl*D$%0#@Q+{Yg=D4fHMu~Pvq}OLuF?CmFmp^4qZ*470T$6NWrAjO4Jk1y}Hw~VX_u~(( zz%v`rEmoCJ!O~B_pD(K0wBe6)Vy_D~H(pfefPB(rthgK};3@nhD;w1gpcRMjQ?dYJ5?d|+jlHHl~ zV^?&4^rdQ12yScZ3oH7gGC2zi?P_yj>U&!aY{gpCUy_87ErZ0PG(0Mr*4dgGuf0Wt zKsQZfp&svH!jvKMq}O&iNqHFe(6IL}yM`=xZa(j~R=7UA3U50RC+KCOZvA-%varkx z5}uv64x=Ue+^#c=Z%6_m8WB2o;&-}zC)@0T8j!49((Qks8?w+Z@6B@`<`!eTpD9U= zd>yMKf22$px_|+7L!w-9^|i4*eP2W9t|Yl$e)g(4WBW52Ts6z35}OQ7&YC_O!IXL5 zn$_KL8H;%PNV=wN(QODkT5&mNTaRiCqpA35@rzOCJra^{PQ0=E_%-iKd(|aH!x44V zbYc|nbX@FzUPkLo{y0DUPZuBYmCkTAlRxW;3S{&r3UBJT19Sk;=Q6Y3^%!5!n-(6n?(zF;seu+p1xoach;T z&I$@|p>bKBPrRAKSo+x~8TN90=Pv=r#TTq4Do@;b_f_yEF9}$JsuhipYd*aA(sk^s zw0Fl3bU(gly<^Z-$V_@-rM$xv*=@!=j`^ZP`0c#q(c?N(V~WV$o9yL9`%nf(aZ@B! zy@PrRGmDsuN11Lg-)z6M9p%dBGC532J{(Wiy6nl=&!`C@t`;y7$qrHakj(>L5ba^(hjVsoeF`hi7-06lF~3up@~@F%C!dcHu5WgL zBX8Riv2R$ilQ_h6O|O2Vl14L|hFg{35zq!D6iKnI9Rmq3o6k2%adWJ6&SrCv)GSkv zPWB5hb`FmCUJh4MLW5OB|CPR57yB2~S{?oK&5M{Z#tThP6HRw%hI~>b;RsV<2%`qz zns>2-Wj@peb?y@0u1eZQOnWro1*O6_U>n{X%C3B(Er)O>JL2+K`D$UY-~OmXip?kp zM;L1n~=5Y7>8NosF5{nu)pvikI?TAtcM`x8}U*A08%W`lmy-y|r88(aRJ>>hJ3d|JmX)!9ePx>4~J2dW`+I ztf17(V#hV*V9Y-E{a~*UoP?KhKgN`YwMU6AX!(Kkujh-Li?l-GV-U!s;ES|hA*rc< z@`_i50hi>}zxQAPt&q`57A}Q}h+{tYknN+kKss$*fOcLpMgL0cxDg`s zbypFQ4t-ftIgAR~G3D|KoEuGmsyc>Xhp(#R){0g-+E$4)rH1h6v+a-lqt>F1>DUkb zBRZs~_Z?<~Y#%Qog>VX^*wySl%+0~Lz-veJm_3k7*^%=5 zqdBfCsWX8CSBzjvE81(aQhwg?jFKSoKOw2z%xVR*Cp+D1x!pegqFFgTTU7S#5>7lk77K=F$er= z5*!XV48+X7f&Mx5>egb3EcszMwikXre>Lc7wO64-r#K;sVXQ|ciusZTK-l#(C=}Lx zV757}en9g8jCi!6yk;+N$-6jSy=0YWQf?M|-4|bou6+-o0B5!D5v)j)*7w(P zx-C|Dm8cy**Q=2Xs}1#nG8rdhcDeW0tW609pXy*zT4LP?Z7`|!!q~=Ac~H^Uo~lg2=(A-qnAOwIwg8`uHU>?d6XcMzpXMd0??uS z!^c#MndUNds3x{X<$QKTg^UQOhncj9V(l&}2OX;sZIdgU9(ieO>q>X50=+8GXR7_# zlbeJ37uA|0alexyxhW{sT{P-qtyP%|cYisOwM#;nui6z0M@9M}0Ma%l$zke?>Wb-W z4j8M>j7Pnys&hd7=q#L7o#R26aiR=jJeWDu)hhR9L9CDB)Jti7t-(*xQ}58~%(BQw zFk{$Y?(=QYsjC?y)H37W;0&|1=`~^5VCiGJ;6(JuTwuDOLQF(5scuvqXeL{$>XTF0 zZDF$jsd<#$|3dXUNC*3Q=ja=N*LE`8ko(n;+SQv1-J8$QFF$XWO#9-G_zALYiv?#R z7#k1lToPSTg+H)ZkX^5Bk!-u7LIn}q-dY%)*%gRz1T4H>Vo1<$54?3D?(>FWhbObP zr_(q~x>q19wyEfAN&1p)Q=>~ThB-78x_gmHd{sQ!cq>tW?-lf2!)RL@Ny7P?2Ftbt zNE)%Q5g}TVe%tb$Sm`!i_;g?&9TFA6)ijFv`>XHaTzEl4NapxgUT^(W5kcoMVRje= zH(_?DVqDv(;jZY%ReZ|ANz8t;NL&O#Ye-!0e&f)d=MjV5+sZr1-(O|WJoQ%S8#RRN zL2;hF{8#k~{v34u?SA^pg?KZCGBxe4OMWCLP76?u@D!BbSc~4hk94!mG#|XsfB^Ae zi1ZObh=C;Ei5StO{nE0zl149;n0%vC*z@EwzSUMWvNNT!Go`T;V;DBD7pj6aid;#E zHH;e;hP0K4N_oQF6iD5i>%ZKb>LJUT(-tW5?unfiiDt#M_s3Uc zVP3o5*x=3_Kd@kyH`(kD?Ah!(!y{&#smy|iE8SC<(mf6Q#2cjo;nL&|T)>4`^6@m| z6a4*iq}WZQn1ekB@1XH+OxurL4lJAF^}ck6zaH1mn769e=4UZ&CL_t6est2r61)wZ zZ{|bQE1&|o080^fDi6{V!`(*C#rJm~69AL??(WgS`7!aGVyMOS-u2N}nJ!*}soms? zt&?vGjN`q&R6*88Hq^l&=2z@p(Ran(=ttD+S?7$MLjij2I1RUoxWfc9--LLa~0BpGctZu)#wCN34;aBVnG2e>;Bei`U#*e4URM ziY%0Ab}=`G`VfQLv5V`ywxli+aRCUDF@O!(S6?Yen&9bWKK-;z++o+~5YL@~9H=L5 zu?vMm9p@DY*nYuHFtqg_bbmpkHOjIT4PxsERk(HiW>1>YPW|Cw;CmqX_XD-PP3a2- zj0c~XtRi!%W_2j?PH4h<7t0291;m%sO;Y-z=j{Vk%u?ZVoD*6#1g3aVp##-`+X6q= z(cWLYNC#9!NqLyECB;{}QAK+nend(JP1wBY;7QxTW3JuP zx0GDb7^NLYPD<=WNWHK8nwl2OGGr+0?k6UUR_uJD&upqeenONeWBM4kh^G$T^bKxiq#%p0=2tLgaTrx;#ag8W=KxI8Yte8{Xe(tH z_TC{V!XBzWYbfIobVE|^&QXR3GcTHpf7GSWA^LaWzPc9L#Rpie-Lzgs%7Vm&p0(z$ z_9Tht8dG8|5k>fRK)U8?T^@(_s}S2vP6sC+OalhYZPa_duKpeFY;9$@Q@gA6KA)_` z5YZuG+5{Dg`#8$XUpy^F-Pg7}V>h=fxm4HJRxd!O6fKt7q=n(KxT^3e`gg$BrBX0~ zs-C^AK*toNV&{t%v&*3^TI<3h|M~CpAfB(Hr}2Et>j3hF<+=4$v$onsKx;=!Yh{N6 z?{j)a<(bhj**$VCrfu}6-oYmsb+MkoC%Tg*s55_GR!7p$dznfv( z)Z*!anO;&S#BLnrlPgijt+<&QOhF=&n}y=$S;#Fb+1UH>^ZkFVzQ#gEaPV2ROYv_V zg&S%cEuXXUvF;K@_xnF`q_9axtYZYoy%Q6nl^!crs6x4`INHu*2^h+Rvt6vYG*6oI zUsY0*yg$io{CsL0mgI@6SL^1p53;?nuBg6gc4+vzz=u=Yu2sn%E2QnPSMo?}YWpZN z{}P)eWB3ZO(Gr#*%-Mn)p(`$ZPLb0WZo81f zO!ZN7!$r44$z2Vv@y2@mrzxY&vh|9N6TeK)5rYENYvy>mDUYe^#~E)!B6rMfzTSwe z&C1zZ%18Amuk)He25GwLYbVFSN-yz$EQ;^8iVwuu;zBdu6&`qj^|Ms*@5fxX@ONTE|~g63RX?pwwAIQUPkG+0vol_dXuhE#yGWxcfZ)<25*0X_G{XLj5Bod}U2A3hV~%lL&@VNK`{o}rG}|6uWhywkYz(Y({Y z?q&nnZ+GUVc^j63jo0*JZFOuVKHN~8d~j>6T(XBAXhM6+ZAedBMkOTJ&V{pE%74O9AnYAf^?-(NsRF)^C{ihFnr8r;0CZDRB0LsFrO`}E6 zF90H8vzAO){&r1r?^SJb*SeRL=lO;v^quM+aW;T#9o%yhs`0kN^knPZ$*Cco5Gbc{ z>#yH)F*xsV!YRP(q=dy*_bnM$V@$&L2h8jjgr#j2cs5Uf${LJzHQ_cGf^ z(pfX;#qV2PZ)$$!CYBo3IaX_hB7L?`L$(#BBrcY@bDGh-cji4?$xg4%Eg(C?7>!_G z{5@8$VYE3R)>hR(eNxoc4|xe_W)qT^8sEAt|F#Xy_|4Y-1(DTK?8Q@ZjRld zd-!g@Z4BbUSsegOhk}uEGTVoUo8^5wzuu{nU5e;xY)XcD-{~bb2udqa&64K=%7oZz z`MNY(ADZggQ)2Y$vWfv8lvTWv>3q2}vWsMBjH9qec}zuQ_JC(wNWxEVD}vmTShBs) zG=uKbrEmT}=FTdrjRx%2g+hVi?pCaLkpjgj?heIiDWw#*Vu9dNw793ZLveSC7E5po z4uL}O;5qr$`ESp;{_nEpBAJynnasQ2y`R1IPe$NWR7bxhxd)UYxUW@VJ&8GdkK0%j zvl@}ax+*)f(#qzq{CWAF;~%5aN%;-|VZXPlPqm5@z5;Y5wZz)jPgw9&JC$Bu6KgTh z-ou4ucZl5`QJ2FqLQf8G*?||1(jTQe94li6#uuL$mPkaby6vFg;sqc;@uk*ZUFjmx zU~`d5$!K#gISfIq zV8EuA;db>EN+Mf>8*}#=mndhoDS7_@ncpY8e6Yz+kh~qcOoaV2y4Gevn7fxINepPO zljKqlt7!Y4EBZk~eb~&nK2OzM9DEsF#}1Pj{79Q16#6>}XYWGM^u>Em^ug;-I(+}+ zeUr>I`Qo8Nx_-tnmk6fi24TFe~6 zRPIw;CdZM_!B*HyxRO%-eVBnrv+`d4u%1}-1pBsUT*iD9@{7cy?#%cVCA^fMB~!;0 zkIc%=ckHRIKBULk?pRWtu8rH9pOhwBko4eUF~$u?!Mkk+TiQqfna;tJ4lIu`BVDYv zPgd@+=RGmEBE}*7;Es${a=8bG%!KxZpTeV3JRHRug#8cFIqpeEMUhX2?_H#rmTP%f z%$J?GnvT=uKI~mGwM2qZRPkI;vFah$h^UNlQU`lz;JngR1Cr{nRM_4kxgpT#Khk($ zP1IrO)qlrsEz=tU`3SeF?e2~qckF-O3>QdECc6Zmlryd22fD9voh2yVUF^hMiX?T6 zYRBsZtj#vTpvE}eDlQF-NHE3Jo=wV$HFAKqLzpjUa7qYB`*4#!W-LGXfI^D1wD~_5hgt{TKkOVO zqR!l6BAFlTz@8rWzNKhZUVY&(zm5d(lYv@WOHg3B?C|3bLng~QiE(GhZ{d{}XP6fU zQg!HS!|xphcRRBl9rapsSGh;oLTf|?8EE~a6i(#aYXw}VHVH_Ry3I$T{b8iqED=k?5;ArkLTbef&BdFoL@#xVn*#arj4 zs_FD!pdd7ggVGJ3=fBNEF*8mzded4o=N;eT8Cus*OT9u2U`R4aPs!pa2Z~ms#|`K|#E4T5!ZR&>|%_4lz(E z!EgTo#cTctD4rQ)-(87kUD>M=$t&Jt)r*B)bhSf>-O7gcWZCP4b4rZX!qJjijp^8grAH8T>cjNoUjH@|#2xt^MQShc;{iUVWv$%v_ zqmCZ=Qz=}4axbCO#xT02SFbka!{29g*B&8OG#mTqt%Nt^eYKbmL+B(}zK>}e-VCQ^ zXg!ptGT2X=y^Q1!(Hn1ZA5?pLN`s)>8-fpv=<7^3+Jrvxy+9l>nxKq9Zws1YI%K}J zF1G!iOVo<*YI!49Q)x~0F4)Q6D15VrFQUQg7|eyvZeAPm`~7T{Wc^E>hesve?C*CM zrfj}KDIFKZ5$n3*KKvEPnb+$*8DL|~nT}6lwJYzTu==Xz^|Z@hz0mASCSwkB?T|~O z%_`9@1|62m(s+X}byb0 zKeBRI;L{f>gSOcOKdLx))Cxr)jukg9tNSe4W&#UXvS5+eT|Y(z(dHKgR-W-fxP@xv zXAfT8&HZpmno%fh;Ow~>BPKhTtt9zosUijdZeMb{kyLlPrBXLfXVu{PO zCO_ortj+Enc2{5RJ@$4o55wIeZ9&MNv{w36760JEyS9mbdf~RAQS}KrX`S9*uRq%# zUB^hzVk)An?K6C73`k~i`Yoj1a(S=VTs?g6JjiLLifJu;f{5PRlf|NtAtDJ#7PcT+ z!Tc|wDBScfmLuaW&WSD=qn9fe3~8|SHvY4Cg6GtfQ^OMn_xiAI4%*;7-k*D)KH44- ze|IgDw0zW*Y(dQ9ACf=&3R?pU=4mgbTj%{rHn+5OIk)O`3 z-an~F4~4TXAVa>I47|0L><_VJ+_$F10TKpmyZyEO!zGh={`u|h0F9a`xcA(MXE;1C zM9Jo~THl!a`BV5dIZ`)7xlW5>l2lTO6oen5Ej8Lv9wi|+8l$XqCPr5SrC6!xHzA9c zTzCN$-(5Au%dXj3t=KW=*bzFj{InT&*+MzMPu@uz>cY0}K;OBP-5f3_bV;~Te64t!k@@blVx zSTZ9#abE0}04%!!n29w_JFJNrN7PB^ARN$s^SJ;`fbD|`Lfbz*aq~n<5PU?OaE~= zb=B9L1rc=@H{Fg!&|eLux3H1g7K*b!{QBzCRe5fo-#=FTuETV)Z^rd)Hs9s+&A0Ci z>cN7<)u0s73aip08L4E791KSfYt!TJ9fEQupm;VplWeV2oPtNSWZW@puTOlhAz%?9 z!OTXPAgHjqQP0{~t2%Nl&`Se3X6e%QTo@1Z76n_g1 zR$q&!&n4VFk(@RtT3t0*SvSva$9+4hccf*jUA_BL7qG9AAItvh)voxXwL%GiY;l}& z8XP*vn5)+?=8lLozcGJm>|}3C4R_&H=I0%5#SYAGAuy(Bk;zEmvt>4u(z7}kfT{Qt zb&r{Ya0AGZ((GLZ!6w?$ciGq{X<8;j^ESr>$=&p@*d~WDa8pCm0ev%t7U%3vnb_Tu zrT4FD)G$TWQrFb&JZ#w18fy%lwOpAlQhD2|a#g;@#;AdqsrCEBUjiMSIi(gimkKC_ z#z-INyRb^7+a6T`SRWe-Je@DAhxuX_sA_o3k9@=HKpv?boPmBHO1Cv9j|0-RiMqPCCfO8w{ z^^5t1+F4!sP*j{Mu7SN(p?ISyS9je0G{1;$l*sG5{c2G9F>of;pPzB z;e+@$I;WYAt~nmTI*F+P{()l_l8^W4>} z{Y|$!N(qZ2I6!>4+YXa7i8YBOe8>%b5Wb_ck_*rxYiuV*MU_w2JzWVnGO$Nz9Sw<2 zfaA1|cbPqIMC)IZr_Rb1uehY11*x<`2aBFPR9OX0(bq@T+@qckJtsWxi0Pla8iMYM zr9Db_C)HwL28Zuv&^1?epf;m_qOG!y&P%DmW_=cz@!VHGP)#BjCwb2-1q<cFEK@v!24=t1(4d;T7M~*4ae8f@ z55f6+zjL(qpm&eQY!mr@kMFT*5DW_%(0X>UW`)D?S}c0wGui-;Yd!irA(WIs>&^RK z6|9UC{01OTpAUM;u;eX69c=w~%swj`Ks)0x8E2Bo+V5{NoCc)m+Wd@i$^+v~94E#@ zKm{f%p+*m^Mi9EI>A~;I(C7P-;set}z_u+q-(T!;vQzpsa`YkM-;D5Bb9Pzi`0joC z5yl(*YoSTomrBGNUC=9Z4TQfaN!7EKPHZy_*R?Oe+-LFQfqQ-KzX2=Q03SF}Z|4$x zYeF&+J}Fkzg@oMx%aFvC(R;rgQOc^qu z74gVb!X@>jksG$Ic8Sgwt$4znv~xQyd|@N)C%o~D1=Jnv$4Y1uZ6UuDbaI=5ujq|h zFpu%ntueJ5_3h84%lW{ukQZojP6`GLdO|tXv0YL6u3_?Dq0x`P-;R1IdJC1sP5I>k z_V?XN!6VMW*w>XA;=YW9vIP=r69g9aPyA(Re!&YuKu53{5R) zWSigr$l$)(GJPACuzy4Gfex_sOq0UgQOz@0lj~OmX}c}uMxN8vF=b=(_hnkqjp|sf zFI&6stR^n_5_zWNGI@ElOtXry;6_<#xEJZd@Nkuq_4?u`corWCzaz6-M+#+_dp94ba{zd>e%cyApJGv|LAiRy~Kz&!c2#p*s? z+;*)I5R&p;Yr)pnLhg2SYSfDZAZ;SamDmV5Hdl!F<=tPu8rm47E^y981n&BA!vuXI zvfLhW{YRg!tM&p6wB*}jaKk>M!u#kijo!ab?z^#m&M04f-fXPU!SX&mU%!L0WX?JI zkX&vIS1j0E*7S9IC?8k<`CkK3BEuXCkd{Hr$*-6gS5?yrntLn7%xxU|^1o;)e#4Ho z@hkBL#+i6drvLbqJ%vd-#)+u|esgbE-m6Ti9xaCBAA9AlJZuWYA9oy?9yPZtw9IR@ z){9L!IOk%ICL1O*9d1Fc)Dk7U`scz+fv#-kL&^RP5xAOlTE(R(wy!5wz~T3Q)>5Vl z28f9H%%l>-Lc>Z6hJ~w21KzkC8Lpt)!4INQwJbjA6-8H}tJzWDnF@4HlND>HOFD(s`N3?wMTcSkbu z^^A;iad2eroHej|9`lg*ABlw}|7?fkT@wbzZPJnT^RF}*nU~|RDX}({Flh@cTl`m| z@^7LPj0q-;F;0!8XJB*dom?ME$)o;deG$K{fCxZLt|`SKsIhyfa+5`%KSbWq&46D7 z##!;v^W(^>sQh&;9X?XoQl2x+hlJ5;tgid-AE|6ffkpiOWcSu>2?8~B{kt&p{@<;x z^;|P|bD-~1j&BKr(Z!!Q_6us!yw;+tn50t0>(Z4$*{6O}Q;H^>UHvxo<9)m()vKx!^I$4fKH2oNhIqBpR2Z5Hv}j&|`Pliw zDR%r;4m$I}n4A|#HH_^g*QtegGxOgyfy*=;UXqt0w9RS99%a7ied(jC98Y^H12TRO zkSv76xYl7Zs0!Dyp}J;{I2l03{arvw;0)-%9D5Z96JBp1|6x3_#!|9Ek4A#cle*rX z=e?I$n=uxOu&6ZWkQwPgH^TdQ;w&f4_tVse55__jy;6Gr_OP+wKRd<#w{sr=|*i|^-MqhYHk-6CK%F@TaGyi zcQ2N6hL(5Eh|ib4V-cq~BZ;MY;cgJEU-Op1)5o^hT)f%SfDM#3=NW4|sT8T+dlSEr zZLhY~Fu5UaJLd4xZz6bD4)6T(EA;he8bGxUw(L3H;w z48ckgqTyq(ZDOoc4N91=)eM!VX>CvqO*v zUkVTBKprRPZQ)gI_vy?nZ~hR1aPcd%s;Yx!Tp;uHPb>o#4p$e9B3M z;k5Xg!*FFU3~2pze-{&gv`sX_e>D*OGrZF8SVM|$9J#;V;Y_&Y)n4yyL5jM^z<-#& zWAjw+a$rAJC?nu7ZuZP9^Si3a>3H@Lp2g{n)bn51h8A>H>he|dA7}Y3n2(!htzX^P z%yuw<^x;|2@x1gdh#FvBm&0fOL@4Fq5_ol*GA5y0h zGEQ}Y3qKz^nC~RxglEE_?T{9R%eWTbqH*7#P~Fw*zTh`$c79r=7c1CmrGo=5tvX^^ zPmJ1bm)FGSjI1|=%;Gor9e^quNR)J*z`8ut_4Kc{mVi{zpAv#MxdYgQXWGn5ZrH(B z$sn3`qJsTmHs~A&{?|N<%y0rzlT7cHW=Bj|IUs*r_NPTf z>;j$Z#6Z7x`UKBeF@|ZUn0-rrNhoBd`-Gea8$cdX4`x%iP6B|Q(cZ=+%SuCAd&@h1nu7sqjx9%>O?W2wr9ag-=*}0T zz-td3y!#3J>a^l>)ZrLO|gRSXui_W$AF6l8Y#?vkMM7%BX zID{)5ygSZp%h};tqPh>_%r^9+A94c8rHekVY6+eY!75t@yQWCI(^a6(>Z{7UZis2` z*bd_&U(hsvspcW&_^WwB9#P&ujuz@?(@ zRwsMBZm)Uo$?Z>2%iiy?!)AJf9DawS;|K}GMF|yt(PT@b3dsQDvlVJ<7l&&Mv0UE= zXY4VG(wO^s1ciML*39>Yo9YIh^M0D_iLED!i7yjHNXDW!vk+cI({z+)m}EhJP6bS= zl~H6bP~{I)zWq+CaKv!9JwSF%95o;CcUwZmn32t5jbQ$%2>K&o-CmbVP zlp*zxZhhO*eb4Pzm0OW2tzUo8A3;lhv`!IEK89U9+XQ5tpZP{L@2}cPeZad9E0 zkdzo}!#GHsu^#?JbE^nzx^Das0WfKbHyx#0-m4`LGoq3x7V_I15C^{SOw4nZ$M=)J zjVH@BOcOp4DLQ-ibI2}QNkF^ZLQS|Q5D(HC0!ATNNMVZN(4rfD-5g5QG{2X~w8UKr zGHI-WN0z7Ichp&S+I8%|Ccx`?zuA8|()MEc;BUnB0wXWwqe>}nUb#oZ$L8P5LW4?o zKbWvvS($MSvH20+nNBe_ZSZ=Yd7OG#N|5>7wQtf>Lu?=m7J0Co&$l%orOtsAK35>$+gD9u!V!0s`wb8HBGEq_pQi5QMDqPJ5ZIUIOXs_X3ws%DrLVT4^CR5$JAs>SzpKA4)gT#Fky!W zd}=T68dXYFPe>zo4ez&KPjXw8)i7EwpSX7qd4<-Ufk>P`@L%%{<}Hk_LutHMnk%%~ zD?cVv&6*XGJ>fI2qvh=loLg@hCBmnkiy+vOeI3HEcI6v#Fp z#;yJmFhLzlbq>S!kP_cpno^)HLrC+Als)a_%B9x9u?ni&(a_{;>-9{nA|de~$nq-NVb<-8*G>%3)yh34U&M3U-CQ~#XEw-wSJLSG0@2-VYfpF6 z!sweuo~|(_U6JPx7<{E)6{zVt-FF&2b84dc*j}&SZW_rgQ8@f5)`kv94n(9&^cspN zdA)1vi8&k=nCsgi6PE?p8XMN~rcSoZEQ9r6h}3bLN9(lR`vA2k*836&ujiMW9RUc! zsZg*8=?+1VodZmZku3j2t8LguaVY}W|7aJ)?2g%5wcPk`P|ddaYx;89N{{nigbugo zz8S6hhv|?hQ+U)-&scSIZ)X_b!qw32;LA|Ip*Ww0!Dy5BZpU@f-@}nZy7HlXuPok8 zJ~_OnHjuG-BR5yT!k#j>Q4-W}ntRB#K=8PD4l$NVNa0LaXeTdoCrEo*{~cJnyL0t0 zlKGj}4s%zeMpSI)$(*LmBLyOca2>gIrFi^8zc0Hx<}~kj>{$C`J{CZItj*QN{VV;) zJU5mF^!y9NZ2sKHNao21;()oM^{q#*Si;43ToY?r$#NZ5>Dgf>7r@#Slex@6__&iR zZ4>bPtqY&A%ZocglN<4?pbHQuK>!&LBvWx(s&tmTr;e41M3Fgo9tj?Anjwe}r(-m5 zpVO{|$XX}B8s_$Ze+qQ*X|dbC%Gh^;u@6Y6Yvlh~rPe8+PH(&0KNb1`$=n8l96ih7 zbGFNQl+|nhEe$$SVVpLRkFNd8H9R?@kq|LFZ}vrD;Nk=6xARf?9VtleymC`jLvP+N zRbZY3ueY6w`c~HJ?TN5tiEYlYiu`0fN6o~9+xU~V>2;e0M@Iut(PS^Ui+=F*cIK2< z93Urb4tgG&W2nW_;Q+V!C@eXHH&O8VNrv`Hj6Y?7DOAY9{&UZ>e|ImYyyS`+sB&yi zKF0O1{s1-;SiL+E`AA*#4cd7f?^L6G$FK1-@RxYTAR)|h=T~-tGYur+GF=%qIFwJ> zaeH%ks~e8UP?Zr0$k^$|0ME6l_Z3b?-|=tPL=8QLun~?qI|$cQc2;B5x)WE5qTrGI zq37e|MUu(E0Ar4kCiZZ1bp93(iH)}Tk1+}MA8;o{wqnF5(v?wPdJrKea(fIJ=5Uhi z<*f4%FdBleof7Eun5emV?R#THnT-(|oP%unRH540A?3|qBW$nT72qCpLhq9X_*+BI0fU(v3667UKce!^O}b9}@RW%A_- z;Pc^}hn>8>h0Va+6}8ti`t?)cjlb?TJYnm|cX`o$&z68bcB0}rue_dEN!?sN>G0~Q zq8aTXMI1s8oKYb41L^+WcSG`y0&C6_-o;HO`1t*PWRWH0aX27Q?tbLH6m8eCx+0 zIcA0N>W~_4577-}J>yZRGGm?I*8bPn^FodEp$hNcJ^mX#$&YivNWN14LnunL(9vRMHU@r5QH5wTz2Q3f2rFb0b%vcux(?@#R~zw9wa1^0QIn zDQ`DLhSh#RZY^lRK0-yqFND=1gc|$sNHu?~*uRl$#+T$P@tgPkn6%=EXBP@`r276k z6^o%IF6h^>0#N%L@e1g2ZqwC&CP+KED}pl|3GOwP*^2QB9^QOp=7H;DGurmmooZm? zmz?={b8Ws!fW6{&}02smjl ze#0}X9hl2#+@xd%@lX$>KBpEFUJz&3CJND>%5#54Q#dK>; zat#(Tj(n?UCK+fEev^IxZvD=E@4!T-jfnK2->9plx^Panu?#v`OdamUp&?WP z&$U^Wx^XVUuqtU#nc4JWjySPJPk^;^9>AYT4M|!)OVHn0j9>6toU*5`*m|`%lz=W6 zSN^(ozS12~m;;JFf50(O!o7@|a{E#GalBF%wbk+zuah;iluRX^+mJSK^r_ITc)!(% zrLB$!89)fe1->}bqh9old)4zoKwjMM*gE>$ETI&eMwD$@tZ4t^u7;1m{_z1dIDdU6H=!soXzt1R$bXeP z%kdq&{Ya3)IPU#6?1IM;w4f`EPrTX6-@EOVgS+)yck#vo?IYuA447m4G;55Lhz9pW z*(ZRR$8N;z1XpLf3g0VLVn3^RV2*BV96R_UAGr`~@t(8*%lmI95Vj#4JdcWTuhtwS zYxOqmPF2|qdL6s|VWa(nPK9@4x7jzs3T8U*Q-G4^D#&O%Mz3p7_+rsTPnk$NVS+X4 z%+|hIBOdNYG?j<0T_fY3vyOge`m5&$_qMSeUHaLgjXTrI^QuUp=g821$^$qRYqwQj zy|X+!JWPKL_rHlcY53$X7UDUK)D2wskP5yWIz~Hmp@tDc2Ap&l`;WO@?@2A_k~e0C z@{4f)ssBa}HQO=$p~cv2hY)Q6(ff4dl85&ewfS2%KzN&`V9r6p`-ZxdZsI}Oo~e?{ zO%@{-PEC&k+7jfas2WXyE`b+*h2&jsWC<{P8d7{=_SZDYuefEIa+yzoqV1VfFx}Vmq!)&C$$sttsI<_U*qqzKLX|dEFr8v+qQ?OA61C zQw`HQk`_8ud6+RZ$u~T&BuPO9&bVb(OT$8s7dXZctM{!MK+b?+B;~uy=<~|qv7{k< zt!=glHw62HBQD+SPtYGbeVJ}F?r zxC*=5Xjo+L#$LOoQyI#2hcbiQLDp0^#BsHF&xekR1vYuogjFWU5|1LW?;M%-$K ztahZCtMg%+-H~E+=t#RI?Tdc-f9Xdd?lPq>3+|~K34KNG-MahyXT*$u+7+b{TNUVT z&8Uy`3tlXLN{COY`gt86Xg`G|`PUunw`Xt-@tvHivvU4U@zuPSHsic=_}S^QKTu(7 zKVW^}H)WO|qsOz+hm!30I?LsQ(*+TM9wKV{F?CCF%=uyi+Q22~%^elisr>ztRn%)-sTv zYS1hK5bj36jr-ltI)?MJryhQKY0AU`$o;NrO@6cBz3L8nk9)P z>4jdl^~^B5q3D+=!?VHEI7MAZT9m!e59w7gqv(^rdri>C=5WyAM>`BpHbF>T0za+iB?Xp3t3%EEM06rq7Th|;+io2wt zPa*a%T6KEe(PA*88W=MtZE_&dv{ck6b?2X$x0}v`4C|AO22uic-irT`EdzSH5#V?` zA1N8beCAJc>Q5vMQti9OTTyJQT}$Ym2tHWnP2-eaV1^?!NH>!RfHvZu*o^a88ZF{+2*C$#5WRfkqkarw|55+;-NW*?>We= zbc9q7c>S;ENK+hNmzNt~+x|}pZfs!6fL)S=#LW{GPzJQx)`tLY!9CD{u$nz|cN8Fn z9~)^$V8wbR!*9SE!OMz3k2+E3C2rsL6U;a-i1rM*?fH4xidEpy41k8LOcd|%h5ptc zJFrYxA2`%*-|wXKC6ZvQ4a`KeP$c^^w~hDJKDc1`-}Wpf&bO#!@~3v~CR$}8HtrV% zw(ea~ZU8CU)pxKbRJU!D!Ps*mTEeg5L#4A$p3^|iHtvzGu+_IaHSEUJ%v$ZFG``v| zx2;}Gy7_N)hYEhl5q5r81?gI@>RA-OsGvJo1nZ}|=Vo4|1#4BDr-sBg0PMx%y$VrK zp5Z@8tr!FMlgX>JLmRZC6#K_0_|4LMf`+&6j+C4w5{9+;h&UUxdv->RJ<}mMjKeVE zg029c#AAOT4a;G9?MN4f*wQ9*yTPaG-ge{KBw)FX(5KTnvi^}Ub)3K|G0yH#hXgMfQuv2=dy?lWYusD=MjDI`-h>cYIDCFQeI%P7{Zo|uDckZuuHH(mz9!5k z*F?_G#C8P8qYgx2ebZLQM=k6|kZ(iS$DTM+kvYn=BWo&W^V}w%O_tuD81=8wP4itE z_?5FPwU7@G5XBvnwdAel68)?D_sUcv3hrDGx*JFs;1K5H+vh&9TO56kula^-T>T^3 znIo&^{iqY0B`>QLEq)7eORj58*w;*PS^FG*@CP0%%qpvT06lBgpYQe46`w8GKJSWt zs%1ApaGDS%`}3alL>yQe53W^yKGwN)lNwzv`)q-`nf)CT8(IQEx`frwH}@2s&7r6$ zUOwbv!|ZJ|)uL5y!}Ec2G~SNK#?{e(PRz@jb{9?lGQ_*e`*D9tUHl!9o00HMbHe`L z`tJzy;sFbnQks+Zh6>uMcNeYdS4C-Nxh8Qi%$9(BR4-paurt76morgU66YVa4 zW0TsqFJlRe?an&?^3j|y9UGm!^6375OB5OotZjlOhd=Z`3FsMTHa77(tv=c7pCw+- z8kQWcaL zY7Vcd*n)T)>JskkA|^IIMI0xC{_lzj_A-8$JWB(nr4Lt9yp^afp{bca@N*qxjZ}vo zj!odJKFpERbj^AVl0liZPmG&}g1a7C$K=Mi#q7uXh(UfITPsLupR_Ri1BOo_y_RqR zK$1l6u4QIiYAvMC1O%G9NiMvZf}IMDCCZF@?r8kp$0|CYoKh=~Y$&{$3?x3ALbL0z zZmi(BNn4ZAQqAlxw{~fHEA7)*xUU3*J-r(O(iBy|%WKiKufH!D@Gz(=Or&GaAp!ah&B#~{3T*L`&XPMZHPjV@?|k-q`jaa*Z#VwdE}ni75zE%y z79KDR*bkCIz5zH3OBz}21^@R_y6D@GqiCc)b**wYZUNvz@Du#)s?cZyQO-m)V&Y0M zv8L1f+2r}Bf8Q-0C?&wbo9ew5mT4g!ojjoiw;v_Sv)Vh&vB^34E!W&lTVyLY?!qeI z6Kdzi4_|D9BN{MGn|4U6Fx>|7oO9B(TIVsI(Eg>@qMDZ$(5o3PR5cTlnXQs;d_gLk zW{O}MYjRi*?I@d7|E>ky-bATRIe)o$h3Bj>tSn)gxYSlwS-7wQ+p%^cJ-HU(j$*Aq z4&Wd`#=HFtLQGS9ejOwN<)~%#LH&0P1@Nl}!T_6s-T+~%yc9op@ul-^suvh0mQR~z zPZXv-WUOq|FgND)Id!@H)dUyVM34M^iSmn=jrFllXhdDCS`!ANI$#}nFuvk}DvEg$ zInGdv!c-|IJNOgyJXSdkc%in9TkeU@f*k4jRz=GvsZn6~%yK7X- zO5a`z`JShy*G+0>K6!8_215O$@Lz3bs?8s9h;>1pBe9lbglxMfs)D-d0LsQ8wao-d z5{#IpGh6;Xhkpb2`OtDFfO${pNpjrGxu3EocM=N!$pj~j+Zohx_g|EL_Z$(q?~SQJ`Oe9Blb4AD4BK6!*@aWk%GB8d?HX3;e%A%8Lg4HikoqCo$lc z?_mHG@R=Y#s!Bnv%&!{d^ z#YG^@dl`}vitCXQdO$`%OmBA2ng3$TsVtCDce(KhYX(7F%xgn?>hobmmSGF$oIasQ zR6K%o_T>hGQu!s7TMc&a=q|J3+o^@^fa6eF@5siftM>lN>cMz*5O#@>_Hd6rl7af8!toVUe0s$ zvZG~_ZjfMlVXR>MI}Lk*=8toY^VMCpAtVjsE2%3J8f(p7sB7XzB1$25Z3=N9*$_ut z;P{V{LRFOW3M3du&kr9A=XZxTq?y-0H#e;?Q9gO$zL4AzZB9oS)uw*vEhd5qy`s~H z%tY$sdQSIbuJYB?MIqjK z>2OpXVOL?e*ww4GP87|yS?#HD`_`qt#yfby=Nv5>wBP#OjtGuk(zBwSr_2_Zcm9vr zyB0*pwleJRkyaSIswDGH%|+nt9*;6<+XRtS-bq_SetAvZ=AmDIU!X~~X2RUj%o>xp za*Ej(sv#R&4Q`jdt+SWrrC;u=zd22}4LN)mcntf77(Q%LG^3H*P-&4B_ND(VE1Z0Z zNdy|W`&-_w%&c$KC6joenAX8|+B5hh;%*iSZ=s7jJf$dZp!9++v7<6QEraB>BM954 zbpqIO`1g@o2A|UaRHi592KuQTYeY)rgxUQJKdDH3A$Nxn@5xIm@ADs|ByzibG3IL- zf*L&kXAyIxBFwc(CaHo?;^ZLab@RX;RK&^lH+S|kE|MYkUia6@MrVZOMmsC+ltJoq z8}YrM=Hf*DiVE^=4c?Kt9ZT{N(~0`6N@05?vPfnq!%-H~y0>A>m4%@o!yNC_$Dg_J zK6Mo8LxrB6E7j*^rq2@IYgTfyt22w7uE`}b89Tke-AH$6W25E@GHzLP@xMy58bj2* zDKMS`pVKq{O0)j@9uPRHX4XZ;?Yd;e-K*T}hQ3p=W>3^&v?cFS{|qXoCsXQ=Ui)%v zPP#-wG01Yl#w?(7JvCX#<9O51r8Ajy$#5_d3jV7Sw z{t-zukyS;Ek~w|LYIB|-V=qna4Eymq^NEzoUmC`yqMVT;wMl~2>Nq}cJ?lamuk2ET z8r{cI!A%%P7$|Ci5?Xg^m9{%l)nzObbog%^N4NvP#+wf&G2$N5oq}Bq>%q5At35&Ov8x%WSIo{d-14>XDMvLuC((9G=7+Ywo>=TL37|@+8 zJJex0w4dz-qlCMwPFi2}lXUX8|HG-j*BtCERi`n-A+iaIe- zKxq8rwJo>Wr2l`>&Ucp9O!K(dBZlR=@u^&Odae2qjco|jUNeG?LQ)wXI<({uN-bKI$eMfAI?4pO;Kj_a+y}1*y`tyhW+UphH;W=4U_k0&a zzj6D_n!>p=(~=0Sk25bgvwX{i#arS}ZQ%`SZsCcVXU+k-nl)!1P#l?T>M45jx5X)> zTb-<{dKzQ5e;~|`l8(RiDb4gQyw;~NjkYoqczSCcSbWbER_kfZol{9R$^3ls?aTdd zNr>Oz&~i=wEwVs@nf3suvlWZMZSkmXaKQ66(f2p#4@`I8NpGQOo9gRjJ>E%@gq&G$ zcFN&d8}e!dmnod2QB3NF@je70|K>~TF7facW7t=dwByt2ohSO49?Sw;ovpyARYKAe zC!#dbIDf1*Mz+-zX48m3v>EX;!Z4(OJG{gbn6m}7?R~^(LvXG7Gg$&pxa;Ywwva4s zAiXmg`;9AmcSfC71Qx8E27T14T8yuz-=))mQFyV=XS+oG6u=R`fvGL&@eGmc<_q<;`VVUH| znB>Ro0?998S(`kO&mg^i4#AnkPaY_LAZh#L4<9(r_r&Oq_@n$wr6Fy2NaYz5 zJJoG~JPlI6=nTK$%u3M?zxZszCS#~6Md<+;uExJ-?51O)(=lxCf;eBjS_R~7cSv`5R!X|tkp zE%QyHE$jz6COJN}G1rUL_?jI@X0*#K^CuG1^OhZ`I8BYwg#=6R$6Act*QDeEyJajy zcNG@NL)vdl@>7>~#J!nd*XsGLnd$V4MrI3*h0Pa#%8twU!PXx4&IUH>9uEF%%|my~ zd-KaBdnKd)wDn5r9r7I(2^$4d=wCjP91*@dyCgYED6+a}nR{loC;n}juo#SgQ+Hoh z^OyLnrr{JB4C^RNe9*bgYXa^Ew{ zsFZ2^RGY5d?QI^4I5zt(GAnwLh&9zHTZ4h`&T&A_d%6*Z!5PC)PBIJ13-u^DAU8J3 z(kpWeIZ)QD!_BpbKXitAaoG>YRA z_98t~cL_BS9Hs=ex7*38yEg`|d+y0De1zVR=+SrmxitYaJt9APLi!4Ttojamj;ef38==HCnT}m-|EU>>q0XD1WofTKLJT3}5Tu;jhC5iIm+g!%my*=h_ z2W5zXoZC!eaW$v`GDN@j+4xLfT&!ofG)9kf@nZ8*tn<108?$P+I%{%(9&jVx95LK_A4EX?QkUv%?f~vFW z^`8rN*J{s7TX)ysEVZg9tB;V zLIu(46(hNm8O>7ZT9%X|b15&G?kL3br z8W(l0=NAQ@z>0$>jay)zf=ghCB}MBMNu@t7>1F*$b^4>pWm2hh%56l3G)2c1ab@V3 zq`U^>m}Ka@@=@J%q`J&_uO-6C$%-vaH}y8^uSZc#?^20n;Tg(Pg2)2f(3;7Kec`TV ztx#^xg84UaTLHjcZeyMnNxT+yp0YnY4=#VvrHk)q35bY0(pFZxLfVvWYc;>|8;S2= z%J#n^mLRO87P=^?3 zhn;IYs}j!V=3%X?j!f+vRhSqsqxU zuHCXJ_Q(^&z3Gn6oY9kaNQ3lKe~a{qJ0yCd$y@o1|4p2g`Q10yVZX57zn2b(IsYF3vp`J0z<4d`(qYU`NpC-R)t_n? zUGe?LHo03Je2TwcYW=iD@%7^cy8cFXrg}FtHMBR_o+6Q4+QD9mG5kO@e6>kxP1jZ0 zuZ)KOQqlWfQf?hgkoQnD{AL|~RWy974!=4Yeq$Q>@K??X&^6I;=b4PT3+oyi>vz;P z)gPQNvG!m?`|jGh)?Eko)i<@bonE``KznWb?)ujH+J?5;rsmqPIMnW|Z{OX#!*nvk zrS`)KYQGlj#RS8zgY1Rb^{S4KTCWFZ#d}fXcSP~^DU-2W1hSkeap<7zmxZb<-*q^q z@dk%Z#CQFI{foB7?Z#-lmy)XSO;P-p6UqbU(YKhc&x`Jo-#frwej!C?{Z0oR48IxN z_26CLECaC(vpnm;yCGdYcn@?*J(y(Cz3uy3_>XuhE^Q~T$u2v2`M8-q~I%p=I zDB8t-fbc|jxt#qy&Mnul}X*X#g3VGRiSkx{8p*(9N#M~(LIjb!BAd?4uNbLIwZ$*=?sk@ zvwsWZ=qsG^!8xW}(j7$c*-r+|ceDS*z~4Yk-A?{~Qp%h=se(Bd9PcmCk}h%^N|JB` zMQ`Jl>>ZJ5@1L-L7`dmCJ3I*A!Qr(cwKWiZZ&#Xv<>}GLz&}-X3^g5K`=!mjjg%Xk z$lb?sjv#kb@V$}0k0y7lU#_(u75F)px>uR*7;?vvJD%K$e)5&lJ26N3klqAx*{t#; za@BF*By-RQ$n*4+(FNHjMzpG<(o|I8E(2-&O?gsJ|*X&lyWA~yNdG-j{$q+ zbBo09!gs%4tps109%<$p-6?)@?LR8;kA*(+5>3_p2GbY>hQ zJ>|(4=}iyfm29byJ;%2RcG73DV$uY|R zF6P@@3BE}0Vscjm@vmh*>Rw0EB=@kKlrlXC^ZRhhNv@L~`d10P^?+!& zUj|{B(}Ua|N|)-FcYc;8sjDF0{9H-ynhg3`8`aPLW2m3fq;*Zs`dLlxx(xccBC4O( zW2m3fx~GD4H~7hMtHeJR>Ccld(%VSxCOtI%rhi{0_#(Z{e*8;YJe!YEy7T0V^tJ@?s+fLV;O}7n*1&%Q`?vYY+adAu)>GCK z2HPQQOIb#itt$*k`_$_^^@a4*J*}j1-2k=O5V?m{pzsvqIww7puii~h%hy-YdsWHT zH$gt*y)Os7UvR$cBzITvJ*^SueG)&<{B7{#Un*Y>IrC>D(2eBo4d{G>`R((QuS4P= zi*_|nzDTc`Ts8{bl2Q*XU8{%2O7KN`WIQ>^#Au_chmm_^j(AI4@e0DyY#YQE%%k_j z3UnU}vB{M4YWA~9;dXMbB$o`j-pF`t==Bh}2g$w0z&(dMOi21#a<4P6&{nkZ9@8Lr z+v<4X&%o+$#9Q<{e6Cg{=z z?!`**EeNaQ?;!VPa^FQR-kD0Ob8lN6f7|MK{#M7|L+-mn*}84A$W|?Yw|lsB)wpG| zLSKS@0tQ&1pMv8Jz;X>1V8Sy2Ti!NVv(+$EfyqMmhy)ldU`ztA1#EqAd?JC#GPcPw zwFVRJ6auD)XMosBGWw@0m??l;u~`CU5SXk{`@jMMj*IdvBuGo^0x(;8PJ(3wI!)5@ zavFLU30R&2E+Jr^QWpzT%D|SPkzG%J^@>KzCr+hTccn@ z0&Ee$Jhuv{O8~Z3xmCeV0-Uz*CTI|_Cjs^mG$?3xzveowehfvK)NDB!aW&=!dw@dT4KW0vEe2&4sK{`R1Pr38-? zd|ANb0=`1<@Erj^^nf1=c+~+v74S0yaM;fYerbT83*bKBR|LNn@EZ$A9OU&|g5P<- zZw35b!2cllHvxZC@F#-TEbu1*|DFPVuYk+&e+YPk;6FX!4FUfp;AjA165n-clydxs zf<+;unZF?}9(VfH(a`_v;(xZLU0OB3gz8lfR)Cs?M`r!S-*411X{SH0RgpJCxjSEG z=pChl_n`V8jpF@_DScHCy&Hz}xGnVk|FicdU~(Kq!f5vBK1R|=quY{Nw`5u4OP6I! zwhrs?q1%$IyEW62MjG{u=dk1hBMcZ8Se7-cjW3KbHjBAzjLm{M3boGBWb4%nUpnE4{VFT_Esh zIz8~!2-_7PgGD^)P0s)OGyRDzlxaMvpEw=p1)l%KMOUMGQCIXc=}PsUu0E#I4Xr86 zS8kr>K?me97FN`Dq3*_F{2&$&t82Sea4;O`!wMW8t`2!Q?t^79Lsd?QhCIkOU^-gC zBOKx8>TLJa_;wjDF2jhpT@ZFDFY(Yi;o|AVqBke;pY0VcCm8V57Ifs{;$I?6Og7a@4Lw!peIJUFa{?3O?hI4;^b+$N0e7?s&w7FFV^sT59hnV%i-V z{fs~zz}oF(ObhGGJxDW;xIhoS7R|;G@L&zP9cj!!9yj6hOw14Ug`X2V=OE9yNDJ18 z?{?q`XT0BoG%i5e@5Sf&F+49so);l4IM4gE15cPgeuB~9Jf0FdUx;xFm<*(INWTcv zFJa}d6w`xEyn^(uz;aoR;gv{t8A}iJzoWtzW352^RfxY5@mDh(vj4Rhu0z~4Di|~T zM&#>S#JvumugB*N_`DHmT!V7`rwZE|tog#06|jAnbL~O=qxg=-Fgd-Lo#SI=m)`R~fQ+U)bsjTHQ+F&%w5iSOh-Pu8J{A`yVt{=BjklGqOko9 z)@!}CDt8ga1JCXLyRw`Iytu_e&I3ZuolHI*@3jWrK)>0G-^h5k`R^*cw_A9V=kOxt z9oDs=trgdRC%QOIiLtz9OlZA)cgm_lX?A!1cza9hps z#~BYN<#5V)_n8=Gnmh>Xll;W+@&z3~%WzZrVhyRXzklD61!DkSpkpIaXzp&k*|z^h zhL+K*wd5~8aN`y#m3u5RiZ9(hh0MdyI zB_mUY`cQnXpN+09f5OGLRk`C1lnTd-{F=_Nk_t+ zv{m-;2W~F3^)TT(I@@nOUW?}M{Oht{8vS(J3PE_Aj$}c2mrhg&to=$-3c^8kY$*s= z(k8btskA?w?l6m2zuBv}P5;7QbwvNdKXtN75a}FT)Nk`}om8DbZ?bYPPWK!DSW2=b2(6Id1@HnI#Q^j38;x(Cm)RPoKI6` z`%<{{!11Ri)U5E-eXk9l>`%(8lUsQ7mU0Y|a?A?h=LXAo;bHrIarqJ+vBjnIxgnH~ zm`myF^z}J6RPZ07(@UMw>&ZobbCtcN6P~c;So@St-AZ zjeeR7Jzd3otCzN|vsh@kB@fGZ#Zq^^wIoQj+DHw_ALbXNyXaS3sTa}j{BZmd885E7 zllMcPaH%((p3ReWT0WfqMPWL3y4GWxhiixz949uZ(!MeZy#5R#`7@L z-DnKq6b%KJ$p)qAXHcY8d4}BTbEwPBRA2uCN&k8OxpG_eG{4C2rRN#SrKJhz%}~90 zvMaEoEcpVx=|26zM1K~OCyn!p+5U5Rke@`Kvumi&xr|mHH*EuvGa>qB!maRYtN#1JNaNsh;#ugPx>+n7PM;0yHTVmMD}j;Dtvph>hd zFGDFK!`Ju;u7jwpy&hS}3qmOv`T-@iv)cQP$z)SqS9Alg26FB zV*|n;#=vw2c$fe>y9?tGzITq^L$fj(f#Sv}{aIfQV+4#xn80A70VW6_{m{AK$p}*z zOtpaSoG?AlM3{|0^oS>&8`hl@w(*?DfX)Te^L&IR1foYg>1^>u2p2Q3@w|iq(YO?W z-Y+l!=K=ZGolT~*yGhO=UxjeFfRzSFa=v&ygKJX4dI5AMcN2qI2=olsi*98g&*9Sf z+?@=F20atbRsqux;GFL+2DQCbiAHTuFA9>m!XaBCw=FZ|FRhd}~L(B?B-;TES?uwMT;gW(9`29|_wsgam zwX#c%tGboaAoV{|Y(0FWI|ge=p{t|V+`XmH-P*1qK03l&i=CZipSCC_D2e_zu>T{2 z|LRw#gKU>O7HAwnv9QsSZ+4~wAar2{KOh3}(7-^02^Dz|zFUs(APx7LIv3LpQ^96s z+5`%ClaTH#EKE*&jD|LCriDghJjMgw1QtITi!87FK?5|>JCWB)72b>q`Gk(?MvMnM zSQ5LQ;SnupuxBFfc`8^8*~R!$8t7nVqil0f7bS~)v;p}z;>=;V(4ovjTGJRUxw&*1 z>fstpGYxgebu&lcU5f7{-eiHd7~e^}%a|UozdpUV*y13iI<3 zk)M@}?$t;aI-h4*JeO}B<1+zieqPYLmeJgRG-31VD=ePV+>GxyO}^O~-fhLS+f}d- zv<+#)hTvbacut!xl;E`gQOLU+^8_1i_c7faK;7+E;ra#*`>%sWvpl%0XN@Q5dQT7% zG+yFEvc|JQ6-v^pk#*};=!%y{&$1dXPfhh&qD#`USG-iTCpslcB1Nlo=2QavbaV4DvqskR_h2!|n6FKpcILo%uo``_4bjfO9k;hIvFixkrh*Nk7| z;b+_RAPxaUc172P$ zR97L@Rfs*v4;vTyPy@SIgVv{1#YcAIl1%MFoVYOU(vSyBPuj{q?!D$D$Bwl20~#6@ zgan|acePDXk8fN$c>9Uc3Rdh^Fk{_Hg%>Ca%53Y(q`IV*8$MxMD3rmMtn zDAziX#95h0>n_g9ES2#?W8%YSV$}Yye7Q|h1=4+{PG)gFCeq`Gvn`^> z$!)L|8>bUK1EcQJ(Q%PoM_ZhesT6%~S(wR2nYodsgy$=pX7#z|gvFs5)9(FDN-%s} zCb!L|S_mr4?=k58vK92uXl|^~8 z-3A?gFI8-&g;$}GSc#^^Xha<1h-gF{+K?I<8OPstI3s~Yj5Jt8EdNmcD$i5xVzr(}5fggz9UxxE9(ZoKw+V zVVO@YflK9HaWNH(bBFUQe5U;Xp+TaBj&^WqqC;VQt){_jf4e_RM5itQEuEph6p_7eVmg?})=67rn`v!b(&5_Aba}n9 z|38N6j?dh~a4o9~9q`@#1K7lY;@uLF%h?Gtw@S_By zRj|LG=O)un0hL1v?v_-UlwfNY9?P5Q=;sC|Iy}djex|4#gh-I%jY86mDRXS4!*iVJ zCzQ$&kOVp2BqZIGGRIarIh-f(oM-x(Cv@s$f(p*7&?%H0&S2=2ibHR+nd8?^^0TS8 z$>HpU=Qh(1XO(j_bQ*}C4iYo9ILqB3Ebe+?apm{~792-!q|{8NAO9*RbLd13oiL)^ z{|PiRQsg8wBTJwWE1ew9%;d?N%s*fPrv~CQO9f|d5@@7Bwi+DUjewPrk*nSQ3OQ2vd`CEbqPSA}m%rFgnUmG1x_$Y2PT zBc;>r{x*4Tq8;9R2RFUrUbDtC;5)V_Bjge212gyLG!238!ltHotz;{v8yEOu6qZ`bv$n(-h1{BYCRuj;>jRLk= zUszXpiRyk`4D@#dx-FT~jnKfT6achL9^43~ya8dp zBV6nV3msu;jbK#`AchH=c#~v^9;5X=Apx6?iV6dDMBPu2*)uA)A4okVcy{N_DrNi2sv&Bz}0i zWNxAjUn%>gu{lgnU!5Gv`yP(pi*|OZ7JPYr6r)RbCnOw=Bt3t158+aI;QLPRefg}F zXGhwzR&c0k6ox1K{}49r@*(|MtIg8-`(w#W!;+c9N(Fwyv9#!Bc$%xN$F#WhuZ#mV zVHx5U5oa*s!%Py!%|ldh$cW}{%P|erD6#b^^2J+);v-iNhxS;QYgRHJ)XI5dYHo*# zf0_-knhmX)$|dzhq3-*1wpPi%Ph(&FE8Ygsnq&?o)O^R5n$UjRqa3AQD-CPNM2EgM zS4+o~kGlAK2$Ft}57D8Lo_5NAM{O?u(Va3nzc&Q5Ix`4CcOL-vcf-%-4+=x7F$Kx* zIHss2xQ>>!eL$=7Ya4{Tw(a)eTpw^Y_W{Ozjc2$IFzmy0?*p>6N{2pR(;4am#24Ds zeLyNYrhJ_11KwDD037ZZg(0tPdwe+82b|4)fN?MX8SVoNXAj)_fNZVOp%2(_hWY@p z6DxHekcy5eALsgjH&!2TO!>79LSEbU`f#ofIGg(bQrxLS>%> zmuwW>IkIJc<^FS1A#7Q+3Y-qD4e*F;P~D5Ao0l%V#OrlVYhnkKV=rEa7NPtet1KV1 zE0gqcCxH;VA-FSXd!e%n^KuzRjcF>hwXJGz>p5Q9P&i)fT3zTabQMXB^-Tx8r&X=p zp!E{I9NyIIr8!t=KDMDyc94QvX=*N$S>Lsx{djAs&=z^Wv9pD}A69w4)uTsLhBh^K z7P^jXYAbq-@!hy4|0}n zdB5$Jj-V(#x`&G^y&^u`>FKVeQaDgawii3Q0_6{GYHL5dwd{0>YEo0Fz4Lf^A6(0Z z_K@ieZ7TH~7h(@-YVYap=;_|tS~^zINJo2H+x1>M=Sk7E2Au$5DM@MVLbimcZYTpvpd4G$YA)_5ziT8|tTl>|e7ESb;*0%0q zCr7HtS&r^$Ytuwdszmzfi!B8Ucq*6^%}R$8!Fw-zN?VH^1+P&o zZmBddUByz%w)WMOZURnt;P7*^hQycte-hmRxwSr?su+M0@A4V&{c^(9+s@ zAv87fTYRgTe|@2O#g^+AEeO56@aodx)>5(jZlzbVF5GhAq0Uy%+S+dM`iQRX&Yotk zb0&-HYT8m=cM6v*P;XA}Dr18>Ho!ULRX?x!D^LqJ0NhLw zeFZNLW@p0K**L6b#=a|iWA~JOyuEZ5nRQH?av4+eZN#VDVAR@_g3YfijLtI;n~PC*-_|jJ_5!NpT8I0;mvy{q~JHK_0ZLAUB#x> zQg`uiu``xa-y;oP;{TaYlM{8CY$+Zpc*BZVmg@8=FX)pZbE7&vMHZTi8&)(mAMu7C z&D{<;9Qc!MUhtHiU5L#H)S)|%zRe{sczZ%EPC4Awb8x*^P{74gu-q`}<;`r@QE)ISqQ7N1^W5Ni3XY=kT`9 zB3`epTeVkTQ+}@w;W7O0g$>Jmz!lNlm2NAduSZwy;s1~De;J3LgMt-!+j*8LzT}nr z_23y#vzMiZXOLo+@_#v`r#aISNbHqwN82qbw63@r_4&$afjum|aNuM8l(4ua2CeftLIrhtjt5JKT-ZQE+18X8}45ks2YZNkk4vpRly$Y zujQ`oY(J<%t3KKR*f>;#XL=#uZeH6^`8+yC1)n<`F@#|g48UMZ#30P)LKa^_-Y~h{ zgYif49r@N8s)7T}utG`x-zH)HVK4{VDwZM5cGTU4jAk3YTaGxO3Ann2{9_Hp|J19K ze9JJOIg$CaJUvDk%MQtpZJ9;tus2 z9d-0?D;zAgb&1rrjYle&FyV9V?KCBNorRoUU6|gR1-*x)^kSpThiv?KIBP9qI;D0Y{IM0U~w3Uyj;8PM_#nCV+)3&mnSqD4|?>v8RYC8uV?p$5G zxwX02WkBfDQ95j}Na5i}w$HCf8HFdG3X6f=#p50L4M(wfQw=nE?HSNsYAT*=?N;WB z&_@_oJqr=a#x*vzaXqN~CKf{SGVg^A<9tX-^&zD6A>|MI2KZsacn>Dj#AKn$373Y+ ztDMnf`-@OTOf+|w$z%t#6mM>7KXk}qC8l;#XEj5>^1yCjKT_0yEu;mB&f@X*n~N3_ zrjXmVa4fY$)}c|M_}mE@->AavfbiL5YzGD$J`5AWOAOJ2{b-z=Nx_w22eT=ovR2kH z`-7%(Fbff&xlG<Nyv}>F%l9%^nsqkHQG|eqx z4!|<^Ag`nNF2`sOX1T6iZYh_5shlua=x8S(COSEsQ1F~*y2QYIrudx_JP#8b zGo4gKKLhchuZ+ZD?`yt9m9}7z3V-jNg*v6BI66&5?Tr7Ndne^^L``!@AH0aepi_Q{ z$~q~2soDUd-Nz1z>VAXJPNvg8D2EeN4xDnd zC%_;Tc;VsoWOPlXk9-LYhK4dKJS{8GtHJYypuYu*~sHf%KCQa=9Fg-(gy&$RaeXe;}u+}+q_{+?a4t?sqqD;0Om zwx9moHQWA==+-0Mgso^I-e`aAfKNL!l!}=D2Zep!r^5&R-GTBSK^@LToG~icy#ep~ zsbIMq-a)T6NQ6`dFnNR>4A5(VJ);A#^1CURPmTxgpa-6g|3_k)As9a!Wv3%U#D6r> zfp@SJ1a)i?(uW@SD87T8DC6-x(F0nSBOS=+M8pGpa#G}tjmq_N5|-OFD%cew`EHBh zyPoB38Kx~_dXT9_q^Eb+pe&FMcCXC9kZ{}Z-EyWIDcfxZ*=8YK+D$VD^)eUffKKLV z=>3U--h9;0R85)(9m-{ffSD|WGHXIPFGM-1O((kW?h<@A63ca=XU=1UJYXZwD}TxG z5|n2V%Cnf27dU3R4E56odB3X4wos-CHt{_b*aX!D$?K;Hc=7rm>HI1I9rzD6ait2^ zJJ2IJgaX=NODnwm3`Bl3w*-BHQ><0Wx3Lu}YGXQFUIw6_r&YMlT#dS1LA<{~ z8QY57egiM6KR{=*A#Eu}PDr~|1?~0?_-+S#cO$;rt-^LY7V)6H+mGP^q`i;nbT6ha zFc}LdW3wmYy+X!jl(B{7uV_g7xFPLfmcJv0w9gpQ9>w>#pT3gk<4nJlH?Ci>MW`QO zHyz4%?F#8`QhuA<6+?&q!{&DA%iwdkS2yYgAU=I^=<#I#chvvQsP~ho_Y){L9x}=O z2c|v7-qWtY-I(@G7~X;5n=w3vG;dda{V!nt?(|3l4QgB3{CDO0PG#)%?Kx=2XuQSs zK(pOAeS&?zoyENk^>P>LWwR*LcX;obl)0@r>f@Bl_?^nPEy@@5t?%+^T&}|HruVLF zi*!lXdyqEux9?Sc8w&s5hjE~%yFFSPgr4q>>Zxw3s+?dfy8)(l0P5Zcu-xuZ;kpO< z_#npJr^0m~%J>1))q|+3`<1c3sXL+U{RH&~qlCWS?WMg-qHf z^sq z5%*)tuYVu+aKD8(Paw`G5$6+FjxVcldrp1Ur@Xiy3;LhIw4YXfTl*>G^Q4FSOTp)} zh>OQg>;6%N#}n&Rcx+u%!Pxp4EQ8OfpiVuFyq@&}8q0lN`F8aMM)x_y{}Ptp7f`OR zD1RIdtH{q|{Bo8SaK47JzkuO4ls`@byZ9#N=j(oc`i#}+4di>#3$_^Yctn%OZ?QbS zgfzS|>9Y}Oe)|mOaTDed{%>XZ1v=lw^xwlYuc9nPjQ;_X<%bx*T!s5b|KyWWKT?U- z1mrHT`(xGw{*=di;d^Nf;CKG>1N>P9c=B_nc6*Wcd!LZ!y#_of$L1>en)V%S(|wjr zL0{_mK?B|@8$SzQ>;7hjC-yZ5<&}}X9(K&sYy~ZdCjybW{+s92B(6;}lvSPAUuI(@gLAT|H9fD%yZ0LJnCbY1_=*2D}!0 zzZd!J#pgZvyyrC2uL?pZn{~){>Ce($ms&s?u$O2s*I^T&I-y7LE%dAPc?*pffg*?v4(;~3ZRP1S{Ll36FaIAJ2|{>P+V#jgEG1qkojkDkeERK2E? z#Fby1AdtE!$-Ibd=@DIw4aYw$-4?)cu5!P*e%WSgL@glW_G<}on`$+{n?s_gjqYi4zFo+BXOx;b1ZZqer`B^XaEmiin;o8zV{_HB3!}`He!~4gD{OfdjGmYI${k5r#iN0$al_LK;bng?$ z^9hmv`{-G>juj`bGUzideH>k|s|%IY4nKJY>fB?xvg9&fWS99UaGRbOL?9&;Dy$f7$0q!S>&+Jdoye&J|mtJ%~37mhLVB5tA3v{;9Z{)Qr>m65_3oS}ZT6u_-(rxH*7HMqlBJwAlv}&rV3GT? zN#xE@PVL;oBIi?S^qY2^qiScjY3sGMz50Ez`zqR>L~_?aFEy=K7P_wXX3|?)d#kD+ zKil+L1G(ecuSEIITHb2&q3}aq*7>V-yIVtj#I=j5+9wD7WSu{4eN$rIT&>8uud4Bm1K-D7_?pJoy)Zs} zR6J|jAJcn>^(v?NqjDcdRMj47@@raOtkt;hG4ZUe|0=$plj{JKFKTD3{Xks4pgu3O zErvR~PIvRnICkmV|6ZU-TLML2%Hj9(d!m-_%idzF*O zZu|DJDjXks-}UM+{$FVIcvT>WMh0uXlE{9wGV5D8t_uR4HOgvpPf7f>Vf>3_{5oZC z6V|Il?VHoLV^ipo|7#NDUtt}L;|FxFwa`saH;s3NUl*nm8HZkP=i{p9X9V7}I{ldR zp_6-qN>=AKDu+79>OW7rDV+8ThBBzSt&zAkd)us>>>^Tcw#3A5Rn^;-O1LKj_->1l z>xKk!F}%$7?I_2!4pVx_!**qDBfco}yd#VsHwS!DJU=I%zhs;Hq@5dhzb_l`zT!BB zx31ZF@4qVL)_rT%@TqDJm12#;`VEV{AD(b7RBbuPyM#=5b!S8V6X-?e|9OL)Uo+&t zeD0yQ){?#7*Av>K={(d6F6Br1u*i2rwuO8ne&4QQ+aXK*fR4`An+x4V3rfGPo{ox# zOdW#dEJj>dg*oiB;VCSp4Efz3!|ypqeyO(lrI7a<0?)L4&B@#tpKsc_A5*B|yUQ^j zHCft!19T%Vy4Z1V5?B$uMF{y)hq3AByRSW zw46-!V7lRb+8r3$VT_8myYD#aDU)H4MUHBB@}w%O4)AXb|Jtt-wl58PEcvsv@3MP0eu3Jn(MKK1 z=`bD1>eT2XDfy-PA`%yJ{p?fj<)3A_?+?d+F-!de{R4J7&R;MKVLEboFH-*whVkW> zz({>+4&yt0dDqF=5~j0H@+pSni#EC7m-G~|PNqZ3+?PQ7;c)zSg$$oeYEwtT@mC9a z&$#NcHAe2E;rQ6o%g5~b{8XB;DbQ`R=l5CH{2q_VZz&ufIepz8j+Zwk$*=RFsn@_m zt))U+>#aJU!!A1LQ0D%_`@JghZwlkfdD_fs=4BQg%uK5TDMMU5zC5B|aRIQk4*+~|D{o|TvAC7DSNjCuFK+##wp)U0 z-A4d_aSL%x`idOZD{5nN%w@LnpI6Z{)CY$?Vl&6j&>7`}L>I@Z570BZ`hJL>`})rh z)AIlf$-DVLKVB}4TkW6H@xE1eNog(Ks}%T($=x5rA%6TLq!+}$Tj=3#UHz!T%f^Tf z(YK^qYfA^u=-#?)AB9svK26Y8eoMBuE z|I3@(U-$o$BaQ{^9Xa2qe1_=H4pa6IK67lwH0Afwk;dx*J#wH?ahxF?X6R^Q+Ooq0 z-Zs#*_@H`No2jTNze1>`j<7IN3OKlR254nS{ zdgKdrfyUv(RABFyB0k6hW8uqG;4qEGy9*G9cr0dlp?6DF*fG^Oly?G#6H(srOs^S^ zQLAzs;xIM8=l&`fPY+YkIzVGz zHs)>SV_v1gV^kuF$v)2QlztM1 z=V3S%!x#9(9EfJ$ap^giCf3l$XQdT1#C^G(rM%Pp;GT~eYesc^i{#QgXS}= z}>R;S|&z{RjE!o9h_V8?^_Z zzxAj;$PcwaLlAc;!ySfnVN3#B8^@w9pf7>`8`_=*OgBme>rSJQ{}_a^j3$lEp`X6a zfImS6Yf0xJKj_b9V*aKeZ+O29^9Pq$O~pJd$9Itb>s5Gdis;SI(3>vk&BAmlx#UQMpBFZ2xO%dN;j_F#E&N8F{|F1I8q%vLURnMG3*KvGSBc6_rr`sIpm-q2R{|dyF z^w%OT(O-w};s3Q3eS-Yrva+~wgVlM7W*kwK6BCEE+sJnL8jm-sa&i*4e?TR;)KILy z#$IYD#wU?W4aGWZCQeY|_75m=slH}^fYk|!=6inX?c2f=a3)StfNmNmzsm85BhVMl zfNSD31^9^hMW)UOfWC0nn~4(@pevmEX6lRp=nJR7z2Z~__%^C+>^{aZ@Y51sI0lZi zBf>H88_MYl1gYvi4J}LbI?yk?+qF1 zhrX*O(92^oKMm>hVx>dhOC9u5vDZ-<>qX3u;`H*U%+IKFda=^s-;>9vhmsa1(yr(0Pz9k*n7eL?PtLaB(I><-g|6S?OzJLVw@R*~X zWV)eJjya4DeK)n`Yjy&9Y5OIW-VUsEu+7O$JmtTubA&(#b#A4;>*K%diCgRn>g*D$z_!5Ri^??5ujC)xj}@PC;ujoSb=EB!qm^c|bu^}+XIaQuN9`~iqhds3i1gLaXB*RIER%T@T> zE!Y(8>)_{m7O{9vhu#q#kae+&eq&yyg74CF&SyE3aRLJ2PsKd-!*_$&JNOTEXCl)> z72la3mH6U2b0*GR9lkd|Cgm`k6{^IG@6A;?ebs!Q?iJ^+ao?>q-=ibn-NpCkOq{}M zzFVIW=df|#xh-;3yPqjeo5tgjO4>P{0Vv%^)u0YQ;GU#p`)$OCOUjQm(DEF`ThPXSbI%7-&3NV zB#_%mht^-y&fAozH*xbeWvGu9dX;r{oYR!;Z1X7}C+(cc27KQu&87H$R|38dmgWJb zGf)&y<0gJip5DoGPc&|$xs++1H8DM;8V@e;%jI)aE|+4s2*brHXh%qQv@Tb|vZZ?j zpnQ(vJHAf0#D6ZIZO|QnB0CszDo88W?5OHQTLUg^L8JiTA;KUdCbuEcN!hFAIVe?jr9x&E&T6bW&wFuYoYze}xU zx}$p1h-Fbiok02TK|LN-;Wb-2Z$a(mItxzm$$*Y2KXnP$nMrRc=p?eQ1az$SCFxk!jhCW=-bAq(~Q?G*a@3WE5aOBgV!e@C#Fdo2fjtZZhX+-=nOwK77H%kTQ;>WQx zbO#Kb@tB0T6H&g&n1=G&i0R?F{i&#@Js7_Y-$@?Rk?u@Je-`SH<2GWRKyEm@(}C&F z$8;A6S?8-@U9Jgf&SNw|M>h!_(Yp907+#9$E>2l)Fkbzd$mb#q7bES3DAN)Ztivru zUQ1MPCY8>4!FUVCSajxSInuid!xcjID^<|PJgkB~hv)-67>m()6FR>_=S|iiUpjk2 z=aE*T4!^F#YmKBII-f#1xgK@mwduJ5DEmf~b+d}rnN6sdEt>KNTl%#q|Lqv=z;LIg z{BK}1LH6H>@~1M|jo}_lw@b*vZDl`(2M~9kPdhhI=%s+NAN1mSkVZ46En;{``QKO$ zBdr$Xdj#o#-5 zeQ+5l%-}XKm*0C%?t63Y$xZH`H@V4VXV1>c+LOs-lC}2t`8*y1MC%F+h|RKc-L>bs zeq!4-ql9z!Q9<63dFxJ#7@@iwro|Ro+b&ZDW|srmN*3uGQ=Gs3wikMYHT{2h{w=$_ zv$fH*y#2$oCrIkpE~Mf5zMS4CaxSM&r~I&J-E?Ya3EO9tW$}!2rLRUnl5YR0ElKMi z9k=&wOp6MEWu{^LxhY$A;@YF{BA1_)0;caW zaGkH{tJHo}wQ>e%2z*=j2k302n}m(BlM^ zVcyTlOS7sUTqwVJ7>FV`-rivcH5$Ew%Oy1$O#5h9_*I-yvnix?p^dIP$ocJ0$FgG2 zB|f=^AU-CSf*3?GTeNjf59F#n>c8q-Kh*ViF-Nm)_;nEKuIQbXu{Kmse2PSCPDuz*w>bOHwi&}tSRQ@`ZYwHPgq zK;s<~{Sq>oD$e(Y=9nb?^m#fYbjFxCJ9LUGCrUm3m{fqql3U>)o=2Vh3PJis4S!$x%sf=o{ILqJvC z+L)kubLustig%hvIek;At-8X$figWsvI8d~{WE2E5uIOCJOG{azHK`kEf#AG+t{qX zLxhLPl+{m9huc@w=Lo)2 zi2+dIS;O>n^y|Nz#qVNynn9?o7j$~KFX&pioC=KNDqwCC$!Ct3rQsr);Xzu?=@3&tCp7O zM#G(&*oHPo5AMM91gL3DKMgyCXO^i@Y5S^Z1pJ;K`ogHz?wfF=s3~5LJ2m%osCFeh z0Sv$rnQ}^ed^a?;$~xy@nmux%$aynJe?Zah_q{Tj0sMneb9k569cRdL6;7gy%r`?L zx-iSJUs6rX+9-C2mn^Bg$8B1T$!a#dJ<2QG7wI|cQS&{tn1rX@jXqpW`vp!5BQD>9 zx&98gG)?yRmlvGxM_uQh_bY1-|3miFp^o*0)ETAjB=hAL1(uDnBI}cUir>9SW$2sB zuD|H_o>fax>Q=&PV?IxGqfk@Cz5kV;POnRQCHg}hEXxoJG%G|Ba6h~q`97DC9#R}2?iD2V1h_Y*$${yvk-qCIytfqyl! z;(pYuGP2=*RIGR~Em$cbJG5MQK$EU_Y@|1G;eIso-H%d?y)O;t54YGNip|-+`hhd^ zO)&W(&W}lS{x78ZE^Swoz+fyHrtna;@0*Nb#L@c5*ooVUydwfH^bODltRv7rzXil8-UiLovu5Gk-Fpa5O>TboMuK(tme=p4K0Z9~uFRo=_5YaaDvymOc*D8Z?JBK3VJ#WK`%iW6k9Rz+pa6L2bnurw{8kW^j^0MB} z`G+6XxFsIG{0jbxl&=SkPo+t==&nqql{ALCGuq*LEyDMpQ6iNS$_O#X7|h8AhT33T z&LmXGp5jMJwa1aXuE?gmi-50ZbJd2SQ0YBTw1U{K2?W)X8ZsU*lCsEQiwzNIbpZ!Mx!Gc7Fn?as#hxM76LBcXO_zBXnQKGw%J? zI~@?jHIQNr^FA^5uuHB@v@&xrF=y{iC)O7C9#T#JAicil9ky%vWl9A*u60D^+~1Gc zOhA{z&NZ>Xg;-5*&?Sl8PHSc#5)`g07uvL_7Zri}RHvPh{bi}(u@pv;0OSnjCu5Q{ zgb*^@)dafRTx>EfqF32={NY)Ti}U~%>+5mvt8h?I9mLaDp&rCrWP*|+Cru0v)Sr6e z%WFU*sh1kR+xvjeR3e@x%aE?FM>p+oPpqs?#>Yw4Vrsdz#wItaP3YXCLvp3Tk><(* zDh8-#@n=mq0yTdvc>4{ulId&D`2K~~fX~1Jml{_;1}1pPJ@vwXxQyibRD1)g6pq;9 zz{@&=_SbRUezd5Z>8jmxYMT=2y9;_G1&Os+B)sN3jL+X^BH?rhOfk&`uTh}lsw#|J zV<6JG{QaILw&S_^f5OgH+~1|%HCNdAR<6O_fONW*T?8rT(RSVrmIKz`iLGnB1jnUw zX!D~VICE7>9eBPSe(8TzZG^`U)5wrQcXMTF{A5Ntef(Y|!=bY%PqGNx}d1N|A%692_|>!AA9UYCwemmJ@U$1NtX@Y)h9xX|TA&N+Q8 zL^{m~p+c{&DDpE;u8E&5x8_3qosfMm3!y=0wZ`Szs;FeOj^ng4GuDftBWqh&Rz&6% zq^QwD@^;)|YGl9`W6BAUt{7|R#e_O2y>=A$VnQvSyOQTu^$2W!<1}-)hVRwZ{z^F= z6dY7mm3QaKc}E-KiS>aDzCmrfr9=Y%5`4?`LH9~t*xYch{3(ZKeQYZj<;+sd9f2Hz zfhHUh-;m=KfecwIW~$B!=Z4XQ;BtK+dzqgT7uV+EJ|Zyg)2no^zQ94p~jYpOA@BX#cU79v#7)2nN?Eg#cR%ZEuP=z!lRrx=B+6sC{4o1b2;JA z4=n$hKGZ}dD!ZAUe!~H^(Nt?_C|T4FZ9Kq?Tk+z z8<0Vu?76?WXv6ZJ5&G?pKdW8Y%V&@{DNdEfX>3BFX_!14DDeUz*(h; zSvlib$<6`$iCubO&<{E6xGRx92VR9y<0yG6IVRP^y88Y7bh39o5fenZaK;?^ZKJrvY;Fmq95`GxiXFVwoeCF zE8IG{0JL6Kg!IsjzTsUQB2dvI3kkUFC;682c6;;A<(j%vBHt18^z&5W&jTTj5RPkk z@e_lei$WwUqqy*J(3Z$3b-jyki1X8<`f`f55Ig`I5O@XEG$G$>xi!5L@9&gGyP)5i{yDh=$xz55n-rZ>8Cv`pDMfOz+aV{nfvnOzl#wNhLf_all(-5FBr7 zl#K7b2R(-5UA9u?NA+giVGzz--wJa_>y(+(thvq1z(GT8=Cm| z5gy~;bxDV=3GFn-o%;}Z`{R0xeDr!k>g)PyxM|rT`g!ypK`}7*Tx-+_7sLOFXYjHP zDLtU_Cn$PQ2pCoO6mxL`Rw8-cqD$t;G)t$1X_+9cF}YJ%{vfi-ri;@qSFY8&buyU z+%8i$1j7!3%>9`u=>(8I35+@))6wm|2mX~u7-1s-L|14Cz`-H#{vN{h9b$ji)nQyh z6UW5u4R=f#+N6m=oTBj=QyBq*z1L&CLlAtCa0zek;L*%GpUkVPO_N`2AWiB8f0To} zpTNC_tUDjdR^DbuenTH@QM+Bov1a~#;)IH>x-mMBb$FwKBMfVzteIJNLG$QXSC5%U z2y5dsi$m}o6$9A3K;%-)79vwy-}or@?4_jT`E1N#G%OdOz=4f1@L9U0G~%c2_-db7fGKbVo^JJ)ls`9o`Vcbsu(!J2_Fp$o zk~@Ulnz6%Qa%$;7XV*B9ibB)0#{*GO8l>xWCX+Ndjo``0N;e3gksJ8gx*SA_)eo?LXqdY4T&z5iIwi!bfde&|VK+5&x9Aomlch~H7{{;H!AZfkf#mj*;8V(c zt4~z?c>D7V5OJ6@G^2-Kkeck#`SloFPSRP~bh2N}?K7fE-Rm#;mD={-L&UuJb~a5u z?sm5LalxhhQD1S+^{D=>g1r$-ic08X#Jp>vZE~YRr^1dA@gSghEY8}l=qHDsIh~4r z-9jvM&3=F9cg+dmf$hsPh;J8p1bdPP7<$9_K8`O_B;0q&Zh$wQ5~{# zj&^T$r57`s=o6>r&(8g~uy^Badl286*2S5W$gkePgh}S zKdL*`@btb=h)U7Y-O^&VK!Lg_+^5xt=2$Oid*oejtC~TP=Q4KCx;bZ}{D+BZf+(DFkWT3&%y3YWYSVP)jW3(yU*N)g z%LeIx(j7MNMfT@gvwuOOM;Kq1_N6>0q4uM8U5w(EPaas55nXaCCp|(*3+NxI$LlIF zpz0&XJ=A4}Wf+&(ZG4>oJ%@AWDhC}6uBBs*6C3jxNh|rJz8H&tk@mN#d(=qJ(!Ju^Dx#`k5DWns`bwp8^Sy76C+Wv8p~J>U~)A0>d6m`LX7n~dGed7->pvCYB&|q zzf(sY+fpVHl|czbZ!bbOea&rI7MZyFRV)9CLO3mNmXN)|6U(zDguq_qsVdS=F|JZK zasrZ2)!~fCdO8YFKvbStY&NyKnxaWt6-T>d0w?(`9(w^2=VLRbB?8 z(|LmHoP^dZ{w;oB=2O2=TgV4=RRc19eY7T=DgNf_dAhUiHTBfuFE7=BW%=$SrisZj zV=~EE3Zs)ObrT)U(Tl&&Z(Tzzy^O3w&t7AbYq+Bc>J~9g&yXI-y|;49c+yeM2jpe) zS){otdcG?zv2?Qv2+4lgWU5-8r_8_IB}`erBTLEb>I8(#wRPJw%Sya`2aeG@_YA4- zM8sw@nDW2r8wv2k8aUK(c&vc=x33d1E5sE)OksHqO(T*xpMIx+shDFrNvIeEN{sm@ zfSXd#5;Oj}s`)l0E;x48ndMhc^ssvN7tKkZ@1F5KDJSPt%(!%v8uJQ|O5B zPTnDN->sd(F|TAp$}S({Vq)m;h@#f0x9YSA>z;7B@+7}cvvO+>uW`7`+16dB7xZ?@ zrYH3g`pGzL@fqXY4Jo{eg|*kRcZ;w;NVgC7u*Yx%VSAMBd* zd#VCq!^7glK8h}43~GDJ2Sh(Bty|xCA58i-`?-l$yCCQCO+i3y-%Y){R1@$$xZ$hn0AUdE*P&3 zB8?XJb$%{R_R7>QU&~#e$2^6awXD*$uLxYyi z)j*j*!wv^fSk1($mQ~T^@Z7+q2F7$KMQGldG@pvx8)toeVuP<=b1JQ0x)As*akj7` z+lhV1)+eqY7!}LT3!1bEQFtx4(mwHejl|AEtgR)e2lLg%g&!@dk7sb;2FKqVF#r!BiOh5Txcou~a03jLA+;wT%G6 zU_MJEPa3=lPj%!yB9fzc>BC!gFE*6hY`7u1=TLVJM+*b`nVAz1TR7x{hzTGQiAn)U z9Y|$qd?8U8%s{d2jNI0C^94PpHtdRVnF(v(1E^Z3fc_ zIV6n-bq#Kzq53Iw^Sy<21Yz8MwY$`Y*UkDe@&@$-zXy&Kuy^0S@&llM5=HVpeWvM+ z!-h$s19y=C<}fZSxJWQ?8foB(Vmp=WP5|{7^%;LVhXh`a%#QIF|pNvYe%r@>%Hd!PYql^{*>N@ z%xdTPFag=R&*?zyDYVzwAdx0lP!%F^VBtWV7R0@T98l_qaNml zW#Q~T;Tk+2tKZp?jPKs;`u_i}=KtQ+#PF#i-yd6{UK_(NQNcCLKHie+d57)!fS|FX zfTC{kdEL<}k>A}ykL}KwsW4k`E;(H1_HMBrEVOI#$(hQ`lQ)@?FsqRX93*Ks->J)Y zoMwbdcIFGR+~1i)cjTd+TX${ z*+Km-)rp;jIupxuS?}EQCCpml2WqqD*pk=#xlH`03c)#XbeP*d%qnbl!c*aVUeNjG z3T+z`{&&YV&P{(BuH=9>Qpc$Wd73oqLAo!V)_2juvs9F5(V_OO#3^bQVxIMr{OYrR zcF+zm(?;)h{(BK(mxtndnB7?KtkTBGveHJMt<>o!ktL<9`+#Ew{YA8+C%jY=hq%3l z<-Jg~?dh>a>APb_*Cx!yXmzMBZH#(`as{4Y+*B<>#Y!k6k#H zYw^XE#vq}eHv6hwNUo3SEt)qyC_l3>&Cb35V6qzii#lg_W#AKye{XT{H~3eksZ!rn zyn9+JZjaOFS>$xqTk}%>?qW)UOEf5cng#!b13`y0Cm8mOc@sc*K^o&n7SHQd{1x?0~8V~tUlK8B8(qC)~i z=UYkILbGW>!VbNM>1oufRW|}Xt~eK&Q4Pk|a0iU+zje1%h0e&c0c@gEaogTB7agyy zdt%mpmOZ5SO?D$8;8SzRJ~Zt2uaa`!Eoai%XIVtUUVv z&RIr!_!&z*L`*Ibx2(Rhc`Ngyha`~I!R{;O#6}h0nnP(k4YAfgw#JtXJ%%EMwY?|- zzh36)7~l~Fn!{Fd+uX?oSR=Of$YjA*_0Yr9yZzYofwx3fkKep5G;h=n3(tr;a_YK% zrg7g<8)ZLMNSTp>%|$xJU?Z!lsLxrDf~ueof4k#~n6r`#Qc4r_Zx?r6-|EDq*VCuesY~b z^pia0XoWr(WCce(FqoGr=JM&Z5|{Ym1YW$`2g~k11UX#sU&$4#fMUHAw>}6BH&-Qz~O=AMt zZ@{=g+6x8C-x+n}8NeU#E1G!ns1W0jko7uju3b6(MDD*W*xe|zE4N?Ylt!ojZxSra z{LxfnK>MC=f*z=3%q_|`&5>?&Dv2%L?7K|tivnw)NFh3D(k`*7w@2xOGsf_5-E3IL zGq#lurS>=f<5`W3C+*H_si^9{;st#~w5gXAeKESro-si)YhXX$z-;Y|AQ1&3i7wH` zJ9skUK;5bH3=jK+gQC3GQYqXzZLJtlL&F-<$6+@;{a3M%&V^kB-KBuNzhFPP-Fl|g zY5(Ws44LdqZCQUr^mkWnYa_{u8>}) zu^)~k|2N4V^Ez?s2hw+C8rd|>4;05PTnkGGu~{G(cqTVB2mjcWnr-=wLw%YsJ??R$GAjrx=uh_l4ulmHIfLHA7*PC(J+d&NYu^(roYwptk{SJSN`Rm&`ti35S>Y072hz_>c3>ApV;k)i!24YsLOz1sC!k|W4~mi}XJkc>HvD`m+`=C79)V#UBsF9`E{ z6SfzV+2IiNt2mS2dOv0~mE1x}O9!QFxOqAVXNyJV8$&v{a})RaUbfitJI0>gj}ps; zL;^x3Ldvare&j3)MR^)ZdF@)k{hO={=TgC1NaC?=pdhlF9=AUoJqZOWH}40y3ATK* z8!n+(vuz)L$fkoNG*5>#M$FkP>6zEze<5KfHWKlR+0$%-AdEhVeE%m3yYWv%>zm`n zf3dI*XT^v2uN7W@jq{p4-6W>bAMYN#BtZYVtNO~Ps~ag3W6#Lbmw%%=Yp)nqfyYYx zcNXcp1Cr6y)}N%mhDaNKI)C*rzw$xH$kihq&ZvW+pZ;H6*k$mG3rpU7`@v4t!yEaA zE4NKy3JpCeCHoh~i1-ENSEucb-axOp`WU`*Bv5#M{FT&X9W8r+8Yu{2`D}O(?G~`0 zJd2t>8=*cuEWpuZc`(WD_&Zb471K9+Hi9ue;qqPvMAZG!I2WS||1|zz_~NV1*Qf77 zvU6ur>o{pC0wE`O)GmLt0&In3wj?3Ft7MIlk{SasHv5%ggmS2j6h6Og*~32!xe#4R z2w>$%4TevC6mzUa-VH>bm%X?aJB((?Es7?FPjSJ*uM!h14bg=3O12O>cYyEBvDx1>%9OjQs+3m8KFl2aC;J0Diws4KwTKuURvqsFm*jFUe_6}c zL0m#uy+0DcBTee)U0a%0?JthH9_Egh;}_d{2mjy_;tWzYr9Xz1UGPR$5d>a;qp**h ztMt%wL1;COFh?yWNUxtA8yYzt>JiH>K10w(eFxA^!C+gxzjbc-6?lV%Uv z$B~(s93*KI*w0s@+=StLe@wlKaBUtO_Vlw1EA&O*t*nITTCJf}-)9VJUs<^Ej|E)>uisjKrxv&v=LDfiZe zN!q6ae{<|IrHzi15)X%IYPpEa`@4$>YFl?&idD-TSF0b_DE{3n7RxnkKmD9+THt%4 z9GBWUO>&IdN?OX~q&U6ug7eh~$UdoW!-~Oa7#M;JDFL~=97mZ&0@7?tr96q+wXWSf z-pg%NtgiXQrt-dvC2qg^b^Nu2N}wg%o?}{>mAEtZIB#yWOs}fIt-Sbmw!#MEj8}ny zG!L5GyWUgnd?yTtU|iC5nU$Kx`I)(@=f7*g_yel0zH%H^SPgfrxC1D}ql`KUf)mmE%ZU&9Q%@ZG#A}sCxR(z?+== zRRGb;oeZ?|4VU>x!(AIUwI9i!K)`Q$dh6;RKxo5F@0eM-X&0K1{xcqp|B|Jfn|a1M z|0}sa{}M`?9#R)#s_=h~k}kJLu1mhs$C|ES5j(2xdXC`xuYGo1E8EUw#dOleR{2E3 zIj7}CmDP&rlc1KZxxYBKPD!bQ$@EO_GLFWV35!kdl^jM_XSQ(qWXq?s{96Ob4>75T zW2g+bQ6q$xW~I>%1&ob$m^I3Nx=@Rci$<-#n!)=HP1xAcAwP(ZeY}tTt2F`^;@dhb z(L9t5`;cYBs2WW?oWrG8woYVyIbl^tUYGtf>S%0ro4A~vFmDSJApoqa9MG@AlIx82 zlKQUZ2l$h2MP7F6PXE1Ru`l4CrBWxk23GVD?4LFWz5l02X~XkK66XK6#ET?M`su}@ zoV=pxdx}H-`=hwb7(olw3^%hL+1~Ua`d2!Sufj z$~$h`HQLv@>3AWpAPt21K2%}SFR*2C!Eu9hysVZtLH#}nc&`!Mz}KBzbl7ewAhbK#ARvk>daN{ zlV(E^2Jd`2bz_l>wOUbOviUZd$uN>Osuo$tcGMj4x&e4zTFmMjZ z(S-Dq{6eAkbe_J&>$DMx&-L_4i4^t*Aua?4UY>72{XUWw*W}q~- zbq+_NNF(9YLN$*P-=4pIqfvrR{v6gIvz)I^95}6eXUQOXe7_@@a zNPYc%aaK9V9Gyj?UFR8=Z`X9z*Ob{j^9*^TIQ_#fvivhv{}hNSwnlH3`K{&qscb&5 z#trT>t~>ZZN1J4#F7~*8Kj=A;d6PZ^sRx6y&u*;j@qF5Z%1bUBz&>3a$1P?GrM}eN zF748xCsaqf!6cqJm`nbjcQKT;a9?(Yv<9Dx&qC^M3FoP!2_6EPQ*T%kZeCoXxNoZ{ zqj0=qxaj;$A61NRXe^Z!r3y$)+Me+*oq;HIkDmmBOOiJi12FG} zA=}TYuzThm(NMqt_qb1h^1WFho5_mGOW=iU^cf{=Q~8wP5wqH-QzlD4yTb~e#}CMawkv=t2=^Qo0<0_@bcG=hDn+C$;Kis5r? zc;~*~;G&ZEr+giNEmLY(uzTgY1|Q=yp&;XH9URQneP_%nT!!S(b88&`A1d3|Ana8n zNV06o_f=lkX5<>QP3SjK-*azVQK-PgRmIQg5ev!-z43lt^*b#EozKi>Z^1a$Y8>7v zckOD&4ta{i&TfefOiiaOn2#8-Y)y^pUv?i)cE_lxXbjf@w<N)5Li3E zz6jn&)(@F?I5|+RaD1xvNix_BFR~du0Pfci zA%5)u=Zk||Y*08C!gs5dBqpzAi`6r^ns=(oTc;N_?MA4N?Eu+qN!_%6fUbWkZY8(v z*St@XVYykMA0-F-y<`3k|2FkgbEnDpu{gpi{Bx`g!BM8Qy)LAREcL||h<+Z^S@Ivz zr{yW-KcdfTzAb!%*VOATZDF>9+f&-S#(%W;e(|hXDgCln_XcCDPMAuT5q0`qKr2Fj zc57EKbx`H*Jl2h*_r#-6R9^GO!%kM-&ybFhVNQQ!K43lD!r`@x!rLLeLv7&=?)`bN z-sKy&;_!1o_M(Ry=j7|T;+JO0rZ~Ud0m>RH=jW*~uPpURE;>Lb^|6gyeUk5ELQ&Q7 z4+3z{{`#(HuzbP;&yWPh&SBVYDyC>cfPohTOurkNddkHyI1}5|u}Qdq;}jZhZ_S`| zrTWBQAefdTh7rit5joaaH2Tb|uctedW3ca{4bZmnLbSvKCfjdKQM2e+&E>BQ)=J;q zZ|3>th-E89z&E9*+T1Joy_3aroFThMKMhto#(cY!vV#O~)2f+U$B9?WpXbvZ7~D9G z>{9RN>Oe;MmDf*P`JmMDN~mf!!&|SsM!G?1J&X4Om6u@bwO>;ahhJUQ$6E4!Y(dL6 zOR&9&OUAWkzcGB7vV7}Dy!>x9pIXhk?f4MFxbLjntlB%7oY%EfxhW@LEn;*s*Za=m zbF)Wh&&ONK#Nn*G%+=QLZ<8gnM|`LJ(hHLgbBngNzSobYw;BzAUwhR-hBmr2%x(s! z6NSwUH<}uNfF?*Iy30_b(XWfF#*T#p$?fot%1f;ikLIw42wP&cMkSnw5kcVULvepc zt8S6u<;SkSu)1$?r#}`FDQND4x9Ea-=BGv47tFQlo9^>0=~2Y|V%J z3Gcjr86>v%W`|oAMUOFi4{P5nH@5D3tN_@|yXtO#G~d*G7}FSC$B}?XI>7@-yI%57 zx5!~Pj0_1IH>YMA{NOff3Yb>-IYOdhr~*ZRn^XHT`Rh$Zvd-qHvjN^wrHW>Tuk23E z+g&5(-K8(S8GjAwY&J7Nlo=AKaHGTz2+R{>3P7%JRj9+ywz3JpbQh~U11C-=cydT% zYU*`|rTYU1M3UhaJ-KqyULD6hb^(~}p~inojBT#$u1D)^f77HRu=1@CZ1?NeW_fut zQ?ip1I&9-T?b6#fd!}CLr)w&)wv@$J@!_YVt5SX{2j0>o00*4ALazWtVc-bw?ROzQ zSb!1lmj8e=wxdD)B^anNTJ^YCxvjQ9!8kw`dQJY`7a+W?U%KiN@A)Pjc03sdXPAx} zM_i%{bXg1o@7E|t|Lmy?pcaLJZ0O3x~ej&}8hQ5TB6}?#(&V^t|*sZmv zu~j$+BlrxoTUsI?CjMTad}AcBsiSdYO-CJE%=T#6){)iLS(s-l60WhDHM)8h-X_r9 z#SslGsoFq=8;o{tV8AypG*4OK2@j{#1-zP z9!JUO4`0_SwWb17_CWv&!~pX(?iKDbgdf<$90D2M@058GA{k6ILZQ7b6NrXh?He#y z%B4+;j+BtZvaRm@G@4cG7fi?b;%bC)9^QApNyG`Kz5%_GuQ--zaG2wMvRScWjhNj0rax)!oZf;QQO?mEe}2t;HFL8teV_W(On&~~uU{)% zBYU0Wa#EWew}YhK!0W09$BnkbOy9F7=w=$<^QPA3{gjA%`SJY9lFtX*^i@(^fZmMn zyjJSO7Z+$`cnR1Le5!aD>^)d4(>#y`9`c)OXQ1n>I*0Y2o^+l&J(>OnXT>RW`Zzi| zysauaoa+(&drMukiA4qkQW#Cm(W`T^xgHry7*bl1&h~P|*yCjJAB3?juXf*fbr8=D zzN2)8r>c(rr)P9}_0+oTg%Hxs1y;71U7>4oFisftD^C&rSCgE%N=5Ht_c$_nRz~>c>rw>$Te*f-x#OG9>z&=;}RM0BvxcZ{Q zmm?)aE{a z&@s+s)*Z9*WvZQm(q$@Bs_nj?oiskVRBI{}0avuf1)g5rPM^-HWt|5j`0Xh6KJA1% zFKc5_bq@|v#~}lDm6M)XS8d-4r|5cN7hH{(+@)Fg-NjSyTS}T?g*YfHX~p|~`HK5Y zdrFvV2QRRNd?y3s*5y-gR7@+no7+FwUTrqp1K$$hdRp4-8U^OihDyWb=Zjd8t4EGf%ST$=dJZy6U;R_XAMAvU+rmkh38XsTp)fm!L%NpS;ckb}= z;w|>jT(Ox07BS*PO_TfCrb+gtU$g-Ys4;MA8p!ZyD~T}p2mR(i?J|N>Ye?pq0*qyN z)SRO&TDZdzfQb(qNIP_~!yOi}wl~YKoGQu!=BLff5if zWj#o&73Lk!$IQX4Y%|Wus6WT+B6-hf>tgDona+Vr+c$i@2)hWg;=92?zR@*2_Z?1i zgNBLP$Q?KTm!?bLh@)EMn7VCjd-lGsi8~&o^6~blaZzR2?gnXlyySf=TMXo3l#2U7 zL-qwUc0x0o8F2sM%~ZH{jZ?>Xm}{#-?|B|Kj3@BU)L_f`PAp>d5xZAf$B9{(_+zlO zFgWWw|F~I`3>Gj0!?{nLRtCH~LizoIis4Fki=^>m9}Sh+ygQjuj7o)#Oh0?E!jWW* zNrqbsS)%4fcZ5mi2{*SX$)OJ^#mnCj6Q{5#$;A4CfFO2_`!A)8G4;qXIeCP`)LUj?#iehsV zLXCcYoxDr)r;pPBF8X^N-9 z#E?rCHETD1ij7}+9n=;b-}h!krM&%5Ke?2IZ9)&Bi6h@oU)!**emTfzf&g2gg`%}l zR8Y@cxHia^=8vVxqo2V396NsOBZ{!$Q0oU#ywI3UBE0J!|IhxMI5lONNC~xD$RSJA z`7U7{`yeEq$yH^oBG+nfLH&umj%YlR1JyT@sy1hd>>mpcL^n(`yV*`-LC6(4&L90`sYOkB z!e$!+K_(Aufp@F#=Exm$`4nd|WX{vFi#Z0w%e597KqrnaQ3Rh3^k%~I7B^Zvj~X+s4+=Oqzv<6}WbeJ^8%`cM!kX2RipAo2{&@Sw z`mKWFg-HK4-UDDP;14mCX_r26(xU(m-sV)U|M1*$+~r$v)L?6*Fs(bzIUSifm465` zGgl4E%`x*BnJx4v_1dqykC~y$a`Fct>kv-yxNl)8wu=JpPC67p4_X30(h_tXT~dX0 zPLDsP1lg4cQdwf(b z3%EPi3+B{vl-LvnT>$sm!{FHIEO`fM9E}RfZGU}m>cNu@xOsx{_KkBZw5oW0NU|Yr z{BbBbDOlx`OwqpB%WMwP0P7^VLC4{g>R{b$j-OOH70y{ut6?#=8cNAlyDkr$G7!$lP|4bggp3^#1z?E5vq+w`wB+&S2(KVTpE*q29@mfAm;zU*;zlu z@$}I;cyJHFAqfzIyE_DT3r@bcd+-H9aCdhN?hXsVCAd2*PFPr2U>DoVd#mn0aI2<1 zHPt^%bxqCm^mL!|oL!fP%^gAf%r|q?I^meejQ;(Ks7%CPKgZDqCcB)8Z`R1Fpo|0?uXfhZAAFxUk;01v91Q{^1wJn=3SuJMSa|F5gX(6r3mC`&&o3 zDnwS-%3eQy6 zdvIBA=cMX;rqw*M>)hL_c!tJBY}`Xc?z%B5pbqw^NQ?9=3@S zHhkEva%|$J@H-c z|Ab|;?X>Uy@L=dXmegTH?pi6iZ$M853th_5e3~AuHUmG`9v!avR+D9Y<-32nBqtb!3F%yZ6$ zk*9LVf9&`@DmpMLq5t<0Z_s(eR35#J}UNUl0+;B zr|yG19xW8q&zS>o0~bU`2)8hQzR1oO4N)uENq0iP)8f%VM8hHm(L+ASyDI%f!dFebmu00Q>O2@43HpCY^3gtoswS#{@ntIT6rA*xSxb}ouu=aVh z1fQ^d@NP^Fq?ZkxG9kDXQlUNF`xbkdbM;Kx=hBo5yWS%1OKAD!2_qR=p)imLkO=c~ zM>;KCEXU|oxQkI()=jM8AxkmUqr9e_oG;LMF;fCt9hf?gAzFVjPQ2KpA#&x<$4t~A zbvjLBO-)goe}8pzl~P0X{OmrhwWt2UBZ#XdX^+~xAOJW1qchxyyi_X=Jp_;iI)qsI z4!Hk4EK9q_Rpm^bP;U6;(?(GLe9%T%ANa{k1h<{AJ=C@Cr%#r!q@6MA{I@S=NXr}s zeRxEFwM58Um<{x?4d8LB4hqX+O3Q->rt(kq3|%W3uHGyLBD#Q0$)>i?1{`50s@-pj z+fSj0oWkPP3l6)0*0yIWYEzWyM#ZA9=eQ1=QLSdJBYEE*bsheT64AGJ5^{Ujobhop zal7gp1Aoo;ilY)kZ4ZiWfg1Xi6W5iE-{IXFx^vpuFQQ;Av7$pgn|B2*Cw6&;-7E(< zz&*UQ^m}HudSPYTW^fK?Nhw%Rtafn8K$N37CR{{8M7L)(x4y0Sw^jGYo|V3~qiPC~ zY^u*<8~Fbm>^;dd*Ur7>E~QYh2UfEP2$Vzg^=+YAD?H^e zJYOte6(8Zh!%B3fg zTMi>(uOAXN$vYpn_~AqxPWu0itB+tP`xx?xV&}rs-fvG~*znlrT6a`kA~zh+Hj6O3P>-FffhXs*6Fm z%L{V`pmj`6D!FE4c+hDBR@JJk**T7-bthu<+jEz2ZApy_G;Vth6kn=#YH(}?DQBw~ z3e0hbaQ(a7OvU#M$sRBo&HBV=n9NWN#g0<4X_#dCK0#u{lm4_vm-6*f%m?8oEBF1H z>=vBLQ7_Um)AEo#tpv_%N)&xmn=G96`MN}~YMN93$qatrC|SL5LYv7&i~cSXAE`DR zV-eAdbx4MpZw>5m+ZjzZ6E^FZq9&fnU@F~y{M>5iw=|nXmbf$G}H;;Acr!m}UjV{|RGovoD_rPY$O{cK$4_uJGh6YJBJOzfsu_r}ruH zDsmQ~dv{aP$b7xU0qNG{P}d1{k>mlCDu<^|jL;rfAd9=ly#ma*#s9m~XzeyU7*5zu zc;|i{I;*7ye&-nBLrJ&&92-*kIJbpIsSVh;{MTIGI>`Fada6Ui4BQLmF8Lfi!1KcUAVCX=tqtBd z;Ve)(U7gonz)dhrbc?)Z_{>kig;qTJ9@%j1t3;iTjnjR(jAOKBtGo?z_MZj z#gj7z4}TX5VGo&Jm5O8?zLjuCZ+t%72j4b|2PwY_X-`Gw7%HCXM0N3Jm85_}s~R5e zazyNx(w%nGnV+jZ<=M9nF}d4oMTqBr1vy+hM|x6bczvL%0evHklDvdqy%rcvzHswS ztFolcO+g9b&~jEuAtSS#2TsiVm{4|bO|JVd`s#`KT^2wVLm#C<5Twz~F?50AmaDhF z@Mcc~74)yzB~rk20Ci98Cu|Mi7;US!&G3;wXTQc?|Gka2*xqlC?*=nvYRfPwDv1TW zxV_CPkBSjja7!^Y<)F|KuSoSYHPv9}Qq{kM_tU^1lksYFj*AwV@;p~PLmaMt+*zkY zdG60leO8qAi=G)yQ;L*Peeekw|FhnW$U#2_y*FE?)7Y)n4rCP0)6TQ+fZX|W!tbE_ zWW7yG0>zcemo{$)#RABjk9qL?qi=>CXy;3C(&t~-eP9#*@PM9C;Y+Y(^HqP_f`5y7 zc@kfgPp;=S)y&;~Vv;b1PF&TP>H&VSy{eOTNm9Wk?;6A?K`M&#d1W$8<6ncD)ceaE zm7u5s(L5qx|6S!1dQ*=@Jeb>chik@&Mo+p&bk^iXCW!g)yIjbFyx$~!*Ft_7RjyGX zl`NB>tf%8e#V=unwxWkXS-S=2H$yw}sco@N{h;qoD889YW8R|k+b8ekX6b@=%&0z^ z^CCTtV$E8Z<6cvX18!WSgMSO{lKf=GQo9Leh4X9olQYxp;E66E-H@_EQK|92;~@d> zz1xuV-U`aU8O{0~d|R^f(jB}jjYQ_(&wwn5Sb6&`2c?egTgmPO$ts<>1(tDTVbW{Z znN$8OtGU1c4N@)MYPGo;RtvUZA~KQwjg+8*t3v-0UdPvgR%X}UU`j2?eS2{nEwv=| z&XM>Guf0EH9haS{#!V>3rd6G}n_dT|iePkiH)FaZ_N<+~RRX|@hl;8^t+dy?6ymG9 zfYhN8SB?x~i#PxD?%opCYo6}ULO1yK%QztT+F{&MDJO2@z1i_eWCqhI)L{1!xOx za!$oLrhw|OJ<|{?y(De3H_)g^-aw>J#|`2hRrzjX zOZu1ihXEmn+hh-BmO&z&PJ8!82}52!)$?oEU6+nz4{k$7d(ry)k3>P2!HyTw7$o}m zqOd*<+&+dU7oIJY1Da3w1f4K+MZ>&v#cO;tgfNqO(|%As!p-EL4DaG2j=}kV`^c86 zN*(L8<2o7C-cUJ`jqf*?nQh#wX{v8XF)fJAg;Eu(VG%kk*VLWZ{blyHHYYRdT4Q9o zOVMt1?+z&3>+!5=tqdT#*{mO<2Q?fMyqw-&`d1A<fn7*mt)k&R&hX$t%O z)A7||36?J^Um{5QY4@n>_YXsAVn-hAMMbdb|H^mvi_)1 zbp9I6NMP=rG{Mo^erkr!u2DTc$7(>@Rkj&H9vZSrb#%!dO}yDoTWBLM>6^4wTGh1SZev9*-%nX=uqjj3^fCL zS9ksvIY3|eaH7hX{!n+J7Wv!PyUAC85OTmin1D{-AaEZ{H2a~ym12@trMl4x%h>ai zX#{fH_9uONe8XUUaq_k% z4Xu1sFKS4aAAAy!%jtp7X-F@I{XxX8Id95`0Y|?ViuErfB(J29Xtk~gk&N#z>0p&V zMKGK0h`q7Q1G_yLZapfHUeb3hkTcO=uV1lO67IQOy9*+h8kL8YqKPx?F1&-KB7>W0 zNUq4SU12iFG;RGdSTyvo9t_bByIe>J$tyG@Go34jpY`8%m67u&-Xt)a_lkYoHTYTY z-`|X!PkbdhAb{qnPfhlHjd1r-%?HkbT zB_gm()QLrX?b_tKY2aQ)u&)jB@o`60+)eRzqH)ro(6`3 z2*&Bm`e`te!p8j~)vm9Hx!__K2Vl0kp zf@WkQnq(7#prhR$p=QM;?87 zSmR;lGMjD5eDT|F4)u%#~zRTAi;RM__V zwDA>X<}ZV=hwc;GfpZxwjwFZ@l7|5i{&j=zJo$rYOG^x!UCYxuWkcE%eh9vhz5h>& z?EE{++$b0ACGU;%B0x!o65_xy4170L?@9aXBn@mB=F$2`$g;mvZ_ilfnnur$v-OlA zcbANyeq$xAZ%a#n|I)=Fc-koDOjFgXxnQv z=NC~pd^&(wCF>#k!&S|iAXpb9F*Moa7~%5q-X-#-mVhIa=sxrS5b5d?QQ2d+DKhr_ zc@KcPZ*`JEP){7B45R&c@2qq`%KT!2zNwz*U;n2UBl-5Yk7%Rl%gavEBQq%?1>LlO z@g6D6KPWRl`+K74iV|p_B6swA9z3=mBz$A=b`+bJzb;FWJ0RXCD1TFaJTTVM2X*2c z#$={Ti3-E{LjWmXcJJG z$Omqk%co4sN5WrTmsTMN?LR>VrF*3F=QB#&y$U^CJt3AaLZ_etdi#6A;|%0u{h!+$ zbZ00HtcdIrM7b>Jo`BZ-f2mltyYyZ!+VaAPEZDQ@)eAM`OPqn9IU?qEADBY(^7-UN z{SSip^eN%f3J@y~_;n9k)_4eRmRfd<4E65gS>JJRMU?5VH?nD)H~UN#tI=t3^|Fk z`sexZxAW7~v7ukOLcGh2wyu@ObTOPe7o&1$JD}mf)m*>ZnliSyiwl-)!<=;rk-N6C z6Ago0pZ1u$Uw{ABioELGMEC{%3C(WLHI)4>YLvRk$^X-!9_^kQ75&S7k??KcQk^cS zBC}?8!qF>FB+(PYQe$&d8PCzq)^Tfj_V&L;y+txRSC>&W9Z+Ad6Lp-CVK&8G8($09 zDR1P3*Xm36yRPtO4HlWTqFIi{mq=pu*ZS>&FUSbD!K$vL{8{14R&YT_!r25B;iVro zf;PKP1ZzAYb!Uw`WHv{RJupFk0nw;VuYx`LM1wPZ?Uut%I{_HG6*gYOhksYHiq`#! z^!VBvyX`JJe-G_Re%~t<>;ol@UJ)q{hmeT!PYMRmvDCs4C{-?x97lK4e5$k+v8;r> zp#$@Ll$vdak+#Gf?BhOceMq@^M4w-xty@?<2i-w$=6W`oC2b-(k|&K{Jezi2H(i2v ztH53;^)NxbJPkxVkTqG`*C{%o%0z!`>)mx{`xGwt!jEMZgc_U9Yh7i$(+^m|zDeF$ z#ksZ()HpmE-lH_^+$rXIqSYUsIOvJ@U$Lbb6fD#HD+xMUmOL|}4GyuMIG?&0{SgeJj#)??NJe3J|-!qGQsHzKyD zd4?)GNte81%hO+C7<>;~^5VBsmVuwK84VGSEj<+@koq5c&AIF^6UmBIeW?t@Y?pvI ziNV)O>#OQM<2e?$H?gnq-;XNR*pnzVqwH<#?%UaN_+Pj4BDQ*(RJo*IG^v=0s=~%u zPpdTt9b5du|GEk>AO$W3WmDokW)U+95f0~pQNoRM@dcda9h@|Ef8YFTE`{8+a5sEb zySIr3&!i#9?4a)|POPGgIHJ1RdF41JH~rQMQdWU^coPAoc&XrqKHr+7X=i>7#N z16!zZ13RD|c&q1qwHMVR+*RDPN&fMkG=dw84ty_gx2LUg=<0|bLEPE|OVn9XZ7(#i zp2aL+-b-r4(_}N{@~_;Z_S!6C*|f%e3_BcP;YB6U zc;u*MWQ={QttId{-L=;O`VZ2JKS%HGWAd~E_|RE!16@pn31G`jseQW{Nj z>suG5&dBkST@k+jc3kd}!$EyJD-RZWMsF8=OcV8Yyms_l@LiLW?@k6Y$_sly&8E4! zmDO`Vd%vyAC_pe%5Gomh4RWQ!Qf~x;`K3tDFgP9+_8ebt6ea@ttpk?~%*v=#;RmzN zfS?$v`qc@<57*^UvxntTYG>i7&bw*Bm$h<8jI!C^*JM06kR^1p4tn{jJE%d+y`5Th z`Q9T2@lo@z<`?UN&Si5^`){3c##3@`_c@+&9#xdK)ApRH*T&SrUWjuxo$$oVcIsOI z>mb+z1lc6WLPR?-$0$c6+etl1ft}i%WB5IQj;3$qQ)~J8mka&j!Jx8}Knb>Xyz(*s z&oqD-JfJX5pFxBfF+PwvCID7#iFUH?({ZCR@~140jZJlf!Y~IRwnv$XGFbgs=v-0}86NOyl$YM29i>095qs|qL%FE8@)0qv2@F>XT@ z;=@s{3(5h(ILcBnrb}FSObW=h7=Y~|y-(8N(+?MT!tVjt9j}a_egkwON^800P;cor zzbp1v;RfeYvH!-sz$A-!-%@R*{gF{`l}Rm?Uu0Yqval^<{^#`pK=6qa0Dz__>I6j@ z87wJ%(EYSPsF`#WosgqsoI@WX9EtN8by2$n*e+#yX;Bf$A!3+4k+IMj6P>6zqReK^><@Zu^e)1t}5YF{{N%S>)Q0U$M%#VDGxs>coO&M9_ zN13M&nAQ~e>1V3!^SN)WK8|MP%c96cl;Gw0Q>zBXy~Oxr#aH&BM-84v=_-2(in*og z({KmHy@=?sURhTQbBmnqDhvqIuA^5hqDISn*lyRQSyX#b~Y%yS(5g%e{;+{HweRBBzbDhfB zG@IL0Pd8TW$GvvNFfy2_T^88fJwn=wTo~ut>ZAdAp^S&ucj`qov4q28BH~@9yJCC( zescj%_N65va&|{Wb?e6qz<4BAq%K;BjOG&GR*|d|mr1cBq`2K}@-BX?71T#{=Ctvd=BwCJaS_o(lCgSvO>bwcY^5_mo0 zz&H|}ceI2sc^O){>$Fq)g*B&t1#)2WgXvG+@dZ6r!XEL-`Oyb4Q0oZDM4Qf7zQxMi z-=KuKh1IYcPrv4o2V9?5EyFY#c-kVYQ*)Y_H<(^plT_!j_~wSuH{%pXBtJg zIC_WdZN8(?@Jh|YpV=AfrTcO5R&^%WQ}p!lhE-Q|J`_*W^FUqwgjXlqS}c9kO?Leo zK=TAaev|xU-_F}6K;C!1x!iIX%qy&2OV5wh@xDrbH$!qUaU2;)a!uyrclQ(f=|w<0 z#0(1&MB<||xu((U-bhs(uaJ&yr@`mYNeB9E%)Y*@a#*Y|SSjCaoGSzFq~F=f9l3e- zY?67sDZ3?ypCMZwsW5OYx>-5ptglmP5KSkU^%Md-LF>hvXQy{*HwMa1cfZg1;x#3| zb*_+eK$D)LRgR$vpq&;R_nMbM*cY{%5?ty}(;KfleQCeQkkmPX(zR#Impzc?6&xy_ z*?;Dj&`;{-j{va8o!cNZ7u9{|yV}g3Yv}K1EC~A?AQ`R*bZ?ds;ny|ZrNcIpHLnQiZ{ z`J~R9d@?I-XO7h$gi^}93XlXMUMSaq!|K~=QD!aq*ZG{QSeix?+)a*K-xby?Ov!$8 zlvaT4%Hqz^fBy|%6{`vU!xMX+3)Sdj6cA%G3zEAeWiUgKz+>yYNqw0NXQ9-=xOCR7LdV3F=G*1G_ZyW0U zZ)de|`xFvlnJTj0J89l>{z#Z2bO~cIrDOfuCgVOJ3Q%V)eEb%vTAsVoP@szCo#;>6 zX*qk#IAS4FA2BAT0B%JGqiuedo?l7w?+poSD~`L*JlkWd1`U`6FF~d?rkh&-QA!7` zoxxNOw%-G09KD_xi)iJ0e&L#ta}el_Le#X=!;h>_meIjs_E)&SmLTm({@9(DbYzz* zWlNpyHSs_zuO6Rj(B+5wyd+04{%@Amr2QLW#$9KdO$J3018-`Dk97WsQ(#S(Lhqpc#hi3^H{^;?o}SY{c9VtS(^Ee!HVIx>(yHeWD~0x5JDAJoxgT}=XZ=LD1lBP-ZTK5U$$azxtG1LN2jjNf=ME z{VaH}tl$F5;6Z@Y6${Ff^qYGmAR{a;c*jt3pRRs~@M#+bz_g2x{DLt6d<#qYDM8$0 zA0mMbYsb05Kr;?UnDn2cBKDB#v0>^+^3nt;FtBn-Drkq4HHL2T3D?b=D#Uy(X$+Aw zAJkTEV#?S5>r5A4FE~4F)cUz>$7PAzE(2Jpnvp+2Owp=r6_Sq}cOAF0IG1={cs8laqF2?P$ZOZDpA_r$FSJzCxgSaeP{{es~yhiy57e_-O%FM^+#){ z?hAX~;~!EMb75c0e5R@2<%;L_xV3Iyg#DndqZw4lG|@QJlGy*w`-cHkJ<2oB%5DEJ z!W73x`;=wsA@wkUWg#sQxcO8&(xy^B(Sz>xG3G>{rN{0oQQT3jqw_8#Hc6bKgy#G+ zE$P0+>*u%j_Zk1KZlo#j6nFf`f$nD@o=%^4?A~U+%6Tl*%4jFmA-fmzK$x}O?2f_o zS@v6yLY;$qPMC##g^uEK*vl8@@A ztm#i%H#h4w2)pQe^Jt#PSGa6X0^zHU%3%L-c*y2Ggk0LQ5%{eL7E31{P-|7T8|u(K zO2`iWXI!=K?k|zNZ)!a|V?K{mw-sO9(J>tmY|Br;K0mlsta$K&rcUaTfdUjY3b{|U12GyDM3 zFb^ju;nyDP7aoN*e}17#!oT?}o*s1^wQZ2ffjwrT;CUPaQ$XYp1ig3Q+T&n&V)zAA z*>#1RNr9FAnBdK2?#+BLIVJ?d4}if>WXXsR#cu55xAg=Z4jo4^@_G&bK)DWLdzZy7 zqVb)jI)@P&`87oW-;__kQha-*atOYsvu*jc)8*Ov<$#u|1eQQ5s^rBjsD1TbK42MB zT=mmsI1$*AfrEx{806AnYGhyiQ=6H}*OUTqp6ubl?AVs<(VTqaPG1mpkA>}03T!0- zB<*ey0a$MO76)?JA_O$o-Au4I3~zCK$|Dve;|_5xq>n+}B^mr}YG<~q&E7^gch!^> zl!kZCTU#x)-*0Qe>sC(Yr)bDTa~B7h&o^xBGwqt`8Z>XT2PZ33pQr{^onrXPC%UeB zKVp34@RJ;sD|K^_ztOF`;aK;IHO&(WT0aUE$!Q12=DX*TOh}v_%mX#1=XZLYa8sm{ z7)c$~MK#|o&gy5Nm87A>R?wuXsF0%%{Rz!y@2Z0`6Yr=U#;t$yEpK*x zRE?Nm^^uMU1=;=9=B{ZuRme*DF#*_o-3&Lvd%JhvdeK|uYm@>ha~hXjD^+`IMvL#_ zt}D)_qtnT2qdzIcOH*gPAjJ_^Z+#p^@;PPp0n@kS!Al8!zS(wf9QXsHd`YdHg*dhK zRF){!>r^F+ZoQthvk*t8;^-$ggA)&Bit=M947b_ycB3}B8(RNQm+7@=+f<`QO%KRF zvtzFqEJZ=Th6Me1sCdJifR50sqNnQMb>3LMS6ahr)B6)nDvRFL%h zcLQHSI-HjOUc4}3Kt%u^VO5Gvub_mwcVK3kSkFH%}$h!^wm1O^lTOnfa3LT^V zuW&Cn+~L61FZSSU{B^c;{a3)Rt0UmqCNo6K-LZ;`$YMVD%SE-0y%#E%lWZ#C0Up!6 zj||D6D?f83&B%vFkjg|9=?L){U$1Q}*cJt?U>tq))K0Th(>HxFTiaIYZ>9#K*8qWA z1bi~QUFDpV7<+;2F3ih9M`XOW|3yz|{%_XTkq9s=m(Uzb8TA=1o!#LZn<<`A)LlF# zk*dak3@V~uszw~U{)r0iY1BiRdui`!e8n8+yq&}4hd<>T>eSDnyon5ZR8>LVwRw^b z04IuhZmI8+l{u921fN{hN1!co++>Ncd7B!lR2a@gp!2%P1gg`KF#!zfMhh$zTu3)E z#s4=IE>9F8#aUUfAf9Di&oV4bjoNc~KwXhpJOUHwsum_u8&HUh{i{gwcZc-`Bq4O% zmr#FnW=B>YD^6f%u`o~v5B-u~;8L@7eAP+`cRno(0Z(fgv;FohQw5mKIA^Krdr-B~ zFLCgNBL#TK@*Mp*p8Fis^!a-ogg@`F3W!zYOR9=Gc_z;M!|_DU&iqdl^3|`Qk!L8$ z<{h~`n?_0SW$`sTm&^{y?kfNUpTxWyMN|XnHFnP}QdDGgr_q4?YybDrpYXc+UlycP z@~%C>N$&(rkENz`nEnal2L+|`F>KI+;#}|Wvl%xB7h zs?VpLzuD=lloj=RrQ7=!=T{1na?aLdZyhJ#rbR{)BENEV^a++ob*BBooS!!dnlzVI z5v*sdE0^whXrF=QY4y{F?Uq-^>knE?QpEBg`~5vXhkps>Y2dD z#WHnI>W|KXufodoYi*WmR6br#cXAEoH9p;P;R1I*z&DC+&PJVlB5AcM?8q-&OvFpc zMnU#(g?_Vtsyb2oP{q*x((-!oFJw|pI@VzF+%j%}t;ln*HVMOsE{E>4 za@|Twxw7zG0d24Rcm2B!uO|8{4&n@ z&jHRx^;@#0}VinyLWq~_x0gyfrzI^;y zq3+Pb2W8;f>n~CZa&JDz3Y1U7&m#?IIZzdA(H9x$(GNkVEZjzMeB>lbe8JQWZfVzN zm=%w9agy$#h$9QqdWn16eC`!1fa=w{&VuB2wS;@lBH{Q(E?@i%Y3?^As}nKij_W$3 zmFj0f(_88Xv?M&SZthN`Ifz6U@$3H1qnh`x)8EUdwEV0odMqYRz7xuHKmx0>r{aiH z)gbX&D;5D`YksN4b$6BvGXN2X{8k+V@8{~kL8wvCU(T0ql;sm|D%ldoVI0SUZA!j&-b#oMxmqLcs zj5@sdzc;$A^cR-#6sFh&zgEO^we<8h`f0;gYgA*ZZPbD zALr&7lRKtDz8DHRHTb`;;ophH&o2FvgP4Zu_s5QHAx7#CBN552pI7BOb1?)rhpeor z&i?Z)ua+^{`Km3YL^o|vopWVQSr-?_S9g~#)ZDDOS@2<+QiaN%Zpvh zafGQ7upg~?CZ`nWil!Y{cERF|eEF9=zy21atv(pwzDE5u%CFAkYn>$8EC<+QJTQ*T zN0!~TwJ!{}{V&Uhu$X(mOX}u95#6*&+*UYfN)iKMk@f8@#4p0{pk!2ma&mrO%g>J( zxDY1p7K7IwYbc#7OU|=5Au9PSiVP9<;6HWujXI`y2tUM4c&ZC_1(Dr$5D{5@&O`^h zPmSizgjVK*+F7L6O#&dn`(fzoliai7>Bg)W)rv3JOZTnjPAorF-To+Vkhe!c z`3&~AZKAqmN?j@#z$NJ&-6tX=TWs?^@+TP!jJGjXgy$IPIe}%4y{Y?q&8@49?G>|o z2tm%_J{*icWnG#JF<0sg>ljK+h!AKH>FG1U=`-DU9KUI!@iX@D7F*v<2*``%Uf8|< z)h_KW62+MPoTc712;I{85Xal$WQPg#TJoL-Y3blZ6V6UFh+Z#$>=d8Nsj3WJz_b^?c)ejd*w z?zP{aoh}pAVyERhtDgO~#yQ2Tki90is__q!f&UO0I;S}U$&lQAk6a0y0*NT-(=wO@ zqSidC{*`jQC*Gu8WC;XTkleo`y%!_7uh-f9nhaN)hes&Nd#Bk3Xq=v~&l6T)do3bs z8gQ50I4d#T(GDt_H979cfSJa6$^JAwyA6QE2T<%b*e|5_^s93(LEzNs*iz5*YTha(DIpja3 zk1s&kQnJ&4n0=svn<GVr27;@x&0*v<9($??GV0N%L;2|lM59v0ZvL|8X zjVb=Kw}OPMj~^xnV+O2lI}Q7k@~VZZ`pd!jqjRYn;dW@>@{K&3kFv=VRe*~Id!SQbx|8U)M7s9zIF~2|7)! zmOu8YhNa?0BEF1c7mD)lnv_rKC}s1#bmex543@_5b{VXbt}yayAm|`VM>nd%J=0Wx z8A49eLHMtIZ;f+tp(55V0-KwP&DUuiTqVwn zn-zm5dObJ-)}AZ(T(#MC`@k!8x}YzQmu{zYwb>^|youMj;8d;Y7Jk)yEkKT|gT?E} z+!lV}w27D zzp0fr;${k0vyKbmdQ7D}LWym9(aV#kAiqWg)7fsaNOlXzv|*>KZZnKtHlFT z14C=vY1rU!|Dc^FUc#r1gb$O^%8XXn(lcV>j!Dd#Kt_=hb6BbmtfvKFvS#_MWH3!N ztb}WXD;}r>d}N{C{o;?+mAkp4dJC#NGdD!1rt52>FIq{TINq>zvMYl=P8>D@IA^X+ zOw3hV56zp21xJ|@vie*o(>^|DWcAr39xr@(rnLszQM0I;x@Im;fF|4zn;5hn#9T?v zHhar^Qn?Gx(%}OoTWXn>dTp95Qw4LkCTmJ_x6jR0eeHVRc3MU84X*xkQ2v>~HACet zc-)KDMqHr#qT-=5+EKLhXGb51Z*-+LnN?R4qh^>tV*s1>Omm0;IKoe>3*^6~j^1My zMi?Is5(MSQshQ3suEZJ{6b~GGge96l0tDF_z}7I$8#>*Zg@KNn@6=P(|2ba zWt;l5FP6#OSbo3ld);Sm*T{<&%K{oVM@qNWg^0wkdTo3`geIeaXZJn)BUX?#m4s8Drv@CK88JA2 zIh)`j5}1HiUkr)I*zpg9t&gm1af&s--eBf?< zc-$@R{G(7WUjOO-kC8R}(lYGx=BA>m$=j{27ZzgfC?4*KJG=jS8JtsE68Vbs3PfeM zJ+|xubtZ-J|M|x5*>o+qd&jqw){W;KstsBgj=4CWmV5C$1gA!uX$j7i47Ck|xQu{IUp z{s;^`?xLGFz?#NG-awXaO0X`uQUHz*oa2G?men3)A@X^|w`L=~f;9KEY`z+9MkQ`0 zhfbtEX)&_B26;pPOdZoYI#3qQK{umZT`Tzkkxy9O2GUF`o>73xVA-zY$G*aa0E5@t zjt5J;mZ*C&^ZXllJ&mgbLXNH=N(`x-9BmPF4n1aHq>}1XflAUMJk{CAw5NV;@RA zt>2ZWU&LRTT1sz+%r`&x_m%Tw`~(~s#NL59U>svkngecU;#SQTF4C3)T&}UCzlMv!{w;N zasc^D^38|Gr8@&N`fMp|J`ZUz$6_(6+xqhPDNvr$(fcLBSEI?D`2RJUm@;ibG7c@f zj+j8944chWs_J5-+&J!Inx~5SJ#eRg+uO2m zr;Rm`(~Ig7vlT%C^nBSn`y2WyfxmX zGjo0C;H@r{)`7wVisS_gVXej5xo(f^$<~j_M@r9*sE8*H?j3>QL7+zIOVW$A0QDvH z)QBK;Z%;;LkkLNOkBL*Wplt-w`(s z)}D%kZ^@=D0@|}-@k@9(YZ8(Jn?SA>HzvEcP6Ie+R!L6VIu;%?UHtA#OWXNq@;d^1 z1!(HbROY*H8h`6wUi__ftl~_-y9?<>e10~ag+0DXVe_uBqtN!#oIZ0 zoD6XZ1Pm;rw~c~&Gx^I;B0<1ZEgHduzQ3M z=}3WJ%4Yps`7En3RwUaOLu={@EUN^-E6ak>PWBM$f+H@rp8qH9a13Z1Gd|DQHq>ut zIi>zF>fc|6p_*~=l$tZcLwj$|-N*xkT zL=E@`ME_7?*1;Nj@j<*i`hs3O`n4PpinFd#7Gs<>QV;LROMKplzuXVSz>z0H6p`4( zMh=chseJ&vkBDpCMRE*yg1o=t!IL|^Ebd+IxA+}4%BeIH5S?H*5`hob1n~2=NuHqJ zdZKk^NJDoe=EadFMkKn@^GhKpUsxXIda-K9^_I(lUlD;DcPn%dSMPHE7d{2ilbo)D zN*ZWw<=>rn^0~_uuUom-ai%F|*zWBh8&)sBt~2es_Z8%Ngl@ z6_gZdiN)EX4A<=Kv+`QP?LbMwHwFkc?^n2Hxw6HQ$m$LcbZ7i!eKv^f(LZS;!ni4` zHe)33umCjPw**yq1qQrIVhG$Cdfy^Bdb7M88P}A>ZK>niqfnS%e(mgG0=jyDNx|L&ljb zdA)F2r%U(ms}0|LcID1~#w4SsSuyAf25OcSsne#sC8Z6y{yw5^@ZvSrWQ|}{1ritM zlG;vxHe@x?Wt(F`I(+(2hilhEIA?)EVKqp;ZXO=RIDEmKNwpq1|K-+!&Ua+uf z$fBRs;-L?%d@J;_%l^trc#?$Ll}4uYQgx3)Cw?x%dkolZfZs^t~_a zKb@XF)2(DiU!N)I#=9in@Mz{s&`;V*Cctp?L~)Hwk@8+JPdxvVG%^)UBVO7SH*oZ+ z(yWu-Z^2Mk##tEj=7~c>hj5dx`lfvVVqwY%`(2oaT^l7-yrmGRm=!EN{vIlJLbqKQ z;F)fts;vr5y!E!CJu1w4xQdTsoDfUh^mA`?Mr{d<2T)j~ui%HLRO1Y9mfiA6!xOZ* zU&?C8W(E7w79?=?&sj!gcq6R3V1b`HaS!4dy>%izGC>6jV9bMf`v0kZq@P}5CEh(v zlI2&Qew~v7L8l9r{whK z5$-#Rf&Y<-ZC^^l8v|CPd1wCI!QCe+zJH*)NAu~4_mB#p!=ePT(4B=oYCKp{nQ99m zeXtlnd0Q_bdx+yZ8Hi+`+genobZmU%*^w>dOHR)@RYnwEy12>oT~^_5VArr<$agib zEWC`Hf)=lU&|FIDwy zv@r{ntBQh|ANva?&e9f9qUilZdw49iVxj1=NmKYTP5=DeuLJi?zT+7UELj|5 zK_t2^nClr5h*1fn-o77l@Z58@A*7s&Pj z-NRGG1BUEz%IuH=2cc$fAg#>h0^5=}AZ?46adkSBkL7fGQpJ%#jLRKWn1x*q^?q(5Ye1t)2W-{p1%|RS@^7Ab{|6yK-oD0X8R41ulyn=Qeq|re^v@z(O@9U9GX0hG9si%_ z&?m~T9xF>5H#m)#7{(D588Pu#yGSdPy;moY12(ew-+m%9!zgY2z%Y54A^Mc)K{N0zLT1KRSo} z7_Xs#^nt}l0@5E-K)NNpu~1AquZ%`}>ubCtJcGWh;}@5~W&{1q=)%ZjdXJ z(HEqzj2stg{6+2)(i)oHz2A@qNi{WLE;#D2LhDED(}AikeL`;e!xALkpq7mafj zc}D6S;!8BjJo*S(SY}>Z?A2M8HP+tIFYEb$hgnWq&z#AAI?wqz_RG!AfW`&9fho^> z3<9sc_eUgt(dRu3d!d>4F$a;%Z@B3g>!pnj@Bew|r>yrO1?q?QRWs=2UY(vH`SjwX z!~3NkdMTIJ`hxYM=0|CIxksm`KA&EkbmV^Wv5>tTp*xw}jvT61JHq?8yf4lB)x2+; zRqhkwa^G7`xsQivADQ=$D=7z~NRUd)fuzIx-Hv|JD3^@ikS$#YwLD`4Jw8|CI^WTd zfnHvHgZ)fLCVgupclmVauICzM)(k!yxTFv0`i>Ru?j{A;5}e@7Ej}k z6mX&kG!Tpxz~A(_zi}Qg0irvo3=;%Q_JETJP8Pu5SeLAeX#%EO;8X#X>I8xJ^-mLU zx`0ac#Oaw~finaY!Hd%~OTcV`xdQmxAWNKi1ZNpwp@78#<_X|DT_V7w>!k!HK4%M% zd^pY$3w=prIl(LgoGajb0m}u5vmd$6W1QZF8yXpWmD21ucX3esKP3J?O#i#+^0*CQ z6`0@o;C*cQ)`vWcA@O?~@Ou$HpGm>?4BJJyuRVaiEr9smEtV-h*CFrs%o5>}4u4}h zDC=xU?lI4YXkVJ|`797J9#6pdV<=5M>02N14gX`^87cHo!9Mdn8ei=*7h>GiW54-c zEr;c1RP zepNp+%{M{SKL;ISeYVk&>$!YqiSO^%LA3UocfJRzo@9{QNr%^8^Um8q)tj_=8(8Y2 zgI;-^o#r%MG@m$I_ z&l;H@a*YRPhWYY&&X*bF&LVdptv0L z>x|;+H9O9K@hkeCUwLn4HWb=Mm*2WLgWNO8ofn2b%Hea#ogaRGjK7~n?!xf<-}Cnc zp}%}ra|yYN$z2qN{{x3Fllos2DH6k$l6yA9_oY?{-Eln`N_o*rI>G#3PkP)1@ikk% zZ^7;6N^;MEs7wTOuSf4;4J6%j-itg)oR3$(-1}S0$vv0c^TDtDuLpbizrc{zH%XZ< zm%a0$xH9j-_pzhI_u*>rMS9A(bK3nwes^o7lm{R&9?*1*PpRAJp#LIrFDCawa@Uf( zhFoQYIPFeo>^&)re+f9p?Wy|?%9wH5xaF`;_ZqYQ66?&X3!r05Pff;kX4YE{I+@B> z20G62rRg}uiN0NM_C=RD}D8HTz`lfk|Bf1j={fVSQi93|igmUBEoqZJlB#L*kl64wH>vGeH=2Srwb+ljU zh}XqWCwB(LJ1u9v;du2)mCjk@&L-MtkW6zRT8EoQyyif3CzbDc;dl$jSbXPb0nuAT z?qVhTLWug9yCCXwm_E|Ou^8Vs;rlCm-()%Q<+~?*A885c@F|F|HL`yAehTa40@6vT zO%HmJ>=%)&s~}ltE+)OKHsn8+r9Y|szm(j|$i3W<|7!(Jl>N^t|2dD=k-MJaU8!V| zWn~k&n+bPgNIU4Q^wLPOZz+WxAR1dKZWFoNA>3oxLA16J-= zK}BoZU()z$ZTrhQyat?OlR}Nw8`iiJYrkrZJF)hw*2EHbuGHFc;w)w_N4O!qRk2EJ zSi?@uN42KrG z*w@tNKyaAWNONVf)D@@HVx+DzX=_{BxcyV6;vwm&t4^u>)zv3$gje%-8sRluCCX(4 z*>J@uH67~eO<xokXmX`HOT8N#=kK(dYPedX>%lW7Ib8ZyS8i@hiKhEH{;v(hWGiSl(aIP3GX8h=_G z|LZz@dIj?5nU0(S_WXbh{o<(^^>A7o-`OuB{^{Us7mQYw1>cJM#~B&ZHxumbw#EmK zcJz!mJ>5Si_|Jk&^*!@dz}es|H(&HEH*>(L*XK0;+&I2A@1?B~>-IY~wC>T`bTB2E z^W5TnLyLE29A8@#d!E(&dgy;n`Za%>+8pvsw%}=tBG0>uo1?q-wf>c66ueUFU$%7W z?0(K9zel=l@+Dr{uEdg`j1QLZv}$-3IP)tpyqOQqX4E*%a8=(0V9!4cUl%mv?cP zH=jbKzNF@e(ouhG+5|{WvYkh$@tpXYPMRrj;&H# zSEN}*I!kII$o0rTKr74W9|ZAB;?zu)4J8dXB;8Pio{;$6c)0BGYVbvR^cZ^i5#bS` z|EuihM`KguyIs$j1bHA4fx>?nl3E$he8^O-kf$B$97KLT{1{sSx6xrf zmC~`Lr=}YowIJgVrj&}aPv^}+3p@{8uasQHS~k@PKD@_QWiO8Rw18!`k5m6%F9@1WK91V zRY<>Yy`BZJ@k}-A^%pt4vqS&;**`a9zRj(Iz8rkVRfDg#4n{j40j+59Jv?=0ziXF( z&gMTy|I5jsm5?qmO=t2aQuZH9$>lSu*cIXVQ!Fz5hz_m>U~$Hwc3+6w2jV!b#HRtm zp$Nv=Mc)u_yn+eBodof-{n!-Ith`G`Y&OMN)vhqkrh39t=fbj{OP#FogE)Ss9U8;A zRp(BP;oNCOJ2r-Ms%dssojW*&bE{R^$uXRN?Uo&#K-j3qFpp;7d5K@(^kg#AB|7E$ zPkhTZ)Trq$+nAF!5`FWP@ooC8=6A?}4?^x*Fx!yprM}~j^Ji{n#McCJ1(o&4chR+N zrG5tBIPyL^zX!&CQ#=#M`|W(6U4GN@AkcmHTzARO4E6O5E>H6yy3dTRyvJ<1Q>>RC zcxsAx>nXqF)RdPa7D0TPxH$Cl+r6==D&HwiTaMuVOnxeO7*MX43!&Iy#`3+=w#~j^d;J#y?w>+$bczK|^=7;`L%EO8R^^f$HLv*J-OF1~VKsks` zaER#G+D{2}kZeQs`-sw}-2jNck0@;!+knTz+6MA4Pmu3;q`lEGil9LNzrQ#}z-R*Y zj}@TDz#8N`eEjC&6aiCnz$pY%6rAP(S@LbBfHP7+z8!d`1LiAO=m|O=!W;sA@9%5_ ztPpUH0FEAn#uT_vK_kHy0oy#G zS-@_BJpx)Cuvfvp6lfQ4AO$3@=7VsM;E;f;9dM0;Yg6EQ0XL+8#MOKlq?{t3a*Z7? z>%xUEaNlz&xnu{pyi{{Jx$DTilH3jC;M41$q0u|dKjS20TQoLJ@V2&>yh8knnCn8(s!PhZxd-Yy`zOVO(NaA z9iYdyO8%_l`ERkVcYxP;@&Soo6 z7C$-4Z!xtLEJrK3dm*_z-Ftg;Yhz3EHBE$r{jyq{o}kyGdq8}SD7VZojK|8DR^Ece z;}y70&GuW>+Msid*RY2B3DxdT&})mfG=jj9Za_479WWr8Y5D?4&S8D#R6XO6tFPW4 z%J~Azy)X2?$o_V6+rsa+9*OJlR;9BSbl=%7^y7%P!WFN?_a*+`0omGx4k)f3c<_Cp z8hlIm-)6c8$UR8zA#(8zlC(P4ljI)?{&h~CWX1nH|KqyYhiItx8M4;J#0AKjlyJ2_ zlBq5`?&ymsw!`M%F>PhAE1Li+62>OLawwBl@eiq1%d+CDG+9OzhoRUW>)J5h_f(7ZJykLu)h*9qk)4isi55%7qjdDxsq&~+ z0FOdVt0^W+AvW;cL69I~9q~!~? zZlW!OAj}bfJ4$kOkF9FhR{bjBHNPM_3j~-}6&DdK5x}%rpW4F6A^|qsWdx?xQ(moH zE`V2cO)HpL%duR|l&hdjS6Vlzgf_2|GOddUcr|pnf~@stwScU0%9YYf2`(4FtEB4% z_^y`9l~uVy%B!YZ1+a|lmn)^)1^C3>AwaIO`o!HOphbXdHI`|ZR%6=~xadf{4h3wz zNv_l$v;ePsG9Irk^9n0|JDd@2B)C}s*J<`Mj+PzaZ3=w!`E~*s?-m7|r|%G8Yil_C zodVuP@E!$BLw@@!1N^ms|0duz0Zfbi%u}aDuiAfr;DZ7_q~Ie0xbELU@KFVK5@hWs z?i9fKcIis$=S~CsEy2eGFb(!Ij!wfz4e7jF!N)U#j*sw33w%nzr!DX)1>9#nDBv>| z;P8h8JZyo76g)!kc@KC*z+(dbf#3@QzNp|!1YfbhmjpbO0UlGpdV5B|vjkuFfM*3f zC*XO4ZwlzHG)g(1QSgEVULyF81zr-+6hYQGFXH2FO>GYdK6NDYe_yY(VExAVANJ|; zw5>d4%Xfu&^@U#o=A8+gpW~`F&Wn0Oa+L<>ZhTs{AI0qt(aI{nh&_<-2NVB6B!heb zdn7~_ChH+O$;%hVHM-A{w(H{?aw;9Oc2e($^t+mAVJ%_>)BAERtsd>0=>8uRAXy`tynYVv^^6 zAwzbdsykg)TWnkf?q(q zZeLgWb{Fxu9^$Wb-$?FF5WN6jPv34P|JxvX$s6_ec9Q2IMf08H;+T4ZqV;Y?>m7m? zrw9LIU+`WC$E>nE;<*0(5HHKJ9lnj+zajd!Lc9!0+z*obA;P^KqVlG3?;!W1g!>VQ zm!V%myiWWr;eU+WyD8ltr}%dna6dury$bgpNY&#~%952w=xMn8F@HyiBd2$~m_c4;;5h$r7L43YR?zf2F^Foi;ksgu% zdm-N5F|Un+*9*k!MdEe0;`MEEzeBuU61+a7^6Ye>f28p}2-m|=Uq7I5nHMP24ogzksL@ zz_R>nqW_x`jo(9j-1$!w|F?pN)cH>x>HKHn_j|$ncf_kSX6b?bFV>6yPI~yGp!+`w z|4*dzKayPkDs=uDg)b0s5$AtVp8jug{|`ic!T+W7{9Blw9w&mi4F7w{x!jV*#fCKg zhe+e=MB_h8&RR<28%HsXmr@$>{}n2|m|vwqWuSJCv)=yOq4Cvj^)AyEu*6sV6SwWu z?sekX+}e1!wivv_#ov`~b;~ayR~@+JQYUVH;L;oZVsq-%vzE3rwzscnYHez3?AY6u zqC;hI;@vLV6E-)u?rdsn?%3S0=RkW$!Qp*3i1Q zbsGEAl&S1m=o;ciX+MB|T$<7*Qy%^F|X{Mhd5JZ&1RSv|``E3Q;3OCrux+W2UGNLN|@ z&~$&QiBMocWLVQ`~awsfNDumUk)lNp3n`2PK8W3!UucH8K%>w+G{f4+T|GW+m;9X>xEuC4ba>coOLe!`gI!g#ng1F+AM#@o}% zz@j+apDDUOSN>n5(OaCNmnCk!Bt%l)y%ebrWxgSykL7NCBwoYmOIh@UY;WN71`vrwa3P> zn=2hx#`$XNbX;!M5nb!tW1XAMZN7BWLm#>4^c&pr>{s&avB|U1P3L779qmfGn;hxP z(SJF|>@GcRj)$k3m1>ORdyNxZ{I|rzQ?0yijpOT03O$#wnS=74%Ws21`T?8uRcC#b zax~?WL-+grEpohKEC1WUSs#DtTOW70=_KabJLC9go5n9LeKot|d*}bI405~DzZ}hK4Xg|4O%YlxDj-5?yO%2WM4Xt|{qTSG--fgCn87{RSPEq@H zU@s;Zem&$b%&u2;eAIdaI4j-@8ox7+uTPmw;3AOcREa|e6~8Q0WBIPbF^xAmbRxd% z7wliKHEuV>cP99Tk647i|%dT-z=~A_*S=~s+n)~s&=(<=pi;H3h1Djc%oQ|9WM?^)MD?V;2aczbK>L4galRo4mt3pV*8TIuYnFQD72#EsOtH%uA_@&4(G@8ze^Zt4(C{iKihd8 zL{DmBMhy`O><{saB$#PNOK~TjT~os5)BL;jyiPibu{%g`Y+;TI->d-Bo3!1 zRxQ=x^u$qKdC2@V`tMk+DC7t$@==G=D>}*=5I(nX+_G`FXwj}`Jk*=E#K{-GPbB;k zAu_iF6ef*c2c%CQi=HP~==4nS%jkh_QF98K=n z@Ouk?A4l#4zg+7$BJc|=b+0hp@#Ib*;n^xPzYY7_p5W$~TSN>2A7O&O?gs9wq0YjB=*YyPES2j{$q+^FE2+jqiTH zQVqT`J<`lIx-C8DwdMc7H(wiN| zE89{bdyZX4H_P@$Ao?K=+jyKChLue)pC!^V1mY7QwiknPVIRtq+*)#R{5Fx&yGEqH z7tx*%Q8^Fjh$?Y(UCtrq0>-l zn)O&7#}R2``9-1sXUt3TtKHJr-emaRb6eAv1JdYBwT9Rz;9{s=fnNeqLnaISQpjK6 z>Ddb|@cZ9P1%4^~|54yEEoVdZ%EfYsIwDyvq(RlJ<${c-a=B=GGnI=X4Wl0Ia&Zp1 z=Z1WDa~jY0)5#8r-;INhmZQXX&r#yLw;FtzZb0X?k^Xt)UYIfeFFZ>5-_3mYR)a6n zyMWw_!}!-RA9b%IZIXLfPD+^`MEQL<<0RKf5B;l!-g-g2Upa?xX}77|wqF8KnbU*Z zUP_nhS9E@sC#kEU*!)~Y?%Evsxiqey{YOzhg7ve8+{<(5=Zd&~+K!@r%9HQQ z3)atNVZ1Au{*`|6?34IMqdhK?Z$S4{knTD^Ic}5qM<$=%>5N4dUk=-%}2 zsRm!9x6zM(d5dS`QA&4_e39O!FkTJQZw&pN?B5*vZ)E=#KY2SPe$jf$d%|EVL~SX{ z$g*{ZA!(m_U8KH{p1P-%Hm)0_HXCC1umTFtFs^gbL;0HA^t62a6}?xKeEn18Gv51h z(EBCl%XV^igx|9oVcsM0i_G6oTN<2R9eWB5I@)$yBzejM==MzZzTV3Dm>0B`qj>8f+fW`+I)0|X4R zzyJlu7=Yy(D!_zi0=B$uvSzDcxB`=f?$IeQPQdsSU<=s#;P?~*lVxm^Woiv3+!+K+ z56=Lxm1OkKRxnopw_@`I%povYqxOL%1RNLTSxS(V*4bdT^qdCg5a={X%gb5lohRV@ z3~(U<^OU++no$O}42^V_5nN0#PkdWNutvZt0j!I)0u~dnmFFu2@VB)J)}_EE0nBr= zfW{PHYn7W7Y$w2J`%Z#p0lQLQ4?(kny$;w1sw2zLmqHV3bZRQwdv9-GuQ3w z1l&*n+(N)K-%$auRbZsU7McI+7v+&rgzx4a9S|;uC7qu$#MkIIF%M5+vbnqV3 zz$01x z!;wC&z|rOEn3dxmlo#Wnd_y#5L4F9u;}tx{QD&~*?3NneuEW)17zwirs$A+vJd8%T zWPJ5_Mw&%NP2c#WvF3w6(`znBUs+*H=%o>h2*^ayl<=27A_l_}~+mmUXk-lu}n{rLF zH-TJ-<@L+H#H*hO>kr9wO>VPr$4sti^3pPg4-rrwhdgZ^>b0gmOkW+fmxGUx9!hEI zQ4`YZa?d5&C3om+At3&c68}1EoXw{onoCLeT?RhO2R+NIxXldPoeV$`8mb0l-uYqA745Fg=aV>^hZVS zyB4`L9b?Yh=x~mX=nTKfaU(#~&PeDjfZG}N_Yj9{&su-J$<0gv#5ea+{>jH1MS`*$%ZrG^66j_IHU~RlRuZ$uL8kl4x^W`>K$$ z&0&{o6t@Hes-|Tz4(O7Q>!$6LgzR_a1fA=Hs580BIP*)px@G|1vWs{%j90@aMcSJ> zmgAE)?BBuua%pryiDuA4%vH({@DaaG@t=EGj8iM;)13QQ!smrL2{uB!*X=?1fF*x8 z`Nu+Z)v^|%Iij=@k3BEWS=bE5Sc;En#r@BIK39D-@p*#D}k%t`vN5zx6o6#nTp-s<=D{8%c35Gw5e9 z=>YdrM^W6-5boh1%?83ndU%3k61j+n`@(yP#(3hfpZpUjJv=}Cyy7{TcupZ&xNm!_ z2Ty!=<-J7XWTO2(@=r_Qc?$77m1yA`8;^MK#5LVd3mTHg!%F98P}oc%1M3{)&!YHq zL_W-;_*f>MCwga5zAPYjA<>;L;v@ZULj1AH#e~0<@Rtz&GJ(V8e+9WK33oX}^Y}lj zbe%`I=ac^e@?S{)i-^X#B-g(}ysY6qEcQ-V_Hi9_J>l=7Z@ji}NvX;Yp*&eb`LLGK zjWn>lmCA82K+tFjzjf(qRmeX$M)4mjc>F*1z5`B<+GFMd|>8T9ulh&E2jH98PYf(8i(EB8sc9}viJGQ}e zBwItJy2?5c;#rwj@OKWKH_*7#6*_NF=)4Nirz`uyfU+6>JdM8;m0jZR+_JAQl-&;X zx1sKAY-GAt`7}qY%S?&lU(;9&#tZQmt;>~{*0ZCPLUCwMHkU0`@;mH8cFSp5=Z09_ zh4;9qjDfTSE*{mz5qKY|;`#~ts?YUmd5X*DGrIC{dc_5#eji;nc=#QJh7?_JshtT) zE?+P1H0?=MLrkvXQ8KptNjK~oDdtDK>y?*s`j?(Se{nkL&q_7Bl#{eHOcoSF*Cz|T z#4HPnJ4%%W?U#pGKIM{UpBt}FinlsUcun>*S~OV(V=Zk5YN$?1)j!X#8cL*zQXF@kHp zm;}og0oMage{@XFE|JsUVM;ILPo-B!_c3NVdQ>`&mC{?iYWz|e-;2WPwMYKy;sL?Lp^RJC)3Jz3^fw9EBuv8rq zePw`!i!>ObOg2QGjsQk#nHNx7eGPTBIg0bYTkt>2pWQD=Eapvqhj?B>qG%cq-x4yF zr>#9XO0!&s?`V#{SKvPu(UatZQcL->W8}x-=h6o9b2-A*2Ia9yhS)F0*RJ_QK)3U% zkI1LU)vI=oCElrWd?l{pRL`ge0FmOOO-w8zuGZ!0#ef`v*E4YXw0JG>^Z_367qm}6 z`HQ^|UZp!JE`g^}S9)78abx^G20}LRi*seoahm!zP{;H%qFjb=IfTa({|F*aK;v-d z_!O!1nXlm!+z6x=r-D>v0?mqpuYc|m#jk+y1peN=T<1gxl?iOf9!1xYxdG!L#5dtl z@n|PBL3r5n$qTExb&SG0S`-eN+LY*_)dcNV8-IR ziigp6ni-#wPb9{k)zf3(v0!4#@}cjRSl936Y4AA$0qp^hQ9#@eAy$b6^oD@24Mh4` z2!ihAn5BTYPlMSZct5*%&(zAn03vQa(ciy;VZH)~0UVBCK>!@CfZ&g~tK&$3MF@^E zz|q8icZYaB24E?Gz$eNScX{aU?l6^kJOXi7hj?BAFaRL%i894~A14Bwguqnh$p{3F zRRH4sDFJ}XVD;DC7b5P{h;ui{xd3M>a9#k!x$|Qqf{PNuMg_z@8JiIt3m~4^mET(t zsCQ$CJ2S3AAaIChk!Gs`ivif(8`mJv-LY{Uz-D5mm%(-fqHl}m90HM7Jc}{}9fH0= zfGA}b5QwtHv#D%R1}k^S4{^`nI#++vmyFWtXmi*&=>jr8GWTMoIoS z;W5)0uGqFwHbgVkh__ISqn_ewEPND{#WS@f4l4D)yK~?j%Y(mIL%|VH_R&!GVxaeYB5ws< zg77W{yll9;TEQ!ZK7scHz2rM;k}x8!w|#!1qJUl2=9{s@AVWO zLh)wcvfrcd zo5@85>M#c7+(h^`Xx1;Qz>7MBYnb-b@8zOc@&zm z09G3I-%jBLiLu@ZSYJ=L&V_3O`)TX-zc?}0Hv-l-DSV}^*Z;D_SlUGHwqE}o ziLt&Nu)YI&R2L8XY3udBIx*I}04qDXvIMZwu%EVG|LYQCy$7(~OStjg#lwEudi`%m zjP*T$m4%A|D-HYK#33Qp`vB{GTjWLJ(xxykz}nQYTSer#+z z%egH#SdvdXao1{ zHet=KpP#GewCo5cLpk~6V}o*P$;XB{MmAV?g_Vy_FKG@MMP|bc%7%5GC(F-@a8i^r zOg>g9CysoqP)-=BthhU@e0%~)bKEB~D`s+5xIQ!uFG6WijuQEJp`82i@j^N0qw?Zi zVddkaHkzX~k$EwP^WswMs?_i!lpfPT8_mHPA3qkE`EgHJ`B{Y@M;Gbcg@+Mm(Ld#dAb!SP@E!axlcl3gsY(j}^*63zZe` z4l5rY#Lyg^h@~^OAiukY7ooJoJk;Rhg>tAt<;6i^o zhbZOF4Kn7GLk>ynrNytl*OjmARq@qJIs6d$z`k;*!IeepSS6vdnL`zf_XIKSbaTG< znoLCG!ZIImQ$Y-^UrzGti%>qxxgQz#0 zv0C3JYTc>SI#t(-d(0f>$je$fU@GQ%a6 zQ!LUqj`Ajx)VtJnN_81fd#-C1!3VLd4+y@`jnqz@Vv)Xals8#B-L1A$stc>`!8frT z03Vp+CxEOE3cibNG$HMDH%{L;%A2g6-leuvs!P@G(Liyk4<8*of>ZDz!S@Bx+UZ?5 zed8!^vUa*hZKpd)ii`j5nMr(xQkU73n0|GUA;Y6$h*+1s@T74?Ahs zfhbl_yroZhleN=9YCEO6<;OjNrk*_0oHPrWsc=fs3`6oF2IJ9tC4=x-;7t@K%`j(D z-L}L^nkz~YXYUmMWEe;0Dm9s#kRwJs7I@S!CsN&N<(@LLz&|HWgW*$trx5S7A5Hf$ zk&ZbMBlPY2aQep8q?!751g^a2z~c(7^~Wcoap%1UBzHbB!OMP%+UHZ<2Q>#T&e-}YwzOZDAUi|0Pv|$f%gicKOrhWJxwZ3Ub0h|PXf3efr#Hu{HHm^ zyXzIm8(;{5_zL?lKoNm>H>800(mK0ke-wb-;4i+WJ_c|Tf?7hjNr628Pe$<6004cF zM6`Z0_5lGK0KK0m-=9rJPV@7k#C+V>dx8}XM0y=)~PsuqT-dp}} zxTVZ{v8TpD-+km(v-Q6bXP%!B`A9=4ZN?eSY=stlTO6K;1pFnUTa+1QKLo&}`uzu? zMOk<*v?vYx-@zeqzvsIb_P>75cX9aN%f~Zxy*yn`8+!TsqxEuce+g+QrLA7R?|b=& zi8CX}+z<7d$HV@+D13M_z1&UFHA<_V8@82?DRCssJa9J8!0&q}yaF5n zK7_N+xr0FnF>506`ACL&7J9##aEAg@8P`JmHPFP&A#*rqhnrs9KLHym9o51d{4*fG z5RI9DSJ1N<(jN=ux1+d)z+M)IKR?({yw7a1kU5T+gXb{fU31ImJqzVyd5(bkGG_pD zFl~VMi{Sm$@ct^O-)4wE3dJ7|^FfyHh{V;D25ejg`_pZ3&>tg*ME-9H$5P2)} z-4x!F80)72>t_geQg!jL|NRs`kQnRd04obG1*|me{}6|GSk=_p6R<*65aONJPoyfu z06E$7`o1sGWkTYW?cM5`flulNa?QDI-{BVJ5xRZjT^tfh@ka^YY|O${{5K2x@8OUT>&E~q3+Dq?8us7IAtBa} z16CGZ0a$6+|85Qq=y5_15#pUWkFAG{Jx<=5ZK+q)N>~@uY3&7-O1)gE+u7ktoqru6 zS01*rFx0Qs$dvy$wpvPXzf+EB8^08Ex_eA#38s@@2Up831`-#uyZ_Ob9ggBC9}^@v z_x$Z8?q67!RZfcgRF?9Q%hhUpUr4-igj-cvp9*5#Y;(TQ^U@(lzeCSXDj%*~qN5w9 zSB{2zR^+f6!G?H}z?C!?$?^ufG-g+|8F&{8;;(4$u=c}euDFTL@%A;!L~_qui4#ZONhChF ziBmb^k`p|LiL)zWzG{JD5hqUi8a2$gD=zUAqd5Q3*QkLiiXZQj6H`J-GtKZV^eL!b zrPiqq={~ub#E>L5Fo>bZ0*xjP|DZ!epHjPMs`Cx^I1E14GMhiU+la;SnHl{3r^Wk& zG)(bpYc++erNuECodYe^Igoq61Ut~UOVV;b_%)Bj>t^#BN^vuFvj|-IREsO7!(uJ2 z=#D5HI9w4pb^#9Ten$A*_npKu!9*OQ-zg^u#P~9U2(8UwCIaRhyH&B{DEpK6y!g1-sq?U5n9o@7)WgaA4R~*d4{*O?&KZ&f*2qM9Y%dX8A1+5l+;9b!G^Dh0<9z;O)ZW%OJLaZ5FM=fdx66p0`nsK*EThuL3@6`7bfC|jR1xe-mP5v&Clc%cBN1wWd&1;0eNJAj3k z@!u@${}_jaSicNdze4!NydEC*f1JW65@Y=uVErbMFXZ_oh0ioZ+C*<5#9NJs-CK;( zX1bS|AdIud?CNN-UbhR|=onK|uqdl_BPte5TUW7Mw}&0CYEY8S^7!bWImMXs#b;9r z?%6S<=&9LbIp-^h5EL&9*Lg6VCtd%6(sW-O&>D}-0xy5 zh~z~g%-vkAZl7pCYu%usIV7=l>VzgTb3#^AO*Pd)*=6FJ-dR?o)mepr&zT6w+_0QP zUvt77QkKJfO|Ps)`PPz@wJ22?-;bLb=Tp|GY_rG&^&V5rlvOTuwdj6R2|cx;)u)_U z7+bw60J*Xh=3|?()D^FKZr9h99I^;ztkw)xqcg`=51e@7NgD12g}8XUrlu}t5zXS2 zX>p4rSiG9&?t|V~9;z6YuiQ^-3eL<9(Mk&Etj{aYpVetC3-I(c$`TB`yijnmln{$$eT}kU7{|UK{BZEiVAm6_UY3`tl@rB7__?W}q?tT~5xDY&1CJ|s zAsA*s?t))8@vkrWtPsK0Il$IKpfYTN&BT5ouv|PZhJqGB!FVrv5AoJlX>)v0RXFK3 zgIYDmxQQbr>N4>DDAt*|i10_u2FHy}zxtZjUm=k()HjV~Xw_6-QQsfx( zrqy~_6Te?o1gXy7-F*QneV+L(b_|GZ5Nb-vj24UjK6I|Riuat7#QKRlgZp zwf9!>=kYf9l6Yo@afIVAdvW^4QQS=O9p}2_7FTq-u*DU`mHS&<(QxJSEv{&|^4SBA zD*{Jdp(W_5BjKUIR~)IkC{z#wGv1*Q<*JYrf!&T^*_H@(^+mX6<)tps$HwU+>N^fy&F2cXFhBJre_Ks<`8;N}0R=9+&f%i;nu{{z(OKl{cb`tv~ zmczScz}u+#j)(9Bh&vAD$Mmqh8Ba6d6_>mTye9*`lS1fG^QrqfRzZHs|0NCyv3?)0{(y$-0V@srzf9pPiLpKeSbs_6m4~lU z_-kWgp+m~fxvPY54rdU)9X4GQ0E zh|YSL`1c%rD^;Bpb9aF8AS})o=iA3&i}NJG;(KSVP}ox0rA-ywPw*CiAZjL0rS-Ld z_a8TLR}G`|gP#%J4jGJna8Ah3_<^9|$Xf5U(G^wi1l} zKsmXb4QTPm@*n4e*J;Xq7nl2*Hd(OX<8NX&Q1HK=hTyBA?sRltqs(IFs{68V)p5pi z<4J5>y<>Q$O%paa!2}ayV%xTD+nLz5ZQHhOCwFYywyn+c?zhJtyFae}SKU?B)qQnW zSDl4;YLR#<1(1Ga`UoeJ$8v?Rqw&W2xhMrq9%v!22P{a7qpbMpCxrfX&QTlryMa6< zT!$$jJUyP@p!LM6@g?=>!;@IbR{cc_+ zBk0MAPW8ZT+HKdnF7|617s779q z>e(C)rN2eLhvo(IRH_ZIl)v|ZXW|EmiK zubDBF*w_<2s5Zo(1~)Yz7nkoK%AUMW4+8KTN&g%;+TaCnh((a4=FAiS(gPgS!bu0O ziIWWfN+}DxK+95wsseflrCB`muv3$BaNinEUZ4|o;Pg(9dMdO95o)_BK5$-AV-T?RNuXH5O-$MC zSiF-IZvBmR#AxSBc;p8&I>H|993p`xZrR;dQ$VU`neOdBAFI-%5%5z^uvi*p{UsWS zleO_Ogs0HE6w?U=Hq!IsFaurIX6lU5_{dxBjouoh%jJz%(Bx|oY`h3}+bU{yDf5p{ z?A?7@DBTgChT3m@*sx(;+QCRJEWP8v9XPZ;{rLSQr2Nr(Yf!sO-)*T!`bRY|KRr;b zValBg5@dgXZECQ-$|$qW3G84P1*M)g)b9L?4GPHsh8Y=3lrUanJc|k-FI5Yj0U5Vy z$VBW$u4T2IiE22`0a+nV9GKy1mzJc_&emudLkt`08+4pbb>|D-PJ{ zxh~>3JMfQqA~$3Z(+`B7M}HC`RGq>bLdZb^aL9TL#h>yD%j-43GxAv?lA?rsclD6B z3qN7#WmlKb))35jM|8+0|y6@h4yna++sSpU_9(lPC44Sxn z&?LfBm%acqRkDS1Q}y&GOdIlf#v6LLu2<1of8N=+V&PItEk?vYJM%@IH)d0k2u5Jl zZnqsf;hhsz)4qYQD+t^G97dw@h+G52d*8x)wM)4d@cs}1l)b#0VJwB(X^%E9Yc!ye zF)kA)t^J^@(v;F_#HA*9o}_PMJ%-9S5$;))K-U7D{O0tlqt{KKYg{q&?2@(Q;@eAW zx@la~v}5nA2ho0~AK_)*AVUt0UO_nSJ2TRc*LR{XjO(V=C;yYM4AJg?5}JSvPRoQd z#}^|~i-neyAvWzeHcSUF&9_KlKymY;EfUB!NeePB5mDJ!6-)MjO&WTL?2H9~7&Q_GJ_IlQk| zsN-hs{{V0^Bic4n*2!m^gJcA^+O$O8{cCzK>0kWeTH}p8Br)nPZGo%@*{icy9oj+V z{l{#|YlXC8YpnxsUiohC6MiP8Ux*TMudG(6ift46-bQwg?psD_fNPNjW>F)GZeqTQ zpD``>=X8?w^Dn0!*x&-LH*ki+0}$>^vq>2YWG(mPD$guBXOxx0)bR8+A$A>n_l}7MF~pU_NQeN6%3ci+Uz??1uH{x3 z<@FePz9pIg#th7awuc@6DHN>L?d2VFci=~%H_uS8^DDnh{=eER`2TAYWTOI|Gpjb* zhlSIs$F+RY0%NCpxqdVt32}cI7~;qFi9-^t?sUu(Y8-m{x2QzeE8a0^9T!yzaKzMD z1zxmrU)sd$L=<%MVIXf8RP$Lftwmm+Nz4*`c*}n#CL{Q)QUvYrbSXD&V*2N%^yN34 zlq_$J^PP&K@e3d4+j~$C1M{#_J}3^OGpYQa#}a$@te&mpqw zVv*NoZi6z-gRm0-I zWWY8rB<_b=D0t7dtr*t}{(hOp>LPSXRV_yKt$<6Sq>>`!xdueegiiw<`j2&Hnv(xm zCyl(Mw8OpDcNyZ_S6<=K&lH(qY+n6#_{d9Uzgiai7Ht*L$6pfbIgH)F@)=2tl1lRb zacpz+zx}_EUxo=8e+w_AG_Sbh_4CU2nODNx`@apK?{f2>_jjq0_xs)ZC-(+=YUB=@Bc5mF9N|oMsG$ks~_l^PA(rI&3ex%hV(man^$4tdL*T!aIH8G z!yNIbMWvxg_s39~NFCh9zQ&W1UoYo+=Zu8f1p!|p`fX~oM-qb>R<|UoWR(uqc$JVK z?Z(T~(~A!JAvDsq{6z}1s%HeUITh>SZ<_|r-PWkh?t_mo>yJ)b zK_NHw#cu55(xW!G0WHj%>j4{$TSXA?icsNcmq&hrS~#2O%MKe0`X1z+HK*GikB%rk zi|+X;T}+24sr9`X>2JnhvH=xb1;ILP185eGCe*ifL}Xp1gj_Trk`9FDM^*rL(gO!2 z$zZ5D1Fh8Vd=I9$o*{yXLDQjbr&fjo7|Lm6IU(zvOAds0_8Rq8e$2ns8e+Xk$ ztod4gCSW^hkpz$wAclu}M3fh9HRdbLKyYtjFUu+D*z1t0fSW^w;ob-u-h;z%&(3}> zw?>rIIiylJd_Vi(w?q;n&IRGOczQ8O9I_YyZnaRvcpYNBx;9Ni$*0 ztiiQj1Sm*~#N)~@LcKn`4n!RC(GS*tTPeNi z3QH6305c}&#l?^|5FtE~wG){?NsD!sbB(;&8WPx8|C-2SCXl0)HNS^4bFVBn{_2G&;p zq42?t0n%t!@(z<@1uLXXLij=AdYVPERhBT|BjDnHG>rlRUqb7>Gr|XSUDjY}81Ny* z0O?R-X<(LJtZ^70M+gdQRyu2I&|E_1+Tg|@z{xsCim93tMk2sn7trtRCJz0d;R&DC z=>;?tZJs%cCuJaK+s@kFT&exd-8bN_(lJRIzlXG}EH$lb4Q*C=EK@Gct98o2n8%Xm zmy+z8)`E06BG;vtjZ$2yb-eDv@W3ywZDJFto2V8NP{Arg-6+JDD?2-lRV^sNha-ym zt0kO5w6#YA1nS!37p;W*sxM1bhg7tF5*s${N6kvaY*edh;ZVn$@2@(wCUx434)I`Q zIF0^EGEn?3`b?Y)AU$xQ5o8pT2o5LaRHZoT#76$m?%Y$_%Ax<=*~8+s6|)>sr0*q* zM6Wxrp{$6%vRpK+^>pv)QMn|v0kd~A8fd8?!4}6|ut}!S{FK#ZE*(&9#l(8lrNiQf zaaB{g8@=q3uL#L%!&rFPygk1nW$VK^Dft%P5#_}B>PUO48DhqUkof>amIHiqkc&2g=5rE zv`UC9UtCGpsb6)4E792;Eo8^I-es@0!A^FSEB$Z$WR!c9aM}F`TVyE5F+AmAQdCU5 z%0ey-*F^p5anJf@kKy_q1%`KbaFy)pGbh1(mvYPEd7^}4A~AcH_>=U#{*2P7JNrCI z!rP1C7|!Ecl8EP;E3tK69L0q>YP@&ICNAYuUD?&f?RvFC*IR+!8Z-=>xHawGj@VBQ zansp)rJ84Ui!fWVE#rAcR9h8n(l%c7S+!fX2>=^&buO>{?F=%xI==mlvG`b!ar$uB zhVhW4Rmctf?M9K2bf<*sfyRL%cYb!4;!y;fr+~XIJn(%6`7GzM;faf%68#%-_Y|?> zUIjya_xI-lWvP`msogZVA%dN5dwlGNnO`dRqJfhfSe)jg`S8BoIU*74tk zw!Qg8O5Q(ICy=GNIkPt~Z~ih*f7YxW*iC+OBm8x|4^VRHnlpHYP(dCBUG6)-uwvC7 z_Q7q}Awfy63aDv^;E=XtPc^Z%RT{awuTIe6yfzfrbtXNm7+N?;W)p>m{eOUzF$g zvZ=F3x;5XbuA=%2UeR`j%?LytS2A-VELDP(rVyeV7s2k^C@id?jO1=|< znrzzt!xSnrQT8!?VolQ1=S;l7x2JV|W$AQHxYTS&bA!gx<5FSoO`z z%4>Z0AcC)h;4w7`L29Il#a!ieo2RW@5Mysv1!hOpVj44vDqW1wYgk2 zufF?Dzj7#W?w=4(WnCcHhII93PmPcMI#3~Q(Xja#g~Ram4@#=B^nn90U{{uNNOMI@ z&eK#M{5j4sxo*B!5WLeum#%KkyS3+2B0ZGdtnObQmWTTJm5xZ*UilVJI!fDCw?qiT zJU!#mMt4s?NRd$|>#5WiGI;pv4dVyXhqDM|p*_6+CKtEywLZ@(Z*Z6 z3zBVgFqFoRU!@NzN$NDd9Tx654<0ORx!iekcht+dYLv2Nm9kOKPL^hIS&%7Hw<||BTz=RTG?iN!FM5Ln@k~0zBm$j`grTQ^HF`#+hZ@Sz{*u z5pzkVav`9~8Y-Gw4%haFSqtgY{W-_G*iJ-k#26m^r_hu=OOsx8k+pl7pG1A{5#~>s zoR$|pw-5nFXmA8-z82b>YD<(|ID_MjX_`S8wA81Z!CmY1Ufh&Yx!vw|+5WiR0_VD_ z13l_R#yC1_3|w}^QEf!pcoCSKHB*n2-YXNz(RLnB>Vj?rQp^#xe>&^HYCVr^Vlg5& z@*rKv${=JY>4H=*?Eh{5rnQ(y1*qQ^u!3-^gNGTahiU50R24hHpuHwjbxs1YcSNy3 zy-6ZC)Q2ZmmhECQUp{M_rPl~%9IE{M%Fulu&FQ(ck{Hx>Fu5<%WYtMRMJ;yZh;fp> z%p=-%PD_z;?ubmVQ+S%;Tco+xa+@2oC1gs@T4z<-utH^7?EvVvABmt)%bN6BXLuS( zRn~yp^orN|kgjDrS)MmwH3Z#m7H>1#9I}a!dj9!WvfEjOrGLfior%JNUt?AKoF-Fa z_!!MuazNNA$H(x8s8UqGmGOJB-|*)tu$}Wt3l3@_Bu;!6$8oHumTR z^4q3P@-;?B!=gIgCX7T^3TsK2LK>p+js@awNMJYPXB;c6V!kaf{w=V-ZjwTNfsbMk z<9IfQg=&PO89R7>GZG_x!K3RJ$Oka{az;{=x^%r9_{lZn>{5Q7hy2}l;hx0#eEsf3 zfok1|dQn8W{sC&;@wT;kcTRGD?t<(}?}**P*8)k+DitUhzN1$hL#Ck`QCG1&tdB}+ zCrpnS?t|;3RWt*XnNQG5U+IJa!57?RG%MqNH_u+>EbzGi(uI$&g^6K~4!B$1q+6B&D zg$ku^T?(80_{9`Y&1%%YJOGR@&;Y`Bg}&bk|jE z5$9*Sb6%t|9A{TqwzQf)`B#KI^Y6Z;^^}!;v_-(YWP2Lq%{Kap`jy^^+oLg#M^pvJ zqm;b|%v`EDj{CxZfBF?ww-aBLCh@|TV;@w8Ss7ZJ$beW2dBi4`uC<0BL-rO}|xW&`J-15Y_Bm&86X+$<6$9p{0D8O<;e!ioJRZoCUEPqw#m{<3a={N*k~_F+45h5tES=RR;u#E_ml!1sq$xkDpJ3j7G3nX`Gtmg zR_U7HRFcv0x?p+`AWcvzGZWO(BB_D4Ojb`RR>q1ry*rGE{St{FyP}SE%1RGI0NWn_ z_xeY3n)CSNRmBuS2OF2dvSa^NokEfK=}uI0M}@q0nd-)OY^nJ*)l#R>U6jw=p7-WE zyw-5FzF#@icc5i6;a)~Xl6w$wjh~K@kB?&f6O7#Nb4RcjQ0G+AOSbam=p5S;XBpif za_s_3|g4jk8j8Qt9Rgy_UdTEP{KV(q_j!$HlNJH_Zk~nfbFJ zMZ%MzRqD-^xv2j&;HlPJ)c)3%JFtn#)|RJ3WgDV1b7B8=QGqnzoGpeUIjz1n7e|fF z&h2D4?rrHjYNnz68fdGX#@=ki+w8dSxEOVJ>YFTMi4$g~k%i`*U6{3vJ~tOeoyErO zq(83nKZ;FP5ztLnBT3f(LxAw{{}Px9a`q&Y6(MPI*twqplDk&^o0fJvryl~d{|F5J zM+H=jISsuWrE^#qAV}@Bs*v)(20XEyi&IP67)+zsP?A+fb(0KN&gK+w6qj1O7^bI+ zQG5D$^fS^a;Ite`^GW~z)_{Y6qrr|+M~gX}_MSP%VR=LjzEwD~fi;|`xnA_Lnujv% z6Uz9YJH0B!mL(;Gak!*$zIMj0@Kjk;%&IaeC8@e<;rws81_{Dmsg~vo|BTY`ZKLrX z{0T8`$b-v5KcpX=+|}tycW*$ONa3_WvZ!pg!j_q;S%!7ZmCA{l<7X3y>{_>1M~dP5 zlM%=;b;v(R(jG}-pQ~!~I%}II2jZt)_AdmjvWaYbv={T(dx)6Sxfjz{&kms=Deo3< zmpYZ2(QB3^n%hDz9E;|k1c}tJ>wnelRjJ!R@}E@YD$~m68C|Zk`LE?!73=3%flW>s ztPyePJ=-*aex$x5f?jcl?$PlIPG)iYtP7%&K=RSCr*%3k8f#}Kb-&`9R}7NMN4U08 z)iG(?pwCtHTb3MX0v21X+W1w?uytyGGB%8+*A&9OD&!6=QD0!#trd|iFvpwp`;7l! zZcP@i`~3LQ;$=r1QU?mjze+52!8j`Tz*;5M&CkevIO-wGBg|{ku5001KG6u6m>C=F33&+p^{-JZ7r{{ zE-z*N{mj$lH{?t%UUCJd#yZTfR2tlh&3L0JFIohDg`(BB3@)nF;m zP5MzE_KSP1>*{46TNpD}Feoe!+m4J{qx!|#_99Qapteha=JK|>(@Tr`53z#%G00GA zwSrNq21k)^`y}m(Ap2UjxJ?kU)H=LFdMyy9NA^cG8@RIE!Eh_Y*B^!Tv&D+P$e{us z?n}SU-}Va%JaX}a#OtJXvXKNrvP-&4ahP!#?ibu`E*z(FGt<7doXC>MknFE*L#Gby7MD<&z$)2PX+2$<6I8%>Y)AO-iGE>S0&nJ0}Cn5`$k&LviqICcsq!b}s{&45LkU>TL; z1x90L(&Vz|k#hqPbK{Lou+1-p-BrI|5;Ih~@s;!9Yw#BV=HB(J&YbtuMi)oes%=O( z9^YkwhSfPY*|ee#O||@U+te6bB-OHcl3HoTDJw4f>PH%VGz2|8D+|8wIu%8;f$sq- z1{dv93rdsv+=a9M-cufP!E>U*lA7jZ1@8%^ZDxi_L8}}~2NV>?hMpQ9>5n>OPxt7z zQOk~`I0pCzI`ST8ungatx0=jaaI(_|Ex4JFiQXHg)a)%obb8AGRrF~3-l|e|3wH02 zwf6q4UdSZJbpKkc&gxf* zBs`*=UzBC9>!qkC^M@x9s~;hEd%p6qbVMZs8ls|?&!~ipET4fPm2au{D;s!#U`3O9 zxkw8YE~{b=00wnaJX0GmGFBDe`X?fTigYHPVW?;gOt{CYl{w<6|$0uw8PKlU@K_YU8>SN)m1$ zkJH?AqQ-pY4Z^H>zA=_SQs{ccduZkT5@P20#fk$gL`gHhXrNNf!uMCcPJ_H*s_=Ay zzkX&=$ji&EMAQ&HR1+n0(+(a~`HV=qyF~D97~vKjWZ#j^apI;N2zyOhe^N-8;d3}x zMLP-j&Ab?*Ff#9@AnA-3XJ$XU#DZ|C;cOumr3>~sjFg>YRGvqPpS?i-39USIOl*M8 zO08NBTNxd@fZMp%(4-6&!%hMDLZi+c^;b|zgUn)u_A>mudWU7FLQ9hQi^5;Iax&4ETl)({s z5=lez51lYv8_ZD@tV=pg>Th6dW0UNn)?G>Yz2Y-$m?(qQzk139fiF`;2s9a>D_OLKV7qM>1k}V#!%0P`}Xj`0KdVl}U`Q;V+2j)D` zAD}&`5Qa`XXy47GvqQ|@wNkw}W{D(1+hBo*N$nb=#l9Bgpd_V!dMHq>F>*C_IZD$2 z9tEo~r* zngbV&TK){HonloZNMFl;&}7yAZOhqx8o~gAIjwv@(PL14y~)S1eqHCsEjc%0DH0y@ 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

    NXWd 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