From e2d6240d36eb6e2bc2db70dbed36206e8014cc46 Mon Sep 17 00:00:00 2001 From: pat-s Date: Wed, 4 Jun 2025 18:26:38 +0200 Subject: [PATCH] chore: move docs/ and dockerfiles to own repo --- Justfile | 35 ------------- docker/Containerfile-alpine | 64 ----------------------- docker/Containerfile-alpine-jags | 11 ---- docker/Containerfile-redhat | 68 ------------------------- docker/Containerfile-redhat-jags | 13 ----- docker/Containerfile-ubuntu | 68 ------------------------- docker/Containerfile-ubuntu-jags | 7 --- docs/.gitignore | 1 - docs/_brand.yaml | 48 ----------------- docs/_quarto.yml | 70 ------------------------- docs/cicd/index.qmd | 82 ------------------------------ docs/configuration/index.qmd | 66 ------------------------ docs/containers/index.qmd | 24 --------- docs/continuous-updates/index.qmd | 1 - docs/contributing/index.qmd | 15 ------ docs/fair-usage/index.qmd | 0 docs/favicon.ico | Bin 10990 -> 0 bytes docs/index.qmd | 24 --------- docs/infrastructure/index.qmd | 61 ---------------------- docs/logo-icon.png | Bin 49921 -> 0 bytes docs/logo.png | Bin 24656 -> 0 bytes docs/private-mirror/index.qmd | 0 docs/r-dev-environments/index.qmd | 32 ------------ docs/styles.css | 31 ----------- 24 files changed, 721 deletions(-) delete mode 100644 docker/Containerfile-alpine delete mode 100644 docker/Containerfile-alpine-jags delete mode 100644 docker/Containerfile-redhat delete mode 100644 docker/Containerfile-redhat-jags delete mode 100644 docker/Containerfile-ubuntu delete mode 100644 docker/Containerfile-ubuntu-jags delete mode 100644 docs/.gitignore delete mode 100644 docs/_brand.yaml delete mode 100644 docs/_quarto.yml delete mode 100644 docs/cicd/index.qmd delete mode 100644 docs/configuration/index.qmd delete mode 100644 docs/containers/index.qmd delete mode 100644 docs/continuous-updates/index.qmd delete mode 100644 docs/contributing/index.qmd delete mode 100644 docs/fair-usage/index.qmd delete mode 100644 docs/favicon.ico delete mode 100644 docs/index.qmd delete mode 100644 docs/infrastructure/index.qmd delete mode 100644 docs/logo-icon.png delete mode 100644 docs/logo.png delete mode 100644 docs/private-mirror/index.qmd delete mode 100644 docs/r-dev-environments/index.qmd delete mode 100644 docs/styles.css diff --git a/Justfile b/Justfile index 72988b1..8b13789 100644 --- a/Justfile +++ b/Justfile @@ -1,36 +1 @@ -# just image alpine 3.20 -# just image alpine 3.21 4.4.3 -# just image alpine 3.22 4.5.0 -# just image ubuntu jammy 4.4.3 -# just image ubuntu noble 4.4.3 -# just image redhat 8 4.4.3 -# just image redhat 9 4.4.3 -# just image redhat 10 -image OS OS_VERSION R_VERSION : - if echo "{{OS}}" | grep -qi "redhat"; then \ - docker buildx build --progress plain --build-arg R_VERSION={{R_VERSION}} --build-arg GITHUB_PAT="$GITHUB_PAT" --build-arg OS_VERSION={{OS_VERSION}} --build-arg RED_HAT_DEV_PW="$RED_HAT_DEV_PW" --platform linux/amd64,linux/arm64 -f docker/Containerfile-{{OS}} -t devxygmbh/rpkgs-build-env-{{OS}}:{{OS_VERSION}}-{{R_VERSION}} --push .; \ - else \ - docker buildx build --progress plain --build-arg R_VERSION={{R_VERSION}} --build-arg OS_VERSION={{OS_VERSION}} --build-arg GITHUB_PAT="$GITHUB_PAT" -f docker/Containerfile-{{OS}} --platform linux/amd64,linux/arm64 -t devxygmbh/rpkgs-build-env-{{OS}}:{{OS_VERSION}}-{{R_VERSION}} --push .; \ - fi -### JAGS takes forever to build in CI through buildx. Building the binary once and injecting it into the final image -# just image-jags alpine 3.20 -# just image-jags alpine 3.21 -# just image-jags alpine 3.22 -# just image-jags ubuntu jammy -# just image-jags ubuntu noble -# just image-jags redhat 8 -# just image-jags redhat 9 -# just image-jags redhat 10 -image-jags OS OS_VERSION: - if echo "{{OS}}" | grep -qi "redhat"; then \ - docker buildx build --progress plain --platform linux/amd64,linux/arm64 --build-arg OS_VERSION={{OS_VERSION}} --build-arg RED_HAT_DEV_PW="$RED_HAT_DEV_PW" -f docker/Containerfile-{{OS}}-jags --push -t devxygmbh/{{OS}}-jags:{{OS_VERSION}} .; \ - else \ - docker buildx build --progress plain --platform linux/amd64,linux/arm64 --build-arg OS_VERSION={{OS_VERSION}} -f docker/Containerfile-{{OS}}-jags --push -t devxygmbh/{{OS}}-jags:{{OS_VERSION}} .;\ - fi - -preview-docs: - cd docs && quarto preview - -publish-docs: - cd docs && quarto render && rclone sync ./_site hetzner-s3://devxy-r-package-binaries-docs diff --git a/docker/Containerfile-alpine b/docker/Containerfile-alpine deleted file mode 100644 index 58f7758..0000000 --- a/docker/Containerfile-alpine +++ /dev/null @@ -1,64 +0,0 @@ -ARG OS_VERSION -FROM devxygmbh/alpine-jags:${OS_VERSION} AS jags - -ARG OS_VERSION -FROM alpine:${OS_VERSION} AS final - -ARG R_VERSION=4.4.3 -ENV PATH=/opt/R/${R_VERSION}/bin:$PATH -ENV TZ="Europe/Berlin" -ENV R_LIBS_USER=/mnt/cache/R-pkgs -ENV R_PKG_CACHE_DIR=/mnt/cache/pkgcache - -ENV NCPUS=2 - -ARG GITHUB_PAT - -COPY --link --from=jags /JAGS-4.3.2 /JAGS-4.3.2 - -# Background: JAGS needs lapack & lapack-dev but these conflict with openblas-dev which is required by R-dev -# Solution: first compile JAGS, then remove lapack & lapack-dev again -# # xvfb: for graphical pkgs requiring tcl, like gWidgets2tcltk -RUN apk add -q --no-cache curl tar make blas blas-dev gcc gfortran g++ htop git cmake tk-dev xvfb xvfb-run xorg-server xauth xinit xz libdeflate libdeflate-dev - -### CUSTOM DEPENDENCIES - -# linux-headers: ps -# libxml2-dev: xml2 -# libgit2-dev: gert -# libpq-dev: RPostgres -# libfftw3-dev: ravetools -> actually auto-detect but somehow doesn't work in container? -RUN apk add -q --no-cache R-dev curl ca-certificates bash g++ tzdata openjdk17 tar sed patch openblas-dev pkgconfig linux-headers ccache libxml2-dev libgit2-dev libpq-dev pkgconfig fftw-dev automake autoconf libtool elfutils-dev -# - Chromium should be auto-installed once pkgdepends merges the latest system-requirements rule changes -RUN apk add -q --no-cache chromium - -# https://github.com/RcppCore/Rcpp/issues/448#issuecomment-220148774 -# LDFLAGS+=-fPIC -> arrow (https://github.com/r-hub/r-minimal/blob/main/examples/arrow/Dockerfile) -# dbarts: CFLAGS += -flax-vector-conversions (https://github.com/vdorie/dbarts/issues/66) -# CXXFLAGS: -> Rcpp -# -DDMLC_USE_FOPEN64=0 -> xgboost (https://github.com/dmlc/xgboost/issues/8595) -# can't set ccache for gfortran because of https://gitlab.com/roigrp/solver/highs/-/issues/4 -RUN mkdir -p /root/.R && bash -c 'echo -e "CXX_STD = CXX14\nCXXFLAGS=-D__MUSL__ -DDMLC_USE_FOPEN64=0\nCPPFLAGS=-D__MUSL__ -DDMLC_USE_FOPEN64=0\nCFLAGS += -flax-vector-conversions\nLDFLAGS+=-fPIC\nCC=ccache gcc\nCPP=gcc -E\nCXXCPP=gcc -e\nCXX=ccache g++\nCXX11=ccache g++\nCXX14=ccache g++\nCXX17=ccache g++\nF77=gfortran\nFC=gfortran" > /root/.R/Makevars' - -# R repos -RUN bash -c 'echo -e "options(crayon.enabled = TRUE, Ncpus = ${NCPUS}, future.globals.onReference = NULL, repos = structure(c(CRAN = \"https://cloud.r-project.org\", INLA = \"https://inla.r-inla-download.org/R/stable\")))" > /root/.Rprofile' -RUN bash -c 'echo -e "PKG_SYSREQS=TRUE\nPKG_SYSREQS_VERBOSE=TRUE" > ~/.Renviron' - -### INSTALL R - -ARG OS_VERSION -RUN export OS_VERSION_TRIM=$(echo $OS_VERSION | tr -d '.') && \ - curl -v -O "https://devxy-r-builds.fsn1.your-objectstorage.com/alpine${OS_VERSION_TRIM}/r-${R_VERSION}_1_$(arch).apk" -RUN apk add --allow-untrusted "r-${R_VERSION}_1_$(arch).apk" && rm "r-${R_VERSION}_1_$(arch).apk" - -RUN R -q -e 'install.packages("pak", repos = sprintf("https://r-lib.github.io/p/pak/devel/%s/%s/%s", .Platform$pkgType, R.Version()$os, R.Version()$arch))' - -# these dirs will later be used by the CI with existing mounts -RUN mkdir -p /mnt/cache/packages /mnt/cache/pkgcache /mnt/cache/R-pkgs - -# encoding -> https://github.com/r-hub/r-minimal/blob/fa9c117313e05860a0d20b113e5f794c51be8b8c/Dockerfile#L84 -RUN sed -i 's/,//g' /opt/R/${R_VERSION}/lib/R/library/utils/iconvlist - -RUN R -q -e 'pak::pak("git::https://codefloe.com/rpkgs/bincraftr.git", dependencies = TRUE)' - -CMD ["/bin/bash"] diff --git a/docker/Containerfile-alpine-jags b/docker/Containerfile-alpine-jags deleted file mode 100644 index 5e6cc72..0000000 --- a/docker/Containerfile-alpine-jags +++ /dev/null @@ -1,11 +0,0 @@ -ARG VERSION -FROM alpine:${VERSION} AS jags - -ARG JAGS_VERSION=4.3.2 - -RUN apk add -q --no-cache curl tar make lapack lapack-dev blas blas-dev gcc gfortran g++ git cmake tk-dev xz - -# These usually are not packaged in OS repositories and need to be installed from source -# - JAGS (needed for runjags which itself is again a dependency of many packages) -RUN curl -s -L -O https://sourceforge.net/projects/mcmc-jags/files/JAGS/4.x/Source/JAGS-${JAGS_VERSION}.tar.gz && \ - tar -xzf JAGS-${JAGS_VERSION}.tar.gz && cd JAGS-${JAGS_VERSION} && ./configure --enable-silent-rules && make 2>&1 diff --git a/docker/Containerfile-redhat b/docker/Containerfile-redhat deleted file mode 100644 index 68aa291..0000000 --- a/docker/Containerfile-redhat +++ /dev/null @@ -1,68 +0,0 @@ -ARG OS_VERSION -FROM devxygmbh/redhat-jags:${OS_VERSION} AS jags - -ARG OS_VERSION -FROM redhat/ubi${OS_VERSION} AS final - -ARG R_VERSION -ARG RED_HAT_DEV_PW -ENV PATH=/opt/R/${R_VERSION}/bin:$PATH -ENV TZ="Europe/Berlin" -ENV R_LIBS_USER=/mnt/cache/R-pkgs -ENV R_PKG_CACHE_DIR=/mnt/cache/pkgcache - -ENV NCPUS=2 - -ARG GITHUB_PAT - -COPY --link --from=jags /JAGS-4.3.2 /JAGS-4.3.2 - -ARG OS_VERSION -RUN subscription-manager register --username mail@devxy.io --password "$RED_HAT_DEV_PW" && subscription-manager repos --enable codeready-builder-for-rhel-${OS_VERSION}-$(arch)-rpms -RUN dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-${OS_VERSION}.noarch.rpm && dnf install -y epel-release -# xvfb: for graphical pkgs requiring tcl, like gWidgets2tcltk -# ImageMagick-c++-devel ImageMagick-devel: boths are not auto-installed via pak sysreqs -# mecab-devel: RcppMeCab -> no autodetection yet -# libfftw3-dev: ravetools -> actually auto-detect but somehow doesn't work in container? -ARG OS_VERSION -RUN if [ "$OS_VERSION" = "8" ]; then \ - dnf install -y -q make lapack-devel git gcc gcc-c++ fontconfig-devel fribidi-devel libjpeg-turbo-devel libtiff-devel postgresql-devel htop libgit2_1.7-devel libxml2-devel hiredis ccache cmake xorg-x11-server-Xvfb ImageMagick-c++-devel ImageMagick-devel xz pkg-config mecab-devel fftw-devel tk-devel automake readline-devel; \ - elif [ "$OS_VERSION" = "9" ] || [ "$OS_VERSION" = "10" ]; then \ - dnf install -y -q make lapack-devel git gcc gcc-c++ fontconfig-devel fribidi-devel libjpeg-turbo-devel libtiff-devel postgresql-devel htop libgit2-devel libxml2-devel hiredis ccache cmake xorg-x11-server-Xvfb ImageMagick-c++-devel ImageMagick-devel xz pkg-config mecab-devel fftw-devel tk-devel automake readline-devel; \ - fi; - -### CUSTOM DEPENDENCIES -# - Chromium should be auto-installed once pkgdepends merges the latest system-requirements rule changes -RUN dnf install -y chromium - -### INSTALL R -RUN curl -O "https://devxy-r-builds.fsn1.your-objectstorage.com/el${OS_VERSION}/R-${R_VERSION}-1-1.$(arch).rpm" -RUN dnf install -q -y "R-${R_VERSION}-1-1.$(arch).rpm" && rm "R-${R_VERSION}-1-1.$(arch).rpm" -RUN R -q -e 'install.packages("pak", repos = sprintf("https://r-lib.github.io/p/pak/devel/%s/%s/%s", .Platform$pkgType, R.Version()$os, R.Version()$arch))' - -RUN if [ "$OS_VERSION" = "8" ]; then \ - export CXX_STD=14; \ - elif [ "$OS_VERSION" = "9" ]; then \ - export CXX_STD=17; \ - elif [ "$OS_VERSION" = "10" ]; then \ - export CXX_STD=20; \ - fi; \ - if [ "$(arch)" = "x86_64" ]; then \ - export ARCH=amd64; \ - elif [ "$(arch)" = "aarch64" ]; then \ - export ARCH=arm64; \ - fi; \ - mkdir -p /root/.R && bash -c 'echo -e "CXX_STD = ${CXX_STD}\nCFLAGS += -flax-vector-conversions\nCC=ccache gcc\nCPP=gcc -E\nCXXCPP=gcc -e\nCXX=ccache g++\nCXX11=ccache g++\nCXX14=ccache g++\nCXX17=ccache g++\nF77=gfortran\nFC=gfortran" >> /root/.R/Makevars' && \ - bash -c 'echo -e "options(crayon.enabled = TRUE, Ncpus = ${NCPUS}, future.globals.onReference = NULL, repos = structure(c(CRAN = \"https://cran.devxy.io/$ARCH/rhel${OS_VERSION}/latest\", INLA = \"https://inla.r-inla-download.org/R/stable\")))" > /root/.Rprofile' && \ - bash -c 'echo -e "PKG_SYSREQS = TRUE\nPKG_SYSREQS_VERBOSE = TRUE\nPKG_SYSREQS_PLATFORM=\"redhat-${OS_VERSION}\"" > /root/.Renviron' - -### Makevars -# dbarts: CFLAGS += -flax-vector-conversions (https://github.com/vdorie/dbarts/issues/66) -# can't set ccache for gfortran because of https://gitlab.com/roigrp/solver/highs/-/issues/4 - -# these dirs will later be used by the CI with existing mounts -RUN mkdir -p /mnt/cache/packages /mnt/cache/pkgcache /mnt/cache/R-pkgs - -RUN R -q -e 'getOption("repos"); pak::pak("git::https://codefloe.com/rpkgs/bincraftr.git", dependencies = TRUE)' - -CMD ["/bin/bash"] diff --git a/docker/Containerfile-redhat-jags b/docker/Containerfile-redhat-jags deleted file mode 100644 index e1e06a5..0000000 --- a/docker/Containerfile-redhat-jags +++ /dev/null @@ -1,13 +0,0 @@ -ARG VERSION -FROM redhat/ubi${VERSION} AS jags -ARG RED_HAT_DEV_PW - -ARG VERSION -RUN subscription-manager register --username mail@devxy.io --password "$RED_HAT_DEV_PW" && subscription-manager repos --enable codeready-builder-for-rhel-${VERSION}-$(arch)-rpms -RUN dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-${VERSION}.noarch.rpm && dnf install -y epel-release -RUN dnf install -y -q gcc-c++ lapack-devel make git ca-certificates - -# These usually are not packaged in OS repositories and need to be installed from source -# - JAGS (needed for runjags which itself is again a dependency of many packages) -RUN curl -s -L -O https://sourceforge.net/projects/mcmc-jags/files/JAGS/4.x/Source/JAGS-4.3.2.tar.gz && \ - tar -xzf JAGS-4.3.2.tar.gz && cd JAGS-4.3.2 && ./configure --enable-silent-rules && make 2>&1 diff --git a/docker/Containerfile-ubuntu b/docker/Containerfile-ubuntu deleted file mode 100644 index 70beca1..0000000 --- a/docker/Containerfile-ubuntu +++ /dev/null @@ -1,68 +0,0 @@ -ARG OS_VERSION -FROM devxygmbh/ubuntu-jags:${OS_VERSION} AS jags - -ARG OS_VERSION -FROM ubuntu:${OS_VERSION} AS final - -ARG R_VERSION -ENV PATH=/opt/R/${R_VERSION}/bin:$PATH -ENV TZ="Europe/Berlin" -ENV DEBIAN_FRONTEND=noninteractive - -ENV NCPUS=2 -ENV R_LIBS_USER=/mnt/cache/R-pkgs -ENV R_PKG_CACHE_DIR=/mnt/cache/pkgcache - -ARG GITHUB_PAT - -COPY --link --from=jags /JAGS-4.3.2 /JAGS-4.3.2 - -# xvfb: for graphical pkgs requiring tcl, like gWidgets2tcltk -# tcl tk tk-dev tk-table: must be available before running xvfb-run (i.e. starting the graphical session) -# libmecab-dev: RcppMeCab -> no autodetection yet -# libfftw3-dev: ravetools -> actually auto-detect but somehow doesn't work in container? -RUN apt update && apt install -y --no-install-recommends gdebi-core g++ gfortran libbz2-dev libblas-dev libicu-dev liblapack-dev liblzma-dev libpaper-utils libpcre2-dev libtcl8.6 libtk8.6 libxt6 unzip zip zlib1g-dev libpcre3-dev libopenblas-dev curl ca-certificates make ccache htop libgit2-dev git libpq-dev libxml2-dev libgit2-dev cmake xvfb libcurl4-openssl-dev xz-utils tcl tk tk-dev tk-table pkg-config libmecab-dev libfftw3-dev automake - -### CUSTOM DEPENDENCIES -# - Chromium should be auto-installed once pkgdepends merges the latest system-requirements rule changes -RUN apt-get install -y software-properties-common && \ - add-apt-repository -y ppa:xtradeb/apps && \ - apt update && \ - apt install -y chromium - -ARG OS_VERSION -ARG R_VERSION -RUN if [ "$OS_VERSION" = "jammy" ]; then \ - OS_VERSION_TRIM=2204; \ - CXX_STD=14; \ - elif [ "$OS_VERSION" = "noble" ]; then \ - OS_VERSION_TRIM=2404; \ - CXX_STD=17; \ - fi; \ - if [ "$(arch)" = "x86_64" ]; then \ - export ARCH=amd64; \ - elif [ "$(arch)" = "aarch64" ]; then \ - export ARCH=arm64; \ - fi; \ - curl -v -O "https://devxy-r-builds.fsn1.your-objectstorage.com/${OS_VERSION_TRIM}/r-${R_VERSION}_1_$(dpkg --print-architecture).deb" && \ - gdebi -n -qq "r-${R_VERSION}_1_$(dpkg --print-architecture).deb" && \ - rm "r-${R_VERSION}_1_$(dpkg --print-architecture).deb" && \ - R -q -e 'install.packages("pak", repos = sprintf("https://r-lib.github.io/p/pak/devel/%s/%s/%s", .Platform$pkgType, R.Version()$os, R.Version()$arch))' && \ - mkdir -p /root/.R && \ - bash -c 'echo -e "CXX_STD = $CXX_STD\nCFLAGS += -flax-vector-conversions\nCC=ccache gcc\nCPP=gcc -E\nCXXCPP=gcc -e\nCXX=ccache g++\nCXX11=ccache g++\nCXX14=ccache g++\nCXX17=ccache g++\nF77=gfortran\nFC=gfortran" >> /root/.R/Makevars' && \ - bash -c 'echo -e "options(pkg.sysreqs_verbose = TRUE, crayon.enabled = TRUE, Ncpus = ${NCPUS}, future.globals.onReference = NULL, repos = structure(c(CRAN = \"https://cran.devxy.io/$ARCH/${OS_VERSION}/latest\", INLA = \"https://inla.r-inla-download.org/R/stable\")))" > ~/.Rprofile' - -### Makevars -# dbarts: CFLAGS += -flax-vector-conversions (https://github.com/vdorie/dbarts/issues/66) -# can't set ccache for gfortran because of https://gitlab.com/roigrp/solver/highs/-/issues/4 - -# these dirs will later be used by the CI with existing mounts -RUN mkdir -p /mnt/cache/packages /mnt/cache/pkgcache /mnt/cache/R-pkgs - -RUN apt install -y locales && echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen \ - && locale-gen en_US.utf8 \ - && /usr/sbin/update-locale LANG=en_US.UTF-8 - -RUN R -q -e 'getOption("repos"); pak::pak("git::https://codefloe.com/rpkgs/bincraftr.git", dependencies = TRUE)' - -CMD ["/bin/bash"] diff --git a/docker/Containerfile-ubuntu-jags b/docker/Containerfile-ubuntu-jags deleted file mode 100644 index 6842dcb..0000000 --- a/docker/Containerfile-ubuntu-jags +++ /dev/null @@ -1,7 +0,0 @@ -ARG VERSION -FROM ubuntu:${VERSION} AS jags - -RUN apt update && apt install -y --no-install-recommends curl make ca-certificates gcc g++ gfortran liblapack-dev -# These usually are not packaged in OS repositories and need to be installed from source -# - JAGS (needed for runjags which itself is again a dependency of many packages) -RUN curl -q -L -O https://sourceforge.net/projects/mcmc-jags/files/JAGS/4.x/Source/JAGS-4.3.2.tar.gz && tar -xzf JAGS-4.3.2.tar.gz && cd JAGS-4.3.2 && ./configure --enable-silent-rules && make 2>&1 diff --git a/docs/.gitignore b/docs/.gitignore deleted file mode 100644 index 075b254..0000000 --- a/docs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/.quarto/ diff --git a/docs/_brand.yaml b/docs/_brand.yaml deleted file mode 100644 index b2b110f..0000000 --- a/docs/_brand.yaml +++ /dev/null @@ -1,48 +0,0 @@ -color: - palette: - dark: "#1d262f" - orange: "#FF9B00" - links: "#15428c" - # background: blue - # foreground: dark-grey - primary: '#1d262f' # hyperlinks, active states, primary action buttons, etc. - tertiary: "#FF9B00" # hover states, accents, and wells. - -logo: - medium: - light: logo.png - dark: logo.png - -defaults: - bootstrap: - defaults: - navbar-fg: "#1d262f" - navbar-bg: "#ffffff" - -typography: - fonts: - - family: Jura - source: bunny - - family: Inter - source: bunny - - family: Montserrat - source: bunny - base: Inter - headings: Montserrat - link: - decoration: underline - color: links - monospace: - color: primary - background-color: "#f0f1f3" - size: 0.8rem - # decoration: - -meta: - link: - home: https://www.devxy.io - gitlab: https://gitlab.com/devxy - bluesky: https://bsky.app/profile/devxy.bsky.social - linkedin: https://www.linkedin.com/company/105100347 - description: Where Data Science and DevOps meet 🤝️ - founded: 2024 \ No newline at end of file diff --git a/docs/_quarto.yml b/docs/_quarto.yml deleted file mode 100644 index 09b5082..0000000 --- a/docs/_quarto.yml +++ /dev/null @@ -1,70 +0,0 @@ -project: - type: website - -website: - title: "CRAN R Package Binaries" - reader-mode: false - favicon: favicon.ico - back-to-top-navigation: true - navbar: - right: - - icon: gitlab - href: https://gitlab.com/devxy - - icon: browser-safari - href: https://www.devxy.io - - icon: bluesky - href: https://www.devxy.io - sidebar: - logo: "" - style: "docked" - collapse-level: 4 - search: true - border: true - pinned: true - contents: - - text: 'Introduction' - file: index.qmd - - text: "---" - - text: 'Configuration' - file: configuration/index.qmd - - section: "**Use Cases**" - contents: - - text: "CI/CD" - file: cicd/index.qmd - - text: "R Development Environments" - file: r-dev-environments/index.qmd - - text: "Containers" - file: containers/index.qmd - - section: "**Technical Background**" - contents: - - text: "Infrastructure" - file: infrastructure/index.qmd - # - text: "Continuous Updates" - # file: 032-continuous-updates.qmd - # - section: "**Miscellaneous**" - # contents: - # - text: "Private Mirror" - # file: 040-private-mirror.qmd - # - text: "Fair Usage" - # file: 041-fair-usage.qmd - - text: "---" - - text: 'Contributing & Help' - file: "contributing/index.qmd" - - search: - location: sidebar - type: "textbox" - limit: 5 - copy-button: true - collapse-after: 2 -format: - html: - theme: cosmo - css: styles.css - fontsize: 1rem - toc: true - grid: - sidebar-width: 300px - include-in-header: - text: | - diff --git a/docs/cicd/index.qmd b/docs/cicd/index.qmd deleted file mode 100644 index 115b097..0000000 --- a/docs/cicd/index.qmd +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: CI/CD ---- - -Continuous Integration / continous delivery (CI/CD) is a basic tool in todays Data Science toolstack to automate processes and execute repetite tasks on schedule. - -Running tasks in CI/CD should be fast and reliable, no matter the language, architecture or computing environment at hand. -As CI/CD requires installing many packages over and over again, having binaries and optimized distributions helps to reduce runtime. - -This page presents snippets for well and lesser known CI/CD engines to help getting started with the R package binaries of this project. - -::: {.callout-note} -The presented snippets rely on external projects and libraries which get updated regurarly. -There is no guarantee to work out-of-the box at all times. -If you found an error, please open a pull request in the linked repo. -::: - -## GitHub Actions - -### VM - -GitHub Actions can be run directly on a VM or in a containered context. -The available VM images can be found [here](https://github.com/actions/runner-images#available-images). -The only Linux distribution available is Ubuntu. - -For VM workflows, [r-lib/actions](https://github.com/r-lib/actions/blob/v2/examples) provides many examples for different use cases. - -To use package binaries from this project, use the following config for `r-lib/actions/setup-r@v2`: - -```yaml - - uses: r-lib/actions/setup-r@v2 - with: - r-version: ${{ matrix.config.r }} - http-user-agent: ${{ matrix.config.http-user-agent }} - Ncpus: 2 - cran: 'https://cran.devxy.io/amd64/noble/latest' -``` - -(`Ncpus: 2` has been set to allow for parallel installations.) - -### Container - -An alternative is to run Actions in a containerized context. -This spins up a container of the selected image in the VM and allows running on other distributions than Ubuntu, e.g. on Alpine. -To avoid having to install R first and configure a custom repository every time, [specialized images](https://hub.docker.com/r/devxygmbh/r-alpine) are provided which already have everything in place: - -```yaml -jobs: - container: - runs-on: ubuntu-latest - container: devxygmbh:r-alpine - steps: - - run: | - R -q -e 'install.packages("pak", repos = sprintf("https://r-lib.github.io/p/pak/devel/%s/%s/%s", .Platform$pkgType, R.Version()$os, R.Version()$arch))' - R -q -e 'getOption("repos")' - R -q -e 'options(Ncpus = 2); pak::local_install_dev_deps()' -``` - -::: {.callout-note} -When running in a containerized context, the predefined actions from `r-lib/actions` cannot be used. -Shell/R commands must be used directly. -::: - -::: {.callout-note} -Running containerized in Alpine should be substantially faster than running in a VM context. -::: - -::: {.callout-tip} -(91 packages) - -- Containerized: **1m 21s** -- VM: 2m 11s - -Both runs are based on the assumption that caching is not used. With caching enabled, the performance of both approaches should be roughly comparable. - -Source: [pat-s/workflow-compare](https://github.com/pat-s/workflow-compare) -::: - - -## GitLab Runner - -WIP \ No newline at end of file diff --git a/docs/configuration/index.qmd b/docs/configuration/index.qmd deleted file mode 100644 index e3b06a4..0000000 --- a/docs/configuration/index.qmd +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: Configuration ---- - -In R on Linux, packages are downloaded from CRAN as source packages. -The default CRAN mirror is `https://cloud.r-project.org`. -The default repository URL needs to be **actively changed** to one providing binaries for the respective Linux distribution. -This can be done either for all users of the system, on a project level or for specific users only. -All options will be shown in the following. - -## URL Scheme - -The URL scheme for this project is the same for all operating systems and only differs in the OS and architecture identifiers. - -::: {.callout-note icon=false} - -## URL scheme - -`https://cran.devxy.io///latest` -::: - -For example, the URL for Alpine Linux 3.21 for `arm64` would be `https://cran.devxy.io/arm64/alpine321/latest`. - -The architecture identifiers are: - -- `arm64` -- `amd64` - -The OS identifiers are: - -- `jammy` (Ubuntu 22.04) -- `noble` (Ubuntu 24.04) -- `rhel8` (RedHat Enterprise Linux 8) -- `rhel9` (RedHat Enterprise Linux 9) -- `alpine320` (Alpine Linux 3.20) -- `alpine321` (Alpine Linux 3.21) - -## Repository Configuration - -### System-wide - -To configure the default R repository for all users of a system, create/edit `$R_HOME/etc/Rprofile.site`. -The location of this file depends on how R has been installed. -To find its location, execute `R -q -e "paste0(Sys.getenv('R_HOME'),'/etc/Rprofile.site')"`. - -**At the bottom** of the file, add the following: - -```r -options(repos = structure(c(CRAN = ""))) -``` - -The name "CRAN" is optional. -It is the canonical default and in some cases also used for special actions (e.g. in Posit Workbench and [{pak}](https://github.com/r-lib/pak)). -Unless you have a good reason, it is advisable to stick with that name. - -### User-wide - -To change the default repository option for a specific *user*, add the line from above to `~/.Rprofile`. - -### Project-wide - -To change the default repository option for a specific *project*, add the line from above to `.Rprofile` in the project root directory in which R is started. - -## Verification - -When starting R, execute `getOption("repos")` to verify the repository is correctly configured. \ No newline at end of file diff --git a/docs/containers/index.qmd b/docs/containers/index.qmd deleted file mode 100644 index ad4cb98..0000000 --- a/docs/containers/index.qmd +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Containers ---- - -The [rocker](https://hub.docker.com/u/rocker) project provides container images for R since several years. -Since recently, the images are multi-arch, i.e. `arm64` is supported alongside `amd64`. - -Yet, other distributions than Ubuntu are missing and don't use the devXY binaries out of the box. -To simplify running containers that make use of the devXY R binaries implicitly, the following images are provided: - -- [devxygmbh/r-alpine](https://hub.docker.com/r/devxygmbh/r-alpine) -- [devxygmbh/r-ubuntu](https://hub.docker.com/r/devxygmbh/r-ubuntu) - -These have the devXY repositories configured by default and can be used efficiently without further configuration changes. - -In contrast to the minimal `rocker/r-ver` images, the `r-ubuntu` images contain a few additional system libraries which are essential for troublefree R usage. - -The following screencast shows how quickly the `r-alpine` image can be used to install the full {tidyverse} package universe in just under 30s: - -
- -::: {.callout-note} -The performance of this screencast (and your local experience) depends on a few factors: local download speed, cached binaries in the CDN, proximity to a local edge node of the CDN and your CPU performance and finally the `Ncpus` option in R, defining how many installations are performed in parallel (by default 1). -::: \ No newline at end of file diff --git a/docs/continuous-updates/index.qmd b/docs/continuous-updates/index.qmd deleted file mode 100644 index 6d3f665..0000000 --- a/docs/continuous-updates/index.qmd +++ /dev/null @@ -1 +0,0 @@ -WIP \ No newline at end of file diff --git a/docs/contributing/index.qmd b/docs/contributing/index.qmd deleted file mode 100644 index 3bf7d20..0000000 --- a/docs/contributing/index.qmd +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Contributing & Help ---- - -Contributions are welcome. -The project is open-source and GPL licensed. - -The most helpful tasks are to investigate in detail why specific packages failed to build a binary. -It usually comes down to a missing system dependency (which is either not declared in the package's DESCRIPTION file or exotic and must be installed from source) or a C code compile issue. - -Please open an issue in the [`r-package-binaries/support`](https://gitlab.com/devxy/r-package-binaries/support) repo. - -::: {.callout-note} -The actual repo executing the builds ([devxy/build-binaries](https://git.devxy.io/devxy/build-binaries)) is hosted in a private git instance to be able to use specific private CI runners and is not easily usable for creating public issues, hence the dedicated repo on GitLab. -::: diff --git a/docs/fair-usage/index.qmd b/docs/fair-usage/index.qmd deleted file mode 100644 index e69de29..0000000 diff --git a/docs/favicon.ico b/docs/favicon.ico deleted file mode 100644 index 29cda768233277d3391e0b75034530e990dda29b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10990 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 diff --git a/docs/index.qmd b/docs/index.qmd deleted file mode 100644 index 4aa7744..0000000 --- a/docs/index.qmd +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "CRAN R Package Binaries" ---- - -This project provides R package binaries for various Linux distributions and architectures. -While it provides binaries for [CRAN packages](https://cran.r-project.org/), it is not affiliated with CRAN in any way. - -Binaries are distributed to the community for free with a monthly download cap of **50 Terabyte**. - -::: {.callout-note} -If you represent a for-profit company and plan to make extensive use of these binaries, please get in touch. We offer the option to obtain a private mirror with unlimited access. -::: - -While we strive to build binaries for all CRAN packages, there are various reasons why building binaries for a package might fail. -(The most common reason is a missing (exotic) external system dependency which the project links against.) -The [R package binary dashboard](https://app.devxy.io/app/r-package-binaries-dashboard) provides global coverage information for each for each operating system and which packages are currently missing. - -## Motivation - -The project was established to offer extensive R CRAN package support for common Linux distributions. -Since CRAN does not build binaries for Linux, Posit began providing binaries in 2020. -However, their efforts were limited to the amd64 architecture and excluded Alpine Linux, which is among the most popular distributions for container-based workflows. - -This project aims to make R a first-class citizien for CI/CD and containers using a community-driven open-source approach. \ No newline at end of file diff --git a/docs/infrastructure/index.qmd b/docs/infrastructure/index.qmd deleted file mode 100644 index 6b4c2f4..0000000 --- a/docs/infrastructure/index.qmd +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Infrastructure ---- - -The infrastructure is composed out of the following main components: - -- A k3s cluster (on Hetzner) -- S3 object storage (on Hetzner) -- A CDN (Bunny CDN) - -As the resource need for this project is quite variable, running on Kubernetes allows the efficient use of (shared) resources. - -## k3s - -Efficiently building on different architectures requires access to native servers for those architectures. -While most cloud providers make this possible, Kubernetes simplifies the process by enabling orchestration of specific builds to designated nodes. -This flexibility ensures that builds are executed on the appropriate hardware, optimizing performance and compatibility across diverse environments. - -### Memory Requirements - -Because the memory requirements for each package are vastly different and range between a few hundred MBs to a ~ 12 GB, these must also be reflected in the resource requirements of each pod. -Using `requests.memory` of 5Gi and `limits.memory` of 14Gi has been proven to work reliable for scheduling and individual resource needs. - -### Matrix builds - -While daily package updates can be handled with a single process per OS/version, building binaries for all CRAN packages requires a different orchestration strategy. -On average, each CRAN package has six versions (calculated by dividing the total number of binaries by the OS/versions built and the number of unique packages), making some level of parallelization necessary. - -Initially, parallelizing at the level of package versions was implemented. -However, this approach led to occasional conflicts when dependencies were installed into a shared package cache. -It also introduced unpredictable memory requirements within workflows: some packages caused memory usage to spike beyond 30 GB, depending on the number of parallel workers. -These spikes not only caused individual processes to crash but also demanded significantly higher overall resource limits. - -A more robust solution was found by processing individual packages sequentially within each matrix job. - -To build all versions of all packages, CRAN packages are divided into subsets, each comprising 1/10 or fewer of the total packages, and these subsets are processed in parallel. -The total time required depends on factors such as the distribution (e.g., distributions with newer C compilers like Alpine tend to be faster) and the number of parallel workers. -This approach typically takes anywhere from a few days to two weeks. - -## Storage: S3 - -Binaries need to be stored somewhere, and what better option than S3? S3 is significantly more cost-effective than traditional cloud disk storage and offers the added benefit of being accessible via a public API. -Beyond AWS, the original provider and inventor of S3, there are numerous alternatives with better price-to-storage ratios and lower transfer costs. - -The timing was perfect when Hetzner introduced their own S3-compatible object storage, coinciding with the start of this project’s build processing. -This solution brings multiple advantages: lower overall storage costs, free internal traffic between Hetzner servers and their S3 storage, and the proximity of storage to the build servers, which minimizes upload latency. - -::: {.callout-note} -While uploading packages to S3 is not complicated, there hasn't been any way to create the required PACKAGES index files for binaries stored there. -This is why forked versions of {cranlike} and {desc} have been created. -::: - -## Content Delivery Network (CDN) - -Storing binaries in S3 works well for distribution, but it’s not inherently very fast. Adding a CDN in front of S3 enables caching and allows assets to be distributed via servers located in various regions worldwide. This significantly reduces download latency, making downloads feel much faster. - -All packages are delivered through a CDN, which includes three dedicated static caches strategically placed in Germany, the USA, and Asia. - -With a CDN in place, downloads are optimized to feel “fast” from virtually anywhere, with only minor variations depending on the user’s location. - -The CDN determines when an asset is added to its permanent cache and how often it is revalidated against the S3 source. Since package binaries are one-time builds that typically remain unchanged unless a forced rebuild occurs, relying heavily on a permanent cache is highly efficient in this context. diff --git a/docs/logo-icon.png b/docs/logo-icon.png deleted file mode 100644 index c1e2090b1d7f54b7b2fb769b12b5232072628c85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49921 zcmeEsWl&sC^d-S1xO?#6?iM7ty9IZ57&JIRgS!NRI|LtG2A|;WG68}O1Q>MrZPk9? z5Bq8B|EjuPRp07YxBA^a_w>2S^7WQ^#3d* zD$gI#Og?V(oK}3GrG;v9x6~I6B1zHx--Kmd`QLm5qdHp8=oVt?Q+8Tf2zOMI8f>i3 zr!@sb|51&k7vpcO*YH2F^Iz zt8^XS7Z>+!YHK~x7LgN-&fp#;sa<-S2F4Dpd$8$5$NJ-CZa zQ4!3@77CTNJQw2WmE=(W5m9~@)r3$*N$91XO{(6zhn_?w;r+eFMwW_B^0eljnqrtD@KI*O6J7c-XT&wj_7eCr0)3*`$oph?ed9(RTmIh9{AxcqRr(!Z*h& zDM^)?GXSqQ+I;=L|K#L%E45-^(Ie2|x~IyABVC>+xqC6CL-3W3jr=uujTRHet^R4) zJ;aCAInHYcdP(XCKs4d=NfgK_4gKF#o#j=&<&h~23>*DpGx znn}lFzzctwRFzJ|KfX%P$-j>2%e{&_`umK54h;L~A@AS38C#dOfszcAhN>TLGC^3# zVR!CGO?fF3p?O&o*-3FJn_$bG_f3old)evYN2uzI&l@&-_P0to|0+>Ac)C%bQI>y& zDZYU(*7um|ArS>kx*+QW*PCX4U*5HdOOwNmn>0|5w{=0$TYLzfN1P6t$CL6ur6F8Q z>Bj0k&?g3=$#up1(cC=;{?-S$yZ?31f)nO!O^lN7J~;)3gvQy%~Qc>{F+xiVT zGRy4q`NJL27WL&nm`L>ME~Qs9dfJ6Oq#arD`|dTQqE12T)}cb_TfTa}cE{%~ACj@7 zny#l#)kn2@zqe|{&6f%_rgfHW2P3U1T!Nt zF#W=ss3(&Xe!+EQu!ABAjDNifeMr8k)+mpMH}42z4jb?F&;HC-SPB0$mlu*E`7|VH zUb_^M2EqT&$D<=g$@|%4k}1{90mQqQfQX3m-NO%;zH-kA7L4T1I7tx9PMOvAR(vc` z(e4eOJ8{@C=E>;T1#eHrfrs_GDSYM0nyyv}>^BIJ_XK%TyO#0UXO6q)uhTTFf2`s7 z*OrMeOnu_cW=vB6(4H*=o*(~(JbVX#v8L__TqR#rkXZ9kpCL9<1-u>k_L_3`&$2U8 zB6daK|4G#ULrVVt!B;N^#3ME9<&bL=zpT28k^{&SOW!JnjzcT z1r2Ptul3EXHzYkB58$VP#@PGXj^3LMLAwlv@wgNY2~q7{GM^qdAf3CiVMzn&oUJ#agp+|>?k4)dvyqH}8Nd864u5hw=RD4GusNsE5>Fix<(hrQJ!R)^npl>u<73kNW zn$y*dNHoG29JkBV$Z;rIOof>lrZB~d(l_2;e}c>X&16`TaVGW|n# zSQ+JL9ro7ua4Ao*1L7JbaV|^P^CsD)q6e_a#CTJ=;gQ?ETQuEE0M3wXg9Wi-F4jn+i zA_U`a%l(cQOm4;hWwma#Du2_;fcyWQle`%DQg8+ z9fOJb!fwH?lQ=qU@k-~eUv>u1M{eJTaS zsr5TGG)s{n4k2`_X18!iN{V%o@#p4GQ8JzaOKn0PcXxneWm|(^X*z8M7gTA7c|)G? zaWpa2BCT|`gfR3xg?DX3@cL8JQ0ncTsboLKV_r3=j@*8RxOW$hl z?^=VbjoB5l%Y!z+3+1~OZ^r^1v&;&mNmS<--m0k^p`UQ?v|?qw+Dg3c?p_iFfvzc5 zJ%RmJNymrCd$@gW@Zg?5JZeRb_mg0^@4(R$vSd|>q@Ju~hur5!3uPwh_w?AqaAByu zptK`B*t5Rr;C1qI?6<}=ls>IMd_&v`OolLu#;I$CAa8+Z+TMp87d<^+)I~&pT7P=1 ziMF1E=R8*uP7Riwtl+)jYW4RvYfRXRI1`6}c9CJbK62P^K>>q1#S$h9im^+%9rR8WAY6bs$3Zk;pLgV#IGx`W9WpY{&B)^M)XLrFume=eR-EYfd_^N&gf`9xqA4QWd#;q?r353{T1F_CZ0 zjYWO7!(1g!+BH4=Ad6%QnXT55LY4JeaxV1Snu93csm$9UYmE^bt*w?tjv&XIPB2qw zkuBVGKuRuPjWg@@ysp4%i*VgbF@7B6&re|_o|wky-w2>+T2jtM28AM1)Gi*LQ_FPN zHgg>CxLy@%n8eFWFgMr2L%Sqr?sH>+EeKyt5=@&qG_w<@Bf*9YPnhCyz9}?l7Iees zSI4%a0+&L9r&_6S^C2-p-F&N5P565hs(1tGseUBi%yXc;|DBz_&}tvaoyayS98Bjv zO@c)Wb*I}zqGe{?HP@!iw7e;85ae5ldU*0i#sN=hwb2BG)XQeCuxBjeyslQtYS z0KHO4l!D55*UyX}bj@Kz_Zw7WqDr}eM&yoRL(g`Ia%-}G6Wb~U9ovA$4Qd^l7kbv2 z18~zwXYr^$M1Lu-*$2Lih?`!+SF|w{kJFj|NKk4G134e`$za_ND44b^NKTjqJ0>X*!v&)FWwyYo;6VZ0#BEAu{oPFw3=U2l|gB& z*zDK0dC4B*_dG|zbH!|I8TBZDIGUn0cB5uYt4%)fD9|Da@m2j0=8J5FGVG|(b7IkQm zh9fgLM8(X<_b#=y9ko+I&V?SmjR}P zquRO2;PzJ6U{#L{Ujn|&2Sd@d++ zTH8E^(zgZ~+WzWNG}OcLdASoaI>Tlw37ezxM~_^)_NOH-2Pfd)YVj@KA)y!{DX^u4 zdKZL@$1|m~6GCfJGUNOBp^p}gl~C*G-8HbB+lX5FgTFcL`DN{@&C8!wkpJ8P+GyRt zhJtD0FA`>p+Jywn@ND66^W}2b+7;;*U=kgBSlPZZEY6~@k!M)%C*DqsOdVjD=4W+6 z5?M+=_R`UPyn0D^}WsW{+}y*|LRp0jHff=W!UJI@PmXZ zZIOc)kAOs)g8%tFVph0#bD_r(9n!M}c_I3=9=g zp5MQjp}lxoVY#aV&vNOl*&p=vv9t5iigQ|wu}(R$G$6Mc571>)wB4~DH9BEzydXd@ z`~?0+GmG7;zi@#jrNap*uA?2)uGgF(fQQ*HEDuAuodZGL`FRvtMV%)E4Z-6S`fT;{ z%IgQSuV2f^8co72nh08W#MItDScEr7at%m^1V>CieC&L7|EW|JdHZyijg63Pyq;~q zA^R3noEu{5__)a8mAT(J^E0qZh2xueYD~XbOF;@tu~K4;zQg`SemMEgI{!sdy*DL^adc4m4|V zyrynHaWdEnO@qz!ud9nFt@6`wJkzGW<1NWfk#Eq>u6=&CiOY4wvCZ7a-FmK4mALD1 z@O4Rg68z;f4Mc4DUKDTGiPP3sx^S?<5h*b~7B4c@q>%!&Z0+kW3Jyx^&azXG&YyZSrs5t}Vk zWT_pA^c%>jvSTVUZCnS_5~kcT@->dUf4yMJ>~L}+vP-ZRzm@)sjwvU3H(&aG2hTmA zHXo==y8>-#CzJEf0K!1OV)n87Hnv**G!M4HMDR}d z4y&EsxB?}Vr;ZG*9%A!%lBjsm@yWV;{0Biy@BH@T`uum#G|n7(7@6*1ME z_stvEp$1-=lTX)($*n$u5~$WLJ(eL!ol8t3L0*j@l5KI}8I-=ZaUSAB!WrnWj*h7Vyck+)k}F5HhIzs;PZvHq|_gu&_DiEp)p!_tH`&VsSV>`>Sh6p zX|Y*nP`Yq2hg0yJ_p-y?- zkMl-9CML&iUVlAu=R*1^#eQE$Pgba31vUszWVARXRGjg?CS=g7R^i<6z#A!n+$+%1 zg4_`HF>#)kbL-jeoX;>jGfO;Lct0 zyTm4lICOh2qBk!>(~vwV4kudsl7>Dhp$}xlj#DouqD>CIYt^iU#ORnk{HCh^P?7(omKMm z*LX{^%hiLEZ8mmIS*R)hiXZ=WdipK-*`JLu)Nf*%(5poO2CNWUv4*dvYx^fdr@-@( znCyQx)xV6(2VH)fR(x?vcfy(MsQIU8>#Qda>nF~FE$?gdsb~pz%BgIs9pHXUP(*>E z%5-DfyiW`Aa|n}sT)|`V!`c-nL^-P?*o@H<7M}~XYs_)&9_SFfnIpZ zXqm_!G4Zlx=9Kf}Z(kuc)%%Er4)dz4HryYrxxGJh3Y_vxU3)yFT~Hggj>xdXis-o) zYd_np!@3eQ+c?zTc3DA_kCjkm3(e}ZdZaMV?{Axij!>(3p85swSqKPnwgKnZ)0s!x z>e;cM$hgyw%hKB?bJQk*$7KEkHtRaQ@p)OBaMjJ#^UB>>ZBge}q&&DoF!&LzK@tmtS!w}B1<(Q`IS zm^WDrK8hPK*vTNqNAKk6_oOr14v_Fb0Y0|%+nNls|3+leE2~jo_v{A}fTMYSNt#%b zPE`$JfqT58B>flJVrm#11<-8zhJZAkYH`WB#@p~;^|Q&vxA&s5YA?GRa_o`MI^feABiAbk;(yi;xy9d`@C8lPZ@U!_BwmA4JC;p)S!aoHB zahEi$F=?%iti8Jh<4jPB#Py40l4RdE2$^9-W>>)7Zg0&9~z zz@zXNo&V@T?O5+%BubgFOW$t+vidWU=vL5SFV5xtAYr8=KG)iNi>+7Anjly&ny(9^ zIvSwhRBTF-XmZPCw{{Pr6{szcUD&Ma8ltyDTxiCNt2dAbtV=b*`isGdL0ddpd2Cn| zUSi~&^SQixjJ#P{5)?7-P}uuVDQ(fj zEu+%&>ZWvK;j!W&#GQ1!``-_-BfZqWs7Bi z0{iS_jE8nf?;d+b@C?EqsB)Pj%G&!xR|-ZfWVvKi-*10xk9$IV+mpx^-^gk{Nfn|d zmhVBiX`=G?>aV~-%8Db8@+zwj!*lMu8f!+s5`~{@L1oT(lsOj#dw!idfd2{#aGO|!LI}t&wtTbkKIj))YjcwHp=kUcafoz>-Ys$%&&fplpJ}6 zM}npy*-WYppVlaHMAATm4xDn`Di3(eCbN*lWt}NKr@hrv!vE6?FoboOJ{UxO`xM^X z)j0KvSgc5x*E=TvM(yLb8;*Iy%5oRld3v(UHYcn)e~M#O)cU3`jjos%_C5aKbz6x7^+~}52 z-3DF5nHV0V1acs&%1_e$mwK|(*zWEe?(%B2EZ;|H%tmtiI!7l5P5NJ)1=g;>Qw0E! zim<5>;K&V2Bv9?-x;=bs$bmO;J|VBV@n`4<8)2gc=&e4*(ed>izO$2o-U(fU+WJr# z(DFyZf@_R$ufP5@N^km#JrNCZLiL9Gk?IJ0>w4%nF|jwa4NqKh8P>x7f{XcJku@eT z8^Fd7x?cyoLZ=^zS6i9c0HjbiNC*5Gva*XJ0KH6Ls77ml)-KK_`>oLWH$bAf$ttd|9mPEFxHE{K54yz2d$Nb&jGuZ+&0t_bi_JcQtPBf( zw-v&p@(<8m`{tT;dPGki`A$ZyPafz_lDfums8gUgDbSao1T1nan{|RF3rR_=(q!2% zOJk^E5)G8>tWi%`*1`F8SF=j0&1vXYl$Ly063xHjXl{P##CX0*5$~RATjn5ms!!? z8K>F7gYt4!P|w0iq*nH(qi7knzVa9QRN=(3xmVU@2L?9vc}?V)32?v~)lMt8!GHQX zKqV?eYKlZ||LGArY`s2Gb%S;-+f4PQ-@H7`p9Y=1!Mih-p#4OqJOIb?SKh`xp%GM1 zEwkO>L%?v2$N84QPEV2Hp0`)_umOOK4m=R_dyRG(Z;?b!371W?Wh7Cb(ex#sDlMez zhPY<3w@OcdMgwOZ8^GGem~5T+qR{g!uQm-J^y^d6*V9>oH0RiC1?MD+6I&9)(`VR93xNkAr2mwVIB) zlXRrI$8Ffz^X(qJUMF0kcQ94GJfzgbS>IW8J%Kc^9ci>O=Vz+I!E6eH%>061{V08N zmsO%N; z5^Eqv9(n52?JrEes@rb?K5COY|NN{)a^Zg5hpWYz?3bMt&?x(PXW^XoqURrdMO#Iz zK+4_L&C}zW05iaeygxT6O=`vwupA~{*wr{lUjN0qtsTA>fyf@XFq0z?wS`TC6fiAB zgIO^okDy_EY-5UR8A1s%*sm^K2kwqosl=2$RcxSg6R+!Y7lmpm*yzk(rE7n&3d?w* z4}D!l>2SN|8V{fhTK4SKBuR^yOo*ncxk3$n8h7dSzIY#8)ZepwD+j0K4uzwd{M?j~ zVEB>Apu!F_E&pg*GVeYLvY-OvnWY`|-y#~ZWUjw`G9cdh%%kte5H30k{b+c(QMM8O zF2!oU=4rqw2^t>1M0%akJl<@jhknDJ2`7)%VKY|g%)Str8+gaD`wIJwc5Wg(#i$L4 zd+_)}eQS?I8^Hj-1o!RWn|R)?@m=!O3n#Y09I+$|jYsVYFO|>Du zN#L#>sN=;UaG^IbP5xy{s}QdTPTu^^%&^YsTU(FnN4geMxr*9!IYd7eczMv0KZupM z)8F}9;RTN~i+GSuixzjLbk5OK-pWPu7^qKlh<#hpIVJ~W7u8_m?oBX0pevx`O0til zd<{I+R%R|Fh|ttyHKN5c zfZ$LAgX0@E#K)<$hc)z=eQ&RQp+v$CT$!nCJ2d*pE-zTk+9qM1O`73=^`CsUsL%A5kG?u|O%6|2OU zeXj~N6PCkY+wy~JS_p5OWEfkgj*9N5QZE!9zj%7mOiC!=2wc{Sn62CJDPzp2x(#B( z_A^^az<63#=k$Oallso{>2`2|37TKu_GSnAHSjabKP6E%sJhwaZp(I2v4w5piATq@ zW}&?o_TfQp1<2Vz7wa8MoBx&e0}vKP*kX~hMuE|Jxh;NZxrxD@WJpqrK4nZ!-YT4N z<_Wvu>3gm&HPL#_j+0nAUq(4lJLEqrjPHDzK-PAbGhcq=cQ*u~&*Q3U7gTf^Ayz+_ z#X(*9_1C5nuC?rsGd(3!j#G~LXubClRP9@{c9XUae`WrqHA}Mx;gK z^iC!wJ_dAi_XN6T?GM;H$BBlRTwS@{twI$wri=d4MR5!N-oRs~UlY%{*fcqi48G^v z78O^wnir~KbH<3MqNT0{l1KmAML5F!K5|0P=le|1(BYVjCiywTw{nh3_p7&@TP;R> zg_y{~(tZ>{&Nctm)f}2@zyp@}Hk+!?I*wKVcaAoI`dY}I`**!y!q)!%4DIVSNDuY` zQ?qbUowk5SzT(2ZiVbH8P=^)E;Fe6ttPisg&xtYF=XUHeQ_%*VIDED**P!=#q3M%vT7rbdM^RHaRJ3?Wjufg)dfaQ5L)k*IeA z@5l3=2KlvBT5|6E>_66gn5;fO_@te*KX*baJkF{%G6{<}*1O+*U{fUl&*$ViWCoY; zhEbSgaw!Xc*DR-Vj_Y2Az|z#u-Gd%A3dx)TG17Z&A|&*Gi4U<9lWjaBCrprIC3C*% zRE2vdGI=VaJ^`75h`8@BxG20w-?vy4s5Fix)LmkL1x)XN9_7yjM3%>wzw5=OrKarH z#ybacmA*<4I++YU_H_(Z^qmd|q{c!r;t#%`*_}VUL{6#-&yTVBNrp-m3i4mXe8L~S z-2?Nx6$RbO(>=qYe&a@44a^Ba@A`BQYcv14oX?w5VxtHY>6EycMhZc4k+XST2FQUT&*?%Pl|p-!=MeiPo{A zpua*OKjLo=6xcl$=FH^$5XjA((Vg&A(D+(4i5C|{e zrgu+hFt) z<5IRPx#3K(Ptv-5s~1ujaMN2Vl--syf9?#6leH2*Ul*I|mh2f!ZcA=-5-*9-y2wy3 zfxYUL50XroAEaOmeM7v>u2H+nJhkh%Ra{po$IOq_H;r5H`o+~E6>DGd37mLZn#J&l zW!kFwYeD{SJH?MvzWz&3Qw(> zTkjDA_~?ac7HA$ua`MER;9@;~Mx$lSx4nzan~tl44d}v)u;zAa&%mQ09WO8t&3mKn z!F?dRmsX2BBy($=DX&e#!szMb{6h^06>8NF5MD#bE+1I5O|fBZB3UW}W03uKoB5b9 zTczw1ZrPma&xE852YHNl%E4Gsgj@b+V)~SZKd{yhm%VuR258fy-0&v5w~V&##d)T) z&TBdkMFX9qhh*JAn`vcY$9>i#Kn86D4be%Kd0q*>@=opH5*qoumFP!1mu z!Tf!LqV0$0{zmqXv3a*6LRY%SuX_v3cpHkgvQGN1i#ol7lMNe(XM*fp`gK-R*9#@O zofzW3uD!mG_B&}2qJ&Z(ISXh%ZMwLhwzvIx!=}kGyti0lvkNz=UMcpa={ zM5tS+VAT>7n+Z4ZxlU^f0!%<9nlW)C@Sr^5mr0P?)$}9NY7-!pbinhSTcKKQtRD8s z#MCu`POoDob2DN~+b~#s8!)NNa#W+OBRe%25*t{b@qkI zXPlM3X2EVY`Fgw0H;mY{OQ}E)`SZ~aZ!Q!$xwd|`4EA*BjjBvCwTtQS>oYiSqX!V# zJH6+ELq4TY?q!?mr=#nL^_bD*%KMghW{7*YOVRLQwm%jKyM!b8phIl}cUjZbi7aOx zAK9+*8uAaBV+8)Js^wt03EGkgQ0RKC$furmPk9J6j9Z&T_XNlmPs_%&d!AtGPSvNnky@z7~a6ucmjP_!_ zYtm&exb|{?8p#svpB}tEOQLko7fLBpsoV<`yd=$e$ca_W(_rhoN)&#!ARxV*BJJ## zr^0SNjMQfU$k|c&5F!SM!Wb58u?0sg7NIU-Ys?5c==f zM_};taC6)=bE!yG5xIy_l?w|Jq>7S~)uRq7p+A*>pJuCOv2+V&DR^dASIur8 z=|hoBz=XmHPqlfBu_Ystgeh(xlvlW2=QW@vL=ncmvs5i66H~)-Pp5rui{_Bb?QS~d z4LT6zr@nWz2P-`YOnB*eFw*RSv0hsz>gF+AmCi^8pBYX(?GYb{3A zugC>ey$*j+vXzO6Q;qS0%H*0i<9)m}txIgdwjF0N+Cc|3-!}PVtoA#SQ}SrqLBW0A z$IA>lw=qfd!j0ifEN;+EmT2wWLQZdhU8znv80rodxqg~o#xJ^WYnoK48dCIkgk}#H z%l^dFAf(Z?38-?h_^r`0j={OT^QN-x{JG~z&u#U^$hXF&%k(8jd8N&fAH;LT9O&_W zhtU4jFnQup%;lEv!haDyOO0LASf)Ptn~hNAGgacoCqd$v5noC7h)u`1&`!T-zu-Ok zJl_PJHeE-3FRgOn7)-#V&W14G9xvGkR&Wj1a&Q=SkVj6axWu$;_LyX0dZiX^f^$~x zn&!Yj`5&wSw5r|IZ#E%kqjV-Bo%t0*USOo?Zup;GAE15}U#uu6T;_i^T*k2`<`p^I z2w~FTPDPWi%~SbG1buCWc7cWb8mRaBLLTUyeCc1iDm=B9GQ~9pTa`wwU;j&iHm(ND z=`QltYcqeAmO@(Rkun9VO_SvPmqBXR1t?haE7qn+4xQhuSeQ2QyVo8nQZ!MRh;M&$ zP4hGaN=-Wz7G$d^18R!ql74t6vb>7kM{ApQW{dsQipBo^Kyh5K=kiwk<;|-7ZIy;Y zE{zJ4=Wd4ibQjZd{^Vm@*b%>V&fO1`2SAuIVFMHJGybMTJJ_1Fk|JNk{s?*|nar+< z$W-(2kR2OOZ#roMFWM+G_ry}FRi@fXzrHtOd>_zkad;oKGb+1w)K$UY8X}-lu3Ig; zO8U!X)jjDcNF=qzMdorWThK(Jb*5p9Ysf@Ml@Q8-k|Z9%6FRi_sgi;?l~fss zySLQ0E37>rCa2|o?^+NP_w4^IT2C~7PB zL9md+>8ldXd_3)={2NLEgLwGabjv~*8-67aK^Mx9N+4AV>S6502W{OTz;@PyGmkop zaf!ide-|b~XC<)qH^pCPmk7Be{^0uT&4YHc;B=XPWCL_(sc@CElyEF>+GbmqK6v{LD9E~H(R zJ(p4FKTgrYzTTj7yZLwNbz_hj@!tkE26d6^ksadZ+=ger=2Q@F;*Hk;G2`^v9=Tus z@}36mCB=OaP3`W>ORH8u=l{(*FDnrw25twN0!$N+xeiZF9uN3mb{4Nqh|bGERLqEt zvM$laY~6?l;+X3h-Y{Hk(s?IAs2{H z$^ivCMd!0~BgoA3UABA}8IUEOk?WzKYCdQ`EFQL>?CKSCXK!j^k)lAxVIaPrQ}|pP zOkYEB6Q7GOBQYb*Qgb4vF{1E!DD&+%JlX;-T=Hu5;$^+q0?_^ntWX5sTv1$3gyrsp z39CVmvJyNtweua!m=HmA@4RxWi;{Vr8$T~!R)~$hQS2#wv zlOXi7TUsP5k7mN^^x2>XRe>b&q73$iy&g4C+uLW~(np;%v5T(XaH0ZWyFP^1OMa_7 zSaT2FAy?w3G_aUJe!Zlh8|%S`w}M@S(@nzi`3SEN0#-W%PlG3u|0#r7MG#MX>6Qop zu2}Byawr@Hk?_skDAXS}0W;K%r$j$qVt%j9AM=Wj*OzPnCxUBpZYa58i9GOh|7wD| z__QgjR&Ij^6n<$3Z(X5Dlag*A@JHw0$~qyVvlptYwgz*4Un(g`Lw*!=mzM3 zcaiO-_*geWvyy||ZkZhPl$wFGAX@{O}#5hsw{ z&0c;mx^DaH(+Y{J__=8jB-qTv76h>m3O_hw*`x4^p@Tq1XIUUrZ+8Oh$T^-5#A5B! z)Z|4+>)3423Tokzsw19~#H_C5HfqiDwgM$goHC-}jY*dK$Zq_V{k?IN`=Mp(-JF=r zKO>Z4B;&M%-@48ub<6jWALZseooz-2kHFmK!Y zA2cZwNVQ~u-#WRQWW(s{<{46zD+==WdEm3lanS&09y5_Box|KifXZcl6+)nQwGQqE zlw0maVv_=!=8hO6ZKDMc>9_5fi_(_-$t_%}&Wfy_mXZqN5V`no%r{c;?IQ;Dt^HQc zY|B)JRKXp&&6~>9ci#*GhFi~6V`>7x4O*|hBoxhQUP#ov3|D!G$8-thq7#_!Hxv5GHXtbn`)jN_bcouaH) zTcxcrVB9K4m!2=tT(sS1n=~)4|FNV5E8P2Ay}UcUXiQKZV-#`iYAj)f4%&U8WBm;XN?FZzXaTz>t z@cWo;p?*oSAF`Z$KV2H}FiZwrs%is0ZP7p?YP4zrAHGz>UC{@OeOBVQ@zvfgCmV27 z*id`?6BkXO=SDZ=(LVaPB{Z5dPnl~$NlaM8TV<`$;|Lt7M31`a4HtmzzToygL}0m; zAMd3YFdAwkl7X;&xb>`v`$s=(Qb>_~ZGo4it!}Ko4!T`u-MAY5C{C*OSc1F8p2`hk zALz$YoU!yi2A9`+!B!cl1C=AL8ov%J9E*wDA;tPc!PAPfxEe$01DSIcmEfqQy8cp{ z9^7qlj~H4#I@q`8{tl=2$aay|jZWQ9dPC_jj4C7_8|SrDAo7cUV0){%|D{edz?Eb;?F_$`oIJI<^{dVcIrHXH ztyP+S0_DM)vRw{GChiv|rDgvV|NR%tVQoVXTPIhPC~r!ngime|lKlxo>~-U;ECtqj zkFD`9A=jylrE^kT+F!hb*QF)(9pVc4osDN9)(wb>jt)(YO9-Q4)ab)u5z+PLeipV$ZWAE z$5eTc0luap>lZBBh}CE7%F)CkqW9OxEaDI6S&1iokQPcR;v0vDPmx_|Ki`ctKE!u( zaUT&5Lv~^P?LMkFXM)oaX1NF)RS|esT{x8I^|UIuCf3X~LzFgdO%|9#CR z5<0bfl8l&mSGI;gtdZD3@{x3JH_GDWyp3INs5aw}11mxB@x?orAi!|SJWBrO0J^@J z&~OIi6Knmu8H%HV!}=~3>RDackX4%kZbg*xY>{uNk`VueRiky@UtqzeQ74Ra#sl<&7u1Xhm!B0p5 zIyS`6Z{8#nOx7-jw_+)Vlo+_a!P5MTw3JL!Wc%p+Yhqs75)GQTET!5bi}z8vU%b&a>{E zZMVeH^|NAm(MDC}grmBJ%3OJ=6B-02S2r%j6+Ld%tOi!y2uG@z{Yo(Wrc|Yh<*IsR z*4H|$C2T>--^%TYllo8LzmwPfC(U@@27@NiZ^{<#IA_Ey@z9W#o!fc0uGiM$3l~J)PX5_2>jIkh(nV z+Re2Q$9CSfO!0@~&)1JiI8_4uKXpZ2!H)(*Km4Z|S>dbRl;6QPoi@f4M)h{c{gi5q zP$R#3y6p(L%ylRmc@ym!1E)BI3{{%07MdHJ7qpXDs?uo_WN6gO;s~s`IXSxO(z)2@ z2wNF58*@C69b=kHcx%)#+i9=Qw-~K>zdDip-cw2XMN$g6+QLqeQjqiN{shsOCtaw} zh*b2V`YoiA{&z?r{lRujIJGILrVx&}mQAlr84;S4+*mpqh`@Iq=Th*LNiICm;();y zYOErm8nJMosviF@0QEo$zw(ANJG|%hLrhBB-2X+1zDv}t)cw$upE(fQbc`W6^jwq} z0*=T`V}VaxImfH#R%z-M1SQd%$OTwmx}S$M*1Z7;GR%|h2|oSJgB%R=1Zh-CK1UoV zHqGcX=8bQcLD59O&rdH76jEmJS{1kvx^9?zpK5aJLp?fiY@mbaK*U5MV&h9Ie66sJ z(GCG#VN}+6_v;JJobNCs8+i4AH{)2cnOpjj-6fcyit$R?)%039N~T%l+P92z#^f?W znI^qAKN@F{Z^+_0`ZdY8*e*#aNA90wK^ON`V6k zb-0+qs#7<^iKBEwJi0Q^fBfn}o?M-z)J7_tOo6GQRd>VGnSGv+s7q5lrBQA$>lgX( zl@nZc?mD9^+r=KAqEi~icM;6X4F5t8{8zwpPw%-a7Nb&lVc4(pzRSjV+p9Mj4sBCL zIza-dqfwdV?zvLd zc=*ZJtD_Ll&zD6zf{_$83(2vJDz= zVq>_y&Ha4h%5lz~U8Tha5-m$Jhl;D@@zaa`q{$W@F6U8`!@Y$liVJP7IAeutFKsgB z4pV3VvCws`T4SMlhKg}!a{EV}(AG(={}J5uV9B~nXYP8RfG+(JP|WrinG414>M*4K z47oR!`G8cmAZC*i1)^7q(oxC?KVF&U3%9Sbs*|SnP48C}bAY$5j%A(ZvAA>gx;haG zI$ZjSHdmfo(2Q$%i4a>>fTY*oMPWCMgaHB(eBxsQA|4-m%r=(!&}9>x)LOtr<0wWK zlGrBmK2twBjVd)Ns-87Q`R08aJoxMwTW-X-clkX_UCt=StB+lyMjv%CR%7QQU4JEW zyCf^9sH%aAIidpMSc@}!?XE62JlLS?r_2#cFsJzt28xKmjzb#ZN&XjQST?v|?!J!qtZaN1WXu^^A&U1wLN-Lj?Ghk36Y$ zwpk5Rl;TJUwSZkeT=vG>WroEyPJGnGSdEtt6yw}zi6Sg)O!MiRS9xe*g07!PKV)4A zgY^H@{Qui`I}O4}>~Ph2k@vr$$%Gsv5-K8lrABf#rQaLjQ5zRAhpr@hL}+hEKE77=c)D#e|6(3k1frij8tA&ZWnF%#{w>b zl#y6~#)uQoq0LdQyKR+2>!b9A}FN z%n%)^E0#nQ`EVodxvzhX8pi>3F;?T{15qL&U7sDjSkhyZTOJMSgYca9c ze%|fuJSZkq5Z9$49o}}Hh_ zD~ppDBSBjH^Wq3!{oX2V_7cU@_p)PP6n+HqVL*f-*16=&CT~5rK}*_1R{#a7N%O0_ zrx**Wn37?OQ%08gz@@XyHkZkzlDL7n*pGf^M&-6~^|NGh@?msj|bi+9B zh%p*@7_BTL`Yuz0Uw|l10;4Q(?Hh;q$R!OLx`>D#v$$-P6h$r|uE%`y5P$sMX9Z9a|n%n^*USk!wT;qjd zo@B|3Ed~lAK_gp!g0J6Oa_f(W+4PeZFrWOdz@aKft}KHC4Us}&gjGKE))wdQ?cgZQ z9;0%d-#wS~!g;hT8D^Cay{X`Jr*tTEt9o%XjWJPD+JlXI&1VqA3q2X)zMl>8`8zh* zlv!KrAt{d&6`}7j7*ivB_Y|}>b`EyWC$~n8Uj)U7zB-T%m^7GOH^jpWBmC{RS6PiS z1X?!gNYt@@I?DDD<)GrtYl&!NTn_PpH?_Fvv@R`O#UCTnS4r&1NuO@ATy3x%X87WF5AsxJoEXgl zgrs(^iaC5bqzNv%>Kaj_#_>d5jMaFV!4!m+<7c^kL9Fw&$t>S|Q26|vk(F{5rKp0O z`-kOBw(g(Gw|QttL}Y{0raSzrYbH2-bdi>>Q#@zP`656ZE|!ew60h0U;lF>!EPI=W z(qpg!K$8W9Jz_z%Vb4EhND>taVZ)7c(<7eG-oD8u6Bs+XhnMW%WZ~&SYy?zOYJLt< z=TPXO5>qIB%8^u|rv>*tUGU}a2ex#UGB#3?9FKTibFm<)6C@TCPLHOp@}AcUm;KrX z!`i_|E6Q~jIb?b5GTT_<<5vuG#`ro7?G11+2VN-Yf3_+|89ZA$#;uPGbN!Dz9mc?A z`xS*0)n!~UP0DAF#N_u@qsDPYz3O%V>ZbXN1W}^PWcn0eLqwxRCut~Hk28Gkjt%a6 zG7xE*!ZLeFJx67wX+oxH&(-a5&&tU&a<*cFVZ!>e-2Xq!*HZH#^6 zOB8hNv7`<_Zeod=7n6$-r_p?{)W%zzGs*a-6ju$RD@8biqYRAJX^w zue*yqCfpM5zS!~33t?Cmh(1;ww*C}ka4cn8a+F@OGZ^f`Wm8s7eJv%j$%Gu_!*8DA zt!D>@q>X54K460RkC9Yq+0sJnv1+g%Drs=IH_vCkwZsDlC+IPnr2Puwh*7q!z)BbT zGG0Ev5LNV!OYd6$`!QQB(Bfz75%r6>!5hyC zyz>H2i&aERqKjBGmA6b(&FjakG*k;4XTF4QU~thABH};+s`eQZF%LYifitJteE8B~ z#$^d7;W<>zJcL)ltSZtHk0NX`&gbt4-1p1~TQUSuaWoJH^DA{5_fb%!D#A{TswS@l zk?quqBd`0_&+Cz0>-vMbQ&1OUCm>u^KnbdnE}p-*7>o3Yz# zrhPa3YHX7`d)9do=TIqFW16pgzvPA=!lq0kYEepxZi_WCB)-_ocKsYJasq_Ce@-P` zXag>dEF;1uWBk)2o?9P^beRGi&I^6HhorqUTbSh1P9Zv+I7W3p?|;h(=gn`@)GY*O zDGa3dT=IxB-)3^9e+gYp^F7;Zk{_cLNihbz1V(g$558rRi}o(#b%P^|3UkEki)yT% zvubRUF&@}I#8?HG)S@9zWV zyB1=KkypjlF3mdv#Y_DFYCJzgr0QzjamV*4w>FMq1R>mW-vd9;)mIGgG^Hh6?Qih1p z{K+Dql3nmiE6rll#;FpFaI9(8=5?sS_^UU?EHPwdB)T~LRLkiEx{)EQBS zY};%CiqduC-1B6M>%OzhYTTC|bG=@U8??d3)(l_#?tWf(_CC%YT>t`=6TvCw$9ei6R|sLm`e3e0kY*~sjT03Ge6#@VxP2OWTu}rY4@QZI z7WRBZP>py8UN?BnzBR6S?P)Z00jp1As*kpJ`m3fg3SNl8v9K}2=WbhKC5{7*LQH|9 zu9pt0CwOs^KZ4SqV*rS=tjz}=c#yyN%g^8oYX@$laH>=X$EeCP&+M;kdTN~5kkih& zsJ{9h2mCTc(e}||>YW_rK`q1_cpdA4>|YG?(`ssuvnLPpe|>z0*Y8`P$r`y!5hdGX zq%*46sWiLUr=Ey$TLe~gme1d<{M)ZXhduOEjHjXj(I&RjWNE!rqe5e~*#TZ9fCh#L z>}?(9fBDcj?>MK!kgg!~k}X0(9!nvPzVaY-NYco&WQa#sXZb(=ewF)wHp7-o5~-~& zk0(S0ufm95;*)RMGaj2DLx0?`RBf(r`btvf2_ffYqS9WGdbQi^A(+{^#{xpltz z@Hic2P^Ux}G3y4%Te{bPXtIcPFU@tqr6M!BkUk?0q(F%@Wu23U5Am-*IL0-vT%Z{@ zL4$R2LmcR$WoSh)&{(kPruf|5P5$lIx-5iwOx0QtL=fqvkLrol_1XpRFxtLg zR|e;#|1;Z)F{&aiUpIPXeD00?5;$@{s&Q;^0_%=`v_(gDsahUD=OAQ@743IP1d2 zq$pd_J^aIM8$9^T5Ir}R8A`|L^{oN+4wtT=!#MwR?*{ijGe%?x7!175Kb_W{dL&xm zjwlkr#lWOr;)9n?bISNCPD-G}X9oyU7AeN3%3m)XbU*Aq%#CpAkGe?E-8Xf=tAu0pgL5m8B&+QzIvt7 z%YT+i8Ljy0g-98d@}+En*7&91CudLkH!t;rsIeXSgXg_Zqa%0@d-VmrVS$_W=NVJL;)c%WKBp{{eMnGGWcUBOyBDj17kcEnPNl6lC7%}Lo_jzN+lFHk+E%% zI#_&W8o>akxPRU6AL_)Vv8=v0Pq*Gjjt_R`F=3Y@bG~v{434%Gd+zPj_?N+9Q7VCg zEkDE8?iFr*MA&4KsExG6*_F;^&Wc#)DPj>dF4;+l7{|R(l zj-ZUYRetl$Q=C2BHm7>Bx=!-lRrjkeA%R~!AcEJz)~2(A%Ve>_wUgWm$-LeBh zR)$L=*;j?Zz~dL8EQY!3r$gNE!!8>#kvN!uYMRyuM0b`4+b_JHr}Ng4Z)KjU4E$J) z9e}zsR-?xAKs1r?Re%O-Wx?Z5{*2e1w~yJ8E>1UWOaw@B^HyhFF!L}<$I_%;6BN}* zQIwoK;o0gHJp9ZSL5ET8t6$B!q96dlD^7$WI*PK#jC+Rv@jX*qb!MBETeT66I-C~i z@%B}eDt#qncIq#s$up~S{JXC#aPOhL^kg^{dodM&N2(`l97|*+uX=ma%F^@GXBWBr zHKR-p1w=}4(ekeoUnqCQq#BQ>ah;lQW2D$(Xl#c2{&|gdY=SEiSwDA|V!EA|@|}(* zDv3Ug&n^7>EoXN4Z{OjWbW3;!M)L!YG-}BOlwpSC-$jpsmdPSYXWgA)SETDM@cv&?yC zPBPNy;z*ue)uG>{)O<3VNJ6e31X)-7~y;c8LaEtC?i`db9&gniPnI-K%S` zs#ARa`|yuH6xQMtA_a=WMNP3s={O{Vuj2`fqphNjW<2s@Je;~1J1(fllr?HR52BiP zkwZ}pD8i;p@vR3PU%GvZl4;O_7yu-VMKaGTk5@47vPAF?(KbV;UG}yP@~L-BaQ5sH zLK`hol#Mu|*nrZhbupU0!|P68G47X8?V693OWB##re%T0nJbgM#bSgmGkoho z&p+PVWtBPW#z;tB;g zp3O-sisFE0mP%it*pPM3o!Q{SS4=VCmW{WFjY0=~++R#6N=U`MsN420{RDvA^;Im^ zTxjSPubOG|zBi3CQ7q$dmU@IemnwuJuWAKCB^hV2H^pafS?00jNg^X?45SoRl$heA za%Zhx-!)EL)T^^bjU!-}aoZe;*7b5x@IaS>{k>`a{N`nzXiw3Tra9KY>hE_8t5oMSat~{s9doCJdJhsuGC;@yVio>JK_``hYEyG-J(k8=k1)n-8eWOR~ z5Rk%;A=z0-?j?8*#gq8!n^$@Gz&K^mGBa5O&q`@)j*PwLXp zE{H>1BXP^}2=K*4bOA`2k5%WbKLU5zkIzMd2Am3$ta9y}MmcM80q?qi18@8{NyTM$ z!ObLqOq>fex%06GH$6H;V3;5f#SD%`mEi36T<#HT-50BI;-cn^)u?ddz@b)HSewF@qWVf3g+J#^fs92auhM0M5DGgTQET6t{lk4vtWt~Y% z33%s`ykSbj;nHT_CxzEI4$#!CsXClF6BJ5qaPZ&(UipeyP8r?8YneDtA-zvjq4Xk( zq(perVF*fKbhydX^bFsB=vh{DoD$M_(8hKz<~yBPlU~iPLM7yy$wVR)RmaTX@XpbQ zE4=rDEk1U|IMc-;yxL))?~Mj7W(8&6Dn@aXGR#vOr}F<^x1YzBX9)~tLRgI#88v6@ z_@M5L)u{12Fq25*d|8)E$uj#gdN%zYZu@b;_4jSjVY=#!A!(CSOfgoCY5JzF{quRG z&@E0LUg3AHp6ATb!!)&rj|DB=vnC9E{2GiBl7Rk`eBF zY?!azv&E{6&~s|a%d)_cyJ^xNdA)=@qL(KUr!S41k$~9^J4%N5$;voix?`12+=J2t z60cDEzYPPUJT-fh>}Js@S9!x}9jW?F}F+DoQbDQz*Y@ASP`EqNt~V_nC%@rRo{bZ~;eNX-SSvExy9#%k1f z9#r}*XBm1(cJJ0ivTw1;5Rd=#SzdYi45v+Q;>EHhqheMSkdFD1rYorwOC2c@>rXfh z%#J%oMn-t>Crflo$G+yX{K>U5T)c0AmTqDFj5zq<(rrpb;?M2{AqqVi=h20E{+}-# z;*riYU2ooKKH8{CC7=W&?@QvD)k4bS3;|8CM52}O0(Gb>C~2{t|!@Oc%Dcpt? z`+3@(`=rt*^{eE*sm12B{5o@c_Hh5B%PedR6SK(U7`@N-dC`=STIn~_BMqpS0qX>Z z_{e3${N{xl46$sZ_ibjT$#`7V&=OYz)+BUIF#}`T*>%AtcOUqn%_BfNxb%IG?g(;x_KMO0akb7fM?Ky1`xPUecbG~`l2Wthe8JpbYP4!1u& z#D<>)6$&*YTJez}C4)R`b@q5_pRwZ!sop=Q#xJz4Qc6-#p%;aAXO)XzIm%?KTaEA1 z%-p)QDI7jEIqmi&5$Q!48!3p|;=aeX*osYaqmP45?k^5BIgmzytTM@km^0@*R2&W6 z;0>p(@cZu=WnXg%X9LvC1VHepICQ{b%tb3Q1D>@o%YXc*E$)80Mc0j_m$F{B#|m{Z zc6?A5V>N0#9~7z$MF+YNnWL5bj)H5ku(HM0M#<~X8KoiXc+oWabHr*KXoXq7{z+{p zXT@D4(rR=$=hPOXP2oLn8ezsC#%VA@vLqu{>HmICcS&VpdTdQPdJ# zR2?ofanXYWqJ%2w+*QxblzR1L_c%iOe>lym$Q%=7qrQme;K~LQ%^nw=IZjL4m1&9n zvZQs<|DGu{b3vmN^w={!%VW=O@brp>#0x$N0AAdulRI`*#}=^zjDsj15t!6x`QzW1 z=8}__X~oUH>2bDXNfUETX0;MDb#sMHndR1pTKxH~J=Wap5tH?L^&Sh<#n|ydU5wSJ z@jS2%(pB8C?OA?zt8z<<)Pd6exJd-OB9x5z zE@z)wFy8D?Xo=U<5z7%rDwP;OCE{GPO)J_MwI{>e@@R|ybYq)?y?LNP?l%|*&J<@V z4yU#yi~20XJ0>c-8ZQI|3HWGhOdZ5*Uy&lTz!Sx@xVXZrP8(z2_T0@l zJK6Fgx}+kEk)ak$P7HI$LmfKhC?T(_7ZENA60(B0qETW2?cce{QIx3^5n)eU7E?EzwYQBOVq{K@j*@CuTkR#P&w*r zzSL(+fixmS@Crzab zS>^r%O}1h&5V<)hVX0ALXQD2~YSefhs3^e&qQuH2Nh*_6>oAFClT{_S77r~>^QYGz zWPfiTrEi%DCy~l9DawF}EH+|7Ol%gCo4N=@O|jp4M08CWC_rQrNP1OG=FyE zA?`jf!G??g4sj_yhb&1*;pHi=DI!D{i7uE@uf}nPBZwoU>`A8qr;1li9VYXU+ms1z ze86$@!=4R>aV{4Ke8ls!L*v79>gy2kp45_o6 z)}43Cm|x+8Z)|Yk-gO#rlZX;rYRWq6{3;IB0;oukD2}d-bI;QweEF^(>rCUcVFw{q z8{@yI&!k3;BJFJE=@IG}q z5}QUnUK6q3=96gE`!b?Tw$O;$SN1E>Mo{V!pT_t^0VC`S4K^9&rUx5*^8r|wakBe( zBo|q!q>N&tSM{dk69_Jvy+VCCIPOp+jg3<$OLeg9Hf1HY9@}n?FWtVt)2l6lrtz~1 zd4Xyo&zmqqlhs8U;|VyroHgCyH{LwYh%6wK+oF{!MM)BsWHXkdel8O2^CDCcU`BmY z8mx2PzR1-V4Ku=_zSzKlYD$5~zmvx3szP)^q{YI<1Yf@WF#9*AP#So3xFD(Etovd$ zc0TH>Z;cwy11nfEUo2n)!@gOjDc>N9{hNdW#k1;W`I}o;x#8h4Iyz(KsxjKh-&s`4 zfQb?=bui4((h8{3N5omDOeBKS%8A@X6BGpT^il(%)KTu%v zUJe-0clx4$ zlfb^#GJkmG7^jV{Aksyh;3@2IBB{fxf@nmgXRm=+*KmsoZhUB%n|{=w%cR9dY2Uvu z%8T9Ot5M_lqrU#usPVk$yCV%Yw+8-V|E5J!u7xyWX|Pbv@!6Xfcx-usE~BU$m{kJ0hEjLoD{}m**a1?CDF>bhbjfb9X(qj~&6)jN&jhSqne>vU0)70<^co%5t z5+A&5A7_oNA--q7zVO`R3R*7dL{cL~a z-)GHP2iM0uP6uf6lhqbqx$^)WnX+S%NNNVAvHzgDv__2`ino74 zDdRkRc%1+8^=0;NO;ggOGO;|O5IYj7fkE=dpxU@J5$*@R=VL)z_ww1>R=Mr5CS4uF z9Nmqi?=>U}c>OWo*$|wzkXR7h5QoYsK6A?=2i7N0DJ=aVcULu=3WKQ=w;KfuJ-q93 z@oDh>i$`c^8|V_HOCTCkQ34`8oJQ-~9%VtMl`)v*P+I(amsd`&@bSwh8Fx#l^eRPg zVwR=xWad#OK?26r?1X7P_ni$MIXq0)4P(7!mqwvh%K2FL#cJ$))K}>mHGT#32Z1@v zS&2?rmvL@=#PPMeHfiguZJOK8@IP;Z%Y|30HZG@vBlb5iT6A=r8}8rYYxi~OxG92f zC2Isyr!FZ$>%D3hz=Fg}V9O72+v5#x`q3s^GErGv81mmW6=I3`71KCS1H>-l?f~z7 z!w~21?a`DDRWd|cYnA#I;pm%Vd4-z;zoTT*FYx|1PjJrU63w`UlQ{6WT*|8)9Ia9n zl3h2(Jx@2d@!l?LVGMN+k%ByOkEv5FxqV!t#tueZjMb>|D?nYaAaMn!nj(uL(K*_2 zn!o>Umph+mvBl6phw2yXZdFcXHo#0iU@Gahg-tigL(6;l%Ujy)@9qIwlp2#If=gs> zpEk!@CArg~5)l^>i3D{lmD5~z`x=k0P7_ilB;=LV=Oo(t5iCZ@3iATR>pJ_!SNPba z!^|~St=LcgbuOC3F*qT(BMPOT|0t_N0P68<@Y+*5yz8|?47(04hN@9lb$DaqOxlwq zNHiqC#~nZw;_kReMAAmB)0>3E{JdUe;>6{w4`8Z~|eI5p!=bv^rr7DyC4 zjvm82wK>h7-Efdcm*>;CQj+*fUO)sUFc63KKmVJlh%PKYjfmKVF@q=Z0_y zg@!~1?{`XmnXR`gXUtPh2f2v@HWz9Z7&cPRCaFq8 zS9tsRUEcaC$8fm{QlL^;ugN(A4t4IR8CjB)y-0(?1x_AW=95>=G1u4+(gl1H#n?eZ zQVbI6QjC`-s~E?I%<_$U19v{rqU(krserTnhd@#UrwFOK{aa&)qb|m3)c6%3YMlhd znP(D;!=cfkje;$0@WB32zWD9KZ1yB=HV|Xv`Hig=b+O+$AlV$KW_cZf26sQO$`2ne z*<>O~`@49eb>~zmqTN;$2U35`cRcz@;5N37&|`v|9_VrBQ!PUBwM#!V@JAA%Y@0RO zSg#;5;aB*;o5wk2bP>_gM%yleM!YM2N!JKhjno^l!#iK&xZu>1rmTZN%;VIGTb9;& zigPlNff8u))Ak%+`pzP&VTw|lHjmHGTz%Iz$^N4Wlee zG#;4~VvH2xh}z<*XE#_|>mtrh_u?G!1<5#r_7|yhfUk-wFC}N6(d5*b9<8v3*JyrD z7@sB=Z-Yv;8ao+UsRjolh7kDK#w4G>i_5HZWB|rr5!QkOT;3 zsd1<~&tG1@pC>yr1Z~+k(&e-P8>I>$$@Zhx0@v6LsEe^0HGV~8|1LYF3rHl=O9rnc zGmQn__tsOHnQB30H=!?(1DTxo?M72~!~CbL%LRpQ@N0W|eDsPv%r_1r^blzfwJ^RI zmOp7Kyx4dAud!nx+Fxfjx;A5o(vR`Lvkh*zA2xLYsk)$p!S9L8UwuK+?E-;e*XA7; zk8=K=HbZpGa2023Rm1Z=oacXxqC_njcZa$5(kbSf3lwp)ssml_gjL6bJ}(jljgIKX zx$}u8w>=u!^3x!K_#XLlkq4aC^;L2N)6uI8YScI}Q5R!1YWxa_E)ZQ0r={`7090rs ze#>aF#>d|_$>p!?;AIQd0XEk*gH9Oac~w>fs&?D5g-8hsUWHNCxcdAq?|oB)VZTgt zn;<3X0;MxkSjaZDbuqTHkvLzKAD5>TPoznVO*-WapZnG#j~{3d5-)N4*C3(a^uIBs zM+gEjaPr6@e*5h+%od$0=>Zp#Z`sjMq=T|m{Yz=>YCY-*IbY# z8w-1ig3{n%XN1q(bckm*CkbLaGSM>GY~(~(fK-r5-<-Kdjh&3T7<);f179_EBBBID zB8}k9Jw107P=;lJ%gehf|Nllyh0R5vb+*i4a8zKBf)JRB$Recsa4i z)FJd3_lNoDWs|(=)GeB^W4ly{G(=2PAdovGHFh$T;CiSFIQ6*baRiiZ;#m#zY`ewZ z+_}y(I!6%DSXg802oEmF;t??m7Ey;6Wk}a}!x_rEE-V<;Wzayx6M*1K(Ae)lX+9*R z^afGTfR}YnX&&I?Z=Pq)w~@GorAqWe&_$F$BzQG{Gyzm76;_zyOW!Yf^uQ3&kEPBW ziQsQJuSNo}V@4j`#=%U^T>u^UOBI-|+kZf^7h%13>>AWp>6aY!hiNB6aUcbV7;)do zEHv2QRWmF6-rMKd*IJ|@sdHA*b_PZ@X(w@s8|0!OF?T{T>3QHz(;n8;9;b~Q=J&7J z!#U$^TwF&AkH*BKNrjx&Yi!5E#)jrfpG{FkBH|#b(3MGUeMGtaQDH+ziMfE!HeO`@ zpm7TAcErYjY5_=7%_TniwqZ^iU1G>}iBWOl5G~RY%vKqScr#r!k2Ao*glqHOOGY?< zUzChIzm(ikw2_0`9upCHli74D`&?8Qf2 zufBl(=7Ixao*m-Z;PlB=uDxuANfz-E zaT+N?Hd?hxC<;V0S*}>}gs0>+dwRV0jgz$8VUQl0X7ZBm&uW6y*(8YRlq=>w(y*?s;W$X(QntE|DAw(wZEho7K`IknRJ{C zD@`S5gyhm=o@J6`|JaD>NE)?`AR~@0BP{a!R~B4;R+pme;3Xh2;H0MS?|djo&v<|~ zWCRs78mV105Ge^hvg)S!%J#1S7u?3i?T`s<=tAqe98wzJ$p~J<%NyCf$_B-a; zTkJNer>GC8ws>@P zp3mLhW;x7KszbHJQCiXVGF-ibS8+Y^8{2;9Xs`eEzOWNe7h@+Nq+)jeGVQQ*a#kJq z{Tjy_F#-q$ipCx%j~?Q8uAbwR(N#pdDa@E{BNuZj7f@5SDT-=DwM2+!7^~jiM*&qq zv@plS%DxTc-P~s$u^&Q`(E}o4&rnRK~k`Cy&iTvlDocEN{)cjV7w^>Qx}%> z#Pid&3BK^%HtRY?q_6>Fwp39iJL*?_M9GDJF77tDaNj2HJb#EG+5`vDD^9vN?IEI+ ziBDF<4fc(;`OsTNnQg3^;+KdjI2?i>xR2D;)tIL9jt!>x#@$^WdS-+WTm1t^%to~@ z&efxv*|nR_Q{Hz0$-pbV;QPh|rNKzWrm*jrTj& zWjb9yOweKLDHrt8FYuEp*s0>BWP(F{?D7dNI=PM0o~bg`#405U-Xp-I9^%?d$GBkM zDh<|Bmlwb+Eo_W$ro}l0K)eExQb)M`@ln3|y$)Nu_g_l0o9xylgjbV1DH$pJD)=FdnbH;V-zi=!)}Y=nZ*B8?f-US_?F z(uy~`QzRy?PreXGz(<<#Fzm8I$yefiC&ljIl8q|<3vU-#47nlD($n-L#tvZ zO2Jy3;&XQ#;8kbL^Xkbp3f;2KRLXy}n#{D7a>Uy7DnO4{%&hUgONMyxt1Gm1j-X9S zjC8LAeB9#or^7p6Q_zyNG|C+G#Elf2wjQXd&_IwT_wFC#^WR?1WzHl zNj8MAmaGx*t#gu$A|#mGzf*=}k*m(1=Q|H}x#^K5*4-@8S(W5s$(�qgTvv#`qzK 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 z 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 POoDFRF|4@h^5nk&O4;$~ diff --git a/docs/private-mirror/index.qmd b/docs/private-mirror/index.qmd deleted file mode 100644 index e69de29..0000000 diff --git a/docs/r-dev-environments/index.qmd b/docs/r-dev-environments/index.qmd deleted file mode 100644 index 57858db..0000000 --- a/docs/r-dev-environments/index.qmd +++ /dev/null @@ -1,32 +0,0 @@ -An R development environment is a shared Linux VM or Kubernetes Cluster that runs an Integrated Development Environment (IDE), e.g. Posit Workbench or RStudio Server, and other related applications, such as Posit Connect or ShinyProxy. -In such an environment, multiple users can share the available resources and configurations can be set centrally for all users[^1]. - -Using package binaries in shared development environments is a crucial component for the overall success and efficiency of each individual user. - -## Fast Package Downloads - -Besides using R package binaries in the first place, a fast download speed further improves the quality of such an environment. -The binaries of this project are 5-10 times faster in download compared to other available binaries*. - -::: {.callout-note} -The exact timing depends on the location from where the download is initiated. -The closer it is to static cache node of the distributing CDN, the faster. -::: - -## Reduced Costs Through arm64 Servers - -Besides accelerating downloads, this project enabled using `arm64` machines for such environments. -These server types are substantially cheaper than their `amd64` counterparts, allowing for significant cost savings without any negative drawbacks. - -The following example shows the on-demand prices of a 2 CPU 16 GB VM on Azure (2025/01): - -- amd64: 0.1640/h (Standard_E2ds_v6, eastus) -- arm64: 0.1150/h (Standard_E2ps_v6, eastus) - --> 29.88% savings - -::: {.callout-note} -Servers with the same specifications but from different generations can have significant price variations. For this comparison, an effort was made to use the latest configurations of both architectures to ensure a reasonably fair evaluation. -::: - -[^1]: For more information about managed R environments, see ["Posit Software Installation for Enterprises" offer from devXY](https://www.devxy.io/posit-enterprise/). diff --git a/docs/styles.css b/docs/styles.css deleted file mode 100644 index ce447fc..0000000 --- a/docs/styles.css +++ /dev/null @@ -1,31 +0,0 @@ -/* css styles */ - -div.sourceCode { - border-radius: 6px; -} - -p code:not(.sourceCode), -li code:not(.sourceCode), -kbd, -pre:not(.sourceCode), -samp { - background-color: #f6f6f6 !important; - padding: 0.25em; - border-radius: 6px !important; -} - -/* sidebar */ -.sidebar-navigation li a { - line-height: 1.2rem; - font-size: 0.8rem; -} - -.navbar { - border-bottom: 1px solid #e5e5e6; - max-height: 50px; - -} - -.navbar-logo { - max-height: 30px; -} \ No newline at end of file