[
  {
    "path": ".Rbuildignore",
    "content": "^.*\\.Rproj$\n^\\.Rproj\\.user$\n^\\.travis\\.yml$\n^inst/web$\n^docs$\n^_pkgdown\\.yml$\n^README\\.Rmd$\n^README-.*\\.png$\n^pkgdown$\n^codecov\\.yml$\n^CODE_OF_CONDUCT\\.md$\n^LICENSE\\.md$\n^tests/testthat/assets/site-dot-github/.github$\n^cran-comments\\.md$\n^CRAN-RELEASE$\n^revdep$\n^appveyor\\.yml$\n^\\.github$\n^fake-index.html$\n^CRAN-SUBMISSION$\n^tools$\n^\\.lintr.R$\n^vignettes/\\.quarto$\n^vignettes/articles/\\.quarto$\n^vignettes/articles/*_files$\n^vignettes/articles$\n^\\.vscode$\n^[\\.]?air\\.toml$\n^\\.git-blame-ignore-revs$\n"
  },
  {
    "path": ".git-blame-ignore-revs",
    "content": "# This file lists revisions of large-scale formatting/style changes so that\n# they can be excluded from git blame results.\n#\n# To set this file as the default ignore file for git blame, run:\n#   $ git config blame.ignoreRevsFile .git-blame-ignore-revs\n\n# https://github.com/r-lib/pkgdown/pull/2865\n3245437e22fb284f9e9fbbb62df5ef0ccba47715"
  },
  {
    "path": ".gitattributes",
    "content": "docs/* linguist-generated=false\n"
  },
  {
    "path": ".github/.gitignore",
    "content": "*.html\n"
  },
  {
    "path": ".github/404.md",
    "content": "# Page not found (404)\n\nPlease use the links in the navigation bar.\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "# CODEOWNERS for pkgdown\n# https://www.tidyverse.org/development/understudies\n.github/CODEOWNERS @hadley @jayhesselberth\n"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, caste, color, religion, or sexual\nidentity and orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the overall\n  community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or advances of\n  any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email address,\n  without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at codeofconduct@posit.co. \nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series of\nactions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or permanent\nban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior, harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within the\ncommunity.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.1, available at\n<https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>.\n\nCommunity Impact Guidelines were inspired by\n[Mozilla's code of conduct enforcement ladder][https://github.com/mozilla/inclusion].\n\nFor answers to common questions about this code of conduct, see the FAQ at\n<https://www.contributor-covenant.org/faq>. Translations are available at <https://www.contributor-covenant.org/translations>.\n\n[homepage]: https://www.contributor-covenant.org\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contributing to pkgdown\n\nThis document outlines how to propose a change to pkgdown. For more detailed\ninfo about contributing to this and other tidyverse packages, please see the\n[**tidyverse contribution guide**](https://rstd.io/tidy-contrib).\n\n## pkgdown and Pandoc versions\n\nThe versions of pkgdown and Pandoc used to build a website are stored in the \npublic facing `pkgdown.yml` file, e.g. <https://dplyr.tidyverse.org/pkgdown.yml>.\n\n## Package reprexes\n\nIf you encounter unexpected errors after running `pkgdown::build_site()`, try\nto build a minimal package that recreates the error. An ideal minimal package has\n*no dependencies*, making it easy to install and quickly reproduce the error. An\nexample of a minimal package was [this issue](https://github.com/r-lib/pkgdown/issues/720#issuecomment-397606145),\nwhere a minimal package containing a single `.R` file with two lines could reproduce\nthe error.\n\nThe quickest way to set up minimal example package is with `usethis::create_package()`:\n\n```R\nusethis::create_package(\"~/desktop/testpackage\")\n# ... edit files ...\npkgdown::build_site(tmp, new_process = FALSE, preview = FALSE)\n```\n\nOnce you have built a minimal package that recreates the error, create a GitHub\nrepository from the package (e.g. with `usethis::use_git()` + `usethis::use_github()`), and file an issue with a link to the repository.\n\n## Rd translation\n\nIf you encounter problems with Rd tags, please use `rd2html()` to create a reprexes:\n\n```R\nlibrary(pkgdown)\n\nrd2html(\"a\\n%b\\nc\")\nrd2html(\"a & b\")\n```\n\n## Pull request process\n\n*  We recommend that you create a Git branch for each pull request (PR).  \n*  Look at the Travis and AppVeyor build status before and after making changes.\nThe `README` should contain badges for any continuous integration services used\nby the package.  \n*  New code should follow the tidyverse [style guide](http://style.tidyverse.org).\nYou can use the [styler](https://CRAN.R-project.org/package=styler) package to\napply these styles, but please don't restyle code that has nothing to do with \nyour PR.  \n*  We use [roxygen2](https://cran.r-project.org/package=roxygen2), with\n[Markdown syntax](https://roxygen2.r-lib.org/articles/rd-formatting.html), \nfor documentation.  \n*  We use [testthat](https://cran.r-project.org/package=testthat). Contributions\nwith test cases included are easier to accept.  \n*  For user-facing changes, add a bullet to the top of `NEWS.md` below the\ncurrent development version header describing the changes made followed by your\nGitHub username, and links to relevant issue(s)/PR(s).\n\n### Netlify\n\nWe might ask you for a Netlify preview of your changes i.e. how do your local changes affect the pkgdown website?\n\n1. Build and install the amended package, then re-build the website (`clean_site()` and then `build_site()`) which will update the docs/ folder.\n1. Log into Netlify at https://app.netlify.com/sites/, and scroll to the bottom. You'll see a box with dashed outline that says \"Want to deploy a new site without connecting to Git?\".\n1. Open up a file browser, navigate to `docs/`, and drag the `docs/` folder to the dashed box, which will copy all the files into a temporary netlify site.\n1. After the file transfer completes, netlify will generate a temporary URL on a new page that you can copy/paste in the PR discussion.\n\n## Fixing typos\n\nSmall typos or grammatical errors in documentation may be edited directly using\nthe GitHub web interface, so long as the changes are made in the _source_ file.\n\n*  YES: you edit a roxygen comment in a `.R` file below `R/`.\n*  NO: you edit an `.Rd` file below `man/`.\n\n## Prerequisites\n\nBefore you make a substantial pull request, you should always file an issue and\nmake sure someone from the team agrees that it’s a problem. If you’ve found a\nbug, create an associated issue and illustrate the bug with a minimal \n[reprex](https://www.tidyverse.org/help/#reprex).\n\n## Code of Conduct\n\nPlease note that the pkgdown project is released with a\n[Contributor Code of Conduct](CODE_OF_CONDUCT.md). By contributing to this\nproject you agree to abide by its terms.\n"
  },
  {
    "path": ".github/workflows/R-CMD-check.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\n#\n# NOTE: This workflow is overkill for most R packages and\n# check-standard.yaml is likely a better choice.\n# usethis::use_github_action(\"check-standard\") will install it.\non:\n  push:\n    branches: [main, master]\n  pull_request:\n\nname: R-CMD-check.yaml\n\npermissions: read-all\n\njobs:\n  R-CMD-check:\n    runs-on: ${{ matrix.config.os }}\n\n    name: ${{ matrix.config.os }} (${{ matrix.config.r }})\n\n    strategy:\n      fail-fast: false\n      matrix:\n        config:\n          - {os: macos-latest,   r: 'release'}\n\n          - {os: windows-latest, r: 'release'}\n          # use 4.0 or 4.1 to check with rtools40's older compiler\n          - {os: windows-latest, r: 'oldrel-3'}\n\n          - {os: ubuntu-latest,  r: 'devel', http-user-agent: 'release'}\n          - {os: ubuntu-latest,  r: 'release'}\n          - {os: ubuntu-latest,  r: 'oldrel-1'}\n          - {os: ubuntu-latest,  r: 'oldrel-2'}\n          - {os: ubuntu-latest,  r: 'oldrel-3'}\n          - {os: ubuntu-latest,  r: 'oldrel-4'}\n\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n      R_KEEP_PKG_SOURCE: yes\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/setup-pandoc@v2\n\n      - uses: r-lib/actions/setup-tinytex@v2\n        env:\n          TINYTEX_INSTALLER: TinyTeX\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          r-version: ${{ matrix.config.r }}\n          http-user-agent: ${{ matrix.config.http-user-agent }}\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          extra-packages: any::rcmdcheck\n          needs: check\n\n      - uses: r-lib/actions/check-r-package@v2\n        env:\n          R_QUARTO_QUIET: false\n        with:\n          upload-snapshots: true\n          build_args: 'c(\"--no-manual\",\"--compact-vignettes=gs+qpdf\")'\n"
  },
  {
    "path": ".github/workflows/lint.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n\nname: lint\n\npermissions: read-all\n\njobs:\n  lint:\n    runs-on: ubuntu-latest\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          use-public-rspm: true\n      \n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          extra-packages: any::lintr, local::.\n          needs: lint\n          \n      - uses: r-lib/actions/setup-tinytex@v2\n\n      - name: Lint\n        run: lintr::lint_package()\n        shell: Rscript {0}\n        env:\n          LINTR_ERROR_ON_LINT: true\n"
  },
  {
    "path": ".github/workflows/netlify.yaml",
    "content": "on:\n  pull_request:\n    branches: [main, master]\n\nname: pkgdown-pr\n\njobs:\n  netlify:\n    runs-on: ubuntu-latest\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/setup-tinytex@v2\n\n      - uses: r-lib/actions/setup-pandoc@v2\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          extra-packages: any::pkgdown, local::.\n          needs: website\n\n      - name: Install package\n        run: R CMD INSTALL .\n\n      - name: Create website\n        run: |\n          pkgdown::build_site()\n        shell: Rscript {0}\n\n      - name: Create index file\n        run: |\n          echo '<!DOCTYPE html><html><head><meta http-equiv=\"refresh\" content=\"0;URL=/dev/index.html\" />  <script language=\"javascript\"> window.location.replace('/dev/index.html')</script></head></html>' > ./docs/index.html\n\n      - name: Deploy to Netlify\n        uses: nwtgck/actions-netlify@v3.0\n        with:\n          publish-dir: './docs'\n          production-branch: main\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          deploy-message:\n            'Deploy from GHA: ${{ github.event.pull_request.title || github.event.head_commit.message }} (${{ github.sha }})'\n          # these default to 'true'\n          enable-commit-comment: false\n          enable-github-deployment: false\n        env:\n          NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}\n          NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}\n"
  },
  {
    "path": ".github/workflows/no-pandoc.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n\nname: no-pandoc\n\njobs:\n  R-CMD-check:\n    runs-on: ubuntu-latest\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n      R_KEEP_PKG_SOURCE: yes\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          extra-packages: any::rcmdcheck\n          needs: check\n\n      - uses: r-lib/actions/setup-tinytex@v2\n        env:\n          TINYTEX_INSTALLER: TinyTeX\n\n      - run: sudo apt-get --purge remove pandoc\n      - run: rm -rf vignettes\n\n      - uses: r-lib/actions/check-r-package@v2\n        env:\n          R_QUARTO_QUIET: false\n"
  },
  {
    "path": ".github/workflows/pkgdown.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\non:\n  push:\n    branches: [main, master]\n  pull_request:\n  release:\n    types: [published]\n  workflow_dispatch:\n\nname: pkgdown.yaml\n\npermissions: read-all\n\njobs:\n  pkgdown:\n    runs-on: ubuntu-latest\n    # Only restrict concurrency for non-PR jobs\n    concurrency:\n      group: pkgdown-${{ github.event_name != 'pull_request' || github.run_id }}\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n    permissions:\n      contents: write\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/setup-pandoc@v2\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          extra-packages: any::pkgdown, local::.\n          needs: website\n\n      - uses: r-lib/actions/setup-tinytex@v2\n\n      - name: Build site\n        run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE)\n        shell: Rscript {0}\n\n      - name: Deploy to GitHub pages 🚀\n        if: github.event_name != 'pull_request'\n        uses: JamesIves/github-pages-deploy-action@v4.5.0\n        with:\n          clean: false\n          branch: gh-pages\n          folder: docs\n"
  },
  {
    "path": ".github/workflows/pr-commands.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\non:\n  issue_comment:\n    types: [created]\n\nname: pr-commands.yaml\n\npermissions: read-all\n\njobs:\n  document:\n    if: ${{ github.event.issue.pull_request && (github.event.comment.author_association == 'MEMBER' || github.event.comment.author_association == 'OWNER') && startsWith(github.event.comment.body, '/document') }}\n    name: document\n    runs-on: ubuntu-latest\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n    permissions:\n      contents: write\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/pr-fetch@v2\n        with:\n          repo-token: ${{ secrets.GITHUB_TOKEN }}\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          extra-packages: any::roxygen2\n          needs: pr-document\n\n      - name: Document\n        run: roxygen2::roxygenise()\n        shell: Rscript {0}\n\n      - name: commit\n        run: |\n          git config --local user.name \"$GITHUB_ACTOR\"\n          git config --local user.email \"$GITHUB_ACTOR@users.noreply.github.com\"\n          git add man/\\* NAMESPACE\n          git commit -m 'Document'\n\n      - uses: r-lib/actions/pr-push@v2\n        with:\n          repo-token: ${{ secrets.GITHUB_TOKEN }}\n\n  style:\n    if: ${{ github.event.issue.pull_request && (github.event.comment.author_association == 'MEMBER' || github.event.comment.author_association == 'OWNER') && startsWith(github.event.comment.body, '/style') }}\n    name: style\n    runs-on: ubuntu-latest\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n    permissions:\n      contents: write\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/pr-fetch@v2\n        with:\n          repo-token: ${{ secrets.GITHUB_TOKEN }}\n\n      - uses: r-lib/actions/setup-r@v2\n\n      - name: Install dependencies\n        run: install.packages(\"styler\")\n        shell: Rscript {0}\n\n      - name: Style\n        run: styler::style_pkg()\n        shell: Rscript {0}\n\n      - name: commit\n        run: |\n          git config --local user.name \"$GITHUB_ACTOR\"\n          git config --local user.email \"$GITHUB_ACTOR@users.noreply.github.com\"\n          git add \\*.R\n          git commit -m 'Style'\n\n      - uses: r-lib/actions/pr-push@v2\n        with:\n          repo-token: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/site-languages.yml",
    "content": "on:\n  workflow_dispatch:\n\nname: pkgdown-i18n-netlify\n\njobs:\n  build-and-deploy:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n          - lang: ca\n            locale: ca_ES.UTF-8\n          - lang: de\n            locale: de_DE.UTF-8\n          - lang: dk\n            locale: da_DK.UTF-8\n          - lang: es\n            locale: es_ES.UTF-8\n          - lang: fr\n            locale: fr_FR.UTF-8\n          - lang: ko\n            locale: ko_KR.UTF-8\n          - lang: pt\n            locale: pt_PT.UTF-8\n          - lang: tr\n            locale: tr_TR.UTF-8\n          - lang: zh_CN\n            locale: zh_CN.UTF-8\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/setup-tinytex@v2\n\n      - uses: r-lib/actions/setup-pandoc@v2\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          extra-packages: any::pkgdown, local::.\n          needs: website\n\n      - name: Generate locale ${{ matrix.locale }}\n        run: |\n          sudo locale-gen ${{ matrix.locale }}\n          sudo update-locale LANG=${{ matrix.locale }}\n        shell: bash\n\n      - name: Install package\n        run: R CMD INSTALL .\n\n      - name: Set lang in _pkgdown.yml\n        run: |\n          config <- yaml::read_yaml(\"pkgdown/_pkgdown.yml\")\n          config$lang <- \"${{ matrix.lang }}\"\n          yaml::write_yaml(config, \"pkgdown/_pkgdown.yml\")\n        shell: Rscript {0}\n\n      - name: Build site for ${{ matrix.lang }}\n        run: pkgdown::build_site()\n        shell: Rscript {0}\n        env:\n          LANG: ${{ matrix.locale }}\n\n      - name: Create index file\n        run: |\n          echo '<!DOCTYPE html><html><head><meta http-equiv=\"refresh\" content=\"0;URL=/dev/index.html\" />  <script language=\"javascript\"> window.location.replace(\"/dev/index.html\")</script></head></html>' > ./docs/index.html\n\n      - name: Deploy to Netlify\n        uses: nwtgck/actions-netlify@v3.0\n        with:\n          publish-dir: \"./docs\"\n          production-branch: main\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          deploy-message: \"Deploy ${{ matrix.lang }}: ${{ github.event.pull_request.title || github.event.head_commit.message }} (${{ github.sha }})\"\n          alias: ${{ matrix.lang }}\n          enable-commit-comment: false\n          enable-github-deployment: false\n        env:\n          NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}\n          NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}\n"
  },
  {
    "path": ".github/workflows/test-coverage.yaml",
    "content": "# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples\n# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help\non:\n  push:\n    branches: [main, master]\n  pull_request:\n\nname: test-coverage.yaml\n\npermissions: read-all\n\njobs:\n  test-coverage:\n    runs-on: ubuntu-latest\n    env:\n      GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - uses: r-lib/actions/setup-pandoc@v2\n\n      - uses: r-lib/actions/setup-r@v2\n        with:\n          use-public-rspm: true\n\n      - uses: r-lib/actions/setup-r-dependencies@v2\n        with:\n          extra-packages: any::covr, any::xml2\n          needs: coverage\n\n      - uses: r-lib/actions/setup-tinytex@v2\n        env:\n          TINYTEX_INSTALLER: TinyTeX\n\n      - name: Test coverage\n        run: |\n          cov <- covr::package_coverage(\n            quiet = FALSE,\n            clean = FALSE,\n            install_path = file.path(normalizePath(Sys.getenv(\"RUNNER_TEMP\"), winslash = \"/\"), \"package\")\n          )\n          print(cov)\n          covr::to_cobertura(cov)\n        shell: Rscript {0}\n\n      - uses: codecov/codecov-action@v5\n        with:\n          # Fail if error if not on PR, or if on PR and token is given\n          fail_ci_if_error: ${{ github.event_name != 'pull_request' || secrets.CODECOV_TOKEN }}\n          files: ./cobertura.xml\n          plugins: noop\n          disable_search: true\n          token: ${{ secrets.CODECOV_TOKEN }}\n\n      - name: Show testthat output\n        if: always()\n        run: |\n          ## --------------------------------------------------------------------\n          find '${{ runner.temp }}/package' -name 'testthat.Rout*' -exec cat '{}' \\; || true\n        shell: bash\n\n      - name: Upload test results\n        if: failure()\n        uses: actions/upload-artifact@v4\n        with:\n          name: coverage-test-failures\n          path: ${{ runner.temp }}/package\n"
  },
  {
    "path": ".gitignore",
    "content": ".Rproj.user\n.Rhistory\n.RData\ninst/doc\n*.orig\n.env\n*.tex\ndocs\n\n/.quarto/\n**/.quarto/\n"
  },
  {
    "path": ".lintr.R",
    "content": "linters <- list(lintr::undesirable_function_linter(\n  fun = c(\n    # Base messaging\n    \"message\" = \"use cli::cli_inform()\",\n    \"warning\" = \"use cli::cli_warn()\",\n    \"stop\" = \"use cli::cli_abort()\",\n    # rlang messaging\n    \"inform\" = \"use cli::cli_inform()\",\n    \"warn\" = \"use cli::cli_warn()\",\n    \"abort\" = \"use cli::cli_abort()\",\n    # older cli\n    \"cli_alert_danger\" = \"use cli::cli_inform()\",\n    \"cli_alert_info\" = \"use cli::cli_inform()\",\n    \"cli_alert_success\" = \"use cli::cli_inform()\",\n    \"cli_alert_warning\" = \"use cli::cli_inform()\",\n    # fs\n    \"file.path\" = \"use path()\",\n    \"dir\" = \"use dir_ls()\",\n    \"dir.create\" = \"use dir_create()\",\n    \"file.copy\" = \"use file_copy()\",\n    \"file.create\" = \"use file_create()\",\n    \"file.exists\" = \"use file_exists()\",\n    \"file.info\" = \"use file_info()\",\n    \"normalizePath\" = \"use path_real()\",\n    \"unlink\" = \"use file_delete()\",\n    \"basename\" = \"use path_file()\",\n    \"dirname\" = \"use path_dir()\",\n    # i/o\n    \"readLines\" = \"use read_lines()\",\n    \"writeLines\" = \"use write_lines()\"\n  ),\n  symbol_is_undesirable = FALSE\n))\n\nexclusions <- list(\n  \"R/import-standalone-obj-type.R\",\n  \"R/import-standalone-types-check.R\",\n  \"vignettes\",\n  \"tests/testthat/assets\"\n)"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n    \"recommendations\": [\n        \"Posit.air-vscode\"\n    ]\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n    \"[r]\": {\n        \"editor.formatOnSave\": true,\n        \"editor.defaultFormatter\": \"Posit.air-vscode\"\n    }\n}\n"
  },
  {
    "path": "DESCRIPTION",
    "content": "Package: pkgdown\nTitle: Make Static HTML Documentation for a Package\nVersion: 2.2.0.9000\nAuthors@R: c(\n    person(\"Hadley\", \"Wickham\", , \"hadley@posit.co\", role = c(\"aut\", \"cre\"),\n           comment = c(ORCID = \"0000-0003-4757-117X\")),\n    person(\"Jay\", \"Hesselberth\", role = \"aut\",\n           comment = c(ORCID = \"0000-0002-6299-179X\")),\n    person(\"Maëlle\", \"Salmon\", role = \"aut\",\n           comment = c(ORCID = \"0000-0002-2815-0399\")),\n    person(\"Olivier\", \"Roy\", role = \"aut\"),\n    person(\"Salim\", \"Brüggemann\", role = \"aut\",\n           comment = c(ORCID = \"0000-0002-5329-5987\")),\n    person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"),\n           comment = c(ROR = \"03wc8by49\"))\n  )\nDescription: Generate an attractive and useful website from a source\n    package.  'pkgdown' converts your documentation, vignettes, 'README',\n    and more to 'HTML' making it easy to share information about your\n    package online.\nLicense: MIT + file LICENSE\nURL: https://pkgdown.r-lib.org/, https://github.com/r-lib/pkgdown\nBugReports: https://github.com/r-lib/pkgdown/issues\nDepends:\n    R (>= 4.1)\nImports:\n    bslib (>= 0.5.1),\n    callr (>= 3.7.3),\n    cli (>= 3.6.1),\n    desc (>= 1.4.0),\n    downlit (>= 0.4.4),\n    fontawesome,\n    fs (>= 1.4.0),\n    httr2 (>= 1.0.2),\n    jsonlite,\n    lifecycle,\n    openssl,\n    nanonext (>= 1.8.0),\n    purrr (>= 1.0.0),\n    ragg (>= 1.4.0),\n    rlang (>= 1.1.4),\n    rmarkdown (>= 2.27),\n    tibble,\n    whisker,\n    withr (>= 2.4.3),\n    xml2 (>= 1.3.1),\n    yaml (>= 2.3.9)\nSuggests:\n    covr,\n    diffviewer,\n    evaluate (>= 0.24.0),\n    gert,\n    gt,\n    htmltools,\n    htmlwidgets,\n    knitr (>= 1.50),\n    magick,\n    methods,\n    pkgload (>= 1.0.2),\n    quarto,\n    rsconnect,\n    rstudioapi,\n    rticles,\n    sass,\n    testthat (>= 3.1.3),\n    tools\nVignetteBuilder:\n    knitr,\n    quarto\nConfig/Needs/website: usethis, servr\nConfig/potools/style: explicit\nConfig/testthat/edition: 3\nConfig/testthat/parallel: true\nConfig/testthat/start-first: build-article, build-quarto-article,\n    build-reference, build\nConfig/usethis/last-upkeep: 2025-09-07\nEncoding: UTF-8\nRoxygen: list(markdown = TRUE)\nRoxygenNote: 7.3.3\nSystemRequirements: pandoc (>= 2.10.1)\n"
  },
  {
    "path": "LICENSE",
    "content": "YEAR: 2025\nCOPYRIGHT HOLDER: pkgdown authors\n"
  },
  {
    "path": "LICENSE.md",
    "content": "# MIT License\n\nCopyright (c) 2025 pkgdown authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "NAMESPACE",
    "content": "# Generated by roxygen2: do not edit by hand\n\nS3method(\"[\",tag)\nS3method(as_data,\"NULL\")\nS3method(as_data,tag_arguments)\nS3method(as_data,tag_author)\nS3method(as_data,tag_description)\nS3method(as_data,tag_details)\nS3method(as_data,tag_format)\nS3method(as_data,tag_note)\nS3method(as_data,tag_references)\nS3method(as_data,tag_section)\nS3method(as_data,tag_seealso)\nS3method(as_data,tag_source)\nS3method(as_data,tag_usage)\nS3method(as_data,tag_value)\nS3method(as_example,COMMENT)\nS3method(as_example,RCODE)\nS3method(as_example,TEXT)\nS3method(as_example,VERB)\nS3method(as_example,tag)\nS3method(as_example,tag_dontrun)\nS3method(as_example,tag_dontshow)\nS3method(as_example,tag_donttest)\nS3method(as_example,tag_dots)\nS3method(as_example,tag_if)\nS3method(as_example,tag_ifelse)\nS3method(as_example,tag_ldots)\nS3method(as_example,tag_out)\nS3method(as_example,tag_testonly)\nS3method(as_html,\"#ifdef\")\nS3method(as_html,\"#ifndef\")\nS3method(as_html,COMMENT)\nS3method(as_html,LIST)\nS3method(as_html,RCODE)\nS3method(as_html,Rd)\nS3method(as_html,TEXT)\nS3method(as_html,USERMACRO)\nS3method(as_html,VERB)\nS3method(as_html,character)\nS3method(as_html,tag)\nS3method(as_html,tag_R)\nS3method(as_html,tag_S3method)\nS3method(as_html,tag_S4method)\nS3method(as_html,tag_Sexpr)\nS3method(as_html,tag_acronym)\nS3method(as_html,tag_bold)\nS3method(as_html,tag_cite)\nS3method(as_html,tag_code)\nS3method(as_html,tag_command)\nS3method(as_html,tag_cr)\nS3method(as_html,tag_dQuote)\nS3method(as_html,tag_deqn)\nS3method(as_html,tag_describe)\nS3method(as_html,tag_dfn)\nS3method(as_html,tag_dots)\nS3method(as_html,tag_email)\nS3method(as_html,tag_emph)\nS3method(as_html,tag_enc)\nS3method(as_html,tag_enumerate)\nS3method(as_html,tag_env)\nS3method(as_html,tag_eqn)\nS3method(as_html,tag_figure)\nS3method(as_html,tag_file)\nS3method(as_html,tag_href)\nS3method(as_html,tag_if)\nS3method(as_html,tag_ifelse)\nS3method(as_html,tag_item)\nS3method(as_html,tag_itemize)\nS3method(as_html,tag_kbd)\nS3method(as_html,tag_ldots)\nS3method(as_html,tag_link)\nS3method(as_html,tag_linkS4class)\nS3method(as_html,tag_method)\nS3method(as_html,tag_newcommand)\nS3method(as_html,tag_option)\nS3method(as_html,tag_out)\nS3method(as_html,tag_pkg)\nS3method(as_html,tag_preformatted)\nS3method(as_html,tag_renewcommand)\nS3method(as_html,tag_sQuote)\nS3method(as_html,tag_samp)\nS3method(as_html,tag_special)\nS3method(as_html,tag_strong)\nS3method(as_html,tag_subsection)\nS3method(as_html,tag_tab)\nS3method(as_html,tag_tabular)\nS3method(as_html,tag_url)\nS3method(as_html,tag_var)\nS3method(as_html,tag_verb)\nS3method(pkgdown_print,default)\nS3method(pkgdown_print,gt_tbl)\nS3method(pkgdown_print,htmlwidget)\nS3method(print,pkgdown_xml)\nS3method(print,print_yaml)\nS3method(print,tag)\nS3method(usage_code,\"NULL\")\nS3method(usage_code,COMMENT)\nS3method(usage_code,RCODE)\nS3method(usage_code,Rd)\nS3method(usage_code,TEXT)\nS3method(usage_code,VERB)\nS3method(usage_code,tag)\nS3method(usage_code,tag_S3method)\nS3method(usage_code,tag_S4method)\nS3method(usage_code,tag_dots)\nS3method(usage_code,tag_ldots)\nS3method(usage_code,tag_method)\nS3method(usage_code,tag_special)\nS3method(usage_code,tag_usage)\nexport(as_pkgdown)\nexport(build_article)\nexport(build_articles)\nexport(build_articles_index)\nexport(build_favicons)\nexport(build_home)\nexport(build_home_index)\nexport(build_llm_docs)\nexport(build_news)\nexport(build_redirects)\nexport(build_reference)\nexport(build_reference_index)\nexport(build_search)\nexport(build_site)\nexport(build_site_github_pages)\nexport(build_tutorials)\nexport(check_pkgdown)\nexport(clean_cache)\nexport(clean_site)\nexport(data_template)\nexport(deploy_site_github)\nexport(deploy_to_branch)\nexport(fig_settings)\nexport(in_pkgdown)\nexport(init_site)\nexport(pkgdown_print)\nexport(pkgdown_sitrep)\nexport(preview_site)\nexport(rd2html)\nexport(render_page)\nexport(stop_preview)\nexport(template_articles)\nexport(template_navbar)\nexport(template_reference)\nimport(fs)\nimport(rlang)\nimportFrom(lifecycle,deprecated)\nimportFrom(utils,installed.packages)\n"
  },
  {
    "path": "NEWS.md",
    "content": "# pkgdown (development version)\n\n* When previewing a site, it is now served via a local http server. This enables dynamic features such as search to work correctly (@shikokuchuo, #2975).\n\n* do not autolink code that is in a link (href) in Rd files (#2972)\n\n# pkgdown 2.2.0\n\n* Make `build_llm_docs()` more robust to the use of old Pandoc (@nanxstats, @galachad, #2952, #2954)\n\n## Lifecycle changes\n\n* `autolink_html()` deprecated in 1.6.0 and `preview_page()` have been removed.\n\n## New features\n\n* New `build_llm_docs()` generates a `llms.txt` at the root directory of your site, and provides a `.md` version of every page. You can disable by adding `llm-docs: false` to your `_pkgdown.yaml` (#2914, @maelle)\n* `build_articles()` now executes quarto vignettes in the same working directory as RMarkdown vignettes, namely the directory in which they live (#2877).\n\n## Minor improvements and bug fixes\n\n* `build_site()` gained a `quiet` argument, which is propagated to other functions (e.g., `build_articles()`) and is useful for debugging build errors on GH actions.\n* New translations were add for Dutch (`nl`) and Japanese (`ja`), thanks to @pepijn-devires and @shikokuchuo respectively.\n* Links generated with `\\code{\\link{foo}()}` now have the `()` moved into the `<a>` in the generated output (@maelle).\n* Plots in dark mode are now transformed with a CSS filter to improve their visibility (thanks to @gadenbuie).\n* Updated the translations vignette with instructions for building non-English sites through Github Actions.\n* Added documentation explaining how to solve incorrect rendering of plotmath expressions under ragg devices on Linux. (@remlapmot, #2908)\n* Improved the LaTeX syntax in one of the math rendering test cases (@remlapmot)\n\n# pkgdown 2.1.3\n\n* Menu items can now set `class` and `id`.\n\n# pkgdown 2.1.2\n\n## New features\n\n* ROR IDs in `DESCRIPTION` are transformed into icons, similar to ORCID IDs. (#2850)\n* New `clean_site(force = TRUE)` for cleaning of `docs/` regardless of whether it was built by pkgdown (#2827).\n* The language of the site is set from the first `Language:` in the `DESCRIPTION` if it is available and no other language is specified (@jonthegeek, #2808).\n\n## Bug fixes and minor improvements\n\n* Option `pkgdown.internet` was removed because CDN file caching now requires an internet connection.\n* Math rendering using katex and mathjax was improved and now includes necessary components using CDN (#2704).\n* Articles have improved test cases (thanks to @venpopov and @ethanbass).\n* Sass variables from bslib are now used to set the navbar background color: `$navbar-bg` for the background color in light and dark mode, or `$navbar-light-bg` and `$navbar-dark-bg` for individually controlling light and dark mode background colors. `pkgdown-navbar-bg` and `$pkgdown-navbar-bg-dark` both still provide pkgdown-specific overrides (@gadenbuie, #2847).\n* Code repositories hosted on Codeberg are now supported in the `BugReports` and `URL` fields (@nfrerebeau, #2843).\n* Links to favicons in page headers were updated to reflect changes to https://realfavicongenerator.net/ (#2804). Favicons should be re-generated by manually removing the `pkgdown/favicon` directory and then running `pkgdown::build_favicons()`.\n* Reinstate Rd macro loading, which was accidentally disabled in v2.1.1 (#2782).\n\n# pkgdown 2.1.1\n\n* Added keyboard shortcut, `/`, to focus search bar (#2423).\n* The `BugReports` field can now be an email (@catalamarti, #2275).\n* New `clean_cache()` function removes the contents of the cache directory (#2718).\n* pkgdown now depends on R >= 4.0.0 (#2714).\n* Updated GitHub Actions advice and workflows around Quarto install (@tanho63, #2743).\n* Support ANSI sequences in `index.md` (@krlmlr, #2787).\n\n# pkgdown 2.1.0\n\n## Major changes\n\n* Added @olivroy and @salim-b as pkgdown authors in recognition of their contributions.\n* `build_articles()` and `build_article()` now support articles/vignettes written with quarto (version 1.5 and above). Combining the disparate quarto and pkgdown templating systems is a delicate art, so while I've done my best to make it work, there may be some rough edges. So please file an issue you encounter quarto features that don't work quite right. Learn more in `vignette(\"quarto\")`(#2210).\n* New light switch makes it easy for users to switch between light and dark themes for the website (based on work in bslib by @gadenbuie). For now this behaviour is opt-in with `template.light-switch: true` but in the future we may turn it on automatically. See the customization vignette for details (#1696).\n* New `vignette(\"translations\")` that discusses non-English sites including how to submit new translations (#2605).\n* New `vignette(\"accessibility\")` describes what manual tasks you need to perform to make your site as accessible as possible (#2344).\n* New `template.math-rendering` allows you to control how math is rendered across your site. The default uses `mathml` which is low-dependency, but has the lowest fidelity. You can also use `mathjax`, the previous default, and `katex`, a faster alternative. (#1966).\n* All external assets (JS, CSS, fonts) are now directly included in the site instead of fetched from external CDN (@salim-b, #2249)\n* YAML validation has been substantially improved so you should get much clearer errors if you have made a mistake (#1927). Please file an issue if you find a case where the error message is not helpful.\n\n## Lifecycle changes\n\n* `autolink_html()` was deprecated in pkgdown 1.6.0 and now warns every time you use it. `downlit::downlit_html_path()` should be used instead.\n* `build_site(document)` and `build_reference(document)` has been removed after being deprecated in pkgdown 1.4.0. `devel` should be used instead.\n* `preview_page()` has been deprecated (#2650).\n* Bootstrap 3 has been deprecated. It was superseded in December 2021, and now we're starting to more directly encourage folks to move away from it.\n\n## Front end changes\n\n* When built on GitHub, source urls now use the name of the current upstream branch (rather than `HEAD`), which is more likely to generate correct links (#2597).\n* The search dropdown has been tweaked to look more like the other navbar menu items (#2338).\n* Improve HTML5 compliance (#2369):\n  * No longer support IE9 or earlier\n  * Strip trailing whitespace\n  * Label `<nav>`s and improve navbar html.\n* Tweaked navbar display on mobile so that long titles in drop downs (e.g. article titles) are now wrapped, and the search input spans the full width (#2512).\n* The title for the \"Reference\" page is now \"Package index\" since this page might contain more than just function details (#2181).\n* Very wide words are now automatically broken across lines and hyphenated (when possible) when they'd otherwise create a horizontal scrollbar on mobile (#1888).\n* The mobile version of pkgdown sites no longer has a scrollburglar (a small amount of horizontal scroll) (#2179, @netique).\n* Anchors are displayed when they're the target of a link.\n* New translation for \"Search site\", the label applied to the search box for screenreaders. This was previously incorrectly labelled as \"Toggle navigation\" (#2320).\n* pkgdown no longer overrides the default selection colours. This improves accessibility for users who have set their own colours in their browser settings (#2139, @glin).\n* If you put a dropdown menu (e.g. articles) on the right hand side of the navbar, it will now be right aligned. This makes longer titles more likely to stay on the page (#2421).\n* BS5 templates no longer include empty link to logo when none exists (#2536).\n* Updated translations from @jplecavalier, @dieghernan, @krlmlr, @LDalby, @rich-iannone, @jmaspons, and @mine-cetinkaya-rundel (#2659).\n\n## `_pkgdown.yaml`\n\n* Anywhere you can use `_pkgdown.yml`, you can now use `_pkgdown.yaml` (#2244).\n* Custom navbars that specify `icon` but not `aria-label` will now generate a message reminding you to provide one for to improve accessibility (#2533).\n* The `repo.source.url` field no longer requires a trailing slash (#2017).\n* The `template.bslib` item now also accepts a `bootswatch` key (@gadenbuie, #2483).\n* You can now choose where the search box is placed with the \"search\" navbar component. This has been documented for a very long time, but as far as I can tell, never worked (#2320). If you have made your own template with a custom `navbar`, you will need to remove the `<form>` with `role=\"search\"` to avoid getting two search boxes.\n\n## Minor improvements and bug fixes\n\n* pkgdown now uses httr2 instead of httr (#2600).\n* Mathjax now uses version 3.2.2.\n* The addin now runs `build_site()` instead of `build_site_external()`, which generally should be more reliable (#2252).\n* `<source>` tags now have their `srcref` attributes tweaked in the same way that the `src` attributes of `<img>` tags are (#2402).\n* `as.pkgdown()` will no longer prompt you to install a missing template package from CRAN, since these are almost always found in GitHub (#2076).\n* `build_articles()` now recognises a new `external-articles` top-level field that allows you to define articles that live in other packages (#2028).\n* `build_article()` no longer has a `data` argument. This is technically a breaking change, but I can't figure out why anyone would have ever used it.\n* `build_*()` (apart from `build_site()`) functions no longer default to previewing in interactive sessions since they now all emit specific links to newly generated files.\n* `build_article()` now translates the \"Abstract\" title if it's used.\n* `build_article()` now escapes html characters in the title (#2286).\n* `build_article()` no longer generates the wrong source link when you build your site outside of the root directory (#2172).\n* `build_articles()` now reports if you are missing alt-text for any images (#2357).\n* `build_articles()` now drops a section called \"internal\". This allows you to have articles that either aren't indexed at all or are included manually elsewhere in the navbar (#2205).\n* `build_home()` now correctly escapes special HTML characters in the bibtex citation (#2022).\n* `build_home()` no longer checks if the README is missing any images. This check is now performed in `build_site()`, after `build_articles()` so you can refer to images created by vignettes with warnings (#2194).\n* `build_home()` now includes the contents of `inst/AUTHORS` on the authors page (#2506).\n* `build_home_index()` now reports when rendering the home page (#2544).\n* `build_home_index()` now renders math if you use it in your home page (#2263).\n* `build_news()` now works if your package has been archived at some point (#2687).\n* `build_news()` only syntax highlights the page once, not twice, which prevents every block of R code getting a blank line at the start (#2630).\n\n    ```R\n    1 + 1\n    ```\n* `build_reference()` no longer displays `\\dontshow{}` or `\\testonly{}` blocks in examples. It will run the code in `\\dontshow{}`; it won't run the code in `\\testonly{}`(#2188).\n* `build_reference()` does a better job of parsing `\\value{}` blocks (#2371).\n* `build_reference()` now generates the usage that users actually type for infix and replacement methods (#2303).\n* `build_reference()` now automatically translates `--`, `---`, ``` `` ```, and `''` to their unicode equivalents (#2530).\n* `build_reference()` now supports `\\Sexpr[results=verbatim]` (@bastistician, #2510).\n* `build_reference()` adds anchors to arguments making it possible to link directly to an argument, if desired. A subtle visual treatment makes it easy to see which argument is targeted (#2228).\n* `build_reference()` now automatically renders any tables created by gt (#2326).\n* `build_reference()` matches usage for S3 and S4 methods to the style used by R 4.0.0 and later (#2187).\n* `build_reference_index()` now displays function lifecycle badges next to the function name (#2123). The badges are extracted only from the function description. You can now also use `has_lifecycle()` to select functions by their lifecycle status.\n* `build_redirects()` is now exported to make it easier to document (#2500).\n* `build_redirects()` now automatically adds redirects for topic\naliases. This matches the behaviour of `?` and will help keep links stable in the long term (#1876).\n* `build_redirects()` now reports which redirects it is generating.\n* `build_site()` automatically runs `pkgdown_sitrep()` at the start of the process (#2380).\n* `build_sitemap()` no longer includes redirected pages (#2582).\n* `check_pkgdown()` and `pkgdown_sitrep()` have been unified so that they both report on the same problems. They now only differ in the style of their output: `pkgdown_sitrep()` reports whether each category is ok or not ok, while `check_pkgdown()` errors on the first issue (#2463).\n* `init_site()` will no longer automatically build favicons on CI systems (e.g. GHA). This is an expensive operation that uses an external service so it should only be run locally (#2553).\n* `init_site()` once again describes one copy per line, and now uses a better prefix when copying assets from pkgdown itself (#2445).\n* `pkgdown_sitrep()`/`check_pkgdown()` now check that you have up-to-date favicons if you have a package logo.\n* `template_reference()` and `template_article()` now only add backticks to function names if needed (#2561).\n* `vignette(\"search\")` has been removed since BS3 is deprecated and all the BS5 docs are also included in `build_search()` (#2564).\n\n# pkgdown 2.0.9\n\n* Fixes for regressions in 2.0.8:\n\n  * Output links generated when building the site work once again (#2435).\n\n  * pkgdown once again uses Bootstrap version specified in a template\n    package (@gadenbuie, #2443).\n\n* Front-end improvements:\n\n  * The skip link now becomes visible when focussed (#2138). Thanks to @glin\n    for the styles!\n\n  * The left and right footers no longer contain an extra empty paragraph tag\n    and the footer gains additional padding-top to keep the whitespace constant\n    (#2381).\n\n  * Clipboard buttons report their action again (\"Copied!\") (#2462)\n\n* It is now easier to preview parts of the website locally interactively.\n  `build_reference_index()` and friends will call `init_site()` automatically\n  instead of erroring (@olivroy, #2329).\n\n* `build_article()` gains a new `new_process` argument which allows to build a\n   vignette in the current process for debugging purposes. We've also improved\n   the error messages and tracebacks if an article fails to build, hopefully\n   also making debugging easier (#2438).\n\n* `build_article_index()` and `build_reference_index()` use an improved BS5\n  template that correctly wraps each section description in a `<div>`, rather\n  than a `<p>`. This eliminates an empty pargraph tag that preceded each section\n  description (#2352).\n\n* `build_home()` no longer errors when you have an empty `.md` file (#2309).\n  It alos no longer renders Github issue and pull request templates\n  (@hsloot, #2362)\n\n* `build_news()` now warns if it doesn't find any version headings, suggesting\n  that that `NEWS.md` is structured incorrectly (#2213).\n\n* `build_readme()` now correctly tweaks links to markdown files that use an\n  anchor, e.g. `foo.md#heading-name` (#2313).\n\n* `build_reference_index()` gives more informative errors if your `contents`\n  field is malformed (#2323).\n\n* `check_pkgdown()` no longer errors if your intro vignette is an article is\n  not listed in `_pkgdown.yml` (@olivroy #2150).\n\n* `data_template()` gives a more informative error if you've misspecified the navbar (#2312).\n\n# pkgdown 2.0.8\n\n* pkgdown is now compatible with (and requires) bslib >= 0.5.1\n  (@gadenbuie, #2395), including a fix to BS5 navbar template to get\n  `navbar.type: dark` to work with Bootstrap 5.3+ (@tanho63, #2388)\n\n* Now uses [cli](https://github.com/r-lib/cli) to provide interactive feedback.\n\n* Avoid unwanted linebreaks from parsing `DESCRIPTION` (@salim-b, #2247).\n\n* Translations\n  * New Catalan translation (@jmaspons, #2333).\n  * Citation sections are correctly translated (@eliocamp, #2410).\n\n* `build_article_index()` now sorts vignettes and non-vignette articles\n   alphabetically by their filename (literally, their `basename()`), by default\n   (@jennybc, #2253).\n\n* Deprecated `build_favicon()` was removed (`build_favicons()` remains).\n\n* `build_articles()` now sets RNG seed by default. Use\n  `build_articles(seed = NULL)` for the old (unreproducible) behaviour.\n  (@salim-b, #2354).\n\n* `build_articles()` will process `.qmd` articles with the quarto vignette\n  builder (@rcannood, #2404).\n\n* `build_articles()` and `build_reference()` now set RNG seed for htmlwidgets\n  IDs. This reduces noise in final HTML output, both for articles and examples\n  that contain htmlwidgets (@salim-b, #2294, #2354).\n\n* `build_news()` correctly parses  of github profiles and issues into links\n  when present at the beginning of list items (@pearsonca, #2122)\n\n* `build_reference()` sets `seed` correctly; it was previously reset too early\n   (@salim-b, #2355)\n\n* Rd -> html translation\n  * `\\cr` is now translated to `<br>` not `<br />` (#2400).\n  * Correct usage for S3 methods with non-syntactic class names (#2384).\n  * Preserve Markdown code blocks with class rmd from roxygen2 docs (@salim-b, #2298).\n\n* `build_reference_index()` no longer generates redundant entries when multiple\n  explicit `@usage` tags are provided (@klmr, #2302)\n\n* `build_reference_index()` correctly handles topic names that conflict with\n  selector functions (@dmurdoch, #2397).\n\n# pkgdown 2.0.7\n\n* Fix topic match selection when there is an unmatched selection followed by a matched selection (@bundfussr, #2234)\n* Fix highlighting of nested not R code blocks (for instance, example of R\nMarkdown code with chunks) (@idavydov, #2237).\n* Tweak German translation (@krlmlr, @mgirlich, @lhdjung, #2149, #2236)\n* Remove mention of (defunct) Twitter card validator, provide alternatives (@Bisaloo, #2185)\n* Fix `keywords` typo in `check_missing_topics()` message (@swsoyee, #2178).\n* Use jsdeliver CDN for bootstrap-toc (@GregorDeCillia, #2207).\n\n# pkgdown 2.0.6\n\n* If you're using an RStudio daily, output file names are now clickable,\n  previewing the generated HTML in the browser (#2157).\n\n* Getting started vignette no longer needs to be included in the articles index\n  (#2150).\n\n* If there aren't any functions in the `\\usage{}` block, then pkgdown will\n  now shows all aliases on the reference index, rather than just the topic\n  name (#1624).\n\n# pkgdown 2.0.5\n\n* Correctly generate downlit link targets for topics that have a file name\n  ending in `.` (#2128).\n\n* `build_articles()`: if build fails because the index doesn't include all\n  articles, you're now told what articles are missing (@zkamvar, #2121).\n\n* `build_home()` now escapes angle brackets in author comments(#2127).\n\n* `build_home()` will automatically render and link `.github/SUPPORT.md`\n  (@IndrajeetPatil, #2124).\n\n* `build_news()` once again fails to link `@username` at start of\n  bullet. I had to reverted #2030 because of #2122.\n\n* `build_reference()`: restore accidentally nerfed `has_keyword()` and\n  `has_concept()` reference selectors (#2126) and add tests.\n\n# pkgdown 2.0.4\n\n* New `check_pkgdown()` provides a lightweight way to check that your\n  `_pkgdown.yml` is valid without building the site (#2056). Invalid\n  `_pkgdown.yml` now consistently generates errors both locally and on\n  CI (#2055).\n\n* `build_article()` now supports inline markdown in the `title` (#2039).\n\n* `build_home()` no longer shows development status badges on the released\n  version of the site (#2054).\n\n* `build_news()` support automated `@username` links in more places (#2030).\n\n* `build_reference()`:\n\n    * You can once again exclude topics from the reference index with `-` (#2040).\n\n    * Inline markdown in `title`s and `subtitle`s is now supported(#2039).\n\n    * Package logos will be automatically stripped from the `.Rd` you don't end\n      up with two on one page. (#2083).\n\n    * `\\figure{file}{alternative text}` with multiline alt text is now parsed\n      correctly (#2080)\n\n    * roxygen 7.2.0 output for generic code blocks (#2092, @jabenninghoff) is\n      processed correctly.\n\n* Front end changes:\n\n    * Automatically added links in code blocks are now styled less aggressively,\n      so they occupy less visual weight on the page (#2007).\n\n    * All article pages are given class `col-md-9` for consistency with other\n      pages (#2045).\n\n    * Fixed width HTML widgets are sized correctly (@dmurdoch, #2062).\n\n    * Footnotes work with more contents, including code (@banfai, #2042).\n\n    * Navbar components now accept `target` argument (#2089, @JSchoenbachler).\n\n* New syntax highlighting themes a11y-light, a11y-dark, monochrome-light,\n  monochrome-dark, and solarized\n\n# pkgdown 2.0.3\n\n* Fixes for R CMD check\n\n# pkgdown 2.0.2\n\n* New Korean (`ko`) translation thanks to @mrchypark and @peremen (#1944).\n  New Danish (`dk`) translation thanks to @LDalby.\n\n* `build_articles()` now adjusts the heading levels of vignettes/articles that\n  use `<h1>` as section headings to ensure that there's one top-level heading\n  (#2004). This ensures that there's one `<h1>`, the title, on each page,\n  and makes the TOC in the sidebar work correctly.\n\n* `build_home_index()` no longer spuriously complains about missing images\n  if you use plots in your `README.Rmd` (#1980, #1977). It no longer\n  tweaks the `src` path for `<img>` tags with absolute paths (#1955).\n\n* `build_news()` once again works if `NEWS.md` uses `<h1>` headings (#1947).\n\n* `build_reference()` now correctly interprets `title: internal`: it removes\n  the section from the reference index _and_ it doesn't list the topics in that\n  section as missing (#1958).\n\n* `build_reference()` now gives a correct hint when the reference index YAML\n  is not formatted correctly (e.g. empty item, or item such as \"n\" that needs\n  to be escaped with quotes to not be interpreted as Boolean) (#1995).\n\n* `deploy_to_branch()` gains a `subdir` argument, allowing you to deploy the\n  site to a subdirectory (@gadenbuie, #2001).\n\n* Front end changes:\n\n    * The navbar gets a little more space after the version number, and aligns\n      the baseline with rest of the navbar (#1989).\n\n    * Long lines in code output once again scroll, rather than being wrapped.\n      While this is different to what you'll see in the console, it's a better\n      fit for web pages where the available code width varies based on the\n      browser width (#1940).\n\n    * scrollspy (which highlights the \"active\" heading in the sidebar) now\n      computes the offset dynamically which makes it work better on sites with\n      taller navbars (#1993).\n\n    * Fixed js issues that occurred on pages without a table of contents\n      (@gadenbuie, #1998).\n\n    * When htmlwidgets with jQuery or Bootstrap dependencies are used in examples or\n      articles, pkgdown's versions of jQuery and Boostrap will take precedence over\n      the versions used by the htmlwidget (@gadenbuie, #1997).\n\n* pkgdown no longer includes bundled author metadata for Hadley Wickham,\n  RStudio, or the RConsortium, since there are now ways to include this\n  meta data in template packages, and special casing these three entities\n  feels increasingly weird (#1952).\n\n# pkgdown 2.0.1\n\n* Fix CRAN failures.\n\n* Reference sections are de-duplicated correctly (#1935).\n\n* Usage sections only generated for topics that have them; usage correctly\n  displayed with BS3 (#1931)\n\n* Empty `\\value{}` no longer errors (#1930).\n\n# pkgdown 2.0.0\n\n## New authors\n\n@maelle is now a pkgdown author in recognition of her significant and sustained contributions. She was the powerhouse behind many of the improvements in this release, particularly the switch to bootstrap 5, improvements to customisation, and implementation of local search.\n\n## Bootstrap 5\n\n* pkgdown can style your site with Bootstrap 5 (with help from @jayhesselberth,\n  @apreshill, @cpsievert). Opt-in by setting `boostrap` version in your\n  `_pkgdown.yml`:\n\n    ```yaml\n    template:\n      bootstrap: 5\n    ```\n\n* We reviewed site accessibility and made a number of small improvements:\n  (#782, #1553):\n\n    * Default font is larger and links are always underlined.\n    * Heading anchors use `aria-hidden` to reduce noise for screenreader users.\n    * Navbar dropdowns has improved `aria-labelledby`.\n    * The default GitHub/GitLab links gain an `aria-label`; use for other\n      icons is now supported, and encouraged in the docs.\n    * Syntax highlighting uses a new more\n      [accessible colour scheme](https://apreshill.github.io/rmda11y/arrow.html),\n      designed by Alison Hill (#1536)\n    * A skip link makes it easier to get directly to the page contents (#1827).\n\n* In-line footnotes mean you can read asides next to the text they refer to.\n\n* Articles support tabsets,\n  [as in R Markdown](https://bookdown.org/yihui/rmarkdown-cookbook/html-tabs.html).\n  (@JamesHWade, #1667).\n\n* Other minor styling improvements:\n\n    * The active item in TOC is indicated with background colour, rather than\n      a border.\n    * If present, the package logo is shown on all pages near the header.\n    * Section anchors now appear on the right (making them usable on mobile\n      phones) (#1782).\n    * The TOC is scrollable independently of the main content. This makes it\n      more useful on long pages with many headings (#1610).\n    * The sidebar is shown at the bottom of the page on narrow screens.\n    * Function arguments and the reference index (#1822) use definition lists\n      (`<dl>`) instead of tables. This gives more room for long argument\n      names/lists of function and detailed descriptions, and displays better\n      on mobile.\n    * Links on the homepage no longer show the full url in the text.\n    * The default navbar no longer includes a home icon - this took up\n      precious horizontal space and wasn't very useful since there was already\n      a link to the home page immediately to its left (#1383).\n\n## Local search\n\n* pkgdown now supports local searching (i.e. searching without an external\n  service), and is enabled by default for Bootstrap 5 sites since no set-up is\n  needed (#1629, with help from @gustavdelius in #1655 and @dieghernan &\n  @GregorDeCillia in #1770).\n\n* pkgdown builds a more exhaustive `sitemap.xml` even for websites built with\n  Bootstrap 3. This might change Algolia results if you use Algolia for search\n  (#1629).\n\n## Customisation\n\n* New `vignette(\"customise\")` documents all the ways you can customise your\n  site, including the new options described below (#1573).\n\n* Sites can be easily themed with either bootswatch themes or by selectively\n  overriding the `bslib` variables used to generate the CSS. pkgdown now uses\n  scss for its own Bootstrap css tweaks, which means that you can customise\n  more of the site from within `_pkgdown.yml`.\n\n* You can pick from a variety of built-in syntax highlighting themes (#1823).\n  These control the colours (and background) of code in `<pre>` tags.\n\n* pkgdown can now translate all the text that it generates (#1446): this means\n  that if you have a package where the docs are written in another language, you\n  can match all the pkgdown UI to provide a seamless experience to non-English\n  speakers. Activate the translations by setting the `lang` in `_pkgdown.yml`:\n\n    ```yaml\n    lang: fr\n    ```\n\n    pkgdown includes translations for:\n\n    * `es`, Spanish, thanks to @edgararuiz-zz, @dieghernan, @rivaquiroga.\n    * `de`, German, thanks to @hfrick.\n    * `fr`, French, thanks to @romainfrancois, @lionel-, @jplecavalier, and @maelle.\n    * `pt`, Portuguese, thanks to @rich-iannone.\n    * `tr`, Turkish, thanks to @mine-cetinkaya-rundel.\n    * `zh_CN`, simplified Chinese, thanks to @yitao.\n\n    If you're interested in adding translations for your language please file\n    an issue and we'll help you get started.\n\n* Template packages can now provide `inst/pkgdown/_pkgdown.yml` which is used\n  as a set of defaults for `_pkgdown.yml`. It can be used to (e.g.) provide\n  author definitions, select Bootstrap version and define bslib variables,\n  and customise the sidebar, footer, navbar, etc. (#1499).\n\n* New `includes` parameters `in-header`, `before-body`, and `after-body`\n  make it easy to add arbitrary HTML to every page. Their content will be\n  placed at the end of the `<head>` tag, right below the opening `<body>` tag,\n  and before the closing tag `</body>` respectively (#1487). They match the\n  bookdown options `in_header`, `before_body` and `after_body`.\n\n    Additionally, you can use `before_title`, `before_navbar`, and\n    `after_navbar` to add arbitrary HTML into the navbar/page header; they\n    will appear to the left of the package name/version, and to the left and\n    right of the navigation links respectively (#1882).\n\n* Authors configuration is more flexible (#1516). You can now:\n\n    * Choose the roles used for filtering authors for the sidebar and footer.\n    * Choose the text before authors in the footer.\n    * Add text before and after the authors list in the sidebar.\n    * Add text before and after the authors list of the authors page.\n\n* Sidebar specification is more flexible (#1443, #1488, #1502). You can now:\n\n    * Change the order of sidebar elements.\n    * Add custom sidebar sections (with Markdown/HTML `text`).\n    * Add a table of contents to the home page.\n    * Completely suppress the sidebar.\n    * Provide your own HTML for the navbar.\n\n* Footer specification is more flexible (#1502). You can now:\n\n    * Change the placement of elements on the left and right.\n    * Add text to the left and right (or even remove/replace default text)\n\n* You can now exclude all default components from the navbar (#1517).\n\n* Expert users can now override layout templates provided by pkgdown or template\n  packages by placing template files in `pkgdown/templates` (@gadenbuie, #1897).\n\n## New features\n\n* pkgdown now supports redirects (#1259, @lorenzwalthert). The following yaml\n  demonstrates the syntax, with old paths on the left and new paths/URLs on\n  the right.\n\n  ```yaml\n  redirects:\n    - [\"articles/old-vignette-name.html\", \"articles/new-vignette-name.html\"]\n    - [\"articles/another-old-vignette-name.html\", \"articles/new-vignette-name.html\"]\n    - [\"articles/yet-another-old-vignette-name.html\", \"https://pkgdown.r-lib.org/dev\"]\n  ```\n\n* Use HTML classes `pkgdown-devel` or `pkgdown-release` to declare that certain\n  content should appear only on the devel or release site. Use the class\n  `pkgdown-hide` for content that should only appear only on GitHub/CRAN\n  (#1299).\n\n* New `pkgdown_sitrep()` function reports whether the site is set up correctly;\n  in particularly it currently reports if auto-linking will work (#1478).\n\n## Code\n\n* Styling for errors, warnings, and messages has been tweaked. Messages\n  are now displayed the same way as output, and warnings and errors are\n  bolded, not coloured. This is part of a suite of changes that aim to\n  give package authors greater control over the appearance of messages,\n  warnings, and errors.\n\n* Long lines in code output are now wrapped, rather than requiring scrolling.\n  This better matches `rmarkdown::html_document()` and what you see in the\n  console.\n\n* `build_reference()` now allows linking to topics from other packages (either\n  function names e.g. `rlang::is_installed` or topic names e.g.\n  `sass::font_face`). (#1664)\n\n* `build_reference()` now runs examples with\n  `options(rlang_interactive = FALSE)` (ensuring non-interactive behaviour in\n  functions that use `rlang::is_interactive()`), `options(cli.dynamic = FALSE)`,\n  `Sys.setenv(RSTUDIO = NA)` and `Sys.setLocale(\"LC_COLLATE\", \"C\")` (#1693).\n  It also runs `pkgdown/pre-reference.R` before and `pkgdown/post-reference.R`\n  after examples. These allow you to do any setup or teardown operations you\n  might need (#1602).\n\n* A reference index section with `title: internal` is now silently dropped,\n  allowing you to suppress warnings about topics that are not listed in the\n  index (#1716).\n\n* Code blocks are now highlighted according to their declared language\n  (e.g. `yaml`) if the documentation was built with roxygen2 7.1.2 or later\n  (#1690, #1692).\n\n* New `pkgdown_print()` allows you to control how your objects are rendered in\n  examples. It includes built-in handling for htmlwidgets and \"browseable\" HTML\n  so pkgdown output now more closely resembles what you see in RStudio.\n  Added extension points to make HTML widgets (and RGL in particular) work\n  in rendered examples (@dmurdoch).\n\n* You can globally set the `width` of code output (in reference and articles)\n  with\n\n    ```yaml\n    code:\n      width: 50\n    ```\n\n* Articles now render output styles created by cli/crayon (#1556).\n\n* When copy and pasting code blocks, lines containing output (e.g. `#>`)\n  are automatically omitted (#1675).\n\n* Auto-linking improvements:\n\n  * Links to inherited R6 methods now work correctly for both internal\n    (#1173, @vandenman) and external (#1476) parent classes.\n\n  * Linking no longer fails if a package contains duplicated Rd aliases.\n\n  * Correctly link to reference pages when the `\\name{}` entry doesn't match\n    the file name (@dmurdoch, #1586; #1676).\n\n## Articles\n\n* Article subtitle, author and date (specified in the YAML frontmatter) are now\n  correctly omitted from the article table of contents in the sidebar\n  (@maxheld83, #1428).\n\n* Support for `as_is: true` and non-default output formats for vignettes/\n  articles has been somewhat improved. Support is fundamentally limited due to\n  the challenges of integrating HTML from output formats that pkgdown doesn't\n  know about, but it should be a little more reliable and a little better\n  documented (#1757, #1764).\n\n* `build_articles()` no longer fails if you have a directory underneath\n  vignettes with a `.Rmd` extension (#1425).\n\n* `build_articles()` now correctly handles links to images in `man/figures`\n  (which have the form `../man/figures`) (#1472).\n\n* `build_articles()` again sets the `theme` argument of the document format\n  to `NULL` when `as_is: true` but lets users override this via the `theme`\n  argument of the output format.\n\n* `build_articles()` and `build_home()` now warn if you have images that\n  won't render on the website because they're in unsupported directories\n  (#1810). Generally, it's only safe to refer to figures in `man/figures`\n  and `vignettes`.\n\n* Articles stored in `vignettes/articles` are moved up one level so that they\n  appear in `articles/` on the website. Previously, they would appear in\n  `articles/articles`, so `build_redirects()` automatically adds redirects for\n  any articles in the `vignettes/articles` directory (@gadenbuie #1911).\n\n## HTML, CSS and JS\n\n* New `template` option `trailing_slash_redirect` that allows adding a script to\n  redirect `your-package-url.com` to `your-package-url.com/` (#1439, @cderv,\n  @apreshill).\n\n* External links now get the class `external-link`. This makes them easier to\n  style with CSS (#881, #1491).\n\n* Duplicated section ids are now de-duplicated; this makes pkgdown work better\n  with the documentation of R6 classes.\n\n* Updated CSS styles from pandoc to improve styling of reference lists (#1469).\n\n## Deployment\n\n* `build_site_github_pages()` has been extracted out of `deploy_site_github()`\n  to make it easier to decouple building and deployment, and so we can take\n  advantage of standard deployment actions (#1756).\n\n* `deploy_to_branch()` now calls `git remote set-branches` with `--add` to avoid\n  overwriting the existing `remote.{remote}.fetch` value (@kyleam, #1382).\n  It also now cleans out the website directory by default; revert to previous\n  behaviour with `clean = FALSE` (#1394).\n\n* `build_reference()` will error if envar `CI` is `true` and there are missing\n  topics (@ThierryO, #1378).\n\n* You can override the `auto` development mode detected from the package\n  version by setting env var `PKGDOWN_DEV_MODE` to `release` or `devel`.\n  This is useful if your package uses a different convention to indicate\n  development and release versions (#1081).\n\n## Other minor improvements and bug fixes\n\n* `\\special{}` tags with complex contents are rendered correctly (@klmr, #1744).\n\n* `\\arguments{}` and `\\value{}` do a better job of handling mingled items and\n  text (#1479). The contents of `\\value{}` are now shown immediately after\n  `\\arguments{}`.\n\n* The default \"branch\" for linking to the file sources is `HEAD`, which will\n  work regardless of whether your default branch is called \"main\" or \"master\".\n\n* Non-ORCID comments in `Authors@R` are now more usable: if such comments\n  exist, the sidebar gains a link to the authors page, where they are displayed\n  (#1516).\n\n* Citations with and without text versions are better handled, and text\n  citations are correctly escaped for HTML (@bastistician, #1507).\n\n* README badges in a single paragraph placed between `<!-- badges: end -->`and\n  `<!-- badges: end -->` comments are again detected (#1603).\n\n* The 404 page (default or from `.github/404.md`) is no longer built in the\n  development mode (see `?build_site`) as e.g. GitHub pages only uses the\n  `404.html` in the site root (#1622).\n\n* All links on the 404 pages (navbar, scripts, CSS) are now absolute if there\n  is an URL in the configuration file (#1622).\n\n* The version tooltip showed in the top navbar is now only set if you've\n  explicitly set the `development.mode` in `_pkgdown.yml` (#1768).\n\n* All heading (e.g. headings on the reference index page, and the arguments\n  heading on the reference pages) now get anchors (#1747).\n\n* Use `autolink_bare_uris` for Pandoc above version 2.0 (@marcosmolla, #1618).\n\n* pkgdown now recognizes GitLab URLs to the source repository and adds the\n  corresponding icon to the navbar (#1493). It also supports\n  [GitLab subgroups](https://docs.gitlab.com/ee/user/group/subgroups/)\n  (@salim-b, #1532).\n\n* Links for GitHub Enterprise and GitLab Enterprise repositories are detected\n  by assuming such host address begin with `github.` or `gitlab.`\n  (@ijlyttle, #1452).\n\n* The rules drawn by the CLI (as for example, in `build_site()`) are protected\n  against very narrow terminal windows (@maxheld83, #1435).\n\n* Google Site Verification (https://support.google.com/webmasters/answer/9008080?hl=en)\n  can now be configured for pkgdown sites.\n\n* `build_rmarkdown_format` sets `html_document(anchor_sections = FALSE)`\n   to avoid needless dependencies (@atusy, #1426).\n\n* Jira issues in NEWS can be automatically linked by setting your project name\n  (s) with  `repo: jira_projects: [...]` and specifying a custom issue URL with\n  `repo: url: issue: ...` in `_pkgdown.yml` (@jonkeane, #1466).\n\n* `build_home()` always creates citation information for the authors page,\n  using metadata from `DESCRIPTION` when there is no `inst/CITATION` file,\n  and links to this from the sidebar (#1904).\n\n* `build_news()` no longer breaks with URLs containing numeric fragments\n  (@krassowski, #1456), recognises more styles of release heading (#1437),\n  and generate stable IDs using a the combination of the heading slug and\n  package number. (@Bisaloo, #1015)\n\n# pkgdown 1.6.1\n\n* The article index (used for autolinking vignettes across packages)\n  once again works (#1401).\n\n# pkgdown 1.6.0\n\n## Major changes\n\n* pkgdown now uses the new [downlit](https://downlit.r-lib.org/) package for all\n  syntax highlighting and autolinking (in both reference topics and vignettes).\n  There should be very little change in behaviour because the code in downlit\n  was extracted from pkgdown, but this makes it easier to use pkgdown's nice\n  linking/highlighting in more places (#1234).\n\n* pkgdown now uses the `ragg::agg_png()` device to generate example figures.\n  This should be a little faster and produce higher quality output. Learn\n  more at <https://ragg.r-lib.org> (#1320).\n\n## Minor improvements and bug fixes\n\n### Rd translation\n\n* `\\special{}` support inside `\\usage{}` added to allow non-standard R usage\n  syntax (@klmr, #1345).\n\n* `#ifdef` and `#ifndef` are now supported; the \"current\" OS is hard coded to\n  \"unix\" to ensure reproducible output regardless of where you build the\n  website (#1384).\n\n* Nested `\\subsection{}`s now generate appropriate heading levels\n  (h3, h4, h5 etc) (#1377), and get anchor links (#1389).\n\n* `\\preformatted{}` no longer double escapes its contents (#1311).\n\n### Articles and vignettes\n\n* `build_articles()` no longer sets the `theme` argument of the document format\n  to `NULL` when `as_is: true`. This should allow it to work with a wider\n  range of output formats including `bookdown::html_vignette2()` and\n  friends (@GegznaV, #955, #1352).\n\n* When `build_article()` fails, it gives the complete failure message (#1379).\n\n* Markdown header attributes are now processed in all markdown files (@jonkeane, #1343)\n\n### Auto-linking and syntax highlighting\n\n* The branch used for source linking can be configured by setting\n  `repo: branch: branch_name` in `_pkgdown.yml` (@jonkeane, #1355):\n\n    ```yaml\n    repo:\n      branch: main\n    ```\n\n* `autolink_html()` is (soft) deprecated. Please use\n  `downlit::downlit_html_path()` instead.\n\n* Highlighting of empty expressions works once more (#1310).\n\n* New `deploy$install_metadata` option in `_pkgdown.yml`. Setting it to\n  `true` will store site metadata in the package itself, allowing offline\n  access for packages that to autolink to the package's website\n  (@mstr3336, #1336).\n\n### Other\n\n* You can now control the background colour of plots with the `figures.bg`\n  option (it is transparent by default, and given a white background by\n  css). See `?build_reference` for an example.\n\n* HTML is automatically stripped from the page title (#1318).\n\n* Suppressing CRAN dates in news file now actually works.\n\n* All HTTP requests are now retried upon failure (@jameslamb, #1305).\n\n* Setting `clean = TRUE` in `deploy_site_github()` removes old files from the\n  deployed site before building a new one (#1297).\n\n# pkgdown 1.5.1\n\n* Syntax highlighting works on Windows once more (#1282).\n\n* pkgdown no longer fails if your `.Rd` files have duplicated `\\aliases`\n  as were produced by an older version of roxygen2 (#1290).\n\n* Rendering empty `.md` file now returns empty string (#1285).\n\n* `build_articles_index()` is now exported to rapidly rebuild the index (#1281)\n\n* `deploy_site_github()` now accepts a `host` argument to specify alternate\n  hosts (e.g., Github enterprise) (@dimagor, #1165) and once again works as\n  intended on Travis-CI (@jimhester, #1276).\n\n# pkgdown 1.5.0\n\n## New features\n\n* The articles index page and navbar have been overhauled. There are two\n  major new features in this release:\n\n    * The articles index page now displays article `description`s,\n      taken from YAML metadata belonging to each article. This lets you provide\n      more context about each article and describe why one might want to read\n      it (#1227).\n\n    * The articles navbar is now also controlled by the `articles` section\n      in `_pkgdown.yml`. The ordering of the sections, and articles within\n      them, control the order of the articles in the navbar, and you can\n      use the new `navbar` field to control whether or not each section\n      appears in the navbar (#1101, #1146).\n\n* The reference index now has two levels of heading hierarchy: `title` and\n  `subtitle` (#327).\n\n* Tables of contents in sidebars now use\n  [bootstrap-toc](https://afeld.github.io/bootstrap-toc/); this considerably\n  improves navigation for long articles and reference pages.\n\n* You can now control the links to source files (in reference pages and\n  articles) and issues and users (in the NEWS) with new `repo$url` config\n  option (#1238). This makes it easier to use pkgdown with GitHub enterprise,\n  packages in subdirectories, and other source hosts (like bitbucket).\n\n    ```yaml\n    repo:\n      url:\n        home: https://github.com/r-lib/pkgdown/\n        source: https://github.com/r-lib/pkgdown/blob/main/\n        issue: https://github.com/r-lib/pkgdown/issues/\n        user: https://github.com/\n    ```\n\n    The individual components (e.g. path, issue number, username) are pasted on\n    the end of these urls so they should have trailing `/`s.\n\n    You don't need to set these links for GitLab, as pkgdown now detects\n    GitLab urls automatically (since they use the same structure as GitHub)\n    (#1045).\n\n* There's much richer control over Open Graph and Twitter metadata for the\n  whole site and for individual articles. See new `vignette(\"metadata\")` for\n  details (@gadenbuie, #936).\n\n* New `deploy_to_branch()` function to build and deploy a site to a branch,\n  defaulting to `gh-pages` for use with GitHub Pages. This is used in our\n  recommended GitHub action workflow for automatically building and deploying\n  pkgdown sites for packages on GitHub (@jimhester, #1221).\n\n* Updated JS libraries: jquery 3.3.1 -> 3.4.1; bootswatch 3.3.7 -> 3.4.0;\n  bootstrap 3.3.7 -> bootstrap 3.4.1; docsearch 2.6.1 -> 2.6.3;\n  fontawesome 5.11.1 -> 5.12.1; headroom.js 0.9.44 -> 0.11.0;\n  clipboard.js 2.0.4 -> 2.0.6 (@jayhesselberth).\n\n## Auto-linking improvements\n\n* Examples and Rmd now use exactly the same syntax highlighting strategy.\n\n* In examples and Rmd, calls of the form `current_package::foo` now get\n  a local link (#1262).\n\n* `\\preformatted{}` blocks are now highlighted and linked if they parse\n  as R code (#1180).\n\n* `library(pkgdown)` is now automatically linked to the reference index for\n  \"pkgdown\" not the documentation for `library()` (#1161).\n\n* `help(\"topic\")` is now automatically linked to the documentation for \"topic\",\n  not to the documentation for `help()` (#1210)\n\n## Minor improvements and bug fixes\n\n### Articles\n\n* `build_home()` no longer uses (unrendered) `README.Rmd` or `index.Rmd` if\n  corresponding `.md` files are not found.\n\n* `build_article()` failures now print more information to help you debug\n  the problem (#952).\n\n* The name of the vignette mapped to the \"Get started\" entry in the navbar\n  is now more flexible. You can use an article (e.g `articles/{pkgname}`)\n  and if your package has a `.` in its name you can replace it with `-` to\n  generate a valid article name (e.g. the get started vignette for\n  `pack.down` would be `pack-down`) (#1166).\n\n### Deployment\n\n* `deploy_to_branch()` now correctly captures the commit SHA on GitHub Actions\n  (@coatless, #1252).\n\n* `deploy_to_branch(github_pages = TRUE)` generates a `.nojekyll` to prevent\n  jekyll ever executing (#1242).\n\n* `CNAME` is no longer generated by `init_site()`, but is instead conditionally\n  by `deploy_to_branch()` when `github_pages = TRUE`. This is a better a fit\n  because the `CNAME` file is only needed by GitHub pages (#969).\n\n* `deploy_site_github()` argument `repo_slug` has been deprecated and is no\n  longer needed or used. (@jimhester, #1221)\n\n### News\nSee additional details in `?build_news`:\n\n* You can optionally suppress the CRAN release dates added to the news\n  page (#1118).\n\n* Multi-page news style gets a better yaml specification (the old style\n  will continue to work so no need to change existing YAML).\n\n### Reference\n\n* A topic named `index` will not longer clobber the reference index (#1110).\n\n* Topic names/aliases on reference index are now escaped (#1216).\n\n* `build_reference()` gives better warnings if your `_pkgdown.yml` is\n  constructed incorrectly (#1025).\n\n* New `has_keyword()` topic selector for `reference`. `has_keyword(\"datasets\")`\n  is particularly useful for selecting all data documentation (#760).\n\n* New `lacks_concepts()` can select topics that do not contain any of\n  a number of specified concepts. (@mikldk, #1232)\n\n### Home, authors, and citation\n\n* pkgdown now escapes html and linkifies links in comments in author info\n  from DESCRIPTION (@maelle, #1204)\n\n* pkgdown now uses the ORCiD logo included in Font Awesome 5.11 instead of\n  querying it from members.orcid.org (@bisaloo, #1153)\n\n* badges are now extracted from everything between `<!--badges: start-->`\n  and `<!--badges: end-->`. They used to be extracted only if they were\n  direct children of the first `<p>` after `<!--badges: start-->`.\n\n* `build_home()` now looks for `pkgdown/index.md` in addition to the top-level\n  `index` or `README` files (@nteetor, #1031)\n\n### Navbar\n\n* pkgdown now formats the package version displayed in the navbar the same way\n  as it has been specified in the DESCRIPTION file. In particular, version\n  separators (e.g. `.` and `-`) are preserved. (#1170, @kevinushey)\n\n* add support for navbar submenus: you can create submenus following the\n  convention established in [rstudio/rmarkdown#721](https://github.com/rstudio/rmarkdown/issues/721) (@ijlyttle, @wendtke, #1213)\n\n### Other\n\n* Updated JS libraries: jquery 3.3.1 -> 3.4.1; bootswatch 3.3.7 -> 3.4.0;\n  bootstrap 3.3.7 -> bootstrap 3.4.1; docsearch 2.6.1 -> 2.6.3\n  (@jayhesselberth).\n\n* Markdown conversion now explicitly allows markdown inside of HTML blocks;\n  this was previously accidentally disabled (#1220).\n\n* A timestamp for the last site build is reported in `pkgdown.yml` (#1122).\n\n# pkgdown 1.4.1\n\n* Don't install test package in user library (fixes CRAN failure).\n\n# pkgdown 1.4.0\n\n## New features\n\n* build citation as specified by the `textVersion` argument of `citEntry` in the\n  `CITATION` file (#1096, @yiluheihei)\n\n* `build_site()`, `build_reference()` and `build_home()` gain a parameter\n  `devel` which controls whether you're in deployment or development mode.\n  It generalises and replaces (with deprecation) the existing `document`\n  argument.\n\n    Development mode is optimised for rapid iteration and is the default\n    for `build_reference()`. It uses `pkgload::load_all()` to load code\n    directly from disk in order.\n\n    Deployment mode is slower, but guarantees correct results, and is the\n    default for `build_site()`. It installs the package into a temporary\n    library, and runs examples/articles in a new process.\n\n* `build_reference()` no longer runs `devtools::document()` (#1079) and\n  `build_home()` no longer re-builds `README.Rmd` or `index.Rmd`. This makes\n  the scope of responsibility of pkgdown more clear: it now only\n  creates/modifies files in `doc/`.\n\n* `build_home()` now strips quotes from `Title` and `Description` fields\n  when generating page metadata. Additionally, you can now override the\n  defaults via the `title` and `description` fields in the `home` section of\n  `_pkgdown.yml` (#957, @maelle).\n\n* `vignette(\"linking\")` describes how pkgdown's automatic linking works, and\n  how to ensure that cross-package links point to the right place.\n\n## Bug fixes and minor improvements\n\n### Rd translation\n\n* `\\examples{}` rendering has been completely overhauled so it now first\n  converts the entire mixed Rd-R block to R prior, and then evaluates the\n  whole thing. This considerably improves the fidelity of the translation\n  at a small cost of no longer being able to remove `\\donttest{}` and\n  friends (#1087).\n\n* `\\item{}`s in `\\describe{}` containing whitespace are translated correctly\n  (#1117).\n\n* `\\dots` and `\\ldots` are translated to `...` instead of the ellipsis,\n  since they're often found in code (#1114).\n\n* `\\tabular{}` translation handles code better (@mitchelloharawild, #978).\n\n* `\\subsection{}` contents are now treated as paragraphs, not inline text\n  (#991).\n\n* `\\preformatted{}` blocks preserve important whitespace (#951).\n\n### Front end\n\n* Links to online documentation for functions in code chunks are no longer\n  displayed when printing (#1135, @bisaloo).\n\n* Updated fontawesome to v5.7.1. fontawesome 5 deprecated the `fa` prefix.\n  If you have used custom icons in your navbar, you'll should update them from\n  (e.g.) `fa fa-home` to `fas fa-home`. Brands now have a separate prefix so\n  `fa fa-github` becomes `fab fa-github` (#953).\n\n* The navbar is now automatically hidden with\n  [headroom.js](https://wicky.nillia.ms/headroom.js/).\n\n* The sticky behaviour of the navbar is now implemented in pure CSS instead of\n  relying a the 3rd party javascript library (#1016, @bisaloo)\n\n* Favicons are now automatically built from a package logo (#949).\n\n### Linking\n\n* Infix operators (e.g., `%in%` and `%*%`) are now linked to their\n  documentation (#1082).\n\n* Function names can now be included in headers without spurious auto-linking\n  (#948).\n\n* Links to external documentation now point to [rdrr.io](https://rdrr.io)\n  (#998).\n\n### Other\n\n* News page recognises more version specifications (including the\n  \"(development version)\" now used by usethis) (#980).\n\n* Subdirectories are supported for assets (#939, @ijlyttle).\n\n* A default 404 page (`404.html`) is built, unless a custom `.github/404.md`\n  is provided (#947).\n\n* `build_article()` now uses the raw vignette title as page `<title>`\n  and `og:title` (@maelle, #1037).\n\n* `build_home()` now looks for license files spelled either as LICENSE or\n  LICENCE (#972).\n\n* `build_home()` can find badges in paragraph coming after the comment\n  `<!-- badges: start -->` (#670, @gaborcsardi, @maelle).\n\n* `build_home()` will add a community section to the sidebar if there is either\n  a code of  conduct (`.github/CODE_OF_CONDUCT.md`) or a contributing guide\n  (`.github/CONTRIBUTING.md`) (#1044, @maelle).\n\n* `build_reference()` gains a `topics` argument which allows you to re-build\n  only specified topics.\n\n* `build_site(new_process = TRUE)` gains a timeout,\n  `options(pkgdown.timeout = 10)`, that can be used to prevent stalled\n  builds.\n\n* `deploy_site_github(install = FALSE)` makes it possible to opt out of\n  installation.\n\n* `dev_mode()` now recognises `0.1.9000` as a development version of a package\n  (this is an emerging standard we use for packages with backward incompatible\n  changes) (#1101).\n\n# pkgdown 1.3.0\n\n* Restore accidentally deleted `build_logo()` function so that logos\n  are once more copied to the website.\n\n* Fix to `pkgdown.css` so page header has correct amount of top margin.\n\n* `content-home.html` template is no longer used when the homepage\n  is an `.Rmd` (Reverts #834. Fixes #927, #929)\n\n* `deploy_site_github()` now passes parameters to `build_site()`\n  (@noamross, #922), and the documentation gives slightly better advice.\n\n* Correct off-by-one error in navbar highlighting javascript; now no navbar\n  is highlighted if none match the current path (#911).\n\n* Tweaking of HTML table classes was fixed (@yonicd, #912)\n\n* Restore accidentally removed `docsearch.css` file.\n\n# pkgdown 1.2.0\n\n## New features\n\n* `deploy_site_github()` can be used from continuous integration systems\n  (like travis) to automatically deploy your package website to GitHub Pages.\n  See documentation for how to set up details (@jimhester).\n\n* `build_favicon()` creates high resolution favicons from the package logo,\n  and saves them in `pkgdown/`. They are created using the\n  <https://realfavicongenerator.net/> API, and are better suited for modern web\n  usage (e.g. retina display screens, desktop shortcuts, etc.). This also\n  removes the dependency on the magick package, making automated deployment\n  a little easier (@bisaloo, #883).\n\n* Users with limited internet connectivity can explicitly disable internet\n  usage by pkgdown by setting `options(pkgdown.internet = FALSE)` (#774, #877).\n\n## Improvements to Rd translation\n\n* `rd2html()` is now exported to facilitate creation of translation reprexes.\n\n* `\\Sexpr{}` conversion supports multiple arguments, eliminating\n  `x must be a string or a R connection` errors when using `\\doi{}` (#738).\n\n* `\\tabular{}` conversion better handles empty cells (#780).\n\n* `\\usage{}` now supports qualified functions eliminating\n  `Error in fun_info(x) : Unknown call: ::` errors (#795).\n\n* Invalid tags now generate more informative errors (@BarkleyBG, #771, #891)\n\n## Front end\n\n* The default footer now displays the version of pkgdown used to build\n  the site (#876).\n\n* All third party resources are now fetched from a single CDN and are\n  give a SRI hash (@bisaloo, #893).\n\n* The navbar version now has class \"version\" so you can more easily control\n  its display (#680).\n\n* The default css has been tweaked to ensure that icons are visible on all\n  browsers (#852).\n\n## Bug fixes and minor improvements\n\n### Home page\n\n* Can now build sites for older packages that don't have a `Authors@R` field\n  (#727).\n\n* Remote urls ending in `.md` are no longer tweaked to end in `.html` (#763).\n\n* Bug report link is only shown if there's a \"BugReports\" field (#855).\n\n* `content-home.html` template is now used when the homepage is an `.Rmd`\n  (@goldingn, #787).\n\n* A link to the source `inst/CITATION` was added to the authors page (#714).\n\n### News\n\n* Uses stricter regular expression when linking to GitHub authors (#902).\n\n### Reference\n\n* Unexported functions and test helpers are no longer loaded (#789).\n\n* Selectors that do not match topics now generate a warning. If none of the\n  specified selectors have a match, no topics are selected (#728).\n\n### Articles\n\n* The display depth of vignette tables of contents can be configured by\n  setting `toc: depth` in `_pkgdown.yml` (#821):\n\n  ```yaml\n  toc:\n    depth: 2\n  ```\n\n### Overall site\n\n* `init_site()` now creates a CNAME file if one doesn't already exist and the\n  site's metadata includes a `url` field.\n\n* `build_site()` loses vestigal `mathjax` parameter. This didn't appear to do\n  anything and  no one could remember why it existed (#785).\n\n* `build_site()` now uses colours even if `new_process = TRUE` (@jimhester).\n\n# pkgdown 1.1.0\n\n## New features\n\n* `build_reference()` and `build_site()` get new `document` argument. When\n  `TRUE`, the default, will automatically run `devtools::document()` to\n  ensure that your documentation is up to date.\n\n* `build_site()` gains a `new_process` argument, which defaults to `TRUE`.\n  This will run pkgdown in a separate process, and is recommended practice\n  because it improves reproducibility (#647).\n\n* Improved display for icons: icons must be 30px and stored in top-level\n  `icons/` directory. They are embedded in a separate column of reference\n  index table, instead of being inside a comment (!) (#607).\n\n## Front end\n\n* Added a keyboard shortcut for searching. Press `shift` + `/` (`?`) to move\n  focus to the search bar (#642).\n\n* The Algolia logo is correctly shown in the search results (#673).\n\n* Navbar active tab highlighting uses a superior approach (suggested by\n  @jcheng5) which should mean that the active page is correctly highlighted\n  in all scenarios (#660).\n\n* `pkgdown.js` is better isolated so it should still work even if you\n  load html widgets that import a different version of jquery (#655).\n\n## Improvements to Rd translation\n\n* `vignette()` calls that don't link to existing vignettes silently fail\n  to link instead of generating an uninformative error messages (#652).\n  Automatic linking works for re-exported objects that are not functions\n  (@gaborcsardi, #666).\n\n* Empty `\\section{}`s are ignored (#656). Previously, empty sections caused\n  error `Error in rep(TRUE, length(x) - 1)`.\n\n* `\\Sexpr{}` supports `results=text`, `results=Rd` and `results=hide` (#651).\n\n* `\\tabular{}` no longer requires a terminal `\\cr` (#664, #645).\n\n## Minor bug fixes and improvements\n\n* Add `inst/pkgdown.yml` as a possible site configuration file so that packages\n  on CRAN can be built without needing the development version (#662).\n\n* Default navbar template now uses site title, not package name (the package\n  name is the default title, so this will not affect most sites) (#654).\n\n* You can suppress indexing by search engines by setting `noindex: true`\n  `pkgdown.yml` (#686)\n\n    ```yaml\n    template:\n      params:\n        noindex: true\n    ```\n\n* `build_article()` sets `IN_PKGDOWN` env var so `in_pkgdown()` works\n  (#650).\n\n* `build_home()`: CITATION files with non-UTF-8 encodings (latin1) work\n  correctly, instead of generating an error. For non-UTF-8 locales, ensure you\n  have e.g. `Encoding: latin1` in your `DESCRIPTION`; but best practice is to\n  re-enode your CITATION file to UTF-8 (#689).\n\n* `build_home()`: Markdown files (e.g., `CODE_OF_CONDUCT.md`) stored in\n  `.github/` are copied and linked correctly (#682).\n\n* `build_news()`: Multi-page changelogs (generated from `NEWS.md` with\n  `news: one_page: false` in `_pkgdown.yml`) are rendered correctly.\n\n* `build_reference()`: reference index shows infix functions (like `%+%`) as\n  `` `%+%` ``, not `` `%+%`() `` on  (#659).\n\n# pkgdown 1.0.0\n\n* Major refactoring of path handling. `build_` functions no longer take\n  `path` or `depth` arguments. Instead, set the `destination` directory\n  at the top level of `pkgdown.yml`.\n\n* Similarly, `build_news()` no longer takes a `one_page` argument;\n  this should now be specified in the `_pkgdown.yml` instead. See the\n  documentation for an example.\n"
  },
  {
    "path": "R/build-404.R",
    "content": "build_404 <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  # if this file exists, it will be handled by build_home_md()\n  page_md <- path(pkg$src_path, \".github\", \"404.md\")\n\n  if (!file_exists(page_md)) {\n    render_page(\n      pkg,\n      \"title-body\",\n      data = list(\n        pagetitle = tr_(\"Page not found (404)\"),\n        body = tr_(\"Content not found. Please use links in the navbar.\")\n      ),\n      path = \"404.html\"\n    )\n    update_html(\n      path_abs(\"404.html\", start = pkg$dst_path),\n      tweak_link_absolute,\n      pkg = pkg\n    )\n  }\n\n  invisible()\n}\n"
  },
  {
    "path": "R/build-article.R",
    "content": "#' @order 2\n#' @export\n#' @rdname build_articles\n#' @param name Name of article to render. This should be either a path\n#'   relative to `vignettes/` *without extension*, or `index` or `README`.\n#' @param new_process Build the article in a clean R process? The default,\n#'   `TRUE`, ensures that every article is build in a fresh environment, but\n#'   you may want to set it to `FALSE` to make debugging easier.\n#' @param pandoc_args Pass additional arguments to pandoc. Used for testing.\nbuild_article <- function(\n  name,\n  pkg = \".\",\n  lazy = FALSE,\n  seed = 1014L,\n  new_process = TRUE,\n  pandoc_args = character(),\n  override = list(),\n  quiet = TRUE\n) {\n  pkg <- section_init(pkg, \"articles\", override = override)\n\n  # Look up in pkg vignette data - this allows convenient automatic\n  # specification of depth, output destination, and other parameters that\n  # allow code sharing with building of the index.\n  vig <- match(name, pkg$vignettes$name)\n  if (is.na(vig)) {\n    cli::cli_abort(\"Can't find article {.file {name}}\")\n  }\n\n  input <- pkg$vignettes$file_in[vig]\n  output_file <- pkg$vignettes$file_out[vig]\n  depth <- pkg$vignettes$depth[vig]\n  type <- pkg$vignettes$type[vig]\n\n  input_path <- path_abs(input, pkg$src_path)\n  output_path <- path_abs(output_file, pkg$dst_path)\n\n  if (lazy && !out_of_date(input_path, output_path)) {\n    return(invisible())\n  }\n\n  if (type == \"rmd\") {\n    build_rmarkdown_article(\n      pkg = pkg,\n      input_file = input,\n      input_path = input_path,\n      output_file = output_file,\n      output_path = output_path,\n      depth = depth,\n      seed = seed,\n      new_process = new_process,\n      pandoc_args = pandoc_args,\n      quiet = quiet\n    )\n  } else {\n    build_quarto_articles(pkg = pkg, article = name, quiet = quiet)\n  }\n}\n\nbuild_rmarkdown_article <- function(\n  pkg,\n  input_file,\n  input_path,\n  output_file,\n  output_path,\n  depth,\n  seed = NULL,\n  new_process = TRUE,\n  pandoc_args = character(),\n  quiet = TRUE,\n  call = caller_env()\n) {\n  cli::cli_inform(\"Reading {src_path(input_file)}\")\n  digest <- file_digest(output_path)\n\n  data <- data_article(pkg, input_file, call = call)\n  if (data$as_is) {\n    if (identical(data$ext, \"html\")) {\n      setup <- rmarkdown_setup_custom(\n        pkg,\n        input_path,\n        depth = depth,\n        data = data\n      )\n    } else {\n      setup <- list(format = NULL, options = NULL)\n    }\n  } else {\n    setup <- rmarkdown_setup_pkgdown(\n      pkg,\n      depth = depth,\n      data = data,\n      pandoc_args = pandoc_args\n    )\n  }\n\n  local_envvar_pkgdown(pkg)\n  local_texi2dvi_envvars(input_path)\n  withr::local_envvar(R_CLI_NUM_COLORS = 256)\n\n  args <- list(\n    input = input_path,\n    output_file = path_file(output_path),\n    output_dir = path_dir(output_path),\n    intermediates_dir = tempdir(),\n    encoding = \"UTF-8\",\n    seed = seed,\n    output_format = setup$format,\n    output_options = setup$options,\n    quiet = quiet\n  )\n  if (new_process) {\n    path <- withCallingHandlers(\n      callr::r_safe(rmarkdown_render_with_seed, args = args, show = !quiet),\n      error = function(cnd) wrap_rmarkdown_error(cnd, input_file, call)\n    )\n  } else {\n    path <- inject(rmarkdown_render_with_seed(!!!args))\n  }\n\n  is_html <- identical(path_ext(path)[[1]], \"html\")\n  if (is_html) {\n    local_options_link(pkg, depth = depth)\n    update_html(\n      path,\n      tweak_rmarkdown_html,\n      input_path = path_dir(input_path),\n      pkg = pkg\n    )\n    # Need re-active navbar now that we now the target path\n    update_html(path, function(html) {\n      activate_navbar(html, path_rel(path, pkg$dst_path), pkg)\n    })\n  }\n  if (digest != file_digest(output_path)) {\n    writing_file(path_rel(output_path, pkg$dst_path), output_file)\n  }\n  if (is_html) {\n    copy_article_images(path, input_path, output_path)\n    check_missing_images(pkg, input_path, output_file)\n  }\n\n  invisible(path)\n}\n\n\ndata_article <- function(pkg, input, call = caller_env()) {\n  yaml <- rmarkdown::yaml_front_matter(path_abs(input, pkg$src_path))\n\n  opengraph <- check_open_graph(pkg, yaml$opengraph, input, call = call)\n  opengraph$description <- opengraph$description %||% yaml$description\n\n  list(\n    opengraph = opengraph,\n    pagetitle = escape_html(yaml$title),\n    toc = yaml$toc %||% TRUE,\n    source = repo_source(pkg, input),\n    filename = path_file(input),\n    as_is = isTRUE(purrr::pluck(yaml, \"pkgdown\", \"as_is\")),\n    ext = purrr::pluck(yaml, \"pkgdown\", \"extension\", .default = \"html\")\n  )\n}\n\nrmarkdown_setup_custom <- function(\n  pkg,\n  input_path,\n  depth = 1L,\n  data = list(),\n  env = caller_env()\n) {\n  template <- rmarkdown_template(pkg, depth = depth, data = data, env = env)\n\n  # Override defaults & values supplied in metadata\n  options <- list(\n    template = template,\n    self_contained = FALSE\n  )\n\n  output <- rmarkdown::default_output_format(input_path)\n  if (output$name != \"rmarkdown::html_vignette\") {\n    # Force to NULL unless overridden by user\n    options$theme <- output$options$theme\n  }\n\n  list(format = NULL, options = options)\n}\n\nrmarkdown_setup_pkgdown <- function(\n  pkg,\n  depth = 1L,\n  data = list(),\n  pandoc_args = character(),\n  env = caller_env()\n) {\n  template <- rmarkdown_template(pkg, depth = depth, data = data, env = env)\n\n  format <- rmarkdown::html_document(\n    self_contained = FALSE,\n    theme = NULL,\n    template = template,\n    anchor_sections = FALSE,\n    math_method = config_math_rendering(pkg),\n    extra_dependencies = bs_theme_deps_suppress(),\n    pandoc_args = pandoc_args\n  )\n  format$knitr$opts_chunk <- fig_opts_chunk(\n    pkg$figures,\n    format$knitr$opts_chunk\n  )\n\n  # Add knitr hook to inject CSS class into plot img tags\n  format$knitr$knit_hooks <- format$knitr$knit_hooks %||% list()\n  format$knitr$knit_hooks$plot <- function(x, options) {\n    # Get the default plot hook output\n    hook_output <- knitr::hook_plot_md(x, options)\n\n    # Add the fig.class to img tags if specified\n    if (!is.null(options$fig.class)) {\n      # Match img tags and add class attribute\n      hook_output <- gsub(\n        '<img src=\"([^\"]+)\"',\n        sprintf('<img src=\"\\\\1\" class=\"%s\"', options$fig.class),\n        hook_output\n      )\n    }\n\n    hook_output\n  }\n\n  width <- config_pluck_number_whole(pkg, \"code.width\", default = 80)\n  old_pre <- format$pre_knit\n  format$pre_knit <- function(...) {\n    options(width = width)\n    if (is.function(old_pre)) {\n      old_pre(...)\n    }\n  }\n\n  list(format = format, options = NULL)\n}\n\n# Generates pandoc template by rendering templates/content-article.html\nrmarkdown_template <- function(\n  pkg,\n  data = list(),\n  depth = 1L,\n  env = caller_env()\n) {\n  path <- withr::local_tempfile(\n    pattern = \"pkgdown-rmd-template-\",\n    fileext = \".html\",\n    .local_envir = env\n  )\n  render_page(pkg, \"article\", data, path, depth = depth, quiet = TRUE)\n\n  path\n}\n\ncopy_article_images <- function(built_path, input_path, output_path) {\n  ext_src <- rmarkdown::find_external_resources(input_path)\n\n  # temporarily copy the rendered html into the input path directory and scan\n  # again for additional external resources that may be been included by R code\n  tempfile <- path(path_dir(input_path), \"--find-assets.html\")\n  withr::defer(try(file_delete(tempfile)))\n  file_copy(built_path, tempfile)\n  ext_post <- rmarkdown::find_external_resources(tempfile)\n\n  ext <- rbind(ext_src, ext_post)\n  ext <- ext[!duplicated(ext$path), ]\n\n  # copy web + explicit files beneath vignettes/\n  is_child <- path_has_parent(ext$path, \".\")\n  ext_path <- ext$path[(ext$web | ext$explicit) & is_child]\n\n  src <- path(path_dir(input_path), ext_path)\n  dst <- path(path_dir(output_path), ext_path)\n  # Make sure destination paths exist before copying files there\n  dir_create(unique(path_dir(dst)))\n  file_copy(src, dst, overwrite = TRUE)\n}\n\nwrap_rmarkdown_error <- function(cnd, input, call = caller_env()) {\n  lines <- strsplit(gsub(\"^\\r?\\n\", \"\", cnd$stderr), \"\\r?\\n\")[[1]]\n  lines <- lines[nchar(lines) > 0]\n  # Feeding random text back into cli, so have to escape\n  lines <- gsub(\"{\", \"{{\", lines, fixed = TRUE)\n  lines <- gsub(\"}\", \"}}\", lines, fixed = TRUE)\n\n  cli::cli_abort(\n    c(\n      \"!\" = \"Failed to render {.path {input}}.\",\n      set_names(cli_escape(lines), \"x\")\n    ),\n    parent = cnd$parent %||% cnd,\n    trace = cnd$parent$trace,\n    call = call\n  )\n}\n\nrmarkdown_render_with_seed <- function(..., seed = NULL) {\n  if (!is.null(seed)) {\n    set.seed(seed)\n    if (requireNamespace(\"htmlwidgets\", quietly = TRUE)) {\n      htmlwidgets::setWidgetIdSeed(seed)\n    }\n  }\n\n  # Ensure paths from output are not made relative to input\n  # https://github.com/yihui/knitr/issues/2171\n  options(knitr.graphics.rel_path = FALSE)\n\n  rmarkdown::render(envir = globalenv(), ...)\n}\n"
  },
  {
    "path": "R/build-articles.R",
    "content": "#' Build articles section\n#'\n#' @description\n#' `build_articles()` renders each R Markdown file underneath `vignettes/` and\n#' saves it to `articles/`. There are two exceptions:\n#'\n#' * Files that start with `_` (e.g., `_index.Rmd`) are ignored,\n#'   enabling the use of child documents.\n#'\n#' * Files in `vignettes/tutorials` are handled by [build_tutorials()]\n#'\n#' Vignettes are rendered using a special document format that reconciles\n#' [rmarkdown::html_document()] with the pkgdown template. This means articles\n#' behave slightly differently to vignettes, particularly with respect to\n#' external files, and custom output formats. See below for more details.\n#'\n#' Note that when you run `build_articles()` directly (outside of\n#' [build_site()]) vignettes will use the currently installed version of the\n#' package, not the current source version. This makes iteration quicker when\n#' you are primarily working on the text of an article.\n#'\n#' # Index and navbar\n#' You can control the articles index and navbar with a `articles` field in\n#' your `_pkgdown.yml`. If you use it, pkgdown will check that all articles\n#' are included, and will error if you have missed any.\n#'\n#' The `articles` field defines a list of sections, each of which\n#' can contain four fields:\n#'\n#' * `title` (required): title of section, which appears as a heading on the\n#'   articles index.\n#'\n#' * `desc` (optional): An optional markdown description displayed underneath\n#'   the section title.\n#'\n#' * `navbar` (optional): A couple of words used to label this section in\n#'   the navbar. If omitted, this section of vignettes will not appear in the\n#'   navbar.\n#'\n#' * `contents` (required): a list of article names to include in the\n#'   section. This can either be names of individual vignettes or a\n#'   call to `starts_with()`. The name of a vignette includes its\n#'   path under `vignettes` without extension so that the name of the vignette\n#'   found at `vignettes/pizza/slice.Rmd` is `pizza/slice`.\n#'\n#' The title and description of individual vignettes displayed on the index\n#' comes from `title` and `description` fields of the YAML header in the Rmds.\n#'\n#' For example, this yaml might be used for some version of dplyr:\n#'\n#' ```yaml\n#' articles:\n#' - title: Main verbs\n#'   navbar: ~\n#'   contents:\n#'   - one-table\n#'   - two-table\n#'   - rowwise\n#'   - colwise\n#'\n#' - title: Developer\n#'   desc: Vignettes aimed at package developers\n#'   contents:\n#'   - programming\n#'   - packages\n#' ```\n#'\n#' Note the use of the `navbar` fields. `navbar: ~` means that the \"Main verbs\"\n#' will appear in the navbar without a heading; the absence of the `navbar`\n#' field in the developer vignettes means that they will only be\n#' accessible via the articles index.\n#'\n#' The navbar will include a link to the articles index if one or more\n#' vignettes are not available through the navbar. If some vignettes appear\n#' in the navbar drop-down list and others do not, the list will automatically\n#' include a \"More ...\" link at the bottom; if no vignettes appear in the\n#' the navbar, it will link directly to the articles index instead of\n#' providing a drop-down.\n#'\n#' ## Get started\n#' Note that a vignette with the same name as the package (e.g.,\n#' `vignettes/pkgdown.Rmd` or `vignettes/articles/pkgdown.Rmd`) automatically\n#' becomes a top-level \"Get started\" link, and will not appear in the articles\n#' drop-down.\n#'\n#' (If your package name includes a `.`, e.g. `pack.down`, use a `-` in the\n#' vignette name, e.g. `pack-down.Rmd`.)\n#'\n#' ## Missing articles\n#'\n#' pkgdown will warn if there are (non-internal) articles that aren't listed\n#' in the articles index. You can suppress such warnings by listing the\n#' affected articles in a section with `title: internal` (case sensitive);\n#' this section will not be displayed on the index page.\n#'\n#' ## External articles\n#'\n#' You can link to arbitrary additional articles by adding an\n#' `external-articles` entry to `_pkgdown.yml`. It should contain an array\n#' of objects with fields `name`, `title`, `href`, and `description`.\n#'\n#' ```yaml\n#' external-articles:\n#' - name: subsampling\n#'   title: Subsampling for Class Imbalances\n#'   description: Improve model performance in imbalanced data sets through undersampling or oversampling.\n#'   href: https://www.tidymodels.org/learn/models/sub-sampling/\n#' ```\n#'\n#' If you've defined a custom articles index, you'll need to include the name\n#' in one of the `contents` fields.\n#'\n#' # External files\n#' pkgdown differs from base R in its handling of external files. When building\n#' vignettes, R assumes that vignettes are self-contained (a reasonable\n#' assumption when most vignettes were PDFs) and only copies files explicitly\n#' listed in `.install_extras`. pkgdown takes a different approach based on\n#' [rmarkdown::find_external_resources()], and it will also copy any images that\n#' you link to. If for some reason the automatic detection doesn't work, you\n#' will need to add a `resource_files` field to the yaml metadata, e.g.:\n#'\n#' ```yaml\n#' ---\n#' title: My Document\n#' resource_files:\n#'   - data/mydata.csv\n#'   - images/figure.png\n#' ---\n#' ```\n#'\n#' Note that you can not use the `fig.path` to change the output directory of\n#' generated figures as its default value is a strong assumption of rmarkdown.\n#'\n#' # Embedding Shiny apps\n#' If you would like to embed a Shiny app into an article, the app will have\n#' to be hosted independently, (e.g. <https://www.shinyapps.io>). Then, you\n#' can embed the app into your article using an `<iframe>`, e.g.\n#' `<iframe src = \"https://gallery.shinyapps.io/083-front-page\" class=\"shiny-app\">`.\n#'\n#' See <https://github.com/r-lib/pkgdown/issues/838#issuecomment-430473856> for\n#' some hints on how to customise the appearance with CSS.\n#'\n#' # Output formats\n#' By default, pkgdown builds all articles using the\n#' [rmarkdown::html_document()] `output` format, ignoring whatever is set in\n#' your YAML metadata. This is necessary because pkgdown has to integrate the\n#' HTML/CSS/JS from the vignette with the HTML/CSS/JS from rest of the site.\n#' Because of the challenges of combining two sources of HTML/CSS/JS, there is\n#' limited support for other output formats and you have to opt-in by setting\n#' the `as_is` field in your `.Rmd` metadata:\n#'\n#' ```yaml\n#' pkgdown:\n#'   as_is: true\n#' ```\n#'\n#' If the output format produces a PDF, you'll also need to specify the\n#' `extension` field:\n#'\n#' ```yaml\n#' pkgdown:\n#'   as_is: true\n#'   extension: pdf\n#' ```\n#'\n#' To work with pkgdown, the output format must accept `template`, `theme`, and\n#' `self_contained` arguments, and must work without any additional CSS or\n#' JSS files. Note that if you use\n#' [`_output.yml`](https://bookdown.org/yihui/rmarkdown/html-document.html#shared-options)\n#' or [`_site.yml`](https://rmarkdown.rstudio.com/docs/reference/render_site.html)\n#' you'll still need to add `as_is: true` to each individual vignette.\n#'\n#' Additionally, htmlwidgets do not work when `as_is: true`.\n#'\n#' # Suppressing vignettes\n#' If you want [articles](https://r-pkgs.org/vignettes.html#sec-vignettes-article)\n#' that are not vignettes, use `usethis::use_article()` to create it. An articles link will be\n#' automatically added to the default navbar if the vignettes directory is\n#' present: if you do not want this, you will need to customise the navbar. See\n#' [build_site()] details.\n#'\n#' @inheritSection build_reference Figures\n#' @family site components\n#'\n#' @inheritParams as_pkgdown\n#' @param quiet Set to `FALSE` to display output of knitr and\n#'   pandoc. This is useful when debugging.\n#' @param lazy If `TRUE`, will only re-build article if input file has been\n#'   modified more recently than the output file.\n#' @param seed Seed used to initialize random number generation in order to\n#'   make article output reproducible. An integer scalar or `NULL` for no seed.\n#' @param preview If `TRUE`, or `is.na(preview) && interactive()`, will preview\n#'   freshly generated section in browser.\n#' @export\n#' @order 1\nbuild_articles <- function(\n  pkg = \".\",\n  quiet = TRUE,\n  lazy = TRUE,\n  seed = 1014L,\n  override = list(),\n  preview = FALSE\n) {\n  pkg <- section_init(pkg, \"articles\", override = override)\n  check_bool(quiet)\n  check_bool(lazy)\n  check_number_whole(seed, allow_null = TRUE)\n\n  if (nrow(pkg$vignettes) == 0L) {\n    return(invisible())\n  }\n\n  cli::cli_rule(\"Building articles\")\n\n  build_articles_index(pkg)\n  unwrap_purrr_error(purrr::walk(\n    pkg$vignettes$name[pkg$vignettes$type == \"rmd\"],\n    build_article,\n    pkg = pkg,\n    lazy = lazy,\n    seed = seed,\n    quiet = quiet\n  ))\n  build_quarto_articles(pkg, quiet = quiet)\n\n  preview_site(pkg, \"articles\", preview = preview)\n}\n\n# Articles index ----------------------------------------------------------\n\n#' @export\n#' @rdname build_articles\n#' @order 3\nbuild_articles_index <- function(pkg = \".\", override = list()) {\n  pkg <- section_init(pkg, \"articles\", override = override)\n  render_page(\n    pkg,\n    \"article-index\",\n    data = data_articles_index(pkg),\n    path = path(\"articles\", \"index.html\")\n  )\n  invisible()\n}\n\ndata_articles_index <- function(pkg = \".\", call = caller_env()) {\n  pkg <- as_pkgdown(pkg)\n\n  articles <- data_articles(pkg, is_index = TRUE, call = call)\n  index <- config_pluck_list(pkg, \"articles\", call = call) %||%\n    default_articles_index(pkg)\n  sections <- unwrap_purrr_error(purrr::imap(\n    index,\n    data_articles_index_section,\n    articles = articles,\n    pkg = pkg,\n    call = call\n  ))\n\n  # Check for unlisted vignettes\n  all_names <- purrr::map(sections, function(section) {\n    purrr::map_chr(section$contents, \"name\")\n  })\n  listed <- unique(purrr::list_c(all_names))\n\n  missing <- setdiff(articles$name, listed)\n  # Exclude get started vignette or article #2150\n  missing <- missing[!article_is_intro(missing, package = pkg$package)]\n\n  if (length(missing) > 0) {\n    config_abort(\n      pkg,\n      \"{length(missing)} vignette{?s} missing from index: {.val {missing}}.\",\n      call = caller_env()\n    )\n  }\n\n  # Remove internal section after missing vignettes check\n  sections <- Filter(function(x) x$title != \"internal\", sections)\n\n  print_yaml(list(\n    pagetitle = tr_(\"Articles\"),\n    sections = sections\n  ))\n}\n\ndata_articles <- function(pkg = \".\", is_index = FALSE, call = caller_env()) {\n  pkg <- as_pkgdown(pkg)\n\n  internal <- tibble::tibble(\n    name = pkg$vignettes$name,\n    title = pkg$vignettes$title,\n    href = pkg$vignettes$file_out,\n    description = pkg$vignettes$description,\n  )\n  if (is_index) {\n    internal$href <- path_rel(internal$href, \"articles\")\n  }\n\n  external <- config_pluck_external_articles(pkg, call = call)\n  articles <- rbind(internal, external)\n\n  articles$description <- lapply(\n    articles$description,\n    markdown_text_block,\n    pkg = pkg\n  )\n\n  # Hack data structure so we can use select_topics()\n  articles$alias <- as.list(articles$name)\n  articles$internal <- FALSE\n\n  articles\n}\n\nconfig_pluck_external_articles <- function(pkg, call = caller_env()) {\n  external <- config_pluck_list(pkg, \"external-articles\", call = call)\n  if (is.null(external)) {\n    return(tibble::tibble(\n      name = character(),\n      title = character(),\n      href = character(),\n      description = character()\n    ))\n  }\n\n  for (i in seq_along(external)) {\n    config_check_list(\n      external[[i]],\n      has_names = c(\"name\", \"title\", \"href\", \"description\"),\n      error_path = paste0(\"external-articles[\", i, \"]\"),\n      error_pkg = pkg,\n      error_call = call\n    )\n    config_check_string(\n      external[[i]]$name,\n      error_path = paste0(\"external-articles[\", i, \"].name\"),\n      error_pkg = pkg,\n      error_call = call\n    )\n    config_check_string(\n      external[[i]]$title,\n      error_path = paste0(\"external-articles[\", i, \"].title\"),\n      error_pkg = pkg,\n      error_call = call\n    )\n    config_check_string(\n      external[[i]]$href,\n      error_path = paste0(\"external-articles[\", i, \"].href\"),\n      error_pkg = pkg,\n      error_call = call\n    )\n    config_check_string(\n      external[[i]]$description,\n      error_path = paste0(\"external-articles[\", i, \"].description\"),\n      error_pkg = pkg,\n      error_call = call\n    )\n  }\n\n  tibble::tibble(\n    name = purrr::map_chr(external, \"name\"),\n    title = purrr::map_chr(external, \"title\"),\n    href = purrr::map_chr(external, \"href\"),\n    description = purrr::map_chr(external, \"description\")\n  )\n}\n\ndata_articles_index_section <- function(\n  section,\n  index,\n  articles,\n  pkg,\n  call = caller_env()\n) {\n  config_check_list(\n    section,\n    error_path = paste0(\"articles[\", index, \"]\"),\n    has_names = c(\"title\", \"contents\"),\n    error_pkg = pkg,\n    error_call = call\n  )\n  config_check_string(\n    section$title,\n    error_path = paste0(\"articles[\", index, \"].title\"),\n    error_pkg = pkg,\n    error_call = call\n  )\n  title <- markdown_text_inline(\n    pkg,\n    section$title,\n    error_path = paste0(\"articles[\", index, \"].title\"),\n    error_call = call\n  )\n\n  config_check_string(\n    section$desc,\n    error_path = paste0(\"articles[\", index, \"].desc\"),\n    error_pkg = pkg,\n    error_call = call\n  )\n  check_contents(\n    section$contents,\n    index,\n    pkg,\n    prefix = \"articles\",\n    call = call\n  )\n\n  # Match topics against any aliases\n  idx <- select_topics(\n    section$contents,\n    articles,\n    error_path = paste0(\"articles[\", index, \"].contents\"),\n    error_pkg = pkg,\n    error_call = call\n  )\n  contents <- articles[idx, , drop = FALSE]\n\n  list(\n    title = title,\n    desc = markdown_text_block(pkg, section$desc),\n    class = section$class,\n    contents = purrr::transpose(contents)\n  )\n}\n\ndefault_articles_index <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  if (nrow(pkg$vignettes) == 0L) {\n    return(NULL)\n  }\n\n  print_yaml(list(\n    list(\n      title = tr_(\"All vignettes\"),\n      desc = NULL,\n      contents = auto_quote(unname(pkg$vignettes$name))\n    )\n  ))\n}\n\narticle_is_intro <- function(name, package) {\n  package <- gsub(\".\", \"-\", package, fixed = TRUE)\n  name %in% c(package, paste0(\"articles/\", package))\n}\n"
  },
  {
    "path": "R/build-favicons.R",
    "content": "#' Initialise favicons from package logo\n#'\n#' @description\n#' This function auto-detects the location of your package logo (with the name\n#' `logo.svg` (recommended format) or `logo.png`, created with `usethis::use_logo()`)\n#' and runs it through the <https://realfavicongenerator.net> API to build a\n#' complete set of favicons with different sizes, as needed for modern web usage.\n#'\n#' You only need to run the function once. The favicon set will be stored in\n#' `pkgdown/favicon` and copied by [init_site()] to the relevant location when\n#' the website is rebuilt.\n#'\n#' Once complete, you should add `pkgdown/` to `.Rbuildignore ` to avoid a NOTE\n#' during package checking. (`usethis::use_logo()` does this for you!)\n#'\n#' @inheritParams as_pkgdown\n#' @param overwrite If `TRUE`, re-create favicons from package logo.\n#' @export\nbuild_favicons <- function(pkg = \".\", overwrite = FALSE) {\n  rlang::check_installed(\"openssl\")\n  pkg <- as_pkgdown(pkg)\n\n  cli::cli_rule(\"Building favicons\")\n\n  logo_path <- find_logo(pkg$src_path)\n\n  if (is.null(logo_path)) {\n    cli::cli_abort(c(\n      \"Can't find package logo PNG or SVG to build favicons.\",\n      \"i\" = \"See {.fun usethis::use_logo} for more information.\"\n    ))\n  }\n\n  if (has_favicons(pkg) && !overwrite) {\n    cli::cli_inform(c(\n      \"Favicons already exist in {.path pkgdown}\",\n      \"i\" = \"Set {.code overwrite = TRUE} to re-create.\"\n    ))\n    return(invisible())\n  }\n\n  cli::cli_inform(c(\n    i = \"Building favicons with {.url https://realfavicongenerator.net}...\"\n  ))\n\n  logo <- readBin(logo_path, what = \"raw\", n = file_info(logo_path)$size)\n  json_request <- list(\n    \"favicon_generation\" = list(\n      \"api_key\" = \"87d5cd739b05c00416c4a19cd14a8bb5632ea563\",\n      \"master_picture\" = list(\n        \"type\" = \"inline\",\n        \"content\" = openssl::base64_encode(logo)\n      ),\n      \"favicon_design\" = list(\n        \"desktop_browser\" = list(),\n        \"ios\" = list(\n          \"picture_aspect\" = \"no_change\",\n          \"assets\" = list(\n            \"ios6_and_prior_icons\" = FALSE,\n            \"ios7_and_later_icons\" = TRUE,\n            \"precomposed_icons\" = FALSE,\n            \"declare_only_default_icon\" = TRUE\n          )\n        )\n      )\n    )\n  )\n  req <- httr2::request(\"https://realfavicongenerator.net/api/favicon\")\n  req <- httr2::req_body_json(req, json_request)\n\n  withCallingHandlers(\n    resp <- httr2::req_perform(req),\n    error = function(e) {\n      cli::cli_abort(\"API request failed.\", parent = e)\n    }\n  )\n\n  content <- httr2::resp_body_json(resp)\n  result <- content$favicon_generation_result\n\n  if (!identical(result$result$status, \"success\")) {\n    cli::cli_abort(\"API request failed.\", .internal = TRUE)\n  }\n\n  tmp <- withr::local_tempfile()\n  req <- httr2::request(result$favicon$package_url)\n  resp <- httr2::req_perform(req, tmp)\n\n  withCallingHandlers(\n    paths <- utils::unzip(\n      tmp,\n      exdir = path(pkg$src_path, \"pkgdown\", \"favicon\")\n    ),\n    warning = function(e) {\n      cli::cli_abort(\n        \"Your logo file couldn't be processed and may be corrupt.\",\n        parent = e\n      )\n    },\n    error = function(e) {\n      cli::cli_abort(\n        \"Your logo file couldn't be processed and may be corrupt.\",\n        parent = e\n      )\n    }\n  )\n  cli::cli_inform(c(\"v\" = \"Added {.path {sort(path_file(paths))}}.\"))\n\n  invisible()\n}\n\ncopy_favicons <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  dir_copy_to(\n    src_dir = path(pkg$src_path, \"pkgdown\", \"favicon\"),\n    src_root = pkg$src_path,\n    dst_dir = pkg$dst_path,\n    dst_root = pkg$dst_path\n  )\n}\n\nhas_favicons <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n  unname(file_exists(path_favicons(pkg)))\n}\n\npath_favicons <- function(pkg) {\n  path(pkg$src_path, \"pkgdown\", \"favicon\")\n}\n"
  },
  {
    "path": "R/build-footer.R",
    "content": "data_footer <- function(pkg = \".\", call = caller_env()) {\n  pkg <- as_pkgdown(pkg)\n\n  config_pluck_list(pkg, \"footer\", call = call)\n  meta_components <- config_pluck_list(pkg, \"footer.components\", call = call)\n  components <- modify_list(\n    footnote_components(pkg, call = call),\n    meta_components\n  )\n\n  meta_structure <- config_pluck_list(pkg, \"footer.structure\", call = call)\n  structure <- modify_list(footnote_structure(), meta_structure)\n\n  left <- markdown_text_block(\n    pkg,\n    paste0(components[structure$left], collapse = \" \")\n  )\n  right <- markdown_text_block(\n    pkg,\n    paste0(components[structure$right], collapse = \" \")\n  )\n\n  list(left = left, right = right)\n}\n\nfootnote_components <- function(pkg = \".\", call = caller_env()) {\n  pkg <- as_pkgdown(pkg)\n\n  # Authors\n  roles <- config_pluck_character(\n    pkg,\n    \"authors.footer.roles\",\n    default = default_roles(),\n    call = call\n  )\n  authors <- data_authors(pkg, roles = roles)$main\n  authors_str <- paste(purrr::map_chr(authors, \"name\"), collapse = \", \")\n\n  prefix <- config_pluck_string(\n    pkg,\n    \"authors.footer.text\",\n    default = tr_(\"Developed by\"),\n    call = call\n  )\n  developed_by <- paste0(trimws(prefix), \" \", authors_str, \".\")\n\n  # pkgdown\n  built_with <- sprintf(\n    tr_('Site built with <a href=\"%s\">pkgdown</a> %s.'),\n    \"https://pkgdown.r-lib.org/\",\n    utils::packageVersion(\"pkgdown\")\n  )\n\n  print_yaml(list(\n    developed_by = developed_by,\n    built_with = built_with,\n    package = pkg[[\"package\"]]\n  ))\n}\n\nfootnote_structure <- function() {\n  print_yaml(list(\n    left = \"developed_by\",\n    right = \"built_with\"\n  ))\n}\n"
  },
  {
    "path": "R/build-github.R",
    "content": "#' Build site for GitHub pages\n#'\n#' @description\n#' Designed to be run as part of automated workflows for deploying\n#' to GitHub pages. It cleans out the old site, builds the site into `dest_dir`\n#' adds a `.nojekyll` file to suppress rendering by Jekyll, and adds a `CNAME`\n#' file if needed.\n#'\n#' It is designed to be run in CI, so by default it:\n#'\n#' * Cleans out the old site.\n#' * Does not install the package.\n#' * Runs [build_site()] in process.\n#'\n#' @inheritParams build_site\n#' @inheritParams deploy_to_branch\n#' @param dest_dir Directory to build site in.\n#' @export\nbuild_site_github_pages <- function(\n  pkg = \".\",\n  ...,\n  dest_dir = \"docs\",\n  clean = TRUE,\n  install = FALSE,\n  new_process = FALSE\n) {\n  pkg <- as_pkgdown(pkg, override = list(destination = dest_dir))\n\n  if (clean) {\n    cli::cli_rule(\"Cleaning files from old site\")\n    clean_site(pkg)\n  }\n\n  build_site(\n    pkg,\n    preview = FALSE,\n    install = install,\n    new_process = new_process,\n    ...\n  )\n  build_github_pages(pkg)\n\n  invisible()\n}\n\nbuild_github_pages <- function(pkg = \".\") {\n  cli::cli_rule(\"Extra files for GitHub pages\")\n  pkg <- as_pkgdown(pkg)\n\n  # Add .nojekyll since site is static HTML\n  write_if_different(pkg, \"\", \".nojekyll\", check = FALSE)\n\n  # Add CNAME if url present\n  cname <- cname_url(config_pluck_string(pkg, \"url\"))\n  if (is.null(cname)) {\n    return(invisible())\n  }\n\n  write_if_different(pkg, cname, \"CNAME\", check = FALSE)\n  invisible()\n}\n\ncname_url <- function(url) {\n  if (is.null(url)) {\n    return(NULL)\n  }\n\n  pieces <- xml2::url_parse(url)\n  if (!pieces$path %in% c(\"\", \"/\")) {\n    return(NULL)\n  }\n\n  pieces$server\n}\n"
  },
  {
    "path": "R/build-home-authors.R",
    "content": "build_citation_authors <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  source <- if (has_citation(pkg$src_path)) {\n    repo_source(pkg, \"inst/CITATION\")\n  } else {\n    repo_source(pkg, \"DESCRIPTION\")\n  }\n\n  authors <- data_authors(pkg)\n  data <- list(\n    pagetitle = tr_(\"Authors and Citation\"),\n    citations = data_citations(pkg),\n    authors = unname(authors$all),\n    inst = authors$inst,\n    before = authors$before,\n    after = authors$after,\n    source = source\n  )\n\n  render_page(pkg, \"citation-authors\", data, \"authors.html\")\n}\n\ndata_authors <- function(\n  pkg = \".\",\n  roles = default_roles(),\n  call = caller_env()\n) {\n  pkg <- as_pkgdown(pkg)\n  author_info <- config_pluck_list(\n    pkg,\n    \"authors\",\n    default = list(),\n    call = call\n  )\n\n  inst_path <- path(pkg$src_path, \"inst\", \"AUTHORS\")\n  if (file_exists(inst_path)) {\n    inst <- paste(read_lines(inst_path), collapse = \"\\n\")\n  } else {\n    inst <- NULL\n  }\n\n  authors_all <- pkg_authors(pkg)\n  authors_main <- pkg_authors(pkg, roles)\n\n  all <- purrr::map(authors_all, author_list, author_info, pkg = pkg)\n  main <- purrr::map(authors_main, author_list, author_info, pkg = pkg)\n  more_authors <- length(main) != length(all)\n\n  comments <- purrr::compact(purrr::map(all, \"comment\"))\n\n  print_yaml(list(\n    all = all,\n    main = main,\n    inst = inst,\n    needs_page = more_authors || length(comments) > 0 || !is.null(inst),\n    before = config_pluck_markdown_block(pkg, \"authors.before\", call = call),\n    after = config_pluck_markdown_block(pkg, \"authors.after\", call = call)\n  ))\n}\n\ndefault_roles <- function() {\n  c(\"aut\", \"cre\", \"fnd\")\n}\n\npkg_authors <- function(pkg, role = NULL) {\n  if (pkg$desc$has_fields(\"Authors@R\")) {\n    authors <- unclass(pkg$desc$get_authors())\n  } else {\n    # Just show maintainer\n    authors <- unclass(utils::as.person(pkg$desc$get_maintainer()))\n    authors[[1]]$role <- \"cre\"\n  }\n\n  if (is.null(role)) {\n    authors\n  } else {\n    purrr::keep(authors, ~ any(.$role %in% role))\n  }\n}\n\ndata_home_sidebar_authors <- function(pkg = \".\", call = caller_env()) {\n  pkg <- as_pkgdown(pkg)\n\n  config_pluck_list(pkg, \"authors.sidebar\")\n\n  roles <- config_pluck_character(\n    pkg,\n    \"authors.sidebar.roles\",\n    default = default_roles(),\n    call = call\n  )\n  data <- data_authors(pkg, roles)\n  authors <- purrr::map_chr(data$main, author_desc, comment = FALSE)\n\n  before <- config_pluck_markdown_inline(\n    pkg,\n    \"authors.sidebar.before\",\n    call = call\n  )\n  after <- config_pluck_markdown_inline(\n    pkg,\n    \"authors.sidebar.after\",\n    call = call\n  )\n\n  bullets <- c(before, authors, after)\n  if (data$needs_page) {\n    bullets <- c(bullets, a(tr_(\"More about authors...\"), \"authors.html\"))\n  }\n\n  sidebar_section(tr_(\"Developers\"), bullets)\n}\n\nauthor_name <- function(x, authors, pkg) {\n  name <- format_author_name(x$given, x$family)\n\n  if (!(name %in% names(authors))) {\n    return(name)\n  }\n\n  author <- authors[[name]]\n\n  if (!is.null(author$html)) {\n    error_path <- paste0(\"authors.\", name, \".html\")\n    name <- markdown_text_inline(pkg, author$html, error_path = error_path)\n  }\n\n  if (is.null(author$href)) {\n    name\n  } else {\n    a(name, author$href)\n  }\n}\n\nformat_author_name <- function(given, family) {\n  given <- paste(given, collapse = \" \")\n\n  if (is.null(family)) {\n    given\n  } else {\n    paste0(given, \" \", family)\n  }\n}\n\nauthor_list <- function(x, authors_info = NULL, comment = FALSE, pkg = \".\") {\n  name <- author_name(x, authors_info, pkg = pkg)\n\n  roles <- paste0(role_lookup(x$role), collapse = \", \")\n  substr(roles, 1, 1) <- toupper(substr(roles, 1, 1))\n\n  orcid <- purrr::pluck(x$comment, \"ORCID\")\n  x$comment <- remove_orcid(x$comment)\n\n  ror <- purrr::pluck(x$comment, \"ROR\")\n  x$comment <- remove_ror(x$comment)\n\n  list(\n    name = name,\n    roles = roles,\n    comment = linkify(x$comment),\n    orcid = orcid_link(orcid),\n    ror = ror_link(ror)\n  )\n}\n\nauthor_desc <- function(x, comment = TRUE) {\n  paste(\n    x$name,\n    \"<br />\\n<small class = 'roles'>\",\n    x$roles,\n    \"</small>\",\n    if (!is.null(x$orcid)) {\n      x$orcid\n    },\n    if (!is.null(x$ror)) {\n      x$ror\n    },\n    if (comment && !is.null(x$comment) && length(x$comment) != 0) {\n      paste0(\"<br/>\\n<small>(\", linkify(x$comment), \")</small>\")\n    }\n  )\n}\n\norcid_link <- function(orcid) {\n  if (is.null(orcid)) {\n    return(NULL)\n  }\n\n  paste0(\n    \"<a href='https://orcid.org/\",\n    orcid,\n    \"' target='orcid.widget' aria-label='ORCID'>\",\n    \"<span class='fab fa-orcid orcid' aria-hidden='true'></span></a>\"\n  )\n}\n\nror_link <- function(ror) {\n  if (is.null(ror)) {\n    return(NULL)\n  }\n\n  paste0(\n    \"<a href='https://ror.org/\",\n    ror,\n    \"'>\",\n    \"<img src='https://raw.githubusercontent.com/ror-community/ror-logos/main/ror-icon-rgb.svg' class='ror' alt='ROR'></a>\"\n  )\n}\n\n# Derived from:\n# db <- utils:::MARC_relator_db\n# db <- db[db$usage != \"\",]\n# dput(setNames(tolower(db$term), db$code))\n# # and replace creater with maintainer\nrole_lookup <- function(abbr) {\n  # CRAN roles are translated\n  roles <- c(\n    aut = tr_(\"author\"),\n    com = tr_(\"compiler\"),\n    ctr = tr_(\"contractor\"),\n    ctb = tr_(\"contributor\"),\n    cph = tr_(\"copyright holder\"),\n    cre = tr_(\"maintainer\"),\n    dtc = tr_(\"data contributor\"),\n    fnd = tr_(\"funder\"),\n    rev = tr_(\"reviewer\"),\n    ths = tr_(\"thesis advisor\"),\n    trl = tr_(\"translator\")\n  )\n\n  # Other roles are left as is\n  marc_db <- getNamespace(\"utils\")$MARC_relator_db\n  extra <- setdiff(marc_db$code, names(roles))\n  roles[extra] <- tolower(marc_db$term[match(extra, marc_db$code)])\n\n  out <- unname(roles[abbr])\n  if (any(is.na(out))) {\n    missing <- abbr[is.na(out)]\n    cli::cli_warn(\"Unknown MARC role abbreviation{?s}: {.field {missing}}\")\n    out[is.na(out)] <- abbr[is.na(out)]\n  }\n  out\n}\n\n# citation ---------------------------------------------------------------------\n\nhas_citation <- function(path = \".\") {\n  file_exists(path(path, 'inst/CITATION'))\n}\n\ncreate_citation_meta <- function(path) {\n  path <- path(path, \"DESCRIPTION\")\n\n  dcf <- read.dcf(path)\n  desc <- as.list(dcf[1, ])\n\n  if (!is.null(desc$Encoding)) {\n    desc <- lapply(desc, iconv, from = desc$Encoding, to = \"UTF-8\")\n  } else {\n    desc$Encoding <- \"UTF-8\"\n  }\n\n  if (!is.null(desc$Title)) {\n    desc$Title <- str_squish(desc$Title)\n  }\n\n  desc\n}\n\nread_citation <- function(path = \".\") {\n  if (!has_citation(path)) {\n    return(character())\n  }\n  meta <- create_citation_meta(path)\n  cit_path <- path(path, 'inst/CITATION')\n\n  utils::readCitationFile(cit_path, meta = meta)\n}\n\ndata_home_sidebar_citation <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  sidebar_section(\n    heading = tr_(\"Citation\"),\n    bullets = a(sprintf(tr_(\"Citing %s\"), pkg$package), \"authors.html#citation\")\n  )\n}\n\ndata_citations <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  if (has_citation(pkg$src_path)) {\n    return(citation_provided(pkg$src_path))\n  }\n\n  citation_auto(pkg)\n}\n\ncitation_provided <- function(src_path) {\n  provided_citation <- read_citation(src_path)\n\n  text_version <- format(provided_citation, style = \"textVersion\")\n  cit <- list(\n    html = ifelse(\n      text_version == \"\",\n      format(provided_citation, style = \"html\"),\n      paste0(\"<p>\", escape_html(text_version), \"</p>\")\n    ),\n    bibtex = format(provided_citation, style = \"bibtex\")\n  )\n\n  purrr::transpose(cit)\n}\n\ncitation_auto <- function(pkg) {\n  desc <- read_desc(pkg$src_path)\n  cit_info <- as.list(desc$get(desc$fields()))\n  #  utils::packageDescription(\n  #   pkg$package,\n  #   lib.loc = path_dir(pkg$src_path)\n  # )\n  # browser()\n  # C\n  cit_info$`Date/Publication` <- cit_info$`Date/Publication` %||% Sys.time()\n  if (!is.null(cit_info$Title)) {\n    cit_info$Title <- str_squish(cit_info$Title)\n  }\n\n  cit <- utils::citation(auto = cit_info)\n  list(\n    html = format(cit, style = \"html\"),\n    bibtex = format(cit, style = \"bibtex\")\n  )\n}\n\n# helpers -------------------------------------------------------------------------\n\n# Not strictly necessary, but produces a simpler data structure testing\nremove_orcid <- function(x) {\n  out <- x[names2(x) != \"ORCID\"]\n  if (all(names(out) == \"\")) {\n    names(out) <- NULL\n  }\n  out\n}\nremove_ror <- function(x) {\n  out <- x[names2(x) != \"ROR\"]\n  if (all(names(out) == \"\")) {\n    names(out) <- NULL\n  }\n  out\n}\n"
  },
  {
    "path": "R/build-home-community.R",
    "content": "has_contributing <- function(path = \".\") {\n  file_exists(path(path, 'CONTRIBUTING.md')) ||\n    file_exists(path(path, '.github', 'CONTRIBUTING.md'))\n}\n\nhas_coc <- function(path = \".\") {\n  file_exists(path(path, 'CODE_OF_CONDUCT.md')) ||\n    file_exists(path(path, '.github', 'CODE_OF_CONDUCT.md'))\n}\n\nhas_support <- function(path = \".\") {\n  file_exists(path(path, 'SUPPORT.md')) ||\n    file_exists(path(path, '.github', 'SUPPORT.md'))\n}\n\ndata_home_sidebar_community <- function(pkg) {\n  pkg <- as_pkgdown(pkg)\n\n  links <- NULL\n\n  if (has_contributing(pkg$src_path)) {\n    links <- c(links, a(tr_(\"Contributing guide\"), \"CONTRIBUTING.html\"))\n  }\n\n  if (has_coc(pkg$src_path)) {\n    links <- c(links, a(tr_(\"Code of conduct\"), \"CODE_OF_CONDUCT.html\"))\n  }\n\n  if (has_support(pkg$src_path)) {\n    links <- c(links, a(tr_(\"Getting help\"), \"SUPPORT.html\"))\n  }\n\n  if (is.null(links)) {\n    return(\"\")\n  }\n\n  sidebar_section(tr_(\"Community\"), links)\n}\n"
  },
  {
    "path": "R/build-home-index.R",
    "content": "#' @export\n#' @rdname build_home\nbuild_home_index <- function(pkg = \".\", override = list(), quiet = TRUE) {\n  pkg <- section_init(pkg, override = override)\n\n  src_path <- path_index(pkg)\n  dst_path <- path(pkg$dst_path, \"index.html\")\n  data <- data_home(pkg)\n\n  if (is.null(src_path)) {\n    cli::cli_inform(\"Reading {.file DESCRIPTION}\")\n    data$index <- linkify(pkg$desc$get_field(\"Description\", \"\"))\n  } else {\n    cli::cli_inform(\"Reading {src_path(path_rel(src_path, pkg$src_path))}\")\n    local_options_link(pkg, depth = 0L)\n    data$index <- markdown_body(pkg, src_path)\n  }\n\n  cur_digest <- file_digest(dst_path)\n  render_page(pkg, \"home\", data, \"index.html\", quiet = quiet)\n\n  strip_header <- config_pluck_bool(pkg, \"home.strip_header\", default = FALSE)\n  hide_badges <- pkg$development$mode == \"release\" && !pkg$development$in_dev\n\n  update_html(\n    dst_path,\n    tweak_homepage_html,\n    strip_header = strip_header,\n    sidebar = !isFALSE(pkg$meta$home$sidebar),\n    show_badges = !hide_badges,\n    bs_version = pkg$bs_version,\n    logo = logo_path(pkg, depth = 0)\n  )\n\n  new_digest <- file_digest(dst_path)\n  if (cur_digest != new_digest) {\n    writing_file(path_rel(dst_path, pkg$dst_path), \"index.html\")\n  }\n\n  invisible()\n}\n\npath_index <- function(pkg) {\n  path_first_existing(\n    pkg$src_path,\n    c(\"pkgdown/index.md\", \"index.md\", \"README.md\")\n  )\n}\n\ndata_home <- function(pkg = \".\", call = caller_env()) {\n  pkg <- as_pkgdown(pkg)\n\n  config_pluck_list(pkg, \"home\", call = call)\n\n  title <- config_pluck_string(\n    pkg,\n    \"home.title\",\n    default = cran_unquote(pkg$desc$get_field(\"Title\", \"\")),\n    call = call\n  )\n  description <- config_pluck_string(\n    pkg,\n    \"home.description\",\n    default = cran_unquote(pkg$desc$get_field(\"Description\", \"\")),\n    call = call\n  )\n  trailing_slash <- config_pluck_bool(\n    pkg,\n    \"template.trailing_slash_redirect\",\n    default = FALSE,\n    call = call\n  )\n\n  print_yaml(list(\n    pagetitle = title,\n    sidebar = data_home_sidebar(pkg, call = call),\n    opengraph = list(description = description),\n    has_trailingslash = trailing_slash\n  ))\n}\n\n\ndata_home_sidebar <- function(pkg = \".\", call = caller_env()) {\n  pkg <- as_pkgdown(pkg)\n\n  sidebar <- config_pluck(pkg, \"home.sidebar\")\n  if (isFALSE(sidebar)) {\n    return(FALSE)\n  }\n\n  config_pluck_list(pkg, \"home\", call = call)\n  html_path <- config_pluck_string(pkg, \"home.sidebar.html\", call = call)\n  if (!is.null(html_path)) {\n    html_path_abs <- path(pkg$src_path, html_path)\n\n    if (!file_exists(html_path_abs)) {\n      msg <- \"{.field home.sidebar.html} specifies a file that doesn't exist ({.file {html_path}}).\"\n      config_abort(pkg, msg, call = call)\n    }\n    return(read_file(html_path_abs))\n  }\n\n  structure <- config_pluck_character(\n    pkg,\n    \"home.sidebar.structure\",\n    default = default_sidebar_structure(),\n    call = call\n  )\n\n  # compute all default sections\n  default_components <- list(\n    links = data_home_sidebar_links(pkg),\n    license = data_home_sidebar_license(pkg),\n    community = data_home_sidebar_community(pkg),\n    citation = data_home_sidebar_citation(pkg),\n    authors = data_home_sidebar_authors(pkg),\n    dev = sidebar_section(\n      tr_(\"Dev Status\"),\n      \"placeholder\",\n      class = \"dev-status\"\n    ),\n    toc = data_home_toc(pkg)\n  )\n\n  needs_components <- setdiff(structure, names(default_components))\n  custom_yaml <- config_pluck_sidebar_components(\n    pkg,\n    needs_components,\n    call = call\n  )\n  custom_components <- purrr::map(custom_yaml, function(x) {\n    sidebar_section(x$title, markdown_text_block(pkg, x$text))\n  })\n  components <- modify_list(default_components, custom_components)\n\n  sidebar <- purrr::compact(components[structure])\n  paste0(sidebar, collapse = \"\\n\")\n}\n\n# Update sidebar-configuration.Rmd if this changes\ndefault_sidebar_structure <- function() {\n  c(\"links\", \"license\", \"community\", \"citation\", \"authors\", \"dev\")\n}\n\nconfig_pluck_sidebar_components <- function(\n  pkg,\n  new_components,\n  call = caller_env()\n) {\n  base_path <- \"home.sidebar.components\"\n  components <- config_pluck_list(\n    pkg,\n    base_path,\n    has_names = new_components,\n    call = call\n  )\n\n  for (name in names(components)) {\n    component <- components[[name]]\n    component_path <- paste0(base_path, \".\", name)\n\n    config_pluck_list(\n      pkg,\n      component_path,\n      has_names = c(\"title\", \"text\"),\n      call = call\n    )\n    config_pluck_string(pkg, paste0(component_path, \".title\"), call = call)\n    config_pluck_string(pkg, paste0(component_path, \".text\"), call = call)\n  }\n  components\n}\n\ndata_home_sidebar_links <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  repo <- cran_link(pkg$package)\n  links <- config_pluck(pkg, \"home.links\")\n\n  bug_reports <- pkg$desc$get_field(\"BugReports\", default = NULL)\n  if (\n    !is.null(bug_reports) &&\n      grepl(\"@\", bug_reports) &&\n      !startsWith(bug_reports, \"http\")\n  ) {\n    bug_reports <- paste0(\"mailto:\", bug_reports)\n  }\n\n  links <- c(\n    link_url(sprintf(tr_(\"View on %s\"), repo$repo), repo$url),\n    link_url(tr_(\"Browse source code\"), repo_home(pkg)),\n    link_url(tr_(\"Report a bug\"), bug_reports),\n    purrr::map_chr(links, ~ link_url(.$text, .$href))\n  )\n\n  sidebar_section(tr_(\"Links\"), links)\n}\n\ndata_home_toc <- function(pkg) {\n  sidebar_section(\n    tr_(\"Table of contents\"),\n    '<nav id=\"toc\"></nav>'\n  )\n}\n\nsidebar_section <- function(heading, bullets, class = make_slug(heading)) {\n  if (length(bullets) == 0) {\n    return(character())\n  }\n\n  paste0(\n    \"<div class='\",\n    class,\n    \"'>\\n\",\n    \"<h2 data-toc-skip>\",\n    heading,\n    \"</h2>\\n\",\n    \"<ul class='list-unstyled'>\\n\",\n    paste0(\"<li>\", bullets, \"</li>\\n\", collapse = \"\"),\n    \"</ul>\\n\",\n    \"</div>\\n\"\n  )\n}\n\ncran_link <- function(pkg) {\n  cran_url <- paste0(\"https://cloud.r-project.org/package=\", pkg)\n  req <- httr2::request(cran_url)\n  req <- req_pkgdown_cache(req)\n  req <- httr2::req_error(req, function(resp) FALSE)\n  resp <- httr2::req_perform(req)\n  if (!httr2::resp_is_error(resp)) {\n    return(list(repo = \"CRAN\", url = cran_url))\n  }\n\n  # bioconductor always returns a 200 status, redirecting to /removed-packages/\n  bioc_url <- paste0(\"https://www.bioconductor.org/packages/\", pkg)\n  req <- httr2::request(bioc_url)\n  req <- req_pkgdown_cache(req)\n  req <- httr2::req_error(req, function(resp) FALSE)\n  req <- httr2::req_retry(req, max_tries = 3)\n  resp <- httr2::req_perform(req)\n\n  if (\n    !httr2::resp_is_error(resp) &&\n      !grepl(\"removed-packages\", httr2::resp_url(resp))\n  ) {\n    return(list(repo = \"Bioconductor\", url = bioc_url))\n  }\n\n  NULL\n}\n\nreq_pkgdown_cache <- function(req) {\n  cache_path <- dir_create(path(tools::R_user_dir(\"pkgdown\", \"cache\"), \"http\"))\n  httr2::req_cache(\n    req,\n    path = cache_path,\n    max_age = 86400 # 1 day\n  )\n}\n\n# authors forced to wrap words in '' to prevent spelling errors\ncran_unquote <- function(string) {\n  gsub(\"\\\\'(.*?)\\\\'\", \"\\\\1\", string)\n}\n"
  },
  {
    "path": "R/build-home-license.R",
    "content": "# Renders LICENSE text file into html\nbuild_home_license <- function(pkg) {\n  license_md <- path_first_existing(pkg$src_path, c(\"LICENSE.md\", \"LICENCE.md\"))\n  if (!is.null(license_md)) {\n    render_md(pkg, license_md)\n  }\n\n  license_raw <- path_first_existing(pkg$src_path, c(\"LICENSE\", \"LICENCE\"))\n  if (!is.null(license_raw)) {\n    render_page(\n      pkg,\n      \"title-body\",\n      data = list(\n        pagetitle = tr_(\"License\"),\n        body = paste0(\"<pre>\", escape_html(read_file(license_raw)), \"</pre>\")\n      ),\n      path = \"LICENSE-text.html\"\n    )\n    return()\n  }\n}\n\ndata_home_sidebar_license <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  link <- autolink_license(pkg$desc$get_field(\"License\", \"\"))\n\n  license_md <- path_first_existing(pkg$src_path, c(\"LICENSE.md\", \"LICENCE.md\"))\n  if (!is.null(license_md)) {\n    link <- c(\n      a(tr_(\"Full license\"), \"LICENSE.html\"),\n      paste0(\"<small>\", link, \"</small>\")\n    )\n  }\n\n  sidebar_section(tr_(\"License\"), link)\n}\n\n# helpers -----------------------------------------------------------------\n\nautolink_license <- function(x) {\n  db <- licenses_db()\n\n  for (i in seq_len(nrow(db))) {\n    match <- paste0(\"\\\\b\\\\Q\", db$abbr[[i]], \"\\\\E\\\\b\")\n    x <- gsub(match, db$a[[i]], x, perl = TRUE)\n  }\n  x\n}\n\nlicenses_db <- function() {\n  path <- path(R.home(\"share\"), \"licenses\", \"license.db\")\n  db <- tibble::as_tibble(read.dcf(path))\n\n  db <- add_missing_sss(db)\n\n  abbr <- ifelse(is.na(db$SSS), db$Abbrev, db$SSS)\n  url <- db$URL\n\n  # Add entry for LICENSE file\n  abbr <- c(abbr, \"LICENSE\", \"LICENCE\")\n  url <- c(url, \"LICENSE-text.html\", \"LICENSE-text.html\")\n\n  out <- tibble::tibble(abbr, url)\n  out$a <- paste0(\"<a href='\", url, \"'>\", abbr, \"</a>\")\n\n  out[!is.na(out$abbr), ]\n}\n\n# Add missing standard short specification (SSS) for some licenses\n# (e.g., Mozilla Public Licences)\n# see src/library/tools/R/license.R in R source for details\nadd_missing_sss <- function(db) {\n  needs_sss <- !is.na(db$Abbrev) & !is.na(db$Version) & is.na(db$SSS)\n  x <- db[needs_sss, ]\n\n  db[needs_sss, \"SSS\"] <- paste0(x$Abbrev, \"-\", x$Version)\n\n  db\n}\n"
  },
  {
    "path": "R/build-home-md.R",
    "content": "build_home_md <- function(pkg) {\n  mds <- package_mds(pkg$src_path, in_dev = pkg$development$in_dev)\n\n  lapply(mds, render_md, pkg = pkg)\n  invisible()\n}\n\npackage_mds <- function(path, in_dev = FALSE) {\n  mds <- dir_ls(path, glob = \"*.md\")\n\n  # Also looks in .github, if it exists\n  github_path <- path(path, \".github\")\n  if (dir_exists(github_path)) {\n    mds <- c(mds, dir_ls(github_path, glob = \"*.md\"))\n  }\n\n  # Remove files handled elsewhere\n  handled <- c(\"README.md\", \"LICENSE.md\", \"LICENCE.md\", \"NEWS.md\")\n  mds <- mds[!path_file(mds) %in% handled]\n\n  # Do not build 404 page if in-dev\n  if (in_dev) {\n    mds <- mds[path_file(mds) != \"404.md\"]\n  }\n\n  # Remove files that don't need to be rendered\n  no_render <- c(\n    \"issue_template.md\",\n    \"pull_request_template.md\",\n    \"cran-comments.md\"\n  )\n  mds <- mds[!path_file(mds) %in% no_render]\n\n  unname(mds)\n}\n\nrender_md <- function(pkg, filename) {\n  cli::cli_inform(\"Reading {src_path(path_rel(filename, pkg$src_path))}\")\n\n  body <- markdown_body(pkg, filename, strip_header = TRUE)\n  path <- path_ext_set(path_file(filename), \"html\")\n\n  render_page(\n    pkg,\n    \"title-body\",\n    data = list(\n      pagetitle = attr(body, \"title\"),\n      body = body,\n      filename = filename,\n      source = repo_source(pkg, path_rel(filename, pkg$src_path))\n    ),\n    path = path\n  )\n\n  if (path == \"404.html\") {\n    update_html(path(pkg$dst_path, path), tweak_link_absolute, pkg = pkg)\n  }\n  check_missing_images(pkg, filename, path)\n\n  invisible()\n}\n"
  },
  {
    "path": "R/build-home.R",
    "content": "#' Build home section\n#'\n#' @description\n#' `build_home()` function generates pages at the top-level of the site\n#' including:\n#'\n#' * The home page\n#' * HTML files from any `.md` files in `./` or `.github/`.\n#' * The authors page (from `DESCRIPTION`)\n#' * The citation page (from `inst/CITATION`, if present).\n#' * The license page\n#' * A default 404 page if `.github/404.md` is not found.\n#'\n#' `build_home_index()` rebuilds just the index page; it's useful for rapidly\n#' iterating when experimenting with site styles.\n#'\n#' # Home page\n#'\n#' The main content of the home page (`index.html`) is generated from\n#' `pkgdown/index.md`, `index.md`, or `README.md`, in that order.\n#' Most packages will use `README.md` because that's also displayed by GitHub\n#' and CRAN. Use `index.md` if you want your package website to look\n#' different to your README, and use `pkgdown/index.md` if you don't want that\n#' file to live in your package root directory.\n#'\n#' If you use `index.Rmd` or `README.Rmd` it's your responsibility to knit\n#' the document to create the corresponding `.md`. pkgdown does not do this\n#' for you because it only touches files in the `doc/` directory.\n#'\n#' Extra markdown files in the base directory (e.g. `ROADMAP.md`) or in\n#' `.github/` (e.g. `CODE_OF_CONDUCT.md`) are copied by `build_home()` to `docs/` and converted to HTML.\n#'\n#' The home page also features a sidebar with information extracted from the\n#' package. You can tweak it via the configuration file, to help make the home\n#' page an as informative as possible landing page.\n#'\n#' ## Images and figures\n#'\n#' If you want to include images in your `README.md`, they must be stored\n#' somewhere in the package so that they can be displayed on the CRAN website.\n#' The best place to put them is `man/figures`. If you are generating figures\n#' with R Markdown, make sure you set up `fig.path` as followed:\n#'\n#' ``` r\n#' knitr::opts_chunk$set(\n#'   fig.path = \"man/figures/\"\n#' )\n#' ```\n#'\n#' This should usually go in a chunk with `include = FALSE`.\n#'\n#' ```` markdown\n#' ```{r chunk-name, include=FALSE}`r ''`\n#' knitr::opts_chunk$set(\n#'   fig.path = \"man/figures/\"\n#' )\n#' ```\n#' ````\n#'\n#' ## Package logo\n#'\n#' If you have a package logo, you can include it at the top of your README\n#' in a level-one heading:\n#'\n#' ``` markdown\n#' # pkgdown <img src=\"man/figures/logo.png\" align=\"right\" />\n#' ```\n#'\n#' [init_site()] will also automatically create a favicon set from your package logo.\n#'\n#' ## YAML config - title and description\n#'\n#' By default, the page title and description are extracted automatically from\n#' the `Title` and `Description` fields `DESCRIPTION` (stripping single quotes\n#' off quoted words). CRAN ensures that these fields don't contain phrases\n#' like \"R package\" because that's obvious on CRAN. To make your package more\n#' findable on search engines, it's good practice to override the `title` and\n#' `description`, thinking about what people might search for:\n#'\n#' ```yaml\n#' home:\n#'   title: An R package for pool-noodle discovery\n#'   description: >\n#'     Do you love R? Do you love pool-noodles? If so, you might enjoy\n#'     using this package to automatically discover and add pool-noodles\n#'     to your growing collection.\n#' ```\n#'\n#' (Note the use of YAML's `>` i.e. \"YAML pipes\"; this is a convenient way of\n#' writing paragraphs of text.)\n#'\n#' ## Dev badges\n#'\n#' pkgdown identifies badges in three ways:\n#'\n#' -   Any image-containing links between `<!-- badges: start -->` and\n#'     `<!-- badges: end -->`, as e.g. created by `usethis::use_readme_md()`\n#'     or `usethis::use_readme_rmd()`. There should always be an empty line after\n#'     the `<!-- badges: end -->` line. If you divide badges into paragraphs,\n#'     make sure to add an empty line before the `<!-- badges: end -->` line.\n#'\n#' -   Any image-containing links within `<div id=\"badges\"></div>`.\n#'\n#' -   Within the first paragraph, if it only contains image-containing links.\n#'\n#' Identified badges are **removed** from the _main content_.\n#' They are shown or not in the _sidebar_ depending on the development mode and\n#' sidebar customization, see the sidebar section.\n#'\n#' # Authors\n#'\n#' By default, pkgdown will display author information in three places:\n#'\n#' * the sidebar,\n#' * the left part side of the footer,\n#' * the author page.\n#'\n#' This documentation describes how to customise the overall author display.\n#' See `?build_home` and `?build_site` for details about changing the location\n#' of the authors information within the home sidebar and the site footer.\n#'\n#' ## Authors ORCID, ROR and bio\n#'\n#' Author ORCID identification numbers in the `DESCRIPTION` are linked using\n#' the ORCID logo,\n#' author ROR identification numbers are linked using the ROR logo:\n#'\n#' ```r\n#' Authors@R: c(\n#'     person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\"),\n#'       comment = c(ORCID = \"0000-0003-4757-117X\")\n#'     ),\n#'     person(\"Jay\", \"Hesselberth\", role = \"aut\",\n#'       comment = c(ORCID = \"0000-0002-6299-179X\")\n#'     ),\n#'    person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"),\n#'           comment = c(ROR = \"03wc8by49\"))\n#'   )\n#' ```\n#'\n#' If you want to add more details about authors or their involvement with the\n#' package, you can use the comment field, which will be rendered on the\n#' authors page.\n#'\n#' ```r\n#' Authors@R: c(\n#'     person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\"),\n#'       comment = c(ORCID = \"0000-0003-4757-117X\", \"Indenter-in-chief\")\n#'     ),\n#'     person(\"Jay\", \"Hesselberth\", role = \"aut\",\n#'       comment = c(ORCID = \"0000-0002-6299-179X\")\n#'     )\n#'   )\n#' ```\n#'\n#' ## Additional control via YAML\n#'\n#' You can control additional aspects of the authors display via the `authors`\n#' YAML field:\n#'\n#' * display of each author in the footer, sidebar and authors page,\n#' * which authors (by role) are displayed in the sidebar and footer,\n#' * text before authors in the footer,\n#' * text before and after authors in the sidebar,\n#' * text before and after authors on the authors page.\n#'\n#' You can modify how each author's name is displayed by adding a subsection\n#' for `authors`. Each entry in `authors` should be named the author's name\n#' (matching `DESCRIPTION`) and can contain `href` and/or `html` fields:\n#'\n#' * If `href` is provided, the author's name will be linked to this URL.\n#' * If `html` is provided, it will be shown instead of the author's name.\n#'   This is particularly useful if you want to display the logo of a corporate\n#'   sponsor. Use an absolute URL to an image, not a relative link. Use an empty\n#'   alternative text rather than no alternative text so a screen-reader would\n#' skip over it.\n#'\n#' ```yaml\n#' authors:\n#'   firstname lastname:\n#'     href: \"http://name-website.com\"\n#'     html: \"<img src='https://website.com/name-picture.png' width=72 alt=''>\"\n#' ```\n#'\n#'\n#' By default, the \"developers\" list shown in the sidebar and footer is\n#' populated by the maintainer (\"cre\"), authors (\"aut\"), and funder (\"fnd\")\n#' from the `DESCRIPTION`. You could choose other roles for filtering.\n#' With the configuration below:\n#'\n#' * only the maintainer and funder(s) appear in the footer, after the text\n#'   \"Crafted by\",\n#' * all authors and contributors appear in the sidebar,\n#' * the authors list on the sidebar is preceded and followed by some text,\n#' * the authors list on the authors page is preceded and followed by some text.\n#'\n#'\n#' ```yaml\n#' authors:\n#'   footer:\n#'     roles: [cre, fnd]\n#'     text: \"Crafted by\"\n#'   sidebar:\n#'     roles: [aut, ctb]\n#'     before: \"So *who* does the work?\"\n#'     after: \"Thanks all!\"\n#'   before: \"This package is proudly brought to you by:\"\n#'   after: \"See the [changelog](news/index.html) for other contributors. :pray:\"\n#' ```\n#'\n#' If you want to filter authors based on something else than their roles,\n#' consider using a custom sidebar/footer component\n#' (see `?build_home`/`?build_site`, respectively).\n#'\n#' # Sidebar\n#'\n#' You can customise the homepage sidebar with the `home.sidebar` field.\n#' It's made up of two pieces: `structure`, which defines the overall layout,\n#' and `components`, which defines what each piece looks like. This organisation\n#' makes it easy to mix and match the pkgdown defaults with your own\n#' customisations.\n#'\n#' This is the default structure:\n#'\n#' ``` yaml\n#' home:\n#'   sidebar:\n#'     structure: [links, license, community, citation, authors, dev]\n#' ```\n#'\n#' These are drawn from seven built-in components:\n#'\n#' -   `links`: automated links generated from `URL` and `BugReports` fields\n#'     from `DESCRIPTION` plus manual links from the `home.links` field:\n#'\n#'     ``` yaml\n#'     home:\n#'       links:\n#'       - text: Link text\n#'         href: https://website.com\n#'       - text: Roadmap\n#'         href: /roadmap.html\n#'     ```\n#'\n#' -   `license`: Licensing information if `LICENSE`/`LICENCE` or\n#'     `LICENSE.md`/`LICENCE.md` files are present.\n#'\n#' -   `community`: links to to `.github/CONTRIBUTING.md`,\n#'     `.github/CODE_OF_CONDUCT.md`, etc.\n#'\n#' -   `citation`: link to package citation information. Uses either\n#'     `inst/CITATION` or, if absent, information from the `DESCRIPTION`.\n#'\n#' -   `authors`: selected authors from the `DESCRIPTION`.\n#'\n#' -   `dev`: development status badges extracted from `README.md`/`index.md`.\n#'     This is only shown for \"development\" versions of websites; see\n#'     \"Development mode\" in `?build_site` for details.\n#'\n#' -   `toc`: a table of contents for the README (not shown by default).\n#'\n#' You can also add your own components, where `text` is markdown text:\n#'\n#' ``` yaml\n#' home:\n#'   sidebar:\n#'     structure: [authors, custom, toc, dev]\n#'     components:\n#'       custom:\n#'         title: Funding\n#'         text: We are *grateful* for funding!\n#' ```\n#'\n#' Alternatively, you can provide a ready-made sidebar HTML:\n#'\n#' ``` yaml\n#' home:\n#'   sidebar:\n#'     html: path-to-sidebar.html\n#' ```\n#'\n#' Or completely remove it:\n#'\n#' ``` yaml\n#' home:\n#'   sidebar: FALSE\n#' ```\n#' @inheritParams build_articles\n#' @family site components\n#' @export\n#' @order 1\nbuild_home <- function(\n  pkg = \".\",\n  override = list(),\n  preview = FALSE,\n  quiet = TRUE\n) {\n  pkg <- section_init(pkg, override = override)\n  check_bool(quiet)\n\n  cli::cli_rule(\"Building home\")\n\n  build_citation_authors(pkg)\n\n  build_home_md(pkg)\n  build_home_license(pkg)\n  build_home_index(pkg, quiet = quiet)\n\n  if (!pkg$development$in_dev) {\n    build_404(pkg)\n  }\n\n  preview_site(pkg, \"/\", preview = preview)\n}\n"
  },
  {
    "path": "R/build-llm-dl.R",
    "content": "simplify_dls <- function(html) {\n  dls <- xml2::xml_find_all(html, \".//dl\")\n  for (dl in dls) {\n    simplify_dl(dl)\n  }\n  invisible()\n}\n\nsimplify_dl <- function(dl) {\n  children <- xml2::xml_children(dl)\n\n  names <- xml2::xml_name(children)\n  if (!is_simple_dl(names)) {\n    cli::cli_warn(\"Skipping this <dl>: not a simple term-definition list\")\n    return()\n  }\n\n  groups <- split(children, (seq_along(children) - 1) %/% 2)\n\n  bullets <- lapply(groups, create_li_from_group)\n  ul <- xml2::read_xml(\"<ul></ul>\")\n  xml_insert(ul, bullets)\n\n  xml2::xml_replace(dl, ul)\n}\n\n# Must have an even number of children that alternate between dt and dd\nis_simple_dl <- function(names) {\n  if (length(names) %% 2 != 0) {\n    return(FALSE)\n  }\n  odd <- names[seq_along(names) %% 2 == 1]\n  even <- names[seq_along(names) %% 2 == 0]\n\n  all(odd == \"dt\") && all(even == \"dd\")\n}\n\ncreate_li_from_group <- function(group) {\n  dt <- group[[1]]\n  dd <- group[[2]]\n\n  if (has_children(dd)) {\n    # params case\n    para <- xml2::read_xml(\"<p></p>\")\n    xml_insert(para, xml2::xml_contents(dt))\n    xml2::xml_add_child(para, xml_text_node(\": \"))\n\n    bullet <- xml2::read_xml(\"<li></li>\")\n    xml2::xml_add_child(bullet, para)\n  } else {\n    # reference index\n    bullet <- xml2::read_xml(\"<li></li>\")\n    xml_insert(bullet, xml2::xml_contents(dt))\n    xml2::xml_add_child(bullet, xml_text_node(\": \"))\n  }\n  xml_insert(bullet, xml2::xml_contents(dd))\n\n  bullet\n}\n\nhas_children <- function(x) length(xml2::xml_children(x)) > 0\n\nxml_text_node <- function(x) {\n  span <- xml2::read_xml(paste0(\"<span>\", x, \"</span>\"))\n  xml2::xml_find_first(span, \".//text()\")\n}\n"
  },
  {
    "path": "R/build-llm.R",
    "content": "#' Build docs for LLMs\n#'\n#' @description\n#' `build_llm_docs()` creates an `LLMs.txt` at the root of your site\n#' that contains the contents of your `README.md`, your reference index,\n#' and your articles index. It also creates a `.md` file for every existing\n#' `.html` file in your site. Together, this gives an LLM an overview of your\n#' package and the ability to find out more by following links.\n#'\n#' If you don't want these files generated for your site, you can opt-out by\n#' adding the following to your `pkgdown.yml`:\n#'\n#' ```yaml\n#' llm-docs: false\n#' ```\n#'\n#' @family site components\n#' @inheritParams build_site\n#' @export\nbuild_llm_docs <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n  if (isFALSE(pkg$meta$`llm-docs`)) {\n    return(invisible())\n  }\n\n  cli::cli_rule(\"Building docs for llms\")\n\n  paths <- get_site_paths(pkg)\n  purrr::walk(paths, \\(path) {\n    src_path <- path(pkg[[\"dst_path\"]], path)\n    dst_path <- path_ext_set(src_path, \"md\")\n    convert_md(src_path, dst_path, full_url(pkg, path))\n  })\n\n  index <- c(\n    read_lines(path(pkg$dst_path, \"index.md\")),\n    \"\",\n    read_file_if_exists(path(pkg$dst_path, \"reference\", \"index.md\")),\n    \"\",\n    read_file_if_exists(path(pkg$dst_path, \"articles\", \"index.md\"))\n  )\n  write_lines(index, path(pkg$dst_path, \"llms.txt\"))\n\n  invisible()\n}\n\nfull_url <- function(pkg, path) {\n  if (is.null(pkg$meta$url)) {\n    return()\n  }\n\n  url <- paste0(pkg$meta$url, \"/\")\n  if (pkg$development$in_dev) {\n    url <- paste0(url, pkg$prefix)\n  }\n\n  xml2::url_absolute(paste0(path_dir(path), \"/\"), url)\n}\n\nconvert_md <- function(src_path, dst_path, url = NULL) {\n  html <- xml2::read_html(src_path)\n  main_html <- xml2::xml_find_first(html, \".//main\")\n  if (length(main_html) == 0) {\n    return()\n  }\n\n  simplify_page_header(main_html)\n  simplify_anchors(main_html)\n  simplify_code(main_html)\n  simplify_popovers_to_footnotes(main_html)\n  simplify_lifecycle_badges(main_html)\n  simplify_dls(main_html)\n  create_absolute_links(main_html, url)\n\n  path <- file_temp()\n  xml2::write_html(main_html, path, format = FALSE)\n  on.exit(file_delete(path), add = TRUE)\n\n  if (rmarkdown::pandoc_available(\"2.10.1\")) {\n    to <- \"gfm+definition_lists-raw_html\"\n  } else {\n    to <- \"gfm-raw_html\"\n  }\n\n  rmarkdown::pandoc_convert(\n    input = path,\n    output = dst_path,\n    from = \"html\",\n    to = to,\n  )\n}\n\n# Helpers ---------------------------------------------------------------------\n\n# simplify page header (which includes logo + source link)\nsimplify_page_header <- function(html) {\n  title <- xml2::xml_find_first(html, \".//h1\")\n  # website for a package without README/index.md\n  if (length(title) > 0) {\n    xml2::xml_remove(xml2::xml_find_first(html, \".//div[@class='page-header']\"))\n    xml2::xml_add_child(html, title, .where = 0)\n  }\n  invisible()\n}\n\n# drop internal anchors\nsimplify_anchors <- function(html) {\n  xml2::xml_remove(xml2::xml_find_all(html, \".//a[@class='anchor']\"))\n  invisible()\n}\n\n# strip extraneoous classes\nsimplify_code <- function(html) {\n  extract_lang <- function(class) {\n    trimws(gsub(\"sourceCode|downlit\", \"\", class))\n  }\n  code <- xml2::xml_find_all(html, \".//pre[contains(@class, 'sourceCode')]\")\n\n  purrr::walk(code, \\(x) {\n    xml2::xml_attr(x, \"class\") <- extract_lang(xml2::xml_attr(x, \"class\"))\n  })\n  invisible()\n}\n\nsimplify_popovers_to_footnotes <- function(main_html) {\n  popover_refs <- xml2::xml_find_all(main_html, \".//a[@class='footnote-ref']\")\n  if (length(popover_refs) == 0) {\n    return()\n  }\n\n  # Create footnotes section\n  footnotes_section <- xml2::xml_find_first(\n    main_html,\n    \".//section[@class='footnotes']\"\n  )\n  if (length(footnotes_section) == 0) {\n    footnotes_section <- xml2::xml_add_child(\n      main_html,\n      \"section\",\n      id = \"footnotes\",\n      class = \"footnotes footnotes-end-of-document\",\n      role = \"doc-endnotes\"\n    )\n    xml2::xml_add_child(footnotes_section, \"hr\")\n    footnotes_ol <- xml2::xml_add_child(footnotes_section, \"ol\")\n  } else {\n    footnotes_ol <- xml2::xml_find_first(footnotes_section, \".//ol\")\n  }\n\n  purrr::iwalk(popover_refs, function(ref, i) {\n    text_content <- xml2::xml_attr(ref, \"data-bs-content\")\n    fn_id <- paste0(\"fn\", i)\n    fnref_id <- paste0(\"fnref\", i)\n    xml2::xml_attrs(ref) <- list(\n      href = paste0(\"#\", fn_id),\n      id = fnref_id,\n      role = \"doc-noteref\",\n      class = \"footnote-ref\"\n    )\n\n    fn_li <- xml2::xml_add_child(footnotes_ol, \"li\", id = fn_id)\n    parsed_content <- xml2::read_html(text_content) |>\n      xml2::xml_find_first(\".//body\") |>\n      xml2::xml_children()\n    purrr::walk(parsed_content, \\(x) xml2::xml_add_child(fn_li, x))\n  })\n}\n\nsimplify_lifecycle_badges <- function(html) {\n  # on reference index\n  badges <- xml2::xml_find_all(html, \"//span[contains(@class, 'lifecycle')]\")\n  xml2::xml_replace(badges, \"strong\", paste0(\"[\", xml2::xml_text(badges), \"]\"))\n\n  # on individual pages\n  badges <- xml2::xml_find_all(\n    html,\n    \"//a[.//img[starts-with(@src, 'figures/lifecycle-')]]\"\n  )\n  imgs <- xml2::xml_find_first(badges, \".//img\")\n  xml2::xml_replace(badges, \"strong\", tolower(xml2::xml_attr(imgs, \"alt\")))\n\n  invisible()\n}\n\ncreate_absolute_links <- function(main_html, url = NULL) {\n  a <- xml2::xml_find_all(main_html, \".//a\")\n  xml2::xml_attr(a, \"class\") <- NULL\n\n  href <- xml2::xml_attr(a, \"href\")\n  is_internal <- !is.na(href) &\n    !startsWith(href, \"https\") &\n    !startsWith(href, \"#\")\n  if (!is.null(url)) {\n    href[is_internal] <- xml2::url_absolute(href[is_internal], url)\n  }\n  href[is_internal] <- sub(\"html$\", \"md\", href[is_internal])\n\n  xml2::xml_attr(a[is_internal], \"href\") <- href[is_internal]\n\n  invisible()\n}\n\nread_file_if_exists <- function(path) {\n  if (file_exists(path)) {\n    read_lines(path)\n  }\n}\n"
  },
  {
    "path": "R/build-logo.R",
    "content": "copy_logo <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  logo_path <- find_logo(pkg$src_path)\n  if (!is.null(logo_path)) {\n    file_copy_to(\n      src_paths = logo_path,\n      src_root = pkg$src_path,\n      dst_paths = path(pkg$dst_path, path_file(logo_path)),\n      dst_root = pkg$dst_path\n    )\n  }\n}\n\nfind_logo <- function(path) {\n  path_first_existing(\n    c(\n      path(path, \"logo.svg\"),\n      path(path, \"man\", \"figures\", \"logo.svg\"),\n      path(path, \"logo.png\"),\n      path(path, \"man\", \"figures\", \"logo.png\")\n    )\n  )\n}\n\nhas_logo <- function(pkg) {\n  logo_path <- find_logo(pkg$src_path)\n  !is.null(logo_path)\n}\n\nlogo_path <- function(pkg, depth) {\n  path <- find_logo(pkg$src_path)\n  if (is.null(path)) {\n    return()\n  }\n\n  paste0(up_path(depth), path_file(path))\n}\n"
  },
  {
    "path": "R/build-news.R",
    "content": "#' Build news section\n#'\n#' @description\n#' A `NEWS.md` will be broken up into versions using level one (`#`) or\n#' level two headings (`##`) that (partially) match one of the following forms\n#' (ignoring case):\n#'\n#' * `{package name} 1.3.0`\n#' * `{package name} v1.3.0`\n#' * `Version 1.3.0`\n#' * `Changes in 1.3.0`\n#' * `Changes in v1.3.0`\n#'\n#' @details\n#' A [common structure](https://style.tidyverse.org/news.html) for news files\n#' is to use a top level heading for each release, and use a second level\n#' heading to break up individual bullets into sections.\n#'\n#' ```yaml\n#' # foofy 1.0.0\n#'\n#' ## Major changes\n#'\n#' * Can now work with all grooveable grobbles!\n#'\n#' ## Minor improvements and bug fixes\n#'\n#' * Printing scrobbles no longer errors (@githubusername, #100)\n#'\n#' * Wibbles are now 55% less jibbly (#200)\n#' ```\n#'\n#' Issues and contributors will be automatically linked to the corresponding\n#' pages on GitHub if the GitHub repo can be discovered from the `DESCRIPTION`\n#' (typically from a `URL` entry containing `github.com`)\n#'\n#' If a version is available on CRAN, the release date will automatically\n#' be added to the heading (see below for how to suppress); if not\n#' available on CRAN, \"Unreleased\" will be added.\n#'\n#' # YAML config\n#'\n#' To automatically link to release announcements, include a `releases`\n#' section.\n#'\n#' ```yaml\n#' news:\n#'  releases:\n#'  - text: \"usethis 1.3.0\"\n#'    href: https://www.tidyverse.org/articles/2018/02/usethis-1-3-0/\n#'  - text: \"usethis 1.0.0 (and 1.1.0)\"\n#'    href: https://www.tidyverse.org/articles/2017/11/usethis-1.0.0/\n#' ```\n#'\n#' Control whether news is present on one page or multiple pages with the\n#' `one_page` field. The default is `true`.\n#'\n#' ```yaml\n#' news:\n#'   one_page: false\n#' ```\n#'\n#' Suppress the default addition of CRAN release dates with:\n#'\n#' ```yaml\n#' news:\n#'   cran_dates: false\n#' ```\n#' @family site components\n#'\n#' @seealso [Tidyverse style for News](https://style.tidyverse.org/news.html)\n#'\n#' @inheritParams build_articles\n#' @export\nbuild_news <- function(pkg = \".\", override = list(), preview = FALSE) {\n  pkg <- section_init(pkg, \"news\", override = override)\n  if (!has_news(pkg$src_path)) {\n    return(invisible())\n  }\n\n  cli::cli_rule(\"Building news\")\n\n  one_page <- config_pluck_bool(pkg, \"news.one_page\", default = TRUE)\n  if (one_page) {\n    build_news_single(pkg)\n  } else {\n    build_news_multi(pkg)\n  }\n  preview_site(pkg, \"news\", preview = preview)\n}\n\nbuild_news_single <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n  news <- data_news(pkg)\n\n  render_page(\n    pkg,\n    \"news\",\n    list(\n      contents = purrr::transpose(news),\n      pagetitle = tr_(\"Changelog\"),\n      source = repo_source(pkg, \"NEWS.md\")\n    ),\n    path(\"news\", \"index.html\")\n  )\n}\n\nbuild_news_multi <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n  news <- data_news(pkg)\n  page <- factor(news$page, levels = unique(news$page))\n\n  news_paged <- tibble::tibble(\n    version = levels(page),\n    file_out = paste0(\"news-\", version, \".html\"),\n    contents = split(news[c(\"html\", \"version\", \"anchor\")], page)\n  )\n\n  render_news <- function(version, file_out, contents) {\n    # Older, major, versions first on each page\n    # https://github.com/r-lib/pkgdown/issues/2285#issuecomment-2070966518\n    render_page(\n      pkg,\n      \"news\",\n      list(\n        version = version,\n        contents = rev(purrr::transpose(contents)),\n        pagetitle = sprintf(tr_(\"Version %s\"), version)\n      ),\n      path(\"news\", file_out),\n    )\n  }\n  purrr::pwalk(news_paged, render_news)\n\n  render_page(\n    pkg,\n    \"news-index\",\n    list(\n      versions = purrr::transpose(news_paged),\n      pagetitle = tr_(\"News\")\n    ),\n    path(\"news\", \"index.html\")\n  )\n}\n\ndata_news <- function(pkg, call = caller_env()) {\n  html <- markdown_body(pkg, path(pkg$src_path, \"NEWS.md\"))\n  xml <- xml2::read_html(html)\n\n  sections <- xml2::xml_find_all(xml, \"./body/div\")\n  footnotes <- has_class(sections, \"footnotes\")\n  if (any(footnotes)) {\n    cli::cli_warn(\"Footnotes in NEWS.md are not currently supported\")\n  }\n  sections <- sections[!footnotes]\n\n  headings <- xml2::xml_find_first(sections, \".//h1|.//h2|.//h3|.//h4|.//h5\")\n  levels <- xml2::xml_name(headings)\n  ulevels <- unique(levels)\n  if (!identical(ulevels, \"h1\") && !identical(ulevels, \"h2\")) {\n    msg <- c(\n      \"inconsistent use of section headings.\",\n      i = \"Top-level headings must be either all <h1> or all <h2>.\",\n      i = \"See {.help pkgdown::build_news} for more details.\"\n    )\n    config_abort(pkg, msg, path = \"NEWS.md\", call = call)\n  }\n  if (ulevels == \"h1\") {\n    # Bump every heading down a level so to get a single <h1> for the page title\n    tweak_section_levels(xml)\n  }\n\n  titles <- xml2::xml_text(xml2::xml_find_first(sections, \".//h2\"), trim = TRUE)\n\n  versions <- news_version(titles, pkg$package)\n  sections <- sections[!is.na(versions)]\n\n  if (length(sections) == 0) {\n    msg <- c(\n      \"no version headings found\",\n      i = \"See {.help pkgdown::build_news} for expected structure.\"\n    )\n    config_warn(pkg, msg, path = \"NEWS.md\", call = call)\n  }\n\n  versions <- versions[!is.na(versions)]\n\n  show_dates <- config_pluck_bool(\n    pkg,\n    \"news.cran_dates\",\n    default = !is_testing()\n  )\n  if (show_dates) {\n    timeline <- pkg_timeline(pkg$package)\n  } else {\n    timeline <- NULL\n  }\n\n  purrr::walk2(\n    sections,\n    versions,\n    tweak_news_heading,\n    timeline = timeline,\n    bs_version = pkg$bs_version\n  )\n  html <- purrr::map_chr(sections, as.character, options = character())\n  html <- purrr::map_chr(html, repo_auto_link, pkg = pkg)\n\n  anchors <- xml2::xml_attr(sections, \"id\")\n  news <- tibble::tibble(\n    version = versions,\n    page = purrr::map_chr(versions, version_page),\n    anchor = anchors,\n    html = html\n  )\n\n  news\n}\n\nnews_version <- function(x, pkgname) {\n  pattern <- paste0(\n    \"(?x)\n    (?:\",\n    pkgname,\n    \"|version|changes\\\\ in)\n    \\\\s+   # whitespace\n    v?     # optional v followed by\n    (?<version>\n      (?:\\\\d+[.-]\\\\d+)(?:[.-]\\\\d+)*     # digits, dots, and dashes\n      |                             # OR\n      \\\\(development\\\\ version\\\\)   # literal used by usethis\n    )\n  \"\n  )\n  pieces <- re_match(x, pattern, ignore.case = TRUE)\n  gsub(\"^[(]|[)]$\", \"\", pieces$version)\n}\n\nversion_page <- function(x) {\n  if (x == \"development version\") {\n    return(\"dev\")\n  }\n\n  ver <- unclass(package_version(x))[[1]]\n\n  if (length(ver) == 4 && ver[[4]] > 0) {\n    \"dev\"\n  } else {\n    paste0(ver[[1]], \".\", ver[[2]])\n  }\n}\n\nnavbar_news <- function(pkg) {\n  releases_meta <- config_pluck_list(pkg, \"news.releases\")\n  if (!is.null(releases_meta)) {\n    menu_submenu(\n      tr_(\"News\"),\n      list2(\n        menu_heading(tr_(\"Releases\")),\n        !!!releases_meta,\n        menu_separator(),\n        menu_link(tr_(\"Changelog\"), \"news/index.html\")\n      )\n    )\n  } else if (has_news(pkg$src_path)) {\n    menu_link(tr_(\"Changelog\"), \"news/index.html\")\n  }\n}\n\nhas_news <- function(path = \".\") {\n  file_exists(path(path, \"NEWS.md\"))\n}\n\npkg_timeline <- function(package) {\n  url <- paste0(\"https://crandb.r-pkg.org/\", package, \"/all\")\n  req <- httr2::request(url)\n  req <- httr2::req_retry(req, max_tries = 3)\n  req <- httr2::req_error(req, function(resp) FALSE)\n\n  resp <- httr2::req_perform(req)\n  if (httr2::resp_is_error(resp)) {\n    return(NULL)\n  }\n\n  content <- httr2::resp_body_json(resp)\n  timeline <- unlist(content$timeline)\n\n  data.frame(\n    version = names(timeline),\n    date = as.Date(timeline),\n    row.names = NULL\n  )\n}\n\ntweak_news_heading <- function(html, version, timeline, bs_version) {\n  class <- if (bs_version == 3) \"page-header\" else \"pkg-version\"\n\n  h2 <- xml2::xml_find_all(html, \".//h2\")\n  xml2::xml_set_attr(h2, \"class\", class)\n  xml2::xml_set_attr(h2, \"data-toc-text\", version)\n\n  # Add release date, if known\n  if (!is.null(timeline)) {\n    date <- timeline$date[match(version, timeline$version)]\n    if (!is.na(date)) {\n      if (bs_version == 3) {\n        release_str <- paste0(\" <small>\", date, \"</small>\")\n        release_html <- xml2::xml_find_first(\n          xml2::read_html(release_str),\n          \".//small\"\n        )\n        xml2::xml_add_child(h2, release_html, .where = 1)\n      } else {\n        release_date <- sprintf(tr_(\"CRAN release: %s\"), date)\n        release_str <- paste0(\"<p class='text-muted'>\", release_date, \"</p>\")\n        release_html <- xml2::xml_find_first(\n          xml2::read_html(release_str),\n          \".//p\"\n        )\n        xml2::xml_add_sibling(h2, release_html, .where = \"after\")\n      }\n    }\n  }\n\n  tweak_news_anchor(html, version)\n\n  invisible()\n}\n\n# Manually de-duplicate repeated section anchors using version\ntweak_news_anchor <- function(html, version) {\n  div <- xml2::xml_find_all(html, \".//div\")\n  div <- div[has_class(div, \"section\")]\n\n  id <- xml2::xml_attr(div, \"id\")\n  id <- gsub(\"-[0-9]+\", \"\", id) # remove pandoc de-duplication suffixes\n  id <- paste0(id, \"-\", gsub(\"[^a-z0-9]+\", \"-\", version)) # . breaks scrollspy\n  xml2::xml_attr(div, \"id\") <- id\n\n  invisible()\n}\n\ntweak_section_levels <- function(html) {\n  sections <- xml2::xml_find_all(\n    html,\n    \".//div[contains(@class, 'section level')]|//main/section\"\n  )\n\n  # Update headings\n  xml2::xml_set_name(xml2::xml_find_all(sections, \".//h5\"), \"h6\")\n  xml2::xml_set_name(xml2::xml_find_all(sections, \".//h4\"), \"h5\")\n  xml2::xml_set_name(xml2::xml_find_all(sections, \".//h3\"), \"h4\")\n  xml2::xml_set_name(xml2::xml_find_all(sections, \".//h2\"), \"h3\")\n  xml2::xml_set_name(xml2::xml_find_all(sections, \".//h1\"), \"h2\")\n\n  # Update section\n  xml2::xml_attr(sections, \"class\") <- paste0(\n    \"section level\",\n    get_section_level(sections) + 1\n  )\n\n  invisible()\n}\n\nnews_style <- function(pkg) {\n  one_page <- config_pluck_bool(pkg, \"new.one_page\")\n  if (one_page) \"single\" else \"multi\"\n}\n"
  },
  {
    "path": "R/build-quarto-articles.R",
    "content": "build_quarto_articles <- function(pkg = \".\", article = NULL, quiet = TRUE) {\n  pkg <- as_pkgdown(pkg)\n\n  qmds <- pkg$vignettes[pkg$vignettes$type == \"qmd\", ]\n  if (!is.null(article)) {\n    qmds <- qmds[qmds$name == article, ]\n  }\n  if (nrow(qmds) == 0) {\n    return()\n  }\n  if (pkg$bs_version < 5) {\n    cli::cli_abort(\n      c(\n        \"Quarto articles require Bootstrap 5.\",\n        \"i\" = \"See details at {.url https://pkgdown.r-lib.org/articles/customise.html#getting-started}\"\n      ),\n      call = NULL\n    )\n  }\n  check_installed(\"quarto\")\n  if (quarto::quarto_version() < \"1.5\") {\n    cli::cli_abort(\n      \"Quarto articles require version 1.5 and above.\",\n      call = NULL\n    )\n  }\n  # Let user know what's happening\n  old_digest <- purrr::map_chr(path(pkg$dst_path, qmds$file_out), file_digest)\n  for (file in qmds$file_in) {\n    cli::cli_inform(\"Reading {src_path(file)}\")\n  }\n  cli::cli_inform(\"Running {.code quarto render}\")\n\n  # If needed, temporarily make a quarto project so we can build entire dir\n  if (is.null(article)) {\n    project_path <- path(pkg$src_path, \"vignettes\", \"_quarto.yaml\")\n    if (!file_exists(project_path)) {\n      yaml::write_yaml(\n        list(project = list(render = list(\"*.qmd\"))),\n        project_path\n      )\n      withr::defer(file_delete(project_path))\n    }\n  }\n\n  if (is.null(article)) {\n    src_path <- path(pkg$src_path, \"vignettes\")\n  } else {\n    src_path <- path(pkg$src_path, qmds$file_in)\n  }\n  output_dir <- quarto_render(pkg, src_path, quiet = quiet)\n\n  # check for articles (in the `vignette/articles` sense)\n  article_dir <- fs::path(output_dir, \"articles\")\n  if (fs::dir_exists(article_dir)) {\n    fs::file_move(dir_ls(article_dir), output_dir)\n  }\n\n  # Read generated data from quarto template and render into pkgdown template\n  unwrap_purrr_error(purrr::walk2(\n    qmds$file_in,\n    qmds$file_out,\n    function(input_file, output_file) {\n      built_path <- path(output_dir, path_rel(output_file, \"articles\"))\n      if (!file_exists(built_path)) {\n        cli::cli_abort(\"No built file found for {.file {input_file}}\")\n      }\n      if (path_ext(output_file) == \"html\") {\n        data <- data_quarto_article(pkg, built_path, input_file)\n        render_page(pkg, \"quarto\", data, output_file, quiet = TRUE)\n\n        update_html(path(pkg$dst_path, output_file), tweak_quarto_html)\n      } else {\n        file_copy(built_path, path(pkg$dst_path, output_file), overwrite = TRUE)\n      }\n    }\n  ))\n\n  # Report on which files have changed\n  new_digest <- purrr::map_chr(path(pkg$dst_path, qmds$file_out), file_digest)\n  changed <- new_digest != old_digest\n  for (file in qmds$file_out[changed]) {\n    writing_file(path(pkg$dst_path, file), file)\n  }\n\n  # Copy resources\n  resources <- setdiff(\n    dir_ls(output_dir, recurse = TRUE, type = \"file\"),\n    path(output_dir, path_rel(qmds$file_out, \"articles\"))\n  )\n  file_copy_to(\n    src_paths = resources,\n    dst_paths = path(pkg$dst_path, \"articles\", path_rel(resources, output_dir)),\n    src_root = output_dir,\n    dst_root = pkg$dst_path,\n    src_label = NULL\n  )\n\n  invisible()\n}\n\nquarto_render <- function(pkg, path, quiet = TRUE, frame = caller_env()) {\n  # Override default quarto format\n  metadata_path <- withr::local_tempfile(\n    fileext = \".yml\",\n    pattern = \"pkgdown-quarto-metadata-\",\n  )\n  write_yaml(quarto_format(pkg), metadata_path)\n\n  output_dir <- withr::local_tempdir(\"pkgdown-quarto-\", .local_envir = frame)\n\n  quarto::quarto_render(\n    path,\n    metadata_file = metadata_path,\n    quarto_args = c(\"--output-dir\", output_dir),\n    quiet = quiet,\n    as_job = FALSE\n  )\n\n  output_dir\n}\n\nquarto_format <- function(pkg) {\n  list(\n    lang = pkg$lang,\n    format = list(\n      html = list(\n        template = system_file(\"quarto\", \"template.html\", package = \"pkgdown\"),\n        minimal = TRUE,\n        theme = \"none\",\n        `html-math-method` = config_math_rendering(pkg),\n        `embed-resources` = FALSE,\n        `citations-hover` = TRUE,\n        `link-citations` = TRUE,\n        `section-divs` = TRUE,\n        toc = FALSE # pkgdown generates with js\n      )\n    )\n  )\n}\n\ndata_quarto_article <- function(pkg, path, input_path) {\n  html <- xml2::read_html(path, encoding = \"UTF-8\")\n  meta_div <- xml2::xml_find_first(html, \"//body/div[@class='meta']\")\n\n  # Manually drop any jquery deps\n  head <- xpath_xml(html, \"//head/script|//head/link\")\n  head <- head[!grepl(\"jquery\", xml2::xml_attr(head, \"src\"))]\n\n  list(\n    pagetitle = escape_html(xpath_text(html, \"//head/title\")),\n    toc = TRUE,\n    source = repo_source(pkg, input_path),\n    includes = list(\n      head = xml2str(head),\n      before = xpath_contents(html, \"//body/div[@class='includes-before']\"),\n      after = xpath_contents(html, \"//body/div[@class='includes-after']\"),\n      style = xpath_text(html, \"//head/style\")\n    ),\n    meta = list(\n      title = xpath_contents(meta_div, \"./h1\"),\n      subtitle = xpath_contents(meta_div, \"./p[@class='subtitle']\"),\n      author = xpath_contents(meta_div, \"./p[@class='author']\"),\n      date = xpath_contents(meta_div, \"./p[@class='date']\"),\n      abstract = xpath_contents(meta_div, \"./div[@class='abstract']\")\n    ),\n    body = xpath_contents(html, \"//main\")\n  )\n}\n\ntweak_quarto_html <- function(html) {\n  # If top-level headings use h1, move everything down one level\n  h1 <- xml2::xml_find_all(html, \"//h1\")\n  if (length(h1) > 1) {\n    tweak_section_levels(html)\n  }\n}\n"
  },
  {
    "path": "R/build-redirects.R",
    "content": "#' Build redirects\n#'\n#' @description\n#' If you change the structure of your documentation (by renaming vignettes or\n#' help topics) you can setup redirects from the old content to the new content.\n#' One or several now-absent pages can be redirected to a new page (or to a new\n#' section of a new page). This works by creating a html page that performs a\n#' \"meta refresh\", which isn't the best way of doing a redirect but works\n#' everywhere that you might deploy your site.\n#'\n#' The syntax is the following, with old paths on the left, and new paths or\n#' URLs on the right.\n#'\n#' ```yaml\n#' redirects:\n#'   - [\"articles/old-vignette-name.html\", \"articles/new-vignette-name.html\"]\n#'   - [\"articles/another-old-vignette-name.html\", \"articles/new-vignette-name.html\"]\n#'   - [\"articles/yet-another-old-vignette-name.html\", \"https://pkgdown.r-lib.org/dev\"]\n#' ```\n#'\n#' If for some reason you choose to redirect an existing page make sure to\n#' exclude it from the search index, see `?build_search`.\n#'\n#' @inheritParams as_pkgdown\n#' @export\nbuild_redirects <- function(pkg = \".\", override = list()) {\n  pkg <- section_init(pkg, override = override)\n  has_url <- !is.null(config_pluck_string(pkg, \"url\"))\n\n  redirects <- data_redirects(pkg, has_url)\n  if (length(redirects) == 0) {\n    return(invisible())\n  }\n\n  cli::cli_rule(\"Building redirects\")\n  if (!has_url) {\n    config_abort(pkg, \"{.field url} is required to generate redirects.\")\n  }\n\n  # Ensure user redirects override automatic ones\n  from <- purrr::map_chr(redirects, 1)\n  redirects <- redirects[!duplicated(from)]\n\n  purrr::iwalk(redirects, build_redirect, pkg = pkg)\n}\n\nbuild_redirect <- function(entry, index, pkg) {\n  new <- entry[2]\n  old <- path(pkg$dst_path, entry[1])\n\n  path <- find_template(\"layout\", \"redirect\", pkg = pkg)\n  template <- read_file(path)\n\n  url <- sprintf(\"%s/%s%s\", config_pluck_string(pkg, \"url\"), pkg$prefix, new)\n  lines <- whisker::whisker.render(template, list(url = url))\n  dir_create(path_dir(old))\n\n  if (!file_exists(old)) {\n    cli::cli_inform(\"Adding redirect from {entry[1]} to {entry[2]}.\")\n  }\n  write_lines(lines, old)\n}\n\ndata_redirects <- function(pkg, has_url = FALSE, call = caller_env()) {\n  c(\n    if (has_url) reference_redirects(pkg),\n    if (has_url) article_redirects(pkg),\n    config_pluck_redirects(pkg, call = call)\n  )\n}\n\nreference_redirects <- function(pkg) {\n  aliases <- unname(pkg$topics$alias)\n  aliases <- purrr::map2(aliases, pkg$topics$name, setdiff)\n  names(aliases) <- pkg$topics$file_out\n\n  redirects <- invert_index(aliases)\n  if (length(redirects) == 0) {\n    return(list())\n  }\n\n  names(redirects) <- paste0(names(redirects), \".html\")\n\n  # Ensure we don't create an invalid file name\n  redirects <- redirects[valid_filename(names(redirects))]\n\n  # Ensure we don't override an existing file\n  redirects <- redirects[setdiff(names(redirects), pkg$topics$file_out)]\n\n  unname(purrr::imap(\n    redirects,\n    function(to, from) paste0(\"reference/\", c(from, to))\n  ))\n}\n\nvalid_filename <- function(x) {\n  x == path_sanitize(x)\n}\n\narticle_redirects <- function(pkg) {\n  is_vig_in_articles <- path_has_parent(pkg$vignettes$name, \"articles\")\n  if (!any(is_vig_in_articles)) {\n    return(NULL)\n  }\n\n  articles <- pkg$vignettes$file_out[is_vig_in_articles]\n  purrr::map(articles, ~ paste0(c(\"articles/\", \"\"), .x))\n}\n\nconfig_pluck_redirects <- function(pkg, call = caller_env()) {\n  redirects <- config_pluck_list(pkg, \"redirects\", call = call)\n  for (i in seq_along(redirects)) {\n    redirect <- redirects[[i]]\n    if (!is.character(redirect) || length(redirect) != 2) {\n      not <- obj_type_friendly(redirect)\n      config_abort(\n        pkg,\n        \"{.field redirects[{i}]} must be a character vector of length 2, not {not}.\",\n        call = call\n      )\n    }\n  }\n  redirects\n}\n"
  },
  {
    "path": "R/build-reference-index.R",
    "content": "data_reference_index <- function(pkg = \".\", error_call = caller_env()) {\n  pkg <- as_pkgdown(pkg)\n\n  meta <- config_pluck_reference(pkg, error_call)\n  if (length(meta) == 0) {\n    return(list())\n  }\n\n  rows <- unwrap_purrr_error(purrr::imap(\n    meta,\n    data_reference_index_rows,\n    pkg = pkg,\n    call = error_call\n  ))\n  rows <- purrr::list_c(rows)\n\n  has_icons <- purrr::some(rows, ~ .x$row_has_icons %||% FALSE)\n\n  check_missing_topics(rows, pkg, error_call = error_call)\n  rows <- Filter(function(x) !x$is_internal, rows)\n\n  print_yaml(list(\n    pagetitle = tr_(\"Package index\"),\n    rows = rows,\n    has_icons = has_icons\n  ))\n}\n\nconfig_pluck_reference <- function(pkg, call = caller_env()) {\n  ref <- config_pluck_list(\n    pkg,\n    \"reference\",\n    default = default_reference_index(pkg)\n  )\n\n  for (i in seq_along(ref)) {\n    section <- ref[[i]]\n    config_check_list(\n      section,\n      error_path = paste0(\"reference[\", i, \"]\"),\n      error_pkg = pkg,\n      error_call = call\n    )\n    config_check_string(\n      section$title,\n      error_path = paste0(\"reference[\", i, \"].title\"),\n      error_pkg = pkg,\n      error_call = call\n    )\n    config_check_string(\n      section$subtitle,\n      error_path = paste0(\"reference[\", i, \"].subtitle\"),\n      error_pkg = pkg,\n      error_call = call\n    )\n    if (has_name(section, \"contents\")) {\n      check_contents(\n        section$contents,\n        i,\n        pkg,\n        prefix = \"reference\",\n        call = call\n      )\n    }\n  }\n\n  ref\n}\n\ncheck_contents <- function(contents, index, pkg, prefix, call = caller_env()) {\n  if (length(contents) == 0) {\n    config_abort(\n      pkg,\n      \"{.field {prefix}[{index}].contents} is empty.\",\n      call = call\n    )\n  }\n\n  is_null <- purrr::map_lgl(contents, is.null)\n  if (any(is_null)) {\n    j <- which(is_null)[1]\n    config_abort(\n      pkg,\n      \"{.field {prefix}[{index}].contents[{j}]} is empty.\",\n      call = call\n    )\n  }\n\n  is_char <- purrr::map_lgl(contents, is.character)\n  if (!all(is_char)) {\n    j <- which(!is_char)[1]\n    config_abort(\n      pkg,\n      c(\n        \"{.field {prefix}[{index}].contents[{j}]} must be a string.\",\n        i = \"You might need to add '' around special YAML values like 'N' or 'off'\"\n      ),\n      call = call\n    )\n  }\n}\n\n\ndata_reference_index_rows <- function(\n  section,\n  index,\n  pkg,\n  call = caller_env()\n) {\n  is_internal <- identical(section$title, \"internal\")\n\n  rows <- list()\n  if (has_name(section, \"title\")) {\n    rows[[1]] <- list(\n      title = markdown_text_inline(\n        pkg,\n        section$title,\n        error_path = paste0(\"reference[\", index, \"].title\"),\n        error_call = call\n      ),\n      slug = make_slug(section$title),\n      desc = markdown_text_block(pkg, section$desc),\n      is_internal = is_internal\n    )\n  }\n\n  if (has_name(section, \"subtitle\")) {\n    rows[[2]] <- list(\n      subtitle = markdown_text_inline(\n        pkg,\n        section$subtitle,\n        error_path = paste0(\"reference[\", index, \"].subtitle\"),\n        error_call = call\n      ),\n      slug = make_slug(section$subtitle),\n      desc = markdown_text_block(pkg, section$desc),\n      is_internal = is_internal\n    )\n  }\n\n  if (has_name(section, \"contents\")) {\n    topics <- section_topics(\n      pkg,\n      section$contents,\n      error_path = paste0(\"reference[\", index, \"].contents\"),\n      error_call = call\n    )\n\n    names <- topics$name\n    topics$name <- NULL\n\n    rows[[3]] <- list(\n      topics = purrr::transpose(topics),\n      names = names,\n      row_has_icons = !purrr::every(topics$icon, is.null),\n      is_internal = is_internal\n    )\n  }\n\n  purrr::compact(rows)\n}\n\nfind_icons <- function(x, path) {\n  purrr::map(x, find_icon, path = path)\n}\nfind_icon <- function(aliases, path) {\n  names <- paste0(aliases, \".png\")\n  exists <- file_exists(path(path, names))\n\n  if (!any(exists)) {\n    NULL\n  } else {\n    names[which(exists)[1]]\n  }\n}\n\ndefault_reference_index <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  exported <- pkg$topics[!pkg$topics$internal, , drop = FALSE]\n  if (nrow(exported) == 0) {\n    return(list())\n  }\n\n  print_yaml(list(\n    list(\n      title = tr_(\"All functions\"),\n      contents = auto_quote(unname(exported$name))\n    )\n  ))\n}\n\ncheck_missing_topics <- function(rows, pkg, error_call = caller_env()) {\n  # Cross-reference complete list of topics vs. topics found in index page\n  all_topics <- purrr::list_c(purrr::map(rows, \"names\"))\n  in_index <- pkg$topics$name %in% all_topics\n\n  missing <- !in_index & !pkg$topics$internal\n\n  if (any(missing)) {\n    config_abort(\n      pkg,\n      c(\n        \"{sum(missing)} topic{?s} missing from index: {.val {pkg$topics$name[missing]}}.\",\n        i = paste(\n          \"Either add to the reference index,\",\n          \"or use {.code @keywords internal} to drop from the index.\"\n        )\n      ),\n      call = error_call\n    )\n  }\n}\n"
  },
  {
    "path": "R/build-reference.R",
    "content": "#' Build reference section\n#'\n#' By default, pkgdown will generate an index that lists all functions in\n#' alphabetical order. To override this, provide a `reference` section in your\n#' `_pkgdown.yml` as described below.\n#'\n#' # Reference index\n#' To tweak the index page, add a section called `reference` to `_pkgdown.yml`.\n#' It can contain three different types of element:\n#'\n#' * A **title** (`title` + `desc`), which generates an row containing an `<h2>`\n#'   with optional paragraph description.\n#' * A **subtitle** (`subtitle` + `desc`), which generates an row containing an\n#'   `<h3>` with optional paragraph description.\n#' * A **list of topics** (`contents`), which generates one row for each topic,\n#'   with a list of aliases for the topic on the left, and the topic title\n#'   on the right.\n#'\n#' (For historical reasons you can include `contents` with a title or\n#' subtitle, but this is no longer recommended).\n#'\n#' Most packages will only need to use `title` and `contents` components.\n#' For example, here's a snippet from the YAML that pkgdown uses to generate\n#' its own reference index:\n#'\n#' ```yaml\n#' reference:\n#' - title: Build\n#'   desc:  Build a complete site or its individual section components.\n#' - contents:\n#'   - starts_with(\"build_\")\n#' - title: Templates\n#' - contents:\n#'   - template_navbar\n#'   - render_page\n#' ```\n#'\n#' Bigger packages, e.g. ggplot2, may need an additional layer of\n#' structure in order to clearly organise large number of functions:\n#'\n#' ```yaml\n#' reference:\n#' - title: Layers\n#' - subtitle: Geoms\n#'   desc: Geom is short for geometric element\n#' - contents:\n#'   - starts_with(\"geom\")\n#' - subtitle: Stats\n#'   desc: Statistical transformations transform data before display.\n#'   contents:\n#'   - starts_with(\"stat\")\n#' ```\n#'\n#' `desc` can use markdown, and if you have a long description it's a good\n#' idea to take advantage of the YAML `>` notation:\n#'\n#' ```yaml\n#' desc: >\n#'   This is a very _long_ and **overly** flowery description of a\n#'   single simple function. By using `>`, it's easy to write a description\n#'   that runs over multiple lines.\n#' ```\n#'\n#' ## Topic matching\n#' `contents` can contain:\n#'\n#' * Individual function/topic names.\n#' * Weirdly named functions with doubled quoting, once for YAML and once for\n#'   R, e.g. `` \"`+.gg`\" ``.\n#' * `starts_with(\"prefix\")` to select all functions with common prefix.\n#' * `ends_with(\"suffix\")` to select all functions with common suffix.\n#' * `matches(\"regexp\")` for more complex regular expressions.\n#' * `has_keyword(\"x\")` to select all topics with keyword \"x\";\n#'   `has_keyword(\"datasets\")` selects all data documentation.\n#' * `has_concept(\"blah\")` to select all topics with concept \"blah\".\n#'   If you are using roxygen2, `has_concept()` also matches family tags, because\n#'   roxygen2 converts them to concept tags.\n#' * `lacks_concepts(c(\"concept1\", \"concept2\"))` to select all topics\n#'    without those concepts. This is useful to capture topics not otherwise\n#'    captured by `has_concepts()`.\n#' * Topics from other installed packages, e.g. `rlang::is_installed()` (function name)\n#'  or `sass::font_face` (topic name).\n#' * `has_lifecycle(\"deprecated\")` will select all topics with lifecycle\n#'   deprecated.\n#'\n#' All functions (except for `has_keyword()`) automatically exclude internal\n#' topics (i.e. those with `\\keyword{internal}`). You can choose to include\n#' with (e.g.) `starts_with(\"build_\", internal = TRUE)`.\n#'\n#' Use a leading `-` to remove topics from a section, e.g. `-topic_name`,\n#' `-starts_with(\"foo\")`.\n#'\n#' pkgdown will check that all non-internal topics are included on\n#' the reference index page, and error if you have missed any.\n#'\n#' ## Missing topics\n#'\n#' pkgdown will warn if there are (non-internal) topics that not listed\n#' in the reference index. You can suppress these warnings by listing the\n#' topics in section with \"title: internal\" (case sensitive) which will not be\n#' displayed on the reference index.\n#'\n#' ## Icons\n#' You can optionally supply an icon for each help topic. To do so, you'll need\n#' a top-level `icons` directory. This should contain `.png` files that are\n#' either 30x30 (for regular display) or 60x60 (if you want retina display).\n#' Icons are matched to topics by aliases.\n#'\n#' # Examples\n#'\n#' If you need to run extra code before or after all examples are run, you\n#' can create `pkgdown/pre-reference.R` and `pkgdown/post-reference.R`.\n#'\n#' # Figures\n#'\n#' You can control the default rendering of figures by specifying the `figures`\n#' field in `_pkgdown.yml`. The default settings are equivalent to:\n#'\n#' ```yaml\n#' figures:\n#'   dev: ragg::agg_png\n#'   dpi: 96\n#'   dev.args: []\n#'   fig.ext: png\n#'   fig.width: 7.2916667\n#'   fig.height: ~\n#'   fig.retina: 2\n#'   fig.asp: 1.618\n#'   bg: NA\n#'   other.parameters: []\n#' ```\n#'\n#' Most of these parameters are interpreted similarly to knitr chunk\n#' options. `other.parameters` is a list of parameters\n#' that will be available to custom graphics output devices such\n#' as HTML widgets.\n#'\n#' @inheritParams build_articles\n#' @family site components\n#' @param lazy If `TRUE`, only rebuild pages where the `.Rd`\n#'   is more recent than the `.html`. This makes it much easier to\n#'   rapidly prototype. It is set to `FALSE` by [build_site()].\n#' @param run_dont_run Run examples that are surrounded in \\\\dontrun?\n#' @param examples Run examples?\n#' @param devel Determines how code is loaded in order to run examples.\n#'   If `TRUE` (the default), assumes you are in a live development\n#'   environment, and loads source package with [pkgload::load_all()].\n#'   If `FALSE`, uses the installed version of the package.\n#' @param topics Build only specified topics. If supplied, sets `lazy`\n#'   and `preview` to `FALSE`.\n#' @export\nbuild_reference <- function(\n  pkg = \".\",\n  lazy = TRUE,\n  examples = TRUE,\n  run_dont_run = FALSE,\n  seed = 1014L,\n  override = list(),\n  preview = FALSE,\n  devel = TRUE,\n  topics = NULL\n) {\n  pkg <- section_init(pkg, \"reference\", override = override)\n  check_bool(lazy)\n  check_bool(examples)\n  check_bool(run_dont_run)\n  check_number_whole(seed, allow_null = TRUE)\n  check_bool(devel)\n  check_character(topics, allow_null = TRUE)\n\n  cli::cli_rule(\"Building function reference\")\n  build_reference_index(pkg)\n\n  copy_figures(pkg)\n\n  if (examples) {\n    examples_env <- examples_env(pkg, seed = seed, devel = devel)\n  } else {\n    examples_env <- NULL\n  }\n\n  if (!is.null(topics)) {\n    topics <- purrr::transpose(pkg$topics[pkg$topics$name %in% topics, ])\n    lazy <- FALSE\n    preview <- FALSE\n  } else {\n    topics <- purrr::transpose(pkg$topics)\n  }\n\n  unwrap_purrr_error(purrr::map(\n    topics,\n    build_reference_topic,\n    pkg = pkg,\n    lazy = lazy,\n    examples_env = examples_env,\n    run_dont_run = run_dont_run\n  ))\n\n  preview_site(pkg, \"reference\", preview = preview)\n}\n\ncopy_figures <- function(pkg) {\n  # copy everything from man/figures to docs/reference/figures\n  dir_copy_to(\n    src_dir = path(pkg$src_path, \"man\", \"figures\"),\n    src_root = pkg$src_path,\n    dst_dir = path(pkg$dst_path, \"reference\", \"figures\"),\n    dst_root = pkg$dst_path\n  )\n}\n\nexamples_env <- function(\n  pkg,\n  seed = 1014L,\n  devel = TRUE,\n  envir = parent.frame()\n) {\n  # Re-loading pkgdown while it's running causes weird behaviour with\n  # the context cache\n  if (isTRUE(devel) && !(pkg$package %in% c(\"pkgdown\", \"rprojroot\"))) {\n    check_installed(\"pkgload\", \"to use `build_reference(devel = TRUE)`\")\n    pkgload::load_all(\n      pkg$src_path,\n      export_all = FALSE,\n      helpers = FALSE,\n      quiet = TRUE\n    )\n  } else {\n    library(pkg$package, character.only = TRUE)\n  }\n\n  # Need to compute before changing working directory\n  pre_path <- path_abs(path(pkg$src_path, \"pkgdown\", \"pre-reference.R\"))\n  post_path <- path_abs(path(pkg$src_path, \"pkgdown\", \"post-reference.R\"))\n\n  withr::local_dir(path(pkg$dst_path, \"reference\"), .local_envir = envir)\n  width <- config_pluck_number_whole(pkg, \"code.width\", default = 80)\n  withr::local_options(width = width, .local_envir = envir)\n  withr::local_seed(seed, .local_envir = envir)\n  if (requireNamespace(\"htmlwidgets\", quietly = TRUE)) {\n    htmlwidgets::setWidgetIdSeed(seed)\n  }\n\n  examples_env <- child_env(globalenv())\n  if (file_exists(pre_path)) {\n    sys.source(pre_path, envir = examples_env)\n  }\n  if (file_exists(post_path)) {\n    withr::defer(sys.source(post_path, envir = examples_env), envir = envir)\n  }\n\n  examples_env\n}\n\n#' @export\n#' @rdname build_reference\nbuild_reference_index <- function(pkg = \".\", override = list()) {\n  pkg <- section_init(pkg, \"reference\", override = override)\n\n  # Copy icons, if needed\n  dir_copy_to(\n    src_dir = path(pkg$src_path, \"icons\"),\n    src_root = pkg$src_path,\n    dst_dir = path(pkg$dst_path, \"reference\", \"icons\"),\n    dst_root = pkg$dst_path\n  )\n\n  render_page(\n    pkg,\n    \"reference-index\",\n    data = data_reference_index(pkg),\n    path = \"reference/index.html\"\n  )\n\n  invisible()\n}\n\n\nbuild_reference_topic <- function(\n  topic,\n  pkg,\n  lazy = TRUE,\n  examples_env = globalenv(),\n  run_dont_run = FALSE\n) {\n  in_path <- path(pkg$src_path, \"man\", topic$file_in)\n  out_path <- path(pkg$dst_path, \"reference\", topic$file_out)\n\n  if (lazy && !out_of_date(in_path, out_path)) {\n    return(invisible())\n  }\n\n  cli::cli_inform(\"Reading {src_path(path('man', topic$file_in))}\")\n\n  data <- withCallingHandlers(\n    data_reference_topic(\n      topic,\n      pkg,\n      examples_env = examples_env,\n      run_dont_run = run_dont_run\n    ),\n    error = function(err) {\n      cli::cli_abort(\n        \"Failed to parse Rd in {.file {topic$file_in}}\",\n        parent = err,\n        call = quote(build_reference())\n      )\n    }\n  )\n\n  deps <- data$dependencies\n  data$has_deps <- !is.null(deps)\n  if (data$has_deps) {\n    deps <- bs_theme_deps_suppress(deps)\n    deps <- htmltools::resolveDependencies(deps)\n    deps <- purrr::map(\n      deps,\n      htmltools::copyDependencyToDir,\n      outputDir = path(pkg$dst_path, \"reference\", \"libs\"),\n      mustWork = FALSE\n    )\n    deps <- purrr::map(\n      deps,\n      htmltools::makeDependencyRelative,\n      basepath = path(pkg$dst_path, \"reference\"),\n      mustWork = FALSE\n    )\n    data$dependencies <- htmltools::renderDependencies(deps, c(\"file\", \"href\"))\n  }\n\n  render_page(\n    pkg,\n    \"reference-topic\",\n    data = data,\n    path = path(\"reference\", topic$file_out)\n  )\n\n  invisible()\n}\n\n\n# Convert Rd to list ------------------------------------------------------\n\ndata_reference_topic <- function(\n  topic,\n  pkg,\n  examples_env = globalenv(),\n  run_dont_run = FALSE\n) {\n  local_context_eval(pkg$figures, pkg$src_path)\n  withr::local_options(list(downlit.rdname = get_rdname(topic)))\n\n  tag_names <- purrr::map_chr(topic$rd, ~ class(.)[[1]])\n  tags <- split(topic$rd, tag_names)\n\n  out <- list()\n\n  # Single top-level converted to string\n  out$name <- flatten_text(tags$tag_name[[1]][[1]])\n  out$title <- extract_title(tags$tag_title)\n  out$pagetitle <- paste0(strip_html_tags(out$title), \" \\u2014 \", out$name)\n\n  # File source\n  out$source <- repo_source(pkg, topic$source)\n  out$filename <- topic$file_in\n\n  # Multiple top-level converted to string\n  out$author <- purrr::map_chr(tags$tag_author %||% list(), flatten_para)\n  out$aliases <- purrr::map_chr(tags$tag_alias %||% list(), flatten_text)\n  out$keywords <- purrr::map_chr(tags$tag_keyword %||% list(), flatten_text)\n\n  # Sections that contain arbitrary text and need cross-referencing\n  out$description <- as_data(tags$tag_description[[1]])\n  out$opengraph <- list(description = strip_html_tags(out$description$contents))\n  if (length(tags$tag_usage[[1]])) {\n    out$usage <- list(\n      title = tr_(\"Usage\"),\n      contents = as_data(tags$tag_usage[[1]])\n    )\n  }\n\n  if (!is.null(tags$tag_examples)) {\n    out$examples <- run_examples(\n      tags$tag_examples[[1]],\n      env = if (is.null(examples_env)) NULL else new.env(parent = examples_env),\n      topic = tools::file_path_sans_ext(topic$file_in),\n      run_dont_run = run_dont_run\n    )\n    deps <- attr(out$examples, \"dependencies\")\n    if (!is.null(deps)) {\n      attr(out$examples, \"dependencies\") <- NULL\n      out$dependencies <- deps\n    }\n  }\n\n  # Everything else stays in original order, and becomes a list of sections.\n  section_tags <- paste0(\n    \"tag_\",\n    c(\n      \"arguments\",\n      \"value\",\n      \"details\",\n      \"references\",\n      \"source\",\n      \"format\",\n      \"note\",\n      \"seealso\",\n      \"section\",\n      \"author\"\n    )\n  )\n  sections <- topic$rd[tag_names %in% section_tags]\n  out$sections <- purrr::map(sections, function(section) {\n    data <- as_data(section)\n    data$slug <- make_slug(data$title)\n    data\n  })\n  out\n}\n\nmake_slug <- function(x) {\n  x <- strip_html_tags(x)\n  x <- tolower(x)\n  x <- gsub(\"[^a-z]+\", \"-\", x)\n  x\n}\n\nget_rdname <- function(topics) {\n  gsub(\"\\\\.[Rr]d$\", \"\", topics$file_in)\n}\n"
  },
  {
    "path": "R/build-search-docs.R",
    "content": "build_docsearch_json <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  index_name <- config_pluck_string(pkg, \"template.params.docsearch.index_name\")\n  if (is.null(index_name)) {\n    return()\n  }\n\n  data <- list(\n    index = index_name,\n    package = pkg$package,\n    url = config_pluck_string(pkg, \"url\")\n  )\n\n  template <- find_template(\"config\", \"docsearch\", ext = \".json\", pkg = pkg)\n\n  json <- render_template(template, data)\n\n  json_path <- path(pkg$dst_path, \"docsearch.json\")\n\n  write_if_different(pkg, json, json_path, check = FALSE)\n}\n\nbuild_sitemap <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  url <- paste0(config_pluck_string(pkg, \"url\"), \"/\")\n  if (is.null(url)) {\n    return()\n  }\n\n  cli::cli_rule(\"Building sitemap\")\n  if (pkg$development$in_dev && pkg$bs_version > 3) {\n    url <- paste0(url, pkg$prefix)\n  }\n\n  urls <- paste0(url, get_site_paths(pkg))\n  doc <- paste0(\n    \"<urlset xmlns = 'http://www.sitemaps.org/schemas/sitemap/0.9'>\\n\",\n    paste0(\"<url><loc>\", escape_html(urls), \"</loc></url>\\n\", collapse = \"\"),\n    \"</urlset>\\n\"\n  )\n\n  write_if_different(pkg, doc, \"sitemap.xml\", check = FALSE)\n  invisible()\n}\n\n#' Build search index\n#'\n#' @description\n#' Generate a JSON search index from the built site. This is used by\n#' [fuse.js](https://www.fusejs.io/) to provide a javascript powered search for\n#' BS5 powered pkgdown sites.\n#'\n#' NB: `build_search()` is called automatically by [build_site()]; you don't\n#' need call it yourself. This page documents how it works and its customisation\n#' options.\n#'\n#' # YAML config\n#' You can exclude some paths from the search index using `search.exclude`.\n#' Below we exclude the changelog from the search index:\n#'\n#' ```yaml\n#' search:\n#'   exclude: ['news/index.html']\n#' ```\n#' # Debugging\n#'\n#' If search is not working, run `pkgdown::pkgdown_sitrep()` to eliminate\n#' common issues such as the absence of URL in the pkgdown configuration file\n#' of your package.\n#'\n#' @inheritParams build_articles\n#' @export\n#'\nbuild_search <- function(pkg = \".\", override = list()) {\n  pkg <- section_init(pkg, override = override)\n  cli::cli_rule(\"Building search index\")\n\n  search_index <- build_search_index(pkg)\n  jsonlite::write_json(\n    search_index,\n    path(pkg$dst_path, \"search.json\"),\n    auto_unbox = TRUE\n  )\n}\n\nbuild_search_index <- function(pkg) {\n  paths <- get_site_paths(pkg)\n  paths <- paths[\n    !paths %in% c(\"404.html\", \"articles/index.html\", \"reference/index.html\")\n  ]\n\n  # user-defined exclusions\n  paths <- paths[!paths %in% config_pluck_character(pkg, \"search.exclude\")]\n\n  if (\"news/index.html\" %in% paths) {\n    index <- lapply(\n      paths[paths != \"news/index.html\"],\n      file_search_index,\n      pkg = pkg\n    )\n    index <- unlist(index, recursive = FALSE)\n    index <- c(index, news_search_index(\"news/index.html\", pkg = pkg))\n  } else {\n    index <- lapply(paths, file_search_index, pkg = pkg)\n    index <- unlist(index, recursive = FALSE)\n  }\n\n  # Make URLs absolute if possible\n  url <- config_pluck_string(pkg, \"url\", default = \"\")\n  fix_path <- function(x) {\n    x$path <- sprintf(\"%s%s\", url, x$path)\n    x\n  }\n  purrr::map(index, fix_path)\n}\n\nnews_search_index <- function(path, pkg) {\n  html <- xml2::read_html(path(pkg$dst_path, path), encoding = \"UTF-8\")\n\n  # Get contents minus logo\n  node <- xml2::xml_find_all(html, \".//main\")\n  xml2::xml_remove(xml2::xml_find_first(\n    node,\n    \".//img[contains(@class, 'pkg-logo')]\"\n  ))\n  sections <- xml2::xml_find_all(node, \".//*[contains(@class, 'section')]\")\n\n  purrr::pmap(\n    list(\n      sections,\n      purrr::map_chr(sections, get_headings, depth = 4),\n      title = purrr::map_chr(sections, get_version)\n    ),\n    bs4_index_data,\n    dir = \"Changelog\",\n    path = paste0(\"/\", pkg$prefix, path)\n  )\n}\n\nfile_search_index <- function(path, pkg) {\n  html <- xml2::read_html(path(pkg$dst_path, path), encoding = \"UTF-8\")\n  # Get page title\n  title_element <- xml2::xml_find_first(html, \".//meta[@property='og:title']\")\n  title <- xml2::xml_attr(title_element, \"content\")\n\n  # Get contents minus logo\n  node <- xml2::xml_find_all(html, \".//main\")\n  xml2::xml_remove(xml2::xml_find_first(\n    node,\n    \".//img[contains(@class, 'pkg-logo')]\"\n  ))\n  sections <- xml2::xml_find_all(\n    node,\n    \".//div[contains(@class, 'section')]|.//section\"\n  )\n\n  purrr::pmap(\n    list(\n      sections,\n      purrr::map_chr(sections, get_headings, depth = 3),\n      title = title\n    ),\n    bs4_index_data,\n    dir = get_dir(path),\n    path = paste0(\"/\", pkg$prefix, path)\n  )\n}\n# Directory parts (where in the site)\nget_dir <- function(path) {\n  dir <- path_dir(path)\n  if (dir == \".\") {\n    return(\"\")\n  }\n  paste(capitalise(unlist(path_split(dir))), collapse = \" > \")\n}\n# Headings (where in the page)\nget_headings <- function(section, depth) {\n  level <- get_section_level(section)\n  if (level < depth) {\n    return(\"\")\n  }\n\n  headings <- purrr::map_chr(\n    seq(depth - 1, level - 1),\n    get_h,\n    section = section\n  )\n  paste0(headings[headings != \"\"], collapse = \" > \")\n}\n# Function for extracting all headers\nget_h <- function(level, section) {\n  parents <- xml2::xml_parents(section)\n  if (length(parents) == 0) {\n    return(\"\")\n  }\n  parents <- parents[!is.na(xml2::xml_attr(parents, \"class\"))]\n  h_section <- parents[grepl(\n    paste0(\"section level\", level),\n    xml2::xml_attr(parents, \"class\")\n  )]\n  h <- xml2::xml_contents(h_section)[is_heading(xml2::xml_contents(h_section))]\n  sub(\"^\\\\n\", \"\", xml_text1(h))\n}\nget_version <- function(section) {\n  parents <- xml2::xml_parents(section)\n  parents <- parents[!is.na(xml2::xml_attr(parents, \"class\"))]\n  h_section <- parents[grepl(\n    \"section level2\",\n    xml2::xml_attr(parents, \"class\")\n  )]\n  if (length(h_section) == 0) {\n    h <- xml2::xml_contents(section)[is_heading(xml2::xml_contents(section))]\n  } else {\n    h <- xml2::xml_contents(h_section)[is_heading(xml2::xml_contents(\n      h_section\n    ))]\n  }\n\n  sub(\"^\\\\n\", \"\", xml_text1(h))\n}\n# edited from https://github.com/rstudio/bookdown/blob/abd461593033294d82427139040a0a03cfa0390a/R/bs4_book.R#L518\n# index -------------------------------------------------------------------\n\nbs4_index_data <- function(node, previous_headings, title, dir, path) {\n  # Make a copy of the node because we will remove contents from it for getting the data\n  node_copy <- node\n  # remove sections nested inside the current section to prevent duplicating content\n  xml2::xml_remove(xml2::xml_find_all(\n    node_copy,\n    \".//*[contains(@class, 'section')]\"\n  ))\n  # remove dont-index sections\n  xml2::xml_remove(xml2::xml_find_all(\n    node_copy,\n    \".//*[contains(@class, 'dont-index')]\"\n  ))\n\n  # Helpers for XPath queries\n  # We want to find all nodes corresponding to ... but whose descendants\n  # do not correspond to any ... otherwise we would treat some text/code twice,\n  # e.g. the text of p nested within li.\n  all <- function(...) {\n    not <- sprintf(\n      \"[not(%s)]\",\n      paste0(paste0(\"descendant::\", c(...)), collapse = \"|\")\n    )\n    paste0(\".//\", c(...), not, collapse = \"|\")\n  }\n  text_xpath <- all(\n    \"p\",\n    \"li\",\n    \"caption\",\n    \"figcaption\",\n    \"dt\",\n    \"dd\",\n    \"blockquote\",\n    \"div[contains(@class, 'line-block')]\"\n  )\n  code_xpath <- all(\"pre\")\n  code <- xml2::xml_find_all(node_copy, code_xpath)\n\n  # Special case for definitions (mostly encountered in Rd files)\n  if (xml2::xml_name(node_copy) == \"dt\") {\n    # both argument name and definition\n    text <- paste(\n      xml_text1(node_copy),\n      xml_text1(xml2::xml_find_first(node_copy, \"following-sibling::*\")),\n      collapse = \" \"\n    )\n    heading <- paste(xml_text1(node_copy), \"(argument)\")\n  } else {\n    # Other cases\n    text <- xml_text1(xml2::xml_find_all(node_copy, text_xpath))\n    children <- xml2::xml_children(node_copy)\n    heading_node <- children[purrr::map_lgl(children, is_heading)][1]\n    heading <- xml_text1(heading_node)\n\n    # Add heading for Usage section of Rd\n    if (xml2::xml_attr(node_copy, \"id\", default = \"\") == \"ref-usage\") {\n      heading <- \"Usage\"\n    }\n  }\n\n  # If no specific heading, use the title\n  if (nchar(heading) == 0) {\n    heading <- title\n    previous_headings <- \"\"\n  }\n\n  index_data <- list(\n    path = path,\n    id = section_id(node_copy),\n    dir = dir,\n    previous_headings = previous_headings,\n    what = heading,\n    title = title,\n    text = strip_stop_words(text),\n    code = xml_text1(code)\n  )\n\n  if (index_data$text == \"\" && index_data$code == \"\") {\n    return(NULL)\n  }\n\n  index_data\n}\n\nxml_text1 <- function(x) {\n  trimws(\n    gsub(\"(\\r\\n|\\r|\\n)\", \" \", paste0(trimws(xml2::xml_text(x)), collapse = \" \"))\n  )\n}\n\nstrip_stop_words <- function(x) {\n  # paste(tidytext::get_stopwords()$word, collapse = \"|\")\n  pattern <- \"\\\\b(i|me|my|myself|we|our|ours|ourselves|you|your|yours|yourself|yourselves|he|him|his|himself|she|her|hers|herself|it|its|itself|they|them|their|theirs|themselves|what|which|who|whom|this|that|these|those|am|is|are|was|were|be|been|being|have|has|had|having|do|does|did|doing|would|should|could|ought|i'm|you're|he's|she's|it's|we're|they're|i've|you've|we've|they've|i'd|you'd|he'd|she'd|we'd|they'd|i'll|you'll|he'll|she'll|we'll|they'll|isn't|aren't|wasn't|weren't|hasn't|haven't|hadn't|doesn't|don't|didn't|won't|wouldn't|shan't|shouldn't|can't|cannot|couldn't|mustn't|let's|that's|who's|what's|here's|there's|when's|where's|why's|how's|a|an|the|and|but|if|or|because|as|until|while|of|at|by|for|with|about|against|between|into|through|during|before|after|above|below|to|from|up|down|in|out|on|off|over|under|again|further|then|once|here|there|when|where|why|how|all|any|both|each|few|more|most|other|some|such|no|nor|not|only|own|same|so|than|too|very|will)\\\\b ?\"\n  gsub(pattern, \"\", x, ignore.case = TRUE)\n}\n\nis_heading <- function(node) {\n  xml2::xml_name(node) %in% c(\"h1\", \"h2\", \"h3\", \"h4\", \"h5\")\n}\n\ncapitalise <- function(string) {\n  paste0(toupper(substring(string, 1, 1)), substring(string, 2))\n}\n\nget_site_paths <- function(pkg) {\n  paths <- dir_ls(pkg$dst_path, glob = \"*.html\", recurse = TRUE)\n  paths_rel <- path_rel(paths, pkg$dst_path)\n\n  # do not include dev package website in search index / sitemap\n  paths_rel <- paths_rel[\n    !path_has_parent(paths_rel, pkg$development$destination)\n  ]\n\n  # do not include redirects\n  redirects <- purrr::map_chr(data_redirects(pkg, has_url = TRUE), 1)\n  setdiff(paths_rel, redirects)\n}\n"
  },
  {
    "path": "R/build-tutorials.R",
    "content": "#' Build tutorials section\n#'\n#' learnr tutorials must be hosted elsewhere as they require an\n#' R execution engine. Currently, pkgdown will not build or publish tutorials\n#' for you, but makes it easy to embed (using `<iframe>`s) published tutorials.\n#' Tutorials are automatically discovered from published tutorials in\n#' `inst/tutorials` and `vignettes/tutorials`. Alternatively, you can\n#' list in `_pkgdown.yml` as described below.\n#'\n#' # YAML config\n#' To override the default discovery process, you can provide a `tutorials`\n#' section. This should be a list where each element specifies:\n#'\n#' * `name`: used for the generated file name\n#' * `title`: used in page heading and in navbar\n#' * `url`: which will be embedded in an iframe\n#' * `source`: optional, but if present will be linked to\n#'\n#' ```yaml\n#' tutorials:\n#' - name: 00-setup\n#'   title: Setting up R\n#'   url: https://jjallaire.shinyapps.io/learnr-tutorial-00-setup/\n#' - name: 01-data-basics\n#'   title: Data basics\n#'   url: https://jjallaire.shinyapps.io/learnr-tutorial-01-data-basics/\n#' ```\n#' @inheritParams build_articles\n#' @family site components\n#' @export\nbuild_tutorials <- function(pkg = \".\", override = list(), preview = FALSE) {\n  pkg <- section_init(pkg, \"tutorials\", override = override)\n\n  tutorials <- pkg$tutorials\n\n  if (nrow(tutorials) == 0) {\n    return(invisible())\n  }\n\n  cli::cli_rule(\"Building tutorials\")\n\n  data <- purrr::transpose(tutorials)\n\n  # Build index\n  render_page(\n    pkg,\n    \"tutorial-index\",\n    data = list(\n      pagetitle = tr_(\"Tutorials\"),\n      tutorials = purrr::transpose(list(\n        path = path_rel(tutorials$file_out, \"tutorials\"),\n        title = tutorials$title\n      ))\n    ),\n    path = \"tutorials/index.html\"\n  )\n\n  purrr::pwalk(\n    list(data = data, path = tutorials$file_out),\n    render_page,\n    pkg = pkg,\n    name = \"tutorial\"\n  )\n\n  preview_site(pkg, \"tutorials\", preview = preview)\n}\n\npackage_tutorials <- function(path = \".\", meta = list()) {\n  # Look first in meta data\n  tutorials <- purrr::pluck(meta, \"tutorials\")\n\n  # Then scan tutorials directories\n  if (length(tutorials) == 0) {\n    tutorials <- c(\n      find_tutorials(path(path, \"inst\", \"tutorials\")),\n      find_tutorials(path(path, \"vignettes\", \"tutorials\"))\n    )\n  }\n\n  name <- purrr::map_chr(tutorials, \"name\")\n  title <- purrr::map_chr(tutorials, \"title\")\n\n  tibble::tibble(\n    name = name,\n    file_out = as.character(path(\"tutorials\", name, ext = \"html\")),\n    title = title,\n    pagetitle = title,\n    url = purrr::map_chr(tutorials, \"url\")\n  )\n}\n\nfind_tutorials <- function(path = \".\") {\n  if (!dir_exists(path)) {\n    return(character())\n  }\n\n  check_installed(\"rsconnect\", \"to find published tutorials\")\n\n  rmds <- unname(dir_ls(\n    path,\n    recurse = TRUE,\n    regexp = \"\\\\.[Rrq]md$\",\n    type = \"file\"\n  ))\n  info <- purrr::map(rmds, tutorial_info, base_path = path)\n  purrr::compact(info)\n}\n\ntutorial_info <- function(path, base_path) {\n  yaml <- rmarkdown::yaml_front_matter(path)\n  title <- yaml$title\n  if (is.null(title)) {\n    return()\n  }\n\n  # Must have \"runtime: shiny\". Partial implementation of full algorithm:\n  # https://github.com/rstudio/rmarkdown/blob/master/R/shiny.R#L72-L100\n  runtime <- yaml$runtime\n  if (is.null(runtime) || !grepl(\"^shiny\", runtime)) {\n    return()\n  }\n\n  # Find deployment url. Use excludeOrphaned = FALSE since we don't need\n  # to worry about redeploying and this makes test infrastructure a little\n  # simpler\n  deploys <- rsconnect::deployments(path, excludeOrphaned = FALSE)\n  if (!is.null(deploys) && nrow(deploys) >= 1) {\n    latest <- which.max(deploys$when)\n    url <- deploys$url[[latest]]\n  } else {\n    return()\n  }\n\n  list(\n    name = as.character(path_ext_remove(path_file(path))),\n    title = yaml$title,\n    url = url\n    # source = as.character(path_rel(path, base_path))\n  )\n}\n"
  },
  {
    "path": "R/build.R",
    "content": "#' Build a complete pkgdown website\n#'\n#' @description\n#' `build_site()` is a convenient wrapper around six functions:\n#'\n#' * [init_site()]\n#' * [build_home()]\n#' * [build_reference()]\n#' * [build_articles()]\n#' * [build_tutorials()]\n#' * [build_news()]\n#' * [build_redirects()]\n#' * [build_llm_docs()]\n#'\n#' See the documentation for the each function to learn how to control\n#' that aspect of the site. This page documents options that affect the\n#' whole site.\n#'\n#' # General config\n#' *  `destination` controls where the site will be generated, defaulting to\n#'    `docs/`. Paths are relative to the package root.\n#'\n#' *  `url` is optional, but strongly recommended.\n#'\n#'    ```yaml\n#'    url: https://pkgdown.r-lib.org\n#'    ```\n#'\n#'    It specifies where the site will be published and is used to allow other\n#'    pkgdown sites to link to your site when needed (`vignette(\"linking\")`),\n#'    generate a `sitemap.xml`, automatically generate a `CNAME` when\n#'    [deploying to github][build_site_github_pages()], generate the metadata needed\n#'    rich social \"media cards\" (`vignette(\"metadata\")`), and more.\n#'\n#' *  `title` overrides the default site title, which is the package name.\n#'    It's used in the page title and default navbar.\n#'\n#' # Navbar and footer\n#'\n#' The `navbar` and `footer` fields control the appearance of the navbar\n#' footer which appear on every page. Learn more about these fields in\n#' `vignette(\"customise\")`.\n#'\n#' # Development mode\n#' The `development` field allows you to generate different sites for the\n#' development and released versions of your package. To use it, you first\n#' need to set the development `mode`:\n#'\n#' ```yaml\n#' development:\n#'   mode: auto\n#' ```\n#'\n#' ### Setting development mode\n#'\n#' The development `mode` of a site controls where the built site is placed\n#' and how it is styled (i.e. the colour of the package version in the\n#' navbar, the version tooltip), and whether or not the site is indexed by\n#' search engines. There are four possible modes:\n#'\n#' * **automatic** (`mode: auto`): determines the mode based on the version:\n#'\n#'   * `0.0.0.9000` (`0.0.0.*`): unreleased.\n#'   * four version components: development.\n#'   * everything else -> release.\n#'\n#' * **release** (`mode: release`), the default. Site is written to `docs/`\n#'   and styled like a released package, even if the content is for an\n#'   unreleased or development version. Version in navbar gets the default\n#'   colouring. Development badges are not shown in the sidebar\n#'   (see `?build_home`).\n#'\n#' * **development** (`mode: devel`). Site is written to `docs/dev/`.\n#'   The navbar version gets a \"danger\" class and a tooltip stating these are\n#'   docs for an in-development version of the package. The `noindex` meta tag\n#'   is used to ensure that these packages are not indexed by search engines.\n#'   Development badges are shown in the sidebar (see `?build_home`).\n#'\n#' * **unreleased** (`mode: unreleased`). Site is written to `docs/`.\n#'   Version in navbar gets the \"danger\" class, and a message indicating the\n#'   package is not yet on CRAN.\n#'   Development badges are shown in the sidebar (see `?build_home`).\n#'\n#' Use `mode: auto` if you want both a released and a dev site, and\n#' `mode: release` if you just want a single site. It is very rare that you\n#' will need either devel or unreleased modes.\n#'\n#' You can override the mode specified in the `_pkgdown.yml` by setting\n#' by setting `PKGDOWN_DEV_MODE` to `devel` or `release`.\n#'\n#' ### Selective HTML\n#'\n#' You can selectively show HTML only on the devel or release site by adding\n#' class `pkgdown-devel` or `pkgdown-release`. This is most easily accessed\n#' from `.Rmd` files where you can use pandoc's `<div>` syntax to control\n#' where a block of markdown will display. For example, you can use the\n#' following markdown in your README to only show GitHub install instructions\n#' on the development version of your site:\n#'\n#' ```md\n#' ::: {.pkgdown-devel}\n#' You can install the development version of pkgdown from GitHub with:\n#' `remotes::install_github(\"r-lib/pkgdown\")`\n#' :::\n#' ```\n#'\n#' You can use a similar technique to control where badges are displayed.\n#' This markdown show the CRAN status badge on the site for the released\n#' package and the GitHub check status for the development package:\n#'\n#' ```md\n#' [![CRAN Status](https://www.r-pkg.org/badges/version/pkgdown)]\n#'   (https://cran.r-project.org/package=pkgdown){.pkgdown-release}\n#' [![R-CMD-check](https://github.com/r-lib/pkgdown/workflows/R-CMD-check/badge.svg)]\n#'   (https://github.com/r-lib/pkgdown/actions){.pkgdown-devel}\n#' ```\n#'\n#' ### Other options\n#'\n#' There are three other options that you can control:\n#'\n#' ```yaml\n#' development:\n#'   destination: dev\n#'   version_label: danger\n#'   version_tooltip: \"Custom message here\"\n#' ```\n#'\n#' `destination` allows you to override the default subdirectory used for the\n#' development site; it defaults to `dev/`. `version_label` allows you to\n#' override the style used for development (and unreleased) versions of the\n#' package. It defaults to \"danger\", but you can set to \"default\", \"info\", or\n#' \"warning\" instead. (The precise colours are determined by your bootstrap\n#' theme, but become progressively more eye catching as you go from default\n#' to danger). Finally, you can choose to override the default tooltip with\n#' `version_tooltip`.\n#'\n#' # Template\n#' The `template` field is mostly used to control the appearance of the site.\n#' See `vignette(\"customise\")` for details. But it's also used to control\n#'\n#' ## Other aspects\n#'\n#' There are a few other `template` fields that control other aspects of the\n#' site:\n#'\n#' *   `noindex: true` will suppress indexing of your pages by search engines:\n#'\n#'     ```yaml\n#'     template:\n#'       params:\n#'         noindex: true\n#'     ```\n#'\n#' * `google_site_verification` allows you to verify your site with google:\n#'\n#'      ```yaml\n#'      template:\n#'        params:\n#'          google_site_verification: _nn6ile-a6x6lctOW\n#'      ```\n#'\n#' *   `trailing_slash_redirect: true` will automatically redirect\n#'     `your-package-url.com` to `your-package-url.com/`, using a JS script\n#'      added to the `<head>` of the home page. This is useful in certain\n#'      redirect scenarios.\n#'\n#'      ```yaml\n#'      template:\n#'        trailing_slash_redirect: true\n#'      ```\n#'\n#' ## Analytics\n#'\n#' To capture usage of your site with a web analytics tool, you can make\n#' use of the `includes` field to add the special HTML they need. This HTML\n#' is typically placed `in_header` (actually in the `<head>`), `before_body`,\n#' or `after_body`.\n#' You can learn more about how includes work in pkgdown at\n#' <https://pkgdown.r-lib.org/articles/customise.html#additional-html-and-files>.\n#'\n#' I include a few examples of popular analytics platforms below, but we\n#' recommend getting the HTML directly from the tool:\n#'\n#' *   [plausible.io](https://plausible.io):\n#'\n#'     ```yaml\n#'     template:\n#'       includes:\n#'         in_header: |\n#'           <script defer data-domain=\"{YOUR DOMAIN}\" src=\"https://plausible.io/js/plausible.js\"></script>\n#'     ```\n#'\n#' *   [Google analytics](https://analytics.google.com/analytics/web/):\n#'\n#'     ```yaml\n#'     template:\n#'       includes:\n#'         in_header: |\n#'            <!-- Global site tag (gtag.js) - Google Analytics -->\n#'            <script async src=\"https://www.googletagmanager.com/gtag/js?id={YOUR MEASUREMENT ID}\" ></script>\n#'            <script>\n#'              window.dataLayer = window.dataLayer || [];\n#'              function gtag(){dataLayer.push(arguments);}\n#'              gtag('js', new Date());\n#'\n#'              gtag('config', '{YOUR MEASUREMENT ID}');\n#'            </script>\n#'            <!-- Google tag (gtag.js) -->\n#'     ```\n#' *   [GoatCounter](https://www.goatcounter.com):\n#'\n#'     ```yaml\n#'     template:\n#'       includes:\n#'         after_body: >\n#'           <script data-goatcounter=\"https://{YOUR CODE}.goatcounter.com/count\" data-goatcounter-settings=\"{YOUR SETTINGS}\" async src=\"https://gc.zgo.at/count.js\"></script>\n#'     ```\n#'\n#' # Source repository\n#'\n#' Use the `repo` field to override pkgdown's automatically discovery\n#' of your source repository. This is used in the navbar, on the homepage,\n#' in articles and reference topics, and in the changelog (to link to issue\n#' numbers and user names). pkgdown can automatically figure out the necessary\n#' URLs if you link to a GitHub, GitLab or Codeberg repo in your `BugReports`\n#' or `URL` field.\n#'\n#' Otherwise, you can supply your own in the `repo` field:\n#'\n#' ```yaml\n#' repo:\n#'   url:\n#'     home: https://github.com/r-lib/pkgdown/\n#'     source: https://github.com/r-lib/pkgdown/blob/HEAD/\n#'     issue: https://github.com/r-lib/pkgdown/issues/\n#'     user: https://github.com/\n#' ```\n#'\n#' * `home`: path to package home on source code repository.\n#' * `source`: path to source of individual file in default branch\n#'   (more on that below).\n#' * `issue`: path to individual issue.\n#' * `user`: path to user.\n#'\n#' The varying components (e.g. path, issue number, user name) are pasted on\n#' the end of these URLs so they should have trailing `/`s.\n#'\n#' When creating the link to a package source, we have to link to a specific\n#' branch. The default behaviour is to use current branch when in GitHub\n#' actions and `HEAD` otherwise. You can overide this default with\n#' `repo.branch`:\n#'\n#' ```yaml\n#' repo:\n#'   branch: devel\n#' ```\n#'\n#' pkgdown can automatically link to Jira issues as well if specify both a\n#' custom `issue` URL as well Jira project names to auto-link in\n#' `jira_projects`. You can specify as many projects as you would like:\n#'\n#' ```yaml\n#' repo:\n#'   jira_projects: [this_project, another_project]\n#'   url:\n#'     issue: https://jira.organisation.com/jira/browse/\n#' ```\n#'\n#' # Deployment (`deploy`)\n#' There is a single `deploy` field\n#'\n#' *  `install_metadata` allows you to install package index metadata into\n#'    the package itself. Normally this metadata is made available on the\n#'    published site; installing it into your package means that it's\n#'    available for autolinking even if your website is not reachable at build\n#'    time (e.g. because behind a firewall or requires auth).\n#'\n#'    ```yaml\n#'    deploy:\n#'      install_metadata: true\n#'    ```\n#' @inheritParams build_articles\n#' @inheritParams build_reference\n#' @param lazy If `TRUE`, will only rebuild articles and reference pages\n#'   if the source is newer than the destination.\n#' @param devel Use development or deployment process?\n#'\n#'   If `TRUE`, uses lighter-weight process suitable for rapid\n#'   iteration; it will run examples and vignettes in the current process,\n#'   and will load code with `pkgload::load_all()`.\n#'\n#'   If `FALSE`, will first install the package to a temporary library,\n#'   and will run all examples and vignettes in a new process.\n#'\n#'   `build_site()` defaults to `devel = FALSE` so that you get high fidelity\n#'   outputs when you building the complete site; `build_reference()`,\n#'   `build_home()` and friends default to `devel = TRUE` so that you can\n#'   rapidly iterate during development.\n#' @param new_process If `TRUE`, will run `build_site()` in a separate process.\n#'   This enhances reproducibility by ensuring nothing that you have loaded\n#'   in the current process affects the build process.\n#' @param install If `TRUE`, will install the package in a temporary library\n#'   so it is available for vignettes.\n#' @param quiet If `FALSE`, generate build messages for build functions that\n#'   take `quiet` arguments.\n#' @export\n#' @examples\n#' \\dontrun{\n#' build_site()\n#'\n#' build_site(override = list(destination = tempdir()))\n#' }\nbuild_site <- function(\n  pkg = \".\",\n  examples = TRUE,\n  run_dont_run = FALSE,\n  seed = 1014L,\n  lazy = FALSE,\n  override = list(),\n  preview = NA,\n  devel = FALSE,\n  new_process = !devel,\n  install = !devel,\n  quiet = TRUE\n) {\n  pkg <- as_pkgdown(pkg, override = override)\n  check_bool(devel)\n  check_bool(new_process)\n  check_bool(install)\n\n  if (install) {\n    withr::local_temp_libpaths()\n    cli::cli_rule(\n      \"Installing package {.pkg {pkg$package}} into temporary library\"\n    )\n    # Keep source, so that e.g. pillar can show the source code\n    # of its functions in its articles\n    withr::with_options(\n      list(keep.source.pkgs = TRUE, keep.parse.data.pkgs = TRUE),\n      utils::install.packages(\n        pkg$src_path,\n        repos = NULL,\n        type = \"source\",\n        quiet = TRUE\n      )\n    )\n  }\n\n  if (new_process) {\n    build_site_external(\n      pkg = pkg,\n      examples = examples,\n      run_dont_run = run_dont_run,\n      seed = seed,\n      lazy = lazy,\n      override = override,\n      preview = preview,\n      devel = devel,\n      quiet = quiet\n    )\n  } else {\n    build_site_local(\n      pkg = pkg,\n      examples = examples,\n      run_dont_run = run_dont_run,\n      seed = seed,\n      lazy = lazy,\n      override = override,\n      preview = preview,\n      devel = devel,\n      quiet = quiet\n    )\n  }\n}\n\nbuild_site_external <- function(\n  pkg = \".\",\n  examples = TRUE,\n  run_dont_run = FALSE,\n  seed = 1014L,\n  lazy = FALSE,\n  override = list(),\n  preview = NA,\n  devel = TRUE,\n  quiet = TRUE\n) {\n  pkg <- as_pkgdown(pkg, override = override)\n  args <- list(\n    pkg = pkg,\n    examples = examples,\n    run_dont_run = run_dont_run,\n    seed = seed,\n    lazy = lazy,\n    override = override,\n    install = FALSE,\n    preview = FALSE,\n    new_process = FALSE,\n    devel = devel,\n    quiet = quiet,\n    cli_colors = cli::num_ansi_colors(),\n    hyperlinks = cli::ansi_has_hyperlink_support()\n  )\n  callr::r(\n    function(..., cli_colors, hyperlinks) {\n      options(\n        cli.num_colors = cli_colors,\n        cli.hyperlink = hyperlinks,\n        cli.hyperlink_run = hyperlinks\n      )\n      pkgdown::build_site(...)\n    },\n    args = args,\n    show = TRUE\n  )\n\n  cli::cli_rule(\n    \"Finished building pkgdown site for package {.pkg {pkg$package}}\"\n  )\n\n  preview_site(pkg, preview = preview)\n  invisible()\n}\n\nbuild_site_local <- function(\n  pkg = \".\",\n  examples = TRUE,\n  run_dont_run = FALSE,\n  seed = 1014L,\n  lazy = FALSE,\n  override = list(),\n  preview = NA,\n  devel = TRUE,\n  quiet = TRUE\n) {\n  pkg <- section_init(pkg, override = override)\n\n  cli::cli_rule(\"Building pkgdown site for package {.pkg {pkg$package}}\")\n  cli::cli_inform(\"Reading from: {src_path(path_abs(pkg$src_path))}\")\n  cli::cli_inform(\"Writing to:   {dst_path(path_abs(pkg$dst_path))}\")\n\n  pkgdown_sitrep(pkg)\n\n  if (!lazy) {\n    # Only force init_site() if `!lazy`\n    # if site is not initialized, it will be in build_home()\n    init_site(pkg, override)\n  }\n\n  build_home(pkg, override = override, quiet = quiet, preview = FALSE)\n  build_reference(\n    pkg,\n    lazy = lazy,\n    examples = examples,\n    run_dont_run = run_dont_run,\n    seed = seed,\n    override = override,\n    preview = FALSE,\n    devel = devel\n  )\n  build_articles(\n    pkg,\n    lazy = lazy,\n    override = override,\n    quiet = quiet,\n    preview = FALSE\n  )\n  build_tutorials(pkg, override = override, preview = FALSE)\n  build_news(pkg, override = override, preview = FALSE)\n  build_sitemap(pkg)\n  if (pkg$bs_version > 3) {\n    build_llm_docs(pkg)\n  }\n  build_redirects(pkg, override = override)\n  if (pkg$bs_version == 3) {\n    build_docsearch_json(pkg)\n  } else {\n    build_search(pkg, override = override)\n  }\n\n  check_built_site(pkg)\n\n  cli::cli_rule(\n    \"Finished building pkgdown site for package {.pkg {pkg$package}}\"\n  )\n  preview_site(pkg, preview = preview)\n}\n"
  },
  {
    "path": "R/check-built.R",
    "content": "check_built_site <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  cli::cli_rule(\"Checking for problems\")\n  index_path <- path_index(pkg)\n  if (!is.null(index_path)) {\n    check_missing_images(pkg, index_path, \"index.html\")\n  }\n}\n\ncheck_missing_images <- function(pkg, src_path, dst_path) {\n  html <- xml2::read_html(path(pkg$dst_path, dst_path), encoding = \"UTF-8\")\n  img <- xml2::xml_find_all(html, \".//img\")\n  src <- xml2::xml_attr(img, \"src\")\n\n  rel_src <- xml2::url_unescape(src[xml2::url_parse(src)$scheme == \"\"])\n  rel_path <- path_norm(path(path_dir(dst_path), rel_src))\n  exists <- file_exists(path(pkg$dst_path, rel_path))\n\n  if (any(!exists)) {\n    paths <- rel_src[!exists]\n    cli::cli_inform(c(\n      \"Missing images in {.file {path_rel(src_path, pkg$src_path)}}: {.file {paths}}\",\n      i = \"pkgdown can only use images in {.file man/figures} and {.file vignettes}\"\n    ))\n  }\n\n  alt <- xml2::xml_attr(img, \"alt\")\n  if (anyNA(alt)) {\n    problems <- src[is.na(alt)]\n    problems[grepl(\"^data:image\", problems)] <- \"<base64 encoded image>\"\n    cli::cli_inform(c(\n      x = \"Missing alt-text in {.file {path_rel(src_path, pkg$src_path)}}\",\n      set_names(problems, \"*\"),\n      i = \"Learn more in {.vignette pkgdown::accessibility}.\"\n    ))\n  }\n}\n"
  },
  {
    "path": "R/check.R",
    "content": "#' Check `_pkgdown.yml`\n#'\n#' @description\n#' This pair of functions checks that your `_pkgdown.yml` is valid without\n#' building the whole site. `check_pkgdown()` errors at the first problem;\n#' `pkgdown_sitrep()` reports the status of all checks.\n#'\n#' Currently they check that:\n#'\n#' * There's a `url` in the pkgdown configuration, which is also recorded\n#'   in the `URL` field of the `DESCRIPTION`.\n#'\n#' * All opengraph metadata is valid.\n#'\n#' * All reference topics are included in the index.\n#'\n#' * All articles/vignettes are included in the index.\n#\n#' @export\n#' @inheritParams as_pkgdown\ncheck_pkgdown <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  check_urls(pkg)\n  data_open_graph(pkg)\n  data_articles_index(pkg)\n  data_reference_index(pkg)\n\n  cli::cli_inform(c(\"v\" = \"No problems found.\"))\n}\n\n#' @export\n#' @rdname check_pkgdown\npkgdown_sitrep <- function(pkg = \".\") {\n  cli::cli_rule(\"Sitrep\")\n\n  pkg <- as_pkgdown(pkg)\n  if (pkg$bs_version == 3) {\n    cli::cli_inform(c(\n      x = \"Bootstrap 3 is deprecated; please switch to Bootstrap 5.\",\n      i = \"Learn more at {.url https://www.tidyverse.org/blog/2021/12/pkgdown-2-0-0/#bootstrap-5}.\"\n    ))\n  }\n\n  error_to_sitrep(\"URLs\", check_urls(pkg))\n  error_to_sitrep(\"Favicons\", check_favicons(pkg))\n  error_to_sitrep(\"Open graph metadata\", data_open_graph(pkg))\n  error_to_sitrep(\"Articles metadata\", data_articles_index(pkg))\n  error_to_sitrep(\"Reference metadata\", data_reference_index(pkg))\n}\n\nerror_to_sitrep <- function(title, code) {\n  tryCatch(\n    {\n      code\n      cli::cli_inform(c(\"v\" = \"{title} ok.\"))\n    },\n    rlang_error = function(e) {\n      bullets <- c(cnd_header(e), cnd_body(e))\n      cli::cli_inform(c(x = \"{title} not ok.\", set_names(bullets, \" \")))\n    }\n  )\n  invisible()\n}\n\ncheck_urls <- function(pkg = \".\", call = caller_env()) {\n  pkg <- as_pkgdown(pkg)\n  details <- c(i = \"See details in {.vignette pkgdown::metadata}.\")\n\n  if (identical(pkg$meta, list())) {\n    cli::cli_abort(\n      c(\"No {.path _pkgdown.yml} found.\", details),\n      call = call\n    )\n  }\n\n  url <- pkg$meta[[\"url\"]]\n\n  if (is.null(url)) {\n    config_abort(pkg, c(\"{.field url} is missing.\", details), call = call)\n  } else {\n    desc_urls <- pkg$desc$get_urls()\n    desc_urls <- sub(\"/$\", \"\", desc_urls)\n    if (!pkg$meta[[\"url\"]] %in% desc_urls) {\n      msg <- \"{.field URL} is missing package url ({url}).\"\n      config_abort(pkg, c(msg, details), path = \"DESCRIPTION\", call = call)\n    }\n  }\n}\n\ncheck_favicons <- function(pkg) {\n  if (!has_logo(pkg)) {\n    return()\n  }\n\n  if (has_favicons(pkg)) {\n    logo <- find_logo(pkg$src_path)\n    favicon <- path(path_favicons(pkg), \"favicon.ico\")\n\n    if (out_of_date(logo, favicon)) {\n      cli::cli_abort(c(\n        \"Package logo is newer than favicons.\",\n        i = \"Do you need to rerun {.run [build_favicons()](pkgdown::build_favicons())}?\"\n      ))\n    }\n  } else {\n    cli::cli_abort(c(\n      \"Found package logo but not favicons.\",\n      i = \"Do you need to run {.run [build_favicons()](pkgdown::build_favicons())}?\"\n    ))\n  }\n}\n"
  },
  {
    "path": "R/clean.R",
    "content": "#' Clean site\n#'\n#' Delete all files in `docs/` (except for `CNAME`).\n#'\n#' @param quiet If `TRUE`, suppresses a message.\n#' @param force If `TRUE`, delete contents of `docs` even if it is not a pkgdown site.\n#' @inheritParams build_site\n#' @rdname clean\n#' @export\nclean_site <- function(pkg = \".\", quiet = FALSE, force = FALSE) {\n  pkg <- as_pkgdown(pkg)\n\n  if (!quiet) {\n    cli::cli_inform(\n      \"Cleaning {.pkg {pkg$package}} pkgdown docs from {.path {pkg$dst_path}}\"\n    )\n  }\n\n  if (!dir_exists(pkg$dst_path)) {\n    return(invisible())\n  }\n\n  top_level <- dest_files(pkg)\n  if (length(top_level) > 0 && !force) {\n    check_dest_is_pkgdown(pkg)\n  }\n\n  is_dir <- is_dir(top_level)\n  dir_delete(top_level[is_dir])\n  file_delete(top_level[!is_dir])\n\n  invisible(TRUE)\n}\n\n#' Clean cache\n#'\n#' Delete all files in the pkgdown cache directory.\n#'\n#' @rdname clean\n#' @export\nclean_cache <- function(pkg = \".\", quiet = FALSE) {\n  pkg <- as_pkgdown(pkg)\n  cache_path <- tools::R_user_dir(\"pkgdown\", \"cache\")\n\n  if (dir_exists(cache_path)) {\n    if (!quiet) {\n      cli::cli_inform(\n        \"Cleaning {.pkg {pkg$package}} cache files from {.path {cache_path}}\"\n      )\n    }\n\n    dir_delete(cache_path)\n  }\n\n  invisible(TRUE)\n}\n\ncheck_dest_is_pkgdown <- function(pkg) {\n  if (file_exists(path(pkg$dst_path, \"pkgdown.yml\"))) {\n    return()\n  }\n\n  cli::cli_abort(c(\n    \"{.file {pkg$dst_path}} is non-empty and not built by pkgdown\",\n    \"!\" = \"Make sure it contains no important information \\\\\n            and use {.run pkgdown::clean_site(force = TRUE)} to delete its contents.\"\n  ))\n}\n\ndest_files <- function(pkg) {\n  if (!dir_exists(pkg$dst_path)) {\n    character()\n  } else {\n    top_level <- dir_ls(pkg$dst_path)\n    top_level[!path_file(top_level) %in% c(\"CNAME\", \"dev\")]\n  }\n}\n"
  },
  {
    "path": "R/config.R",
    "content": "config_pluck <- function(pkg, path, default = NULL) {\n  check_string(path, allow_empty = FALSE, .internal = TRUE)\n\n  where <- strsplit(path, \".\", fixed = TRUE)[[1]]\n  purrr::pluck(pkg$meta, !!!where, .default = default)\n}\n\nconfig_pluck_list <- function(\n  pkg,\n  path,\n  has_names = NULL,\n  default = NULL,\n  call = caller_env()\n) {\n  check_string(path, allow_empty = FALSE, .internal = TRUE)\n\n  x <- config_pluck(pkg, path, default)\n  config_check_list(\n    x,\n    has_names = has_names,\n    error_path = path,\n    error_pkg = pkg,\n    error_call = call\n  )\n}\n\nconfig_pluck_character <- function(\n  pkg,\n  path,\n  default = character(),\n  call = caller_env()\n) {\n  x <- config_pluck(pkg, path, default)\n  config_check_character(\n    x,\n    error_path = path,\n    error_pkg = pkg,\n    error_call = call\n  )\n}\n\nconfig_pluck_string <- function(\n  pkg,\n  path,\n  default = NULL,\n  call = caller_env()\n) {\n  x <- config_pluck(pkg, path, default)\n  config_check_string(\n    x,\n    error_path = path,\n    error_pkg = pkg,\n    error_call = call\n  )\n}\n\nconfig_pluck_markdown_inline <- function(\n  pkg,\n  path,\n  default = NULL,\n  call = caller_env()\n) {\n  text <- config_pluck_string(pkg, path, default, call = call)\n  markdown_text_inline(pkg, text, error_path = path, error_call = call)\n}\n\nconfig_pluck_markdown_block <- function(\n  pkg,\n  path,\n  default = NULL,\n  call = caller_env()\n) {\n  text <- config_pluck_string(pkg, path, default, call = call)\n  markdown_text_block(pkg, text)\n}\n\nconfig_pluck_bool <- function(pkg, path, default = NULL, call = caller_env()) {\n  x <- config_pluck(pkg, path, default)\n  config_check_bool(\n    x,\n    error_path = path,\n    error_pkg = pkg,\n    error_call = call\n  )\n}\n\nconfig_pluck_number_whole <- function(\n  pkg,\n  path,\n  default = NULL,\n  call = caller_env()\n) {\n  x <- config_pluck(pkg, path, default)\n  config_check_number_whole(\n    x,\n    error_path = path,\n    error_pkg = pkg,\n    error_call = call\n  )\n}\n\n# checks ---------------------------------------------------------------------\n\nconfig_check_character <- function(\n  x,\n  error_pkg,\n  error_path,\n  error_call = caller_env()\n) {\n  if (is.character(x) || is.null(x)) {\n    x\n  } else if (identical(x, list())) {\n    character()\n  } else {\n    config_abort_type(\n      must_be = \"a character vector\",\n      not = x,\n      error_pkg = error_pkg,\n      error_path = error_path,\n      error_call = error_call\n    )\n  }\n}\n\nconfig_check_string <- function(\n  x,\n  error_pkg,\n  error_path,\n  error_call = caller_env()\n) {\n  if (is_string(x) || is.null(x)) {\n    x\n  } else {\n    config_abort_type(\n      must_be = \"a string\",\n      not = x,\n      error_pkg = error_pkg,\n      error_path = error_path,\n      error_call = error_call\n    )\n  }\n}\n\nconfig_check_bool <- function(\n  x,\n  error_pkg,\n  error_path,\n  error_call = caller_env()\n) {\n  if (is_bool(x) || is.null(x)) {\n    x\n  } else {\n    config_abort_type(\n      must_be = \"true or false\",\n      not = x,\n      error_pkg = error_pkg,\n      error_path = error_path,\n      error_call = error_call\n    )\n  }\n}\n\nconfig_check_number_whole <- function(\n  x,\n  error_pkg,\n  error_path,\n  error_call = caller_env()\n) {\n  is_whole <- (0 ==\n    (exit_code <- .standalone_types_check_dot_call(\n      ffi_standalone_check_number_1.0.7,\n      x,\n      allow_decimal = FALSE,\n      min = NULL,\n      max = NULL,\n      allow_infinite = FALSE,\n      allow_na = FALSE,\n      allow_null = TRUE\n    )))\n\n  if (is_whole) {\n    x\n  } else {\n    config_abort_type(\n      must_be = \"a whole number\",\n      not = x,\n      error_pkg = error_pkg,\n      error_path = error_path,\n      error_call = error_call\n    )\n  }\n}\n\nconfig_check_list <- function(\n  x,\n  has_names = NULL,\n  error_pkg,\n  error_path,\n  error_call = caller_env()\n) {\n  if (is_list(x) || is.null(x)) {\n    if (!is.null(has_names) && !all(has_name(x, has_names))) {\n      missing <- setdiff(has_names, names(x))\n      config_abort(\n        error_pkg,\n        c(\n          \"{.field {error_path}} must have {cli::qty(has_names)} component{?s} {.str {has_names}}.\",\n          \"{length(missing)} missing component{?s}: {.str {missing}}.\"\n        ),\n        call = error_call\n      )\n    } else {\n      x\n    }\n  } else {\n    not <- obj_type_friendly(x)\n    config_abort(\n      error_pkg,\n      \"{.field {error_path}} must be a list, not {not}.\",\n      call = error_call\n    )\n  }\n}\n\nconfig_abort_type <- function(must_be, not, error_pkg, error_path, error_call) {\n  not_str <- obj_type_friendly(not)\n  config_abort(\n    error_pkg,\n    \"{.field {error_path}} must be {must_be}, not {not_str}.\",\n    call = error_call\n  )\n}\n\n# generic error ---------------------------------------------------------------\n\nconfig_abort <- function(\n  pkg,\n  message,\n  path = NULL,\n  ...,\n  call = caller_env(),\n  .envir = caller_env()\n) {\n  message <- config_message(pkg, message, path)\n  cli::cli_abort(message, ..., call = call, .envir = .envir)\n}\n\nconfig_warn <- function(\n  pkg,\n  message,\n  path = NULL,\n  ...,\n  call = caller_env(),\n  .envir = caller_env()\n) {\n  message <- config_message(pkg, message, path)\n  cli::cli_warn(message, ..., call = call, .envir = .envir)\n}\n\nconfig_message <- function(pkg, message, path = NULL) {\n  # Not all projects necessary have a _pkgdown.yml (#2542)\n  path <- path %||% pkgdown_config_path(pkg) %||% \"_pkgdown.yml\"\n  if (is_absolute_path(path)) {\n    path_label <- path_rel(path, pkg$src_path)\n  } else {\n    path_label <- path\n  }\n\n  link <- cli::style_hyperlink(path_label, paste0(\"file://\", path))\n  message[[1]] <- paste0(\"In \", link, \", \", message[[1]])\n  message\n}\n"
  },
  {
    "path": "R/context.R",
    "content": "section_init <- function(\n  pkg,\n  subdir = NULL,\n  override = list(),\n  .frame = parent.frame()\n) {\n  rstudio_save_all()\n  pkg <- as_pkgdown(pkg, override = override)\n\n  if (length(dest_files(pkg)) > 0) {\n    check_dest_is_pkgdown(pkg)\n  } else {\n    init_site(pkg)\n  }\n\n  if (is.null(subdir)) {\n    depth <- 0\n  } else {\n    depth <- 1\n    dir_create(path(pkg$dst_path, subdir))\n  }\n\n  local_envvar_pkgdown(pkg, .frame)\n  local_options_link(pkg, depth = depth, .frame = .frame)\n  cache_cli_colours(.frame = .frame)\n\n  pkg\n}\n\ncache_cli_colours <- function(.frame = parent.frame()) {\n  # https://github.com/r-lib/cli/issues/607\n  num_col <- getOption(\"cli.num_colors\", default = cli::num_ansi_colors())\n  withr::local_options(cli.num_colors = num_col, .local_envir = .frame)\n}\n\nlocal_options_link <- function(pkg, depth, .frame = parent.frame()) {\n  article_index <- article_index(pkg)\n  Rdname <- get_rdname(pkg$topics)\n  topic_index <- unlist(invert_index(set_names(pkg$topics$alias, Rdname)))\n\n  withr::local_options(\n    list(\n      downlit.package = pkg$package,\n      downlit.article_index = article_index,\n      downlit.topic_index = topic_index,\n      downlit.article_path = paste0(up_path(depth), \"articles/\"),\n      downlit.topic_path = paste0(up_path(depth), \"reference/\")\n    ),\n    .local_envir = .frame\n  )\n}\n\nlocal_context_eval <- function(\n  figures = NULL,\n  src_path = getwd(),\n  sexpr_env = child_env(globalenv()),\n  .frame = parent.frame()\n) {\n  context_set_scoped(\"figures\", figures, scope = .frame)\n  context_set_scoped(\"src_path\", src_path, scope = .frame)\n  context_set_scoped(\"sexpr_env\", sexpr_env, scope = .frame)\n}\n\n# Manage current topic index ----------------------------------------------------\n\ncontext <- new_environment()\ncontext$packages <- character()\n\ncontext_set <- function(name, value) {\n  old <- if (env_has(context, name)) env_get(context, name)\n\n  if (is.null(value)) {\n    if (env_has(context, name)) {\n      env_unbind(context, name)\n    }\n  } else {\n    env_bind(context, !!name := value)\n  }\n  invisible(old)\n}\n\ncontext_get <- function(name) {\n  if (env_has(context, name)) {\n    env_get(context, name)\n  } else {\n    cli::cli_abort(\"Context {.str name} has not been initialised\")\n  }\n}\n\ncontext_set_scoped <- function(name, value, scope = parent.frame()) {\n  old <- context_set(name, value)\n  withr::defer(context_set(name, old), envir = scope)\n}\n\narticle_index <- function(pkg) {\n  set_names(\n    path_rel(pkg$vignettes$file_out, \"articles\"),\n    pkg$vignettes$name\n  )\n}\n"
  },
  {
    "path": "R/deploy-site.R",
    "content": "#' Deploy a pkgdown site on Travis-CI to Github Pages\n#'\n#' @description\n#' `r lifecycle::badge('superseded')`\n#'\n#' `deploy_site_github()` was designed to deploy your site from Travis CI,\n#' which we no longer recommend, so this function is deprecated. There are\n#' two replacements:\n#'\n#' * [usethis::use_pkgdown_github_pages()] will setup a GitHub action to\n#'   automatically build and deploy your package website to GitHub pages.\n#'\n#' * [deploy_to_branch()] can be called locally to build and deploy your\n#'   website to any desired branch.\n#'\n#' @inheritParams build_site\n#' @param install Optionally, opt-out of automatic installation. This is\n#'   necessary if the package you're documenting is a dependency of pkgdown\n#' @param tarball The location of the built package tarball. The default Travis\n#'   configuration for R packages sets `PKG_TARBALL` to this path.\n#' @param ssh_id The private id to use, a base64 encoded content of the private\n#'   pem file. This should _not_ be your personal private key. Instead create a\n#'   new keypair specifically for deploying the site. The easiest way is to use\n#'   `travis::use_travis_deploy()`.\n#' @param commit_message The commit message to be used for the commit.\n#' @param clean Clean all files from old site.\n#' @param verbose Print verbose output\n#' @param ... Additional arguments passed to [build_site()].\n#' @param host The GitHub host url.\n#' @param repo_slug The `user/repo` slug for the repository.\n#' @export\n#' @keywords internal\ndeploy_site_github <- function(\n  pkg = \".\",\n  install = TRUE,\n  tarball = Sys.getenv(\"PKG_TARBALL\", \"\"),\n  ssh_id = Sys.getenv(\"id_rsa\", \"\"),\n  commit_message = construct_commit_message(pkg),\n  clean = FALSE,\n  verbose = FALSE,\n  host = \"github.com\",\n  ...,\n  repo_slug = Sys.getenv(\"TRAVIS_REPO_SLUG\", \"\")\n) {\n  rlang::check_installed(\"openssl\")\n  if (!nzchar(tarball)) {\n    cli::cli_abort(\n      \"No built tarball detected, please provide the location of one with {.var tarball}\",\n      call = caller_env()\n    )\n  }\n\n  if (!nzchar(ssh_id)) {\n    cli::cli_abort(\n      \"No deploy key found, please setup with {.fn travis::use_travis_deploy}\",\n      call = caller_env()\n    )\n  }\n\n  if (!nzchar(repo_slug)) {\n    cli::cli_abort(\n      \"No repo detected, please supply one with {.var repo_slug}\",\n      call = caller_env()\n    )\n  }\n\n  cli::cli_alert(\"Deploying site to GitHub\")\n  if (install) {\n    cli::cli_inform(\"Installing package\")\n    callr::rcmd(\"INSTALL\", tarball, show = verbose, fail_on_status = TRUE)\n  }\n\n  ssh_id_file <- \"~/.ssh/id_rsa\"\n  cli::cli_inform(\"Setting up SSH id\")\n  cli::cli_inform(\"Copying private key to {.file ssh_id_file}\")\n  write_lines(rawToChar(openssl::base64_decode(ssh_id)), ssh_id_file)\n  cli::cli_inform(\"Setting private key permissions to 0600\")\n  file_chmod(ssh_id_file, \"0600\")\n\n  cli::cli_inform(\"Setting remote to use the ssh url\")\n\n  git(\"remote\", \"set-url\", \"origin\", sprintf(\"git@%s:%s.git\", host, repo_slug))\n\n  deploy_to_branch(\n    pkg,\n    commit_message = commit_message,\n    clean = clean,\n    branch = \"gh-pages\",\n    ...\n  )\n\n  cli::cli_inform(c(v = \"Deploy completed\"))\n}\n\n#' Build and deploy a site locally\n#'\n#' Assumes that you're in a git clone of the project, and the package is\n#' already installed. Use [usethis::use_pkgdown_github_pages()] to automate\n#' this process using GitHub actions.\n#'\n#' @param branch The git branch to deploy to\n#' @param remote The git remote to deploy to\n#' @param github_pages Is this a GitHub pages deploy. If `TRUE`, adds a `CNAME`\n#'   file for custom domain name support, and a `.nojekyll` file to suppress\n#'   jekyll rendering.\n#' @param ... Additional arguments passed to [build_site()].\n#' @param subdir The sub-directory where the site should be built on the branch.\n#'   This argument can be used to support a number of site configurations.\n#'   For example, you could build version-specific documentation by setting\n#'   `subdir = \"v1.2.3\"`; `deploy_to_branch()` will build and deploy the\n#'   package documentation in the `v.1.2.3/` directory of your site.\n#' @inheritParams build_site\n#' @inheritParams deploy_site_github\n#' @export\ndeploy_to_branch <- function(\n  pkg = \".\",\n  commit_message = construct_commit_message(pkg),\n  clean = TRUE,\n  branch = \"gh-pages\",\n  remote = \"origin\",\n  github_pages = (branch == \"gh-pages\"),\n  ...,\n  subdir = NULL\n) {\n  dest_dir <- dir_create(file_temp())\n  on.exit(dir_delete(dest_dir))\n\n  if (!git_has_remote_branch(remote, branch)) {\n    old_branch <- git_current_branch()\n\n    # If no remote branch, we need to create it\n    git(\"checkout\", \"--orphan\", branch)\n    git(\"rm\", \"-rf\", \"--quiet\", \".\")\n    git(\n      \"commit\",\n      \"--allow-empty\",\n      \"-m\",\n      sprintf(\"Initializing %s branch\", branch)\n    )\n    git(\"push\", remote, paste0(\"HEAD:\", branch))\n\n    # checkout the previous branch\n    git(\"checkout\", old_branch)\n  }\n\n  # Explicitly set the branches tracked by the origin remote.\n  # Needed if we are using a shallow clone, such as on travis-CI\n  git(\"remote\", \"set-branches\", \"--add\", remote, branch)\n\n  git(\"fetch\", remote, branch)\n\n  github_worktree_add(dest_dir, remote, branch)\n  on.exit(github_worktree_remove(dest_dir), add = TRUE)\n\n  site_dest_dir <-\n    if (!is.null(subdir)) {\n      dir_create(path(dest_dir, subdir))\n    } else {\n      dest_dir\n    }\n\n  pkg <- as_pkgdown(pkg, override = list(destination = site_dest_dir))\n\n  if (!is.null(subdir) && !is.null(pkg$meta$url)) {\n    pkg$meta$url <- path(pkg$meta$url, subdir)\n  }\n\n  build_site_github_pages(pkg, ..., clean = clean)\n\n  github_push(dest_dir, commit_message, remote, branch)\n\n  invisible()\n}\n\ngit_has_remote_branch <- function(remote, branch) {\n  has_remote_branch <- git(\n    \"ls-remote\",\n    \"--quiet\",\n    \"--exit-code\",\n    remote,\n    branch,\n    echo = FALSE,\n    echo_cmd = FALSE,\n    error_on_status = FALSE\n  )$status ==\n    0\n}\n\ngit_current_branch <- function() {\n  branch <- git(\n    \"rev-parse\",\n    \"--abbrev-ref\",\n    \"HEAD\",\n    echo = FALSE,\n    echo_cmd = FALSE\n  )$stdout\n  sub(\"\\n$\", \"\", branch)\n}\n\ngithub_worktree_add <- function(dir, remote, branch) {\n  cli::cli_inform(\"Adding worktree\")\n  git(\n    \"worktree\",\n    \"add\",\n    \"--track\",\n    \"-B\",\n    branch,\n    dir,\n    paste0(remote, \"/\", branch)\n  )\n}\n\ngithub_worktree_remove <- function(dir) {\n  cli::cli_inform(\"Removing worktree\")\n  git(\"worktree\", \"remove\", dir)\n}\n\ngithub_push <- function(dir, commit_message, remote, branch) {\n  # force execution before changing working directory\n  force(commit_message)\n\n  cli::cli_inform(\"Commiting updated site\")\n\n  withr::with_dir(dir, {\n    git(\"add\", \"-A\", \".\")\n    git(\"commit\", \"--allow-empty\", \"-m\", commit_message)\n\n    cli::cli_alert(\"Deploying to GitHub Pages\")\n    git(\"remote\", \"-v\")\n    git(\"push\", \"--force\", remote, paste0(\"HEAD:\", branch))\n  })\n}\n\ngit <- function(..., echo_cmd = TRUE, echo = TRUE, error_on_status = TRUE) {\n  callr::run(\n    \"git\",\n    c(...),\n    echo_cmd = echo_cmd,\n    echo = echo,\n    error_on_status = error_on_status\n  )\n}\n\nconstruct_commit_message <- function(pkg = \".\", commit = ci_commit_sha()) {\n  pkg <- as_pkgdown(pkg)\n  cli::format_inline(\n    \"Built site for {pkg$package}@{pkg$version}: {substr(commit, 1, 7)}\"\n  )\n}\n\nci_commit_sha <- function() {\n  env_vars <- c(\n    # https://docs.travis-ci.com/user/environment-variables/#default-environment-variables\n    \"TRAVIS_COMMIT\",\n    # https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables#default-environment-variables\n    \"GITHUB_SHA\"\n  )\n\n  for (var in env_vars) {\n    commit_sha <- Sys.getenv(var, \"\")\n    if (commit_sha != \"\") return(commit_sha)\n  }\n\n  \"\"\n}\n"
  },
  {
    "path": "R/development.R",
    "content": "meta_development <- function(pkg, call = caller_env()) {\n  config_pluck_list(pkg, \"development\", call = call)\n\n  mode <- dev_mode(pkg, call = call)\n\n  destination <- config_pluck_string(\n    pkg,\n    \"development.destination\",\n    default = \"dev\",\n    call = call\n  )\n  version_label <- config_pluck_string(\n    pkg,\n    \"development.version_label\",\n    call = call\n  )\n  if (is.null(version_label)) {\n    if (mode %in% c(\"release\", \"default\")) {\n      version_label <- if (pkg$bs_version == 3) \"default\" else \"muted\"\n    } else {\n      version_label <- \"danger\"\n    }\n  }\n  in_dev <- mode == \"devel\"\n\n  list(\n    destination = destination,\n    mode = mode,\n    version_label = version_label,\n    in_dev = in_dev,\n    prefix = if (in_dev) paste0(destination, \"/\") else \"\"\n  )\n}\n\ndev_mode <- function(pkg, call = caller_env()) {\n  mode <- Sys.getenv(\"PKGDOWN_DEV_MODE\")\n  if (identical(mode, \"\")) {\n    mode <- config_pluck_string(\n      pkg,\n      \"development.mode\",\n      default = \"default\",\n      call = call\n    )\n  }\n\n  if (mode == \"auto\") {\n    mode <- dev_mode_auto(pkg$version)\n  } else {\n    valid_mode <- c(\"auto\", \"default\", \"release\", \"devel\", \"unreleased\")\n    if (!mode %in% valid_mode) {\n      msg <- \"{.field development.mode} must be one of {.or {valid_mode}}, not {mode}.\"\n      config_abort(pkg, msg, call = call)\n    }\n  }\n\n  mode\n}\n\ndev_mode_auto <- function(version) {\n  version <- unclass(package_version(version))[[1]]\n\n  if (length(version) < 3) {\n    \"release\"\n  } else if (length(version) == 3) {\n    if (version[3] >= 9000) {\n      \"devel\"\n    } else {\n      \"release\"\n    }\n  } else if (identical(version[1:3], c(0L, 0L, 0L))) {\n    \"unreleased\"\n  } else {\n    \"devel\"\n  }\n}\n\n# Called in render_page() so that LANG env var set up\nversion_tooltip <- function(mode) {\n  switch(\n    mode,\n    default = \"\",\n    release = tr_(\"Released version\"),\n    devel = tr_(\"In-development version\"),\n    unreleased = tr_(\"Unreleased version\")\n  )\n}\n"
  },
  {
    "path": "R/external-deps.R",
    "content": "external_dependencies <- function(pkg, call = caller_env()) {\n  purrr::compact(list(\n    fontawesome::fa_html_dependency(),\n    cached_dependency(\n      name = \"headroom\",\n      version = \"0.11.0\",\n      files = list(\n        list(\n          url = \"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\",\n          integrity = \"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\"\n        ),\n        list(\n          url = \"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\",\n          integrity = \"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\"\n        )\n      )\n    ),\n    cached_dependency(\n      name = \"bootstrap-toc\",\n      version = \"1.0.1\",\n      files = list(\n        list(\n          url = \"https://cdn.jsdelivr.net/gh/afeld/bootstrap-toc@v1.0.1/dist/bootstrap-toc.min.js\",\n          integrity = \"sha256-4veVQbu7//Lk5TSmc7YV48MxtMy98e26cf5MrgZYnwo=\"\n        )\n      )\n    ),\n    cached_dependency(\n      name = \"clipboard.js\",\n      version = \"2.0.11\",\n      files = list(\n        list(\n          url = \"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.11/clipboard.min.js\",\n          integrity = \"sha512-7O5pXpc0oCRrxk8RUfDYFgn0nO1t+jLuIOQdOMRp4APB7uZ4vSjspzp5y6YDtDs4VzUSTbWzBFZ/LKJhnyFOKw==\"\n        )\n      )\n    ),\n    cached_dependency(\n      name = \"search\",\n      version = \"1.0.0\",\n      files = list(\n        list(\n          url = \"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.min.js\",\n          integrity = \"sha512-KnvCNMwWBGCfxdOtUpEtYgoM59HHgjHnsVGSxxgz7QH1DYeURk+am9p3J+gsOevfE29DV0V+/Dd52ykTKxN5fA==\"\n        ),\n        list(\n          url = \"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\",\n          integrity = \"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\"\n        ),\n        list(\n          url = \"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\",\n          integrity = \"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\"\n        )\n      )\n    )\n  ))\n}\n\ncached_dependency <- function(name, version, files) {\n  cache_dir <- path(tools::R_user_dir(\"pkgdown\", \"cache\"), name, version)\n  dir_create(cache_dir)\n\n  for (file in files) {\n    cache_path <- path(cache_dir, path_file(file$url))\n    if (!file_exists(cache_path)) {\n      utils::download.file(file$url, cache_path, quiet = TRUE, mode = \"wb\")\n      check_integrity(cache_path, file$integrity)\n    }\n  }\n  dep_files <- path_rel(dir_ls(cache_dir), cache_dir)\n\n  htmltools::htmlDependency(\n    name = name,\n    version = version,\n    src = cache_dir,\n    script = dep_files[path_ext(dep_files) == \"js\"],\n    stylesheet = dep_files[path_ext(dep_files) == \"css\"]\n  )\n}\n\ncheck_integrity <- function(path, integrity) {\n  parsed <- parse_integrity(integrity)\n  if (!parsed$size %in% c(256L, 384L, 512L)) {\n    cli::cli_abort(\n      \"{.field integrity} must use SHA-256, SHA-384, or SHA-512\",\n      .internal = TRUE\n    )\n  }\n\n  hash <- compute_hash(path, parsed$size)\n  if (hash != parsed$hash) {\n    cli::cli_abort(\n      \"Downloaded asset does not match known integrity\",\n      .internal = TRUE\n    )\n  }\n\n  invisible()\n}\n\ncompute_hash <- function(path, size) {\n  con <- file(path, encoding = \"UTF-8\")\n  openssl::base64_encode(openssl::sha2(con, size))\n}\n\nparse_integrity <- function(x) {\n  size <- as.integer(regmatches(x, regexpr(\"(?<=^sha)\\\\d{3}\", x, perl = TRUE)))\n  hash <- regmatches(x, regexpr(\"(?<=^sha\\\\d{3}-).+\", x, perl = TRUE))\n\n  list(size = size, hash = hash)\n}\n"
  },
  {
    "path": "R/figure.R",
    "content": "fig_save <- function(\n  plot,\n  name,\n  dev = \"ragg::agg_png\",\n  dpi = 96L,\n  dev.args = list(),\n  fig.ext = \"png\",\n  fig.width = 700 / 96,\n  fig.height = NULL,\n  fig.retina = 2L,\n  fig.asp = 1 / 1.618, # golden ratio\n  bg = NULL,\n  other.parameters = list()\n) {\n  path <- paste0(name, \".\", fig.ext)\n  dev <- match_fun(dev)\n\n  if (is.null(fig.height)) {\n    fig.height <- fig.width * fig.asp\n  } else if (is.null(fig.width)) {\n    fig.width <- fig.height / fig.asp\n  }\n  width <- round(dpi * fig.width)\n  height <- round(dpi * fig.height)\n\n  has_res <- \"res\" %in% names(formals(dev))\n  if (has_res) {\n    # raster device; units in pixels, need to rescale for retina\n    args <- list(\n      path, # some devices use file and some use filename\n      width = width * fig.retina,\n      height = height * fig.retina,\n      res = dpi * fig.retina\n    )\n  } else {\n    # vector device; units in inches; no need to rescale\n    args <- list(\n      path,\n      width = fig.width,\n      height = fig.height\n    )\n  }\n\n  # NB: bg is always set to transparent here; it takes effect during\n  # recording in highlight_examples()\n  dev.args$bg <- NA\n\n  with_device(dev, c(args, dev.args), plot)\n\n  list(path = path, width = width, height = height)\n}\n\nfig_save_args <- function() {\n  # Avoid having multiple copies of the default settings\n  default <- formals(fig_save)\n  default$plot <- NULL\n  default$name <- NULL\n  default <- lapply(default, eval, baseenv())\n  default\n}\n\nmeta_figures <- function(pkg) {\n  default <- fig_save_args()\n  figures <- config_pluck_list(pkg, \"figures\")\n\n  print_yaml(modify_list(default, figures))\n}\n\n#' Get current settings for figures\n#'\n#' @description\n#' You will generally not need to use this function unless you are handling\n#' custom plot output.\n#'\n#' Packages needing custom parameters should ask users to place them within\n#' the `other.parameters` entry under the package name, e.g.\n#' ```\n#' figures:\n#'   other.parameters:\n#'     rgl:\n#'       fig.asp: 1\n#' ```\n#'\n#' @return\n#' A list containing the entries from the `figures` field in `_pkgdown.yml`\n#' (see [build_reference()]), with default values added. Computed `width` and\n#' `height` values (in pixels) are also included.\n#' @export\n#' @keywords internal\nfig_settings <- function() {\n  result <- fig_save_args()\n\n  # The context might not be initialized.\n  settings <- tryCatch(context_get(\"figures\"), error = function(e) NULL)\n  result[names(settings)] <- settings\n\n  if (is.null(result$fig.height)) {\n    result$fig.height <- result$fig.width * result$fig.asp\n  } else if (is.null(result$fig.width)) {\n    result$fig.width <- result$fig.height / result$fig.asp\n  }\n  result\n}\n\nwith_device <- function(dev, dev.args, plot) {\n  do.call(dev, dev.args)\n  on.exit(grDevices::dev.off())\n\n  print(plot)\n}\n\nfig_opts_chunk <- function(figures, default) {\n  figures$dev <- fun_name(figures$dev)\n\n  # fig.asp beats fig.height in knitr, so if it's provided only use\n  # it to override the default height\n  if (!is.null(figures$fig.asp) && is.null(figures$fig.height)) {\n    figures$fig.height <- figures$fig.width * figures$fig.asp\n    figures$fig.asp <- NULL\n  }\n\n  # Copy background into dev.args\n  figures$dev.args <- figures$dev.args %||% list()\n  figures$dev.args$bg <- figures$bg %||% NA\n\n  # Default figure class for rendered images\n  # Same class as added by downlit\n  figures$fig.class <- figures$fig.class %||% \"r-plt\"\n\n  modify_list(default, figures)\n}\n\n# Find graphics device ----------------------------------------------------\n\nmatch_fun <- function(x) {\n  if (is.function(x)) {\n    x\n  } else if (is.character(x) && length(x) == 1) {\n    e <- parse_expr(x)\n    f <- eval(e, globalenv())\n\n    if (!is.function(f)) {\n      cli::cli_abort(\n        \"{.var x} must evaluate to a function\",\n        call = caller_env()\n      )\n    }\n\n    f\n  } else {\n    cli::cli_abort(\"{.var x} must be a function or string\", call = caller_env())\n  }\n}\n\n# knitr only takes a function name - user will need to load package\nfun_name <- function(x) {\n  if (x == \"ragg::agg_png\") {\n    return(\"ragg_png\")\n  }\n\n  expr <- parse_expr(x)\n  if (is_symbol(expr)) {\n    x\n  } else if (is_call(expr, \"::\")) {\n    as.character(expr[[3]])\n  } else {\n    cli::cli_abort(\"Unknown input\", call = caller_env())\n  }\n}\n"
  },
  {
    "path": "R/highlight.R",
    "content": "# highligh_text() and highlight_examples() are only used for usage\n# and examples, and are specifically excluded in tweak_reference_highlighting()\nhighlight_text <- function(text) {\n  out <- downlit::highlight(text, classes = downlit::classes_pandoc())\n  if (!is.na(out)) {\n    sourceCode(pre(out, r_code = TRUE))\n  } else {\n    sourceCode(pre(escape_html(text)))\n  }\n}\n\nhighlight_examples <- function(code, topic, env = globalenv()) {\n  bg <- fig_settings()$bg %||% NA\n\n  # some options from testthat::local_reproducible_output()\n  # https://github.com/r-lib/testthat/blob/47935141d430e002070a95dd8af6dbf70def0994/R/local.R#L86\n  withr::local_options(list(\n    device = function(...) ragg::agg_png(..., bg = bg),\n    rlang_interactive = FALSE,\n    cli.num_colors = 256,\n    cli.dynamic = FALSE\n  ))\n  withr::local_envvar(RSTUDIO = NA)\n  withr::local_collate(\"C\")\n\n  fig_save_topic <- function(plot, id) {\n    name <- paste0(topic, \"-\", id)\n    do.call(fig_save, c(list(plot, name), fig_settings()))\n  }\n\n  hide_dontshow <- function(src, expr) {\n    if (is.expression(expr)) {\n      # evaluate 1.0.0\n      if (length(expr) > 0) {\n        hide <- is_call(expr[[1]], c(\"DONTSHOW\", \"TESTONLY\"))\n      } else {\n        hide <- FALSE\n      }\n    } else if (is.call(expr)) {\n      # evaluate 0.24.0\n      hide <- is_call(expr, c(\"DONTSHOW\", \"TESTONLY\"))\n    } else {\n      hide <- FALSE\n    }\n\n    if (hide) NULL else src\n  }\n  handler <- evaluate::new_output_handler(\n    value = pkgdown_print,\n    source = hide_dontshow\n  )\n\n  eval_env <- child_env(env)\n  eval_env$DONTSHOW <- function(x) invisible(x)\n  eval_env$TESTONLY <- function(x) invisible()\n\n  out <- downlit::evaluate_and_highlight(\n    code,\n    fig_save = fig_save_topic,\n    env = eval_env,\n    output_handler = handler\n  )\n  structure(\n    sourceCode(pre(out, r_code = TRUE)),\n    dependencies = attr(out, \"dependencies\")\n  )\n}\n\npre <- function(x, r_code = FALSE) {\n  paste0(\n    \"<pre\",\n    if (r_code) \" class='sourceCode r'\",\n    \">\",\n    \"<code>\",\n    x,\n    \"</code>\",\n    \"</pre>\"\n  )\n}\n\nsourceCode <- function(x) {\n  paste0(\"<div class='sourceCode'>\", x, \"</div>\")\n}\n"
  },
  {
    "path": "R/html-build.R",
    "content": "a <- function(text, href) {\n  ifelse(is.na(href), text, paste0(\"<a href='\", href, \"'>\", text, \"</a>\"))\n}\n\nlink_url <- function(text, href) {\n  if (!is.null(href)) {\n    paste0(\"<a href='\", href, \"'>\", text, \"</a>\")\n  }\n}\n\nlinkify <- function(text) {\n  text <- escape_html(text)\n  text <- gsub(\n    \"&lt;doi:([^&]+)&gt;\", # DOIs with < > & are not supported\n    \"&lt;<a href='https://doi.org/\\\\1'>doi:\\\\1</a>&gt;\",\n    text,\n    ignore.case = TRUE\n  )\n  text <- gsub(\n    \"&lt;arXiv:([^&]+)&gt;\",\n    \"&lt;<a href='https://arxiv.org/abs/\\\\1'>arXiv:\\\\1</a>&gt;\",\n    text,\n    ignore.case = TRUE\n  )\n  text <- gsub(\n    \"&lt;((http|ftp)[^&]+)&gt;\", # URIs with & are not supported\n    \"&lt;<a href='\\\\1'>\\\\1</a>&gt;\",\n    text\n  )\n  text\n}\n\ndont_index <- function(x) {\n  paste0(\"<div class='dont-index'>\", x, \"</div>\")\n}\n\nescape_html <- function(x) {\n  x <- gsub(\"&\", \"&amp;\", x)\n  x <- gsub(\"<\", \"&lt;\", x)\n  x <- gsub(\">\", \"&gt;\", x)\n  # x <- gsub(\"'\", \"&#39;\", x)\n  # x <- gsub(\"\\\"\", \"&quot;\", x)\n  x\n}\n\nstrip_html_tags <- function(x) gsub(\"<.*?>\", \"\", x)\n"
  },
  {
    "path": "R/import-standalone-obj-type.R",
    "content": "# Standalone file: do not edit by hand\n# Source: https://github.com/r-lib/rlang/blob/HEAD/R/standalone-obj-type.R\n# Generated by: usethis::use_standalone(\"r-lib/rlang\", \"obj-type\")\n# ----------------------------------------------------------------------\n#\n# ---\n# repo: r-lib/rlang\n# file: standalone-obj-type.R\n# last-updated: 2024-02-14\n# license: https://unlicense.org\n# imports: rlang (>= 1.1.0)\n# ---\n#\n# ## Changelog\n#\n# 2024-02-14:\n# - `obj_type_friendly()` now works for S7 objects.\n#\n# 2023-05-01:\n# - `obj_type_friendly()` now only displays the first class of S3 objects.\n#\n# 2023-03-30:\n# - `stop_input_type()` now handles `I()` input literally in `arg`.\n#\n# 2022-10-04:\n# - `obj_type_friendly(value = TRUE)` now shows numeric scalars\n#   literally.\n# - `stop_friendly_type()` now takes `show_value`, passed to\n#   `obj_type_friendly()` as the `value` argument.\n#\n# 2022-10-03:\n# - Added `allow_na` and `allow_null` arguments.\n# - `NULL` is now backticked.\n# - Better friendly type for infinities and `NaN`.\n#\n# 2022-09-16:\n# - Unprefixed usage of rlang functions with `rlang::` to\n#   avoid onLoad issues when called from rlang (#1482).\n#\n# 2022-08-11:\n# - Prefixed usage of rlang functions with `rlang::`.\n#\n# 2022-06-22:\n# - `friendly_type_of()` is now `obj_type_friendly()`.\n# - Added `obj_type_oo()`.\n#\n# 2021-12-20:\n# - Added support for scalar values and empty vectors.\n# - Added `stop_input_type()`\n#\n# 2021-06-30:\n# - Added support for missing arguments.\n#\n# 2021-04-19:\n# - Added support for matrices and arrays (#141).\n# - Added documentation.\n# - Added changelog.\n#\n# nocov start\n\n#' Return English-friendly type\n#' @param x Any R object.\n#' @param value Whether to describe the value of `x`. Special values\n#'   like `NA` or `\"\"` are always described.\n#' @param length Whether to mention the length of vectors and lists.\n#' @return A string describing the type. Starts with an indefinite\n#'   article, e.g. \"an integer vector\".\n#' @noRd\nobj_type_friendly <- function(x, value = TRUE) {\n  if (is_missing(x)) {\n    return(\"absent\")\n  }\n\n  if (is.object(x)) {\n    if (inherits(x, \"quosure\")) {\n      type <- \"quosure\"\n    } else {\n      type <- class(x)[[1L]]\n    }\n    return(sprintf(\"a <%s> object\", type))\n  }\n\n  if (!is_vector(x)) {\n    return(.rlang_as_friendly_type(typeof(x)))\n  }\n\n  n_dim <- length(dim(x))\n\n  if (!n_dim) {\n    if (!is_list(x) && length(x) == 1) {\n      if (is_na(x)) {\n        return(switch(\n          typeof(x),\n          logical = \"`NA`\",\n          integer = \"an integer `NA`\",\n          double = if (is.nan(x)) {\n            \"`NaN`\"\n          } else {\n            \"a numeric `NA`\"\n          },\n          complex = \"a complex `NA`\",\n          character = \"a character `NA`\",\n          .rlang_stop_unexpected_typeof(x)\n        ))\n      }\n\n      show_infinites <- function(x) {\n        if (x > 0) {\n          \"`Inf`\"\n        } else {\n          \"`-Inf`\"\n        }\n      }\n      str_encode <- function(x, width = 30, ...) {\n        if (nchar(x) > width) {\n          x <- substr(x, 1, width - 3)\n          x <- paste0(x, \"...\")\n        }\n        encodeString(x, ...)\n      }\n\n      if (value) {\n        if (is.numeric(x) && is.infinite(x)) {\n          return(show_infinites(x))\n        }\n\n        if (is.numeric(x) || is.complex(x)) {\n          number <- as.character(round(x, 2))\n          what <- if (is.complex(x)) \"the complex number\" else \"the number\"\n          return(paste(what, number))\n        }\n\n        return(switch(\n          typeof(x),\n          logical = if (x) \"`TRUE`\" else \"`FALSE`\",\n          character = {\n            what <- if (nzchar(x)) \"the string\" else \"the empty string\"\n            paste(what, str_encode(x, quote = \"\\\"\"))\n          },\n          raw = paste(\"the raw value\", as.character(x)),\n          .rlang_stop_unexpected_typeof(x)\n        ))\n      }\n\n      return(switch(\n        typeof(x),\n        logical = \"a logical value\",\n        integer = \"an integer\",\n        double = if (is.infinite(x)) show_infinites(x) else \"a number\",\n        complex = \"a complex number\",\n        character = if (nzchar(x)) \"a string\" else \"\\\"\\\"\",\n        raw = \"a raw value\",\n        .rlang_stop_unexpected_typeof(x)\n      ))\n    }\n\n    if (length(x) == 0) {\n      return(switch(\n        typeof(x),\n        logical = \"an empty logical vector\",\n        integer = \"an empty integer vector\",\n        double = \"an empty numeric vector\",\n        complex = \"an empty complex vector\",\n        character = \"an empty character vector\",\n        raw = \"an empty raw vector\",\n        list = \"an empty list\",\n        .rlang_stop_unexpected_typeof(x)\n      ))\n    }\n  }\n\n  vec_type_friendly(x)\n}\n\nvec_type_friendly <- function(x, length = FALSE) {\n  if (!is_vector(x)) {\n    abort(\"`x` must be a vector.\")\n  }\n  type <- typeof(x)\n  n_dim <- length(dim(x))\n\n  add_length <- function(type) {\n    if (length && !n_dim) {\n      paste0(type, sprintf(\" of length %s\", length(x)))\n    } else {\n      type\n    }\n  }\n\n  if (type == \"list\") {\n    if (n_dim < 2) {\n      return(add_length(\"a list\"))\n    } else if (is.data.frame(x)) {\n      return(\"a data frame\")\n    } else if (n_dim == 2) {\n      return(\"a list matrix\")\n    } else {\n      return(\"a list array\")\n    }\n  }\n\n  type <- switch(\n    type,\n    logical = \"a logical %s\",\n    integer = \"an integer %s\",\n    numeric = ,\n    double = \"a double %s\",\n    complex = \"a complex %s\",\n    character = \"a character %s\",\n    raw = \"a raw %s\",\n    type = paste0(\"a \", type, \" %s\")\n  )\n\n  if (n_dim < 2) {\n    kind <- \"vector\"\n  } else if (n_dim == 2) {\n    kind <- \"matrix\"\n  } else {\n    kind <- \"array\"\n  }\n  out <- sprintf(type, kind)\n\n  if (n_dim >= 2) {\n    out\n  } else {\n    add_length(out)\n  }\n}\n\n.rlang_as_friendly_type <- function(type) {\n  switch(\n    type,\n\n    list = \"a list\",\n\n    NULL = \"`NULL`\",\n    environment = \"an environment\",\n    externalptr = \"a pointer\",\n    weakref = \"a weak reference\",\n    S4 = \"an S4 object\",\n\n    name = ,\n    symbol = \"a symbol\",\n    language = \"a call\",\n    pairlist = \"a pairlist node\",\n    expression = \"an expression vector\",\n\n    char = \"an internal string\",\n    promise = \"an internal promise\",\n    ... = \"an internal dots object\",\n    any = \"an internal `any` object\",\n    bytecode = \"an internal bytecode object\",\n\n    primitive = ,\n    builtin = ,\n    special = \"a primitive function\",\n    closure = \"a function\",\n\n    type\n  )\n}\n\n.rlang_stop_unexpected_typeof <- function(x, call = caller_env()) {\n  abort(\n    sprintf(\"Unexpected type <%s>.\", typeof(x)),\n    call = call\n  )\n}\n\n#' Return OO type\n#' @param x Any R object.\n#' @return One of `\"bare\"` (for non-OO objects), `\"S3\"`, `\"S4\"`,\n#'   `\"R6\"`, or `\"S7\"`.\n#' @noRd\nobj_type_oo <- function(x) {\n  if (!is.object(x)) {\n    return(\"bare\")\n  }\n\n  class <- inherits(x, c(\"R6\", \"S7_object\"), which = TRUE)\n\n  if (class[[1]]) {\n    \"R6\"\n  } else if (class[[2]]) {\n    \"S7\"\n  } else if (isS4(x)) {\n    \"S4\"\n  } else {\n    \"S3\"\n  }\n}\n\n#' @param x The object type which does not conform to `what`. Its\n#'   `obj_type_friendly()` is taken and mentioned in the error message.\n#' @param what The friendly expected type as a string. Can be a\n#'   character vector of expected types, in which case the error\n#'   message mentions all of them in an \"or\" enumeration.\n#' @param show_value Passed to `value` argument of `obj_type_friendly()`.\n#' @param ... Arguments passed to [abort()].\n#' @inheritParams args_error_context\n#' @noRd\nstop_input_type <- function(\n  x,\n  what,\n  ...,\n  allow_na = FALSE,\n  allow_null = FALSE,\n  show_value = TRUE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  # From standalone-cli.R\n  cli <- env_get_list(\n    nms = c(\"format_arg\", \"format_code\"),\n    last = topenv(),\n    default = function(x) sprintf(\"`%s`\", x),\n    inherit = TRUE\n  )\n\n  if (allow_na) {\n    what <- c(what, cli$format_code(\"NA\"))\n  }\n  if (allow_null) {\n    what <- c(what, cli$format_code(\"NULL\"))\n  }\n  if (length(what)) {\n    what <- oxford_comma(what)\n  }\n  if (inherits(arg, \"AsIs\")) {\n    format_arg <- identity\n  } else {\n    format_arg <- cli$format_arg\n  }\n\n  message <- sprintf(\n    \"%s must be %s, not %s.\",\n    format_arg(arg),\n    what,\n    obj_type_friendly(x, value = show_value)\n  )\n\n  abort(message, ..., call = call, arg = arg)\n}\n\noxford_comma <- function(chr, sep = \", \", final = \"or\") {\n  n <- length(chr)\n\n  if (n < 2) {\n    return(chr)\n  }\n\n  head <- chr[seq_len(n - 1)]\n  last <- chr[n]\n\n  head <- paste(head, collapse = sep)\n\n  # Write a or b. But a, b, or c.\n  if (n > 2) {\n    paste0(head, sep, final, \" \", last)\n  } else {\n    paste0(head, \" \", final, \" \", last)\n  }\n}\n\n# nocov end\n"
  },
  {
    "path": "R/import-standalone-types-check.R",
    "content": "# Standalone file: do not edit by hand\n# Source: https://github.com/r-lib/rlang/blob/HEAD/R/standalone-types-check.R\n# Generated by: usethis::use_standalone(\"r-lib/rlang\", \"types-check\")\n# ----------------------------------------------------------------------\n#\n# ---\n# repo: r-lib/rlang\n# file: standalone-types-check.R\n# last-updated: 2023-03-13\n# license: https://unlicense.org\n# dependencies: standalone-obj-type.R\n# imports: rlang (>= 1.1.0)\n# ---\n#\n# ## Changelog\n#\n# 2024-08-15:\n# - `check_character()` gains an `allow_na` argument (@martaalcalde, #1724)\n#\n# 2023-03-13:\n# - Improved error messages of number checkers (@teunbrand)\n# - Added `allow_infinite` argument to `check_number_whole()` (@mgirlich).\n# - Added `check_data_frame()` (@mgirlich).\n#\n# 2023-03-07:\n# - Added dependency on rlang (>= 1.1.0).\n#\n# 2023-02-15:\n# - Added `check_logical()`.\n#\n# - `check_bool()`, `check_number_whole()`, and\n#   `check_number_decimal()` are now implemented in C.\n#\n# - For efficiency, `check_number_whole()` and\n#   `check_number_decimal()` now take a `NULL` default for `min` and\n#   `max`. This makes it possible to bypass unnecessary type-checking\n#   and comparisons in the default case of no bounds checks.\n#\n# 2022-10-07:\n# - `check_number_whole()` and `_decimal()` no longer treat\n#   non-numeric types such as factors or dates as numbers.  Numeric\n#   types are detected with `is.numeric()`.\n#\n# 2022-10-04:\n# - Added `check_name()` that forbids the empty string.\n#   `check_string()` allows the empty string by default.\n#\n# 2022-09-28:\n# - Removed `what` arguments.\n# - Added `allow_na` and `allow_null` arguments.\n# - Added `allow_decimal` and `allow_infinite` arguments.\n# - Improved errors with absent arguments.\n#\n#\n# 2022-09-16:\n# - Unprefixed usage of rlang functions with `rlang::` to\n#   avoid onLoad issues when called from rlang (#1482).\n#\n# 2022-08-11:\n# - Added changelog.\n#\n# nocov start\n\n# Scalars -----------------------------------------------------------------\n\n.standalone_types_check_dot_call <- .Call\n\ncheck_bool <- function(\n  x,\n  ...,\n  allow_na = FALSE,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (\n    !missing(x) &&\n      .standalone_types_check_dot_call(\n        ffi_standalone_is_bool_1.0.7,\n        x,\n        allow_na,\n        allow_null\n      )\n  ) {\n    return(invisible(NULL))\n  }\n\n  stop_input_type(\n    x,\n    c(\"`TRUE`\", \"`FALSE`\"),\n    ...,\n    allow_na = allow_na,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\ncheck_string <- function(\n  x,\n  ...,\n  allow_empty = TRUE,\n  allow_na = FALSE,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (!missing(x)) {\n    is_string <- .rlang_check_is_string(\n      x,\n      allow_empty = allow_empty,\n      allow_na = allow_na,\n      allow_null = allow_null\n    )\n    if (is_string) {\n      return(invisible(NULL))\n    }\n  }\n\n  stop_input_type(\n    x,\n    \"a single string\",\n    ...,\n    allow_na = allow_na,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\n.rlang_check_is_string <- function(x, allow_empty, allow_na, allow_null) {\n  if (is_string(x)) {\n    if (allow_empty || !is_string(x, \"\")) {\n      return(TRUE)\n    }\n  }\n\n  if (allow_null && is_null(x)) {\n    return(TRUE)\n  }\n\n  if (allow_na && (identical(x, NA) || identical(x, na_chr))) {\n    return(TRUE)\n  }\n\n  FALSE\n}\n\ncheck_name <- function(\n  x,\n  ...,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (!missing(x)) {\n    is_string <- .rlang_check_is_string(\n      x,\n      allow_empty = FALSE,\n      allow_na = FALSE,\n      allow_null = allow_null\n    )\n    if (is_string) {\n      return(invisible(NULL))\n    }\n  }\n\n  stop_input_type(\n    x,\n    \"a valid name\",\n    ...,\n    allow_na = FALSE,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\nIS_NUMBER_true <- 0\nIS_NUMBER_false <- 1\nIS_NUMBER_oob <- 2\n\ncheck_number_decimal <- function(\n  x,\n  ...,\n  min = NULL,\n  max = NULL,\n  allow_infinite = TRUE,\n  allow_na = FALSE,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (missing(x)) {\n    exit_code <- IS_NUMBER_false\n  } else if (\n    0 ==\n      (exit_code <- .standalone_types_check_dot_call(\n        ffi_standalone_check_number_1.0.7,\n        x,\n        allow_decimal = TRUE,\n        min,\n        max,\n        allow_infinite,\n        allow_na,\n        allow_null\n      ))\n  ) {\n    return(invisible(NULL))\n  }\n\n  .stop_not_number(\n    x,\n    ...,\n    exit_code = exit_code,\n    allow_decimal = TRUE,\n    min = min,\n    max = max,\n    allow_na = allow_na,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\ncheck_number_whole <- function(\n  x,\n  ...,\n  min = NULL,\n  max = NULL,\n  allow_infinite = FALSE,\n  allow_na = FALSE,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (missing(x)) {\n    exit_code <- IS_NUMBER_false\n  } else if (\n    0 ==\n      (exit_code <- .standalone_types_check_dot_call(\n        ffi_standalone_check_number_1.0.7,\n        x,\n        allow_decimal = FALSE,\n        min,\n        max,\n        allow_infinite,\n        allow_na,\n        allow_null\n      ))\n  ) {\n    return(invisible(NULL))\n  }\n\n  .stop_not_number(\n    x,\n    ...,\n    exit_code = exit_code,\n    allow_decimal = FALSE,\n    min = min,\n    max = max,\n    allow_na = allow_na,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\n.stop_not_number <- function(\n  x,\n  ...,\n  exit_code,\n  allow_decimal,\n  min,\n  max,\n  allow_na,\n  allow_null,\n  arg,\n  call\n) {\n  if (allow_decimal) {\n    what <- \"a number\"\n  } else {\n    what <- \"a whole number\"\n  }\n\n  if (exit_code == IS_NUMBER_oob) {\n    min <- min %||% -Inf\n    max <- max %||% Inf\n\n    if (min > -Inf && max < Inf) {\n      what <- sprintf(\"%s between %s and %s\", what, min, max)\n    } else if (x < min) {\n      what <- sprintf(\"%s larger than or equal to %s\", what, min)\n    } else if (x > max) {\n      what <- sprintf(\"%s smaller than or equal to %s\", what, max)\n    } else {\n      abort(\"Unexpected state in OOB check\", .internal = TRUE)\n    }\n  }\n\n  stop_input_type(\n    x,\n    what,\n    ...,\n    allow_na = allow_na,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\ncheck_symbol <- function(\n  x,\n  ...,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (!missing(x)) {\n    if (is_symbol(x)) {\n      return(invisible(NULL))\n    }\n    if (allow_null && is_null(x)) {\n      return(invisible(NULL))\n    }\n  }\n\n  stop_input_type(\n    x,\n    \"a symbol\",\n    ...,\n    allow_na = FALSE,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\ncheck_arg <- function(\n  x,\n  ...,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (!missing(x)) {\n    if (is_symbol(x)) {\n      return(invisible(NULL))\n    }\n    if (allow_null && is_null(x)) {\n      return(invisible(NULL))\n    }\n  }\n\n  stop_input_type(\n    x,\n    \"an argument name\",\n    ...,\n    allow_na = FALSE,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\ncheck_call <- function(\n  x,\n  ...,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (!missing(x)) {\n    if (is_call(x)) {\n      return(invisible(NULL))\n    }\n    if (allow_null && is_null(x)) {\n      return(invisible(NULL))\n    }\n  }\n\n  stop_input_type(\n    x,\n    \"a defused call\",\n    ...,\n    allow_na = FALSE,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\ncheck_environment <- function(\n  x,\n  ...,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (!missing(x)) {\n    if (is_environment(x)) {\n      return(invisible(NULL))\n    }\n    if (allow_null && is_null(x)) {\n      return(invisible(NULL))\n    }\n  }\n\n  stop_input_type(\n    x,\n    \"an environment\",\n    ...,\n    allow_na = FALSE,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\ncheck_function <- function(\n  x,\n  ...,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (!missing(x)) {\n    if (is_function(x)) {\n      return(invisible(NULL))\n    }\n    if (allow_null && is_null(x)) {\n      return(invisible(NULL))\n    }\n  }\n\n  stop_input_type(\n    x,\n    \"a function\",\n    ...,\n    allow_na = FALSE,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\ncheck_closure <- function(\n  x,\n  ...,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (!missing(x)) {\n    if (is_closure(x)) {\n      return(invisible(NULL))\n    }\n    if (allow_null && is_null(x)) {\n      return(invisible(NULL))\n    }\n  }\n\n  stop_input_type(\n    x,\n    \"an R function\",\n    ...,\n    allow_na = FALSE,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\ncheck_formula <- function(\n  x,\n  ...,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (!missing(x)) {\n    if (is_formula(x)) {\n      return(invisible(NULL))\n    }\n    if (allow_null && is_null(x)) {\n      return(invisible(NULL))\n    }\n  }\n\n  stop_input_type(\n    x,\n    \"a formula\",\n    ...,\n    allow_na = FALSE,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\n\n# Vectors -----------------------------------------------------------------\n\n# TODO: Figure out what to do with logical `NA` and `allow_na = TRUE`\n\ncheck_character <- function(\n  x,\n  ...,\n  allow_na = TRUE,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (!missing(x)) {\n    if (is_character(x)) {\n      if (!allow_na && any(is.na(x))) {\n        abort(\n          sprintf(\"`%s` can't contain NA values.\", arg),\n          arg = arg,\n          call = call\n        )\n      }\n\n      return(invisible(NULL))\n    }\n\n    if (allow_null && is_null(x)) {\n      return(invisible(NULL))\n    }\n  }\n\n  stop_input_type(\n    x,\n    \"a character vector\",\n    ...,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\ncheck_logical <- function(\n  x,\n  ...,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (!missing(x)) {\n    if (is_logical(x)) {\n      return(invisible(NULL))\n    }\n    if (allow_null && is_null(x)) {\n      return(invisible(NULL))\n    }\n  }\n\n  stop_input_type(\n    x,\n    \"a logical vector\",\n    ...,\n    allow_na = FALSE,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\ncheck_data_frame <- function(\n  x,\n  ...,\n  allow_null = FALSE,\n  arg = caller_arg(x),\n  call = caller_env()\n) {\n  if (!missing(x)) {\n    if (is.data.frame(x)) {\n      return(invisible(NULL))\n    }\n    if (allow_null && is_null(x)) {\n      return(invisible(NULL))\n    }\n  }\n\n  stop_input_type(\n    x,\n    \"a data frame\",\n    ...,\n    allow_null = allow_null,\n    arg = arg,\n    call = call\n  )\n}\n\n# nocov end\n"
  },
  {
    "path": "R/init.R",
    "content": "#' Initialise site infrastructure\n#'\n#' @description\n#' `init_site()`:\n#'\n#' * creates the output directory (`docs/`),\n#' * generates a machine readable description of the site, used for autolinking,\n#' * copies CSS/JS assets and extra files, and\n#' * runs `build_favicons()`, if needed.\n#'\n#' Typically, you will not need to call this function directly, as all `build_*()`\n#' functions will run `init_site()` if needed.\n#'\n#' The only good reasons to call `init_site()` directly are the following:\n#' * If you add or modify a package logo.\n#' * If you add or modify `pkgdown/extra.scss`.\n#' * If you modify `template.bslib` variables in `_pkgdown.yml`.\n#'\n#' See `vignette(\"customise\")` for the various ways you can customise the\n#' display of your site.\n#'\n#' # Build-ignored files\n#' We recommend using [usethis::use_pkgdown_github_pages()] to build-ignore `docs/` and\n#' `_pkgdown.yml`. If use another directory, or create the site manually,\n#' you'll need to add them to `.Rbuildignore` yourself. A `NOTE` about\n#' an unexpected file during `R CMD CHECK` is an indication you have not\n#' correctly ignored these files.\n#'\n#' @inheritParams build_articles\n#' @export\ninit_site <- function(pkg = \".\", override = list()) {\n  # This is the only user facing function that doesn't call section_init()\n  # because section_init() can conditionally call init_site()\n  rstudio_save_all()\n  cache_cli_colours()\n  pkg <- as_pkgdown(pkg, override = override)\n\n  cli::cli_rule(\"Initialising site\")\n  dir_create(pkg$dst_path)\n\n  copy_assets(pkg)\n  if (pkg$bs_version > 3) {\n    build_bslib(pkg)\n  }\n\n  # Building favicons is expensive, so we hopefully only do it once, locally\n  if (has_logo(pkg) && !has_favicons(pkg) && !on_ci()) {\n    build_favicons(pkg)\n  }\n  copy_favicons(pkg)\n  copy_logo(pkg)\n\n  build_site_meta(pkg)\n\n  invisible()\n}\n\ncopy_assets <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n  template <- config_pluck(pkg, \"template\")\n\n  # pkgdown assets\n  if (!identical(template$default_assets, FALSE)) {\n    copy_asset_dir(\n      pkg,\n      path_pkgdown(paste0(\"BS\", pkg$bs_version, \"/\", \"assets\")),\n      src_root = path_pkgdown(),\n      src_label = \"<pkgdown>/\"\n    )\n  }\n\n  # package assets\n  if (!is.null(template$package)) {\n    copy_asset_dir(\n      pkg,\n      path_package_pkgdown(\"assets\", template$package, pkg$bs_version),\n      src_root = system_file(package = template$package),\n      src_label = paste0(\"<\", template$package, \">/\")\n    )\n  }\n\n  # extras\n  copy_asset_dir(pkg, \"pkgdown\", file_regexp = \"^extra\")\n  # site assets\n  copy_asset_dir(pkg, \"pkgdown/assets\")\n\n  invisible()\n}\n\ncopy_asset_dir <- function(\n  pkg,\n  dir,\n  src_root = pkg$src_path,\n  src_label = \"\",\n  file_regexp = NULL\n) {\n  src_dir <- path_abs(dir, pkg$src_path)\n  if (!file_exists(src_dir)) {\n    return(character())\n  }\n\n  src_paths <- dir_ls(src_dir, recurse = TRUE)\n  src_paths <- src_paths[!is_dir(src_paths)]\n  if (!is.null(file_regexp)) {\n    src_paths <- src_paths[grepl(file_regexp, path_file(src_paths))]\n  }\n  src_paths <- src_paths[path_ext(src_paths) != \"scss\"] # Handled in bs_theme()\n\n  dst_paths <- path(pkg$dst_path, path_rel(src_paths, src_dir))\n\n  file_copy_to(\n    src_paths = src_paths,\n    src_root = src_root,\n    src_label = src_label,\n    dst_paths = dst_paths,\n    dst_root = pkg$dst_path\n  )\n}\n\ntimestamp <- function(time = Sys.time()) {\n  attr(time, \"tzone\") <- \"UTC\"\n  strftime(time, \"%Y-%m-%dT%H:%MZ\", tz = \"UTC\")\n}\n\n# Generate site meta data file (available to website viewers)\nbuild_site_meta <- function(pkg = \".\") {\n  meta <- site_meta(pkg)\n\n  # Install pkgdown.yml to ./inst if requested,\n  install_metadata <- pkg$install_metadata %||% FALSE\n  if (install_metadata) {\n    path_meta <- path(pkg$src_path, \"inst\", \"pkgdown.yml\")\n\n    dir_create(path_dir(path_meta))\n    write_yaml(meta, path_meta)\n  }\n\n  path_meta <- path(pkg$dst_path, \"pkgdown.yml\")\n  write_yaml(meta, path_meta)\n  invisible()\n}\n\nsite_meta <- function(pkg) {\n  article_index <- article_index(pkg)\n\n  yaml <- list(\n    pandoc = as.character(rmarkdown::pandoc_version()),\n    pkgdown = as.character(utils::packageDescription(\n      \"pkgdown\",\n      fields = \"Version\"\n    )),\n    pkgdown_sha = utils::packageDescription(\"pkgdown\")$GithubSHA1,\n    articles = as.list(article_index),\n    last_built = timestamp()\n  )\n\n  url <- config_pluck_string(pkg, \"url\")\n  if (!is.null(url)) {\n    yaml$urls <- list(\n      reference = paste0(url, \"/reference\"),\n      article = paste0(url, \"/articles\")\n    )\n  }\n\n  print_yaml(yaml)\n}\n"
  },
  {
    "path": "R/markdown.R",
    "content": "markdown_text <- function(pkg, text, ...) {\n  if (identical(text, NA_character_) || is.null(text)) {\n    return(NULL)\n  }\n\n  md_path <- withr::local_tempfile()\n  write_lines(text, md_path)\n  markdown_path_html(pkg, md_path, ...)\n}\n\nmarkdown_text_inline <- function(\n  pkg,\n  text,\n  error_path,\n  error_call = caller_env()\n) {\n  html <- markdown_text(pkg, text)\n  if (is.null(html)) {\n    return()\n  }\n\n  children <- xml2::xml_children(xml2::xml_find_first(html, \".//body\"))\n  if (length(children) > 1) {\n    msg <- \"{.field {error_path}} must be inline markdown.\"\n    config_abort(pkg, msg, call = error_call)\n  }\n\n  paste0(xml2::xml_contents(children), collapse = \"\")\n}\n\nmarkdown_text_block <- function(pkg, text, ...) {\n  html <- markdown_text(pkg, text, ...)\n  if (is.null(html)) {\n    return()\n  }\n\n  children <- xml2::xml_children(xml2::xml_find_first(html, \".//body\"))\n  paste0(as.character(children, options = character()), collapse = \"\")\n}\n\nmarkdown_body <- function(pkg, path, strip_header = FALSE) {\n  xml <- markdown_path_html(pkg, path, strip_header = strip_header)\n\n  if (is.null(xml)) {\n    return(NULL)\n  }\n\n  # Extract body of html - as.character renders as xml which adds\n  # significant whitespace in tags like pre\n  transformed_path <- withr::local_tempfile()\n  body <- xml2::xml_find_first(xml, \".//body\")\n  xml2::write_html(body, transformed_path, format = FALSE)\n\n  lines <- read_lines(transformed_path)\n  lines <- sub(\"<body>\", \"\", lines, fixed = TRUE)\n  lines <- sub(\"</body>\", \"\", lines, fixed = TRUE)\n\n  structure(\n    paste(lines, collapse = \"\\n\"),\n    title = attr(xml, \"title\")\n  )\n}\n\nmarkdown_path_html <- function(pkg, path, strip_header = FALSE) {\n  html_path <- withr::local_tempfile()\n  convert_markdown_to_html(pkg, path, html_path)\n  xml <- read_html_keep_ansi(html_path)\n  if (!inherits(xml, \"xml_node\")) {\n    return(NULL)\n  }\n\n  # Capture heading, and optionally remove\n  h1 <- xml2::xml_find_first(xml, \".//h1\")\n  title <- xml2::xml_text(h1)\n  if (strip_header) {\n    xml2::xml_remove(h1)\n  }\n\n  structure(xml, title = title)\n}\n\nmarkdown_to_html <- function(pkg, text, dedent = 4, bs_version = 3) {\n  if (dedent) {\n    text <- dedent(text, dedent)\n  }\n\n  md_path <- withr::local_tempfile()\n  html_path <- withr::local_tempfile()\n\n  write_lines(text, md_path)\n  convert_markdown_to_html(pkg, md_path, html_path)\n\n  html <- xml2::read_html(html_path, encoding = \"UTF-8\")\n  tweak_page(html, \"markdown\", list(bs_version = bs_version))\n  html\n}\n\ndedent <- function(x, n = 4) {\n  gsub(paste0(\"($|\\n)\", strrep(\" \", n)), \"\\\\1\", x, perl = TRUE)\n}\n\nconvert_markdown_to_html <- function(pkg, in_path, out_path, ...) {\n  if (rmarkdown::pandoc_available(\"2.0\")) {\n    from <- \"markdown+gfm_auto_identifiers-citations+emoji+autolink_bare_uris\"\n  } else if (rmarkdown::pandoc_available(\"1.12.3\")) {\n    from <- \"markdown_github-hard_line_breaks+tex_math_dollars+tex_math_single_backslash+header_attributes\"\n  } else {\n    if (is_testing()) {\n      testthat::skip(\"Pandoc not available\")\n    } else {\n      cli::cli_abort(\"Pandoc not available\")\n    }\n  }\n\n  rmarkdown::pandoc_convert(\n    input = in_path,\n    output = out_path,\n    from = from,\n    to = \"html\",\n    options = purrr::compact(c(\n      if (!rmarkdown::pandoc_available(\"2.0\")) \"--smart\",\n      if (rmarkdown::pandoc_available(\"2.0\")) c(\"-t\", \"html4\"),\n      \"--indented-code-classes=R\",\n      \"--section-divs\",\n      \"--wrap=none\",\n      paste0(\"--\", config_math_rendering(pkg)),\n      ...\n    ))\n  )\n\n  invisible()\n}\n\nconfig_math_rendering <- function(pkg, call = caller_env()) {\n  if (is.null(pkg)) {\n    # Special case for tweak_highlight_other() where it's too annoying to\n    # pass down the package, and it doesn't matter much anyway.\n    return(\"mathml\")\n  }\n\n  math <- config_pluck_string(\n    pkg,\n    \"template.math-rendering\",\n    default = \"mathml\",\n    call = call\n  )\n  allowed <- c(\"mathml\", \"mathjax\", \"katex\")\n\n  if (!math %in% allowed) {\n    msg <- \"{.field template.math-rendering} must be one of {allowed}, not {math}.\"\n    config_abort(pkg, msg, call = call)\n  }\n\n  math\n}\n"
  },
  {
    "path": "R/navbar-menu.R",
    "content": "# Menu constructors -----------------------------------------------------------\n\n# Helpers for use within pkgdown itself - these must stay the same as the\n# yaml structure defined in vignette(\"customise\")\nmenu_submenu <- function(text, menu, icon = NULL, label = NULL, id = NULL) {\n  if (length(menu) == 0) {\n    return()\n  } else {\n    purrr::compact(list(\n      text = text,\n      icon = icon,\n      \"aria-label\" = label,\n      id = id,\n      menu = menu\n    ))\n  }\n}\nmenu_link <- function(\n  text,\n  href,\n  target = NULL,\n  class = NULL,\n  id = NULL,\n  title = NULL\n) {\n  purrr::compact(list(\n    text = text,\n    href = href,\n    target = target,\n    class = class,\n    id = id,\n    title = title\n  ))\n}\nmenu_links <- function(text, href) {\n  purrr::map2(text, href, menu_link)\n}\nmenu_theme <- function(text, icon, theme) {\n  purrr::compact(list(text = text, theme = theme, icon = icon))\n}\n\nmenu_heading <- function(text, ...) list(text = text, ...)\nmenu_separator <- function() list(text = \"---------\")\nmenu_search <- function() list(search = list())\nmenu_icon <- function(icon, href, label) {\n  list(icon = icon, href = href, \"aria-label\" = label)\n}\n\nmenu_type <- function(x, menu_depth = 0L) {\n  if (!is.list(x) || !is_named(x)) {\n    not <- obj_type_friendly(x)\n    cli::cli_abort(\"Navbar components must be named lists, not {not}.\")\n  } else if (!is.null(x$menu)) {\n    # https://github.com/twbs/bootstrap/pull/6342\n\n    if (menu_depth > 0) {\n      cli::cli_abort(\"Nested menus are not supported.\")\n    }\n\n    \"menu\"\n  } else if (!is.null(x$text) && grepl(\"^\\\\s*-{3,}\\\\s*$\", x$text)) {\n    \"separator\"\n  } else if (!is.null(x$theme)) {\n    \"theme\"\n  } else if (!is.null(x$text) && is.null(x$href)) {\n    \"heading\"\n  } else if ((!is.null(x$text) || !is.null(x$icon)) && !is.null(x$href)) {\n    \"link\"\n  } else if (!is.null(x$search)) {\n    \"search\"\n  } else if (!is_named(x)) {\n    \"list\"\n  } else {\n    cli::cli_abort(\"Unknown navbar component with names {names(x)}.\")\n  }\n}\n\n# Menu renderers --------------------------------------------------------------\n\nnavbar_html <- function(\n  x,\n  path_depth = 0L,\n  menu_depth = 0L,\n  side = c(\"left\", \"right\")\n) {\n  if (is.null(x)) {\n    return(\"\")\n  }\n\n  side <- arg_match(side)\n  type <- menu_type(x, menu_depth = menu_depth)\n\n  text <- switch(\n    type,\n    menu = navbar_html_menu(\n      x,\n      menu_depth = menu_depth,\n      path_depth = path_depth,\n      side = side\n    ),\n    heading = navbar_html_heading(x),\n    link = navbar_html_link(x, menu_depth = menu_depth),\n    separator = navbar_html_separator(),\n    search = navbar_html_search(x, path_depth = path_depth),\n    theme = navbar_html_theme(x)\n  )\n\n  class <- c(\n    if (menu_depth == 0L) \"nav-item\",\n    if (type == \"menu\") \"dropdown\"\n  )\n  html_tag(\"li\", class = class, text)\n}\n\nnavbar_html_list <- function(\n  x,\n  path_depth = 0L,\n  menu_depth = 0L,\n  side = \"left\"\n) {\n  tags <- unwrap_purrr_error(purrr::map_chr(\n    x,\n    navbar_html,\n    path_depth = path_depth,\n    menu_depth = menu_depth,\n    side = side\n  ))\n  paste0(tags, collapse = \"\\n\")\n}\n\nnavbar_html_menu <- function(\n  x,\n  path_depth = 0L,\n  menu_depth = 0L,\n  side = \"left\"\n) {\n  id <- paste0(\"dropdown-\", x$id %||% make_slug(x$text))\n\n  button <- html_tag(\n    \"button\",\n    type = \"button\",\n    class = c(if (menu_depth == 0L) \"nav-link\", \"dropdown-toggle\"),\n    id = id,\n    `data-bs-toggle` = \"dropdown\",\n    \"aria-expanded\" = \"false\",\n    \"aria-haspopup\" = \"true\",\n    \"aria-label\" = x$`aria-label`,\n    navbar_html_text(x),\n  )\n\n  li <- navbar_html_list(\n    x$menu,\n    path_depth = path_depth,\n    menu_depth = menu_depth + 1,\n    side = side\n  )\n  ul <- html_tag(\n    \"ul\",\n    class = c(\"dropdown-menu\", if (side == \"right\") \"dropdown-menu-end\"),\n    \"aria-labelledby\" = id,\n    paste0(\"\\n\", indent(li, \"  \"), \"\\n\")\n  )\n\n  paste0(\"\\n\", indent(paste0(button, \"\\n\", ul), \"  \"), \"\\n\")\n}\n\nnavbar_html_link <- function(x, menu_depth = 0) {\n  base_class <- if (menu_depth == 0) \"nav-link\" else \"dropdown-item\"\n  html_tag(\n    \"a\",\n    class = paste0(c(base_class, x$class), collapse = \" \"),\n    id = x$id,\n    href = x$href,\n    target = x$target,\n    title = x$title,\n    \"aria-label\" = x$`aria-label`,\n    navbar_html_text(x)\n  )\n}\n\nnavbar_html_theme <- function(x) {\n  html_tag(\n    \"button\",\n    class = \"dropdown-item\",\n    \"aria-label\" = x$`aria-label`,\n    \"data-bs-theme-value\" = x$theme,\n    navbar_html_text(x)\n  )\n}\n\nnavbar_html_heading <- function(x) {\n  html_tag(\n    \"h6\",\n    class = \"dropdown-header\",\n    \"data-toc-skip\" = NA,\n    navbar_html_text(x)\n  )\n}\n\nnavbar_html_separator <- function() {\n  '<hr class=\"dropdown-divider\">'\n}\n\nnavbar_html_search <- function(x, path_depth = 0) {\n  input <- html_tag(\n    \"input\",\n    type = \"search\",\n    class = \"form-control\",\n    name = \"search-input\",\n    id = \"search-input\",\n    autocomplete = \"off\",\n    \"aria-label\" = tr_(\"Search site\"),\n    placeholder = tr_(\"Search for\"),\n    \"data-search-index\" = paste0(up_path(path_depth), \"search.json\")\n  )\n\n  html_tag(\"form\", class = \"form-inline\", role = \"search\", \"\\n\", input, \"\\n\")\n}\n\n# Reused HTML components -----------------------------------------------------\n\nhtml_tag <- function(tag, ..., class = NULL) {\n  dots <- list2(...)\n  dots_attr <- dots[have_name(dots)]\n  dots_child <- dots[!have_name(dots)]\n\n  if (!is.null(class)) {\n    class <- paste0(class, collapse = \" \")\n  }\n  attr <- purrr::compact(c(list(class = class), dots_attr))\n  if (length(attr) > 0) {\n    html_attr <- ifelse(\n      is.na(attr),\n      names(attr),\n      paste0(names(attr), '=\"', attr, '\"')\n    )\n    html_attr <- paste0(\" \", paste0(html_attr, collapse = \" \"))\n  } else {\n    html_attr <- \"\"\n  }\n\n  html_child <- paste0(purrr::compact(dots_child), collapse = \" \")\n  needs_close <- !tag %in% \"input\"\n\n  paste0(\n    \"<\",\n    tag,\n    html_attr,\n    \">\",\n    html_child,\n    if (needs_close) paste0(\"</\", tag, \">\")\n  )\n}\n\nnavbar_html_text <- function(x) {\n  if (is.null(x$icon)) {\n    icon <- \"\"\n  } else {\n    # Extract icon set from class name\n    classes <- strsplit(x$icon, \" \")[[1]]\n    icon_classes <- classes[grepl(\"-\", classes)]\n    iconset <- purrr::map_chr(strsplit(icon_classes, \"-\"), 1)\n\n    icon <- html_tag(\"span\", class = unique(c(iconset, classes)))\n\n    if (is.null(x$`aria-label`) && is.null(x$text)) {\n      cli::cli_inform(\n        c(\n          x = \"Icon {.str {x$icon}} lacks an {.var aria-label}.\",\n          i = \"Specify {.var aria-label} to make the icon accessible to screen readers.\",\n          i = \"Learn more in {.vignette pkgdown::accessibility}.\"\n        ),\n        .frequency = \"regularly\",\n        .frequency_id = \"icon-aria-label\"\n      )\n    }\n  }\n\n  paste0(\n    icon,\n    if (!is.null(x$icon) && !is.null(x$text)) \" \",\n    escape_html(x$text)\n  )\n}\n\nindent <- function(x, indent) {\n  paste0(indent, gsub(\"\\n\", paste0(\"\\n\", indent), x))\n}\n"
  },
  {
    "path": "R/navbar.R",
    "content": "data_navbar <- function(pkg = \".\", depth = 0L, call = caller_env()) {\n  pkg <- as_pkgdown(pkg)\n\n  navbar <- config_pluck(pkg, \"navbar\")\n\n  if (uses_lightswitch(pkg)) {\n    style <- NULL\n  } else {\n    style <- navbar_style(\n      navbar = navbar,\n      theme = get_bslib_theme(pkg),\n      bs_version = pkg$bs_version\n    )\n  }\n\n  links <- navbar_links(pkg, depth = depth, call = call)\n\n  c(style, links)\n}\n\nuses_lightswitch <- function(pkg) {\n  config_pluck_bool(pkg, \"template.light-switch\", default = FALSE)\n}\n\n# Default navbar ----------------------------------------------------------\n\nnavbar_style <- function(navbar = list(), theme = \"_default\", bs_version = 3) {\n  if (bs_version == 3) {\n    list(type = navbar$type %||% \"default\")\n  } else {\n    # bg is usually light, dark, or primary, but can use any .bg-*\n    bg <- navbar$bg %||% bootswatch_bg[[theme]] %||% \"light\"\n    type <- navbar$type %||% if (bg == \"light\") \"light\" else \"dark\"\n\n    list(bg = bg, type = type)\n  }\n}\n\nnavbar_structure <- function() {\n  print_yaml(list(\n    left = c(\"intro\", \"reference\", \"articles\", \"tutorials\", \"news\"),\n    right = c(\"search\", \"github\", \"lightswitch\")\n  ))\n}\n\nnavbar_links <- function(pkg, depth = 0L, call = caller_env()) {\n  components <- navbar_link_components(pkg, call = call)\n\n  list(\n    left = render_navbar_links(\n      components$left,\n      depth = depth,\n      pkg = pkg,\n      side = \"left\"\n    ),\n    right = render_navbar_links(\n      components$right,\n      depth = depth,\n      pkg = pkg,\n      side = \"right\"\n    )\n  )\n}\n\nnavbar_link_components <- function(pkg, call = caller_env()) {\n  # Combine default components with user supplied: must not merge recursively\n  components <- navbar_components(pkg)\n  components_meta <- config_pluck(pkg, \"navbar.components\", default = list())\n  components[names(components_meta)] <- components_meta\n  components <- purrr::compact(components)\n\n  # Combine default structure with user supplied\n  # (must preserve NULLs in yaml to mean display nothing)\n  pkg$meta$navbar$structure <- modify_list(\n    navbar_structure(),\n    config_pluck(pkg, \"navbar.structure\")\n  )\n  right_comp <- intersect(\n    config_pluck_character(pkg, \"navbar.structure.right\", call = call),\n    names(components)\n  )\n  left_comp <- intersect(\n    config_pluck_character(pkg, \"navbar.structure.left\", call = call),\n    names(components)\n  )\n  # Backward compatibility\n  left <- config_pluck(pkg, \"navbar.left\") %||% components[left_comp]\n  right <- config_pluck(pkg, \"navbar.right\") %||% components[right_comp]\n\n  list(left = left, right = right)\n}\n\nrender_navbar_links <- function(x, depth = 0L, pkg, side = c(\"left\", \"right\")) {\n  if (!is.list(x)) {\n    config_abort(\n      pkg,\n      c(\n        \"{.field navbar} is incorrectly specified.\",\n        i = \"See details in {.vignette pkgdown::customise}.\"\n      ),\n      call = quote(data_template())\n    )\n  }\n  check_number_whole(depth, min = 0)\n  side <- arg_match(side)\n\n  tweak <- function(x) {\n    if (!is.null(x$menu)) {\n      x$menu <- lapply(x$menu, tweak)\n      x\n    } else if (!is.null(x$href) && !grepl(\"://\", x$href, fixed = TRUE)) {\n      x$href <- paste0(up_path(depth), x$href)\n      x\n    } else {\n      x\n    }\n  }\n  if (depth != 0L) {\n    x <- lapply(x, tweak)\n  }\n\n  if (pkg$bs_version == 3) {\n    rmarkdown::navbar_links_html(x)\n  } else {\n    navbar_html_list(x, path_depth = depth, side = side)\n  }\n}\n\n# Components --------------------------------------------------------------\n\nnavbar_components <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  menu <- list()\n  menu$reference <- menu_link(tr_(\"Reference\"), \"reference/index.html\")\n\n  # in BS3, search is hardcoded in the template\n  if (pkg$bs_version == 5) {\n    menu$search <- menu_search()\n  }\n\n  if (uses_lightswitch(pkg)) {\n    menu$lightswitch <- menu_submenu(\n      text = NULL,\n      icon = \"fa-sun\",\n      label = tr_(\"Light switch\"),\n      id = \"lightswitch\",\n      list(\n        menu_theme(tr_(\"Light\"), icon = \"fa-sun\", theme = \"light\"),\n        menu_theme(tr_(\"Dark\"), icon = \"fa-moon\", theme = \"dark\"),\n        menu_theme(tr_(\"Auto\"), icon = \"fa-adjust\", theme = \"auto\")\n      )\n    )\n  }\n\n  if (!is.null(pkg$tutorials)) {\n    menu$tutorials <- menu_submenu(\n      tr_(\"Tutorials\"),\n      menu_links(pkg$tutorials$title, pkg$tutorials$file_out)\n    )\n  }\n  menu$news <- navbar_news(pkg)\n\n  menu$github <- switch(\n    repo_type(pkg),\n    github = menu_icon(\"fab fa-github fa-lg\", repo_home(pkg), \"GitHub\"),\n    gitlab = menu_icon(\"fab fa-gitlab fa-lg\", repo_home(pkg), \"GitLab\"),\n    codeberg = menu_icon(\"fas fa-code fa-lg\", repo_home(pkg), \"Codeberg\"),\n    NULL\n  )\n\n  menu <- c(menu, navbar_articles(pkg))\n\n  print_yaml(menu)\n}\n\nnavbar_articles <- function(pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  menu <- list()\n\n  vignettes <- pkg$vignettes\n  pkg_intro <- article_is_intro(vignettes$name, pkg$package)\n  if (any(pkg_intro)) {\n    intro <- vignettes[pkg_intro, , drop = FALSE]\n\n    menu$intro <- menu_link(tr_(\"Get started\"), intro$file_out)\n  }\n\n  if (!has_name(pkg$meta, \"articles\")) {\n    vignettes <- vignettes[!pkg_intro, , drop = FALSE]\n    menu$articles <- menu_submenu(\n      tr_(\"Articles\"),\n      menu_links(vignettes$title, vignettes$file_out)\n    )\n  } else {\n    articles_index <- config_pluck(pkg, \"articles\")\n    articles <- data_articles(pkg)\n\n    navbar <- purrr::keep(articles_index, ~ has_name(.x, \"navbar\"))\n    if (length(navbar) == 0) {\n      # No articles to be included in navbar so just link to index\n      menu$articles <- menu_link(tr_(\"Articles\"), \"articles/index.html\")\n    } else {\n      sections <- purrr::imap(navbar, function(section, index) {\n        idx <- select_topics(\n          section$contents,\n          articles,\n          error_pkg = pkg,\n          error_path = paste0(\"articles[\", index, \"].contents\")\n        )\n        vig <- articles[idx, , drop = FALSE]\n        vig <- vig[vig$name != pkg$package, , drop = FALSE]\n        c(\n          if (!is.null(section$navbar)) {\n            list(menu_separator(), menu_heading(section$navbar))\n          },\n          menu_links(vig$title, vig$href)\n        )\n      })\n      children <- unlist(sections, recursive = FALSE, use.names = FALSE)\n\n      if (length(navbar) != length(articles_index)) {\n        children <- c(\n          children,\n          list(\n            menu_separator(),\n            menu_link(tr_(\"More articles...\"), \"articles/index.html\")\n          )\n        )\n      }\n      menu$articles <- menu_submenu(tr_(\"Articles\"), children)\n    }\n  }\n  print_yaml(menu)\n}\n\n# Testing helpers ---------------------------------------------------------\n# Simulate minimal package structure so we can more easily test\n\npkg_navbar <- function(\n  meta = NULL,\n  vignettes = pkg_navbar_vignettes(),\n  github_url = NULL\n) {\n  structure(\n    list(\n      package = \"test\",\n      src_path = file_temp(),\n      meta = meta,\n      vignettes = vignettes,\n      repo = list(url = list(home = github_url)),\n      bs_version = 5\n    ),\n    class = \"pkgdown\"\n  )\n}\n\npkg_navbar_vignettes <- function(\n  name = character(),\n  title = NULL,\n  file_out = NULL\n) {\n  title <- title %||% paste0(\"Title \", name)\n  file_out <- file_out %||% paste0(name, \".html\")\n\n  tibble::tibble(name = name, title = title, file_out, description = \"desc\")\n}\n\n\n# bootswatch defaults -----------------------------------------------------\n\n# Scraped from bootswatch preivews, see code in\n# <https://github.com/r-lib/pkgdown/issues/1758>\nbootswatch_bg <- list(\n  \"_default\" = \"light\",\n  cerulean = \"primary\",\n  cosmo = \"primary\",\n  cyborg = \"dark\",\n  darkly = \"primary\",\n  flatly = \"primary\",\n  journal = \"light\",\n  litera = \"light\",\n  lumen = \"light\",\n  lux = \"light\",\n  materia = \"primary\",\n  minty = \"primary\",\n  morph = \"primary\",\n  pulse = \"primary\",\n  quartz = \"primary\",\n  sandstone = \"primary\",\n  simplex = \"light\",\n  sketchy = \"light\",\n  slate = \"primary\",\n  solar = \"dark\",\n  spacelab = \"light\",\n  superhero = \"dark\",\n  united = \"primary\",\n  vapor = \"primary\",\n  yeti = \"primary\",\n  zephyr = \"primary\"\n)\n"
  },
  {
    "path": "R/package.R",
    "content": "#' Generate pkgdown data structure\n#'\n#' You will generally not need to use this unless you need a custom site\n#' design and you're writing your own equivalent of [build_site()].\n#'\n#' @param pkg Path to package.\n#' @param override An optional named list used to temporarily override\n#'   values in `_pkgdown.yml`\n#' @export\nas_pkgdown <- function(pkg = \".\", override = list()) {\n  if (!is.list(override)) {\n    cli::cli_abort(\n      \"{.arg override} must be a list, not {obj_type_friendly(override)}.\"\n    )\n  }\n\n  if (is_pkgdown(pkg)) {\n    pkg$meta <- modify_list(pkg$meta, override)\n    return(pkg)\n  }\n\n  check_string(pkg)\n  if (!dir_exists(pkg)) {\n    if (dir.exists(pkg)) {\n      #nolint\n      # path expansion with fs and base R is different on Windows.\n      # By default \"~/\", is typically C:/Users/username/Documents, while fs see \"~/\" as C:/Users/username, to be more platform portable.\n      # Read more in ?fs::path_expand\n      cli::cli_abort(\n        \"pkgdown accepts {.href [fs paths](https://fs.r-lib.org/reference/path_expand.html#details)}.\"\n      )\n    }\n    cli::cli_abort(\"{.file {pkg}} is not an existing directory\")\n  }\n\n  if (!dir.exists(pkg)) {\n    #nolint\n    # Use complete path if fs path doesn't exist according to base R #2639\n    pkg <- path_expand(pkg)\n  }\n\n  src_path <- pkg\n\n  desc <- read_desc(src_path)\n  meta <- read_meta(src_path)\n  meta <- modify_list(meta, override)\n\n  # Create a partial pkgdown object so we can use config_pluck_* functions\n  pkg <- list(\n    package = desc$get_field(\"Package\"),\n    version = desc$get_field(\"Version\"),\n    src_path = path_abs(src_path),\n\n    meta = meta,\n    desc = desc\n  )\n  class(pkg) <- \"pkgdown\"\n\n  # If boostrap version set locally, it drives the template choice\n  # But if it's not set locally, the template may have a default\n  template <- config_pluck_list(pkg, \"template\")\n  template_package <- config_pluck_string(pkg, \"template.package\")\n\n  bs_version_local <- get_bootstrap_version(pkg, pkg$meta$template)\n  template_meta <- find_template_config(template_package, bs_version_local)\n\n  if (is.null(bs_version_local)) {\n    bs_version_remote <- get_bootstrap_version(\n      pkg,\n      template_meta$template,\n      template_package\n    )\n  } else {\n    bs_version_remote <- NULL\n  }\n  bs_version <- bs_version_local %||% bs_version_remote %||% 3\n  check_bootstrap_version(bs_version, error_pkg = pkg)\n  pkg$bs_version <- bs_version\n\n  pkg$meta <- modify_list(template_meta, pkg$meta)\n\n  # Ensure the URL has no trailing slash\n  if (!is.null(pkg$meta$url)) {\n    pkg$meta$url <- sub(\"/$\", \"\", pkg$meta$url)\n  }\n\n  pkg$development <- meta_development(pkg)\n  pkg$prefix <- pkg$development$prefix\n\n  dest <- config_pluck_string(pkg, \"destination\")\n  pkg$dst_path <- path_abs(dest %||% \"docs\", start = src_path)\n  if (pkg$development$in_dev) {\n    pkg$dst_path <- path(pkg$dst_path, pkg$development$destination)\n  }\n\n  pkg$lang <- get_pkg_lang(pkg)\n  pkg$install_metadata <- config_pluck_bool(\n    pkg,\n    \"deploy.install_metadata\",\n    FALSE\n  )\n  pkg$figures <- meta_figures(pkg)\n  pkg$repo <- package_repo(pkg)\n  pkg$topics <- package_topics(src_path)\n  pkg$tutorials <- package_tutorials(src_path, meta)\n  pkg$vignettes <- package_vignettes(src_path)\n\n  pkg\n}\n\nis_pkgdown <- function(x) inherits(x, \"pkgdown\")\n\nread_desc <- function(path = \".\") {\n  path <- path(path, \"DESCRIPTION\")\n  if (!file_exists(path)) {\n    cli::cli_abort(\"Can't find {.file DESCRIPTION}\", call = caller_env())\n  }\n  desc::description$new(path)\n}\n\nget_pkg_lang <- function(pkg) {\n  if (!is.null(pkg$meta$lang)) {\n    return(pkg$meta$lang)\n  }\n\n  if (pkg$desc$has_fields(\"Language\")) {\n    field <- pkg$desc$get_field(\"Language\")\n    if (length(field) && nchar(field) > 0) {\n      return(regmatches(field, regexpr(\"[^,]+\", field)))\n    }\n  }\n\n  return(\"en\")\n}\n\nget_bootstrap_version <- function(\n  pkg,\n  template,\n  template_package = NULL,\n  call = caller_env()\n) {\n  if (is.null(template)) {\n    return(NULL)\n  }\n\n  template_bootstrap <- template[[\"bootstrap\"]]\n  template_bslib <- template[[\"bslib\"]][[\"version\"]]\n\n  if (!is.null(template_bootstrap) && !is.null(template_bslib)) {\n    if (!is.null(template_package)) {\n      hint <- \"Specified locally and in template package {.pkg {template_package}}.\"\n    } else {\n      hint <- NULL\n    }\n\n    msg <- \"must set only one of {.field template.bootstrap} and {.field template.bslib.version}.\"\n    config_abort(pkg, c(msg, i = hint), call = call)\n  }\n\n  template_bootstrap %||% template_bslib\n}\n\ncheck_bootstrap_version <- function(\n  version,\n  error_pkg,\n  error_call = caller_env()\n) {\n  if (version %in% c(3, 5)) {\n    version\n  } else if (version == 4) {\n    msg <- c(\n      \"{.var template.bootstrap: 4} no longer supported\",\n      i = \"Using {.var template.bootstrap: 5} instead\"\n    )\n    config_warn(error_pkg, msg, call = error_call)\n    5\n  } else {\n    msg <- \"{.field template.bootstrap} must be 3 or 5, not {.val {version}}.\"\n    config_abort(error_pkg, msg, error_call = caller_env())\n  }\n}\n\n# Metadata ----------------------------------------------------------------\n\npkgdown_config_path <- function(path) {\n  if (is_pkgdown(path)) {\n    path <- path$src_path\n  }\n\n  path_first_existing(\n    path,\n    c(\n      \"_pkgdown.yml\",\n      \"_pkgdown.yaml\",\n      \"pkgdown/_pkgdown.yml\",\n      \"pkgdown/_pkgdown.yaml\",\n      \"inst/_pkgdown.yml\",\n      \"inst/_pkgdown.yaml\"\n    )\n  )\n}\n\nread_meta <- function(path, call = caller_env()) {\n  path <- pkgdown_config_path(path)\n\n  if (is.null(path)) {\n    yaml <- list()\n  } else {\n    yaml <- withCallingHandlers(\n      yaml::yaml.load_file(path, error.label = NULL) %||% list(),\n      error = function(e) {\n        cli::cli_abort(\n          \"Could not parse config file at {.path {path}}.\",\n          call = call,\n          parent = e\n        )\n      }\n    )\n  }\n  yaml\n}\n\n# Topics ------------------------------------------------------------------\n\npackage_topics <- function(path = \".\") {\n  # Needed if title contains sexpr\n  local_context_eval()\n\n  rd <- package_rd(path)\n\n  aliases <- purrr::map(rd, extract_tag, \"tag_alias\")\n  names <- purrr::map_chr(rd, extract_tag, \"tag_name\")\n  titles <- purrr::map_chr(rd, extract_title)\n  concepts <- unname(purrr::map(rd, extract_tag, \"tag_concept\"))\n  keywords <- unname(purrr::map(rd, extract_tag, \"tag_keyword\"))\n  internal <- purrr::map_lgl(keywords, ~ \"internal\" %in% .)\n  source <- purrr::map(rd, extract_source)\n  lifecycle <- unname(purrr::map(rd, extract_lifecycle))\n\n  file_in <- names(rd)\n  file_out <- rd_output_path(file_in)\n\n  funs <- purrr::map(rd, topic_funs)\n\n  tibble::tibble(\n    name = names,\n    file_in = file_in,\n    file_out = file_out,\n    alias = aliases,\n    funs = funs,\n    title = titles,\n    rd = rd,\n    source = source,\n    keywords = keywords,\n    concepts = concepts,\n    internal = internal,\n    lifecycle = lifecycle\n  )\n}\n\nrd_output_path <- function(x) {\n  x <- gsub(\"\\\\.Rd$\", \".html\", x)\n  x[x == \"index.html\"] <- \"index-topic.html\"\n  x\n}\n\npackage_rd <- function(path = \".\") {\n  man_path <- path(path, \"man\")\n\n  if (!dir_exists(man_path)) {\n    return(set_names(list(), character()))\n  }\n\n  rd <- dir_ls(man_path, regexp = \"\\\\.[Rr]d$\", type = \"file\")\n  names(rd) <- path_file(rd)\n  lapply(rd, rd_file, pkg_path = path)\n}\n\nextract_tag <- function(x, tag) {\n  purrr::map_chr(purrr::keep(x, inherits, tag), c(1, 1))\n}\n\nextract_title <- function(x) {\n  title <- purrr::detect(x, inherits, \"tag_title\")\n  str_squish(flatten_text(title, auto_link = FALSE))\n}\n\nextract_source <- function(x) {\n  nl <- purrr::map_lgl(x, inherits, \"TEXT\") & x == \"\\n\"\n  comment <- purrr::map_lgl(x, inherits, \"COMMENT\")\n\n  first_comment <- cumsum(!(nl | comment)) == 0\n  lines <- as.character(x[first_comment])\n  text <- paste0(lines, collapse = \"\")\n\n  if (!grepl(\"roxygen2\", text)) {\n    return(character())\n  }\n\n  m <- gregexpr(\"R/[^ ]+\\\\.[rR]\", text)\n  regmatches(text, m)[[1]]\n}\n\nextract_lifecycle <- function(x) {\n  desc <- purrr::keep(x, inherits, \"tag_description\")\n  fig <- extract_figure(desc)\n\n  if (!is.null(fig) && length(fig) > 0 && length(fig[[1]]) > 0) {\n    path <- as.character(fig[[1]][[1]])\n    if (grepl(\"lifecycle\", path)) {\n      name <- gsub(\"lifecycle-\", \"\", path)\n      name <- path_ext_remove(name)\n\n      # Translate the most common lifecylce names\n      name <- switch(\n        name,\n        deprecated = tr_(\"deprecated\"),\n        superseded = tr_(\"superseded\"),\n        experimental = tr_(\"experimental\"),\n        stable = tr_(\"stable\"),\n        name\n      )\n\n      return(name)\n    }\n  }\n  NULL\n}\n\nextract_figure <- function(elements) {\n  for (element in elements) {\n    if (inherits(element, \"tag_figure\")) {\n      return(element)\n    } else if (inherits(element, \"tag\")) {\n      child <- extract_figure(element)\n      if (!is.null(child)) {\n        return(child)\n      }\n    }\n  }\n  NULL\n}\n\n# Vignettes ---------------------------------------------------------------\n\npackage_vignettes <- function(path = \".\") {\n  base <- path(path, \"vignettes\")\n\n  if (!dir_exists(base)) {\n    vig_path <- character()\n  } else {\n    vig_path <- dir_ls(\n      base,\n      regexp = \"\\\\.[Rrq]md$\",\n      type = \"file\",\n      recurse = TRUE\n    )\n  }\n\n  vig_path <- path_rel(vig_path, base)\n  vig_path <- vig_path[!grepl(\"^_\", path_file(vig_path))]\n  vig_path <- vig_path[!grepl(\"^tutorials\", path_dir(vig_path))]\n\n  type <- tolower(path_ext(vig_path))\n\n  meta <- purrr::map(path(base, vig_path), article_metadata)\n  title <- purrr::map_chr(meta, \"title\")\n  desc <- purrr::map_chr(meta, \"desc\")\n  ext <- purrr::map_chr(meta, \"ext\")\n\n  # Vignettes will be written to /articles/ with path relative to vignettes/\n  # *except* for vignettes in vignettes/articles, which are moved up a level\n  file_in <- path(\"vignettes\", vig_path)\n  file_out <- path_ext_set(vig_path, ext)\n  file_out[!path_has_parent(file_out, \"articles\")] <- path(\n    \"articles\",\n    file_out[!path_has_parent(file_out, \"articles\")]\n  )\n  check_unique_article_paths(file_in, file_out)\n\n  out <- tibble::tibble(\n    name = as.character(path_ext_remove(vig_path)),\n    type = type,\n    file_in = as.character(file_in),\n    file_out = as.character(file_out),\n    title = title,\n    description = desc,\n    depth = dir_depth(file_out)\n  )\n  out[order(path_file(out$file_out)), ]\n}\n\narticle_metadata <- function(path) {\n  if (path_ext(path) == \"qmd\") {\n    inspect <- quarto::quarto_inspect(path)\n    meta <- inspect$formats[[1]]$metadata\n\n    out <- list(\n      title = meta$title %||% \"UNKNOWN TITLE\",\n      desc = meta$description %||% NA_character_,\n      ext = path_ext(inspect$formats[[1]]$pandoc$`output-file`) %||% \"html\"\n    )\n  } else {\n    yaml <- rmarkdown::yaml_front_matter(path)\n    out <- list(\n      title = yaml$title[[1]] %||% \"UNKNOWN TITLE\",\n      desc = yaml$description[[1]] %||% NA_character_,\n      ext = yaml$pkgdown$extension %||% \"html\"\n    )\n  }\n\n  if (out$ext == \"pdf\") {\n    out$title <- paste0(out$title, \" (PDF)\")\n  }\n\n  out\n}\n\nfind_template_config <- function(\n  package,\n  bs_version = NULL,\n  error_call = caller_env()\n) {\n  if (is.null(package)) {\n    return(list())\n  }\n\n  config <- path_package_pkgdown(\n    \"_pkgdown.yml\",\n    package,\n    bs_version,\n    error_call = error_call\n  )\n  if (!file_exists(config)) {\n    return(list())\n  }\n\n  yaml::yaml.load_file(config) %||% list()\n}\n\ncheck_unique_article_paths <- function(file_in, file_out) {\n  if (!any(duplicated(file_out))) {\n    return()\n  }\n  # Since we move vignettes/articles/* up one level, we may end up with two\n  # vignettes destined for the same final location. We also know that if there\n  # are conflicting final paths, they are the result of exactly two source files\n\n  file_out_dup <- file_out[duplicated(file_out)]\n\n  same_out_bullets <- purrr::map_chr(file_out_dup, function(f_out) {\n    src_files <- src_path(file_in[which(file_out == f_out)])\n    src_files <- paste(src_files, collapse = \" and \")\n  })\n  names(same_out_bullets) <- rep_len(\"x\", length(same_out_bullets))\n\n  cli::cli_abort(\n    c(\n      \"Rendered articles must have unique names. Rename or relocate:\",\n      same_out_bullets\n    ),\n    call = caller_env()\n  )\n}\n"
  },
  {
    "path": "R/pkgdown-package.R",
    "content": "#' @keywords internal\n\"_PACKAGE\"\n\n## usethis namespace: start\n#' @importFrom utils installed.packages\n#' @import rlang\n#' @import fs\n#' @importFrom lifecycle deprecated\n## usethis namespace: end\nNULL\n\nrelease_bullets <- function() {\n  c(\n    \"Check that [test/widget.html](https://pkgdown.r-lib.org/dev/articles/) responds to mouse clicks on 5/10/50\",\n    \"Update translations with `potools::po_extract()` + `potools::po_update()`\",\n    \"Use an LLM to proofread / fill in missing translations (see #2926)\",\n    \"Compile po files with `potools::po_compile()`\",\n    \"Update `vignette/translations.Rmd` with any new languages\"\n  )\n}\n\nthe <- new.env(parent = emptyenv())\n"
  },
  {
    "path": "R/pkgdown.R",
    "content": "#' Determine if code is executed by pkgdown\n#'\n#' This is occasionally useful when you need different behaviour by\n#' pkgdown and regular documentation.\n#'\n#' @export\n#' @examples\n#' in_pkgdown()\nin_pkgdown <- function() {\n  identical(Sys.getenv(\"IN_PKGDOWN\"), \"true\")\n}\n\nlocal_envvar_pkgdown <- function(pkg, scope = parent.frame()) {\n  withr::local_envvar(\n    IN_PKGDOWN = \"true\",\n    LANGUAGE = pkg$lang,\n    .local_envir = scope\n  )\n}\n"
  },
  {
    "path": "R/pkgdown_print.R",
    "content": "#' Print object in pkgdown output\n#'\n#' This lets package authors control how objects are printed just for\n#' pkgdown examples. The default is to call [print()] apart from htmlwidgets\n#' where the object is returned as is (with sizes tweaked).\n#'\n#' @param x Object to display\n#' @param visible Whether it is visible or not\n#' @return Either a character vector representing printed output (which\n#'   will be escaped for HTML as necessary) or literal HTML produced\n#'   by the htmltools or htmlwidgets packages.\n#' @keywords internal\n#' @export\npkgdown_print <- function(x, visible = TRUE) {\n  UseMethod(\"pkgdown_print\")\n}\n\n#' @export\npkgdown_print.default <- function(x, visible = TRUE) {\n  if (!visible) {\n    return(invisible())\n  }\n\n  # inlined from htmltools::is.browsable()\n  if (isTRUE(attr(x, \"browsable_html\", exact = TRUE))) {\n    x\n  } else {\n    print(x)\n  }\n}\n\n#' @export\npkgdown_print.htmlwidget <- function(x, visible = TRUE) {\n  if (!visible) {\n    return(invisible())\n  }\n\n  settings <- fig_settings()\n  x$width <- x$width %||% (settings$fig.width * settings$dpi)\n  x$height <- x$height %||% (settings$fig.height * settings$dpi)\n  x\n}\n\n#' @export\npkgdown_print.gt_tbl <- function(x, visible = TRUE) {\n  if (!visible) {\n    return(invisible())\n  }\n\n  htmltools::div(\n    class = \"gt-table\",\n    gt::as_raw_html(x)\n  )\n}\n"
  },
  {
    "path": "R/preview.R",
    "content": "#' Open site in browser\n#'\n#' `preview_site()` opens your pkgdown site in your browser, served via a\n#' local HTTP server. This enables dynamic features such as search to work\n#' correctly in preview.\n#'\n#' @seealso [stop_preview()] to stop the server.\n#' @inheritParams build_article\n#' @param path Path relative to destination\n#' @export\npreview_site <- function(pkg = \".\", path = \".\", preview = TRUE) {\n  pkg <- as_pkgdown(pkg)\n  abs_path <- local_path(pkg, path)\n\n  check_bool(preview, allow_na = TRUE)\n  if (is.na(preview)) {\n    preview <- interactive() && !is_testing()\n  }\n\n  if (preview) {\n    root <- pkg$dst_path\n\n    if (is.null(the$server) || !identical(the$server_root, root)) {\n      the$server <- nanonext::http_server(\n        url = \"http://127.0.0.1:0\",\n        handlers = nanonext::handler_directory(\"/\", root)\n      )\n      the$server$start()\n      the$server_root <- root\n    }\n\n    cli::cli_inform(c(i = \"Previewing site\"))\n    url <- paste0(the$server$url, \"/\", if (path != \".\") path)\n    utils::browseURL(url)\n  }\n\n  invisible()\n}\n\n#' Stop HTTP preview\n#'\n#' Stops the HTTP server started by [preview_site()], if active. This can be\n#' called manually, but is not strictly necessary as the server is\n#' automatically stopped when previewing a new site or ending the R session.\n#'\n#' @export\n#' @keywords internal\nstop_preview <- function() {\n  if (!is.null(the$server)) {\n    the$server$close()\n    the$server <- NULL\n    the$server_root <- NULL\n    cli::cli_inform(c(i = \"Stopped preview\"))\n  }\n\n  invisible()\n}\n\nlocal_path <- function(pkg, path, call = caller_env()) {\n  check_string(path, call = call)\n\n  abs_path <- path_abs(path, pkg$dst_path)\n  if (!file_exists(abs_path)) {\n    cli::cli_abort(\"Can't find file {.path {path}}.\", call = call)\n  }\n\n  abs_path\n}\n\nis_testing <- function() {\n  identical(Sys.getenv(\"TESTTHAT\"), \"true\")\n}\n"
  },
  {
    "path": "R/rd-data.R",
    "content": "as_data <- function(x, ...) {\n  UseMethod(\"as_data\")\n}\n\n#' @export\nas_data.NULL <- function(x, ...) {\n  NULL\n}\n\n# Sections ----------------------------------------------------------------\n\nparse_section <- function(x, title, ...) {\n  text <- flatten_para(x, ...)\n\n  list(\n    title = title,\n    contents = text\n  )\n}\n\n#' @export\nas_data.tag_details <- function(x, ...) {\n  parse_section(x, tr_(\"Details\"), ...)\n}\n#' @export\nas_data.tag_description <- function(x, ...) {\n  parse_section(x, tr_(\"Description\"), ...)\n}\n#' @export\nas_data.tag_references <- function(x, ...) {\n  parse_section(x, tr_(\"References\"), ...)\n}\n#' @export\nas_data.tag_source <- function(x, ...) {\n  parse_section(x, tr_(\"Source\"), ...)\n}\n#' @export\nas_data.tag_format <- function(x, ...) {\n  parse_section(x, tr_(\"Format\"), ...)\n}\n#' @export\nas_data.tag_note <- function(x, ...) {\n  parse_section(x, tr_(\"Note\"), ...)\n}\n#' @export\nas_data.tag_author <- function(x, ...) {\n  parse_section(x, tr_(\"Author\"), ...)\n}\n#' @export\nas_data.tag_seealso <- function(x, ...) {\n  section <- parse_section(x, tr_(\"See also\"), ...)\n  section$contents <- dont_index(section$contents)\n  section\n}\n#' @export\nas_data.tag_section <- function(x, ...) {\n  parse_section(x[[2]], as_html(x[[1]], ...), ...)\n}\n\n# \\arguments{} & \\details{} -----------------------------------------------\n# Both are like the contents of \\description{} but can contain arbitrary\n# text outside of \\item{}\n\n#' @export\nas_data.tag_arguments <- function(x, ...) {\n  list(\n    title = tr_(\"Arguments\"),\n    contents = describe_contents(x, ..., id_prefix = \"arg-\")\n  )\n}\n\n#' @export\nas_data.tag_value <- function(x, ...) {\n  list(\n    title = tr_(\"Value\"),\n    contents = describe_contents(x, ...)\n  )\n}\n\ndescribe_contents <- function(x, ..., id_prefix = NULL) {\n  if (length(x) == 0) {\n    return(\"\")\n  }\n\n  # Group contiguous \\items{}/whitespace into a <dl>; everything else\n  # is handled as is\n  block_id <- integer(length(x))\n  block_id[[1]] <- 1\n  cur_block_is_dl <- inherits(x[[1]], \"tag_item\")\n\n  for (i in seq2(2, length(x))) {\n    is_item <- inherits(x[[i]], \"tag_item\")\n    if (cur_block_is_dl) {\n      same_type <- is_item || is_whitespace(x[[i]])\n    } else {\n      same_type <- !is_item\n    }\n\n    if (same_type) {\n      block_id[[i]] <- block_id[[i - 1]]\n    } else {\n      block_id[[i]] <- block_id[[i - 1]] + 1\n      cur_block_is_dl <- !cur_block_is_dl\n    }\n  }\n\n  parse_block <- function(x) {\n    is_dl <- any(purrr::map_lgl(x, inherits, \"tag_item\"))\n    if (is_dl) {\n      paste0(\n        \"<dl>\\n\",\n        parse_descriptions(x, ..., id_prefix = id_prefix),\n        \"</dl>\"\n      )\n    } else {\n      flatten_para(x, ...)\n    }\n  }\n  blocks <- split(x, block_id)\n  out <- purrr::map(blocks, parse_block)\n\n  paste(unlist(out), collapse = \"\\n\")\n}\n\nis_whitespace <- function(x) {\n  inherits(x, \"TEXT\") && all(grepl(\"^\\\\s*$\", x))\n}\n\n\n# For testing\nvalue2html <- function(x) {\n  rd <- rd_text(paste0(\"\\\\value{\", x, \"}\"), fragment = FALSE)[[1]]\n  html <- as_data(rd)$contents\n  str_trim(strsplit(str_trim(html), \"\\n\")[[1]])\n}\n"
  },
  {
    "path": "R/rd-example.R",
    "content": "rd2ex <- function(x, ...) {\n  x <- rd_text(paste0(\"\\\\examples{\", x, \"}\"), fragment = FALSE)[[1]]\n  x <- process_conditional_examples(x)\n  x <- flatten_ex(x, ...)\n\n  if (grepl(\"\\n\", x)) {\n    strsplit(x, \"\\n\")[[1]]\n  } else {\n    x\n  }\n}\n\nrun_examples <- function(\n  x,\n  topic = \"unknown\",\n  env = globalenv(),\n  run_dont_run = FALSE\n) {\n  if (!inherits(x, \"tag\")) {\n    x <- rd_text(x)\n  }\n\n  # Trim newline that usually occurs after \\examples{\n  if (is_newline(x[[1]], trim = TRUE)) {\n    x <- x[-1]\n  }\n\n  x <- process_conditional_examples(x)\n  code <- flatten_ex(x, run_dont_run = run_dont_run)\n\n  if (!can_parse(code)) {\n    cli::cli_warn(\"Failed to parse example for topic {.val {topic}}\")\n    return(\"\")\n  }\n\n  if (!is.null(env)) {\n    highlight_examples(code, topic, env = env)\n  } else {\n    highlight_text(code)\n  }\n}\n\nprocess_conditional_examples <- function(rd) {\n  if (is.list(rd)) {\n    which_exif <- which(purrr::map_lgl(rd, function(x) {\n      \"tag_dontshow\" %in%\n        class(x) &&\n        is.character(x[[1]]) &&\n        grepl(\"# examplesIf$\", x[[1]])\n    }))\n    if (length(which_exif) == 0) {\n      return(rd)\n    }\n    if (length(which_exif) %% 2 != 0) {\n      cli::cli_abort(\"@examplesIf error, not closed?\", call = caller_env())\n    }\n    remove <- integer()\n    modes <- c(\"begin\", \"end\")\n    for (idx in which_exif) {\n      if (rd[[idx]] != \"}) # examplesIf\") {\n        # Start of @examplesIf\n        if (modes[1] == \"end\") {\n          cli::cli_abort(\"@examplesIf error, not closed?\", call = caller_env())\n        }\n        cond_expr <- parse(text = paste0(rd[[idx]], \"\\n})\"))[[1]][[2]]\n        cond <- eval(cond_expr)\n        if (isTRUE(cond)) {\n          remove <- c(remove, idx, idx + 1L)\n        } else {\n          cond_expr_str <- deparse1(cond_expr)\n          is_false <- cond_expr_str == \"FALSE\"\n          if (!is_false) {\n            new_cond <- paste0(\"if (FALSE) { # \", cond_expr_str)\n            cli::cli_warn(\n              \"@examplesIf condition {.val {cond_expr_str}} is {.val FALSE}\"\n            )\n          } else {\n            new_cond <- \"if (FALSE) {\"\n          }\n          rd[[idx]] <- structure(list(new_cond), class = c(\"RCODE\", \"tag\"))\n        }\n      } else {\n        # End of @examplesIf\n        if (modes[1] == \"begin\") {\n          cli::cli_abort(\n            \"@examplesIf error, closed twice?\",\n            call = caller_env()\n          )\n        }\n        if (isTRUE(cond)) {\n          remove <- c(remove, idx, idx + 1L)\n        } else {\n          rd[[idx]] <- structure(list(\"}\"), class = c(\"RCODE\", \"tag\"))\n        }\n      }\n      modes <- rev(modes)\n    }\n    if (length(remove)) {\n      rd <- rd[-remove]\n    }\n    rd\n  } else {\n    rd\n  }\n}\n\n\n# as_example --------------------------------------------------------------\n\nas_example <- function(x, run_dont_run = FALSE) {\n  UseMethod(\"as_example\")\n}\n\n#' @export\nas_example.RCODE <- function(x, run_dont_run = FALSE) as.character(x)\n#' @export\nas_example.VERB <- as_example.RCODE\n#' @export\nas_example.TEXT <- as_example.RCODE\n#' @export\nas_example.COMMENT <- function(x, run_dont_run = FALSE) {\n  if (grepl(\"^%[^ ]*%\", x)) {\n    meant <- gsub(\"%\", \"\\\\\\\\%\", x)\n    xun <- unclass(x)\n    cli::cli_warn(c(\n      \"In the examples, {.val {xun}} is an Rd comment\",\n      \"x\" = \"did you mean {.val {meant}}?\"\n    ))\n  }\n  \"\"\n}\n#' @export\nas_example.tag_dontrun <- function(x, run_dont_run = FALSE) {\n  if (run_dont_run) {\n    block_tag_to_comment(\"\\\\dontrun\", x, run_dont_run = run_dont_run)\n  } else {\n    ex <- flatten_ex(x, run_dont_run = run_dont_run)\n    if (is_newline(x[[1]], trim = TRUE)) {\n      paste0(\"if (FALSE) { # \\\\dontrun{\", ex, \"} # }\")\n    } else {\n      paste0(\"if (FALSE) \", ex, \" # \\\\dontrun{}\")\n    }\n  }\n}\n\n#' @export\nas_example.tag_donttest <- function(x, run_dont_run = FALSE) {\n  block_tag_to_comment(\"\\\\donttest\", x, run_dont_run = run_dont_run)\n}\n#' @export\nas_example.tag_dontshow <- function(x, run_dont_run = FALSE) {\n  ex <- flatten_ex(x, run_dont_run = run_dont_run)\n  paste0(\"DONTSHOW({\", ex, \"})\")\n}\n#' @export\nas_example.tag_testonly <- function(x, run_dont_run = FALSE) {\n  ex <- flatten_ex(x, run_dont_run = run_dont_run)\n  paste0(\"TESTONLY({\", ex, \"})\")\n}\n\nblock_tag_to_comment <- function(tag, x, run_dont_run = FALSE) {\n  ex <- flatten_ex(x, run_dont_run = run_dont_run)\n\n  # Not easy to strip leading whitespace because it's attached to the previous\n  # tag. So instead we add a comment to occupy that space\n  if (is_newline(x[[1]], trim = TRUE)) {\n    ex <- paste0(\"# \", tag, \"{\", ex, \"# }\")\n  }\n  ex\n}\n\n#' @export\nas_example.tag <- function(x, run_dont_run = FALSE) {\n  untag <- paste(class(x), collapse = \"/\")\n  cli::cli_warn(\"Unknown tag: {.val {untag}}\")\n}\n\n#' @export\nas_example.tag_dots <- function(x, run_dont_run = FALSE) {\n  \"...\"\n}\n#' @export\nas_example.tag_ldots <- as_example.tag_dots\n\n#' @export\nas_example.tag_if <- function(x, run_dont_run = FALSE) {\n  if (x[[1]] == \"html\") {\n    flatten_ex(x[[2]], run_dont_run = run_dont_run)\n  } else {\n    \"\"\n  }\n}\n#' @export\nas_example.tag_ifelse <- function(x, run_dont_run = FALSE) {\n  if (x[[1]] == \"html\") {\n    flatten_ex(x[[2]], run_dont_run = run_dont_run)\n  } else {\n    flatten_ex(x[[3]], run_dont_run = run_dont_run)\n  }\n}\n#' @export\nas_example.tag_out <- function(x, run_dont_run = FALSE) {\n  flatten_ex(x, run_dont_run = run_dont_run)\n}\n\n# Helpers -----------------------------------------------------------------\n\nflatten_ex <- function(x, run_dont_run = FALSE) {\n  out <- purrr::map_chr(x, as_example, run_dont_run = run_dont_run)\n  paste(out, collapse = \"\")\n}\n\ncan_parse <- function(x) {\n  tryCatch(\n    {\n      parse(text = x)\n      TRUE\n    },\n    error = function(e) FALSE\n  )\n}\n"
  },
  {
    "path": "R/rd-html.R",
    "content": "as_html <- function(x, ...) {\n  UseMethod(\"as_html\")\n}\n\n# Various types of text ------------------------------------------------------\n\nflatten_para <- function(x, ...) {\n  if (length(x) == 0) {\n    return(character())\n  }\n\n  # Look for \"\\n\" TEXT blocks after a TEXT block, and not at end of file\n  is_nl <- purrr::map_lgl(x, is_newline, trim = TRUE)\n  is_text <- purrr::map_lgl(x, inherits, \"TEXT\")\n  is_text_prev <- c(FALSE, is_text[-length(x)])\n  has_next <- c(rep(TRUE, length(x) - 1), FALSE)\n  is_para_break <- is_nl & is_text_prev & has_next\n\n  # Or tags that are converted to HTML blocks\n  block_tags <- c(\n    \"tag_preformatted\",\n    \"tag_itemize\",\n    \"tag_enumerate\",\n    \"tag_tabular\",\n    \"tag_describe\",\n    \"tag_subsection\"\n  )\n  is_block <- purrr::map_lgl(x, inherits, block_tags)\n\n  # Break before and after each status change\n  before_break <- is_para_break | is_block\n  after_break <- c(FALSE, before_break[-length(x)])\n  groups <- cumsum(before_break | after_break)\n\n  unwrap_purrr_error(html <- purrr::map(x, as_html, ...))\n  # split at line breaks for everything except blocks\n  empty <- purrr::map_lgl(x, purrr::is_empty)\n  needs_split <- !is_block & !empty\n  html[needs_split] <- purrr::map(html[needs_split], split_at_linebreaks)\n\n  blocks <- purrr::map_chr(split(html, groups), function(x) {\n    paste(unlist(x), collapse = \"\")\n  })\n\n  # There are three types of blocks:\n  # 1. Combined text and inline tags\n  # 2. Paragraph breaks (text containing only \"\\n\")\n  # 3. Block-level tags\n  #\n  # Need to wrap 1 in <p>\n  needs_p <- purrr::map_lgl(split(!(is_nl | is_block), groups), any)\n  blocks[needs_p] <- paste0(\"<p>\", str_trim(blocks[needs_p]), \"</p>\")\n\n  paste0(blocks, collapse = \"\")\n}\n\nsplit_at_linebreaks <- function(text) {\n  if (length(text) == 0) {\n    character()\n  } else {\n    strsplit(text, \"\\\\n\\\\s*\\\\n\")[[1]]\n  }\n}\n\nflatten_text <- function(x, ...) {\n  if (length(x) == 0) {\n    return(\"\")\n  }\n\n  unwrap_purrr_error(html <- purrr::map_chr(x, as_html, ...))\n  paste(html, collapse = \"\")\n}\n\n#' @export\nas_html.Rd <- function(x, ...) flatten_text(x, ...)\n\n#' @export\nas_html.LIST <- flatten_text\n\n# Leaves  -----------------------------------------------------------------\n\n#' @export\nas_html.character <- function(x, ..., escape = TRUE) {\n  # src_highlight (used by usage, examples, and out) also does escaping\n  # so we need some way to turn it off when needed.\n  if (escape) {\n    escape_html(x)\n  } else {\n    as.character(x)\n  }\n}\n#' @export\nas_html.TEXT <- function(x, ..., escape = TRUE) {\n  # tools:::htmlify\n  x <- gsub(\"---\", \"\\u2014\", x)\n  x <- gsub(\"--\", \"\\u2013\", x)\n  x <- gsub(\"``\", \"\\u201c\", x)\n  x <- gsub(\"''\", \"\\u201d\", x)\n\n  x <- as_html.character(x, ..., escape = escape)\n  x\n}\n#' @export\nas_html.RCODE <- as_html.character\n#' @export\nas_html.VERB <- as_html.character\n#' @export\nas_html.COMMENT <- function(x, ...) {\n  paste0(\"<!-- \", flatten_text(x), \" -->\")\n}\n# USERMACRO appears first, followed by the rendered macro\n#' @export\nas_html.USERMACRO <- function(x, ...) \"\"\n\n#' @export\nas_html.tag_subsection <- function(x, ..., subsection_level = 3L) {\n  h <- paste0(\"h\", subsection_level)\n\n  title <- flatten_text(x[[1]], ...)\n  id <- make_slug(title)\n  text <- flatten_para(x[[2]], ..., subsection_level = subsection_level + 1L)\n\n  # fmt: skip\n  paste0(\n    \"<div class='section' id='\", id, \"'>\\n\",\n    \"<\", h, \">\", title, \"</\", h, \">\\n\",\n    text, \"\\n\",\n    \"</div>\"\n  )\n}\n\n# Equations ------------------------------------------------------------------\n\n#' @export\nas_html.tag_eqn <- function(x, ...) {\n  latex_rep <- x[[1]]\n  paste0(\"\\\\(\", flatten_text(latex_rep, ...), \"\\\\)\")\n}\n\n#' @export\nas_html.tag_deqn <- function(x, ...) {\n  latex_rep <- x[[1]]\n  paste0(\"$$\", flatten_text(latex_rep, ...), \"$$\")\n}\n\n# Links ----------------------------------------------------------------------\n#' @export\nas_html.tag_url <- function(x, ...) {\n  if (length(x) != 1) {\n    if (length(x) == 0) {\n      msg <- \"Check for empty \\\\url{{}} tags.\"\n    } else {\n      msg <- \"This may be caused by a \\\\url tag that spans a line break.\"\n    }\n    stop_bad_tag(\"url\", msg)\n  }\n\n  text <- flatten_text(x[[1]])\n  a(text, href = text)\n}\n#' @export\nas_html.tag_href <- function(x, ...) {\n  # don't link since we are in a link\n  a(flatten_text(x[[2]], auto_link = FALSE), href = flatten_text(x[[1]]))\n}\n#' @export\nas_html.tag_email <- function(x, ...) {\n  if (length(x) != 1) {\n    stop_bad_tag(\"email\", \"empty {}\")\n  }\n  paste0(\"<a href='mailto:\", x[[1]], \"'>\", x[[1]], \"</a>\")\n}\n\n# If single, need to look up alias to find file name and package\n#' @export\nas_html.tag_link <- function(x, ...) {\n  opt <- attr(x, \"Rd_option\")\n\n  in_braces <- flatten_text(x)\n\n  if (is.null(opt)) {\n    # \\link{topic}\n    href <- downlit::href_topic(in_braces)\n  } else if (substr(opt, 1, 1) == \"=\") {\n    # \\link[=dest]{name}\n    href <- downlit::href_topic(substr(opt, 2, nchar(opt)))\n  } else {\n    match <- regexec('^([^:]+)(?:|:(.*))$', opt)\n    parts <- regmatches(opt, match)[[1]][-1]\n\n    if (parts[[2]] == \"\") {\n      # \\link[pkg]{foo}\n      href <- downlit::href_topic(in_braces, opt)\n    } else {\n      # \\link[pkg:bar]{foo}\n      href <- downlit::href_topic(parts[[2]], parts[[1]])\n    }\n  }\n\n  a(in_braces, href = href)\n}\n\n#' @export\nas_html.tag_linkS4class <- function(x, ...) {\n  if (length(x) != 1) {\n    stop_bad_tag(\"linkS4class\")\n  }\n\n  text <- flatten_text(x[[1]])\n  href <- downlit::href_topic(paste0(text, \"-class\"))\n  a(text, href = href)\n}\n\n# Conditionals and Sexprs ----------------------------------------------------\n\n#' @export\nas_html.tag_Sexpr <- function(x, ...) {\n  code <- flatten_text(x, escape = FALSE)\n  options <- parse_opts(attr(x, \"Rd_option\"))\n\n  # Needs to be package root\n  old_wd <- setwd(context_get(\"src_path\"))\n  on.exit(setwd(old_wd), add = TRUE)\n\n  # Environment shared across a file\n  env <- context_get(\"sexpr_env\")\n\n  results <- options$results %||% \"rd\"\n  if (results == \"verbatim\") {\n    outlines <- utils::capture.output({\n      out <- withVisible(eval(parse(text = code), env))\n      res <- out$value\n      if (out$visible) print(res)\n    })\n    paste0(\n      \"<pre>\\n\",\n      paste0(escape_html(outlines), collapse = \"\\n\"),\n      \"\\n</pre>\\n\"\n    )\n  } else {\n    res <- eval(parse(text = code), env)\n    switch(\n      results,\n      text = as.character(res),\n      rd = flatten_text(rd_text(as.character(res))),\n      hide = \"\",\n      cli::cli_abort(\n        \"unknown \\\\Sexpr option: results={results}\",\n        call = NULL\n      )\n    )\n  }\n}\n\n#' @export\nas_html.tag_if <- function(x, ...) {\n  if (x[[1]] == \"html\") {\n    as_html(x[[2]], ...)\n  } else {\n    \"\"\n  }\n}\n\n#' @export\nas_html.tag_ifelse <- function(x, ...) {\n  if (x[[1]] == \"html\") as_html(x[[2]], ...) else as_html(x[[3]], ...)\n}\n\n# Used inside a \\usage{} Rd tag to prevent the code from being treated as\n# regular R syntax, either because it is not valid R, or because its usage\n# intentionally deviates from regular R usage. An example of the former is the\n# command line documentation, e.g. `R CMD SHLIB`\n# (https://github.com/wch/r-source/blob/trunk/src/library/utils/man/SHLIB.Rd):\n#\n#    \\special{R CMD SHLIB [options] [-o dllname] files}\n#\n# An example of the latter is the documentation shortcut `?`\n# (https://github.com/wch/r-source/blob/trunk/src/library/utils/man/Question.Rd):\n#\n#    \\special{?topic}\n#\n#' @export\nas_html.tag_special <- function(x, ...) {\n  flatten_text(x, ...)\n}\n\n#' @export\n`as_html.#ifdef` <- function(x, ...) {\n  os <- trimws(flatten_text(x[[1]]))\n  if (os == \"unix\") {\n    flatten_text(x[[2]])\n  } else {\n    \"\"\n  }\n}\n\n#' @export\n`as_html.#ifndef` <- function(x, ...) {\n  os <- trimws(flatten_text(x[[1]]))\n  if (os == \"windows\") {\n    flatten_text(x[[2]])\n  } else {\n    \"\"\n  }\n}\n\n# Tables ---------------------------------------------------------------------\n\n#' @export\nas_html.tag_tabular <- function(x, ...) {\n  align_abbr <- strsplit(as_html(x[[1]], ...), \"\")[[1]]\n  align_abbr <- align_abbr[!(align_abbr %in% c(\"|\", \"\"))]\n  align <- unname(c(\"r\" = \"right\", \"l\" = \"left\", \"c\" = \"center\")[align_abbr])\n\n  contents <- x[[2]]\n  class <- purrr::map_chr(contents, ~ class(.x)[[1]])\n  cell_contents <- purrr::map_chr(contents, flatten_text, ...)\n\n  row_sep <- class == \"tag_cr\"\n  contents[row_sep] <- list(\"\")\n  col_sep <- class == \"tag_tab\"\n  sep <- col_sep | row_sep\n\n  # Identify groups in reverse order (preserve empty cells)\n  # Negative maintains correct ordering once reversed\n  cell_grp <- rev(cumsum(-rev(sep)))\n  cells <- unname(split(contents, cell_grp))\n  # Remove trailing content (that does not match the dimensions of the table)\n  cells <- cells[seq_len(length(cells) - length(cells) %% length(align))]\n  cell_contents <- purrr::map_chr(cells, flatten_text, ...)\n  cell_contents <- paste0(\"<td>\", str_trim(cell_contents), \"</td>\")\n  cell_contents <- matrix(cell_contents, ncol = length(align), byrow = TRUE)\n\n  rows <- apply(cell_contents, 1, paste0, collapse = \"\")\n\n  paste0(\n    \"<table class='table'>\\n\",\n    paste0(\"<tr>\", rows, \"</tr>\\n\", collapse = \"\"),\n    \"</table>\\n\"\n  )\n}\n\n\n# Figures -----------------------------------------------------------------\n\n#' @export\nas_html.tag_figure <- function(x, ...) {\n  n <- length(x)\n  path <- as.character(x[[1]])\n\n  if (n == 1) {\n    paste0(\"<img src='figures/\", path, \"' alt='' />\")\n  } else if (n == 2) {\n    opt <- paste(trimws(as.character(x[[2]])), collapse = \" \")\n    if (substr(opt, 1, 9) == \"options: \") {\n      extra <- substr(opt, 9, nchar(opt))\n      paste0(\"<img src='figures/\", path, \"'\", extra, \" />\")\n    } else {\n      paste0(\"<img src='figures/\", path, \"' alt='\", opt, \"' />\")\n    }\n  }\n}\n\n# List -----------------------------------------------------------------------\n\n#' @export\nas_html.tag_itemize <- function(x, ...) {\n  paste0(\"<ul>\\n\", parse_items(x[-1], ...), \"</ul>\")\n}\n#' @export\nas_html.tag_enumerate <- function(x, ...) {\n  paste0(\"<ol>\\n\", parse_items(x[-1], ...), \"</ol>\")\n}\n#' @export\nas_html.tag_describe <- function(x, ...) {\n  paste0(\"<dl>\\n\", parse_descriptions(x[-1], ...), \"\\n</dl>\")\n}\n\n# Effectively does nothing: only used by parse_items() to split up\n# sequence of tags.\n#' @export\nas_html.tag_item <- function(x, ...) {\n  \"\"\n}\n\nparse_items <- function(rd, ...) {\n  separator <- purrr::map_lgl(rd, inherits, \"tag_item\")\n  group <- cumsum(separator)\n\n  # Drop anything before first tag_item\n  if (!all(group == 0) && any(group == 0)) {\n    rd <- rd[group != 0]\n    group <- group[group != 0]\n  }\n\n  parse_item <- function(x) {\n    x <- trim_ws_nodes(x)\n    paste0(\"<li>\", flatten_para(x, ...), \"</li>\\n\")\n  }\n\n  paste(purrr::map_chr(split(rd, group), parse_item), collapse = \"\")\n}\n\nparse_descriptions <- function(rd, ..., id_prefix = NULL) {\n  if (length(rd) == 0) {\n    return(character())\n  }\n\n  parse_item <- function(x) {\n    if (inherits(x, \"tag_item\")) {\n      term <- flatten_text(x[[1]], ...)\n      def <- flatten_para(x[[2]], ...)\n\n      if (!is.null(id_prefix)) {\n        id <- paste0(id_prefix, make_slug(term))\n        id_attr <- paste0(\" id='\", id, \"'\")\n        anchor <- anchor_html(id)\n      } else {\n        id_attr <- \"\"\n        anchor <- \"\"\n      }\n      paste0(\n        \"<dt\",\n        id_attr,\n        \">\",\n        term,\n        anchor,\n        \"</dt>\\n\",\n        \"<dd>\",\n        def,\n        \"</dd>\\n\"\n      )\n    } else {\n      flatten_text(x, ...)\n    }\n  }\n\n  paste(purrr::map_chr(rd, parse_item), collapse = \"\")\n}\n\n# Marking text ------------------------------------------------------------\n# https://cran.rstudio.com/doc/manuals/r-devel/R-exts.html#Marking-text\n\ntag_wrapper <- function(prefix, suffix = NULL) {\n  function(x, ...) {\n    html <- flatten_text(x, ...)\n    paste0(prefix, html, suffix)\n  }\n}\n\n#' @export\nas_html.tag_emph <- tag_wrapper(\"<em>\", \"</em>\")\n#' @export\nas_html.tag_strong <- tag_wrapper(\"<strong>\", \"</strong>\")\n#' @export\nas_html.tag_bold <- tag_wrapper(\"<b>\", \"</b>\")\n\n#' @export\nas_html.tag_dQuote <- tag_wrapper(\"&#8220;\", \"&#8221;\")\n#' @export\nas_html.tag_sQuote <- tag_wrapper(\"&#8216;\", \"&#8217;\")\n\n#' @export\nas_html.tag_code <- function(x, ..., auto_link = TRUE) {\n  text <- flatten_text(x, ...)\n\n  if (auto_link) {\n    href <- downlit::autolink_url(text)\n    text <- a(text, href = href)\n  }\n  paste0(\"<code>\", text, \"</code>\")\n}\n\n#' @export\nas_html.tag_preformatted <- function(x, ...) {\n  # the language is stored in a prior \\if{}{\\out{}} block, so we delay\n  # highlighting until we have the complete html page\n  pre(flatten_text(x, ...))\n}\n\n#' @export\nas_html.tag_kbd <- tag_wrapper(\"<kbd>\", \"</kbd>\")\n#' @export\nas_html.tag_samp <- tag_wrapper('<samp>', \"</samp>\")\n#' @export\nas_html.tag_verb <- tag_wrapper(\"<code>\", \"</code>\")\n\n#' @export\nas_html.tag_pkg <- tag_wrapper('<span class=\"pkg\">', \"</span>\")\n#' @export\nas_html.tag_file <- tag_wrapper('<code class=\"file\">', '</code>')\n\n#' @export\nas_html.tag_var <- tag_wrapper(\"<var>\", \"</var>\")\n#' @export\nas_html.tag_env <- tag_wrapper('<code class=\"env\">', '</code>')\n#' @export\nas_html.tag_option <- tag_wrapper('<span class=\"option\">', \"</span>\")\n#' @export\nas_html.tag_command <- tag_wrapper(\"<code class='command'>\", \"</code>\")\n\n#' @export\nas_html.tag_dfn <- tag_wrapper(\"<dfn>\", \"</dfn>\")\n#' @export\nas_html.tag_cite <- tag_wrapper(\"<cite>\", \"</cite>\")\n#' @export\nas_html.tag_acronym <- tag_wrapper('<acronym>', '</acronym>')\n\n#' @export\nas_html.tag_out <- function(x, ...) flatten_text(x, ..., escape = FALSE)\n\n# Insertions --------------------------------------------------------------\n\n#' @export\nas_html.tag_R <- function(x, ...) '<span style=\"R\">R</span>'\n#' @export\nas_html.tag_dots <- function(x, ...) \"...\"\n#' @export\nas_html.tag_ldots <- function(x, ...) \"...\"\n#' @export\nas_html.tag_cr <- function(x, ...) \"<br>\"\n\n# First element of enc is the encoded version (second is the ascii version)\n#' @export\nas_html.tag_enc <- function(x, ...) {\n  if (length(x) == 2) {\n    as_html(x[[1]], ...)\n  } else {\n    stop_bad_tag(\"enc\")\n  }\n}\n\n# Elements that don't return anything ----------------------------------------\n\n#' @export\nas_html.tag_tab <- function(x, ...) \"\"\n#' @export\nas_html.tag_newcommand <- function(x, ...) \"\"\n#' @export\nas_html.tag_renewcommand <- function(x, ...) \"\"\n\n#' @export\nas_html.tag <- function(x, ...) {\n  if (identical(class(x), \"tag\")) {\n    flatten_text(x, ...)\n  } else {\n    cli::cli_inform(\"Unknown tag: {.cls {class(x)}}\")\n    \"\"\n  }\n}\n\n# Whitespace helper -------------------------------------------------------\n\ntrim_ws_nodes <- function(x, side = c(\"both\", \"left\", \"right\")) {\n  is_ws <- purrr::map_lgl(x, ~ inherits(., \"TEXT\") && grepl(\"^\\\\s*$\", .[[1]]))\n\n  if (!any(is_ws)) {\n    return(x)\n  }\n  if (all(is_ws)) {\n    return(x[0])\n  }\n\n  which_not <- which(!is_ws)\n\n  side <- match.arg(side)\n  if (side %in% c(\"left\", \"both\")) {\n    start <- which_not[1]\n  } else {\n    start <- 1\n  }\n\n  if (side %in% c(\"right\", \"both\")) {\n    end <- which_not[length(which_not)]\n  } else {\n    end <- length(x)\n  }\n\n  x[start:end]\n}\n\n\n# Helpers -----------------------------------------------------------------\n\nparse_opts <- function(string) {\n  if (is.null(string)) {\n    return(list())\n  }\n\n  args <- list(\"text\", \"verbatim\", \"rd\", \"hide\", \"build\", \"install\", \"render\")\n  names(args) <- args\n  arg_env <- child_env(baseenv(), !!!args)\n\n  args <- strsplit(string, \",\")[[1]]\n  exprs <- purrr::map(args, parse_expr)\n\n  env <- child_env(arg_env)\n  purrr::walk(exprs, eval_bare, env = env)\n\n  as.list(env)\n}\n\nstop_bad_tag <- function(tag, msg = NULL) {\n  bad_tag <- paste0(\"\\\\\", tag, \"{}\")\n  msg_abort <- 'Failed to parse tag {.val {bad_tag}}.'\n  cli::cli_abort(c(msg_abort, i = msg), call = NULL)\n}\n\nis_newline <- function(x, trim = FALSE) {\n  if (!inherits(x, \"TEXT\") && !inherits(x, \"RCODE\") && !inherits(x, \"VERB\")) {\n    return(FALSE)\n  }\n\n  text <- x[[1]]\n  if (trim) {\n    text <- gsub(\"^[ \\t]+|[ \\t]+$\", \"\", text)\n  }\n  identical(text, \"\\n\")\n}\n"
  },
  {
    "path": "R/rd.R",
    "content": "rd_text <- function(x, fragment = TRUE) {\n  con <- textConnection(x)\n  on.exit(close(con), add = TRUE)\n\n  set_classes(tools::parse_Rd(con, fragment = fragment, encoding = \"UTF-8\"))\n}\n\nrd_file <- function(path, pkg_path = NULL) {\n  macros <- tools::loadPkgRdMacros(pkg_path)\n  set_classes(tools::parse_Rd(path, macros = macros, encoding = \"UTF-8\"))\n}\n\n#' Translate an Rd string to its HTML output\n#'\n#' @param x Rd string. Backslashes must be double-escaped (\"\\\\\\\\\").\n#' @param fragment logical indicating whether this represents a complete Rd file\n#' @param ... additional arguments for as_html\n#'\n#' @examples\n#' rd2html(\"a\\n%b\\nc\")\n#'\n#' rd2html(\"a & b\")\n#'\n#' rd2html(\"\\\\strong{\\\\emph{x}}\")\n#'\n#' @export\nrd2html <- function(x, fragment = TRUE, ...) {\n  html <- as_html(rd_text(x, fragment = fragment), ...)\n  str_trim(strsplit(str_trim(html), \"\\n\")[[1]])\n}\n\nprint.Rd <- function(x, ...) {\n  utils::str(x)\n}\n#' @export\nprint.tag <- function(x, ...) {\n  utils::str(x)\n}\n\n# Convert RD attributes to S3 classes -------------------------------------\n\nset_classes <- function(rd) {\n  if (is.list(rd)) {\n    rd[] <- lapply(rd, set_classes)\n  }\n  set_class(rd)\n}\n\nset_class <- function(x) {\n  structure(\n    x,\n    class = c(attr(x, \"class\"), tag(x), \"tag\"),\n    Rd_tag = NULL,\n    srcref = NULL,\n    macros = NULL\n  )\n}\n\ntag <- function(x) {\n  tag <- attr(x, \"Rd_tag\")\n  if (is.null(tag)) {\n    return()\n  }\n\n  gsub(\"\\\\\", \"tag_\", tag, fixed = TRUE)\n}\n\n#' @export\n`[.tag` <- function(x, ...) {\n  structure(NextMethod(), class = class(x))\n}\n"
  },
  {
    "path": "R/render.R",
    "content": "#' Render page with template\n#'\n#' Each page is composed of four templates: \"head\", \"header\", \"content\", and\n#' \"footer\". Each of these templates is rendered using the `data`, and\n#' then assembled into an overall page using the \"layout\" template.\n#'\n#' @param pkg Path to package to document.\n#' @param name Name of the template (e.g. \"home\", \"vignette\", \"news\")\n#' @param data Data for the template.\n#'\n#'   This is automatically supplemented with three lists:\n#'\n#'   * `site`: `title` and path to `root`.\n#'   * `yaml`: the `template` key from `_pkgdown.yml`.\n#'   * `package`: package metadata including `name` and`version`.\n#'\n#'   See the full contents by running [data_template()].\n#' @param path Location to create file; relative to destination directory.\n#' @param depth Depth of path relative to base directory.\n#' @param quiet If `quiet`, will suppress output messages\n#' @export\nrender_page <- function(\n  pkg = \".\",\n  name,\n  data,\n  path,\n  depth = NULL,\n  quiet = FALSE\n) {\n  pkg <- as_pkgdown(pkg)\n\n  if (is.null(depth)) {\n    depth <- dir_depth(path)\n  }\n\n  html <- render_page_html(pkg, name = name, data = data, depth = depth)\n\n  tweak_page(html, name, pkg = pkg)\n  activate_navbar(html, data$output_file %||% path, pkg)\n\n  rendered <- as.character(html, options = character())\n  write_if_different(pkg, rendered, path, quiet = quiet)\n}\n\nrender_page_html <- function(pkg, name, data = list(), depth = 0L) {\n  data <- modify_list(data_template(pkg, depth = depth), data)\n\n  # render template components\n  pieces <- c(\n    \"head\",\n    \"in-header\",\n    \"before-body\",\n    \"navbar\",\n    \"content\",\n    \"footer\",\n    \"after-body\",\n    if (pkg$bs_version == 3) c(\"header\", \"docsearch\")\n  )\n\n  templates <- purrr::map_chr(pieces, find_template, name = name, pkg = pkg)\n  components <- purrr::map(templates, render_template, data = data)\n  components <- purrr::set_names(components, pieces)\n  components$template <- name\n  components$lang <- pkg$lang\n  components$translate <- data$translate\n\n  # render complete layout\n  template <- find_template(\"layout\", name, pkg = pkg)\n  rendered <- render_template(template, components)\n\n  # Strip trailing whitespace\n  rendered <- gsub(\" +\\n\", \"\\n\", rendered, perl = TRUE)\n\n  xml2::read_html(rendered, encoding = \"UTF-8\")\n}\n\n#' @export\n#' @rdname render_page\ndata_template <- function(pkg = \".\", depth = 0L) {\n  pkg <- as_pkgdown(pkg)\n  out <- list()\n\n  # Basic metadata\n  out$package <- list(\n    name = pkg$package,\n    version = as.character(pkg$version)\n  )\n  if (has_logo(pkg)) {\n    out$logo <- list(src = logo_path(pkg, depth = depth))\n  }\n  out$site <- list(\n    root = up_path(depth),\n    title = config_pluck_string(pkg, \"title\", default = pkg$package)\n  )\n  out$year <- strftime(Sys.time(), \"%Y\")\n\n  # Language and translations\n  out$lang <- pkg$lang\n  out$translate <- list(\n    skip = tr_(\"Skip to contents\"),\n    toggle_nav = tr_(\"Toggle navigation\"),\n    on_this_page = tr_(\"On this page\"),\n    source = tr_(\"Source\"),\n    abstract = tr_(\"Abstract\"),\n    authors = tr_(\"Authors\"),\n    version = tr_(\"Version\"),\n    examples = tr_(\"Examples\"),\n    citation = tr_(\"Citation\"),\n    author_details = tr_(\"Additional details\"),\n    toc = tr_(\"Table of contents\"),\n    site_nav = tr_(\"Site navigation\")\n  )\n\n  # Components that mostly end up in the <head>\n  out$has_favicons <- has_favicons(pkg)\n  out$opengraph <- data_open_graph(pkg)\n  out$extra <- list(\n    css = path_first_existing(pkg$src_path, \"pkgdown\", \"extra.css\"),\n    js = path_first_existing(pkg$src_path, \"pkgdown\", \"extra.js\")\n  )\n  out$includes <- config_pluck(pkg, \"template.includes\")\n  out$yaml <- config_pluck(pkg, \"template.params\")\n  # Force inclusion so you can reliably refer to objects inside yaml\n  # in the mustache templates\n  out$yaml$.present <- TRUE\n  if (pkg$bs_version > 3) {\n    out$headdeps <- data_deps(pkg = pkg, depth = depth)\n  }\n\n  # Development settings; tooltip needs to be generated at render time\n  out$development <- pkg$development\n  out$development$version_tooltip <- version_tooltip(pkg$development$mode)\n\n  out$navbar <- data_navbar(pkg, depth = depth)\n  out$footer <- data_footer(pkg)\n  out$lightswitch <- uses_lightswitch(pkg)\n  out$uses_katex <- config_math_rendering(pkg) == \"katex\"\n  out$uses_mathjax <- config_math_rendering(pkg) == \"mathjax\"\n\n  print_yaml(out)\n}\n\ndata_open_graph <- function(pkg = \".\", call = caller_env()) {\n  pkg <- as_pkgdown(pkg)\n  og <- config_pluck_list(pkg, \"template.opengraph\", default = list())\n  og <- check_open_graph(pkg, og, call = call)\n\n  logo <- find_logo(pkg$src_path)\n  if (is.null(og$image) && !is.null(logo)) {\n    og$image <- list(src = path_file(logo))\n  }\n  if (!is.null(og$image) && !grepl(\"^http\", og$image$src)) {\n    site_url <- config_pluck(pkg, \"url\", default = \"/\")\n    if (!grepl(\"/$\", site_url)) {\n      site_url <- paste0(site_url, \"/\")\n    }\n    og$image$src <- gsub(\"^man/figures/\", \"reference/figures/\", og$image$src)\n    og$image$src <- paste0(site_url, og$image$src)\n  }\n\n  if (!is.null(og$twitter)) {\n    og$twitter$card <- og$twitter$card %||% \"summary\"\n    og$twitter$creator <- og$twitter$creator %||% og$twitter$site\n    og$twitter$site <- og$twitter$site %||% og$twitter$creator\n  }\n\n  og\n}\n\ncheck_open_graph <- function(pkg, og, file_path = NULL, call = caller_env()) {\n  if (is.null(og)) {\n    return()\n  }\n\n  is_yaml <- is.null(file_path)\n  base_path <- if (is_yaml) \"template.opengraph\" else \"opengraph\"\n\n  check_open_graph_list(\n    pkg,\n    og,\n    file_path = file_path,\n    error_path = base_path,\n    error_call = call\n  )\n\n  supported_fields <- c(\"image\", \"twitter\")\n  unsupported_fields <- setdiff(names(og), supported_fields)\n  if (length(unsupported_fields)) {\n    msg <- \"{.field {base_path}} contains unsupported fields {.val {unsupported_fields}}.\"\n    config_warn(pkg, msg, path = file_path, call = call)\n  }\n  check_open_graph_list(\n    pkg,\n    og$twitter,\n    file_path = file_path,\n    error_path = paste0(base_path, \".twitter\"),\n    error_call = call\n  )\n  if (\n    !is.null(og$twitter) &&\n      is.null(og$twitter$creator) &&\n      is.null(og$twitter$site)\n  ) {\n    msg <- \"{.field opengraph.twitter} must include either {.field creator} or {.field site}.\"\n    config_abort(pkg, msg, path = file_path, call = call)\n  }\n  check_open_graph_list(\n    pkg,\n    og$image,\n    file_path = file_path,\n    error_path = paste0(base_path, \".image\"),\n    error_call = call\n  )\n  og[intersect(supported_fields, names(og))]\n}\n\nrender_template <- function(path, data) {\n  template <- read_file(path)\n  if (length(template) == 0) {\n    return(\"\")\n  }\n\n  whisker::whisker.render(template, data)\n}\n\ncheck_open_graph_list <- function(\n  pkg,\n  x,\n  file_path,\n  error_path,\n  error_call = caller_env()\n) {\n  if (is.list(x) || is.null(x)) {\n    return()\n  }\n  not <- obj_type_friendly(x)\n  config_abort(\n    pkg,\n    \"{.field {error_path}} must be a list, not {not}.\",\n    path = file_path,\n    call = error_call\n  )\n}\n\nwrite_if_different <- function(\n  pkg,\n  contents,\n  path,\n  quiet = FALSE,\n  check = TRUE\n) {\n  # Almost all uses are relative to destination, except for rmarkdown templates\n  full_path <- path_abs(path, start = pkg$dst_path)\n\n  if (check && !made_by_pkgdown(full_path)) {\n    cli::cli_inform(\"Skipping {.file {path}}: not generated by pkgdown\")\n    return(FALSE)\n  }\n\n  if (same_contents(full_path, contents)) {\n    # touching the file to update its modification time\n    # which is important for proper lazy behavior\n    file_touch(full_path)\n    return(FALSE)\n  }\n\n  if (!quiet) {\n    writing_file(path_rel(full_path, pkg$dst_path), path)\n  }\n\n  write_lines(contents, path = full_path)\n  TRUE\n}\n\nsame_contents <- function(path, contents) {\n  if (!file_exists(path)) {\n    return(FALSE)\n  }\n\n  new_hash <- rlang::hash(contents)\n\n  cur_contents <- paste0(read_lines(path), collapse = \"\\n\")\n  cur_hash <- rlang::hash(cur_contents)\n\n  identical(new_hash, cur_hash)\n}\n\nfile_digest <- function(path) {\n  if (file_exists(path)) {\n    rlang::hash_file(path)\n  } else {\n    \"MISSING\"\n  }\n}\n\nmade_by_pkgdown <- function(path) {\n  if (!file_exists(path)) {\n    return(TRUE)\n  }\n\n  first <- paste(read_lines(path, n = 2), collapse = \"\\n\")\n  check_made_by(first)\n}\n\ncheck_made_by <- function(first) {\n  if (length(first) == 0L) {\n    return(FALSE)\n  }\n  grepl(\"<!-- Generated by pkgdown\", first, fixed = TRUE)\n}\n"
  },
  {
    "path": "R/repo.R",
    "content": "repo_type <- function(pkg) {\n  home <- repo_home(pkg) %||% \"\"\n\n  if (grepl(\"^https?://github\\\\..+/\", home)) {\n    \"github\"\n  } else if (grepl(\"^https?://gitlab\\\\..+/\", home)) {\n    \"gitlab\"\n  } else if (grepl(\"^https?://codeberg\\\\..+/\", home)) {\n    \"codeberg\"\n  } else {\n    \"other\"\n  }\n}\n\nrepo_home <- function(pkg, paths) {\n  pkg$repo$url$home\n}\n\nrepo_source <- function(pkg, paths) {\n  url <- pkg$repo$url\n  if (is.null(url$source) || length(paths) == 0) {\n    return()\n  }\n\n  needs_slash <- !grepl(\"/$\", url$source) & !grepl(\"^/\", paths)\n\n  links <- a(\n    paste0(\"<code>\", escape_html(paths), \"</code>\"),\n    paste0(url$source, ifelse(needs_slash, \"/\", \"\"), paths)\n  )\n\n  n <- length(links)\n  if (n >= 4) {\n    links <- c(links[1:3], paste0(\"and \", n - 3, \" more\"))\n  }\n\n  paste0(tr_(\"Source:\"), \" \", paste(links, collapse = \", \"))\n}\n\nrepo_auto_link <- function(pkg, text) {\n  url <- pkg$repo$url\n\n  if (!is.null(url$user)) {\n    user_link <- paste0(\"\\\\1<a href='\", url$user, \"\\\\2'>@\\\\2</a>\")\n    text <- gsub(\"(p>|\\\\s|^|\\\\()@([-\\\\w]+)\", user_link, text, perl = TRUE)\n  }\n\n  if (!is.null(url$issue)) {\n    issue_link <- paste0(\"<a href='\", url$issue, \"\\\\2'>#\\\\2</a>\")\n    text <- gsub(\n      \"(p>|\\\\(|\\\\s)#(\\\\d+)\",\n      paste0(\"\\\\1\", issue_link),\n      text,\n      perl = TRUE\n    )\n\n    if (!is.null(pkg$repo$jira_projects)) {\n      issue_link <- paste0(\"<a href='\", url$issue, \"\\\\1\\\\2'>\\\\1\\\\2</a>\")\n      issue_regex <- paste0(\n        \"(\",\n        paste0(pkg$repo$jira_projects, collapse = \"|\"),\n        \")(-\\\\d+)\"\n      )\n      text <- gsub(issue_regex, issue_link, text, perl = TRUE)\n    }\n  }\n\n  text\n}\n\n# Package data -------------------------------------------------------------\n\npackage_repo <- function(pkg) {\n  # Use metadata if available\n  repo <- config_pluck_list(pkg, \"repo\")\n  url <- config_pluck_list(pkg, \"repo.url\")\n\n  if (!is.null(url)) {\n    return(repo)\n  }\n\n  # Otherwise try and guess from `BugReports` (1st priority) and `URL`s (2nd priority)\n  urls <- c(\n    sub(\n      \"(/-)?/issues/?\",\n      \"/\",\n      pkg$desc$get_field(\"BugReports\", default = character())\n    ),\n    pkg$desc$get_urls()\n  )\n\n  gh_links <- grep(\n    \"^https?://(git(hub|lab)|codeberg)\\\\..+/\",\n    urls,\n    value = TRUE\n  )\n  if (length(gh_links) > 0) {\n    branch <- config_pluck_string(pkg, \"repo.branch\")\n    return(repo_meta_gh_like(gh_links[[1]], branch))\n  }\n\n  NULL\n}\n\nrepo_meta <- function(home = NULL, source = NULL, issue = NULL, user = NULL) {\n  list(\n    url = list(\n      home = home,\n      source = source,\n      issue = issue,\n      user = user\n    )\n  )\n}\n\nrepo_meta_gh_like <- function(link, branch = NULL) {\n  gh <- parse_github_like_url(link)\n  branch <- branch %||% gha_current_branch()\n  blob <- if (grepl(\"^https?://codeberg\\\\.\", link)) \"/src/branch/\" else \"/blob/\"\n  issues <- if (grepl(\"^https?://gitlab\\\\.\", link)) \"/-/issues/\" else \"/issues/\"\n\n  repo_meta(\n    paste0(gh$host, \"/\", gh$owner, \"/\", gh$repo, \"/\"),\n    paste0(gh$host, \"/\", gh$owner, \"/\", gh$repo, blob, branch, \"/\"),\n    paste0(gh$host, \"/\", gh$owner, \"/\", gh$repo, issues),\n    paste0(gh$host, \"/\")\n  )\n}\n\ngha_current_branch <- function() {\n  # Only set in pull requests\n  ref <- Sys.getenv(\"GITHUB_HEAD_REF\")\n  if (ref != \"\") {\n    return(ref)\n  }\n\n  # Set everywhere but might not be a branch\n  ref <- Sys.getenv(\"GITHUB_REF_NAME\")\n  if (ref != \"\") {\n    return(ref)\n  }\n\n  \"HEAD\"\n}\n\nparse_github_like_url <- function(link) {\n  supports_subgroups <- grepl(\"^https?://gitlab\\\\.\", link)\n  rx <- paste0(\n    \"^\",\n    \"(?<host>https?://[^/]+)/\",\n    \"(?<owner>[^/]+)/\",\n    \"(?<repo>[^#\",\n    \"/\"[!supports_subgroups],\n    \"]+)/\"\n  )\n  re_match(sub(\"([^/]$)\", \"\\\\1/\", link), rx)\n}\n"
  },
  {
    "path": "R/template.R",
    "content": "#' Generate YAML templates\n#'\n#' Use these function to generate the default YAML that pkgdown uses for\n#' the different parts of `_pkgdown.yml`. This are useful starting\n#' points if you want to customise your site.\n#'\n#' @param path Path to package root\n#' @rdname templates\n#' @examples\n#' \\dontrun{\n#' pkgdown::template_navbar()\n#' }\n#'\n#' @export\ntemplate_navbar <- function(path = \".\") {\n  pkg <- as_pkgdown(path)\n\n  print_yaml(list(\n    navbar = list(\n      structure = navbar_structure(),\n      components = navbar_components(pkg)\n    )\n  ))\n}\n\n#' @rdname templates\n#' @examples\n#' \\dontrun{\n#' pkgdown::template_reference()\n#' }\n#'\n#' @export\ntemplate_reference <- function(path = \".\") {\n  print_yaml(list(reference = default_reference_index(path)))\n}\n\n#' @rdname templates\n#' @examples\n#' \\dontrun{\n#' pkgdown::template_articles()\n#' }\n#'\n#' @export\ntemplate_articles <- function(path = \".\") {\n  print_yaml(list(articles = default_articles_index(path)))\n}\n"
  },
  {
    "path": "R/templates.R",
    "content": "find_template <- function(type, name, ext = \".html\", pkg = \".\") {\n  pkg <- as_pkgdown(pkg)\n\n  paths <- template_candidates(type = type, name = name, ext = ext, pkg = pkg)\n\n  existing <- paths[file_exists(paths)]\n\n  if (length(existing) == 0) {\n    tname <- paste0(type, \"-\", name)\n    cli::cli_abort(\n      \"Can't find template for {.val {tname}}.\",\n      call = caller_env()\n    )\n  }\n  existing[[1]]\n}\n\n# Used for testing\nread_template_html <- function(type, name, pkg = list()) {\n  if (is_list(pkg)) {\n    # promote to a shell \"pkgdown\" object so we don't need a complete pkg\n    class(pkg) <- \"pkgdown\"\n  }\n  path <- find_template(type = type, name = name, pkg = pkg)\n  xml2::read_html(path)\n}\n\ntemplate_candidates <- function(type, name, ext = \".html\", pkg = list()) {\n  paths <- c(\n    path(pkg$src_path, \"pkgdown\", \"templates\"),\n    templates_dir(pkg),\n    path_pkgdown(paste0(\"BS\", pkg$bs_version), \"templates\")\n  )\n  names <- c(paste0(type, \"-\", name, ext), paste0(type, ext))\n  all <- expand.grid(paths, names)\n\n  path(all[[1]], all[[2]])\n}\n\n# Find directory where custom templates might live:\n# * path supplied in `template.path`\n# * package supplied in `template.package`\n# * templates in package itself\ntemplates_dir <- function(pkg = list(), call = caller_env()) {\n  config_pluck_list(pkg, \"template\")\n  path <- config_pluck_string(pkg, \"template.path\")\n  package <- config_pluck_string(pkg, \"template.package\")\n\n  if (!is.null(path)) {\n    if (!dir_exists(path)) {\n      cli::cli_abort(\"Can't find templates path: {src_path(path)}\", call = call)\n    }\n    path_abs(path, start = pkg$src_path)\n  } else if (!is.null(package)) {\n    path_package_pkgdown(\"templates\", package, pkg$bs_version)\n  } else {\n    path(pkg$src_path, \"pkgdown\", \"templates\")\n  }\n}\n"
  },
  {
    "path": "R/test.R",
    "content": "#' Test case: lists\n#'\n#' @noMd\n#' @description\n#'\n#' \\subsection{Bulleted list}{\n#' \\itemize{\n#'   \\item a\n#'   \\item This is an item...\n#'\n#'     That spans multiple paragraphs.\n#' }\n#' }\n#'\n#' \\subsection{Bulleted list (single item)}{\n#' \\itemize{\\item a}\n#' }\n#'\n#' \\subsection{Numbered list}{\n#' \\enumerate{\n#'   \\item a\n#'   \\item b\n#' }\n#' }\n#'\n#' \\subsection{Definition list}{\n#' \\describe{\n#'   \\item{short}{short}\n#'   \\item{short}{Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do\n#'   eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad\n#'   minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip\n#'   ex ea commodo consequat. Duis aute irure dolor in reprehenderit in\n#'   voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur\n#'   sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt\n#'   mollit anim id est laborum.}\n#'   \\item{Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do\n#'   eiusmod tempor incididunt ut labore et dolore magna aliqua.}{short}\n#'   \\item{Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do\n#'   eiusmod tempor incididunt ut labore et dolore magna aliqua.}{Lorem ipsum\n#'   adipiscing elit, sed do  eiusmod tempor incididunt ut labore et dolore ad\n#'   minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip\n#'   ex ea commodo consequat. Duis aute irure dolor in reprehenderit in\n#'   voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur\n#'   sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt\n#'   mollit anim id est laborum.}\n#' }\n#' }\n#' @keywords internal\n#' @family tests\n#' @name test-lists\nNULL\n\n#' Test case: links\n#'\n#' ```{r}\n#' jsonlite::minify(\"{}\")\n#' ```\n#'\n#' @name test-links\n#' @keywords internal\n#' @family tests\n#' @examples\n#' jsonlite::minify(\"{}\")\n#'\n#' library(jsonlite, warn.conflicts = FALSE)\n#' minify(\"{}\")\nNULL\n\n#' Test case: figures\n#'\n#' \\figure{bacon.jpg}\n#'\n#' @name test-figures\n#' @keywords internal\n#' @family tests\n#' @examples\n#' x <- seq(0, 2 * pi, length.out = 25)\n#' plot(x, sin(x))\n#'\n#' plot(1:10)\n#' lines(1:10)\n#' text(2, 5, \"Hello\", srt = 30, cex = 2)\n#'\n#' plot(1:3, col = c(\"red\", \"green\", \"blue\"), pch = 16, cex = 10)\nNULL\n\n#' Test case: tables\n#'\n#' @name test-tables\n#' @keywords internal\n#' @family tests\n#' @examples\n#' gt::gt(head(mtcars))\nNULL\n\n#' Test case: don't\n#'\n#' @name test-dont\n#' @keywords internal\n#' @family tests\n#' @examples\n#' # \\dontrun{} --------------------------------------------------------\n#' # always shown; never run\n#'\n#' x <- 1\n#' \\dontrun{x <- 2}\n#' \\dontrun{\n#'   x <- 3\n#'   x <- 4\n#' }\n#' x # should be 1\n#'\n#' # \\donttest{} -------------------------------------------------------\n#' # only multiline are shown; always run\n#'\n#' x <- 1\n#' \\donttest{x <- 2}\n#' \\donttest{\n#'   x <- 3\n#'   x <- 4\n#' }\n#' x # should be 4\n#'\n#' # \\testonly{} -----------------------------------------------------\n#' # never shown, never run\n#'\n#' x <- 1\n#' \\testonly{x <- 2}\n#' \\testonly{\n#'   x <- 3\n#'   x <- 4\n#' }\n#' x # should be 1\n#'\n#' # \\dontshow{} -------------------------------------------------------\n#' # never shown, always run\n#'\n#' x <- 1\n#' \\dontshow{x <- 2}\n#' \\dontshow{\n#'   x <- 3\n#'   x <- 4\n#' }\n#' x # should be 4\n#'\n#' # @examplesIf ------------------------------------------------------\n#' # If FALSE, wrapped in if; if TRUE, not seen\n#'\n#' x <- 1\n#'\n#' @examplesIf FALSE\n#' x <- 2\n#' @examplesIf TRUE\n#' x <- 3\n#' @examples\n#' x # should be 3\nNULL\n\n#' Test case: params\n#'\n#' @name test-params\n#' @param ... ellipsis\n#' @keywords internal\n#' @family tests\nNULL\n\n#' Test case: output styles\n#'\n#' @name test-output-styles\n#' @keywords internal\n#' @family tests\n#'\n#' @examples\n#' # This example illustrates some important output types\n#' # The following output should be wrapped over multiple lines\n#' a <- 1:100\n#' a\n#'\n#' cat(\"This some text!\\n\")\n#' message(\"This is a message!\")\n#' warning(\"This is a warning!\")\n#'\n#' # This is a multi-line block\n#' {\n#'   1 + 2\n#'   2 + 2\n#' }\nNULL\n\n#' Test case: long-lines\n#'\n#' The example results should have the copy button correctly placed when\n#' scrollings\n#'\n#' @name test-long-lines\n#' @keywords internal\n#' @family tests\n#' @examples\n#' pkgdown:::ruler()\n#'\n#' cat(rep(\"x \", 100), sep = \"\")\n#' cat(rep(\"xy\", 100), sep = \"\")\n#' cat(rep(\"x \", 100), sep = \"\")\n#' cat(rep(\"xy\", 100), sep = \"\")\nNULL\n\n#' Test case: crayon\n#'\n#' @name test-crayon\n#' @keywords internal\n#' @family tests\n#'\n#' @examples\n#' cat(cli::col_red(\"This is red\"), \"\\n\")\n#' cat(cli::col_blue(\"This is blue\"), \"\\n\")\n#'\n#' message(cli::col_green(\"This is green\"))\n#'\n#' warning(cli::style_bold(\"This is bold\"))\nNULL\n\n#' Test case: preformatted blocks & syntax highlighting\n#'\n#' Manual test cases for various ways of embedding code in sections.\n#' All code blocks should have copy and paste button.\n#'\n#' # Should be highlighted\n#'\n#' Valid R code in `\\preformatted{}`:\n#'\n#' ```\n#' mean(a + 1)\n#' ```\n#'\n#' R code in `R` block:\n#'\n#' ```R\n#' mean(a + 1)\n#' ```\n#'\n#' R code in `r` block:\n#'\n#' ```r\n#' mean(a + 1)\n#' ```\n#'\n#' Yaml\n#'\n#' ```yaml\n#' yaml: [a, 1]\n#' ```\n#'\n#' # Shouldn't be highlighted\n#'\n#' Non-R code in `\\preformatted{}`\n#'\n#' ```\n#' yaml: [a, b, c]\n#' ```\n#'\n#' @name test-verbatim\n#' @keywords internal\n#' @family tests\nNULL\n\n#' Index\n#'\n#' @aliases test-index\n#' @name index\n#' @keywords internal\n#' @family tests\nNULL\n\n#' Test case: \\Sexpr[stage=render,results=rd]{\"sexpr\"}\n#'\n#' @name test-sexpr-title\n#' @keywords internal\n#' @family tests\nNULL\n\n#' Test case: math rendering in examples\n#'\n#' @param x \\eqn{f(x) > 0}: inline equation\n#'\n#' @details\n#' Display equation:\n#'\n#' \\deqn{y = \\alpha + \\beta X + \\varepsilon}\n#'\n#' Multi-line equation (correctly rendered by katex only):\n#'\n#' \\deqn{\\text{Minimize } l \\\\\n#' \\text{ subject to } \\\\\n#' \\sum_{i = 1}^{I} x_i r_{ij} + y_j \\geq t_j \\forall j \\in J \\\\\n#' l \\geq \\frac{y_j}{t_j} \\forall j \\in J \\\\\n#' \\sum_{i = 1}^{I} x_i c_i \\leq B}{\n#' Minimize l subject to\n#' sum_i^I (xi * rij) + yj >= tj for all j in J &\n#' l >= (yj / tj) for all j in J &\n#' sum_i^I (xi * ci) <= B}\n#'\n#' @name test-math-examples\n#' @keywords internal\n#' @family tests\nNULL\n"
  },
  {
    "path": "R/theme.R",
    "content": "build_bslib <- function(pkg = \".\", call = caller_env()) {\n  pkg <- as_pkgdown(pkg)\n  bs_theme <- bs_theme(pkg, call = call)\n\n  cur_deps <- find_deps(pkg)\n  cur_digest <- purrr::map_chr(cur_deps, file_digest)\n\n  deps <- c(bslib::bs_theme_dependencies(bs_theme), external_dependencies(pkg))\n  deps <- lapply(\n    deps,\n    htmltools::copyDependencyToDir,\n    path(pkg$dst_path, \"deps\")\n  )\n  deps <- lapply(deps, htmltools::makeDependencyRelative, pkg$dst_path)\n\n  new_deps <- find_deps(pkg)\n  new_digest <- purrr::map_chr(cur_deps, file_digest)\n\n  all_deps <- union(new_deps, cur_deps)\n  diff <- (cur_digest[all_deps] == new_digest[all_deps])\n  changed <- all_deps[!diff | is.na(diff)]\n\n  if (length(changed) > 0) {\n    withr::local_locale(LC_COLLATE = \"C\")\n    purrr::walk(sort(changed), function(dst) {\n      cli::cli_inform(\"Updating {dst_path(path_rel(dst, pkg$dst_path))}\")\n    })\n  }\n\n  head <- htmltools::renderDependencies(deps, srcType = \"file\")\n  write_lines(head, data_deps_path(pkg))\n}\n\ndata_deps <- function(pkg, depth) {\n  if (!file_exists(data_deps_path(pkg))) {\n    # this is unlikely to occur after #2439 and #2571\n    cli::cli_abort(\n      \"Run {.fn pkgdown::init_site} first.\",\n      .internal = TRUE,\n      call = caller_env()\n    )\n  }\n\n  deps_path <- paste0(up_path(depth), \"deps\")\n\n  data_deps <- read_lines(data_deps_path(pkg))\n  data_deps <- gsub('src=\"deps', sprintf('src=\"%s', deps_path), data_deps)\n  data_deps <- gsub('href=\"deps', sprintf('href=\"%s', deps_path), data_deps)\n\n  paste0(data_deps, collapse = \"\")\n}\n\ndata_deps_path <- function(pkg) {\n  path(pkg$dst_path, \"deps\", \"data-deps.txt\")\n}\n\nfind_deps <- function(pkg) {\n  deps_path <- path(pkg$dst_path, \"deps\")\n  if (!dir_exists(deps_path)) {\n    character()\n  } else {\n    dir_ls(deps_path, type = \"file\", recurse = TRUE)\n  }\n}\n\nbs_theme <- function(pkg = \".\", call = caller_env()) {\n  pkg <- as_pkgdown(pkg)\n\n  bs_theme_args <- pkg$meta$template$bslib %||% list()\n  bs_theme_args[[\"version\"]] <- pkg$bs_version\n  # In bslib >= 0.5.1, bs_theme() takes bootstrap preset theme via `preset`\n  bs_theme_args[[\"preset\"]] <- get_bslib_theme(pkg)\n  bs_theme_args[[\"bootswatch\"]] <- NULL\n\n  bs_theme <- exec(bslib::bs_theme, !!!bs_theme_args)\n\n  # Drop bs3 compat files added for shiny/RMarkdown\n  bs_theme <- bslib::bs_remove(bs_theme, \"bs3compat\")\n\n  # Add additional pkgdown rules\n  rules <- bs_theme_rules(pkg, call = call)\n  files <- lapply(rules, sass::sass_file)\n  bs_theme <- bslib::bs_add_rules(bs_theme, files)\n\n  # Add dark theme if needed\n  if (uses_lightswitch(pkg)) {\n    dark_theme <- config_pluck_string(\n      pkg,\n      \"template.theme-dark\",\n      default = \"arrow-dark\"\n    )\n    check_theme(\n      dark_theme,\n      error_pkg = pkg,\n      error_path = \"template.theme-dark\",\n      error_call = call\n    )\n    path <- highlight_path(dark_theme)\n    css <- c('[data-bs-theme=\"dark\"] {', read_lines(path), '}')\n    bs_theme <- bslib::bs_add_rules(bs_theme, css)\n  }\n\n  bs_theme\n}\n\nbs_theme_rules <- function(pkg, call = caller_env()) {\n  paths <- path_pkgdown(\"BS5\", \"assets\", \"pkgdown.scss\")\n\n  theme <- config_pluck_string(pkg, \"template.theme\", default = \"arrow-light\")\n  check_theme(\n    theme,\n    error_pkg = pkg,\n    error_path = \"template.theme\",\n    error_call = call\n  )\n  paths <- c(paths, highlight_path(theme))\n\n  package <- config_pluck_string(pkg, \"template.package\")\n  if (!is.null(package)) {\n    package_extra <- path_package_pkgdown(\"extra.scss\", package, pkg$bs_version)\n    if (file_exists(package_extra)) {\n      paths <- c(paths, package_extra)\n    }\n  }\n\n  # Also look in site supplied\n  site_extra <- path(pkg$src_path, \"pkgdown\", \"extra.scss\")\n  if (file_exists(site_extra)) {\n    paths <- c(paths, site_extra)\n  }\n\n  paths\n}\n\ncheck_theme <- function(\n  theme,\n  error_pkg,\n  error_path,\n  error_call = caller_env()\n) {\n  if (theme %in% highlight_styles()) {\n    return()\n  }\n  config_abort(\n    error_pkg,\n    \"{.field {error_path}} uses theme {.val {theme}}\",\n    call = error_call\n  )\n}\n\nhighlight_path <- function(theme) {\n  path_pkgdown(\"highlight-styles\", paste0(theme, \".scss\"))\n}\n\nhighlight_styles <- function() {\n  paths <- dir_ls(path_pkgdown(\"highlight-styles\"), glob = \"*.scss\")\n  path_ext_remove(path_file(paths))\n}\n\nget_bslib_theme <- function(pkg) {\n  themes <- list(\n    \"template.bslib.preset\" = pkg$meta[[\"template\"]]$bslib$preset,\n    \"template.bslib.bootswatch\" = pkg$meta[[\"template\"]]$bslib$bootswatch,\n    \"template.bootswatch\" = pkg$meta[[\"template\"]]$bootswatch,\n    # Historically (< 0.2.0), bootswatch wasn't a top-level template field\n    \"template.params.bootswatch\" = pkg$meta[[\"template\"]]$params$bootswatch\n  )\n\n  is_present <- !purrr::map_lgl(themes, is.null)\n  n_present <- sum(is_present)\n  n_unique <- length(unique(themes[is_present]))\n\n  if (n_present == 0) {\n    return(\"default\")\n  }\n\n  if (n_present > 1 && n_unique > 1) {\n    cli::cli_warn(c(\n      \"Multiple Bootstrap preset themes were set. Using {.val {themes[is_present][[1]]}} from {.field {names(themes)[is_present][1]}}.\",\n      x = \"Found {.and {.field {names(themes)[is_present]}}}.\",\n      i = \"Remove extraneous theme declarations to avoid this warning.\"\n    ))\n  }\n\n  field <- names(themes)[which(is_present)[1]]\n  check_bslib_theme(themes[[field]], pkg, field)\n}\n\ncheck_bslib_theme <- function(\n  theme,\n  pkg,\n  field = \"template.bootswatch\",\n  bs_version = pkg$bs_version\n) {\n  bslib_themes <- c(\n    bslib::bootswatch_themes(bs_version),\n    bslib::builtin_themes(bs_version),\n    # bs_theme() recognizes both below as bare bootstrap\n    \"default\",\n    \"bootstrap\"\n  )\n\n  if (theme %in% bslib_themes) {\n    return(theme)\n  }\n\n  config_abort(\n    pkg,\n    c(\n      x = \"{.field {field}} contains unknown Bootswatch/bslib theme {.val {theme}}.\",\n      i = \"Using Bootstrap version {.val {bs_version}} ({.field template.bootstrap}).\"\n    ),\n    call = caller_env()\n  )\n}\n\nbs_theme_deps_suppress <- function(deps = list()) {\n  # jquery and bootstrap are provided by bslib\n  # headr-attrs is included for pandoc 2.7.3 - 2.9.2.1 to improve accessibility\n  # but includes javascript that breaks our HTML anchor system\n  bs_dep_names <- c(\"jquery\", \"bootstrap\", \"header-attrs\")\n  bs_deps <- purrr::map(bs_dep_names, function(name) {\n    # minimal version of htmltools::htmlDependency() (see suppressDependencies())\n    structure(\n      list(\n        name = name,\n        version = \"9999\",\n        src = list(href = \"\"),\n        all_files = TRUE\n      ),\n      class = \"html_dependency\"\n    )\n  })\n\n  c(deps, bs_deps)\n}\n"
  },
  {
    "path": "R/topics-external.R",
    "content": "ext_topics <- function(match_strings) {\n  pieces <- strsplit(match_strings, \"::\", fixed = TRUE)\n  pkg <- purrr::map_chr(pieces, 1)\n  fun <- sub(\"\\\\(\\\\)$\", \"\", purrr::map_chr(pieces, 2))\n\n  unwrap_purrr_error(\n    ext_rd <- purrr::map2(pkg, fun, get_rd_from_help)\n  )\n  ext_title <- purrr::map_chr(ext_rd, extract_title)\n  ext_href <- purrr::map2_chr(fun, pkg, downlit::href_topic)\n  ext_funs <- purrr::map(ext_rd, topic_funs)\n\n  tibble::tibble(\n    name = match_strings,\n    file_in = NA_character_,\n    file_out = ext_href,\n    alias = list(character()), # used to find icons,\n    funs = ext_funs, # used list alternative names\n    title = sprintf(\"%s (from %s)\", ext_title, pkg),\n    rd = list(character()),\n    source = NA_character_,\n    keywords = list(character()), # used for has_keyword()\n    concepts = list(character()), # used for has_concept()\n    internal = FALSE,\n    lifecycle = list(NULL) # used for has_lifecycle\n  )\n}\n\n# Adapted from roxygen2::get_rd_from_help\nget_rd_from_help <- function(package, alias) {\n  call <- quote(build_reference_index())\n  check_installed(package, \"as it's used in the reference index.\", call = call)\n\n  help <- utils::help((alias), (package))\n  if (length(help) == 0) {\n    fun <- paste0(package, \"::\", alias)\n    cli::cli_abort(\n      \"Could not find documentation for {.fn {fun}}.\",\n      call = call\n    )\n    return()\n  }\n\n  out <- get(\".getHelpFile\", envir = asNamespace(\"utils\"))(help)\n  set_classes(out)\n}\n"
  },
  {
    "path": "R/topics.R",
    "content": "# @return An integer vector giving selected topics\nselect_topics <- function(\n  match_strings,\n  topics,\n  check = FALSE,\n  error_path,\n  error_pkg,\n  error_call = caller_env()\n) {\n  n <- nrow(topics)\n  if (length(match_strings) == 0) {\n    return(integer())\n  }\n\n  indexes <- unwrap_purrr_error(purrr::imap(\n    match_strings,\n    match_eval,\n    env = match_env(topics),\n    error_path = error_path,\n    error_pkg = error_pkg,\n    error_call = error_call\n  ))\n\n  # If none of the specified topics have a match, return no topics\n  if (purrr::every(indexes, is_empty)) {\n    if (check) {\n      msg <- \"{.field {error_path}} failed to match any topics.\"\n      config_abort(error_pkg, msg, call = error_call)\n    }\n    return(integer())\n  }\n\n  no_match <- match_strings[purrr::map_lgl(indexes, rlang::is_empty)]\n  if (check && length(no_match) > 0) {\n    topic_must(\n      \"match a function or concept\",\n      toString(no_match),\n      error_pkg = error_pkg,\n      error_path = error_path,\n      error_call = error_call\n    )\n  }\n\n  indexes <- purrr::discard(indexes, is_empty)\n  # Combine integer positions; adding if +ve, removing if -ve\n  sign <- all_sign(\n    indexes[[1]],\n    match_strings[[1]],\n    error_pkg = error_pkg,\n    error_path = paste0(error_path, \"[1]\"),\n    error_call = error_call\n  )\n  sel <- switch(sign, \"+\" = integer(), \"-\" = seq_len(n)[!topics$internal])\n\n  for (i in seq2(1, length(indexes))) {\n    index <- indexes[[i]]\n\n    sign <- all_sign(\n      indexes[[i]],\n      match_strings[[i]],\n      error_pkg = error_pkg,\n      error_path = paste0(error_path, \"[\", i, \"]\"),\n      error_call = error_call\n    )\n    sel <- switch(\n      sign,\n      \"+\" = union(sel, indexes[[i]]),\n      \"-\" = setdiff(sel, -indexes[[i]])\n    )\n  }\n  sel\n}\n\nall_sign <- function(\n  x,\n  text,\n  error_pkg,\n  error_path,\n  error_call = caller_env()\n) {\n  if (is.numeric(x)) {\n    if (all(x < 0)) {\n      return(\"-\")\n    }\n\n    if (all(x > 0)) {\n      return(\"+\")\n    }\n  }\n  config_abort(\n    error_pkg,\n    \"{.field {error_path}} ({text}) must be all negative or all positive.\",\n    call = error_call\n  )\n}\n\nmatch_env <- function(topics) {\n  fns <- env(empty_env(), \"-\" = function(x) -x, \"c\" = function(...) c(...))\n  out <- env(fns)\n\n  topic_index <- seq_along(topics$name)\n\n  # Each \\alias{} is matched to its position\n  topics$alias <- lapply(topics$alias, unique)\n  aliases <- set_names(\n    rep(topic_index, lengths(topics$alias)),\n    unlist(topics$alias)\n  )\n  env_bind(out, !!!aliases)\n\n  # As is each \\name{} - we bind these second so that if \\name{x} and \\alias{x}\n  # are in different files, \\name{x} wins. This doesn't usually matter, but\n  # \\name{} needs to win so that the default_reference_index() matches the\n  # correct files\n  env_bind(out, !!!set_names(topic_index, topics$name))\n\n  # dplyr-like matching functions\n\n  any_alias <- function(f, ..., .internal = FALSE) {\n    f <- as_function(f)\n    alias_match <- purrr::map_lgl(unname(topics$alias), function(x) {\n      any(f(x, ...))\n    })\n    name_match <- purrr::map_lgl(topics$name, f, ...)\n\n    which((alias_match | name_match) & is_public(.internal))\n  }\n\n  is_public <- function(internal) {\n    if (!internal) !topics$internal else rep(TRUE, nrow(topics))\n  }\n  fns$starts_with <- function(x, internal = FALSE) {\n    check_string(x)\n    check_bool(internal)\n\n    any_alias(~ grepl(paste0(\"^\", x), .), .internal = internal)\n  }\n  fns$ends_with <- function(x, internal = FALSE) {\n    check_string(x)\n    check_bool(internal)\n\n    any_alias(~ grepl(paste0(x, \"$\"), .), .internal = internal)\n  }\n  fns$matches <- function(x, internal = FALSE) {\n    check_string(x)\n    check_bool(internal)\n\n    any_alias(~ grepl(x, .), .internal = internal)\n  }\n  fns$contains <- function(x, internal = FALSE) {\n    check_string(x)\n    check_bool(internal)\n\n    any_alias(~ grepl(x, ., fixed = TRUE), .internal = internal)\n  }\n  fns$has_keyword <- function(x) {\n    check_character(x)\n    which(purrr::map_lgl(topics$keywords, ~ any(. %in% x)))\n  }\n  fns$has_lifecycle <- function(x) {\n    check_string(x)\n    which(purrr::map_lgl(topics$lifecycle, ~ any(. %in% x)))\n  }\n  fns$has_concept <- function(x, internal = FALSE) {\n    check_string(x)\n    check_bool(internal)\n\n    match <- purrr::map_lgl(topics$concepts, ~ any(str_trim(.) == x))\n    which(match & is_public(internal))\n  }\n  fns$lacks_concepts <- function(x, internal = FALSE) {\n    check_character(x)\n    check_bool(internal)\n\n    match <- purrr::map_lgl(topics$concepts, ~ any(str_trim(.) == x))\n    which(!match & is_public(internal))\n  }\n  fns$lacks_concept <- fns$lacks_concepts\n  out\n}\n\nmatch_eval <- function(\n  string,\n  index,\n  env,\n  error_pkg,\n  error_path,\n  error_call = caller_env()\n) {\n  error_path <- paste0(error_path, \"[\", index, \"]\")\n\n  # Early return in case string already matches symbol\n  if (env_has(env, string)) {\n    val <- env[[string]]\n    if (is.integer(val)) {\n      return(val)\n    }\n  }\n\n  expr <- tryCatch(parse_expr(string), error = function(e) NULL)\n  if (is.null(expr)) {\n    topic_must(\n      \"be valid R code\",\n      string,\n      error_pkg = error_pkg,\n      error_path = error_path,\n      error_call = error_call\n    )\n  }\n\n  if (is_string(expr) || is_symbol(expr)) {\n    expr <- as.character(expr)\n    val <- env_get(env, expr, default = NULL)\n    if (is.integer(val)) {\n      val\n    } else {\n      topic_must(\n        \"be a known topic name or alias\",\n        string,\n        error_pkg = error_pkg,\n        error_path = error_path,\n        error_call = error_call\n      )\n    }\n  } else if (is_call(expr, \"::\")) {\n    name <- paste0(expr[[2]], \"::\", expr[[3]])\n    val <- env_get(env, name, default = NULL)\n    if (is.integer(val)) {\n      val\n    } else {\n      topic_must(\n        \"be a known topic name or alias\",\n        string,\n        error_pkg = error_pkg,\n        error_path = error_path,\n        error_call = error_call\n      )\n    }\n  } else if (is_call(expr)) {\n    withCallingHandlers(\n      eval(expr, env),\n      error = function(e) {\n        config_abort(\n          error_pkg,\n          \"{.field {error_path}} ({string}) failed to evaluate.\",\n          parent = e,\n          call = error_call\n        )\n      }\n    )\n  } else {\n    topic_must(\n      \"be a string or function call\",\n      string,\n      error_pkg = error_pkg,\n      error_path = error_path,\n      error_call = error_call\n    )\n  }\n}\n\ntopic_must <- function(message, topic, error_pkg, error_path, error_call, ...) {\n  msg <- \"{.field {error_path}} ({topic}) must {message}.\"\n  config_abort(error_pkg, msg, call = error_call, ...)\n}\n\nsection_topics <- function(\n  pkg,\n  match_strings,\n  error_path,\n  error_call = error_call()\n) {\n  # Add rows for external docs\n  ext_strings <- match_strings[grepl(\"::\", match_strings, fixed = TRUE)]\n  topics <- rbind(pkg$topics, ext_topics(ext_strings))\n\n  idx <- select_topics(\n    match_strings,\n    topics,\n    error_pkg = pkg,\n    error_path = error_path,\n    error_call = error_call\n  )\n  selected <- topics[idx, , drop = FALSE]\n\n  tibble::tibble(\n    name = selected$name,\n    path = selected$file_out,\n    title = selected$title,\n    lifecycle = selected$lifecycle,\n    aliases = purrr::map2(\n      selected$funs,\n      selected$alias,\n      ~ if (length(.x) > 0) .x else .y\n    ),\n    icon = find_icons(selected$alias, path(pkg$src_path, \"icons\"))\n  )\n}\n"
  },
  {
    "path": "R/tweak-homepage.R",
    "content": "tweak_homepage_html <- function(\n  html,\n  strip_header = FALSE,\n  sidebar = TRUE,\n  show_badges = TRUE,\n  bs_version = 3,\n  logo = NULL\n) {\n  html <- tweak_sidebar_html(html, sidebar = sidebar, show_badges = show_badges)\n\n  # Always remove dummy page header\n  header <- xml2::xml_find_all(html, \".//div[contains(@class, 'page-header')]\")\n  if (length(header) > 0) {\n    xml2::xml_remove(header, free = TRUE)\n  }\n\n  header <- xml2::xml_find_first(html, \".//h1\")\n  if (strip_header) {\n    page_header <- xml2::xml_remove(header, free = TRUE)\n  } else {\n    page_header <- xml2::xml_add_parent(header, \"div\", class = \"page-header\")\n  }\n\n  if (!is.null(logo) && bs_version > 3) {\n    # Remove logo if added to h1\n    # Bare image\n    xml2::xml_remove(xml2::xml_find_all(\n      html,\n      \".//h1/img[contains(@src, 'logo')]\"\n    ))\n\n    # Image in link\n    xml2::xml_remove(\n      xml2::xml_parent(\n        xml2::xml_find_all(html, \".//h1/a/img[contains(@src, 'logo')]\")\n      )\n    )\n\n    # Add back to header\n    xml2::xml_add_sibling(\n      page_header,\n      \"img\",\n      src = logo,\n      class = \"logo\",\n      alt = \"\",\n      .where = \"before\"\n    )\n  }\n\n  invisible()\n}\n\ntweak_sidebar_html <- function(html, sidebar = TRUE, show_badges = TRUE) {\n  if (!sidebar) {\n    return(html)\n  }\n\n  # this extracts *and removes* badges from HTML\n  badges <- badges_extract(html)\n\n  dev_status_html <- xml2::xml_find_first(html, \".//div[@class='dev-status']\")\n  if (inherits(dev_status_html, \"xml_missing\")) {\n    return(html)\n  }\n  if (!show_badges || length(badges) == 0) {\n    xml2::xml_remove(dev_status_html)\n  } else {\n    list <- sidebar_section(tr_(\"Dev status\"), badges)\n    list_html <- xml2::xml_find_first(\n      xml2::read_html(list, encoding = \"UTF-8\"),\n      \".//div\"\n    )\n    xml2::xml_replace(dev_status_html, list_html)\n  }\n\n  html\n}\n\n# Mutates `html`, removing the badge container\nbadges_extract <- function(html) {\n  # First try specially named element;\n  x <- xml2::xml_find_first(html, \"//div[@id='badges']\")\n  strict <- FALSE\n\n  # then try usethis-readme-like more complex structure;\n  if (length(x) == 0) {\n    # Find start comment, then all elements after\n    # which are followed by the end comment.\n    x <- xml2::xml_find_all(\n      html,\n      \"\n      //comment()[contains(., 'badges: start')][1]\n      /following-sibling::*[following-sibling::comment()[contains(., 'badges: end')]]\n    \"\n    )\n  }\n\n  # then try usethis-readme-like paragraph;\n  # where the badges: end comment is inside the paragraph after badges: start\n  if (length(x) == 0) {\n    x <- xml2::xml_find_all(\n      html,\n      \".//*/comment()[contains(., 'badges: start')]/following-sibling::p[1]\"\n    )\n  }\n\n  # finally try first paragraph\n  if (length(x) == 0) {\n    # BS5 (main) and BS3 (div)\n    x <- xml2::xml_find_first(\n      html,\n      \"//main/p|//div[@class='contents col-md-9']/p\"\n    )\n    strict <- TRUE\n  }\n\n  # No paragraph\n  if (length(x) == 0) {\n    return(character())\n  }\n\n  # If we guessed the element,\n  # we only proceed if there is no text\n  if (strict && any(xml2::xml_text(x, trim = TRUE) != \"\")) {\n    return(character())\n  }\n\n  # Proceed if we find image-containing links\n  badges <- xml2::xml_find_all(x, \".//a[img]\")\n  if (length(badges) == 0) {\n    return(character())\n  }\n\n  xml2::xml_remove(x)\n\n  as.character(badges)\n}\n\nbadges_extract_text <- function(x) {\n  html <- xml2::read_html(x, encoding = \"UTF-8\")\n  badges_extract(html)\n}\n"
  },
  {
    "path": "R/tweak-navbar.R",
    "content": "activate_navbar <- function(html, path, pkg = list(bs_version = 5)) {\n  if (pkg$bs_version <= 3) {\n    return()\n  }\n\n  path <- remove_useless_parts(path, pkg = pkg)\n\n  # Get nav items, their links, their similarity to the current path\n  navbar_haystack <- navbar_links_haystack(html, pkg, path)\n  if (nrow(navbar_haystack) == 0) {\n    return()\n  }\n\n  # Pick the most similar link, activate the corresponding nav item\n  best_match <- navbar_haystack[which.max(navbar_haystack$similar), ]\n  tweak_class_prepend(best_match$nav_item[[1]], \"active\")\n\n  invisible()\n}\n\nnavbar_links_haystack <- function(html, pkg, path) {\n  # Extract links from the menu items\n  html_navbar <- xml2::xml_find_first(\n    html,\n    \".//div[contains(@class, 'navbar')]\"\n  )\n  nav_items <- xml2::xml_find_all(\n    html_navbar,\n    \".//li[contains(@class, 'nav-item')]\"\n  )\n\n  get_hrefs <- function(nav_item, pkg = pkg) {\n    href <- xml2::xml_attr(xml2::xml_child(nav_item), \"href\")\n\n    if (!is.na(href) && href != \"#\") {\n      links <- href\n    } else {\n      # links in a drop-down\n      hrefs <- xml2::xml_attr(xml2::xml_find_all(nav_item, \".//a\"), \"href\")\n      links <- hrefs[hrefs != \"#\"]\n    }\n\n    tibble::tibble(\n      nav_item = list(nav_item),\n      links = remove_useless_parts(\n        links[is_internal_link(links, pkg = pkg)],\n        pkg = pkg\n      )\n    )\n  }\n\n  haystack <- do.call(rbind, lapply(nav_items, get_hrefs, pkg = pkg))\n\n  # For each link, calculate similarity to the current path\n  separate_path <- function(link) {\n    strsplit(link, \"/\")[[1]]\n  }\n  get_similarity <- function(stalk, needle) {\n    needle <- separate_path(needle)\n    stalk <- separate_path(stalk)\n\n    # Active item can't be more precise than current path/needle\n    if (length(stalk) > length(needle)) {\n      return(0)\n    }\n\n    # Active item can however be less precise than current path/needle\n    length(stalk) <- length(needle)\n    similar <- (needle == stalk)\n\n    # Any difference indicates it's not the active item\n    if (any(!similar, na.rm = TRUE)) {\n      0\n    } else {\n      sum(similar, na.rm = TRUE)\n    }\n  }\n  haystack$similar <- purrr::map_dbl(\n    haystack$links,\n    get_similarity,\n    needle = path\n  )\n\n  # Only return rows of links with some similarity to the current path\n  haystack[haystack$similar > 0, ]\n}\n\nremove_useless_parts <- function(links, pkg) {\n  # remove website URL\n  if (!is.null(pkg$meta$url)) {\n    links <- sub(pkg$meta$url, \"\", links)\n  }\n  # remove first slash from path\n  links <- sub(\"^/\", \"\", links)\n  # remove /index.html from the end\n  links <- sub(\"/index.html/?\", \"\", links)\n  # remove ../ from the beginning\n  links <- gsub(\"\\\\.\\\\./\", \"\", links)\n\n  links\n}\n"
  },
  {
    "path": "R/tweak-page.R",
    "content": "# File level tweaks --------------------------------------------\ntweak_page <- function(html, name, pkg = list(bs_version = 3)) {\n  # Syntax highlighting and linking\n  if (name == \"reference-topic\") {\n    # Reference topic takes a minimal approach since some is\n    # already handled by Rd processing\n    tweak_reference_highlighting(html)\n    tweak_extra_logo(html)\n  } else {\n    downlit::downlit_html_node(html)\n\n    # Rescue highlighting of non-collapsed output - needed for ANSI escapes\n    pre <- xml2::xml_find_all(html, \".//pre[not(contains(@class, 'downlit'))]\")\n    is_wrapped <- is_wrapped_pre(pre)\n    purrr::walk(pre[!is_wrapped], tweak_highlight_r)\n  }\n\n  tweak_anchors(html)\n  tweak_link_md(html)\n  tweak_link_seealso(html)\n  tweak_link_external(html, pkg = pkg)\n  tweak_img_src(html)\n  tweak_strip(html, !identical(pkg$development$mode, \"release\"))\n\n  # BS3 uses table for layout of reference-index\n  if (name != \"reference-index\") {\n    tweak_tables(html)\n  }\n\n  if (pkg$bs_version > 3) {\n    tweak_footnotes(html)\n    tweak_tabsets(html)\n    tweak_useless_toc(html)\n  }\n\n  if (!is.null(pkg$desc) && pkg$desc$has_dep(\"R6\")) {\n    tweak_link_R6(html, pkg$package)\n  }\n}\n\ntweak_rmarkdown_html <- function(html, input_path, pkg = list(bs_version = 3)) {\n  # Tweak classes of navbar\n  toc <- xml2::xml_find_all(html, \".//div[@id='tocnav']//ul\")\n  xml2::xml_attr(toc, \"class\") <- \"nav nav-pills nav-stacked\"\n\n  # Make sure all images use relative paths\n  img <- xml2::xml_find_all(html, \"//img\")\n  src <- xml2::xml_attr(img, \"src\")\n  abs_src <- is_absolute_path(src)\n  if (any(abs_src)) {\n    img_target_nodes <- img[abs_src]\n    img_src_real <- path_real(xml2::url_unescape(src[abs_src]))\n    input_path_real <- path_real(xml2::url_unescape(input_path))\n    img_rel_paths <- path_rel(path = img_src_real, start = input_path_real)\n    img_rel_paths <- xml2::url_escape(img_rel_paths, reserved = \"/\")\n\n    purrr::walk2(\n      .x = img_target_nodes,\n      .y = img_rel_paths,\n      .f = xml2::xml_set_attr,\n      attr = \"src\"\n    )\n  }\n\n  # If top-level headings use h1, move everything down one level\n  h1 <- xml2::xml_find_all(html, \"//h1\")\n  if (length(h1) > 1) {\n    tweak_section_levels(html)\n  }\n\n  # Has to occur after path normalisation\n  # This get called twice on the contents of content-article.html, but that\n  # should be harmless\n  tweak_page(html, \"article\", pkg = pkg)\n\n  invisible()\n}\n\n# Strip off #toc if it's not needed; easier to do this here than in js\ntweak_useless_toc <- function(html) {\n  contents <- xml2::xml_find_all(html, \".//main\")\n  headings <- xml2::xml_find_all(contents, \".//h2|.//h3|.//h4|.//h5|.//h6\")\n\n  if (length(headings) > 1) {\n    return()\n  }\n\n  toc <- xml2::xml_find_first(html, '//nav[@id=\"toc\"]')\n  sidebar <- xml2::xml_parent(toc)\n  if (length(xml2::xml_children(sidebar)) == 1) {\n    xml2::xml_remove(sidebar)\n  } else {\n    xml2::xml_remove(toc)\n  }\n}\n\n\n# Update file on disk -----------------------------------------------------\n\nread_html_keep_ansi <- function(path) {\n  raw <- read_file(path)\n  # Following the xml 1.0 spec, libxml2 drops low-bit ASCII characters\n  # so we convert to \\u2029, relying on downlit to convert back in\n  # token_escape().\n  raw <- gsub(\"\\033\", \"\\u2029\", raw, fixed = TRUE)\n  # Use charToRaw() to always interpret as string,\n  # even for length 1 vectors\n  xml2::read_html(charToRaw(raw), encoding = \"UTF-8\")\n}\n\nupdate_html <- function(path, tweak, ...) {\n  html <- read_html_keep_ansi(path)\n  tweak(html, ...)\n\n  xml2::write_html(html, path, format = FALSE)\n  path\n}\n"
  },
  {
    "path": "R/tweak-reference.R",
    "content": "# Syntax highlighting for `\\preformatted{}` blocks in reference topics\ntweak_reference_highlighting <- function(html) {\n  # There are three cases:\n  # 1) <div> with class sourceCode + r/R, as created by ```R\n  div <- xml2::xml_find_all(html, \".//div\")\n  # must have sourceCode and not be in examples or usage\n  is_source <- has_class(div, \"sourceCode\") & !is_handled_section(div)\n\n  div_sourceCode <- div[is_source]\n  is_r <- has_class(div_sourceCode, c(\"r\", \"R\"))\n  div_sourceCode_r <- div_sourceCode[is_r]\n  purrr::walk(div_sourceCode_r, tweak_highlight_r)\n\n  # 2) <div> with class sourceCode + another language, e.g. ```yaml\n  # or no language e.g. ```\n  div_sourceCode_other <- div_sourceCode[!is_r]\n  purrr::walk(div_sourceCode_other, tweak_highlight_other)\n\n  # 3) <pre> with no wrapper <div>, as created by ```\n  pre <- xml2::xml_find_all(html, \".//pre\")\n  handled <- is_wrapped_pre(pre) | is_handled_section(pre)\n  purrr::walk(pre[!handled], tweak_highlight_r)\n  # Add div.sourceCode for copy button\n  xml2::xml_add_parent(pre[!handled], \"div\", class = \"sourceCode\")\n\n  invisible()\n}\n\nis_wrapped_pre <- function(html) {\n  xml2::xml_find_lgl(\n    html,\n    \"boolean(parent::div[contains(@class, 'sourceCode')])\"\n  )\n}\n\nis_handled_section <- function(html) {\n  xml2::xml_find_lgl(\n    html,\n    \"boolean(ancestor::div[@id='ref-examples' or @id='ref-usage'])\"\n  )\n}\n\ntweak_highlight_r <- function(block) {\n  code <- xml2::xml_find_first(block, \".//code\")\n  if (is.na(code)) {\n    return(FALSE)\n  }\n\n  text <- xml2::xml_text(code)\n  out <- downlit::highlight(text, classes = downlit::classes_pandoc())\n  if (is.na(out) || identical(out, \"\")) {\n    return(FALSE)\n  }\n\n  html <- xml2::read_html(out)\n  xml_replace_contents(code, xml2::xml_find_first(html, \"body\"))\n\n  TRUE\n}\n\ntweak_highlight_other <- function(div) {\n  code <- xml2::xml_find_first(div, \".//code\")\n  if (is.na(code)) {\n    return(FALSE)\n  }\n\n  lang <- sub(\"sourceCode \", \"\", xml2::xml_attr(div, \"class\"))\n  # since roxygen 7.2.0 generic code blocks have sourceCode with no lang\n  if (!is.na(lang) && lang == \"sourceCode\") {\n    lang <- \"r\"\n  }\n  # Pandoc does not recognize rmd as a language :-)\n  if (tolower(lang) %in% c(\"rmd\", \"qmd\")) {\n    lang <- \"markdown\"\n  }\n  # many backticks to account for possible nested code blocks\n  # like a Markdown code block with code chunks inside\n  md <- paste0(\"``````\", lang, \"\\n\", xml2::xml_text(code), \"\\n``````\")\n  html <- markdown_text(NULL, md)\n\n  xml_replace_contents(code, xml2::xml_find_first(html, \"body/div/pre/code\"))\n  TRUE\n}\n\nxml_replace_contents <- function(node, new) {\n  xml2::xml_remove(xml2::xml_contents(node))\n  contents <- xml2::xml_contents(new)\n  xml_insert(node, contents)\n}\n\nxml_insert <- function(node, new) {\n  for (child in new) {\n    xml2::xml_add_child(node, child)\n  }\n}\n\ntweak_extra_logo <- function(html) {\n  img <- xml2::xml_find_all(\n    html,\n    \".//div[contains(@class,'ref-description')]//img[contains(@src,'logo')]\"\n  )\n  xml2::xml_remove(img)\n\n  invisible()\n}\n"
  },
  {
    "path": "R/tweak-tabset.R",
    "content": "# Tabsets tweaking: find Markdown recommended in\n# https://bookdown.org/yihui/rmarkdown-cookbook/html-tabs.html\n# and https://bookdown.org/yihui/rmarkdown/html-document.html#tabbed-sections\n# i.e. \"## Heading {.tabset}\" or \"## Heading {.tabset .tabset-pills}\"\n#  no matter the heading level -- the headings one level down are the tabs\n# and transform to tabsets HTML a la Bootstrap\n\ntweak_tabsets <- function(html) {\n  tabsets <- xml2::xml_find_all(html, \".//div[contains(@class, 'tabset')]\")\n  purrr::walk(tabsets, tweak_tabset)\n  invisible()\n}\n\ntweak_tabset <- function(div) {\n  # Get tabs and remove them from original HTML\n  tabs <- xml2::xml_find_all(div, \"div\")\n  xml2::xml_remove(tabs)\n\n  # Add empty ul for nav and div for content\n  nav_class <- if (has_class(div, \"tabset-pills\")) {\n    \"nav nav-pills\"\n  } else {\n    \"nav nav-tabs\"\n  }\n  fade <- has_class(div, \"tabset-fade\")\n\n  id <- section_id(div)\n  nav <- xml2::xml_add_child(\n    div,\n    \"ul\",\n    class = nav_class,\n    id = id,\n    role = \"tablist\"\n  )\n  content <- xml2::xml_add_child(div, \"div\", class = \"tab-content\")\n\n  # Fill the ul for nav and div for content\n  purrr::walk(tabs, tablist_item, nav = nav, parent_id = id)\n  purrr::walk(\n    tabs,\n    tablist_content,\n    content = content,\n    parent_id = id,\n    fade = fade\n  )\n\n  # if not tabs active, activate the first tab\n  if (!any(has_class(xml2::xml_children(content), \"active\"))) {\n    first_tab <- xml2::xml_find_first(nav, \".//li/button\")\n    tweak_class_prepend(first_tab, \"active\")\n    xml2::xml_attr(first_tab, \"aria-selected\") <- \"true\"\n\n    tab_class <- paste(\"active\", if (has_class(div, \"tabset-fade\")) \"show\")\n    tweak_class_prepend(xml2::xml_child(content), tab_class)\n  }\n}\n\n# Add an item (tab) to the tablist\ntablist_item <- function(tab, nav, parent_id) {\n  id <- section_id(tab)\n  title <- tablist_title(tab)\n\n  # Activate (if there was \"{.active}\" in the source Rmd)\n  active <- has_class(tab, \"active\")\n  li_class <- paste0(\"nav-link\", if (active) \" active\")\n  li <- xml2::xml_add_child(\n    nav,\n    \"li\",\n    role = \"presentation\",\n    class = \"nav-item\"\n  )\n  button <- xml2::xml_add_child(\n    li,\n    \"button\",\n    `data-bs-toggle` = \"tab\",\n    `data-bs-target` = paste0(\"#\", id),\n    id = paste0(id, \"-tab\"),\n    type = \"button\",\n    role = \"tab\",\n    `aria-controls` = id,\n    `aria-selected` = tolower(active),\n    class = li_class\n  )\n\n  # Preserve html in title by adding from xml_nodeset item by item\n  for (title_item in title) {\n    xml2::xml_add_child(button, title_item)\n  }\n\n  invisible()\n}\n\ntablist_title <- function(tab) {\n  # remove anchor link from tab heading\n  tab_heading_anchor <- xml2::xml_find_first(tab, \".//a[@class = 'anchor']\")\n  xml2::xml_remove(tab_heading_anchor)\n\n  xml2::xml_contents(xml2::xml_child(tab))\n}\n\n# Add content of a tab to a tabset\ntablist_content <- function(tab, content, parent_id, fade) {\n  id <- section_id(tab)\n  # remove the header, the first child\n  xml2::xml_remove(xml2::xml_child(tab))\n\n  xml2::xml_attr(tab, \"id\") <- id\n\n  # Activate (if there was \"{.active}\" in the source Rmd)\n  active <- has_class(tab, \"active\")\n  tab_class <- c(\n    if (fade && active) \"show\",\n    if (active) \"active\",\n    if (fade) \"fade\",\n    \"tab-pane\"\n  )\n  xml2::xml_attr(tab, \"class\") <- paste(tab_class, collapse = \" \")\n\n  xml2::xml_attr(tab, \"role\") <- \"tabpanel\"\n  xml2::xml_attr(tab, \"aria-labelledby\") <- paste0(id, \"-tab\")\n\n  xml2::xml_add_child(content, tab)\n\n  invisible()\n}\n"
  },
  {
    "path": "R/tweak-tags.R",
    "content": "tweak_anchors <- function(html) {\n  headings <- xml2::xml_find_all(html, \".//h1|.//h2|.//h3|.//h4|.//h5|.//h6\")\n  # Find all headings that are contained in a div with an id and\n  # have class 'section'\n\n  is_ok <- xml2::xml_find_lgl(\n    headings,\n    \"boolean(\n      (parent::div[contains(@class, 'section') and @id]) or\n      (parent::section[@id])\n    )\"\n  )\n  headings <- headings[is_ok]\n  if (length(headings) == 0) {\n    return(invisible())\n  }\n\n  id <- xml2::xml_find_chr(\n    headings,\n    \"string(parent::div/@id|parent::section/@id)\"\n  )\n\n  # Update ids: dot in the anchor breaks scrollspy and rd translation\n  # doesn't have enough information to generate unique ids\n  new_id <- make.unique(gsub(\".\", \"-\", id, fixed = TRUE), \"-\")\n\n  # Move ids to headings so that the js TOC doesn't add create new ids\n  divs <- xml2::xml_parent(headings)\n  xml2::xml_attr(divs, \"id\") <- NULL\n  xml2::xml_attr(headings, \"id\") <- new_id\n\n  # Insert anchors\n  anchor <- anchor_html(new_id)\n  for (i in seq_along(headings)) {\n    heading <- headings[[i]]\n    if (length(xml2::xml_contents(heading)) == 0) {\n      # skip empty headings\n      next\n    }\n    # Insert anchor in first element of header\n    xml2::xml_add_child(heading, xml2::read_xml(anchor[[i]]))\n  }\n  invisible()\n}\n\nanchor_html <- function(id) {\n  paste0(\"<a class='anchor' aria-label='anchor' href='#\", id, \"'></a>\")\n}\n\ntweak_link_md <- function(html) {\n  links <- xml2::xml_find_all(html, \".//a\")\n  if (length(links) == 0) {\n    return()\n  }\n\n  hrefs <- xml2::xml_attr(links, \"href\")\n\n  urls <- xml2::url_parse(hrefs)\n  needs_tweak <- urls$scheme == \"\" & grepl(\"\\\\.md$\", urls$path)\n\n  fix_links <- function(x) {\n    x <- gsub(\"\\\\.md\\\\b\", \".html\", x)\n    x <- gsub(\"\\\\.github/\", \"\", x)\n    x\n  }\n\n  if (any(needs_tweak)) {\n    purrr::walk2(\n      links[needs_tweak],\n      fix_links(hrefs[needs_tweak]),\n      xml2::xml_set_attr,\n      attr = \"href\"\n    )\n  }\n\n  invisible()\n}\n\ntweak_link_external <- function(html, pkg = list()) {\n  links <- xml2::xml_find_all(html, \".//a\")\n  if (length(links) == 0) {\n    return()\n  }\n\n  links <- links[!has_class(links, \"external-link\")]\n\n  hrefs <- xml2::xml_attr(links, \"href\")\n  links <- links[!is_internal_link(hrefs, pkg = pkg)]\n\n  # Users might have added absolute URLs to e.g. the Code of Conduct\n  tweak_class_prepend(links, \"external-link\")\n\n  invisible()\n}\n\n# Fix relative image links\ntweak_img_src <- function(html) {\n  fix_path <- function(x) {\n    x <- gsub(\"(^|/)vignettes/\", \"\\\\1articles/\", x, perl = TRUE)\n    x <- gsub(\"(^|/)man/figures/\", \"\\\\1reference/figures/\", x, perl = TRUE)\n    x\n  }\n\n  imgs <- xml2::xml_find_all(html, \".//img[not(starts-with(@src, 'http'))]\")\n  urls <- fix_path(xml2::xml_attr(imgs, \"src\"))\n  purrr::map2(imgs, urls, ~ xml2::xml_set_attr(.x, \"src\", .y))\n\n  imgs <- xml2::xml_find_all(\n    html,\n    \".//source[not(starts-with(@srcset, 'http'))]\"\n  )\n  urls <- fix_path(xml2::xml_attr(imgs, \"srcset\"))\n  purrr::map2(imgs, urls, ~ xml2::xml_set_attr(.x, \"srcset\", .y))\n\n  invisible()\n}\n\ntweak_link_absolute <- function(html, pkg = list()) {\n  # If there's no URL links can't be made absolute\n  if (is.null(pkg$meta$url)) {\n    return()\n  }\n\n  url <- paste0(pkg$meta$url, \"/\")\n\n  # <a> + <link> use href\n  href <- xml2::xml_find_all(html, \".//a | .//link\")\n  xml2::xml_attr(href, \"href\") <- xml2::url_absolute(\n    xml2::xml_attr(href, \"href\"),\n    url\n  )\n\n  # <img> + <script> uses src\n  src <- xml2::xml_find_all(html, \".//script | .//img\")\n  xml2::xml_attr(src, \"src\") <- xml2::url_absolute(\n    xml2::xml_attr(src, \"src\"),\n    url\n  )\n\n  invisible()\n}\n\ntweak_link_R6 <- function(html, cur_package) {\n  r6_span <- xml2::xml_find_all(html, \".//span[@class=\\\"pkg-link\\\"]\")\n  if (length(r6_span) == 0) {\n    return()\n  }\n\n  pkg <- xml2::xml_attr(r6_span, \"data-pkg\")\n  topic <- xml2::xml_attr(r6_span, \"data-topic\")\n  id <- xml2::xml_attr(r6_span, \"data-id\")\n\n  url <- paste0(topic, \".html\")\n  external <- pkg != cur_package\n  if (any(external)) {\n    url[external] <- purrr::map2_chr(\n      topic[external],\n      pkg[external],\n      downlit::href_topic\n    )\n  }\n  url <- paste0(url, ifelse(is.na(id), \"\", \"#method-\"), id)\n\n  r6_a <- xml2::xml_find_first(r6_span, \"./a\")\n  xml2::xml_attr(r6_a, \"href\") <- url\n\n  invisible()\n}\n\n# Fix seealso links\ntweak_link_seealso <- function(html) {\n  seealso_links <- xml2::xml_find_all(html, \"//code[a and text() = '()']\")\n\n  # add () inside link\n  seealso_text <- xml2::xml_children(seealso_links)\n  xml2::xml_text(seealso_text) <- paste0(xml2::xml_text(seealso_text), \"()\")\n\n  # remove () outside the link\n  text_nodes <- xml2::xml_find_all(seealso_links, \"./text()[. = '()']\")\n  xml2::xml_remove(text_nodes)\n\n  invisible()\n}\n\ntweak_tables <- function(html) {\n  # Ensure all tables have class=\"table\" apart from arguments\n  table <- xml2::xml_find_all(html, \".//table\")\n  table <- table[!has_class(table, \"ref-arguments\")]\n\n  tweak_class_prepend(table, \"table\")\n\n  invisible()\n}\n\n# from https://github.com/rstudio/bookdown/blob/ed31991df3bb826b453f9f50fb43c66508822a2d/R/bs4_book.R#L307\ntweak_footnotes <- function(html) {\n  container <- xml2::xml_find_all(\n    html,\n    \".//div[contains(@class, 'footnotes')]|.//section[contains(@class, 'footnotes')]\"\n  )\n  if (length(container) != 1) {\n    return()\n  }\n  # Find id and contents\n  footnotes <- xml2::xml_find_all(container, \".//li\")\n  id <- xml2::xml_attr(footnotes, \"id\")\n  xml2::xml_remove(xml2::xml_find_all(footnotes, \"//a[@class='footnote-back']\"))\n  contents <- vapply(footnotes, FUN.VALUE = character(1), function(x) {\n    paste(\n      as.character(xml2::xml_children(x), options = character()),\n      collapse = \"\\n\"\n    )\n  })\n  # Add popover attributes to links\n  for (i in seq_along(id)) {\n    links <- xml2::xml_find_all(html, paste0(\".//a[@href='#\", id[[i]], \"']\"))\n    xml2::xml_attr(links, \"href\") <- NULL\n    xml2::xml_attr(links, \"id\") <- NULL\n    xml2::xml_attr(links, \"tabindex\") <- \"0\"\n    xml2::xml_attr(links, \"data-bs-toggle\") <- \"popover\"\n    xml2::xml_attr(links, \"data-bs-content\") <- contents[[i]]\n  }\n  # Delete container\n  xml2::xml_remove(container)\n}\n\ntweak_strip <- function(html, in_dev = FALSE) {\n  to_remove <- if (in_dev) \"pkgdown-release\" else \"pkgdown-devel\"\n  xpath <- paste0(\n    \".//*[contains(@class, '\",\n    to_remove,\n    \"')]|\",\n    \".//*[contains(@class, 'pkgdown-hide')]\"\n  )\n  nodes <- xml2::xml_find_all(html, xpath)\n  xml2::xml_remove(nodes)\n}\n"
  },
  {
    "path": "R/tweak.R",
    "content": "has_class <- function(html, class) {\n  classes <- strsplit(xml2::xml_attr(html, \"class\"), \" \")\n  purrr::map_lgl(classes, ~ any(class %in% .x))\n}\n\ntweak_class_prepend <- function(x, class) {\n  if (length(x) == 0) {\n    return(invisible())\n  }\n\n  cur <- xml2::xml_attr(x, \"class\")\n  xml2::xml_attr(x, \"class\") <- ifelse(is.na(cur), class, paste(class, cur))\n  invisible()\n}\n"
  },
  {
    "path": "R/usage.R",
    "content": "# Reference page ---------------------------------------------------------------\n\n# For testing\nusage2text <- function(x) {\n  rd <- rd_text(paste0(\"\\\\usage{\", x, \"}\"), FALSE)[[1]]\n  strip_html_tags(as_data(rd))\n}\n\n#' @export\nas_data.tag_usage <- function(x, ...) {\n  text <- paste(flatten_text(x, ..., escape = FALSE), collapse = \"\\n\")\n  text <- str_trim(text)\n\n  # Look for single line calls to non-syntactic functions (except for `=`\n  # since that's probably a single argument on its own line) and then use\n  # deparse1 to convert to standard style. We want to avoid reparsing\n  # any other lines to avoid losing whitespace, comments etc. (These\n  # are not generated by roxygen but can be added by the user.)\n  lines <- strsplit(text, \"\\n\", fixed = TRUE)[[1]]\n  parsed <- lapply(\n    lines,\n    function(x) tryCatch(parse(text = x)[[1]], error = function(e) NULL)\n  )\n  needs_tweak <- function(x) {\n    is_call(x) &&\n      !is_call(x, \"=\") &&\n      (is_symbol(x[[1]]) && !is_syntactic(x[[1]]))\n  }\n  to_tweak <- vapply(parsed, needs_tweak, logical(1))\n  lines[to_tweak] <- vapply(parsed[to_tweak], deparse1, character(1))\n\n  text <- paste(lines, collapse = \"\\n\")\n\n  highlight_text(text)\n}\n\n#' @export\nas_html.tag_method <- function(x, ...) method_usage(x, \"S3\")\n#' @export\nas_html.tag_S3method <- function(x, ...) method_usage(x, \"S3\")\n#' @export\nas_html.tag_S4method <- function(x, ...) method_usage(x, \"S4\")\n\nmethod_usage <- function(x, type) {\n  # Despite these being called from the as_html() generic, the target isn't\n  # actually HTML, but R code, which is turned into HTML by the syntax\n  # highlighting in as as_data.tag_usage()\n  fun <- as_html(x[[1]], escape = FALSE)\n  class <- as_html(x[[2]], escape = FALSE)\n\n  if (x[[2]] == \"default\") {\n    method <- sprintf(tr_(\"# Default %s method\"), type)\n  } else {\n    method <- sprintf(tr_(\"# %s method for class '%s'\"), type, class)\n  }\n\n  if (!is_syntactic(fun)) {\n    fun <- paste0(\"`\", fun, \"`\")\n  }\n  paste0(method, \"\\n\", fun)\n}\n\n# Reference index --------------------------------------------------------------\n\ntopic_funs <- function(rd) {\n  funs <- parse_usage(rd)\n\n  # Remove all methods for generics documented in this file\n  name <- purrr::map_chr(funs, \"name\")\n  type <- purrr::map_chr(funs, \"type\")\n\n  gens <- name[type == \"fun\"]\n  self_meth <- (name %in% gens) & (type %in% c(\"s3\", \"s4\"))\n\n  funs <- purrr::map_chr(\n    funs[!self_meth],\n    ~ short_name(.$name, .$type, .$signature)\n  )\n  unique(funs)\n}\n\nparse_usage <- function(x) {\n  if (!inherits(x, \"tag\")) {\n    usage <- paste0(\"\\\\usage{\", x, \"}\")\n    x <- rd_text(usage, fragment = FALSE)\n  }\n\n  r <- usage_code(x)\n  if (length(r) == 0) {\n    return(list())\n  }\n\n  exprs <- tryCatch(\n    parse_exprs(r),\n    error = function(e) {\n      cli::cli_warn(\"Failed to parse usage: {.code {r}}\")\n      list()\n    }\n  )\n  purrr::map(exprs, usage_type)\n}\n\nshort_name <- function(name, type, signature) {\n  name <- escape_html(name)\n  qname <- auto_quote(name)\n\n  if (type == \"data\") {\n    qname\n  } else if (type == \"fun\") {\n    if (is_infix(name)) {\n      qname\n    } else {\n      paste0(qname, \"()\")\n    }\n  } else {\n    sig <- paste0(\"<i>&lt;\", escape_html(signature), \"&gt;</i>\", collapse = \",\")\n    paste0(qname, \"(\", sig, \")\")\n  }\n}\n\n# Given single expression generated from usage_code, extract\nusage_type <- function(x) {\n  if (is_symbol(x)) {\n    list(type = \"data\", name = as.character(x))\n  } else if (is_call(x, \"data\")) {\n    list(type = \"data\", name = as.character(x[[2]]))\n  } else if (is.call(x)) {\n    if (identical(x[[1]], quote(`<-`))) {\n      replacement <- TRUE\n      x <- x[[2]]\n    } else {\n      replacement <- FALSE\n    }\n\n    out <- fun_info(x)\n    out$replacement <- replacement\n    out$infix <- is_infix(out$name)\n    if (replacement) {\n      out$name <- paste0(out$name, \"<-\")\n    }\n\n    out\n  } else {\n    untype <- paste0(typeof(x), \" (in \", as.character(x), \")\")\n    cli::cli_abort(\n      \"Unknown type: {.val {untype}}\",\n      call = caller_env()\n    )\n  }\n}\n\nis_infix <- function(x) {\n  if (is.null(x)) {\n    return(FALSE)\n  }\n\n  x <- as.character(x)\n  ops <- c(\n    \"+\",\n    \"-\",\n    \"*\",\n    \"^\",\n    \"/\",\n    \"==\",\n    \">\",\n    \"<\",\n    \"!=\",\n    \"<=\",\n    \">=\",\n    \"&\",\n    \"|\",\n    \"[[\",\n    \"[\",\n    \"$\"\n  )\n\n  grepl(\"^%.*%$\", x) || x %in% ops\n}\n\nfun_info <- function(fun) {\n  stopifnot(is.call(fun))\n\n  if (is.call(fun[[1]])) {\n    x <- fun[[1]]\n    if (identical(x[[1]], quote(S3method))) {\n      list(\n        type = \"s3\",\n        name = as.character(x[[2]]),\n        signature = as.character(x[[3]])\n      )\n    } else if (identical(x[[1]], quote(S4method))) {\n      list(\n        type = \"s4\",\n        name = as.character(x[[2]]),\n        signature = sub(\"^`(.*)`$\", \"\\\\1\", as.character(as.list(x[[3]])[-1]))\n      )\n    } else if (is_call(x, c(\"::\", \":::\"))) {\n      # TRUE if fun has a namespace, pkg::fun()\n      list(\n        type = \"fun\",\n        name = call_name(fun)\n      )\n    } else {\n      cli::cli_abort(\n        \"Unknown call: {.val {as.character(x[[1]])}}\",\n        call = caller_env()\n      )\n    }\n  } else {\n    list(\n      type = \"fun\",\n      name = as.character(fun[[1]]),\n      signature = NULL\n    )\n  }\n}\n\n# usage_code --------------------------------------------------------------\n# Transform Rd embedded inside usage into parseable R code\n\nusage_code <- function(x) {\n  UseMethod(\"usage_code\")\n}\n\n#' @export\nusage_code.Rd <- function(x) {\n  usage <- purrr::detect(x, inherits, \"tag_usage\")\n  usage_code(usage)\n}\n\n#' @export\nusage_code.NULL <- function(x) character()\n\n# Tag without additional class use\n#' @export\nusage_code.tag <- function(x) {\n  if (!identical(class(x), \"tag\")) {\n    cli::cli_abort(\n      \"Undefined tag in usage: {.val class(x)[[1]]}}\",\n      call = caller_env()\n    )\n  }\n  paste0(purrr::flatten_chr(purrr::map(x, usage_code)), collapse = \"\")\n}\n\n#' @export\nusage_code.tag_special <- function(x) {\n  paste0(purrr::flatten_chr(purrr::map(x, usage_code)), collapse = \"\")\n}\n\n#' @export\nusage_code.tag_dots <- function(x) \"...\"\n#' @export\nusage_code.tag_ldots <- function(x) \"...\"\n\n#' @export\nusage_code.TEXT <- function(x) as.character(x)\n#' @export\nusage_code.RCODE <- function(x) as.character(x)\n#' @export\nusage_code.VERB <- function(x) as.character(x)\n#' @export\nusage_code.COMMENT <- function(x) character()\n\n#' @export\nusage_code.tag_S3method <- function(x) {\n  generic <- paste0(usage_code(x[[1]]), collapse = \"\")\n  class <- paste0(usage_code(x[[2]]), collapse = \"\")\n\n  paste0(\"S3method(`\", generic, \"`, \", class, \")\")\n}\n\n#' @export\nusage_code.tag_method <- usage_code.tag_S3method\n\n#' @export\nusage_code.tag_S4method <- function(x) {\n  generic <- paste0(usage_code(x[[1]]), collapse = \"\")\n  class <- strsplit(usage_code(x[[2]]), \",\")[[1]]\n  class <- paste0(\"`\", class, \"`\")\n  class <- paste0(class, collapse = \",\")\n  paste0(\"S4method(`\", generic, \"`, list(\", class, \"))\")\n}\n#' @export\nusage_code.tag_usage <- function(x) {\n  paste0(purrr::flatten_chr(purrr::map(x, usage_code)), collapse = \"\")\n}\n"
  },
  {
    "path": "R/utils-fs.R",
    "content": "dir_copy_to <- function(\n  src_dir,\n  dst_dir,\n  src_root,\n  dst_root,\n  src_label = \"\",\n  dst_label = \"\"\n) {\n  check_string(src_dir)\n  check_string(dst_dir)\n\n  if (!dir_exists(src_dir)) {\n    return()\n  }\n\n  src_paths <- dir_ls(src_dir, recurse = TRUE)\n  is_dir <- is_dir(src_paths)\n\n  dst_paths <- path(dst_dir, path_rel(src_paths, src_dir))\n\n  # First create directories\n  dir_create(dst_paths[is_dir])\n  # Then copy files\n  file_copy_to(\n    src_paths = src_paths[!is_dir],\n    dst_paths = dst_paths[!is_dir],\n    src_root = src_root,\n    dst_root = dst_root,\n    src_label = src_label,\n    dst_label = dst_label\n  )\n}\n\nfile_copy_to <- function(\n  src_paths,\n  dst_paths,\n  src_root,\n  dst_root,\n  src_label = NULL,\n  dst_label = \"\"\n) {\n  # Ensure all the \"to\" directories exist\n  dst_dirs <- unique(path_dir(dst_paths))\n  dir_create(dst_dirs)\n\n  eq <- purrr::map2_lgl(src_paths, dst_paths, file_equal)\n  if (any(!eq)) {\n    dst <- paste0(dst_label, path_rel(dst_paths[!eq], dst_root))\n    if (is.null(src_label)) {\n      purrr::walk(dst, function(dst) {\n        cli::cli_inform(\"Copying {dst_path(dst)}\")\n      })\n    } else {\n      src <- paste0(src_label, path_rel(src_paths[!eq], src_root))\n      purrr::walk2(src, dst, function(src, dst) {\n        cli::cli_inform(\"Copying {src_path(src)} to {dst_path(dst)}\")\n      })\n    }\n  }\n\n  file_copy(src_paths[!eq], dst_paths[!eq], overwrite = TRUE)\n}\n\nout_of_date <- function(source, target, call = caller_env()) {\n  if (!file_exists(target)) {\n    return(TRUE)\n  }\n  if (!file_exists(source)) {\n    cli::cli_abort(\"{.path {source}} does not exist\", call = call)\n  }\n\n  file_info(source)$modification_time > file_info(target)$modification_time\n}\n\n# Path helpers ------------------------------------------------------------\n\npath_abs <- function(path, start = \".\") {\n  is_abs <- is_absolute_path(path)\n\n  path[is_abs] <- path_norm(path[is_abs])\n  path[!is_abs] <- fs::path_abs(path(start, path))\n\n  path_tidy(path)\n}\n\npath_first_existing <- function(...) {\n  paths <- path(...)\n  for (path in paths) {\n    if (file_exists(path)) return(path)\n  }\n\n  NULL\n}\n\npath_package_pkgdown <- function(\n  path,\n  package,\n  bs_version,\n  error_call = caller_env()\n) {\n  # package will usually be a github package, and check_installed()\n  # tries to install from CRAN, which is highly likely to fail.\n  if (!is_installed(package)) {\n    cli::cli_abort(\n      c(\n        \"Template package {.val {package}} is not installed.\",\n        i = \"Please install before continuing.\"\n      ),\n      call = error_call\n    )\n  }\n  base <- system_file(\"pkgdown\", package = package)\n\n  # If bs_version supplied, first try for versioned template\n  if (!is.null(bs_version)) {\n    ver_path <- path(base, paste0(\"BS\", bs_version), path)\n    if (file_exists(ver_path)) {\n      return(ver_path)\n    }\n  }\n\n  path(base, path)\n}\n\npath_pkgdown <- function(...) {\n  system_file(..., package = \"pkgdown\")\n}\n"
  },
  {
    "path": "R/utils-io.R",
    "content": "# Reading -----------------------------------------------------------------\n\nread_file <- function(path) {\n  lines <- read_lines(path)\n  paste0(lines, \"\\n\", collapse = \"\")\n}\n\n\n# Inspired by roxygen2 utils-io.R (https://github.com/klutometis/roxygen/) --------\nread_lines <- function(path, n = -1L) {\n  base::readLines(path, n = n, encoding = \"UTF-8\", warn = FALSE) # nolint\n}\n\nwrite_lines <- function(text, path) {\n  base::writeLines(enc2utf8(text), path, useBytes = TRUE) # nolint\n}\n\n# Other -------------------------------------------------------------------\n\nfile_equal <- function(src, dst) {\n  if (!file_exists(dst)) {\n    return(FALSE)\n  }\n\n  src_hash <- rlang::hash_file(src)\n  dst_hash <- rlang::hash_file(dst)\n\n  identical(src_hash, dst_hash)\n}\n"
  },
  {
    "path": "R/utils-pdf.R",
    "content": "# Set various env vars (copied from tools::texi2dvi) to ensure that\n# latex can find bib and style files in the right places\nlocal_texi2dvi_envvars <- function(input_path, env = caller_env()) {\n  withr::local_envvar(\n    BSTINPUTS = bst_paths(input_path),\n    TEXINPUTS = tex_paths(input_path),\n    BIBINPUTS = bib_paths(input_path),\n    .local_envir = env\n  )\n}\n\nbst_paths <- function(path) {\n  paths <- c(\n    Sys.getenv(\"BSTINPUTS\"),\n    path_dir(path),\n    path(R.home(\"share\"), \"texmf\", \"bibtex\", \"bst\")\n  )\n  paste(paths, collapse = .Platform$path.sep)\n}\ntex_paths <- function(path) {\n  paths <- c(\n    Sys.getenv(\"TEXINPUTS\"),\n    path_dir(path),\n    path(R.home(\"share\"), \"texmf\", \"tex\", \"latex\")\n  )\n  paste(paths, collapse = .Platform$path.sep)\n}\nbib_paths <- function(path) {\n  paths <- c(\n    Sys.getenv(\"BIBINPUTS\"),\n    tex_paths(path)\n  )\n  paste(paths, collapse = .Platform$path.sep)\n}\n"
  },
  {
    "path": "R/utils.R",
    "content": "up_path <- function(depth) {\n  paste(rep.int(\"../\", depth), collapse = \"\")\n}\n\ndir_depth <- function(x) {\n  # length(strsplit(path, \"/\")[[1]]) - 1L\n  purrr::map_int(strsplit(x, \"\"), function(x) sum(x == \"/\"))\n}\n\ninvert_index <- function(x) {\n  stopifnot(is.list(x))\n\n  if (length(x) == 0) {\n    return(list())\n  }\n\n  key <- rep(names(x), purrr::map_int(x, length))\n  val <- unlist(x, use.names = FALSE)\n\n  split(key, val)\n}\n\nrstudio_save_all <- function() {\n  if (is_installed(\"rstudioapi\") && rstudioapi::hasFun(\"documentSaveAll\")) {\n    rstudioapi::documentSaveAll()\n  }\n}\n\nis_syntactic <- function(x) x == make.names(x)\n\nauto_quote <- function(x) {\n  ifelse(is_syntactic(x), x, paste0(\"`\", x, \"`\"))\n}\n\nstr_trim <- function(x) gsub(\"^\\\\s+|\\\\s+$\", \"\", x)\n\nstr_squish <- function(x) str_trim(gsub(\"\\\\s+\", \" \", x))\n\nunwrap_purrr_error <- function(code) {\n  withCallingHandlers(\n    code,\n    purrr_error_indexed = function(err) {\n      cnd_signal(err$parent)\n    }\n  )\n}\n\ntr_ <- function(...) {\n  enc2utf8(gettext(..., domain = \"R-pkgdown\"))\n}\n\n# devtools metadata -------------------------------------------------------\n\nsystem_file <- function(..., package) {\n  if (is.null(devtools_meta(package))) {\n    path(system.file(package = package), ...)\n  } else {\n    path(getNamespaceInfo(package, \"path\"), \"inst\", ...)\n  }\n}\n\ndevtools_meta <- function(x) {\n  ns <- .getNamespace(x)\n  ns[[\".__DEVTOOLS__\"]]\n}\n\n# CLI ---------------------------------------------------------------------\n\ndst_path <- cli::combine_ansi_styles(\n  cli::style_bold,\n  cli::col_cyan\n)\n\nsrc_path <- cli::combine_ansi_styles(\n  cli::style_bold,\n  cli::col_green\n)\n\nwriting_file <- function(path, show) {\n  path <- as.character(path)\n  text <- dst_path(as.character(show))\n  cli::cli_inform(\n    \"Writing {.run [{text}](pkgdown::preview_site(path='{path}'))}\"\n  )\n}\n\nmodify_list <- function(x, y) {\n  if (is.null(x)) {\n    return(y)\n  } else if (is.null(y)) {\n    return(x)\n  }\n\n  utils::modifyList(x, y)\n}\n\n# from https://github.com/r-lib/rematch2/blob/8098bd06f251bfe0f20c0598d90fc20b741d13f8/R/package.R#L47\nre_match <- function(text, pattern, perl = TRUE, ...) {\n  stopifnot(is.character(pattern), length(pattern) == 1, !is.na(pattern))\n  text <- as.character(text)\n\n  match <- regexpr(pattern, text, perl = perl, ...)\n\n  start <- as.vector(match)\n  length <- attr(match, \"match.length\")\n  end <- start + length - 1L\n\n  matchstr <- substring(text, start, end)\n  matchstr[start == -1] <- NA_character_\n\n  res <- data.frame(\n    .text = text,\n    .match = matchstr\n  )\n\n  if (!is.null(attr(match, \"capture.start\"))) {\n    gstart <- attr(match, \"capture.start\")\n    glength <- attr(match, \"capture.length\")\n    gend <- gstart + glength - 1L\n\n    groupstr <- substring(text, gstart, gend)\n    groupstr[gstart == -1] <- NA_character_\n    dim(groupstr) <- dim(gstart)\n\n    res <- cbind(groupstr, res)\n  }\n\n  names(res) <- c(attr(match, \"capture.names\"), \".text\", \".match\")\n  class(res) <- c(\"tbl_df\", \"tbl\", class(res))\n  res\n}\n\n# external links can't be an active item\n# external links start with http(s)\n# but are NOT an absolute URL to the pkgdown site at hand\nis_internal_link <- function(links, pkg) {\n  if (is.null(pkg$meta$url)) {\n    !grepl(\"https?://\", links)\n  } else {\n    !grepl(\"https?://\", links) | grepl(pkg$meta$url, links)\n  }\n}\n\nruler <- function(width = getOption(\"width\")) {\n  x <- seq_len(width)\n  y <- rep(\"-\", length(x))\n  y[x %% 5 == 0] <- \"+\"\n  y[x %% 10 == 0] <- (x[x %% 10 == 0] %/% 10) %% 10\n  cat(y, \"\\n\", sep = \"\")\n  cat(x %% 10, \"\\n\", sep = \"\")\n}\n\nget_section_level <- function(section) {\n  class <- xml2::xml_attr(section, \"class\")\n\n  level <- as.numeric(re_match(class, \"level(\\\\d+)\")[[1]])\n  level[is.na(level)] <- 0\n  level\n}\n\nsection_id <- function(section) {\n  h <- xml2::xml_find_first(section, \".//h1|.//h2|.//h3|.//h4|.//h5|.//h6\")\n  xml2::xml_attr(h, \"id\")\n}\n\non_ci <- function() {\n  isTRUE(as.logical(Sys.getenv(\"CI\", \"false\")))\n}\n\n# yaml ------------------------------------------------------------\n\nprint_yaml <- function(x) {\n  structure(x, class = \"print_yaml\")\n}\n#' @export\nprint.print_yaml <- function(x, ...) {\n  cat(yaml::as.yaml(x), \"\\n\", sep = \"\")\n}\n\nwrite_yaml <- function(x, path) {\n  yaml::write_yaml(\n    x,\n    path,\n    handlers = list(logical = yaml::verbatim_logical)\n  )\n}\n\n# Helpers for testing -----------------------------------------------------\n\nxpath_xml <- function(x, xpath = NULL) {\n  if (!is.null(xpath)) {\n    x <- xml2::xml_find_all(x, xpath)\n  }\n  structure(x, class = c(\"pkgdown_xml\", class(x)))\n}\nxpath_contents <- function(x, xpath) {\n  x <- xml2::xml_find_all(x, xpath)\n\n  contents <- xml2::xml_contents(x)\n  if (length(contents) == 0) {\n    NULL\n  } else {\n    xml2str(contents)\n  }\n}\nxml2str <- function(x) {\n  strings <- as.character(x, options = c(\"format\", \"no_declaration\"))\n  paste0(strings, collapse = \"\")\n}\n\nxpath_attr <- function(x, xpath, attr) {\n  gsub(\n    \"\\r\",\n    \"\",\n    xml2::xml_attr(xml2::xml_find_all(x, xpath), attr),\n    fixed = TRUE\n  )\n}\nxpath_text <- function(x, xpath, trim = FALSE) {\n  xml2::xml_text(xml2::xml_find_all(x, xpath), trim = trim)\n}\nxpath_length <- function(x, xpath) {\n  length(xml2::xml_find_all(x, xpath))\n}\n#' @export\nprint.pkgdown_xml <- function(x, ...) {\n  cat(as.character(x, options = c(\"format\", \"no_declaration\")), sep = \"\\n\")\n  invisible(x)\n}\n\ncli_escape <- function(x) {\n  x <- gsub(\"{\", \"{{\", x, fixed = TRUE)\n  x <- gsub(\"}\", \"}}\", x, fixed = TRUE)\n  x\n}\n"
  },
  {
    "path": "README.Rmd",
    "content": "---\noutput: github_document\n---\n\n<!-- README.md is generated from README.Rmd. Please edit that file -->\n\n```{r}\n#| echo: false\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  fig.path = \"man/figures/\"\n)\n```\n\n# pkgdown <a href=\"https://pkgdown.r-lib.org\"><img src=\"man/figures/logo.png\" align=\"right\" height=\"138\" alt=\"pkgdown website\" /></a>\n\n<!-- badges: start -->\n[![CRAN Status](https://www.r-pkg.org/badges/version/pkgdown)](https://cran.r-project.org/package=pkgdown){.pkgdown-release}\n[![R-CMD-check](https://github.com/r-lib/pkgdown/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/r-lib/pkgdown/actions/workflows/R-CMD-check.yaml){.pkgdown-devel}\n[![Codecov test coverage](https://codecov.io/gh/r-lib/pkgdown/graph/badge.svg)](https://app.codecov.io/gh/r-lib/pkgdown)\n<!-- badges: end -->\n\npkgdown is designed to make it quick and easy to build a website for your package. You can see pkgdown in action at <https://pkgdown.r-lib.org>: this is the output of pkgdown applied to the latest version of pkgdown. Learn more in `vignette(\"pkgdown\")` or `?build_site`.\n\n## Installation\n\n::: .pkgdown-release\n```{r}\n#| eval: false\n# Install released version from CRAN\ninstall.packages(\"pkgdown\")\n```\n:::\n\n::: .pkgdown-devel\n```{r}\n#| eval: false\n# Install development version from GitHub\n# install.packages(\"pak\")\npak::pak(\"r-lib/pkgdown\")\n```\n:::\n\n## Usage\n\nGet started with [usethis](https://usethis.r-lib.org/):\n\n```{r}\n#| eval: false\n# Run once to configure your package to use and deploy pkgdown\nusethis::use_pkgdown_github_pages()\n```\n\n```{r}\n#| eval: false\n# Preview your site locally before publishing\npkgdown::build_site()\n```\n\nThis adds the necessary components and sets up GitHub Actions[^1] for automatic site building when deploying.\nYour `README.md` becomes the homepage, documentation in `man/` generates a function reference, and vignettes will be rendered into `articles/`.\n\n[^1]: If you don't use GitHub, you can use `usethis::use_pkgdown()` + `pkgdown::build_site()` to create a website.\n\n### pkgdown 2.0.0 and Bootstrap 5\n\npkgdown 2.0.0 includes an upgrade from Bootstrap 3 to Bootstrap 5, which is accompanied by a whole bunch of minor UI improvements. If you've heavily customised your site, there's a small chance that this will break your site, so everyone needs to explicitly opt-in to the upgrade by adding the following to `_pkgdown.yml`:\n\n```yaml\ntemplate:\n  bootstrap: 5\n```\n\nThen learn about the many new ways to customise your site in `vignette(\"customise\")`.\n\n## In the wild\n\nAt last count, pkgdown is used [by over 12,000 packages](https://github.com/search?q=path%3A_pkgdown.yml+language%3AYAML&type=code&l=YAML). Here are a few examples:\n\n* [bayesplot](http://mc-stan.org/bayesplot/index.html)\n  ([source](https://github.com/stan-dev/bayesplot/tree/gh-pages)):\n  plotting functions for posterior analysis, model checking, and MCMC\n  diagnostics.\n\n* [valr](https://rnabioco.github.io/valr/)\n  ([source](https://github.com/rnabioco/valr)):\n  read and manipulate genome intervals and signals.\n\n* [mkin](https://pkgdown.jrwb.de/mkin/)\n  ([source](https://github.com/jranke/mkin)):\n  calculation routines based on the FOCUS Kinetics Report\n\n* [NMF](http://renozao.github.io/NMF/master/index.html)\n  ([source](https://github.com/renozao/NMF)):\n  a framework to perform non-negative matrix factorization (NMF).\n\n* [tidyverse and r-lib packages source](https://github.com/search?q=path%3A%22_pkgdown.yml%22+AND+%28org%3Atidyverse+OR+org%3Ar-lib%29&type=code)\n\nComparing the source and output of these sites is a great way to learn new pkgdown techniques.\n\n## Code of conduct\n\nPlease note that this project is released with a [Contributor Code of Conduct](https://pkgdown.r-lib.org/CODE_OF_CONDUCT.html). By participating in this project you agree to abide by its terms.\n"
  },
  {
    "path": "README.md",
    "content": "\n<!-- README.md is generated from README.Rmd. Please edit that file -->\n\n# pkgdown <a href=\"https://pkgdown.r-lib.org\"><img src=\"man/figures/logo.png\" align=\"right\" height=\"138\" alt=\"pkgdown website\" /></a>\n\n<!-- badges: start -->\n\n<a href=\"https://cran.r-project.org/package=pkgdown\"\nclass=\"pkgdown-release\"><img\nsrc=\"https://www.r-pkg.org/badges/version/pkgdown\"\nalt=\"CRAN Status\" /></a> <a\nhref=\"https://github.com/r-lib/pkgdown/actions/workflows/R-CMD-check.yaml\"\nclass=\"pkgdown-devel\"><img\nsrc=\"https://github.com/r-lib/pkgdown/actions/workflows/R-CMD-check.yaml/badge.svg\"\nalt=\"R-CMD-check\" /></a> [![Codecov test\ncoverage](https://codecov.io/gh/r-lib/pkgdown/graph/badge.svg)](https://app.codecov.io/gh/r-lib/pkgdown)\n<!-- badges: end -->\n\npkgdown is designed to make it quick and easy to build a website for\nyour package. You can see pkgdown in action at\n<https://pkgdown.r-lib.org>: this is the output of pkgdown applied to\nthe latest version of pkgdown. Learn more in `vignette(\"pkgdown\")` or\n`?build_site`.\n\n## Installation\n\n<div class=\".pkgdown-release\">\n\n``` r\n# Install released version from CRAN\ninstall.packages(\"pkgdown\")\n```\n\n</div>\n\n<div class=\".pkgdown-devel\">\n\n``` r\n# Install development version from GitHub\n# install.packages(\"pak\")\npak::pak(\"r-lib/pkgdown\")\n```\n\n</div>\n\n## Usage\n\nGet started with [usethis](https://usethis.r-lib.org/):\n\n``` r\n# Run once to configure your package to use and deploy pkgdown\nusethis::use_pkgdown_github_pages()\n```\n\n``` r\n# Preview your site locally before publishing\npkgdown::build_site()\n```\n\nThis adds the necessary components and sets up GitHub Actions[^1] for\nautomatic site building when deploying. Your `README.md` becomes the\nhomepage, documentation in `man/` generates a function reference, and\nvignettes will be rendered into `articles/`.\n\n### pkgdown 2.0.0 and Bootstrap 5\n\npkgdown 2.0.0 includes an upgrade from Bootstrap 3 to Bootstrap 5, which\nis accompanied by a whole bunch of minor UI improvements. If you’ve\nheavily customised your site, there’s a small chance that this will\nbreak your site, so everyone needs to explicitly opt-in to the upgrade\nby adding the following to `_pkgdown.yml`:\n\n``` yaml\ntemplate:\n  bootstrap: 5\n```\n\nThen learn about the many new ways to customise your site in\n`vignette(\"customise\")`.\n\n## In the wild\n\nAt last count, pkgdown is used [by over 12,000\npackages](https://github.com/search?q=path%3A_pkgdown.yml+language%3AYAML&type=code&l=YAML).\nHere are a few examples:\n\n- [bayesplot](http://mc-stan.org/bayesplot/index.html)\n  ([source](https://github.com/stan-dev/bayesplot/tree/gh-pages)):\n  plotting functions for posterior analysis, model checking, and MCMC\n  diagnostics.\n\n- [valr](https://rnabioco.github.io/valr/)\n  ([source](https://github.com/rnabioco/valr)): read and manipulate\n  genome intervals and signals.\n\n- [mkin](https://pkgdown.jrwb.de/mkin/)\n  ([source](https://github.com/jranke/mkin)): calculation routines based\n  on the FOCUS Kinetics Report\n\n- [NMF](http://renozao.github.io/NMF/master/index.html)\n  ([source](https://github.com/renozao/NMF)): a framework to perform\n  non-negative matrix factorization (NMF).\n\n- [tidyverse and r-lib packages\n  source](https://github.com/search?q=path%3A%22_pkgdown.yml%22+AND+%28org%3Atidyverse+OR+org%3Ar-lib%29&type=code)\n\nComparing the source and output of these sites is a great way to learn\nnew pkgdown techniques.\n\n## Code of conduct\n\nPlease note that this project is released with a [Contributor Code of\nConduct](https://pkgdown.r-lib.org/CODE_OF_CONDUCT.html). By\nparticipating in this project you agree to abide by its terms.\n\n[^1]: If you don’t use GitHub, you can use `usethis::use_pkgdown()` +\n    `pkgdown::build_site()` to create a website.\n"
  },
  {
    "path": "air.toml",
    "content": "[format]\ntable = [\"tribble\"]\n"
  },
  {
    "path": "codecov.yml",
    "content": "comment: false\n\ncoverage:\n  status:\n    project:\n      default:\n        target: auto\n        threshold: 1%\n        informational: true\n    patch:\n      default:\n        target: auto\n        threshold: 1%\n        informational: true\n"
  },
  {
    "path": "cran-comments.md",
    "content": "## R CMD check results\n\n0 errors | 0 warnings | 0 notes\n\n## revdepcheck results\n\nWe checked 165 reverse dependencies, comparing R CMD check results across CRAN and dev versions of this package. We saw 0 new problems and only failed to check multinma.\n"
  },
  {
    "path": "inst/BS3/assets/bootstrap-toc.css",
    "content": "/*!\n * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/)\n * Copyright 2015 Aidan Feldman\n * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */\n\n/* modified from https://github.com/twbs/bootstrap/blob/94b4076dd2efba9af71f0b18d4ee4b163aa9e0dd/docs/assets/css/src/docs.css#L548-L601 */\n\n/* All levels of nav */\nnav[data-toggle='toc'] .nav > li > a {\n  display: block;\n  padding: 4px 20px;\n  font-size: 13px;\n  font-weight: 500;\n  color: #767676;\n}\nnav[data-toggle='toc'] .nav > li > a:hover,\nnav[data-toggle='toc'] .nav > li > a:focus {\n  padding-left: 19px;\n  color: #563d7c;\n  text-decoration: none;\n  background-color: transparent;\n  border-left: 1px solid #563d7c;\n}\nnav[data-toggle='toc'] .nav > .active > a,\nnav[data-toggle='toc'] .nav > .active:hover > a,\nnav[data-toggle='toc'] .nav > .active:focus > a {\n  padding-left: 18px;\n  font-weight: bold;\n  color: #563d7c;\n  background-color: transparent;\n  border-left: 2px solid #563d7c;\n}\n\n/* Nav: second level (shown on .active) */\nnav[data-toggle='toc'] .nav .nav {\n  display: none; /* Hide by default, but at >768px, show it */\n  padding-bottom: 10px;\n}\nnav[data-toggle='toc'] .nav .nav > li > a {\n  padding-top: 1px;\n  padding-bottom: 1px;\n  padding-left: 30px;\n  font-size: 12px;\n  font-weight: normal;\n}\nnav[data-toggle='toc'] .nav .nav > li > a:hover,\nnav[data-toggle='toc'] .nav .nav > li > a:focus {\n  padding-left: 29px;\n}\nnav[data-toggle='toc'] .nav .nav > .active > a,\nnav[data-toggle='toc'] .nav .nav > .active:hover > a,\nnav[data-toggle='toc'] .nav .nav > .active:focus > a {\n  padding-left: 28px;\n  font-weight: 500;\n}\n\n/* from https://github.com/twbs/bootstrap/blob/e38f066d8c203c3e032da0ff23cd2d6098ee2dd6/docs/assets/css/src/docs.css#L631-L634 */\nnav[data-toggle='toc'] .nav > .active > ul {\n  display: block;\n}\n"
  },
  {
    "path": "inst/BS3/assets/bootstrap-toc.js",
    "content": "/*!\n * Bootstrap Table of Contents v0.4.1 (http://afeld.github.io/bootstrap-toc/)\n * Copyright 2015 Aidan Feldman\n * Licensed under MIT (https://github.com/afeld/bootstrap-toc/blob/gh-pages/LICENSE.md) */\n(function() {\n  'use strict';\n\n  window.Toc = {\n    helpers: {\n      // return all matching elements in the set, or their descendants\n      findOrFilter: function($el, selector) {\n        // http://danielnouri.org/notes/2011/03/14/a-jquery-find-that-also-finds-the-root-element/\n        // http://stackoverflow.com/a/12731439/358804\n        var $descendants = $el.find(selector);\n        return $el.filter(selector).add($descendants).filter(':not([data-toc-skip])');\n      },\n\n      generateUniqueIdBase: function(el) {\n        var text = $(el).text();\n        var anchor = text.trim().toLowerCase().replace(/[^A-Za-z0-9]+/g, '-');\n        return anchor || el.tagName.toLowerCase();\n      },\n\n      generateUniqueId: function(el) {\n        var anchorBase = this.generateUniqueIdBase(el);\n        for (var i = 0; ; i++) {\n          var anchor = anchorBase;\n          if (i > 0) {\n            // add suffix\n            anchor += '-' + i;\n          }\n          // check if ID already exists\n          if (!document.getElementById(anchor)) {\n            return anchor;\n          }\n        }\n      },\n\n      generateAnchor: function(el) {\n        if (el.id) {\n          return el.id;\n        } else {\n          var anchor = this.generateUniqueId(el);\n          el.id = anchor;\n          return anchor;\n        }\n      },\n\n      createNavList: function() {\n        return $('<ul class=\"nav\"></ul>');\n      },\n\n      createChildNavList: function($parent) {\n        var $childList = this.createNavList();\n        $parent.append($childList);\n        return $childList;\n      },\n\n      generateNavEl: function(anchor, text) {\n        var $a = $('<a></a>');\n        $a.attr('href', '#' + anchor);\n        $a.text(text);\n        var $li = $('<li></li>');\n        $li.append($a);\n        return $li;\n      },\n\n      generateNavItem: function(headingEl) {\n        var anchor = this.generateAnchor(headingEl);\n        var $heading = $(headingEl);\n        var text = $heading.data('toc-text') || $heading.text();\n        return this.generateNavEl(anchor, text);\n      },\n\n      // Find the first heading level (`<h1>`, then `<h2>`, etc.) that has more than one element. Defaults to 1 (for `<h1>`).\n      getTopLevel: function($scope) {\n        for (var i = 1; i <= 6; i++) {\n          var $headings = this.findOrFilter($scope, 'h' + i);\n          if ($headings.length > 1) {\n            return i;\n          }\n        }\n\n        return 1;\n      },\n\n      // returns the elements for the top level, and the next below it\n      getHeadings: function($scope, topLevel) {\n        var topSelector = 'h' + topLevel;\n\n        var secondaryLevel = topLevel + 1;\n        var secondarySelector = 'h' + secondaryLevel;\n\n        return this.findOrFilter($scope, topSelector + ',' + secondarySelector);\n      },\n\n      getNavLevel: function(el) {\n        return parseInt(el.tagName.charAt(1), 10);\n      },\n\n      populateNav: function($topContext, topLevel, $headings) {\n        var $context = $topContext;\n        var $prevNav;\n\n        var helpers = this;\n        $headings.each(function(i, el) {\n          var $newNav = helpers.generateNavItem(el);\n          var navLevel = helpers.getNavLevel(el);\n\n          // determine the proper $context\n          if (navLevel === topLevel) {\n            // use top level\n            $context = $topContext;\n          } else if ($prevNav && $context === $topContext) {\n            // create a new level of the tree and switch to it\n            $context = helpers.createChildNavList($prevNav);\n          } // else use the current $context\n\n          $context.append($newNav);\n\n          $prevNav = $newNav;\n        });\n      },\n\n      parseOps: function(arg) {\n        var opts;\n        if (arg.jquery) {\n          opts = {\n            $nav: arg\n          };\n        } else {\n          opts = arg;\n        }\n        opts.$scope = opts.$scope || $(document.body);\n        return opts;\n      }\n    },\n\n    // accepts a jQuery object, or an options object\n    init: function(opts) {\n      opts = this.helpers.parseOps(opts);\n\n      // ensure that the data attribute is in place for styling\n      opts.$nav.attr('data-toggle', 'toc');\n\n      var $topContext = this.helpers.createChildNavList(opts.$nav);\n      var topLevel = this.helpers.getTopLevel(opts.$scope);\n      var $headings = this.helpers.getHeadings(opts.$scope, topLevel);\n      this.helpers.populateNav($topContext, topLevel, $headings);\n    }\n  };\n\n  $(function() {\n    $('nav[data-toggle=\"toc\"]').each(function(i, el) {\n      var $nav = $(el);\n      Toc.init($nav);\n    });\n  });\n})();\n"
  },
  {
    "path": "inst/BS3/assets/docsearch.css",
    "content": "/* Docsearch -------------------------------------------------------------- */\n/*\n  Source: https://github.com/algolia/docsearch/\n  License: MIT\n*/\n\n.algolia-autocomplete {\n  display: block;\n  -webkit-box-flex: 1;\n  -ms-flex: 1;\n  flex: 1\n}\n\n.algolia-autocomplete .ds-dropdown-menu {\n  width: 100%;\n  min-width: none;\n  max-width: none;\n  padding: .75rem 0;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, .1);\n  box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .175);\n}\n\n@media (min-width:768px) {\n  .algolia-autocomplete .ds-dropdown-menu {\n      width: 175%\n  }\n}\n\n.algolia-autocomplete .ds-dropdown-menu::before {\n  display: none\n}\n\n.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-] {\n  padding: 0;\n  background-color: rgb(255,255,255);\n  border: 0;\n  max-height: 80vh;\n}\n\n.algolia-autocomplete .ds-dropdown-menu .ds-suggestions {\n  margin-top: 0\n}\n\n.algolia-autocomplete .algolia-docsearch-suggestion {\n  padding: 0;\n  overflow: visible\n}\n\n.algolia-autocomplete .algolia-docsearch-suggestion--category-header {\n  padding: .125rem 1rem;\n  margin-top: 0;\n  font-size: 1.3em;\n  font-weight: 500;\n  color: #00008B;\n  border-bottom: 0\n}\n\n.algolia-autocomplete .algolia-docsearch-suggestion--wrapper {\n    float: none;\n    padding-top: 0\n}\n\n.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column {\n  float: none;\n  width: auto;\n  padding: 0;\n  text-align: left\n}\n\n.algolia-autocomplete .algolia-docsearch-suggestion--content {\n  float: none;\n  width: auto;\n  padding: 0\n}\n\n.algolia-autocomplete .algolia-docsearch-suggestion--content::before {\n  display: none\n}\n\n.algolia-autocomplete .ds-suggestion:not(:first-child) .algolia-docsearch-suggestion--category-header {\n  padding-top: .75rem;\n  margin-top: .75rem;\n  border-top: 1px solid rgba(0, 0, 0, .1)\n}\n\n.algolia-autocomplete .ds-suggestion .algolia-docsearch-suggestion--subcategory-column {\n  display: block;\n  padding: .1rem 1rem;\n  margin-bottom: 0.1;\n  font-size: 1.0em;\n  font-weight: 400\n  /* display: none */\n}\n\n.algolia-autocomplete .algolia-docsearch-suggestion--title {\n  display: block;\n  padding: .25rem 1rem;\n  margin-bottom: 0;\n  font-size: 0.9em;\n  font-weight: 400\n}\n\n.algolia-autocomplete .algolia-docsearch-suggestion--text {\n  padding: 0 1rem .5rem;\n  margin-top: -.25rem;\n  font-size: 0.8em;\n  font-weight: 400;\n  line-height: 1.25\n}\n\n.algolia-autocomplete .algolia-docsearch-footer {\n  width: 110px;\n  height: 20px;\n  z-index: 3;\n  margin-top: 10.66667px;\n  float: right;\n  font-size: 0;\n  line-height: 0;\n}\n\n.algolia-autocomplete .algolia-docsearch-footer--logo {\n  background-image: url(\"data:image/svg+xml;utf8,<svg viewBox='0 0 130 18' xmlns='http://www.w3.org/2000/svg'><defs><linearGradient x1='-36.868%' y1='134.936%' x2='129.432%' y2='-27.7%' id='a'><stop stop-color='%2300AEFF' offset='0%'/><stop stop-color='%233369E7' offset='100%'/></linearGradient></defs><g fill='none' fill-rule='evenodd'><path d='M59.399.022h13.299a2.372 2.372 0 0 1 2.377 2.364V15.62a2.372 2.372 0 0 1-2.377 2.364H59.399a2.372 2.372 0 0 1-2.377-2.364V2.381A2.368 2.368 0 0 1 59.399.022z' fill='url(%23a)'/><path d='M66.257 4.56c-2.815 0-5.1 2.272-5.1 5.078 0 2.806 2.284 5.072 5.1 5.072 2.815 0 5.1-2.272 5.1-5.078 0-2.806-2.279-5.072-5.1-5.072zm0 8.652c-1.983 0-3.593-1.602-3.593-3.574 0-1.972 1.61-3.574 3.593-3.574 1.983 0 3.593 1.602 3.593 3.574a3.582 3.582 0 0 1-3.593 3.574zm0-6.418v2.664c0 .076.082.131.153.093l2.377-1.226c.055-.027.071-.093.044-.147a2.96 2.96 0 0 0-2.465-1.487c-.055 0-.11.044-.11.104l.001-.001zm-3.33-1.956l-.312-.311a.783.783 0 0 0-1.106 0l-.372.37a.773.773 0 0 0 0 1.101l.307.305c.049.049.121.038.164-.011.181-.245.378-.479.597-.697.225-.223.455-.42.707-.599.055-.033.06-.109.016-.158h-.001zm5.001-.806v-.616a.781.781 0 0 0-.783-.779h-1.824a.78.78 0 0 0-.783.779v.632c0 .071.066.12.137.104a5.736 5.736 0 0 1 1.588-.223c.52 0 1.035.071 1.534.207a.106.106 0 0 0 .131-.104z' fill='%23FFF'/><path d='M102.162 13.762c0 1.455-.372 2.517-1.123 3.193-.75.676-1.895 1.013-3.44 1.013-.564 0-1.736-.109-2.673-.316l.345-1.689c.783.163 1.819.207 2.361.207.86 0 1.473-.174 1.84-.523.367-.349.548-.866.548-1.553v-.349a6.374 6.374 0 0 1-.838.316 4.151 4.151 0 0 1-1.194.158 4.515 4.515 0 0 1-1.616-.278 3.385 3.385 0 0 1-1.254-.817 3.744 3.744 0 0 1-.811-1.351c-.192-.539-.29-1.504-.29-2.212 0-.665.104-1.498.307-2.054a3.925 3.925 0 0 1 .904-1.433 4.124 4.124 0 0 1 1.441-.926 5.31 5.31 0 0 1 1.945-.365c.696 0 1.337.087 1.961.191a15.86 15.86 0 0 1 1.588.332v8.456h-.001zm-5.954-4.206c0 .893.197 1.885.592 2.299.394.414.904.621 1.528.621.34 0 .663-.049.964-.142a2.75 2.75 0 0 0 .734-.332v-5.29a8.531 8.531 0 0 0-1.413-.18c-.778-.022-1.369.294-1.786.801-.411.507-.619 1.395-.619 2.223zm16.12 0c0 .719-.104 1.264-.318 1.858a4.389 4.389 0 0 1-.904 1.52c-.389.42-.854.746-1.402.975-.548.229-1.391.36-1.813.36-.422-.005-1.26-.125-1.802-.36a4.088 4.088 0 0 1-1.397-.975 4.486 4.486 0 0 1-.909-1.52 5.037 5.037 0 0 1-.329-1.858c0-.719.099-1.411.318-1.999.219-.588.526-1.09.92-1.509.394-.42.865-.741 1.402-.97a4.547 4.547 0 0 1 1.786-.338 4.69 4.69 0 0 1 1.791.338c.548.229 1.019.55 1.402.97.389.42.69.921.909 1.509.23.588.345 1.28.345 1.999h.001zm-2.191.005c0-.921-.203-1.689-.597-2.223-.394-.539-.948-.806-1.654-.806-.707 0-1.26.267-1.654.806-.394.539-.586 1.302-.586 2.223 0 .932.197 1.558.592 2.098.394.545.948.812 1.654.812.707 0 1.26-.272 1.654-.812.394-.545.592-1.166.592-2.098h-.001zm6.962 4.707c-3.511.016-3.511-2.822-3.511-3.274L113.583.926l2.142-.338v10.003c0 .256 0 1.88 1.375 1.885v1.792h-.001zm3.774 0h-2.153V5.072l2.153-.338v9.534zm-1.079-10.542c.718 0 1.304-.578 1.304-1.291 0-.714-.581-1.291-1.304-1.291-.723 0-1.304.578-1.304 1.291 0 .714.586 1.291 1.304 1.291zm6.431 1.013c.707 0 1.304.087 1.786.262.482.174.871.42 1.156.73.285.311.488.735.608 1.182.126.447.186.937.186 1.476v5.481a25.24 25.24 0 0 1-1.495.251c-.668.098-1.419.147-2.251.147a6.829 6.829 0 0 1-1.517-.158 3.213 3.213 0 0 1-1.178-.507 2.455 2.455 0 0 1-.761-.904c-.181-.37-.274-.893-.274-1.438 0-.523.104-.855.307-1.215.208-.36.487-.654.838-.883a3.609 3.609 0 0 1 1.227-.49 7.073 7.073 0 0 1 2.202-.103c.263.027.537.076.833.147v-.349c0-.245-.027-.479-.088-.697a1.486 1.486 0 0 0-.307-.583c-.148-.169-.34-.3-.581-.392a2.536 2.536 0 0 0-.915-.163c-.493 0-.942.06-1.353.131-.411.071-.75.153-1.008.245l-.257-1.749c.268-.093.668-.185 1.183-.278a9.335 9.335 0 0 1 1.66-.142l-.001-.001zm.181 7.731c.657 0 1.145-.038 1.484-.104v-2.168a5.097 5.097 0 0 0-1.978-.104c-.241.033-.46.098-.652.191a1.167 1.167 0 0 0-.466.392c-.121.169-.175.267-.175.523 0 .501.175.79.493.981.323.196.75.289 1.293.289h.001zM84.109 4.794c.707 0 1.304.087 1.786.262.482.174.871.42 1.156.73.29.316.487.735.608 1.182.126.447.186.937.186 1.476v5.481a25.24 25.24 0 0 1-1.495.251c-.668.098-1.419.147-2.251.147a6.829 6.829 0 0 1-1.517-.158 3.213 3.213 0 0 1-1.178-.507 2.455 2.455 0 0 1-.761-.904c-.181-.37-.274-.893-.274-1.438 0-.523.104-.855.307-1.215.208-.36.487-.654.838-.883a3.609 3.609 0 0 1 1.227-.49 7.073 7.073 0 0 1 2.202-.103c.257.027.537.076.833.147v-.349c0-.245-.027-.479-.088-.697a1.486 1.486 0 0 0-.307-.583c-.148-.169-.34-.3-.581-.392a2.536 2.536 0 0 0-.915-.163c-.493 0-.942.06-1.353.131-.411.071-.75.153-1.008.245l-.257-1.749c.268-.093.668-.185 1.183-.278a8.89 8.89 0 0 1 1.66-.142l-.001-.001zm.186 7.736c.657 0 1.145-.038 1.484-.104v-2.168a5.097 5.097 0 0 0-1.978-.104c-.241.033-.46.098-.652.191a1.167 1.167 0 0 0-.466.392c-.121.169-.175.267-.175.523 0 .501.175.79.493.981.318.191.75.289 1.293.289h.001zm8.682 1.738c-3.511.016-3.511-2.822-3.511-3.274L89.461.926l2.142-.338v10.003c0 .256 0 1.88 1.375 1.885v1.792h-.001z' fill='%23182359'/><path d='M5.027 11.025c0 .698-.252 1.246-.757 1.644-.505.397-1.201.596-2.089.596-.888 0-1.615-.138-2.181-.414v-1.214c.358.168.739.301 1.141.397.403.097.778.145 1.125.145.508 0 .884-.097 1.125-.29a.945.945 0 0 0 .363-.779.978.978 0 0 0-.333-.747c-.222-.204-.68-.446-1.375-.725-.716-.29-1.221-.621-1.515-.994-.294-.372-.44-.82-.44-1.343 0-.655.233-1.171.698-1.547.466-.376 1.09-.564 1.875-.564.752 0 1.5.165 2.245.494l-.408 1.047c-.698-.294-1.321-.44-1.869-.44-.415 0-.73.09-.945.271a.89.89 0 0 0-.322.717c0 .204.043.379.129.524.086.145.227.282.424.411.197.129.551.299 1.063.51.577.24.999.464 1.268.671.269.208.466.442.591.704.125.261.188.569.188.924l-.001.002zm3.98 2.24c-.924 0-1.646-.269-2.167-.808-.521-.539-.782-1.281-.782-2.226 0-.97.242-1.733.725-2.288.483-.555 1.148-.833 1.993-.833.784 0 1.404.238 1.858.714.455.476.682 1.132.682 1.966v.682H7.357c.018.577.174 1.02.467 1.329.294.31.707.465 1.241.465.351 0 .678-.033.98-.099a5.1 5.1 0 0 0 .975-.33v1.026a3.865 3.865 0 0 1-.935.312 5.723 5.723 0 0 1-1.08.091l.002-.001zm-.231-5.199c-.401 0-.722.127-.964.381s-.386.625-.432 1.112h2.696c-.007-.491-.125-.862-.354-1.115-.229-.252-.544-.379-.945-.379l-.001.001zm7.692 5.092l-.252-.827h-.043c-.286.362-.575.608-.865.739-.29.131-.662.196-1.117.196-.584 0-1.039-.158-1.367-.473-.328-.315-.491-.761-.491-1.337 0-.612.227-1.074.682-1.386.455-.312 1.148-.482 2.079-.51l1.026-.032v-.317c0-.38-.089-.663-.266-.851-.177-.188-.452-.282-.824-.282-.304 0-.596.045-.876.134a6.68 6.68 0 0 0-.806.317l-.408-.902a4.414 4.414 0 0 1 1.058-.384 4.856 4.856 0 0 1 1.085-.132c.756 0 1.326.165 1.711.494.385.329.577.847.577 1.552v4.002h-.902l-.001-.001zm-1.88-.859c.458 0 .826-.128 1.104-.384.278-.256.416-.615.416-1.077v-.516l-.763.032c-.594.021-1.027.121-1.297.298s-.406.448-.406.814c0 .265.079.47.236.615.158.145.394.218.709.218h.001zm7.557-5.189c.254 0 .464.018.628.054l-.124 1.176a2.383 2.383 0 0 0-.559-.064c-.505 0-.914.165-1.227.494-.313.329-.47.757-.47 1.284v3.105h-1.262V7.218h.988l.167 1.047h.064c.197-.354.454-.636.771-.843a1.83 1.83 0 0 1 1.023-.312h.001zm4.125 6.155c-.899 0-1.582-.262-2.049-.787-.467-.525-.701-1.277-.701-2.259 0-.999.244-1.767.733-2.304.489-.537 1.195-.806 2.119-.806.627 0 1.191.116 1.692.349l-.381 1.015c-.534-.208-.974-.312-1.321-.312-1.028 0-1.542.682-1.542 2.046 0 .666.128 1.166.384 1.501.256.335.631.502 1.125.502a3.23 3.23 0 0 0 1.595-.419v1.101a2.53 2.53 0 0 1-.722.285 4.356 4.356 0 0 1-.932.086v.002zm8.277-.107h-1.268V9.506c0-.458-.092-.8-.277-1.026-.184-.226-.477-.338-.878-.338-.53 0-.919.158-1.168.475-.249.317-.373.848-.373 1.593v2.949h-1.262V4.801h1.262v2.122c0 .34-.021.704-.064 1.09h.081a1.76 1.76 0 0 1 .717-.666c.306-.158.663-.236 1.072-.236 1.439 0 2.159.725 2.159 2.175v3.873l-.001-.001zm7.649-6.048c.741 0 1.319.269 1.732.806.414.537.62 1.291.62 2.261 0 .974-.209 1.732-.628 2.275-.419.542-1.001.814-1.746.814-.752 0-1.336-.27-1.751-.811h-.086l-.231.704h-.945V4.801h1.262v1.987l-.021.655-.032.553h.054c.401-.591.992-.886 1.772-.886zm-.328 1.031c-.508 0-.875.149-1.098.448-.224.299-.339.799-.346 1.501v.086c0 .723.115 1.247.344 1.571.229.324.603.486 1.123.486.448 0 .787-.177 1.018-.532.231-.354.346-.867.346-1.536 0-1.35-.462-2.025-1.386-2.025l-.001.001zm3.244-.924h1.375l1.209 3.368c.183.48.304.931.365 1.354h.043c.032-.197.091-.436.177-.717.086-.281.541-1.616 1.364-4.004h1.364l-2.541 6.73c-.462 1.235-1.232 1.853-2.31 1.853-.279 0-.551-.03-.816-.091v-.999c.19.043.406.064.65.064.609 0 1.037-.353 1.284-1.058l.22-.559-2.385-5.941h.001z' fill='%231D3657'/></g></svg>\");\n  background-repeat: no-repeat;\n  background-position: 50%;\n  background-size: 100%;\n  overflow: hidden;\n  text-indent: -9000px;\n  width: 100%;\n  height: 100%;\n  display: block;\n  transform: translate(-8px);\n}\n\n.algolia-autocomplete .algolia-docsearch-suggestion--highlight {\n  color: #FF8C00;\n  background: rgba(232, 189, 54, 0.1)\n}\n\n\n.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight {\n  box-shadow: inset 0 -2px 0 0 rgba(105, 105, 105, .5)\n}\n\n.algolia-autocomplete .ds-suggestion.ds-cursor .algolia-docsearch-suggestion--content {\n  background-color: rgba(192, 192, 192, .15)\n}\n"
  },
  {
    "path": "inst/BS3/assets/docsearch.js",
    "content": "$(function() {\n\n  // register a handler to move the focus to the search bar\n  // upon pressing shift + \"/\" (i.e. \"?\")\n  $(document).on('keydown', function(e) {\n    if (e.shiftKey && e.keyCode == 191) {\n      e.preventDefault();\n      $(\"#search-input\").focus();\n    }\n  });\n\n  $(document).ready(function() {\n    // do keyword highlighting\n    /* modified from https://jsfiddle.net/julmot/bL6bb5oo/ */\n    var mark = function() {\n\n      var referrer = document.URL ;\n      var paramKey = \"q\" ;\n\n      if (referrer.indexOf(\"?\") !== -1) {\n        var qs = referrer.substr(referrer.indexOf('?') + 1);\n        var qs_noanchor = qs.split('#')[0];\n        var qsa = qs_noanchor.split('&');\n        var keyword = \"\";\n\n        for (var i = 0; i < qsa.length; i++) {\n          var currentParam = qsa[i].split('=');\n\n          if (currentParam.length !== 2) {\n            continue;\n          }\n\n          if (currentParam[0] == paramKey) {\n            keyword = decodeURIComponent(currentParam[1].replace(/\\+/g, \"%20\"));\n          }\n        }\n\n        if (keyword !== \"\") {\n          $(\".contents\").unmark({\n            done: function() {\n              $(\".contents\").mark(keyword);\n            }\n          });\n        }\n      }\n    };\n\n    mark();\n  });\n});\n\n/* Search term highlighting ------------------------------*/\n\nfunction matchedWords(hit) {\n  var words = [];\n\n  var hierarchy = hit._highlightResult.hierarchy;\n  // loop to fetch from lvl0, lvl1, etc.\n  for (var idx in hierarchy) {\n    words = words.concat(hierarchy[idx].matchedWords);\n  }\n\n  var content = hit._highlightResult.content;\n  if (content) {\n    words = words.concat(content.matchedWords);\n  }\n\n  // return unique words\n  var words_uniq = [...new Set(words)];\n  return words_uniq;\n}\n\nfunction updateHitURL(hit) {\n\n  var words = matchedWords(hit);\n  var url = \"\";\n\n  if (hit.anchor) {\n    url = hit.url_without_anchor + '?q=' + escape(words.join(\" \")) + '#' + hit.anchor;\n  } else {\n    url = hit.url + '?q=' + escape(words.join(\" \"));\n  }\n\n  return url;\n}\n"
  },
  {
    "path": "inst/BS3/assets/pkgdown.css",
    "content": "/* Sticky footer */\n\n/**\n * Basic idea: https://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer/\n * Details: https://github.com/philipwalton/solved-by-flexbox/blob/master/assets/css/components/site.css\n *\n * .Site -> body > .container\n * .Site-content -> body > .container .row\n * .footer -> footer\n *\n * Key idea seems to be to ensure that .container and __all its parents__\n * have height set to 100%\n *\n */\n\nhtml, body {\n  height: 100%;\n}\n\nbody {\n  position: relative;\n}\n\nbody > .container {\n  display: flex;\n  height: 100%;\n  flex-direction: column;\n}\n\nbody > .container .row {\n  flex: 1 0 auto;\n}\n\nfooter {\n  margin-top: 45px;\n  padding: 35px 0 36px;\n  border-top: 1px solid #e5e5e5;\n  color: #666;\n  display: flex;\n  flex-shrink: 0;\n}\nfooter p {\n  margin-bottom: 0;\n}\nfooter div {\n  flex: 1;\n}\nfooter .pkgdown {\n  text-align: right;\n}\nfooter p {\n  margin-bottom: 0;\n}\n\nimg.icon {\n  float: right;\n}\n\n/* Ensure in-page images don't run outside their container */\n.contents img {\n  max-width: 100%;\n  height: auto;\n}\n\n/* Fix bug in bootstrap (only seen in firefox) */\nsummary {\n  display: list-item;\n}\n\n/* Typographic tweaking ---------------------------------*/\n\n.contents .page-header {\n  margin-top: calc(-60px + 1em);\n}\n\ndd {\n  margin-left: 3em;\n}\n\n/* Section anchors ---------------------------------*/\n\na.anchor {\n  display: none;\n  margin-left: 5px;\n  width: 20px;\n  height: 20px;\n\n  background-image: url(./link.svg);\n  background-repeat: no-repeat;\n  background-size: 20px 20px;\n  background-position: center center;\n}\n\nh1:hover .anchor,\nh2:hover .anchor,\nh3:hover .anchor,\nh4:hover .anchor,\nh5:hover .anchor,\nh6:hover .anchor {\n  display: inline-block;\n}\n\n/* Fixes for fixed navbar --------------------------*/\n\n.contents h1, .contents h2, .contents h3, .contents h4 {\n  padding-top: 60px;\n  margin-top: -40px;\n}\n\n/* Navbar submenu --------------------------*/\n\n.dropdown-submenu {\n  position: relative;\n}\n\n.dropdown-submenu>.dropdown-menu {\n  top: 0;\n  left: 100%;\n  margin-top: -6px;\n  margin-left: -1px;\n  border-radius: 0 6px 6px 6px;\n}\n\n.dropdown-submenu:hover>.dropdown-menu {\n  display: block;\n}\n\n.dropdown-submenu>a:after {\n  display: block;\n  content: \" \";\n  float: right;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #cccccc;\n  margin-top: 5px;\n  margin-right: -10px;\n}\n\n.dropdown-submenu:hover>a:after {\n  border-left-color: #ffffff;\n}\n\n.dropdown-submenu.pull-left {\n  float: none;\n}\n\n.dropdown-submenu.pull-left>.dropdown-menu {\n  left: -100%;\n  margin-left: 10px;\n  border-radius: 6px 0 6px 6px;\n}\n\n/* Sidebar --------------------------*/\n\n#pkgdown-sidebar {\n  margin-top: 30px;\n  position: -webkit-sticky;\n  position: sticky;\n  top: 70px;\n}\n\n#pkgdown-sidebar h2 {\n  font-size: 1.5em;\n  margin-top: 1em;\n}\n\n#pkgdown-sidebar h2:first-child {\n  margin-top: 0;\n}\n\n#pkgdown-sidebar .list-unstyled li {\n  margin-bottom: 0.5em;\n}\n\n/* bootstrap-toc tweaks ------------------------------------------------------*/\n\n/* All levels of nav */\n\nnav[data-toggle='toc'] .nav > li > a {\n  padding: 4px 20px 4px 6px;\n  font-size: 1.5rem;\n  font-weight: 400;\n  color: inherit;\n}\n\nnav[data-toggle='toc'] .nav > li > a:hover,\nnav[data-toggle='toc'] .nav > li > a:focus {\n  padding-left: 5px;\n  color: inherit;\n  border-left: 1px solid #878787;\n}\n\nnav[data-toggle='toc'] .nav > .active > a,\nnav[data-toggle='toc'] .nav > .active:hover > a,\nnav[data-toggle='toc'] .nav > .active:focus > a {\n  padding-left: 5px;\n  font-size: 1.5rem;\n  font-weight: 400;\n  color: inherit;\n  border-left: 2px solid #878787;\n}\n\n/* Nav: second level (shown on .active) */\n\nnav[data-toggle='toc'] .nav .nav {\n  display: none; /* Hide by default, but at >768px, show it */\n  padding-bottom: 10px;\n}\n\nnav[data-toggle='toc'] .nav .nav > li > a {\n  padding-left: 16px;\n  font-size: 1.35rem;\n}\n\nnav[data-toggle='toc'] .nav .nav > li > a:hover,\nnav[data-toggle='toc'] .nav .nav > li > a:focus {\n  padding-left: 15px;\n}\n\nnav[data-toggle='toc'] .nav .nav > .active > a,\nnav[data-toggle='toc'] .nav .nav > .active:hover > a,\nnav[data-toggle='toc'] .nav .nav > .active:focus > a {\n  padding-left: 15px;\n  font-weight: 500;\n  font-size: 1.35rem;\n}\n\n/* orcid ------------------------------------------------------------------- */\n\n.orcid {\n  font-size: 16px;\n  color: #A6CE39;\n  /* margins are required by official ORCID trademark and display guidelines */\n  margin-left:4px;\n  margin-right:4px;\n  vertical-align: middle;\n}\n\n/* Reference index & topics ----------------------------------------------- */\n\n.ref-index th {font-weight: normal;}\n\n.ref-index td {vertical-align: top; min-width: 100px}\n.ref-index .icon {width: 40px;}\n.ref-index .alias {width: 40%;}\n.ref-index-icons .alias {width: calc(40% - 40px);}\n.ref-index .title {width: 60%;}\n\n.ref-arguments th {text-align: right; padding-right: 10px;}\n.ref-arguments th, .ref-arguments td {vertical-align: top; min-width: 100px}\n.ref-arguments .name {width: 20%;}\n.ref-arguments .desc {width: 80%;}\n\n/* Nice scrolling for wide elements --------------------------------------- */\n\ntable {\n  display: block;\n  overflow: auto;\n}\n\n/* Syntax highlighting ---------------------------------------------------- */\n\npre, code, pre code {\n  background-color: #f8f8f8;\n  color: #333;\n}\npre, pre code {\n  white-space: pre-wrap;\n  word-break: break-all;\n  overflow-wrap: break-word;\n}\n\npre {\n  border: 1px solid #eee;\n}\n\npre .img, pre .r-plt {\n  margin: 5px 0;\n}\n\npre .img img, pre .r-plt img {\n  background-color: #fff;\n}\n\ncode a, pre a {\n  color: #375f84;\n}\n\na.sourceLine:hover {\n  text-decoration: none;\n}\n\n.fl      {color: #1514b5;}\n.fu      {color: #000000;} /* function */\n.ch,.st  {color: #036a07;} /* string */\n.kw      {color: #264D66;} /* keyword */\n.co      {color: #888888;} /* comment */\n\n.error   {font-weight: bolder;}\n.warning {font-weight: bolder;}\n\n/* Clipboard --------------------------*/\n\n.hasCopyButton {\n  position: relative;\n}\n\n.btn-copy-ex {\n  position: absolute;\n  right: 0;\n  top: 0;\n  visibility: hidden;\n}\n\n.hasCopyButton:hover button.btn-copy-ex {\n  visibility: visible;\n}\n\n/* headroom.js ------------------------ */\n\n.headroom {\n  will-change: transform;\n  transition: transform 200ms linear;\n}\n.headroom--pinned {\n  transform: translateY(0%);\n}\n.headroom--unpinned {\n  transform: translateY(-100%);\n}\n\n/* mark.js ----------------------------*/\n\nmark {\n  background-color: rgba(255, 255, 51, 0.5);\n  border-bottom: 2px solid rgba(255, 153, 51, 0.3);\n  padding: 1px;\n}\n\n/* vertical spacing after htmlwidgets */\n.html-widget {\n  margin-bottom: 10px;\n}\n\n/* fontawesome ------------------------ */\n\n.fab {\n    font-family: \"Font Awesome 5 Brands\" !important;\n}\n\n/* don't display links in code chunks when printing */\n/* source: https://stackoverflow.com/a/10781533 */\n@media print {\n  code a:link:after, code a:visited:after {\n    content: \"\";\n  }\n}\n\n/* Section anchors ---------------------------------\n   Added in pandoc 2.11: https://github.com/jgm/pandoc-templates/commit/9904bf71\n*/\n\ndiv.csl-bib-body { }\ndiv.csl-entry {\n  clear: both;\n}\n.hanging-indent div.csl-entry {\n  margin-left:2em;\n  text-indent:-2em;\n}\ndiv.csl-left-margin {\n  min-width:2em;\n  float:left;\n}\ndiv.csl-right-inline {\n  margin-left:2em;\n  padding-left:1em;\n}\ndiv.csl-indent {\n  margin-left: 2em;\n}\n"
  },
  {
    "path": "inst/BS3/assets/pkgdown.js",
    "content": "/* http://gregfranko.com/blog/jquery-best-practices/ */\n(function($) {\n  $(function() {\n\n    $('.navbar-fixed-top').headroom();\n\n    $('body').css('padding-top', $('.navbar').height() + 10);\n    $(window).resize(function(){\n      $('body').css('padding-top', $('.navbar').height() + 10);\n    });\n\n    $('[data-toggle=\"tooltip\"]').tooltip();\n\n    var cur_path = paths(location.pathname);\n    var links = $(\"#navbar ul li a\");\n    var max_length = -1;\n    var pos = -1;\n    for (var i = 0; i < links.length; i++) {\n      if (links[i].getAttribute(\"href\") === \"#\")\n        continue;\n      // Ignore external links\n      if (links[i].host !== location.host)\n        continue;\n\n      var nav_path = paths(links[i].pathname);\n\n      var length = prefix_length(nav_path, cur_path);\n      if (length > max_length) {\n        max_length = length;\n        pos = i;\n      }\n    }\n\n    // Add class to parent <li>, and enclosing <li> if in dropdown\n    if (pos >= 0) {\n      var menu_anchor = $(links[pos]);\n      menu_anchor.parent().addClass(\"active\");\n      menu_anchor.closest(\"li.dropdown\").addClass(\"active\");\n    }\n  });\n\n  function paths(pathname) {\n    var pieces = pathname.split(\"/\");\n    pieces.shift(); // always starts with /\n\n    var end = pieces[pieces.length - 1];\n    if (end === \"index.html\" || end === \"\")\n      pieces.pop();\n    return(pieces);\n  }\n\n  // Returns -1 if not found\n  function prefix_length(needle, haystack) {\n    if (needle.length > haystack.length)\n      return(-1);\n\n    // Special case for length-0 haystack, since for loop won't run\n    if (haystack.length === 0) {\n      return(needle.length === 0 ? 0 : -1);\n    }\n\n    for (var i = 0; i < haystack.length; i++) {\n      if (needle[i] != haystack[i])\n        return(i);\n    }\n\n    return(haystack.length);\n  }\n\n  /* Clipboard --------------------------*/\n\n  function changeTooltipMessage(element, msg) {\n    var tooltipOriginalTitle=element.getAttribute('data-original-title');\n    element.setAttribute('data-original-title', msg);\n    $(element).tooltip('show');\n    element.setAttribute('data-original-title', tooltipOriginalTitle);\n  }\n\n  if(ClipboardJS.isSupported()) {\n    $(document).ready(function() {\n      var copyButton = \"<button type='button' class='btn btn-primary btn-copy-ex' type = 'submit' title='Copy to clipboard' aria-label='Copy to clipboard' data-toggle='tooltip' data-placement='left auto' data-trigger='hover' data-clipboard-copy><i class='fa fa-copy'></i></button>\";\n\n      $(\"div.sourceCode\").addClass(\"hasCopyButton\");\n\n      // Insert copy buttons:\n      $(copyButton).prependTo(\".hasCopyButton\");\n\n      // Initialize tooltips:\n      $('.btn-copy-ex').tooltip({container: 'body'});\n\n      // Initialize clipboard:\n      var clipboardBtnCopies = new ClipboardJS('[data-clipboard-copy]', {\n        text: function(trigger) {\n          return trigger.parentNode.textContent.replace(/\\n#>[^\\n]*/g, \"\");\n        }\n      });\n\n      clipboardBtnCopies.on('success', function(e) {\n        changeTooltipMessage(e.trigger, 'Copied!');\n        e.clearSelection();\n      });\n\n      clipboardBtnCopies.on('error', function() {\n        changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy');\n      });\n    });\n  }\n})(window.jQuery || window.$)\n"
  },
  {
    "path": "inst/BS3/templates/after-body.html",
    "content": "{{#includes}}{{{after_body}}}{{/includes}}\n"
  },
  {
    "path": "inst/BS3/templates/before-body.html",
    "content": "{{#includes}}{{{before_body}}}{{/includes}}\n"
  },
  {
    "path": "inst/BS3/templates/config-docsearch.json",
    "content": "{\n  \"index_name\": \"{{index}}\",\n  \"start_urls\": [\n    {\n      \"url\": \"{{url}}/index.html\",\n      \"selectors_key\": \"homepage\",\n      \"tags\": [\n        \"homepage\"\n      ]\n    },\n    {\n      \"url\": \"{{url}}/reference\",\n      \"selectors_key\": \"reference\",\n      \"tags\": [\n        \"reference\"\n      ]\n    },\n    {\n      \"url\": \"{{url}}/articles\",\n      \"selectors_key\": \"articles\",\n      \"tags\": [\n        \"articles\"\n      ]\n    }\n  ],\n  \"stop_urls\": [\n    \"/reference/$\",\n    \"/reference/index.html\",\n    \"/articles/$\",\n    \"/articles/index.html\"\n  ],\n  \"sitemap_urls\": [\n    \"{{url}}/sitemap.xml\"\n  ],\n  \"selectors\": {\n    \"homepage\": {\n      \"lvl0\": {\n        \"selector\": \".contents h1\",\n        \"default_value\": \"{{package}} Home page\"\n      },\n      \"lvl1\": {\n        \"selector\": \".contents h2\"\n      },\n      \"lvl2\": {\n        \"selector\": \".contents h3\",\n        \"default_value\": \"Context\"\n      },\n      \"lvl3\": \".ref-arguments td, .ref-description\",\n      \"text\": \".contents p, .contents li, .contents .pre\"\n    },\n    \"reference\": {\n      \"lvl0\": {\n        \"selector\": \".contents h1\"\n      },\n      \"lvl1\": {\n        \"selector\": \".contents .name\",\n        \"default_value\": \"Argument\"\n      },\n      \"lvl2\": {\n        \"selector\": \".ref-arguments th\",\n        \"default_value\": \"Description\"\n      },\n      \"lvl3\": \".ref-arguments td, .ref-description\",\n      \"text\": \".contents p, .contents li\"\n    },\n    \"articles\": {\n      \"lvl0\": {\n        \"selector\": \".contents h1\"\n      },\n      \"lvl1\": {\n        \"selector\": \".contents .name\"\n      },\n      \"lvl2\": {\n        \"selector\": \".contents h2, .contents h3\",\n        \"default_value\": \"Context\"\n      },\n      \"text\": \".contents p, .contents li\"\n    }\n  },\n  \"selectors_exclude\": [\n    \".dont-index\"\n    ],\n  \"min_indexed_level\": 2,\n  \"custom_settings\": {\n    \"separatorsToIndex\": \"_\",\n    \"attributesToRetrieve\": [\n      \"hierarchy\",\n      \"content\",\n      \"anchor\",\n      \"url\",\n      \"url_without_anchor\"\n    ]\n  }\n}\n"
  },
  {
    "path": "inst/BS3/templates/content-article-index.html",
    "content": "<div class=\"row\">\n  <div class=\"col-md-9 contents\">\n    <div class=\"page-header\">\n      <h1>Articles</h1>\n    </div>\n\n    {{#sections}}\n    <div class=\"section {{class}}\">\n      <h3>{{{title}}}</h3>\n      <p class=\"section-desc\">{{{desc}}}</p>\n\n      <dl>\n        {{#contents}}\n        <dt><a href=\"{{href}}\">{{title}}</a></dt>\n        <dd>{{{description}}}</dt>\n        {{/contents}}\n      </dl>\n    </div>\n    {{/sections}}\n  </div>\n</div>\n"
  },
  {
    "path": "inst/BS3/templates/content-article.html",
    "content": "{{^as_is}}$for(header-includes)$\n$header-includes$\n$endfor${{/as_is}}\n\n<div class=\"row\">\n  <div class=\"col-md-9 contents\">\n    <div class=\"page-header toc-ignore\">\n      <h1 data-toc-skip>$title$</h1>\n      $if(subtitle)$\n      <h3 data-toc-skip class=\"subtitle\">$subtitle$</h3>\n      $endif$\n      $for(author)$\n      $if(author.name)$\n      <h4 data-toc-skip class=\"author\">$author.name$</h4>\n      $if(author.affiliation)$\n      <address class=\"author_afil\">\n      $author.affiliation$<br>$endif$\n      $if(author.email)$\n      <a class=\"author_email\" href=\"mailto:#\">$author.email$</a>\n      </address>\n      $endif$\n      $else$\n      <h4 data-toc-skip class=\"author\">$author$</h4>\n      $endif$\n      $endfor$\n\n      $if(date)$\n      <h4 data-toc-skip class=\"date\">$date$</h4>\n      $endif$\n\n      {{#source}}<small class=\"dont-index\">{{{.}}}</small>{{/source}}\n      <div class=\"hidden name\"><code>{{filename}}</code></div>\n\n    </div>\n\n    $for(include-before)$\n    $include-before$\n    $endfor$\n\n    $if(abstract)$\n    <div class=\"abstract\">\n      <p class=\"abstract\">Abstract</p>\n      $abstract$\n    </div>\n    $endif$\n\n$body$\n  </div>\n\n  <div class=\"col-md-3 hidden-xs hidden-sm\" id=\"pkgdown-sidebar\">\n    {{#sidebar}}\n    {{{.}}}\n    {{/sidebar}}\n\n    $if(toc)$\n    <nav id=\"toc\" data-toggle=\"toc\">\n      <h2 data-toc-skip>Contents</h2>\n    </nav>\n    $endif$\n  </div>\n\n</div>\n\n$for(include-after)$\n$include-after$\n$endfor$\n"
  },
  {
    "path": "inst/BS3/templates/content-citation-authors.html",
    "content": "<div class=\"row\">\n  <div class=\"contents col-md-9\">\n    <div class=\"section level2 authors-section\">\n      <div class=\"page-header\">\n        <h1>{{pagetitle}}</h1>\n      </div>\n\n      {{{before}}}\n      <ul class=\"list-unstyled\">\n        {{#authors}}\n        <li>\n          <p><strong>{{{name}}}</strong>. {{{roles}}}. {{{orcid}}}\n          {{#comment}}<br /><small>{{{.}}}</small>{{/comment}}</p>\n        </li>\n        {{/authors}}\n      </ul>\n      {{{after}}}\n    </div>\n    <div class=\"section level2 citation-section\">\n    <div>\n      <h1 id=\"citation\">{{#translate}}{{citation}}{{/translate}}</h1>\n      {{#source}}<small class=\"dont-index\">{{{.}}}</small>{{/source}}\n    </div>\n    </div>\n\n\n    {{#citations}}\n    {{{html}}}\n    <pre>{{bibtex}}</pre>\n    {{/citations}}\n\n  </div>\n\n</div>\n\n"
  },
  {
    "path": "inst/BS3/templates/content-home.html",
    "content": "<div class=\"row\">\n  <div class=\"contents col-md-9\">\n{{{index}}}\n  </div>\n\n  <div class=\"col-md-3 hidden-xs hidden-sm\" id=\"pkgdown-sidebar\">\n    {{#sidebar}}\n    {{{.}}}\n    {{/sidebar}}\n  </div>\n</div>\n"
  },
  {
    "path": "inst/BS3/templates/content-news-index.html",
    "content": "<div class=\"row\">\n  <div class=\"contents col-md-9\">\n    <div class=\"page-header\">\n      <h1>Release notes</h1>\n    </div>\n    <ul>\n    {{#versions}}\n    <li><a href=\"{{{file_out}}}\">Version {{{version}}}</a></li>\n    {{/versions}}\n    </ul>\n  </div>\n</div>\n\n"
  },
  {
    "path": "inst/BS3/templates/content-news.html",
    "content": "<div class=\"row\">\n  <div class=\"col-md-9 contents\">\n    <div class=\"page-header\">\n      <h1 data-toc-skip>Changelog <small>{{version}}</small></h1>\n      {{#source}}<small>{{{.}}}</small>{{/source}}\n    </div>\n\n    {{#contents}}\n    {{{html}}}\n    {{/contents}}\n  </div>\n\n  <div class=\"col-md-3 hidden-xs hidden-sm\" id=\"pkgdown-sidebar\">\n    <nav id=\"toc\" data-toggle=\"toc\" class=\"sticky-top\">\n      <h2 data-toc-skip>Contents</h2>\n    </nav>\n  </div>\n\n</div>\n"
  },
  {
    "path": "inst/BS3/templates/content-reference-index.html",
    "content": "<div class=\"row\">\n  <div class=\"contents col-md-9\">\n    <div class=\"page-header\">\n      <h1>Reference</h1>\n    </div>\n\n    <table class=\"ref-index{{#has_icons}} ref-index-icons{{/has_icons}}\">\n\n    <colgroup>\n      {{#has_icons}}<col class=\"icon\" />{{/has_icons}}\n      <col class=\"alias\" />\n      <col class=\"title\" />\n    </colgroup>\n\n    {{#rows}}<tbody>\n      {{#title}}<tr>\n        <th colspan=\"{{#has_icons}}3{{/has_icons}}{{^has_icons}}2{{/has_icons}}\">\n          <h2 id=\"{{slug}}\">{{{title}}} <a href=\"#{{slug}}\" class=\"anchor\" aria-hidden=\"true\"></a></h2>\n          <p class=\"section-desc\">{{{desc}}}</p>\n        </th>\n      </tr>{{/title}}\n      {{#subtitle}}<tr>\n        <th colspan=\"{{#has_icons}}3{{/has_icons}}{{^has_icons}}2{{/has_icons}}\">\n          <h3 id=\"{{slug}}\">{{{subtitle}}} <a href=\"#{{slug}}\" class=\"anchor\" aria-hidden=\"true\"></a></h3>\n          <p class=\"section-desc\">{{{desc}}}</p>\n        </th>\n      </tr>{{/subtitle}}\n      {{#topics}}<tr>\n        {{#has_icons}}<td>{{#icon}}<a href=\"{{path}}\"><img src=\"icons/{{{.}}}\" width=\"30\" height=\"30\" alt=\"\" /></a>{{/icon}}</td>{{/has_icons}}\n        <td>\n          <p>{{#aliases}}<code><a href=\"{{path}}\">{{{.}}}</a></code> {{/aliases}}</p>\n        </td>\n        <td><p>{{{title}}}</p></td>\n      </tr>{{/topics}}\n    </tbody>{{/rows}}\n    </table>\n  </div>\n\n  <div class=\"col-md-3 hidden-xs hidden-sm\" id=\"pkgdown-sidebar\">\n    <nav id=\"toc\" data-toggle=\"toc\" class=\"sticky-top\">\n      <h2 data-toc-skip>Contents</h2>\n    </nav>\n  </div>\n</div>\n"
  },
  {
    "path": "inst/BS3/templates/content-reference-topic.html",
    "content": "<div class=\"row\">\n  <div class=\"col-md-9 contents\">\n    <div class=\"page-header\">\n    <h1>{{{title}}}</h1>\n    {{#source}}<small class=\"dont-index\">{{{.}}}</small>{{/source}}\n    <div class=\"hidden name\"><code>{{filename}}</code></div>\n    </div>\n\n    <div class=\"ref-description\">\n    {{#description}}\n    {{#contents}}\n    {{{.}}}\n    {{/contents}}\n    {{/description}}\n    </div>\n\n    {{#usage}}\n    <div id=\"ref-usage\">{{#contents}}\n    {{{.}}}\n    {{/contents}}</div>\n    {{/usage}}\n\n    {{#sections}}\n    <div id=\"{{slug}}\">\n    <h2>{{{title}}}</h2>\n    {{#contents}}\n    {{{.}}}\n    {{/contents}}\n    </div>\n    {{/sections}}\n\n    {{#examples}}\n    <div id=\"ref-examples\">\n    <h2>Examples</h2>\n    {{{.}}}\n    </div>\n    {{/examples}}\n  </div>\n  <div class=\"col-md-3 hidden-xs hidden-sm\" id=\"pkgdown-sidebar\">\n    <nav id=\"toc\" data-toggle=\"toc\" class=\"sticky-top\">\n      <h2 data-toc-skip>Contents</h2>\n    </nav>\n  </div>\n</div>\n"
  },
  {
    "path": "inst/BS3/templates/content-title-body.html",
    "content": "<div class=\"row\">\n  <div class=\"contents col-md-9\">\n    <div class=\"page-header\">\n      <h1>{{pagetitle}}</h1>\n    </div>\n\n{{{body}}}\n\n  </div>\n\n  <div class=\"col-md-3 hidden-xs hidden-sm\" id=\"pkgdown-sidebar\">\n    <nav id=\"toc\" data-toggle=\"toc\" class=\"sticky-top\">\n      <h2 data-toc-skip>Contents</h2>\n    </nav>\n  </div>\n\n</div>\n\n"
  },
  {
    "path": "inst/BS3/templates/content-tutorial-index.html",
    "content": "<div class=\"row\">\n  <div class=\"contents col-md-9\">\n    <div class=\"page-header\">\n      <h1>Tutorials</h1>\n    </div>\n\n    <ul>\n      {{#tutorials}}\n      <li><a href=\"{{path}}\">{{title}}</a></li>\n      {{/tutorials}}\n    </ul>\n  </div>\n</div>\n"
  },
  {
    "path": "inst/BS3/templates/content-tutorial.html",
    "content": "<div class=\"row\">\n  <div class=\"col-md-12\">\n    <div class=\"page-header\">\n      <h1>{{pagetitle}}</h1>\n    </div>\n</div>\n\n<div class=\"row\">\n  <div id=\"tutorial\"></div>\n    <iframe width=\"100%\" height=\"600\" src=\"{{url}}\" frameborder=\"0\"></iframe>\n  </div>\n</div>\n"
  },
  {
    "path": "inst/BS3/templates/docsearch.html",
    "content": "{{#yaml}}{{#docsearch}}\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/docsearch.js/2.6.1/docsearch.min.js\" integrity=\"sha256-GKvGqXDznoRYHCwKXGnuchvKSwmx9SRMrZOTh2g4Sb0=\" crossorigin=\"anonymous\"></script>\n<script>\n  docsearch({\n    {{#app_id}}appId: '{{.}}',{{/app_id}}\n    {{#debug}}debug: {{{.}}},{{/debug}}\n    apiKey: '{{api_key}}',\n    indexName: '{{index_name}}',\n    inputSelector: 'input#search-input.form-control',\n    transformData: function(hits) {\n      return hits.map(function (hit) {\n        hit.url = updateHitURL(hit);\n        return hit;\n      });\n    }\n  });\n</script>\n{{/docsearch}}{{/yaml}}\n"
  },
  {
    "path": "inst/BS3/templates/footer.html",
    "content": "{{#footer}}\n<div class=\"copyright\">\n  <p>{{#left}}{{{.}}}{{/left}}</p>\n</div>\n\n<div class=\"pkgdown\">\n  <p>{{#right}}{{{.}}}{{/right}}</p>\n</div>\n{{/footer}}\n"
  },
  {
    "path": "inst/BS3/templates/head.html",
    "content": "<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n<title>{{{pagetitle}}} • {{#site}}{{title}}{{/site}}</title>\n\n{{#has_favicons}}\n<!-- favicons -->\n<link rel=\"icon\" type=\"image/png\" sizes=\"48x48\" href=\"{{#site}}{{root}}{{/site}}favicon-48x48.png\">\n<link rel=\"icon\" type=”image/svg+xml” href=\"{{#site}}{{root}}{{/site}}favicon.svg\">\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"{{#site}}{{root}}{{/site}}apple-touch-icon.png\">\n<link rel=\"icon\" sizes=\"any\" href=\"{{#site}}{{root}}{{/site}}favicon.ico\" >\n<link rel=\"manifest\" href=\"{{#site}}{{root}}{{/site}}site.webmanifest\">\n{{/has_favicons}}\n\n<!-- jquery -->\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js\" integrity=\"sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g==\" crossorigin=\"anonymous\" referrerpolicy=\"no-referrer\"></script>\n<!-- Bootstrap -->\n{{#yaml}}\n{{#bootswatch}}<link href=\"https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.4.0/{{.}}/bootstrap.min.css\" rel=\"stylesheet\" crossorigin=\"anonymous\" />{{/bootswatch}}\n{{^bootswatch}}<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css\" integrity=\"sha256-bZLfwXAP04zRMK2BjiO8iu9pf4FbLqX6zitd+tIvLhE=\" crossorigin=\"anonymous\" />{{/bootswatch}}\n{{/yaml}}\n\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js\" integrity=\"sha256-nuL8/2cJ5NDSSwnKD8VqreErSWHtnEP9E7AySL+1ev4=\" crossorigin=\"anonymous\"></script>\n\n<!-- bootstrap-toc -->\n<link rel=\"stylesheet\" href=\"{{#site}}{{root}}{{/site}}bootstrap-toc.css\">\n<script src=\"{{#site}}{{root}}{{/site}}bootstrap-toc.js\"></script>\n\n<!-- Font Awesome icons -->\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\" />\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css\" integrity=\"sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=\" crossorigin=\"anonymous\" />\n\n<!-- clipboard.js -->\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script>\n\n<!-- headroom.js -->\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js\" integrity=\"sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=\" crossorigin=\"anonymous\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script>\n\n<!-- pkgdown -->\n<link href=\"{{#site}}{{root}}{{/site}}pkgdown.css\" rel=\"stylesheet\">\n<script src=\"{{#site}}{{root}}{{/site}}pkgdown.js\"></script>\n\n{{#yaml}}{{#docsearch}}\n<!-- docsearch -->\n<script src=\"{{#site}}{{root}}{{/site}}docsearch.js\"></script>\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/docsearch.js/2.6.3/docsearch.min.css\" integrity=\"sha256-QOSRU/ra9ActyXkIBbiIB144aDBdtvXBcNc3OTNuX/Q=\" crossorigin=\"anonymous\" />\n<link href=\"{{#site}}{{root}}{{/site}}docsearch.css\" rel=\"stylesheet\">\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/jquery.mark.min.js\" integrity=\"sha256-4HLtjeVgH0eIB3aZ9mLYF6E8oU5chNdjU6p6rrXpl9U=\" crossorigin=\"anonymous\"></script>\n{{/docsearch}}{{/yaml}}\n\n{{#extra}}\n  {{#css}}<link href=\"{{#site}}{{root}}{{/site}}extra.css\" rel=\"stylesheet\">{{/css}}\n  {{#js}}<script src=\"{{#site}}{{root}}{{/site}}extra.js\"></script>{{/js}}\n{{/extra}}\n\n<meta property=\"og:title\" content=\"{{{pagetitle}}}\" />\n{{#opengraph}}\n{{#description}}\n<meta property=\"og:description\" content=\"{{.}}\" />\n{{/description}}\n{{#image}}\n<meta property=\"og:image\" content=\"{{{src}}}\" />\n{{#alt}}\n<meta property=\"og:image:alt\" content=\"{{{.}}}\" />\n{{/alt}}\n{{/image}}\n{{#twitter}}\n{{#card}}\n<meta name=\"twitter:card\" content=\"{{{.}}}\" />\n{{/card}}\n{{^card}}\n<meta name=\"twitter:card\" content=\"summary\" />\n{{/card}}\n{{#creator}}\n<meta name=\"twitter:creator\" content=\"{{{.}}}\" />\n{{/creator}}\n{{#site}}\n<meta name=\"twitter:site\" content=\"{{{.}}}\" />\n{{/site}}\n{{/twitter}}\n{{/opengraph}}\n\n{{#yaml}}{{#noindex}}<meta name=\"robots\" content=\"noindex\" />{{/noindex}}{{/yaml}}\n{{#development}}{{#in_dev}}<meta name=\"robots\" content=\"noindex\">{{/in_dev}}{{/development}}\n\n{{#yaml}}{{#google_site_verification}}\n<meta name=\"google-site-verification\" content=\"{{{.}}}\" />\n{{/google_site_verification}}{{/yaml}}\n\n<!-- mathjax -->\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script>\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js\" integrity=\"sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=\" crossorigin=\"anonymous\"></script>\n\n<!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]-->\n\n{{#yaml}}{{#ganalytics}}\n<!-- Global site tag (gtag.js) - Google Analytics -->\n<script async src=\"https://www.googletagmanager.com/gtag/js?id={{.}}\"></script>\n<script>\n  window.dataLayer = window.dataLayer || [];\n  function gtag(){dataLayer.push(arguments);}\n  gtag('js', new Date());\n\n  gtag('config', '{{.}}');\n</script>\n{{/ganalytics}}{{/yaml}}\n{{#has_trailingslash}}\n<!-- See https://stackoverflow.com/questions/1865837/whats-the-difference-between-window-location-and-window-location-replace — we use .replace() because we don't want the old url to appear in the browser history. -->\n<script>\n  if (!/(\\/|html?)$/.test(window.location.href)){\n    window.location.replace(window.location.href + '/');\n  }\n</script>\n{{/has_trailingslash}}\n{{#has_deps}}\n<!-- dependencies from examples -->\n{{{dependencies}}}\n{{/has_deps}}\n"
  },
  {
    "path": "inst/BS3/templates/header.html",
    "content": ""
  },
  {
    "path": "inst/BS3/templates/in-header.html",
    "content": "{{#includes}}{{{in_header}}}{{/includes}}\n"
  },
  {
    "path": "inst/BS3/templates/layout-redirect.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL={{{url}}}\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"{{{url}}}\">\n  </head>\n</html>\n"
  },
  {
    "path": "inst/BS3/templates/layout.html",
    "content": "<!-- Generated by pkgdown: do not edit by hand -->\n<!DOCTYPE html>\n<html lang=\"{{{lang}}}\">\n  <head>\n  {{{ head }}}\n  {{{ in-header }}}\n  </head>\n\n  <body data-spy=\"scroll\" data-target=\"#toc\">\n    {{{ before-body }}}\n    <div class=\"container template-{{template}}\">\n      <header>\n      {{{ navbar }}}\n      {{{ header }}}\n      </header>\n\n{{{ content }}}\n\n      <footer>\n      {{{ footer }}}\n      </footer>\n   </div>\n\n  {{{ docsearch }}}\n\n  {{{ after-body }}}\n  </body>\n</html>\n\n"
  },
  {
    "path": "inst/BS3/templates/navbar.html",
    "content": "{{#navbar}}\n<div class=\"navbar navbar-{{{type}}} navbar-fixed-top\" role=\"navigation\">\n  <div class=\"container\">\n    <div class=\"navbar-header\">\n      <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#navbar\" aria-expanded=\"false\">\n        <span class=\"sr-only\">Toggle navigation</span>\n        <span class=\"icon-bar\"></span>\n        <span class=\"icon-bar\"></span>\n        <span class=\"icon-bar\"></span>\n      </button>\n      <span class=\"navbar-brand\">\n        <a class=\"navbar-link\" href=\"{{#site}}{{root}}{{/site}}index.html\">{{#site}}{{title}}{{/site}}</a>\n        <span class=\"version label label-{{#development}}{{version_label}}{{/development}}\" data-toggle=\"tooltip\" data-placement=\"bottom\" title=\"{{#development}}{{version_tooltip}}{{/development}}\">{{#package}}{{version}}{{/package}}</span>\n      </span>\n    </div>\n\n    <div id=\"navbar\" class=\"navbar-collapse collapse\">\n      {{#left}}\n      <ul class=\"nav navbar-nav\">\n        {{{.}}}\n      </ul>\n      {{/left}}\n      {{#right}}\n      <ul class=\"nav navbar-nav navbar-right\">\n        {{{.}}}\n      </ul>\n      {{/right}}\n      {{#yaml}}{{#docsearch}}\n      <form class=\"navbar-form navbar-right hidden-xs hidden-sm\" role=\"search\">\n        <div class=\"form-group\">\n          <input type=\"search\" class=\"form-control\" name=\"search-input\" id=\"search-input\" placeholder=\"Search...\" aria-label=\"Search for...\" autocomplete=\"off\">\n        </div>\n      </form>\n      {{/docsearch}}{{/yaml}}\n    </div><!--/.nav-collapse -->\n  </div><!--/.container -->\n</div><!--/.navbar -->\n{{/navbar}}\n"
  },
  {
    "path": "inst/BS5/assets/katex-auto.js",
    "content": "// https://github.com/jgm/pandoc/blob/29fa97ab96b8e2d62d48326e1b949a71dc41f47a/src/Text/Pandoc/Writers/HTML.hs#L332-L345\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n  var mathElements = document.getElementsByClassName(\"math\");\n  var macros = [];\n  for (var i = 0; i < mathElements.length; i++) {\n    var texText = mathElements[i].firstChild;\n    if (mathElements[i].tagName == \"SPAN\") {\n      katex.render(texText.data, mathElements[i], {\n        displayMode: mathElements[i].classList.contains(\"display\"),\n        throwOnError: false,\n        macros: macros,\n        fleqn: false\n      });\n    }\n  }\n});\n"
  },
  {
    "path": "inst/BS5/assets/lightswitch.js",
    "content": "\n/*!\n * Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under the Creative Commons Attribution 3.0 Unported License.\n * Updates for {pkgdown} by the {bslib} authors, also licensed under CC-BY-3.0.\n */\n\nconst getStoredTheme = () => localStorage.getItem('theme')\nconst setStoredTheme = theme => localStorage.setItem('theme', theme)\n\nconst getPreferredTheme = () => {\n  const storedTheme = getStoredTheme()\n  if (storedTheme) {\n    return storedTheme\n  }\n\n  return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nconst setTheme = theme => {\n  if (theme === 'auto') {\n    document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'))\n  } else {\n    document.documentElement.setAttribute('data-bs-theme', theme)\n  }\n}\n\nfunction bsSetupThemeToggle() {\n  'use strict'\n\n  const showActiveTheme = (theme, focus = false) => {\n    var activeLabel, activeIcon;\n\n    document.querySelectorAll('[data-bs-theme-value]').forEach(element => {\n      const buttonTheme = element.getAttribute('data-bs-theme-value')\n      const isActive = buttonTheme == theme\n\n      element.classList.toggle('active', isActive)\n      element.setAttribute('aria-pressed', isActive)\n\n      if (isActive) {\n        activeLabel = element.textContent;\n        activeIcon = element.querySelector('span').classList.value;\n      }\n    })\n\n    const themeSwitcher = document.querySelector('#dropdown-lightswitch')\n    if (!themeSwitcher) {\n      return\n    }\n\n    themeSwitcher.setAttribute('aria-label', activeLabel)\n    themeSwitcher.querySelector('span').classList.value = activeIcon;\n\n    if (focus) {\n      themeSwitcher.focus()\n    }\n  }\n\n  window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {\n    const storedTheme = getStoredTheme()\n    if (storedTheme !== 'light' && storedTheme !== 'dark') {\n      setTheme(getPreferredTheme())\n    }\n  })\n\n  window.addEventListener('DOMContentLoaded', () => {\n    showActiveTheme(getPreferredTheme())\n\n    document\n      .querySelectorAll('[data-bs-theme-value]')\n      .forEach(toggle => {\n        toggle.addEventListener('click', () => {\n          const theme = toggle.getAttribute('data-bs-theme-value')\n          setTheme(theme)\n          setStoredTheme(theme)\n          showActiveTheme(theme, true)\n        })\n      })\n  })\n}\n\nsetTheme(getPreferredTheme());\nbsSetupThemeToggle();\n"
  },
  {
    "path": "inst/BS5/assets/pkgdown.js",
    "content": "/* http://gregfranko.com/blog/jquery-best-practices/ */\n(function ($) {\n  $(function () {\n\n    $('nav.navbar').headroom();\n\n    Toc.init({\n      $nav: $(\"#toc\"),\n      $scope: $(\"main h2, main h3, main h4, main h5, main h6\")\n    });\n\n    if ($('#toc').length) {\n      $('body').scrollspy({\n        target: '#toc',\n        offset: $(\"nav.navbar\").outerHeight() + 1\n      });\n    }\n\n    // Activate popovers\n    $('[data-bs-toggle=\"popover\"]').popover({\n      container: 'body',\n      html: true,\n      trigger: 'focus',\n      placement: \"top\",\n      sanitize: false,\n    });\n\n    $('[data-bs-toggle=\"tooltip\"]').tooltip();\n\n    /* Clipboard --------------------------*/\n\n    function changeTooltipMessage(element, msg) {\n      var tooltipOriginalTitle = element.getAttribute('data-bs-original-title');\n      element.setAttribute('data-bs-original-title', msg);\n      $(element).tooltip('show');\n      element.setAttribute('data-bs-original-title', tooltipOriginalTitle);\n    }\n\n    if (ClipboardJS.isSupported()) {\n      $(document).ready(function () {\n        var copyButton = \"<button type='button' class='btn btn-primary btn-copy-ex' title='Copy to clipboard' aria-label='Copy to clipboard' data-toggle='tooltip' data-placement='left' data-trigger='hover' data-clipboard-copy><i class='fa fa-copy'></i></button>\";\n\n        $(\"div.sourceCode\").addClass(\"hasCopyButton\");\n\n        // Insert copy buttons:\n        $(copyButton).prependTo(\".hasCopyButton\");\n\n        // Initialize tooltips:\n        $('.btn-copy-ex').tooltip({ container: 'body' });\n\n        // Initialize clipboard:\n        var clipboard = new ClipboardJS('[data-clipboard-copy]', {\n          text: function (trigger) {\n            return trigger.parentNode.textContent.replace(/\\n#>[^\\n]*/g, \"\");\n          }\n        });\n\n        clipboard.on('success', function (e) {\n          changeTooltipMessage(e.trigger, 'Copied!');\n          e.clearSelection();\n        });\n\n        clipboard.on('error', function (e) {\n          changeTooltipMessage(e.trigger, 'Press Ctrl+C or Command+C to copy');\n        });\n\n      });\n    }\n\n    /* Search marking --------------------------*/\n    var url = new URL(window.location.href);\n    var toMark = url.searchParams.get(\"q\");\n    var mark = new Mark(\"main#main\");\n    if (toMark) {\n      mark.mark(toMark, {\n        accuracy: {\n          value: \"complementary\",\n          limiters: [\",\", \".\", \":\", \"/\"],\n        }\n      });\n    }\n\n    /* Search --------------------------*/\n    /* Adapted from https://github.com/rstudio/bookdown/blob/2d692ba4b61f1e466c92e78fd712b0ab08c11d31/inst/resources/bs4_book/bs4_book.js#L25 */\n    // Initialise search index on focus\n    var fuse;\n    $(\"#search-input\").focus(async function (e) {\n      if (fuse) {\n        return;\n      }\n\n      $(e.target).addClass(\"loading\");\n      var response = await fetch($(\"#search-input\").data(\"search-index\"));\n      var data = await response.json();\n\n      var options = {\n        keys: [\"what\", \"text\", \"code\"],\n        ignoreLocation: true,\n        threshold: 0.1,\n        includeMatches: true,\n        includeScore: true,\n      };\n      fuse = new Fuse(data, options);\n\n      $(e.target).removeClass(\"loading\");\n    });\n\n    // Use algolia autocomplete\n    var options = {\n      autoselect: true,\n      debug: true,\n      hint: false,\n      minLength: 2,\n    };\n    var q;\n    async function searchFuse(query, callback) {\n      await fuse;\n\n      var items;\n      if (!fuse) {\n        items = [];\n      } else {\n        q = query;\n        var results = fuse.search(query, { limit: 20 });\n        items = results\n          .filter((x) => x.score <= 0.75)\n          .map((x) => x.item);\n        if (items.length === 0) {\n          items = [{ dir: \"Sorry 😿\", previous_headings: \"\", title: \"No results found.\", what: \"No results found.\", path: window.location.href }];\n        }\n      }\n      callback(items);\n    }\n    $(\"#search-input\").autocomplete(options, [\n      {\n        name: \"content\",\n        source: searchFuse,\n        templates: {\n          suggestion: (s) => {\n            if (s.title == s.what) {\n              return `${s.dir} >\t<div class=\"search-details\"> ${s.title}</div>`;\n            } else if (s.previous_headings == \"\") {\n              return `${s.dir} >\t<div class=\"search-details\"> ${s.title}</div> > ${s.what}`;\n            } else {\n              return `${s.dir} >\t<div class=\"search-details\"> ${s.title}</div> > ${s.previous_headings} > ${s.what}`;\n            }\n          },\n        },\n      },\n    ]).on('autocomplete:selected', function (event, s) {\n      window.location.href = s.path + \"?q=\" + q + \"#\" + s.id;\n    });\n  });\n})(window.jQuery || window.$)\n\ndocument.addEventListener('keydown', function (event) {\n  // Check if the pressed key is '/'\n  if (event.key === '/') {\n    event.preventDefault();  // Prevent any default action associated with the '/' key\n    document.getElementById('search-input').focus();  // Set focus to the search input\n  }\n});\n"
  },
  {
    "path": "inst/BS5/assets/pkgdown.scss",
    "content": "/* control page width ====================================================== */\n\n.row>main {\n  // Ensure contents never become unreadably wide\n  max-width: 50rem;\n}\n\n// break and hypenate very long words on small screens\n@include media-breakpoint-down(md) {\n  .row>main {\n    overflow-wrap: break-word;\n    hyphens: auto;\n  }\n}\n\n// Put extra space between content and navbar\n@include media-breakpoint-only(xl) {\n  .container .row {\n    justify-content: space-evenly;\n  }\n}\n\n// Boost font size and give big (but not infinite) margin on sidebar\n@include media-breakpoint-up(xxl) {\n  body {\n    font-size: 18px\n  }\n\n  .col-md-3 {\n    margin-left: 5rem;\n  }\n}\n\n/* navbar =================================================================== */\n\n// pkgdown will follow bslib navbar variables by default\n$navbar-bg: null !default;\n$navbar-light-bg: if($navbar-bg, $navbar-bg, null) !default;\n$navbar-dark-bg: if($navbar-bg, $navbar-bg, null) !default;\n\n$pkgdown-navbar-bg: if($navbar-light-bg, $navbar-light-bg, null) !default;\n$pkgdown-navbar-bg-dark: if($navbar-dark-bg, $navbar-dark-bg, null) !default;\n\n// BS navbars appears to be designed with the idea that you have a coloured\n// navbar that looks the same in both light and dark mode. We prefer a mildly\n// coloured navbar that's just different enough from the body to stand out.\n//\n// Relies on CSS fallback rules\n.navbar {\n  background: RGBA(var(--bs-body-color-rgb), 0.1);\n  background: color-mix(in oklab, color-mix(in oklab, var(--bs-body-bg) 95%, var(--bs-primary)) 95%, var(--bs-body-color));\n  background: $pkgdown-navbar-bg;\n  // Harmonize alignment of navbar elements (search field vs. rest)\n  line-height: initial;\n}\n\n[data-bs-theme=\"dark\"] .navbar {\n  background: $pkgdown-navbar-bg-dark;\n}\n\n// make both the active nav and the hovered nav more clear by mixing the\n// background colour with the body and primary colours respectively\n.nav-item .nav-link {\n  @include border-radius($border-radius);\n}\n\n.nav-item.active .nav-link {\n  background: RGBA(var(--bs-body-color-rgb), 0.1);\n}\n\n.nav-item .nav-link:hover {\n  background: RGBA(var(--bs-primary-rgb), 0.1);\n}\n\n// Align baselines of package name, version, and nav items\n.navbar>.container {\n  align-items: baseline;\n  -webkit-align-items: baseline;\n}\n\n// Make search a little narrower than the default\ninput[type=\"search\"] {\n  width: 12rem;\n}\n\n[aria-labelledby=dropdown-lightswitch] span.fa {\n  opacity: 0.5;\n}\n\n// When navbar is a dropdown:\n@include media-breakpoint-down(lg) {\n\n  // Make search and sub-menus span full width\n  .algolia-autocomplete,\n  input[type=\"search\"],\n  #navbar .dropdown-menu {\n    width: 100%;\n  }\n\n  // Allow text to wrap\n  #navbar .dropdown-item {\n    white-space: normal;\n  }\n\n  // Add a little margin\n  input[type=\"search\"] {\n    margin: 0.25rem 0;\n  }\n}\n\n// make long dropdown menus scrollable\n.dropdown-menu {\n  max-height: 280px;\n  overflow-y: auto;\n}\n\n/* headroom.js -------------------------------------------------------------- */\n\n.headroom {\n  will-change: transform;\n  transition: transform 400ms ease;\n}\n\n.headroom--pinned {\n  transform: translateY(0%);\n}\n\n.headroom--unpinned {\n  transform: translateY(-100%);\n}\n\n// Need to adjust body components down by height of navbar so it\n// doesn't overlap them when visible\n$pkgdown-nav-height: 56px !default;\n\n.row>main,\n.row>aside {\n  margin-top: $pkgdown-nav-height;\n}\n\nhtml,\nbody {\n  scroll-padding: $pkgdown-nav-height\n}\n\n// Make scrollable, sticky TOC\n@include media-breakpoint-up(sm) {\n  #toc {\n    position: sticky;\n    top: $pkgdown-nav-height;\n    max-height: calc(100vh - #{$pkgdown-nav-height} - 1rem);\n    overflow-y: auto;\n  }\n}\n\n/* sidebar ================================================================== */\n\naside {\n  h2 {\n    margin-top: 1.5rem;\n    font-size: $font-size-lg;\n  }\n\n  .roles {\n    color: RGBA(var(--bs-body-color-rgb), 0.8);\n  }\n\n  .list-unstyled li {\n    margin-bottom: 0.5rem;\n  }\n\n  .dev-status .list-unstyled li {\n    margin-bottom: 0.1rem;\n  }\n}\n\n// Add some visual distinction between content and \"sidebar\" on mobile\n@include media-breakpoint-down(md) {\n\n  // Additional specificity needed to override bootstrap width on .row > *\n  .row>aside {\n    margin: 0.5rem;\n    width: calc(100vw - 1rem);\n    background-color: RGBA(var(--bs-body-color-rgb), 0.1);\n    border-color: var(--bs-border-color);\n    @include border-radius($border-radius);\n\n    h2:first-child {\n      margin-top: 1rem;\n    }\n  }\n}\n\n/* table of contents -------------------------------------------------------- */\n\n// needed for scrollspy\nbody {\n  position: relative;\n}\n\n#toc>.nav {\n  margin-bottom: 1rem;\n\n  a.nav-link {\n    color: inherit;\n    padding: 0.25rem 0.5rem;\n    margin-bottom: 2px;\n    @include border-radius($border-radius);\n\n    &:hover,\n    &:focus {\n      background-color: RGBA(var(--bs-primary-rgb), 0.1);\n    }\n\n    &.active {\n      background-color: RGBA(var(--bs-body-color-rgb), 0.1);\n    }\n  }\n\n  // Nested headings are indented\n  .nav a.nav-link {\n    margin-left: 0.5rem;\n  }\n\n  // Only show second level if active.\n  // Requires !important because that's how BS5 sets display: flex\n  .nav {\n    display: none !important;\n  }\n\n  a.active+.nav {\n    display: flex !important;\n  }\n}\n\n/* footer  ================================================================== */\n\n$pkgdown-footer-color: RGBA(var(--bs-body-color-rgb), 0.8) !default;\n$pkgdown-footer-bg: transparent !default;\n$pkgdown-footer-border-color: $border-color !default;\n$pkgdown-footer-border-width: $border-width !default;\n\nfooter {\n  margin: 1rem 0 1rem 0;\n  padding-top: 1rem;\n  font-size: .875em;\n  border-top: $pkgdown-footer-border-width solid $pkgdown-footer-border-color;\n  background: $pkgdown-footer-bg;\n  color: $pkgdown-footer-color;\n  display: flex;\n  column-gap: 1rem;\n}\n\n@include media-breakpoint-down(sm) {\n  footer {\n    flex-direction: column;\n  }\n}\n\n@include media-breakpoint-up(sm) {\n  footer .pkgdown-footer-right {\n    text-align: right;\n  }\n}\n\nfooter div {\n  flex: 1 1 auto;\n}\n\n// \"Sticky\" footer - i.e. the footer always hugs the bottom of the viewport\n// even for short pages.\n//\n// Basic idea: https://philipwalton.github.io/solved-by-flexbox/demos/sticky-footer/\n// Details: https://github.com/philipwalton/solved-by-flexbox/blob/master/assets/css/components/site.css\n\n// Need .container and __all parents__ have height set to 100%\nhtml,\nbody {\n  height: 100%;\n}\n\nbody>.container {\n  min-height: 100%;\n  display: flex;\n  flex-direction: column;\n}\n\nbody>.container .row {\n  flex: 1 0 auto;\n}\n\n/* General typography ======================================================= */\n\n// Ensure in-page images don't run outside their container\nmain img {\n  max-width: 100%;\n  height: auto;\n}\n\nmain table {\n  display: block;\n  overflow: auto;\n}\n\n// avoid flash of invisible text + flash of unstyled text\nbody {\n  font-display: fallback;\n}\n\n// page header\n.page-header {\n  border-bottom: 1px solid var(--bs-border-color);\n  padding-bottom: 0.5rem;\n  margin-bottom: 0.5rem;\n  margin-top: 1.5rem;\n}\n\n// spacing tweaks\n\n// Use an indent for defintions rather than horitzonal space\ndl {\n  margin-bottom: 0;\n}\n\ndd {\n  padding-left: 1.5rem;\n  margin-bottom: 0.25rem\n}\n\n// Use margins rather than size to distinguish headings\nh2,\n.h2 {\n  font-size: 1.75rem;\n  margin-top: 1.5rem;\n}\n\nh3,\n.h3 {\n  font-size: 1.25rem;\n  margin-top: 1rem;\n  font-weight: bold;\n}\n\nh4,\n.h4 {\n  font-size: 1.1rem;\n  font-weight: bold;\n}\n\nh5,\n.h5 {\n  font-size: 1rem;\n  font-weight: bold;\n}\n\nsummary {\n  margin-bottom: 0.5rem;\n}\n\ndetails {\n  margin-bottom: 1rem;\n}\n\n.html-widget {\n  margin-bottom: 1rem;\n}\n\n// Section anchors\na.anchor {\n  display: none;\n  // style like a footnote\n  margin-left: 2px;\n  vertical-align: top;\n  width: Min(0.9em, 20px);\n  height: Min(0.9em, 20px);\n\n  background-image: url(../../link.svg);\n  background-repeat: no-repeat;\n  background-size: Min(0.9em, 20px) Min(0.9em, 20px);\n  background-position: center center;\n}\n\nh2,\nh3,\nh4,\nh5,\nh6,\ndt {\n\n  &:hover .anchor,\n  &:target .anchor {\n    display: inline-block;\n  }\n}\n\n// Give targetted arguments some visual distinction\ndt:target,\ndt:target+dd {\n  border-left: 0.25rem solid var(--bs-primary);\n  margin-left: -0.75rem;\n}\n\ndt:target {\n  padding-left: 0.5rem;\n}\n\ndt:target+dd {\n  padding-left: 2rem;\n}\n\n// orcid badge\n.orcid {\n  color: #A6CE39;\n  margin-right: 4px;\n}\n\n// ror badge\n.ror {\n  height: 16px;\n  margin-right: 4px;\n}\n\n// activate font awesome\n.fab {\n  font-family: \"Font Awesome 5 Brands\" !important;\n}\n\n// package logo\nimg.logo {\n  float: right;\n  width: 100px;\n  margin-left: 30px;\n}\n\n.template-home img.logo {\n  width: 120px;\n}\n\n@include media-breakpoint-down(sm) {\n  img.logo {\n    width: 80px;\n  }\n}\n\n// line up h1 border-bottom with corner of hexagon\n// values determined empirically\n@include media-breakpoint-up(sm) {\n  .page-header {\n    min-height: 88px\n  }\n\n  .template-home .page-header {\n    min-height: 104px\n  }\n}\n\n// line-block produced by pandoc needs margin-bottom since it doesn't\n// contain other tags\n.line-block {\n  margin-bottom: 1rem;\n}\n\n// Override bootstrap defaults that make sense in page bodies, but not on\n// the reference index\n.template-reference-index {\n  dt {\n    font-weight: normal;\n  }\n\n  // Don't allow breaking within a function name\n  code {\n    word-wrap: normal;\n  }\n}\n\n.icon {\n  float: right;\n\n  img {\n    width: 40px;\n  }\n}\n\n// Ensure skip link is visible if focussed\na[href='#main'] {\n  position: absolute;\n  margin: 4px;\n  padding: 0.75rem;\n  background-color: var(--bs-body-bg);\n  text-decoration: none;\n  z-index: 2000;\n}\n\n.lifecycle {\n  color: var(--bs-secondary-color);\n  background-color: var(--bs-secondary-bg); // backup just in case we don't know the name\n  border-radius: 5px;\n}\n\n.lifecycle-stable {\n  background-color: rgb(16, 128, 1);\n  color: var(--bs-white);\n}\n\n.lifecycle-superseded {\n  background-color: rgb(7, 64, 128);\n  color: var(--bs-white);\n}\n\n.lifecycle-experimental,\n.lifecycle-deprecated {\n  background-color: rgb(253, 128, 8);\n  color: var(--bs-black);\n}\n\n/* Footnotes ---------------------------------------------------------------- */\n\na.footnote-ref {\n  cursor: pointer;\n}\n\n// use \"Min\" to trigger computation in css, not sass\n.popover {\n  width: Min(100vw, 32rem);\n  font-size: 0.9rem;\n  box-shadow: 4px 4px 8px RGBA(var(--bs-body-color-rgb), 0.3);\n}\n\n.popover-body {\n  padding: 0.75rem;\n}\n\n.popover-body p:last-child {\n  margin-bottom: 0;\n}\n\n/* tabsets ------------------------------------------------------------------ */\n\n.tab-content {\n  padding: 1rem;\n}\n\n.tabset-pills .tab-content {\n  border: solid 1px #e5e5e5;\n}\n\n// Make tab height consistent\n// https://observablehq.com/@rkaravia/css-trick-tabs-with-consistent-height\n.tab-content {\n  display: flex;\n}\n\n.tab-content>.tab-pane {\n  display: block;\n  /* undo \"display: none;\" */\n  visibility: hidden;\n  margin-right: -100%;\n  width: 100%;\n}\n\n.tab-content>.active {\n  visibility: visible;\n}\n\n/* bibliography styling ----------------------------------------------------- */\n// Added in pandoc 2.11: https://github.com/jgm/pandoc-templates/commit/9904bf71\n\ndiv.csl-bib-body {}\n\ndiv.csl-entry {\n  clear: both;\n}\n\n.hanging-indent div.csl-entry {\n  margin-left: 2em;\n  text-indent: -2em;\n}\n\ndiv.csl-left-margin {\n  min-width: 2em;\n  float: left;\n}\n\ndiv.csl-right-inline {\n  margin-left: 2em;\n  padding-left: 1em;\n}\n\ndiv.csl-indent {\n  margin-left: 2em;\n}\n\n/* code ===================================================================== */\n\npre,\npre code {\n  // override bootstrap deafult that causes problems in old safari + IE\n  // https://github.com/rstudio/shiny/issues/2233\n  word-wrap: normal;\n}\n\n// Default dark mode styling does not look good for code\n[data-bs-theme=\"dark\"] {\n\n  pre,\n  code {\n    background-color: RGBA(var(--bs-body-color-rgb), 0.1);\n  }\n\n  // don't double apply transparency\n  pre code {\n    background: transparent;\n  }\n\n}\n\ncode {\n  // break long functions into multiple lines\n  overflow-wrap: break-word;\n}\n\n// copy button\n.hasCopyButton {\n  position: relative;\n}\n\n.btn-copy-ex {\n  position: absolute;\n  right: 5px;\n  top: 5px;\n  visibility: hidden;\n}\n\n.hasCopyButton:hover button.btn-copy-ex {\n  visibility: visible;\n}\n\n// Ensure there's enough space for the copy button\npre {\n  padding: 0.75rem;\n}\n\n// Spacing tweaks for gt table\npre div.gt-table {\n  white-space: normal;\n  margin-top: 1rem;\n}\n\n// \"Pop\" code out of page margins on small screens to give a little more room\n@include media-breakpoint-down(sm) {\n\n  // div.section div.sourceCode pre\n  // prevents matching <pre> inside (e.g.) a <li>\n  div>div>pre {\n    margin-left: calc(var(--bs-gutter-x) * -.5);\n    margin-right: calc(var(--bs-gutter-x) * -.5);\n    border-radius: 0;\n    padding-left: 1rem;\n    padding-right: 1rem;\n  }\n\n  .btn-copy-ex {\n    right: calc(var(--bs-gutter-x) * -.5 + 5px);\n  }\n}\n\ncode a:any-link {\n  color: inherit;\n  text-decoration-color: RGBA(var(--bs-body-color-rgb), 0.6);\n}\n\npre code {\n  padding: 0;\n  background: transparent;\n\n  .error,\n  .warning {\n    font-weight: bolder;\n  }\n}\n\npre .img,\npre .r-plt {\n  img {\n    margin: 5px 0;\n    background-color: #fff;\n  }\n}\n\n// low-tech plot softening in dark mode\n[data-bs-theme=\"dark\"] pre img {\n  opacity: 0.66;\n  transition: opacity 250ms ease-in-out;\n\n  &:hover,\n  &:focus,\n  &:active {\n    opacity: 1;\n  }\n}\n\n/* don't display links in code chunks when printing */\n/* source: https://stackoverflow.com/a/10781533 */\n@media print {\n\n  code a:link:after,\n  code a:visited:after {\n    content: \"\";\n  }\n}\n\na.sourceLine:hover {\n  text-decoration: none;\n}\n\n/* search =================================================================== */\n\nmark {\n  background: linear-gradient(-100deg,\n      RGBA(var(--bs-info-rgb), 0.2),\n      RGBA(var(--bs-info-rgb), 0.7) 95%,\n      RGBA(var(--bs-info-rgb), 0.1))\n}\n\n// Mimic the style of the navbar dropdowns\n.algolia-autocomplete .aa-dropdown-menu {\n  margin-top: 0.5rem;\n  padding: 0.5rem 0.25rem;\n  width: MAX(100%, 20rem); // force computation in css, not sass\n  max-height: 50vh;\n  overflow-y: auto;\n\n  background-color: var(--bs-body-bg);\n  border: var(--bs-border-width) solid var(--bs-border-color);\n  @include border-radius($border-radius);\n\n  .aa-suggestion {\n    cursor: pointer;\n    font-size: 1rem;\n    padding: 0.5rem 0.25rem;\n    line-height: 1.3;\n\n    &:hover {\n      background-color: var(--bs-tertiary-bg);\n      color: var(--bs-body-color);\n    }\n\n    .search-details {\n      text-decoration: underline;\n      display: inline; // algolia makes it a div\n    }\n  }\n}\n\n/* Quarto specific =========================================================== */\n// Selectively copied from https://github.com/quarto-dev/quarto-cli/blob/main/src/resources/formats/html/_quarto-rules.scss#L110\n\nspan.smallcaps {\n  font-variant: small-caps;\n}\n\n// task-list --------------------------------------------------------------\n\nul.task-list {\n  list-style: none;\n}\n\nul.task-list li input[type=\"checkbox\"] {\n  width: 0.8em;\n  margin: 0 0.8em 0.2em -1em;\n  /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */\n  vertical-align: middle;\n}\n\n// Figure and layout --------------------------------------------------------\n\nfigure.figure {\n  display: block;\n}\n\n.quarto-layout-panel {\n  margin-bottom: 1em;\n}\n\n.quarto-layout-panel>figure {\n  width: 100%;\n}\n\n.quarto-layout-panel>figure>figcaption,\n.quarto-layout-panel>.panel-caption {\n  margin-top: 10pt;\n}\n\n.quarto-layout-panel>.table-caption {\n  margin-top: 0px;\n}\n\n.table-caption p {\n  margin-bottom: 0.5em;\n}\n\n.quarto-layout-row {\n  display: flex;\n  flex-direction: row;\n  align-items: flex-start;\n}\n\n.quarto-layout-valign-top {\n  align-items: flex-start;\n}\n\n.quarto-layout-valign-bottom {\n  align-items: flex-end;\n}\n\n.quarto-layout-valign-center {\n  align-items: center;\n}\n\n.quarto-layout-cell {\n  position: relative;\n  margin-right: 20px;\n}\n\n.quarto-layout-cell:last-child {\n  margin-right: 0;\n}\n\n.quarto-layout-cell figure,\n.quarto-layout-cell>p {\n  margin: 0.2em;\n}\n\n.quarto-layout-cell img {\n  max-width: 100%;\n}\n\n.quarto-layout-cell .html-widget {\n  width: 100% !important;\n}\n\n.quarto-layout-cell div figure p {\n  margin: 0;\n}\n\n.quarto-layout-cell figure {\n  display: block;\n  margin-inline-start: 0;\n  margin-inline-end: 0;\n}\n\n.quarto-layout-cell table {\n  display: inline-table;\n}\n\n.quarto-layout-cell-subref figcaption,\nfigure .quarto-layout-row figure figcaption {\n  text-align: center;\n  font-style: italic;\n}\n\n.quarto-figure {\n  position: relative;\n  margin-bottom: 1em;\n}\n\n.quarto-figure>figure {\n  width: 100%;\n  margin-bottom: 0;\n}\n\n.quarto-figure-left>figure>p,\n.quarto-figure-left>figure>div\n\n/* for mermaid and dot diagrams */\n  {\n  text-align: left;\n}\n\n.quarto-figure-center>figure>p,\n.quarto-figure-center>figure>div\n\n/* for mermaid and dot diagrams */\n  {\n  text-align: center;\n}\n\n.quarto-figure-right>figure>p,\n.quarto-figure-right>figure>div\n\n/* for mermaid and dot diagrams */\n  {\n  text-align: right;\n}\n\n.quarto-figure>figure>div.cell-annotation,\n.quarto-figure>figure>div code {\n  text-align: left;\n  /* override align center for code blocks */\n}\n\nfigure>p:empty {\n  display: none;\n}\n\nfigure>p:first-child {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\nfigure>figcaption.quarto-float-caption-bottom {\n  margin-bottom: 0.5em;\n}\n\nfigure>figcaption.quarto-float-caption-top {\n  margin-top: 0.5em;\n}\n\n// mermaid ---------------------------------------------------------\n\n:root {\n  --mermaid-bg-color: transparent;\n  --mermaid-edge-color: var(--bs-secondary);\n  --mermaid-fg-color: var(--bs-body-color);\n  --mermaid-fg-color--lighter: RGBA(var(--bs-body-color-rgb), 0.9);\n  --mermaid-fg-color--lightest: RGBA(var(--bs-body-color-rgb), 0.8);\n  --mermaid-font-family: var(--bs-body-font-family);\n  --mermaid-label-bg-color: var(--bs-primary);\n  --mermaid-label-fg-color: var(--bs-body-color);\n  --mermaid-node-bg-color: RGBA(var(--bs-primary-rgb), 0.1);\n  --mermaid-node-fg-color: var(--bs-primary);\n}\n\n// auto-dark mode for rendered images ------------------------------\n\n@mixin invert-filter {\n\n  // vignette figures\n  img.r-plt,\n  // example figures\n  pre .r-plt.img img,\n  // quarto figures\n  .cell-output-display img,\n  .html-widget {\n    filter: invert(100%) hue-rotate(180deg);\n  }\n}\n\n[data-bs-theme=\"dark\"] {\n  @include invert-filter;\n\n  .no-invert-dark-mode {\n    @include invert-filter;\n  }\n}\n"
  },
  {
    "path": "inst/BS5/templates/after-body.html",
    "content": "{{#includes}}{{{after_body}}}{{/includes}}\n"
  },
  {
    "path": "inst/BS5/templates/before-body.html",
    "content": "{{#includes}}{{{before_body}}}{{/includes}}\n"
  },
  {
    "path": "inst/BS5/templates/config-docsearch.json",
    "content": "{\n  \"index_name\": \"{{index}}\",\n  \"start_urls\": [\n    {\n      \"url\": \"{{url}}/index.html\",\n      \"selectors_key\": \"homepage\",\n      \"tags\": [\n        \"homepage\"\n      ]\n    },\n    {\n      \"url\": \"{{url}}/reference\",\n      \"selectors_key\": \"reference\",\n      \"tags\": [\n        \"reference\"\n      ]\n    },\n    {\n      \"url\": \"{{url}}/articles\",\n      \"selectors_key\": \"articles\",\n      \"tags\": [\n        \"articles\"\n      ]\n    }\n  ],\n  \"stop_urls\": [\n    \"/reference/$\",\n    \"/reference/index.html\",\n    \"/articles/$\",\n    \"/articles/index.html\"\n  ],\n  \"sitemap_urls\": [\n    \"{{url}}/sitemap.xml\"\n  ],\n  \"selectors\": {\n    \"homepage\": {\n      \"lvl0\": {\n        \"selector\": \"main h1\",\n        \"default_value\": \"{{package}} Home page\"\n      },\n      \"lvl1\": {\n        \"selector\": \"main h2\"\n      },\n      \"lvl2\": {\n        \"selector\": \"main h3\",\n        \"default_value\": \"Context\"\n      },\n      \"lvl3\": \".ref-arguments td, .ref-description\",\n      \"text\": \"main p, main li, main .pre\"\n    },\n    \"reference\": {\n      \"lvl0\": {\n        \"selector\": \"main h1\"\n      },\n      \"lvl1\": {\n        \"selector\": \"main .name\",\n        \"default_value\": \"Argument\"\n      },\n      \"lvl2\": {\n        \"selector\": \".ref-arguments th\",\n        \"default_value\": \"Description\"\n      },\n      \"lvl3\": \".ref-arguments td, .ref-description\",\n      \"text\": \"main p, main li\"\n    },\n    \"articles\": {\n      \"lvl0\": {\n        \"selector\": \"main h1\"\n      },\n      \"lvl1\": {\n        \"selector\": \"main .name\"\n      },\n      \"lvl2\": {\n        \"selector\": \"main h2, main h3\",\n        \"default_value\": \"Context\"\n      },\n      \"text\": \"main p, main li\"\n    }\n  },\n  \"selectors_exclude\": [\n    \".dont-index\"\n    ],\n  \"min_indexed_level\": 2,\n  \"custom_settings\": {\n    \"separatorsToIndex\": \"_\",\n    \"attributesToRetrieve\": [\n      \"hierarchy\",\n      \"content\",\n      \"anchor\",\n      \"url\",\n      \"url_without_anchor\"\n    ]\n  }\n}\n"
  },
  {
    "path": "inst/BS5/templates/content-article-index.html",
    "content": "<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\">\n    <div class=\"page-header\">\n      {{#logo}}<img src=\"{{logo.src}}\" class=\"logo\" alt=\"\" >{{/logo}}\n      <h1>{{{pagetitle}}}</h1>\n    </div>\n\n    {{#sections}}\n    <div class=\"section {{class}}\">\n      <h3>{{{title}}}</h3>\n      <div class=\"section-desc\">{{{desc}}}</div>\n\n      <dl>\n        {{#contents}}\n        <dt><a href=\"{{href}}\">{{title}}</a></dt>\n        <dd>{{{description}}}</dt>\n        {{/contents}}\n      </dl>\n    </div>\n    {{/sections}}\n  </main>\n\n  <aside class=\"col-md-3\">\n    <nav id=\"toc\" aria-label=\"{{#translate}}{{toc}}{{/translate}}\">\n      <h2>{{#translate}}{{on_this_page}}{{/translate}}</h2>\n    </nav>\n  </aside>\n</div>\n"
  },
  {
    "path": "inst/BS5/templates/content-article.html",
    "content": "{{^as_is}}$for(header-includes)$\n$header-includes$\n$endfor${{/as_is}}\n\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\">\n    <div class=\"page-header\">\n      {{#logo}}<img src=\"{{logo.src}}\" class=\"logo\" alt=\"\" >{{/logo}}\n      <h1>{{{pagetitle}}}</h1>\n      $if(subtitle)$\n      <h3 data-toc-skip class=\"subtitle\">$subtitle$</h3>\n      $endif$\n      $for(author)$\n      $if(author.name)$\n      <h4 data-toc-skip class=\"author\">$author.name$</h4>\n      $if(author.affiliation)$\n      <address class=\"author_afil\">\n      $author.affiliation$<br>$endif$\n      $if(author.email)$\n      <a class=\"author_email\" href=\"mailto:#\">$author.email$</a>\n      </address>\n      $endif$\n      $else$\n      <h4 data-toc-skip class=\"author\">$author$</h4>\n      $endif$\n      $endfor$\n\n      $if(date)$\n      <h4 data-toc-skip class=\"date\">$date$</h4>\n      $endif$\n\n      {{#source}}<small class=\"dont-index\">{{{.}}}</small>{{/source}}\n      <div class=\"d-none name\"><code>{{filename}}</code></div>\n    </div>\n\n    $for(include-before)$\n    $include-before$\n    $endfor$\n\n    $if(abstract)$\n    <div class=\"abstract\">\n      <p class=\"abstract\">{{#translate}}{{abstract}}{{/translate}}</p>\n      $abstract$\n    </div>\n    $endif$\n\n$body$\n  </main>\n {{#toc}}\n  <aside class=\"col-md-3\">\n    <nav id=\"toc\" aria-label=\"{{#translate}}{{toc}}{{/translate}}\">\n      <h2>{{#translate}}{{on_this_page}}{{/translate}}</h2>\n    </nav>\n  </aside>\n {{/toc}}\n\n</div>\n\n$for(include-after)$\n$include-after$\n$endfor$\n"
  },
  {
    "path": "inst/BS5/templates/content-authors.html",
    "content": "<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\">\n    <div class=\"page-header\">\n      {{#logo}}<img src=\"{{logo.src}}\" class=\"logo\" alt=\"\" >{{/logo}}\n      <h1>{{{pagetitle}}}</h1>\n    </div>\n\n    <div class=\"section level1\">\n    {{{before}}}\n    <ul class=\"list-unstyled\">\n      {{#authors}}\n      <li>\n        <p><strong>{{{name}}}</strong>. {{{roles}}}. {{{orcid}}}{{{ror}}}\n        {{#comment}}<br /><small>{{{.}}}</small>{{/comment}}</p>\n      </li>\n      {{/authors}}\n    </ul>\n    {{{after}}}\n    </div>\n  </main>\n\n  <aside class=\"col-md-3\">\n    <nav id=\"toc\" aria-label=\"{{#translate}}{{toc}}{{/translate}}\">\n      <h2>{{#translate}}{{on_this_page}}{{/translate}}</h2>\n    </nav>\n  </aside>\n</div>\n"
  },
  {
    "path": "inst/BS5/templates/content-citation-authors.html",
    "content": "<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\">\n    <div class=\"page-header\">\n      {{#logo}}<img src=\"{{logo.src}}\" class=\"logo\" alt=\"\" >{{/logo}}\n      <h1>{{{pagetitle}}}</h1>\n    </div>\n\n    <div class=\"section level2\">\n      <h2>{{#translate}}{{authors}}{{/translate}}</h2>\n      {{{before}}}\n      <ul class=\"list-unstyled\">\n        {{#authors}}\n        <li>\n          <p><strong>{{{name}}}</strong>. {{{roles}}}. {{{orcid}}}{{{ror}}}\n          {{#comment}}<br /><small>{{{.}}}</small>{{/comment}}</p>\n        </li>\n        {{/authors}}\n      </ul>\n      {{{after}}}\n    </div>\n\n    <div class=\"section level2\">\n      <h2 id=\"citation\">{{#translate}}{{citation}}{{/translate}}</h2>\n      <p>{{#source}}<small class=\"dont-index\">{{{.}}}</small>{{/source}}</p>\n\n      {{#citations}}\n      {{{html}}}\n      <pre>{{bibtex}}</pre>\n      {{/citations}}\n    </div>\n\n    {{#inst}}\n    <div class=\"section level2\">\n      <h2>{{#translate}}{{author_details}}{{/translate}}</h2>\n      <pre>{{.}}</pre>\n    </div>\n    {{/inst}}\n  </main>\n\n  <aside class=\"col-md-3\">\n    <nav id=\"toc\" aria-label=\"{{#translate}}{{toc}}{{/translate}}\">\n      <h2>{{#translate}}{{on_this_page}}{{/translate}}</h2>\n    </nav>\n  </aside>\n</div>\n"
  },
  {
    "path": "inst/BS5/templates/content-home.html",
    "content": "<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\">\n{{{index}}}\n  </main>\n\n  <aside class=\"col-md-3\">\n{{#sidebar}}\n{{{.}}}\n{{/sidebar}}\n  </aside>\n</div>\n"
  },
  {
    "path": "inst/BS5/templates/content-news-index.html",
    "content": "<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\">\n    <div class=\"page-header\">\n      {{#logo}}<img src=\"{{logo.src}}\" class=\"logo\" alt=\"\" >{{/logo}}\n      <h1>{{{pagetitle}}}</h1>\n    </div>\n    <ul>\n    {{#versions}}\n    <li><a href=\"{{{file_out}}}\">{{#translate}}{{version}}{{/translate}} {{{version}}}</a></li>\n    {{/versions}}\n    </ul>\n  </main>\n\n  <aside class=\"col-md-3\">\n    <nav id=\"toc\" aria-label=\"{{#translate}}{{toc}}{{/translate}}\">\n      <h2>{{#translate}}{{on_this_page}}{{/translate}}</h2>\n    </nav>\n  </aside>\n</div>\n\n"
  },
  {
    "path": "inst/BS5/templates/content-news.html",
    "content": "<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\">\n    <div class=\"page-header\">\n      {{#logo}}<img src=\"{{logo.src}}\" class=\"logo\" alt=\"\" >{{/logo}}\n      <h1>{{{pagetitle}}}</h1>\n      {{#source}}<small>{{{.}}}</small>{{/source}}\n    </div>\n\n    {{#contents}}\n    {{{html}}}\n    {{/contents}}\n  </main>\n\n  <aside class=\"col-md-3\">\n    <nav id=\"toc\" aria-label=\"{{#translate}}{{toc}}{{/translate}}\">\n      <h2>{{#translate}}{{on_this_page}}{{/translate}}</h2>\n    </nav>\n  </aside>\n\n</div>\n"
  },
  {
    "path": "inst/BS5/templates/content-quarto.html",
    "content": "<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\">\n    <div class=\"page-header\">\n      {{#logo}}<img src=\"{{logo.src}}\" class=\"logo\" alt=\"\">{{/logo}}\n      {{#meta}}\n      <h1>{{{title}}}</h1>\n      {{#subtitle}}<p class=\"subtitle\">{{{.}}}</p>{{/subtitle}}\n      {{#author}}<p class=\"author\">{{{.}}}</p>{{/author}}\n      {{#date}}<p class=\"date\">{{{.}}}</p>{{/date}}\n      {{/meta}}\n\n      {{#source}}<small class=\"dont-index\">{{{.}}}</small>{{/source}}\n      <div class=\"d-none name\"><code>{{filename}}</code></div>\n    </div>\n\n    {{#abstract}}<div class=\"abstract\">\n      <p class=\"abstract\">{{#translate}}{{abstract}}{{/translate}}</p>\n      {{{.}}}\n    </div>{{/abstract}}\n    \n    {{#includes}}{{{before}}}{{/includes}}\n    \n    {{{body}}}\n\n    {{#includes}}{{{after}}}{{/includes}}\n\n  </main>\n \n  {{#toc}}\n  <aside class=\"col-md-3\">\n    <nav id=\"toc\" aria-label=\"{{#translate}}{{toc}}{{/translate}}\">\n      <h2>{{#translate}}{{on_this_page}}{{/translate}}</h2>\n    </nav>\n  </aside>\n  {{/toc}}\n</div>\n"
  },
  {
    "path": "inst/BS5/templates/content-reference-index.html",
    "content": "<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\">\n    <div class=\"page-header\">\n      {{#logo}}<img src=\"{{logo.src}}\" class=\"logo\" alt=\"\" >{{/logo}}\n      <h1>{{{pagetitle}}}</h1>\n    </div>\n\n    {{#rows}}<div {{#slug}}id=\"{{.}}\"{{/slug}} class=\"section level2\">\n      {{#title}}<h2>{{{.}}}</h2>{{/title}}\n      {{#subtitle}}<h3>{{{.}}}</h3>{{/subtitle}}\n      {{#desc}}<div class=\"section-desc\">{{{desc}}}</div>{{/desc}}\n\n      <dl>{{#topics}}\n        <dt>\n          {{#has_icons}}{{#icon}}<a class=\"icon\" href=\"{{path}}\"><img src=\"icons/{{{.}}}\" alt=\"\"/></a>{{/icon}}{{/has_icons}}\n          {{#aliases}}<code><a href=\"{{path}}\">{{{.}}}</a></code> {{/aliases}}\n          {{#lifecycle}}<span class=\"badge lifecycle lifecycle-{{.}}\">{{.}}</span>{{/lifecycle}}\n        </dt>\n        <dd>{{{title}}}</dd>\n      {{/topics}}</dl>\n    </div>{{/rows}}\n  </main>\n\n  <aside class=\"col-md-3\">\n    <nav id=\"toc\" aria-label=\"{{#translate}}{{toc}}{{/translate}}\">\n      <h2>{{#translate}}{{on_this_page}}{{/translate}}</h2>\n    </nav>\n  </aside>\n</div>\n"
  },
  {
    "path": "inst/BS5/templates/content-reference-topic.html",
    "content": "<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\">\n    <div class=\"page-header\">\n      {{#logo}}<img src=\"{{logo.src}}\" class=\"logo\" alt=\"\" >{{/logo}}\n      <h1>{{{title}}}</h1>\n      {{#source}}<small class=\"dont-index\">{{{.}}}</small>{{/source}}\n      <div class=\"d-none name\"><code>{{filename}}</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    {{#description}}\n    {{#contents}}\n    {{{.}}}\n    {{/contents}}\n    {{/description}}\n    </div>\n\n    {{#usage}}\n    <div class=\"section level2\" id=\"ref-usage\">\n    <h2>{{{title}}}</h2>\n    {{#contents}}\n    {{{.}}}\n    {{/contents}}\n    </div>\n    {{/usage}}\n\n    {{#sections}}\n    <div class=\"section level2\" id=\"{{slug}}\">\n    <h2>{{{title}}}</h2>\n    {{#contents}}\n    {{{.}}}\n    {{/contents}}\n    </div>\n    {{/sections}}\n\n    {{#examples}}\n    <div class=\"section level2\" id=\"ref-examples\">\n    <h2>{{#translate}}{{examples}}{{/translate}}</h2>\n    {{{.}}}\n    </div>\n    {{/examples}}\n  </main>\n  <aside class=\"col-md-3\">\n    <nav id=\"toc\" aria-label=\"{{#translate}}{{toc}}{{/translate}}\">\n      <h2>{{#translate}}{{on_this_page}}{{/translate}}</h2>\n    </nav>\n  </aside>\n</div>\n"
  },
  {
    "path": "inst/BS5/templates/content-title-body.html",
    "content": "<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\">\n    <div class=\"page-header\">\n      {{#logo}}<img src=\"{{logo.src}}\" class=\"logo\" alt=\"\" >{{/logo}}\n      <h1>{{pagetitle}}</h1>\n      {{#source}}<small class=\"dont-index\">{{{.}}}</small>{{/source}}\n    </div>\n\n{{{body}}}\n\n  </main>\n\n  <aside class=\"col-md-3\">\n    <nav id=\"toc\" aria-label=\"{{#translate}}{{toc}}{{/translate}}\">\n      <h2>{{#translate}}{{on_this_page}}{{/translate}}</h2>\n    </nav>\n  </aside>\n\n</div>\n"
  },
  {
    "path": "inst/BS5/templates/content-tutorial-index.html",
    "content": "<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\">\n    <div class=\"page-header\">\n      {{#logo}}<img src=\"{{logo.src}}\" class=\"logo\" alt=\"\" >{{/logo}}\n      <h1>{{{pagetitle}}}</h1>\n    </div>\n\n    <ul>\n      {{#tutorials}}\n      <li><a href=\"{{path}}\">{{title}}</a></li>\n      {{/tutorials}}\n    </ul>\n  </main>\n\n  <aside class=\"col-md-3\">\n    <nav id=\"toc\" aria-label=\"{{#translate}}{{toc}}{{/translate}}\">\n      <h2>{{#translate}}{{on_this_page}}{{/translate}}</h2>\n    </nav>\n  </aside>\n</div>\n"
  },
  {
    "path": "inst/BS5/templates/content-tutorial.html",
    "content": "<div class=\"row\">\n  <main id=\"main\" class=\"col-md-12\">\n    <div class=\"page-header\">\n      <h1>{{pagetitle}}</h1>\n    </div>\n  </main>\n  <aside class=\"col-md-3\">\n    <nav id=\"toc\" aria-label=\"{{#translate}}{{toc}}{{/translate}}\">\n      <h2>{{#translate}}{{on_this_page}}{{/translate}}</h2>\n    </nav>\n  </aside>\n</div>\n\n<div class=\"row\">\n  <div id=\"tutorial\"></div>\n    <iframe width=\"100%\" height=\"600\" src=\"{{url}}\" frameborder=\"0\"></iframe>\n  </div>\n</div>\n"
  },
  {
    "path": "inst/BS5/templates/footer.html",
    "content": "{{#footer}}\n<div class=\"pkgdown-footer-left\">\n  {{#left}}{{{.}}}{{/left}}\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  {{#right}}{{{.}}}{{/right}}\n</div>\n{{/footer}}\n"
  },
  {
    "path": "inst/BS5/templates/head.html",
    "content": "<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<title>{{{pagetitle}}} • {{#site}}{{title}}{{/site}}</title>\n\n{{#has_favicons}}\n<!-- favicons -->\n<link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"{{#site}}{{root}}{{/site}}favicon-96x96.png\">\n<link rel=\"icon\" type=”image/svg+xml” href=\"{{#site}}{{root}}{{/site}}favicon.svg\">\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"{{#site}}{{root}}{{/site}}apple-touch-icon.png\">\n<link rel=\"icon\" sizes=\"any\" href=\"{{#site}}{{root}}{{/site}}favicon.ico\" >\n<link rel=\"manifest\" href=\"{{#site}}{{root}}{{/site}}site.webmanifest\">\n{{/has_favicons}}\n\n{{#uses_katex}}\n<!-- katex math -->\n<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.css\" integrity=\"sha384-nB0miv6/jRmo5UMMR1wu3Gz6NLsoTkbqJghGIsx//Rlm+ZU03BU6SQNC66uf4l5+\" crossorigin=\"anonymous\">\n<script defer src=\"https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/katex.min.js\" integrity=\"sha384-7zkQWkzuo3B5mTepMUcHkMB5jZaolc2xDwL6VFqjFALcbeS9Ggm/Yr2r3Dy4lfFg\" crossorigin=\"anonymous\"></script>\n<script defer src=\"https://cdn.jsdelivr.net/npm/katex@0.16.11/dist/contrib/auto-render.min.js\" integrity=\"sha384-43gviWU0YVjaDtb/GhzOouOXtZMP/7XUzwPTstBeZFe/+rCMvRwr4yROQP43s0Xk\" crossorigin=\"anonymous\" onload=\"renderMathInElement(document.body);\"></script>\n<script src=\"{{#site}}{{root}}{{/site}}katex-auto.js\"></script>\n{{/uses_katex}}\n\n{{#uses_mathjax}}\n<!-- mathjax math -->\n<script src=\"https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/tex-mml-chtml.js\" integrity=\"sha256-MASABpB4tYktI2Oitl4t+78w/lyA+D7b/s9GEP0JOGI=\" crossorigin=\"anonymous\"></script>\n<script>\n  window.MathJax = {\n    chtml: {\n      fontURL: \"https://cdn.jsdelivr.net/npm/mathjax@3.2.2/es5/output/chtml/fonts/woff-v2\"\n    }\n  };\n</script>\n{{/uses_mathjax}}\n\n{{#lightswitch}}<script src=\"{{#site}}{{root}}{{/site}}lightswitch.js\"></script>{{/lightswitch}}\n\n{{{headdeps}}}\n{{#includes}}{{{head}}}{{/includes}}\n\n<!-- pkgdown -->\n<script src=\"{{#site}}{{root}}{{/site}}pkgdown.js\"></script>\n\n{{#extra}}\n  {{#css}}<link href=\"{{#site}}{{root}}{{/site}}extra.css\" rel=\"stylesheet\">{{/css}}\n  {{#js}}<script src=\"{{#site}}{{root}}{{/site}}extra.js\"></script>{{/js}}\n{{/extra}}\n\n<meta property=\"og:title\" content=\"{{{pagetitle}}}\" />\n{{#opengraph}}\n{{#description}}\n  <meta name=\"description\" content=\"{{.}}\" />\n  <meta property=\"og:description\" content=\"{{.}}\" />\n{{/description}}\n{{#image}}\n  <meta property=\"og:image\" content=\"{{{src}}}\" />\n  {{#alt}}<meta property=\"og:image:alt\" content=\"{{{.}}}\" />{{/alt}}\n{{/image}}\n{{#twitter}}\n  {{#card}}<meta name=\"twitter:card\" content=\"{{{.}}}\" />{{/card}}\n  {{#creator}}<meta name=\"twitter:creator\" content=\"{{{.}}}\" />{{/creator}}\n  {{#site}}<meta name=\"twitter:site\" content=\"{{{.}}}\" />{{/site}}\n{{/twitter}}\n{{/opengraph}}\n\n{{#yaml}}{{#noindex}}<meta name=\"robots\" content=\"noindex\" />{{/noindex}}{{/yaml}}\n{{#development}}{{#in_dev}}<meta name=\"robots\" content=\"noindex\">{{/in_dev}}{{/development}}\n\n{{#yaml}}{{#google_site_verification}}\n<meta name=\"google-site-verification\" content=\"{{{.}}}\" />\n{{/google_site_verification}}{{/yaml}}\n\n{{#yaml}}{{#ganalytics}}\n<!-- Global site tag (gtag.js) - Google Analytics -->\n<script async src=\"https://www.googletagmanager.com/gtag/js?id={{.}}\"></script>\n<script>\n  window.dataLayer = window.dataLayer || [];\n  function gtag(){dataLayer.push(arguments);}\n  gtag('js', new Date());\n\n  gtag('config', '{{.}}');\n</script>\n{{/ganalytics}}{{/yaml}}\n{{#has_trailingslash}}\n<!-- See https://stackoverflow.com/questions/1865837/whats-the-difference-between-window-location-and-window-location-replace — we use .replace() because we don't want the old url to appear in the browser history. -->\n<script>\n  if (!/(\\/|html?)$/.test(window.location.href)){\n    window.location.replace(window.location.href + '/');\n  }\n</script>\n{{/has_trailingslash}}\n{{#has_deps}}\n<!-- dependencies from examples -->\n{{{dependencies}}}\n{{/has_deps}}\n"
  },
  {
    "path": "inst/BS5/templates/header.html",
    "content": ""
  },
  {
    "path": "inst/BS5/templates/in-header.html",
    "content": "{{#includes}}{{{in_header}}}{{/includes}}\n"
  },
  {
    "path": "inst/BS5/templates/layout-redirect.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL={{{url}}}\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"{{{url}}}\">\n  </head>\n</html>\n"
  },
  {
    "path": "inst/BS5/templates/layout.html",
    "content": "<!-- Generated by pkgdown: do not edit by hand -->\n<!DOCTYPE html>\n<html lang=\"{{{lang}}}\">\n  <head>\n  {{{ head }}}\n  {{{ in-header }}}\n  </head>\n\n  <body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">{{#translate}}{{skip}}{{/translate}}</a>\n    {{{ before-body }}}\n    {{{ navbar }}}\n    <div class=\"container template-{{template}}\">\n{{{ content }}}\n\n    <footer>\n    {{{ footer }}}\n    </footer>\n   </div>\n\n  {{{ docsearch }}}\n\n  {{{ after-body }}}\n  </body>\n</html>\n\n"
  },
  {
    "path": "inst/BS5/templates/navbar.html",
    "content": "{{#navbar}}\n<nav class=\"navbar navbar-expand-lg fixed-top {{#bg}}bg-{{{.}}}{{/bg}}\" {{#type}}data-bs-theme=\"{{{.}}}\"{{/type}} aria-label=\"{{#translate}}{{site_nav}}{{/translate}}\">\n  <div class=\"container\">\n    {{#includes}}{{{before_title}}}{{/includes}}\n    <a class=\"navbar-brand me-2\" href=\"{{#site}}{{root}}{{/site}}index.html\">{{#site}}{{title}}{{/site}}</a>\n\n    <small class=\"nav-text {{#development}}text-{{version_label}}{{/development}} me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"{{#development}}{{version_tooltip}}{{/development}}\">{{#package}}{{version}}{{/package}}</small>\n\n    {{#includes}}{{{before_navbar}}}{{/includes}}\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"{{#translate}}{{toggle_nav}}{{/translate}}\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      {{#left}}\n      <ul class=\"navbar-nav me-auto\">\n      {{{.}}}\n      </ul>\n      {{/left}}\n\n      {{#right}}\n      <ul class=\"navbar-nav\">\n      {{{.}}}\n      </ul>\n      {{/right}}\n    </div>\n\n    {{#includes}}{{{after_navbar}}}{{/includes}}\n  </div>\n</nav>\n{{/navbar}}\n"
  },
  {
    "path": "inst/highlight-styles/a11y-dark.scss",
    "content": "pre {background-color: #2b2b2b;}\npre code         /* Normal         */ {color:#f8f8f2}\npre code span.al /* Alert          */ {color:#dcc6e0}\npre code span.an /* Annotation     */ {color:#d4d0ab}\npre code span.at /* Attribute      */ {color:#ffd700}\npre code span.bn /* BaseN          */ {color:#dcc6e0}\npre code span.bu /* BuiltIn        */ {}\npre code span.cf /* ControlFlow    */ {color:#ffa07a}\npre code span.ch /* Char           */ {color:#abe338}\npre code span.cn /* Constant       */ {color:#ffa07a}\npre code span.co /* Comment        */ {color:#d4d0ab}\npre code span.cv /* CommentVar     */ {color:#d4d0ab; font-style: italic}\npre code span.do /* Documentation  */ {color:#d4d0ab; font-style: italic}\npre code span.dt /* DataType       */ {color:#dcc6e0}\npre code span.dv /* DecVal         */ {color:#dcc6e0}\npre code span.er /* Error          */ {color:#dcc6e0}\npre code span.ex /* Extension      */ {}\npre code span.fl /* Float          */ {color:#f5ab35}\npre code span.fu /* Function       */ {color:#ffd700}\npre code span.im /* Import         */ {}\npre code span.in /* Information    */ {color:#d4d0ab}\npre code span.kw /* Keyword        */ {color:#ffa07a}\npre code span.op /* Operator       */ {color:#00e0e0}\npre code span.ot /* Other          */ {color:#ffa07a}\npre code span.pp /* Preprocessor   */ {color:#dcc6e0}\npre code span.sc /* SpecialChar    */ {color:#00e0e0}\npre code span.ss /* SpecialString  */ {color:#abe338}\npre code span.st /* String         */ {color:#abe338}\npre code span.va /* Variable       */ {color:#f5ab35}\npre code span.vs /* VerbatimString */ {color:#abe338}\npre code span.wa /* Warning        */ {color:#d4d0ab; font-style: italic}\n"
  },
  {
    "path": "inst/highlight-styles/a11y-light.scss",
    "content": "pre {background-color: #fefefe;}\npre code         /* Normal         */ {color:#545454}\npre code span.al /* Alert          */ {color:#7928a1}\npre code span.an /* Annotation     */ {color:#696969}\npre code span.at /* Attribute      */ {color:#aa5d00}\npre code span.bn /* BaseN          */ {color:#7928a1}\npre code span.bu /* BuiltIn        */ {}\npre code span.cf /* ControlFlow    */ {color:#d91e18}\npre code span.ch /* Char           */ {color:#008000}\npre code span.cn /* Constant       */ {color:#d91e18}\npre code span.co /* Comment        */ {color:#696969}\npre code span.cv /* CommentVar     */ {color:#696969; font-style: italic}\npre code span.do /* Documentation  */ {color:#696969; font-style: italic}\npre code span.dt /* DataType       */ {color:#7928a1}\npre code span.dv /* DecVal         */ {color:#7928a1}\npre code span.er /* Error          */ {color:#7928a1}\npre code span.ex /* Extension      */ {}\npre code span.fl /* Float          */ {color:#aa5d00}\npre code span.fu /* Function       */ {color:#06287e}\npre code span.im /* Import         */ {}\npre code span.in /* Information    */ {color:#696969}\npre code span.kw /* Keyword        */ {color:#d91e18}\npre code span.op /* Operator       */ {color:#007faa}\npre code span.ot /* Other          */ {color:#d91e18}\npre code span.pp /* Preprocessor   */ {color:#7928a1}\npre code span.sc /* SpecialChar    */ {color:#007faa}\npre code span.ss /* SpecialString  */ {color:#008000}\npre code span.st /* String         */ {color:#008000}\npre code span.va /* Variable       */ {color:#aa5d00}\npre code span.vs /* VerbatimString */ {color:#008000}\npre code span.wa /* Warning        */ {color:#696969; font-style: italic}\n"
  },
  {
    "path": "inst/highlight-styles/arrow-dark.scss",
    "content": "pre code         /* Normal         */ {color:#f8f8f2}\npre code span.al /* Alert          */ {color:#f07178; background-color:#2a0f15; font-weight: bold}\npre code span.an /* Annotation     */ {color:#d4d0ab}\npre code span.at /* Attribute      */ {color:#00e0e0}\npre code span.bn /* BaseN          */ {color:#d4d0ab}\npre code span.bu /* BuiltIn        */ {color:#abe338}\npre code span.cf /* ControlFlow    */ {color:#ffa07a; font-weight: bold}\npre code span.ch /* Char           */ {color:#abe338}\npre code span.cn /* Constant       */ {color:#ffd700}\npre code span.co /* Comment        */ {color:#f8f8f2; font-style: italic}\npre code span.cv /* CommentVar     */ {color:#ffd700}\npre code span.do /* Documentation  */ {color:#f8f8f2}\npre code span.dt /* DataType       */ {color:#ffa07a}\npre code span.dv /* DecVal         */ {color:#d4d0ab}\npre code span.er /* Error          */ {color:#f07178; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#00e0e0; font-weight: bold}\npre code span.fl /* Float          */ {color:#d4d0ab}\npre code span.fu /* Function       */ {color:#ffa07a}\npre code span.im /* Import         */ {color:#abe338}\npre code span.in /* Information    */ {color:#d4d0ab}\npre code span.kw /* Keyword        */ {color:#ffa07a; font-weight: bold}\npre code span.op /* Operator       */ {color:#ffa07a}\npre code span.ot /* Other          */ {color:#00e0e0}\npre code span.pp /* Preprocessor   */ {color:#dcc6e0}\npre code span.re /* RegionMarker   */ {color:#00e0e0; background-color:#f8f8f2}\npre code span.sc /* SpecialChar    */ {color:#abe338}\npre code span.ss /* SpecialString  */ {color:#abe338}\npre code span.st /* String         */ {color:#abe338}\npre code span.va /* Variable       */ {color:#00e0e0}\npre code span.vs /* VerbatimString */ {color:#abe338}\npre code span.wa /* Warning        */ {color:#dcc6e0}\n"
  },
  {
    "path": "inst/highlight-styles/arrow-light.scss",
    "content": "pre {background-color: #f1f3f5;}\npre code         /* Normal         */ {color:#003B4F}\npre code span.al /* Alert          */ {color:#AD0000}\npre code span.an /* Annotation     */ {color:#5E5E5E}\npre code span.at /* Attribute      */ {color:#657422}\npre code span.bn /* BaseN          */ {color:#AD0000}\npre code span.bu /* BuiltIn        */ {}\npre code span.cf /* ControlFlow    */ {color:#003B4F}\npre code span.ch /* Char           */ {color:#20794D}\npre code span.cn /* Constant       */ {color:#8f5902}\npre code span.co /* Comment        */ {color:#5E5E5E}\npre code span.cv /* CommentVar     */ {color:#5E5E5E; font-style: italic}\npre code span.do /* Documentation  */ {color:#5E5E5E; font-style: italic}\npre code span.dt /* DataType       */ {color:#AD0000}\npre code span.dv /* DecVal         */ {color:#AD0000}\npre code span.er /* Error          */ {color:#AD0000}\npre code span.ex /* Extension      */ {}\npre code span.fl /* Float          */ {color:#AD0000}\npre code span.fu /* Function       */ {color:#4758AB}\npre code span.im /* Import         */ {color:#00769E}\npre code span.in /* Information    */ {color:#5E5E5E}\npre code span.kw /* Keyword        */ {color:#003B4F}\npre code span.op /* Operator       */ {color:#5E5E5E}\npre code span.ot /* Other          */ {color:#003B4F}\npre code span.pp /* Preprocessor   */ {color:#AD0000}\npre code span.sc /* SpecialChar    */ {color:#5E5E5E}\npre code span.ss /* SpecialString  */ {color:#20794D}\npre code span.st /* String         */ {color:#20794D}\npre code span.va /* Variable       */ {color:#111111}\npre code span.vs /* VerbatimString */ {color:#20794D}\npre code span.wa /* Warning        */ {color:#5E5E5E; font-style: italic}\n"
  },
  {
    "path": "inst/highlight-styles/atom-one-dark.scss",
    "content": "pre code         /* Normal         */ {color:#abb2bf}\npre code span.al /* Alert          */ {color:#95da4c; background-color:#4d1f24; font-weight: bold}\npre code span.an /* Annotation     */ {color:#98c379}\npre code span.at /* Attribute      */ {color:#c678dd}\npre code span.bn /* BaseN          */ {color:#d19a66}\npre code span.bu /* BuiltIn        */ {color:#c678dd}\npre code span.cf /* ControlFlow    */ {color:#c678dd}\npre code span.ch /* Char           */ {color:#98c379}\npre code span.cn /* Constant       */ {color:#d19a66}\npre code span.co /* Comment        */ {color:#5c6370; font-style: italic}\npre code span.cv /* CommentVar     */ {color:#e06c75; font-style: italic}\npre code span.do /* Documentation  */ {color:#a43340}\npre code span.dt /* DataType       */ {color:#c678dd}\npre code span.dv /* DecVal         */ {color:#d19a66}\npre code span.er /* Error          */ {color:#f44747; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#61afef; font-weight: bold}\npre code span.fl /* Float          */ {color:#d19a66}\npre code span.fu /* Function       */ {color:#61afef}\npre code span.im /* Import         */ {color:#98c379}\npre code span.in /* Information    */ {color:#c45b00}\npre code span.kw /* Keyword        */ {color:#c678dd}\npre code span.op /* Operator       */ {color:#c678dd}\npre code span.ot /* Others         */ {color:#27ae60}\npre code span.pp /* Preprocessor   */ {color:#c678dd}\npre code span.re /* RegionMarker   */ {color:#2980b9; background-color:#153042}\npre code span.sc /* SpecialChar    */ {color:#56b6c2}\npre code span.ss /* SpecialString  */ {color:#da4453}\npre code span.st /* String         */ {color:#98c379}\npre code span.va /* Variable       */ {color:#e06c75}\npre code span.vs /* VerbatimString */ {color:#da4453}\npre code span.wa /* Warning        */ {color:#da4453}\n"
  },
  {
    "path": "inst/highlight-styles/atom-one-light.scss",
    "content": "pre code         /* Normal         */ {color:#383a42}\npre code span.al /* Alert          */ {color:#95da4c; background-color:#4d1f24; font-weight: bold}\npre code span.an /* Annotation     */ {color:#50a14f}\npre code span.at /* Attribute      */ {color:#a626a4}\npre code span.bn /* BaseN          */ {color:#986801}\npre code span.bu /* BuiltIn        */ {color:#a626a4}\npre code span.cf /* ControlFlow    */ {color:#a626a4}\npre code span.ch /* Char           */ {color:#50a14f}\npre code span.cn /* Constant       */ {color:#986801}\npre code span.co /* Comment        */ {color:#a0a1a7; font-style: italic}\npre code span.cv /* CommentVar     */ {color:#e45649; font-style: italic}\npre code span.do /* Documentation  */ {color:#e45649}\npre code span.dt /* DataType       */ {color:#a626a4}\npre code span.dv /* DecVal         */ {color:#986801}\npre code span.er /* Error          */ {color:#f44747; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#4078f2; font-weight: bold}\npre code span.fl /* Float          */ {color:#986801}\npre code span.fu /* Function       */ {color:#4078f2}\npre code span.im /* Import         */ {color:#50a14f}\npre code span.in /* Information    */ {color:#c45b00}\npre code span.kw /* Keyword        */ {color:#a626a4}\npre code span.op /* Operator       */ {color:#a626a4}\npre code span.ot /* Others         */ {color:#27ae60}\npre code span.pp /* Preprocessor   */ {color:#a626a4}\npre code span.re /* RegionMarker   */ {color:#2980b9; background-color:#153042}\npre code span.sc /* SpecialChar    */ {color:#0184bc}\npre code span.ss /* SpecialString  */ {color:#da4453}\npre code span.st /* String         */ {color:#50a14f}\npre code span.va /* Variable       */ {color:#e45649}\npre code span.vs /* VerbatimString */ {color:#da4453}\npre code span.wa /* Warning        */ {color:#da4453}\n"
  },
  {
    "path": "inst/highlight-styles/ayu-dark.scss",
    "content": "pre {background-color: #0a0e14;}\npre code         /* Normal         */ {color:#b3b1ad}\npre code span.al /* Alert          */ {color:#ff3333; background-color:#2a0f15; font-weight: bold}\npre code span.an /* Annotation     */ {color:#e6b673}\npre code span.at /* Attribute      */ {color:#59c2ff}\npre code span.bn /* BaseN          */ {color:#e6b450}\npre code span.bu /* BuiltIn        */ {color:#95e6cb}\npre code span.cf /* ControlFlow    */ {color:#ff8f40; font-weight: bold}\npre code span.ch /* Char           */ {color:#95e6cb}\npre code span.cn /* Constant       */ {color:#ffee99}\npre code span.co /* Comment        */ {color:#626a73; font-style: italic}\npre code span.cv /* CommentVar     */ {color:#ffee99}\npre code span.do /* Documentation  */ {color:#626a73}\npre code span.dt /* DataType       */ {color:#ff8f40}\npre code span.dv /* DecVal         */ {color:#e6b450}\npre code span.er /* Error          */ {color:#ff3333; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#59c2ff; font-weight: bold}\npre code span.fl /* Float          */ {color:#e6b450}\npre code span.fu /* Function       */ {color:#ffb454}\npre code span.im /* Import         */ {color:#c2d94c}\npre code span.in /* Information    */ {color:#e6b450}\npre code span.kw /* Keyword        */ {color:#ff8f40; font-weight: bold}\npre code span.op /* Operator       */ {color:#f29668}\npre code span.ot /* Others         */ {color:#39bae6}\npre code span.pp /* Preprocessor   */ {color:#f07178}\npre code span.re /* RegionMarker   */ {color:#59c2ff; background-color:#173649}\npre code span.sc /* SpecialChar    */ {color:#95e6cb}\npre code span.ss /* SpecialString  */ {color:#95e6cb}\npre code span.st /* String         */ {color:#c2d94c}\npre code span.va /* Variable       */ {color:#39bae6}\npre code span.vs /* VerbatimString */ {color:#c2d94c}\npre code span.wa /* Warning        */ {color:#f07178}\n"
  },
  {
    "path": "inst/highlight-styles/ayu-light.scss",
    "content": "pre {background-color: #fafafa;}\npre code         /* Normal         */ {color:#575f66}\npre code span.al /* Alert          */ {color:#f51818; background-color:#faefef; font-weight: bold}\npre code span.an /* Annotation     */ {color:#e6ba7e}\npre code span.at /* Attribute      */ {color:#399ee6}\npre code span.bn /* BaseN          */ {color:#ff9940}\npre code span.bu /* BuiltIn        */ {color:#4cbf99}\npre code span.cf /* ControlFlow    */ {color:#fa8d3e; font-weight: bold}\npre code span.ch /* Char           */ {color:#4cbf99}\npre code span.cn /* Constant       */ {color:#a37acc}\npre code span.co /* Comment        */ {color:#607880; font-style: italic}\npre code span.cv /* CommentVar     */ {color:#a37acc}\npre code span.do /* Documentation  */ {color:#607880}\npre code span.dt /* DataType       */ {color:#fa8d3e}\npre code span.dv /* DecVal         */ {color:#ff9940}\npre code span.er /* Error          */ {color:#f51818; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#399ee6; font-weight: bold}\npre code span.fl /* Float          */ {color:#ff9940}\npre code span.fu /* Function       */ {color:#f2ae49}\npre code span.im /* Import         */ {color:#86b300}\npre code span.in /* Information    */ {color:#ff9940}\npre code span.kw /* Keyword        */ {color:#fa8d3e; font-weight: bold}\npre code span.op /* Operator       */ {color:#ed9366}\npre code span.ot /* Others         */ {color:#55b4d4}\npre code span.pp /* Preprocessor   */ {color:#f07171}\npre code span.re /* RegionMarker   */ {color:#399ee6; background-color:#ddecf3}\npre code span.sc /* SpecialChar    */ {color:#4cbf99}\npre code span.ss /* SpecialString  */ {color:#4cbf99}\npre code span.st /* String         */ {color:#86b300}\npre code span.va /* Variable       */ {color:#55b4d4}\npre code span.vs /* VerbatimString */ {color:#86b300}\npre code span.wa /* Warning        */ {color:#f07171}\n"
  },
  {
    "path": "inst/highlight-styles/ayu-mirage.scss",
    "content": "pre {background-color: #1f2430;}\npre code         /* Normal         */ {color:#cbccc6}\npre code span.al /* Alert          */ {color:#ff3333; background-color:#332430; font-weight: bold}\npre code span.an /* Annotation     */ {color:#ffe6b3}\npre code span.at /* Attribute      */ {color:#73d0ff}\npre code span.bn /* BaseN          */ {color:#ffcc66}\npre code span.bu /* BuiltIn        */ {color:#95e6cb}\npre code span.cf /* ControlFlow    */ {color:#ffa759; font-weight: bold}\npre code span.ch /* Char           */ {color:#95e6cb}\npre code span.cn /* Constant       */ {color:#d4bfff}\npre code span.co /* Comment        */ {color:#5c6773; font-style: italic}\npre code span.cv /* CommentVar     */ {color:#d4bfff}\npre code span.do /* Documentation  */ {color:#5c6773}\npre code span.dt /* DataType       */ {color:#ffa759}\npre code span.dv /* DecVal         */ {color:#ffcc66}\npre code span.er /* Error          */ {color:#ff3333; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#73d0ff; font-weight: bold}\npre code span.fl /* Float          */ {color:#ffcc66}\npre code span.fu /* Function       */ {color:#ffd580}\npre code span.im /* Import         */ {color:#bae67e}\npre code span.in /* Information    */ {color:#ffcc66}\npre code span.kw /* Keyword        */ {color:#ffa759; font-weight: bold}\npre code span.op /* Operator       */ {color:#f29e74}\npre code span.ot /* Other          */ {color:#5ccfe6}\npre code span.pp /* Preprocessor   */ {color:#f28779}\npre code span.re /* RegionMarker   */ {color:#73d0ff; background-color:#2a4254}\npre code span.sc /* SpecialChar    */ {color:#95e6cb}\npre code span.ss /* SpecialString  */ {color:#95e6cb}\npre code span.st /* String         */ {color:#bae67e}\npre code span.va /* Variable       */ {color:#5ccfe6}\npre code span.vs /* VerbatimString */ {color:#bae67e}\npre code span.wa /* Warning        */ {color:#f28779}\n"
  },
  {
    "path": "inst/highlight-styles/breeze-dark.scss",
    "content": "pre {background-color: #232629;}\npre code         /* Normal         */ {color:#cfcfc2}\npre code span.al /* Alert          */ {color:#95da4c; background-color:#4d1f24; font-weight: bold}\npre code span.an /* Annotation     */ {color:#3f8058}\npre code span.at /* Attribute      */ {color:#2980b9}\npre code span.bn /* BaseN          */ {color:#f67400}\npre code span.bu /* BuiltIn        */ {color:#7f8c8d}\npre code span.cf /* ControlFlow    */ {color:#fdbc4b; font-weight: bold}\npre code span.ch /* Char           */ {color:#3daee9}\npre code span.cn /* Constant       */ {color:#27aeae; font-weight: bold}\npre code span.co /* Comment        */ {color:#7a7c7d}\npre code span.cv /* CommentVar     */ {color:#7f8c8d}\npre code span.do /* Documentation  */ {color:#a43340}\npre code span.dt /* DataType       */ {color:#2980b9}\npre code span.dv /* DecVal         */ {color:#f67400}\npre code span.er /* Error          */ {color:#da4453; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#0099ff; font-weight: bold}\npre code span.fl /* Float          */ {color:#f67400}\npre code span.fu /* Function       */ {color:#8e44ad}\npre code span.im /* Import         */ {color:#27ae60}\npre code span.in /* Information    */ {color:#c45b00}\npre code span.kw /* Keyword        */ {color:#cfcfc2; font-weight: bold}\npre code span.op /* Operator       */ {color:#3f8058}\npre code span.ot /* Others         */ {color:#27ae60}\npre code span.pp /* Preprocessor   */ {color:#27ae60}\npre code span.re /* RegionMarker   */ {color:#2980b9; background-color:#153042}\npre code span.sc /* SpecialChar    */ {color:#3daee9}\npre code span.ss /* SpecialString  */ {color:#da4453}\npre code span.st /* String         */ {color:#f44f4f}\npre code span.va /* Variable       */ {color:#27aeae}\npre code span.vs /* VerbatimString */ {color:#da4453}\npre code span.wa /* Warning        */ {color:#da4453}\n"
  },
  {
    "path": "inst/highlight-styles/breeze-light.scss",
    "content": "pre {background-color: #ffffff;}\npre code         /* Normal         */ {color:#1f1c1b}\npre code span.al /* Alert          */ {color:#bf0303; background-color:#f7e6e6; font-weight: bold}\npre code span.an /* Annotation     */ {color:#ca60ca}\npre code span.at /* Attribute      */ {color:#0057ae}\npre code span.bn /* BaseN          */ {color:#b08000}\npre code span.bu /* BuiltIn        */ {color:#644a9b; font-weight: bold}\npre code span.cf /* ControlFlow    */ {color:#1f1c1b; font-weight: bold}\npre code span.ch /* Char           */ {color:#924c9d}\npre code span.cn /* Constant       */ {color:#aa5500}\npre code span.co /* Comment        */ {color:#898887}\npre code span.cv /* CommentVar     */ {color:#0095ff}\npre code span.do /* Documentation  */ {color:#607880}\npre code span.dt /* DataType       */ {color:#0057ae}\npre code span.dv /* DecVal         */ {color:#b08000}\npre code span.er /* Error          */ {color:#bf0303; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#0095ff; font-weight: bold}\npre code span.fl /* Float          */ {color:#b08000}\npre code span.fu /* Function       */ {color:#644a9b}\npre code span.im /* Import         */ {color:#ff5500}\npre code span.in /* Information    */ {color:#b08000}\npre code span.kw /* Keyword        */ {color:#1f1c1b; font-weight: bold}\npre code span.op /* Operator       */ {color:#ca60ca}\npre code span.ot /* Others         */ {color:#006e28}\npre code span.pp /* Preprocessor   */ {color:#006e28}\npre code span.re /* RegionMarker   */ {color:#0057ae; background-color:#e0e9f8}\npre code span.sc /* SpecialChar    */ {color:#3daee9}\npre code span.ss /* SpecialString  */ {color:#ff5500}\npre code span.st /* String         */ {color:#bf0303}\npre code span.va /* Variable       */ {color:#0057ae}\npre code span.vs /* VerbatimString */ {color:#bf0303}\npre code span.wa /* Warning        */ {color:#bf0303}\n"
  },
  {
    "path": "inst/highlight-styles/breezedark.scss",
    "content": "pre {background-color: #232629; color: #cfcfc2;}\npre code         /* Normal         */ {color:#cfcfc2}\npre code span.al /* Alert          */ {color:#95da4c; background-color:#4d1f24; font-weight: bold}\npre code span.an /* Annotation     */ {color:#3f8058}\npre code span.at /* Attribute      */ {color:#2980b9}\npre code span.bn /* BaseN          */ {color:#f67400}\npre code span.bu /* BuiltIn        */ {color:#7f8c8d}\npre code span.cf /* ControlFlow    */ {color:#fdbc4b; font-weight: bold}\npre code span.ch /* Char           */ {color:#3daee9}\npre code span.cn /* Constant       */ {color:#27aeae; font-weight: bold}\npre code span.co /* Comment        */ {color:#7a7c7d}\npre code span.cv /* CommentVar     */ {color:#7f8c8d}\npre code span.do /* Documentation  */ {color:#a43340}\npre code span.dt /* DataType       */ {color:#2980b9}\npre code span.dv /* DecVal         */ {color:#f67400}\npre code span.er /* Error          */ {color:#da4453; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#0099ff; font-weight: bold}\npre code span.fl /* Float          */ {color:#f67400}\npre code span.fu /* Function       */ {color:#8e44ad}\npre code span.im /* Import         */ {color:#27ae60}\npre code span.in /* Information    */ {color:#c45b00}\npre code span.kw /* Keyword        */ {color:#cfcfc2; font-weight: bold}\npre code span.op /* Operator       */ {color:#cfcfc2}\npre code span.ot /* Other          */ {color:#27ae60}\npre code span.pp /* Preprocessor   */ {color:#27ae60}\npre code span.re /* RegionMarker   */ {color:#2980b9; background-color:#153042}\npre code span.sc /* SpecialChar    */ {color:#3daee9}\npre code span.ss /* SpecialString  */ {color:#da4453}\npre code span.st /* String         */ {color:#f44f4f}\npre code span.va /* Variable       */ {color:#27aeae}\npre code span.vs /* VerbatimString */ {color:#da4453}\npre code span.wa /* Warning        */ {color:#da4453}\n"
  },
  {
    "path": "inst/highlight-styles/dracula.scss",
    "content": "pre {background-color: #282a36;}\npre code         /* Normal         */ {color:#f8f8f2}\npre code span.al /* Alert          */ {color:#ff5555; font-weight: bold}\npre code span.an /* Annotation     */ {color:#ff79c6}\npre code span.at /* Attribute      */ {color:#ff79c6}\npre code span.bn /* BaseN          */ {color:#bd93f9}\npre code span.bu /* BuiltIn        */ {color:#8be9fd}\npre code span.cf /* ControlFlow    */ {color:#ff79c6}\npre code span.ch /* Char           */ {color:#f1fa8c}\npre code span.cn /* Constant       */ {color:#bd93f9; font-weight: bold}\npre code span.co /* Comment        */ {color:#6272a4}\npre code span.cv /* CommentVar     */ {color:#8be9fd}\npre code span.do /* Documentation  */ {color:#ffb86c}\npre code span.dt /* DataType       */ {color:#8be9fd; font-style: italic}\npre code span.dv /* DecVal         */ {color:#bd93f9}\npre code span.er /* Error          */ {color:#ff5555; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#8be9fd}\npre code span.fl /* Float          */ {color:#bd93f9}\npre code span.fu /* Function       */ {color:#50fa7b}\npre code span.im /* Import         */ {color:#ff79c6}\npre code span.in /* Information    */ {color:#f1fa8c}\npre code span.kw /* Keyword        */ {color:#ff79c6}\npre code span.op /* Operator       */ {color:#f8f8f2}\npre code span.ot /* Others         */ {color:#50fa7b}\npre code span.pp /* Preprocessor   */ {color:#ff79c6}\npre code span.re /* RegionMarker   */ {color:#8be9fd}\npre code span.sc /* SpecialChar    */ {color:#ff79c6}\npre code span.ss /* SpecialString  */ {color:#f1fa8c}\npre code span.st /* String         */ {color:#f1fa8c}\npre code span.va /* Variable       */ {color:#8be9fd}\npre code span.vs /* VerbatimString */ {color:#f1fa8c}\npre code span.wa /* Warning        */ {color:#ff5555}\n"
  },
  {
    "path": "inst/highlight-styles/espresso.scss",
    "content": "pre {background-color: #2a211c; color: #bdae9d;}\npre code span.al /* Alert          */ {color:#ffff00}\npre code span.an /* Annotation     */ {color:#0066ff; font-weight: bold; font-style: italic}\npre code span.at /* Attribute      */ {}\npre code span.bn /* BaseN          */ {color:#44aa43}\npre code span.bu /* BuiltIn        */ {}\npre code span.cf /* ControlFlow    */ {color:#43a8ed; font-weight: bold}\npre code span.ch /* Char           */ {color:#049b0a}\npre code span.cn /* Constant       */ {}\npre code span.co /* Comment        */ {color:#0066ff; font-weight: bold; font-style: italic}\npre code span.do /* Documentation  */ {color:#0066ff; font-style: italic}\npre code span.dt /* DataType       */ {text-decoration: underline}\npre code span.dv /* DecVal         */ {color:#44aa43}\npre code span.er /* Error          */ {color:#ffff00; font-weight: bold}\npre code span.ex /* Extension      */ {}\npre code span.fl /* Float          */ {color:#44aa43}\npre code span.fu /* Function       */ {color:#ff9358; font-weight: bold}\npre code span.im /* Import         */ {}\npre code span.in /* Information    */ {color:#0066ff; font-weight: bold; font-style: italic}\npre code span.kw /* Keyword        */ {color:#43a8ed; font-weight: bold}\npre code span.op /* Operator       */ {}\npre code span.pp /* Preprocessor   */ {font-weight: bold}\npre code span.sc /* SpecialChar    */ {color:#049b0a}\npre code span.ss /* SpecialString  */ {color:#049b0a}\npre code span.st /* String         */ {color:#049b0a}\npre code span.va /* Variable       */ {}\npre code span.vs /* VerbatimString */ {color:#049b0a}\npre code span.wa /* Warning        */ {color:#ffff00; font-weight: bold}\n"
  },
  {
    "path": "inst/highlight-styles/github-dark.scss",
    "content": "pre {background-color: #24292e;}\npre code         /* Normal         */ {color:#e1e4e8}\npre code span.al /* Alert          */ {color:#ff5555; font-weight: bold}\npre code span.an /* Annotation     */ {color:#6a737d}\npre code span.at /* Attribute      */ {color:#f97583}\npre code span.bn /* BaseN          */ {color:#79b8ff}\npre code span.bu /* BuiltIn        */ {color:#f97583}\npre code span.cf /* ControlFlow    */ {color:#f97583}\npre code span.ch /* Char           */ {color:#9ecbff}\npre code span.cn /* Constant       */ {color:#79b8ff}\npre code span.co /* Comment        */ {color:#6a737d}\npre code span.cv /* CommentVar     */ {color:#6a737d}\npre code span.do /* Documentation  */ {color:#6a737d}\npre code span.dt /* DataType       */ {color:#f97583}\npre code span.dv /* DecVal         */ {color:#79b8ff}\npre code span.er /* Error          */ {color:#ff5555; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#f97583; font-weight: bold}\npre code span.fl /* Float          */ {color:#79b8ff}\npre code span.fu /* Function       */ {color:#b392f0}\npre code span.im /* Import         */ {color:#9ecbff}\npre code span.in /* Information    */ {color:#6a737d}\npre code span.kw /* Keyword        */ {color:#f97583}\npre code span.op /* Operator       */ {color:#e1e4e8}\npre code span.ot /* Others         */ {color:#b392f0}\npre code span.pp /* Preprocessor   */ {color:#f97583}\npre code span.re /* RegionMarker   */ {color:#6a737d}\npre code span.sc /* SpecialChar    */ {color:#79b8ff}\npre code span.ss /* SpecialString  */ {color:#9ecbff}\npre code span.st /* String         */ {color:#9ecbff}\npre code span.va /* Variable       */ {color:#ffab70}\npre code span.vs /* VerbatimString */ {color:#9ecbff}\npre code span.wa /* Warning        */ {color:#ff5555}\n"
  },
  {
    "path": "inst/highlight-styles/github-light.scss",
    "content": "pre {background-color: #ffffff;}\npre code         /* Normal         */ {color:#24292e}\npre code span.al /* Alert          */ {color:#ff5555; font-weight: bold}\npre code span.an /* Annotation     */ {color:#6a737d}\npre code span.at /* Attribute      */ {color:#d73a49}\npre code span.bn /* BaseN          */ {color:#005cc5}\npre code span.bu /* BuiltIn        */ {color:#d73a49}\npre code span.cf /* ControlFlow    */ {color:#d73a49}\npre code span.ch /* Char           */ {color:#032f62}\npre code span.cn /* Constant       */ {color:#005cc5}\npre code span.co /* Comment        */ {color:#6a737d}\npre code span.cv /* CommentVar     */ {color:#6a737d}\npre code span.do /* Documentation  */ {color:#6a737d}\npre code span.dt /* DataType       */ {color:#d73a49}\npre code span.dv /* DecVal         */ {color:#005cc5}\npre code span.er /* Error          */ {color:#ff5555; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#d73a49; font-weight: bold}\npre code span.fl /* Float          */ {color:#005cc5}\npre code span.fu /* Function       */ {color:#6f42c1}\npre code span.im /* Import         */ {color:#032f62}\npre code span.in /* Information    */ {color:#6a737d}\npre code span.kw /* Keyword        */ {color:#d73a49}\npre code span.op /* Operator       */ {color:#24292e}\npre code span.ot /* Others         */ {color:#6f42c1}\npre code span.pp /* Preprocessor   */ {color:#d73a49}\npre code span.re /* RegionMarker   */ {color:#6a737d}\npre code span.sc /* SpecialChar    */ {color:#005cc5}\npre code span.ss /* SpecialString  */ {color:#032f62}\npre code span.st /* String         */ {color:#032f62}\npre code span.va /* Variable       */ {color:#e36209}\npre code span.vs /* VerbatimString */ {color:#032f62}\npre code span.wa /* Warning        */ {color:#ff5555}\n"
  },
  {
    "path": "inst/highlight-styles/gruvbox-dark.scss",
    "content": "pre {background-color: #282828;}\npre code         /* Normal         */ {color:#ebdbb2}\npre code span.al /* Alert          */ {color:#282828; background-color:#cc241d; font-weight: bold}\npre code span.an /* Annotation     */ {color:#98971a}\npre code span.at /* Attribute      */ {color:#d79921}\npre code span.bn /* BaseN          */ {color:#f67400}\npre code span.bu /* BuiltIn        */ {color:#d65d0e}\npre code span.cf /* ControlFlow    */ {color:#cc241d; font-weight: bold}\npre code span.ch /* Char           */ {color:#b16286}\npre code span.cn /* Constant       */ {color:#b16286; font-weight: bold}\npre code span.co /* Comment        */ {color:#928374}\npre code span.cv /* CommentVar     */ {color:#928374}\npre code span.do /* Documentation  */ {color:#98971a}\npre code span.dt /* DataType       */ {color:#d79921}\npre code span.dv /* DecVal         */ {color:#f67400}\npre code span.er /* Error          */ {color:#cc241d; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#689d6a; font-weight: bold}\npre code span.fl /* Float          */ {color:#f67400}\npre code span.fu /* Function       */ {color:#689d6a}\npre code span.im /* Import         */ {color:#689d6a}\npre code span.in /* Information    */ {color:#282828; background-color:#83a598}\npre code span.kw /* Keyword        */ {color:#ebdbb2; font-weight: bold}\npre code span.op /* Operator       */ {color:#ebdbb2}\npre code span.ot /* Others         */ {color:#689d6a}\npre code span.pp /* Preprocessor   */ {color:#d65d0e}\npre code span.re /* RegionMarker   */ {color:#928374; background-color:#1d2021}\npre code span.sc /* SpecialChar    */ {color:#b16286}\npre code span.ss /* SpecialString  */ {color:#98971a}\npre code span.st /* String         */ {color:#98971a}\npre code span.va /* Variable       */ {color:#458588}\npre code span.vs /* VerbatimString */ {color:#98971a}\npre code span.wa /* Warning        */ {color:#282828; background-color:#fabd2f}\n"
  },
  {
    "path": "inst/highlight-styles/gruvbox-light.scss",
    "content": "pre {background-color: #fbf1c7;}\npre code         /* Normal         */ {color:#3c3836}\npre code span.al /* Alert          */ {color:#282828; background-color:#cc241d; font-weight: bold}\npre code span.an /* Annotation     */ {color:#98971a}\npre code span.at /* Attribute      */ {color:#d79921}\npre code span.bn /* BaseN          */ {color:#f67400}\npre code span.bu /* BuiltIn        */ {color:#d65d0e}\npre code span.cf /* ControlFlow    */ {color:#cc241d; font-weight: bold}\npre code span.ch /* Char           */ {color:#b16286}\npre code span.cn /* Constant       */ {color:#b16286; font-weight: bold}\npre code span.co /* Comment        */ {color:#928374}\npre code span.cv /* CommentVar     */ {color:#928374}\npre code span.do /* Documentation  */ {color:#98971a}\npre code span.dt /* DataType       */ {color:#d79921}\npre code span.dv /* DecVal         */ {color:#f67400}\npre code span.er /* Error          */ {color:#cc241d; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#689d6a; font-weight: bold}\npre code span.fl /* Float          */ {color:#f67400}\npre code span.fu /* Function       */ {color:#689d6a}\npre code span.im /* Import         */ {color:#689d6a}\npre code span.in /* Information    */ {color:#282828; background-color:#83a598}\npre code span.kw /* Keyword        */ {color:#3c3836; font-weight: bold}\npre code span.op /* Operator       */ {color:#3c3836}\npre code span.ot /* Others         */ {color:#689d6a}\npre code span.pp /* Preprocessor   */ {color:#d65d0e}\npre code span.re /* RegionMarker   */ {color:#928374; background-color:#f9f5d7}\npre code span.sc /* SpecialChar    */ {color:#b16286}\npre code span.ss /* SpecialString  */ {color:#98971a}\npre code span.st /* String         */ {color:#98971a}\npre code span.va /* Variable       */ {color:#458588}\npre code span.vs /* VerbatimString */ {color:#98971a}\npre code span.wa /* Warning        */ {color:#282828; background-color:#fabd2f}\n"
  },
  {
    "path": "inst/highlight-styles/haddock.scss",
    "content": "pre code span.al /* Alert          */ {color:#ff0000}\npre code span.an /* Annotation     */ {color:#008000}\npre code span.at /* Attribute      */ {}\npre code span.bu /* BuiltIn        */ {}\npre code span.cf /* ControlFlow    */ {color:#0000ff}\npre code span.ch /* Char           */ {color:#008080}\npre code span.cn /* Constant       */ {}\npre code span.co /* Comment        */ {color:#008000}\npre code span.cv /* CommentVar     */ {color:#008000}\npre code span.do /* Documentation  */ {color:#008000}\npre code span.er /* Error          */ {color:#ff0000; font-weight: bold}\npre code span.ex /* Extension      */ {}\npre code span.im /* Import         */ {}\npre code span.in /* Information    */ {color:#008000}\npre code span.kw /* Keyword        */ {color:#0000ff}\npre code span.op /* Operator       */ {}\npre code span.ot /* Other          */ {color:#ff4000}\npre code span.pp /* Preprocessor   */ {color:#ff4000}\npre code span.sc /* SpecialChar    */ {color:#008080}\npre code span.ss /* SpecialString  */ {color:#008080}\npre code span.st /* String         */ {color:#008080}\npre code span.va /* Variable       */ {}\npre code span.vs /* VerbatimString */ {color:#008080}\npre code span.wa /* Warning        */ {color:#008000; font-weight: bold}\n"
  },
  {
    "path": "inst/highlight-styles/kate.scss",
    "content": "pre {background-color: #ffffff; color: #1f1c1b;}\npre code         /* Normal         */ {color:#1f1c1b}\npre code span.al /* Alert          */ {color:#bf0303; background-color:#f7e6e6; font-weight: bold}\npre code span.an /* Annotation     */ {color:#ca60ca}\npre code span.at /* Attribute      */ {color:#0057ae}\npre code span.bn /* BaseN          */ {color:#b08000}\npre code span.bu /* BuiltIn        */ {color:#644a9b; font-weight: bold}\npre code span.cf /* ControlFlow    */ {color:#1f1c1b; font-weight: bold}\npre code span.ch /* Char           */ {color:#924c9d}\npre code span.cn /* Constant       */ {color:#aa5500}\npre code span.co /* Comment        */ {color:#898887}\npre code span.cv /* CommentVar     */ {color:#0095ff}\npre code span.do /* Documentation  */ {color:#607880}\npre code span.dt /* DataType       */ {color:#0057ae}\npre code span.dv /* DecVal         */ {color:#b08000}\npre code span.er /* Error          */ {color:#bf0303; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#0095ff; font-weight: bold}\npre code span.fl /* Float          */ {color:#b08000}\npre code span.fu /* Function       */ {color:#644a9b}\npre code span.im /* Import         */ {color:#ff5500}\npre code span.in /* Information    */ {color:#b08000}\npre code span.kw /* Keyword        */ {color:#1f1c1b; font-weight: bold}\npre code span.op /* Operator       */ {color:#1f1c1b}\npre code span.ot /* Other          */ {color:#006e28}\npre code span.pp /* Preprocessor   */ {color:#006e28}\npre code span.re /* RegionMarker   */ {color:#0057ae; background-color:#e0e9f8}\npre code span.sc /* SpecialChar    */ {color:#3daee9}\npre code span.ss /* SpecialString  */ {color:#ff5500}\npre code span.st /* String         */ {color:#bf0303}\npre code span.va /* Variable       */ {color:#0057ae}\npre code span.vs /* VerbatimString */ {color:#bf0303}\npre code span.wa /* Warning        */ {color:#bf0303}\n"
  },
  {
    "path": "inst/highlight-styles/monochrome-dark.scss",
    "content": "pre {background-color: #000000; color: #FFFFFF;}\npre code         /* Normal         */ {color:#FFFFFF}\npre code span.al /* Alert          */ {color:#FFFFFF}\npre code span.an /* Annotation     */ {color:#FFFFFF; font-style: italic}\npre code span.at /* Attribute      */ {color:#FFFFFF}\npre code span.bn /* BaseN          */ {color:#FFFFFF}\npre code span.bu /* BuiltIn        */ {color:#FFFFFF}\npre code span.cf /* ControlFlow    */ {color:#FFFFFF}\npre code span.ch /* Char           */ {color:#FFFFFF}\npre code span.cn /* Constant       */ {color:#FFFFFF}\npre code span.co /* Comment        */ {color:#FFFFFF; font-style: italic}\npre code span.cv /* CommentVar     */ {color:#FFFFFF; font-style: italic}\npre code span.do /* Documentation  */ {color:#FFFFFF; font-style: italic}\npre code span.dt /* DataType       */ {color:#FFFFFF}\npre code span.dv /* DecVal         */ {color:#FFFFFF}\npre code span.er /* Error          */ {color:#FFFFFF}\npre code span.ex /* Extension      */ {color:#FFFFFF}\npre code span.fl /* Float          */ {color:#FFFFFF}\npre code span.fu /* Function       */ {color:#FFFFFF}\npre code span.im /* Import         */ {color:#FFFFFF}\npre code span.in /* Information    */ {color:#FFFFFF; font-style: italic}\npre code span.kw /* Keyword        */ {color:#FFFFFF}\npre code span.op /* Operator       */ {color:#FFFFFF}\npre code span.ot /* Other          */ {color:#FFFFFF}\npre code span.pp /* Preprocessor   */ {color:#FFFFFF}\npre code span.re /* RegionMarker   */ {color:#FFFFFF}\npre code span.sc /* SpecialChar    */ {color:#FFFFFF}\npre code span.ss /* SpecialString  */ {color:#FFFFFF}\npre code span.st /* String         */ {color:#FFFFFF}\npre code span.va /* Variable       */ {color:#FFFFFF}\npre code span.vs /* VerbatimString */ {color:#FFFFFF}\npre code span.wa /* Warning        */ {color:#FFFFFF; font-style: italic}\n"
  },
  {
    "path": "inst/highlight-styles/monochrome-light.scss",
    "content": "pre {background-color: #ffffff; color: #000000;}\npre code         /* Normal         */ {color:#000000}\npre code span.al /* Alert          */ {color:#000000}\npre code span.an /* Annotation     */ {color:#000000; font-style: italic}\npre code span.at /* Attribute      */ {color:#000000}\npre code span.bn /* BaseN          */ {color:#000000}\npre code span.bu /* BuiltIn        */ {color:#000000}\npre code span.cf /* ControlFlow    */ {color:#000000}\npre code span.ch /* Char           */ {color:#000000}\npre code span.cn /* Constant       */ {color:#000000}\npre code span.co /* Comment        */ {color:#000000; font-style: italic}\npre code span.cv /* CommentVar     */ {color:#000000; font-style: italic}\npre code span.do /* Documentation  */ {color:#000000; font-style: italic}\npre code span.dt /* DataType       */ {color:#000000}\npre code span.dv /* DecVal         */ {color:#000000}\npre code span.er /* Error          */ {color:#000000}\npre code span.ex /* Extension      */ {color:#000000}\npre code span.fl /* Float          */ {color:#000000}\npre code span.fu /* Function       */ {color:#000000}\npre code span.im /* Import         */ {color:#000000}\npre code span.in /* Information    */ {color:#000000; font-style: italic}\npre code span.kw /* Keyword        */ {color:#000000}\npre code span.op /* Operator       */ {color:#000000}\npre code span.ot /* Other          */ {color:#000000}\npre code span.pp /* Preprocessor   */ {color:#000000}\npre code span.re /* RegionMarker   */ {color:#000000}\npre code span.sc /* SpecialChar    */ {color:#000000}\npre code span.ss /* SpecialString  */ {color:#000000}\npre code span.st /* String         */ {color:#000000}\npre code span.va /* Variable       */ {color:#000000}\npre code span.vs /* VerbatimString */ {color:#000000}\npre code span.wa /* Warning        */ {color:#000000; font-style: italic}\n"
  },
  {
    "path": "inst/highlight-styles/monochrome.scss",
    "content": "pre code span.al /* Alert         */ {font-weight: bold}\npre code span.an /* Annotation    */ {font-style: italic}\npre code span.cf /* ControlFlow   */ {font-weight: bold}\npre code span.co /* Comment       */ {font-style: italic}\npre code span.cv /* CommentVar    */ {font-style: italic}\npre code span.do /* Documentation */ {font-style: italic}\npre code span.dt /* DataType      */ {text-decoration: underline}\npre code span.er /* Error         */ {font-weight: bold}\npre code span.in /* Information   */ {font-style: italic}\npre code span.kw /* Keyword       */ {font-weight: bold}\npre code span.pp /* Preprocessor  */ {font-weight: bold}\npre code span.wa /* Warning       */ {font-style: italic}\n"
  },
  {
    "path": "inst/highlight-styles/monokai.scss",
    "content": "pre {background-color: #2e3440;}\npre code         /* Normal         */ {color:#f8f8f2}\npre code span.al /* Alert          */ {color:#ff5555; font-weight: bold}\npre code span.an /* Annotation     */ {color:#75715e}\npre code span.at /* Attribute      */ {color:#f92672}\npre code span.bn /* BaseN          */ {color:#ae81ff}\npre code span.bu /* BuiltIn        */ {color:#66D9EF}\npre code span.cf /* ControlFlow    */ {color:#f92672}\npre code span.ch /* Char           */ {color:#e6db74}\npre code span.cn /* Constant       */ {color:#ae81ff}\npre code span.co /* Comment        */ {color:#75715e}\npre code span.cv /* CommentVar     */ {color:#75715e}\npre code span.do /* Documentation  */ {color:#75715e}\npre code span.dt /* DataType       */ {color:#66d9ef; font-style: italic}\npre code span.dv /* DecVal         */ {color:#ae81ff}\npre code span.er /* Error          */ {color:#ff5555; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#a6e22e; font-weight: bold}\npre code span.fl /* Float          */ {color:#ae81ff}\npre code span.fu /* Function       */ {color:#a6e22e}\npre code span.im /* Import         */ {color:#f92672}\npre code span.in /* Information    */ {color:#f1fa8c}\npre code span.kw /* Keyword        */ {color:#f92672}\npre code span.op /* Operator       */ {color:#f8f8f2}\npre code span.ot /* Others         */ {color:#a6e22e}\npre code span.pp /* Preprocessor   */ {color:#f92672}\npre code span.re /* RegionMarker   */ {color:#75715e}\npre code span.sc /* SpecialChar    */ {color:#ae81ff}\npre code span.ss /* SpecialString  */ {color:#e6db74}\npre code span.st /* String         */ {color:#e6db74}\npre code span.va /* Variable       */ {color:#f8f8f2}\npre code span.vs /* VerbatimString */ {color:#e6db74}\npre code span.wa /* Warning        */ {color:#ff5555}\n"
  },
  {
    "path": "inst/highlight-styles/nord.scss",
    "content": "pre {background-color: #2e3440;}\npre code         /* Normal         */ {color:#d8dee9}\npre code span.al /* Alert          */ {color:#bf616a; background-color:#3b4252; font-weight: bold}\npre code span.an /* Annotation     */ {color:#d08770}\npre code span.at /* Attribute      */ {color:#8fbcbb}\npre code span.bn /* BaseN          */ {color:#b48ead}\npre code span.bu /* BuiltIn        */ {color:#88c0d0; font-style: italic}\npre code span.cf /* ControlFlow    */ {color:#81a1c1; font-weight: bold}\npre code span.ch /* Char           */ {color:#ebcb8b}\npre code span.cn /* Constant       */ {color:#eceff4; font-weight: bold}\npre code span.co /* Comment        */ {color:#616e88}\npre code span.cv /* CommentVar     */ {color:#e5e9f0}\npre code span.do /* Documentation  */ {color:#5e81ac}\npre code span.dt /* DataType       */ {color:#81a1c1}\npre code span.dv /* DecVal         */ {color:#b48ead}\npre code span.er /* Error          */ {color:#bf616a; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#8fbcbb; font-weight: bold}\npre code span.fl /* Float          */ {color:#b48ead}\npre code span.fu /* Function       */ {color:#88c0d0}\npre code span.im /* Import         */ {color:#a3be8c}\npre code span.in /* Information    */ {color:#ebcb8b}\npre code span.kw /* Keyword        */ {color:#81a1c1; font-weight: bold}\npre code span.op /* Operator       */ {color:#81a1c1}\npre code span.ot /* Others         */ {color:#8fbcbb}\npre code span.pp /* Preprocessor   */ {color:#5e81ac}\npre code span.re /* RegionMarker   */ {color:#88c0d0; background-color:#3b4252}\npre code span.sc /* SpecialChar    */ {color:#ebcb8b}\npre code span.ss /* SpecialString  */ {color:#d08770}\npre code span.st /* String         */ {color:#a3be8c}\npre code span.va /* Variable       */ {color:#5e81ac}\npre code span.vs /* VerbatimString */ {color:#a3be8c}\npre code span.wa /* Warning        */ {color:#bf616a}\n"
  },
  {
    "path": "inst/highlight-styles/oblivion.scss",
    "content": "pre {background-color: #201f1f;}\npre code         /* Normal         */ {color:#d3d7c1}\npre code span.al /* Alert          */ {color:#e85848; background-color:#451e1a; font-weight: bold}\npre code span.an /* Annotation     */ {color:#ad7fa8}\npre code span.at /* Attribute      */ {color:#ad7fa8}\npre code span.bn /* BaseN          */ {color:#edd400}\npre code span.bu /* BuiltIn        */ {color:#729fcf}\npre code span.cf /* ControlFlow    */ {color:#ffffff; font-weight: bold}\npre code span.ch /* Char           */ {color:#ce5c00}\npre code span.cn /* Constant       */ {color:#edd400; font-weight: bold}\npre code span.co /* Comment        */ {color:#30a100}\npre code span.cv /* CommentVar     */ {color:#ad7fa8}\npre code span.do /* Documentation  */ {color:#4e9a06}\npre code span.dt /* DataType       */ {color:#508ed8}\npre code span.dv /* DecVal         */ {color:#edd400}\npre code span.er /* Error          */ {color:#e85848; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#508ed8; font-weight: bold}\npre code span.fl /* Float          */ {color:#ce5c00}\npre code span.fu /* Function       */ {color:#729fcf; font-weight: bold}\npre code span.im /* Import         */ {color:#ad7fa8}\npre code span.in /* Information    */ {color:#c0a25f}\npre code span.kw /* Keyword        */ {color:#ffffff; font-weight: bold}\npre code span.op /* Operator       */ {color:#eeeeec}\npre code span.ot /* Others         */ {color:#edd400}\npre code span.pp /* Preprocessor   */ {color:#ad7fa8}\npre code span.re /* RegionMarker   */ {color:#508ed8; background-color:#1c2c3f}\npre code span.sc /* SpecialChar    */ {color:#ce5c00}\npre code span.ss /* SpecialString  */ {color:#fce94f}\npre code span.st /* String         */ {color:#edd400}\npre code span.va /* Variable       */ {color:#ce5c00}\npre code span.vs /* VerbatimString */ {color:#c4a000}\npre code span.wa /* Warning        */ {color:#e85848}\n"
  },
  {
    "path": "inst/highlight-styles/printing.scss",
    "content": "pre {background-color: #ffffff;}\npre code         /* Normal         */ {color:#000000}\npre code span.al /* Alert          */ {color:#bf0303; background-color:#f7e6e6; font-weight: bold}\npre code span.an /* Annotation     */ {color:#ca60ca}\npre code span.at /* Attribute      */ {color:#0057ae}\npre code span.bn /* BaseN          */ {color:#b08000}\npre code span.bu /* BuiltIn        */ {color:#644a9b}\npre code span.cf /* ControlFlow    */ {color:#000000; font-weight: bold}\npre code span.ch /* Char           */ {color:#924c9d}\npre code span.cn /* Constant       */ {color:#aa5500}\npre code span.co /* Comment        */ {color:#898887}\npre code span.cv /* CommentVar     */ {color:#0095ff}\npre code span.do /* Documentation  */ {color:#607880}\npre code span.dt /* DataType       */ {color:#0057ae}\npre code span.dv /* DecVal         */ {color:#b08000}\npre code span.er /* Error          */ {color:#bf0303; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#0095ff; font-weight: bold}\npre code span.fl /* Float          */ {color:#b08000}\npre code span.fu /* Function       */ {color:#644a9b}\npre code span.im /* Import         */ {color:#644a9b}\npre code span.in /* Information    */ {color:#b08000}\npre code span.kw /* Keyword        */ {color:#000000; font-weight: bold}\npre code span.op /* Operator       */ {color:#000000}\npre code span.ot /* Others         */ {color:#006e28}\npre code span.pp /* Preprocessor   */ {color:#006e28}\npre code span.re /* RegionMarker   */ {color:#0057ae; background-color:#e0e9f8}\npre code span.sc /* SpecialChar    */ {color:#ff5500}\npre code span.ss /* SpecialString  */ {color:#ff5500}\npre code span.st /* String         */ {color:#bf0303}\npre code span.va /* Variable       */ {color:#0057ae}\npre code span.vs /* VerbatimString */ {color:#bf0303}\npre code span.wa /* Warning        */ {color:#bf0303}\n"
  },
  {
    "path": "inst/highlight-styles/pygments.scss",
    "content": "pre code span.al /* Alert          */ {color:#ff0000; font-weight: bold}\npre code span.an /* Annotation     */ {color:#60a0b0; font-weight: bold; font-style: italic}\npre code span.at /* Attribute      */ {color:#7d9029}\npre code span.bn /* BaseN          */ {color:#40a070}\npre code span.bu /* BuiltIn        */ {}\npre code span.cf /* ControlFlow    */ {color:#007020; font-weight: bold}\npre code span.ch /* Char           */ {color:#4070a0}\npre code span.cn /* Constant       */ {color:#880000}\npre code span.co /* Comment        */ {color:#60a0b0; font-style: italic}\npre code span.cv /* CommentVar     */ {color:#60a0b0; font-weight: bold; font-style: italic}\npre code span.do /* Documentation  */ {color:#ba2121; font-style: italic}\npre code span.dt /* DataType       */ {color:#902000}\npre code span.dv /* DecVal         */ {color:#40a070}\npre code span.er /* Error          */ {color:#ff0000; font-weight: bold}\npre code span.ex /* Extension      */ {}\npre code span.fl /* Float          */ {color:#40a070}\npre code span.fu /* Function       */ {color:#06287e}\npre code span.im /* Import         */ {}\npre code span.in /* Information    */ {color:#60a0b0; font-weight: bold; font-style: italic}\npre code span.kw /* Keyword        */ {color:#007020; font-weight: bold}\npre code span.op /* Operator       */ {color:#666666}\npre code span.ot /* Other          */ {color:#007020}\npre code span.pp /* Preprocessor   */ {color:#bc7a00}\npre code span.sc /* SpecialChar    */ {color:#4070a0}\npre code span.ss /* SpecialString  */ {color:#bb6688}\npre code span.st /* String         */ {color:#4070a0}\npre code span.va /* Variable       */ {color:#19177c}\npre code span.vs /* VerbatimString */ {color:#4070a0}\npre code span.wa /* Warning        */ {color:#60a0b0; font-weight: bold; font-style: italic}\n"
  },
  {
    "path": "inst/highlight-styles/radical.scss",
    "content": "pre code         /* Normal         */ {color:#7c9c9e}\npre code span.al /* Alert          */ {color:#ff427b; background-color:#2f183b; font-weight: bold}\npre code span.an /* Annotation     */ {color:#fda8bc}\npre code span.at /* Attribute      */ {color:#5af5f0}\npre code span.bn /* BaseN          */ {color:#f834bb}\npre code span.bu /* BuiltIn        */ {color:#999ee1}\npre code span.cf /* ControlFlow    */ {color:#d5358f; font-weight: bold}\npre code span.ch /* Char           */ {color:#dff959}\npre code span.cn /* Constant       */ {color:#fa61b8; font-weight: bold}\npre code span.co /* Comment        */ {color:#45898c; font-style: italic}\npre code span.cv /* CommentVar     */ {color:#a8c0c2}\npre code span.do /* Documentation  */ {color:#75b7bb}\npre code span.dt /* DataType       */ {color:#ff85a1}\npre code span.dv /* DecVal         */ {color:#fa61b8}\npre code span.er /* Error          */ {color:#ff427b; font-weight: bold; font-style: italic; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#a8ffdb; font-weight: bold}\npre code span.fl /* Float          */ {color:#f834bb}\npre code span.fu /* Function       */ {color:#a9fef7}\npre code span.im /* Import         */ {color:#a9fef7}\npre code span.in /* Information    */ {color:#ffd000}\npre code span.kw /* Keyword        */ {color:#d5358f; font-weight: bold}\npre code span.op /* Operator       */ {color:#d5358f}\npre code span.ot /* Others         */ {color:#5effbd}\npre code span.pp /* Preprocessor   */ {color:#d5358f}\npre code span.re /* RegionMarker   */ {color:#baf7fc; background-color:#242560}\npre code span.sc /* SpecialChar    */ {color:#c3f920}\npre code span.ss /* SpecialString  */ {color:#ff96aa}\npre code span.st /* String         */ {color:#a9fef7}\npre code span.va /* Variable       */ {color:#c7e3ee}\npre code span.vs /* VerbatimString */ {color:#a8ffdb}\npre code span.wa /* Warning        */ {color:#ff427b}\n"
  },
  {
    "path": "inst/highlight-styles/solarized-dark.scss",
    "content": "pre {background-color: #002b36;}\npre code         /* Normal         */ {color:#839496}\npre code span.al /* Alert          */ {color:#d33682; font-weight: bold}\npre code span.an /* Annotation     */ {color:#268bd2}\npre code span.at /* Attribute      */ {color:#268bd2}\npre code span.bn /* BaseN          */ {color:#2aa198}\npre code span.bu /* BuiltIn        */ {color:#cb4b16}\npre code span.cf /* ControlFlow    */ {color:#859900}\npre code span.ch /* Char           */ {color:#2aa198}\npre code span.cn /* Constant       */ {color:#2aa198; font-weight: bold}\npre code span.co /* Comment        */ {color:#586e75; font-style: italic}\npre code span.cv /* CommentVar     */ {color:#2aa198}\npre code span.do /* Documentation  */ {color:#dc322f}\npre code span.dt /* DataType       */ {color:#b58900}\npre code span.dv /* DecVal         */ {color:#2aa198}\npre code span.er /* Error          */ {color:#dc322f; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#268bd2}\npre code span.fl /* Float          */ {color:#2aa198}\npre code span.fu /* Function       */ {color:#268bd2}\npre code span.im /* Import         */ {color:#2aa198}\npre code span.in /* Information    */ {color:#b58900}\npre code span.kw /* Keyword        */ {color:#859900}\npre code span.op /* Operator       */ {color:#859900}\npre code span.ot /* Others         */ {color:#859900}\npre code span.pp /* Preprocessor   */ {color:#cb4b16}\npre code span.re /* RegionMarker   */ {color:#268bd2; background-color:#073642}\npre code span.sc /* SpecialChar    */ {color:#dc322f}\npre code span.ss /* SpecialString  */ {color:#dc322f}\npre code span.st /* String         */ {color:#2aa198}\npre code span.va /* Variable       */ {color:#268bd2}\npre code span.vs /* VerbatimString */ {color:#2aa198}\npre code span.wa /* Warning        */ {color:#cb4b16}\n"
  },
  {
    "path": "inst/highlight-styles/solarized-light.scss",
    "content": "pre {background-color: #fdf6e3;}\npre code         /* Normal         */ {color:#657b83}\npre code span.al /* Alert          */ {color:#d33682; font-weight: bold}\npre code span.an /* Annotation     */ {color:#268bd2}\npre code span.at /* Attribute      */ {color:#268bd2}\npre code span.bn /* BaseN          */ {color:#2aa198}\npre code span.bu /* BuiltIn        */ {color:#cb4b16}\npre code span.cf /* ControlFlow    */ {color:#859900; font-weight: bold}\npre code span.ch /* Char           */ {color:#2aa198}\npre code span.cn /* Constant       */ {color:#2aa198; font-weight: bold}\npre code span.co /* Comment        */ {color:#93a1a1; font-style: italic}\npre code span.cv /* CommentVar     */ {color:#2aa198}\npre code span.do /* Documentation  */ {color:#dc322f}\npre code span.dt /* DataType       */ {color:#b58900; font-weight: bold}\npre code span.dv /* DecVal         */ {color:#2aa198}\npre code span.er /* Error          */ {color:#dc322f; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#268bd2; font-weight: bold}\npre code span.fl /* Float          */ {color:#2aa198}\npre code span.fu /* Function       */ {color:#268bd2}\npre code span.im /* Import         */ {color:#2aa198}\npre code span.in /* Information    */ {color:#b58900}\npre code span.kw /* Keyword        */ {color:#859900; font-weight: bold}\npre code span.op /* Operator       */ {color:#859900}\npre code span.ot /* Others         */ {color:#859900}\npre code span.pp /* Preprocessor   */ {color:#cb4b16}\npre code span.re /* RegionMarker   */ {color:#268bd2; background-color:#eee8d5}\npre code span.sc /* SpecialChar    */ {color:#dc322f}\npre code span.ss /* SpecialString  */ {color:#dc322f}\npre code span.st /* String         */ {color:#2aa198}\npre code span.va /* Variable       */ {color:#268bd2}\npre code span.vs /* VerbatimString */ {color:#2aa198}\npre code span.wa /* Warning        */ {color:#cb4b16}\n"
  },
  {
    "path": "inst/highlight-styles/solarized.scss",
    "content": "pre {background-color: #fdf6e3;}\npre code         /* Normal         */ {color:#657b83}\npre code span.al /* Alert          */ {color:#d33682; font-weight: bold}\npre code span.an /* Annotation     */ {color:#268bd2}\npre code span.at /* Attribute      */ {color:#268bd2}\npre code span.bn /* BaseN          */ {color:#2aa198}\npre code span.bu /* BuiltIn        */ {color:#cb4b16}\npre code span.cf /* ControlFlow    */ {color:#859900; font-weight: bold}\npre code span.ch /* Char           */ {color:#2aa198}\npre code span.cn /* Constant       */ {color:#2aa198; font-weight: bold}\npre code span.co /* Comment        */ {color:#93a1a1; font-style: italic}\npre code span.cv /* CommentVar     */ {color:#2aa198}\npre code span.do /* Documentation  */ {color:#dc322f}\npre code span.dt /* DataType       */ {color:#b58900; font-weight: bold}\npre code span.dv /* DecVal         */ {color:#2aa198}\npre code span.er /* Error          */ {color:#dc322f; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#268bd2; font-weight: bold}\npre code span.fl /* Float          */ {color:#2aa198}\npre code span.fu /* Function       */ {color:#268bd2}\npre code span.im /* Import         */ {color:#2aa198}\npre code span.in /* Information    */ {color:#b58900}\npre code span.kw /* Keyword        */ {color:#859900; font-weight: bold}\npre code span.op /* Operator       */ {color:#859900}\npre code span.ot /* Others         */ {color:#859900}\npre code span.pp /* Preprocessor   */ {color:#cb4b16}\npre code span.re /* RegionMarker   */ {color:#268bd2; background-color:#eee8d5}\npre code span.sc /* SpecialChar    */ {color:#dc322f}\npre code span.ss /* SpecialString  */ {color:#dc322f}\npre code span.st /* String         */ {color:#2aa198}\npre code span.va /* Variable       */ {color:#268bd2}\npre code span.vs /* VerbatimString */ {color:#2aa198}\npre code span.wa /* Warning        */ {color:#cb4b16}\n"
  },
  {
    "path": "inst/highlight-styles/tango.scss",
    "content": "pre {background-color: #f8f8f8;}\npre code span.al /* Alert          */ {color:#ef2929}\npre code span.an /* Annotation     */ {color:#8f5902; font-weight: bold; font-style: italic}\npre code span.at /* Attribute      */ {color:#c4a000}\npre code span.bn /* BaseN          */ {color:#0000cf}\npre code span.cf /* ControlFlow    */ {color:#204a87; font-weight: bold}\npre code span.ch /* Char           */ {color:#4e9a06}\npre code span.cn /* Constant       */ {color:#000000}\npre code span.co /* Comment        */ {color:#8f5902; font-style: italic}\npre code span.cv /* CommentVar     */ {color:#8f5902; font-weight: bold; font-style: italic}\npre code span.do /* Documentation  */ {color:#8f5902; font-weight: bold; font-style: italic}\npre code span.dt /* DataType       */ {color:#204a87}\npre code span.dv /* DecVal         */ {color:#0000cf}\npre code span.er /* Error          */ {color:#a40000; font-weight: bold}\npre code span.ex /* Extension      */ {}\npre code span.fl /* Float          */ {color:#0000cf}\npre code span.fu /* Function       */ {color:#000000}\npre code span.im /* Import         */ {}\npre code span.in /* Information    */ {color:#8f5902; font-weight: bold; font-style: italic}\npre code span.kw /* Keyword        */ {color:#204a87; font-weight: bold}\npre code span.op /* Operator       */ {color:#ce5c00; font-weight: bold}\npre code span.ot /* Other          */ {color:#8f5902}\npre code span.pp /* Preprocessor   */ {color:#8f5902; font-style: italic}\npre code span.sc /* SpecialChar    */ {color:#000000}\npre code span.ss /* SpecialString  */ {color:#4e9a06}\npre code span.st /* String         */ {color:#4e9a06}\npre code span.va /* Variable       */ {color:#000000}\npre code span.vs /* VerbatimString */ {color:#4e9a06}\npre code span.wa /* Warning        */ {color:#8f5902; font-weight: bold; font-style: italic}\n"
  },
  {
    "path": "inst/highlight-styles/vim-dark.scss",
    "content": "pre {background-color: #000000;}\npre code         /* Normal         */ {color:#b2b2b2}\npre code span.al /* Alert          */ {color:#ff0000; background-color:#3f0000; font-weight: bold}\npre code span.an /* Annotation     */ {color:#ff00ff}\npre code span.at /* Attribute      */ {color:#ffffaf}\npre code span.bn /* BaseN          */ {color:#ff8b8b}\npre code span.bu /* BuiltIn        */ {color:#87ffaf; font-weight: bold}\npre code span.cf /* ControlFlow    */ {color:#ffff54; font-weight: bold}\npre code span.ch /* Char           */ {color:#ff5454}\npre code span.cn /* Constant       */ {color:#af7f00; font-weight: bold}\npre code span.co /* Comment        */ {color:#54ffff}\npre code span.cv /* CommentVar     */ {color:#0095ff}\npre code span.do /* Documentation  */ {color:#e0ffff}\npre code span.dt /* DataType       */ {color:#ffff54}\npre code span.dv /* DecVal         */ {color:#ff8b8b}\npre code span.er /* Error          */ {color:#ff5500; text-decoration: underline}\npre code span.ex /* Extension      */ {color:#0095ff; font-weight: bold}\npre code span.fl /* Float          */ {color:#ff8b8b}\npre code span.fu /* Function       */ {color:#cd00cd}\npre code span.im /* Import         */ {color:#ff54ff}\npre code span.in /* Information    */ {color:#ffaa00}\npre code span.kw /* Keyword        */ {color:#5fd7ff; font-weight: bold}\npre code span.op /* Operator       */ {color:#b2b2b2}\npre code span.ot /* Others         */ {color:#54ff54}\npre code span.pp /* Preprocessor   */ {color:#87ffaf}\npre code span.re /* RegionMarker   */ {color:#0095ff; background-color:#22226d}\npre code span.sc /* SpecialChar    */ {color:#0095ff}\npre code span.ss /* SpecialString  */ {color:#ff5500}\npre code span.st /* String         */ {color:#ff54ff}\npre code span.va /* Variable       */ {color:#06989a}\npre code span.vs /* VerbatimString */ {color:#ff54ff}\npre code span.wa /* Warning        */ {color:#ff0000}\n"
  },
  {
    "path": "inst/highlight-styles/zenburn.scss",
    "content": "pre {background-color: #303030; color: #cccccc;}\npre code span.al /* Alert          */ {color:#ffcfaf}\npre code span.an /* Annotation     */ {color:#7f9f7f; font-weight: bold}\npre code span.at /* Attribute      */ {}\npre code span.bn /* BaseN          */ {color:#dca3a3}\npre code span.bu /* BuiltIn        */ {}\npre code span.cf /* ControlFlow    */ {color:#f0dfaf}\npre code span.ch /* Char           */ {color:#dca3a3}\npre code span.cn /* Constant       */ {color:#dca3a3; font-weight: bold}\npre code span.co /* Comment        */ {color:#7f9f7f}\npre code span.cv /* CommentVar     */ {color:#7f9f7f; font-weight: bold}\npre code span.do /* Documentation  */ {color:#7f9f7f}\npre code span.dt /* DataType       */ {color:#dfdfbf}\npre code span.dv /* DecVal         */ {color:#dcdccc}\npre code span.er /* Error          */ {color:#c3bf9f}\npre code span.ex /* Extension      */ {}\npre code span.fl /* Float          */ {color:#c0bed1}\npre code span.fu /* Function       */ {color:#efef8f}\npre code span.im /* Import         */ {}\npre code span.in /* Information    */ {color:#7f9f7f; font-weight: bold}\npre code span.kw /* Keyword        */ {color:#f0dfaf}\npre code span.op /* Operator       */ {color:#f0efd0}\npre code span.ot /* Other          */ {color:#efef8f}\npre code span.pp /* Preprocessor   */ {color:#ffcfaf; font-weight: bold}\npre code span.sc /* SpecialChar    */ {color:#dca3a3}\npre code span.ss /* SpecialString  */ {color:#cc9393}\npre code span.st /* String         */ {color:#cc9393}\npre code span.va /* Variable       */ {}\npre code span.vs /* VerbatimString */ {color:#cc9393}\npre code span.wa /* Warning        */ {color:#7f9f7f; font-weight: bold}\n"
  },
  {
    "path": "inst/quarto/template.html",
    "content": "<!-- Based on https://github.com/quarto-dev/quarto-cli/blob/main/src/resources/formats/html/pandoc/template.html -->\n<!DOCTYPE html>\n<html lang=\"$lang$\">\n<head>\n  <title>$pagetitle$</title>\n  <!-- Needed for testing but not used in final output -->\n  <style>\n    $styles.html()$\n  </style>\n$for(css)$\n  <link rel=\"stylesheet\" href=\"$css$\" />\n$endfor$\n$for(header-includes)$\n  $header-includes$\n$endfor$\n</head>\n<body>\n\n<div class=\"includes-before\">\n$for(include-before)$\n$include-before$\n$endfor$\n</div>\n\n<div class=\"meta\">\n$if(title)$\n  <h1>$title$</h1>\n$endif$\n\n$if(subtitle)$\n  <p class=\"subtitle\">$subtitle$</p>\n$endif$\n\n$for(author)$\n  <p class=\"author\">$author$</p>\n$endfor$\n\n$if(date)$\n  <p class=\"date\">$date$</p>\n$endif$\n\n$if(abstract)$\n  <div class=\"abstract\">\n  $abstract$\n  </div>\n$endif$\n\n</div>\n\n<main>\n$body$\n</main>\n\n<div class=\"includes-after\">\n$for(include-after)$\n$include-after$\n$endfor$\n</div>\n\n</body>\n</html>\n"
  },
  {
    "path": "inst/rstudio/addins.dcf",
    "content": "Name: Build full site\nDescription: Build website for current package\nBinding: build_site\nInteractive: true\n"
  },
  {
    "path": "man/as_pkgdown.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/package.R\n\\name{as_pkgdown}\n\\alias{as_pkgdown}\n\\title{Generate pkgdown data structure}\n\\usage{\nas_pkgdown(pkg = \".\", override = list())\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{override}{An optional named list used to temporarily override\nvalues in \\verb{_pkgdown.yml}}\n}\n\\description{\nYou will generally not need to use this unless you need a custom site\ndesign and you're writing your own equivalent of \\code{\\link[=build_site]{build_site()}}.\n}\n"
  },
  {
    "path": "man/build_articles.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/build-articles.R, R/build-article.R\n\\name{build_articles}\n\\alias{build_articles}\n\\alias{build_article}\n\\alias{build_articles_index}\n\\title{Build articles section}\n\\usage{\nbuild_articles(\n  pkg = \".\",\n  quiet = TRUE,\n  lazy = TRUE,\n  seed = 1014L,\n  override = list(),\n  preview = FALSE\n)\n\nbuild_article(\n  name,\n  pkg = \".\",\n  lazy = FALSE,\n  seed = 1014L,\n  new_process = TRUE,\n  pandoc_args = character(),\n  override = list(),\n  quiet = TRUE\n)\n\nbuild_articles_index(pkg = \".\", override = list())\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{quiet}{Set to \\code{FALSE} to display output of knitr and\npandoc. This is useful when debugging.}\n\n\\item{lazy}{If \\code{TRUE}, will only re-build article if input file has been\nmodified more recently than the output file.}\n\n\\item{seed}{Seed used to initialize random number generation in order to\nmake article output reproducible. An integer scalar or \\code{NULL} for no seed.}\n\n\\item{override}{An optional named list used to temporarily override\nvalues in \\verb{_pkgdown.yml}}\n\n\\item{preview}{If \\code{TRUE}, or \\code{is.na(preview) && interactive()}, will preview\nfreshly generated section in browser.}\n\n\\item{name}{Name of article to render. This should be either a path\nrelative to \\verb{vignettes/} \\emph{without extension}, or \\code{index} or \\code{README}.}\n\n\\item{new_process}{Build the article in a clean R process? The default,\n\\code{TRUE}, ensures that every article is build in a fresh environment, but\nyou may want to set it to \\code{FALSE} to make debugging easier.}\n\n\\item{pandoc_args}{Pass additional arguments to pandoc. Used for testing.}\n}\n\\description{\n\\code{build_articles()} renders each R Markdown file underneath \\verb{vignettes/} and\nsaves it to \\verb{articles/}. There are two exceptions:\n\\itemize{\n\\item Files that start with \\verb{_} (e.g., \\verb{_index.Rmd}) are ignored,\nenabling the use of child documents.\n\\item Files in \\code{vignettes/tutorials} are handled by \\code{\\link[=build_tutorials]{build_tutorials()}}\n}\n\nVignettes are rendered using a special document format that reconciles\n\\code{\\link[rmarkdown:html_document]{rmarkdown::html_document()}} with the pkgdown template. This means articles\nbehave slightly differently to vignettes, particularly with respect to\nexternal files, and custom output formats. See below for more details.\n\nNote that when you run \\code{build_articles()} directly (outside of\n\\code{\\link[=build_site]{build_site()}}) vignettes will use the currently installed version of the\npackage, not the current source version. This makes iteration quicker when\nyou are primarily working on the text of an article.\n}\n\\section{Index and navbar}{\nYou can control the articles index and navbar with a \\code{articles} field in\nyour \\verb{_pkgdown.yml}. If you use it, pkgdown will check that all articles\nare included, and will error if you have missed any.\n\nThe \\code{articles} field defines a list of sections, each of which\ncan contain four fields:\n\\itemize{\n\\item \\code{title} (required): title of section, which appears as a heading on the\narticles index.\n\\item \\code{desc} (optional): An optional markdown description displayed underneath\nthe section title.\n\\item \\code{navbar} (optional): A couple of words used to label this section in\nthe navbar. If omitted, this section of vignettes will not appear in the\nnavbar.\n\\item \\code{contents} (required): a list of article names to include in the\nsection. This can either be names of individual vignettes or a\ncall to \\code{starts_with()}. The name of a vignette includes its\npath under \\code{vignettes} without extension so that the name of the vignette\nfound at \\code{vignettes/pizza/slice.Rmd} is \\code{pizza/slice}.\n}\n\nThe title and description of individual vignettes displayed on the index\ncomes from \\code{title} and \\code{description} fields of the YAML header in the Rmds.\n\nFor example, this yaml might be used for some version of dplyr:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{articles:\n- title: Main verbs\n  navbar: ~\n  contents:\n  - one-table\n  - two-table\n  - rowwise\n  - colwise\n\n- title: Developer\n  desc: Vignettes aimed at package developers\n  contents:\n  - programming\n  - packages\n}\\if{html}{\\out{</div>}}\n\nNote the use of the \\code{navbar} fields. \\verb{navbar: ~} means that the \"Main verbs\"\nwill appear in the navbar without a heading; the absence of the \\code{navbar}\nfield in the developer vignettes means that they will only be\naccessible via the articles index.\n\nThe navbar will include a link to the articles index if one or more\nvignettes are not available through the navbar. If some vignettes appear\nin the navbar drop-down list and others do not, the list will automatically\ninclude a \"More ...\" link at the bottom; if no vignettes appear in the\nthe navbar, it will link directly to the articles index instead of\nproviding a drop-down.\n\\subsection{Get started}{\n\nNote that a vignette with the same name as the package (e.g.,\n\\code{vignettes/pkgdown.Rmd} or \\code{vignettes/articles/pkgdown.Rmd}) automatically\nbecomes a top-level \"Get started\" link, and will not appear in the articles\ndrop-down.\n\n(If your package name includes a \\code{.}, e.g. \\code{pack.down}, use a \\code{-} in the\nvignette name, e.g. \\code{pack-down.Rmd}.)\n}\n\n\\subsection{Missing articles}{\n\npkgdown will warn if there are (non-internal) articles that aren't listed\nin the articles index. You can suppress such warnings by listing the\naffected articles in a section with \\code{title: internal} (case sensitive);\nthis section will not be displayed on the index page.\n}\n\n\\subsection{External articles}{\n\nYou can link to arbitrary additional articles by adding an\n\\code{external-articles} entry to \\verb{_pkgdown.yml}. It should contain an array\nof objects with fields \\code{name}, \\code{title}, \\code{href}, and \\code{description}.\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{external-articles:\n- name: subsampling\n  title: Subsampling for Class Imbalances\n  description: Improve model performance in imbalanced data sets through undersampling or oversampling.\n  href: https://www.tidymodels.org/learn/models/sub-sampling/\n}\\if{html}{\\out{</div>}}\n\nIf you've defined a custom articles index, you'll need to include the name\nin one of the \\code{contents} fields.\n}\n}\n\n\\section{External files}{\npkgdown differs from base R in its handling of external files. When building\nvignettes, R assumes that vignettes are self-contained (a reasonable\nassumption when most vignettes were PDFs) and only copies files explicitly\nlisted in \\code{.install_extras}. pkgdown takes a different approach based on\n\\code{\\link[rmarkdown:find_external_resources]{rmarkdown::find_external_resources()}}, and it will also copy any images that\nyou link to. If for some reason the automatic detection doesn't work, you\nwill need to add a \\code{resource_files} field to the yaml metadata, e.g.:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{---\ntitle: My Document\nresource_files:\n  - data/mydata.csv\n  - images/figure.png\n---\n}\\if{html}{\\out{</div>}}\n\nNote that you can not use the \\code{fig.path} to change the output directory of\ngenerated figures as its default value is a strong assumption of rmarkdown.\n}\n\n\\section{Embedding Shiny apps}{\nIf you would like to embed a Shiny app into an article, the app will have\nto be hosted independently, (e.g. \\url{https://www.shinyapps.io}). Then, you\ncan embed the app into your article using an \\verb{<iframe>}, e.g.\n\\verb{<iframe src = \"https://gallery.shinyapps.io/083-front-page\" class=\"shiny-app\">}.\n\nSee \\url{https://github.com/r-lib/pkgdown/issues/838#issuecomment-430473856} for\nsome hints on how to customise the appearance with CSS.\n}\n\n\\section{Output formats}{\nBy default, pkgdown builds all articles using the\n\\code{\\link[rmarkdown:html_document]{rmarkdown::html_document()}} \\code{output} format, ignoring whatever is set in\nyour YAML metadata. This is necessary because pkgdown has to integrate the\nHTML/CSS/JS from the vignette with the HTML/CSS/JS from rest of the site.\nBecause of the challenges of combining two sources of HTML/CSS/JS, there is\nlimited support for other output formats and you have to opt-in by setting\nthe \\code{as_is} field in your \\code{.Rmd} metadata:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{pkgdown:\n  as_is: true\n}\\if{html}{\\out{</div>}}\n\nIf the output format produces a PDF, you'll also need to specify the\n\\code{extension} field:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{pkgdown:\n  as_is: true\n  extension: pdf\n}\\if{html}{\\out{</div>}}\n\nTo work with pkgdown, the output format must accept \\code{template}, \\code{theme}, and\n\\code{self_contained} arguments, and must work without any additional CSS or\nJSS files. Note that if you use\n\\href{https://bookdown.org/yihui/rmarkdown/html-document.html#shared-options}{\\verb{_output.yml}}\nor \\href{https://rmarkdown.rstudio.com/docs/reference/render_site.html}{\\verb{_site.yml}}\nyou'll still need to add \\code{as_is: true} to each individual vignette.\n\nAdditionally, htmlwidgets do not work when \\code{as_is: true}.\n}\n\n\\section{Suppressing vignettes}{\nIf you want \\href{https://r-pkgs.org/vignettes.html#sec-vignettes-article}{articles}\nthat are not vignettes, use \\code{usethis::use_article()} to create it. An articles link will be\nautomatically added to the default navbar if the vignettes directory is\npresent: if you do not want this, you will need to customise the navbar. See\n\\code{\\link[=build_site]{build_site()}} details.\n}\n\n\\section{Figures}{\nYou can control the default rendering of figures by specifying the \\code{figures}\nfield in \\verb{_pkgdown.yml}. The default settings are equivalent to:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{figures:\n  dev: ragg::agg_png\n  dpi: 96\n  dev.args: []\n  fig.ext: png\n  fig.width: 7.2916667\n  fig.height: ~\n  fig.retina: 2\n  fig.asp: 1.618\n  bg: NA\n  other.parameters: []\n}\\if{html}{\\out{</div>}}\n\nMost of these parameters are interpreted similarly to knitr chunk\noptions. \\code{other.parameters} is a list of parameters\nthat will be available to custom graphics output devices such\nas HTML widgets.\n}\n\n\\seealso{\nOther site components: \n\\code{\\link{build_home}()},\n\\code{\\link{build_llm_docs}()},\n\\code{\\link{build_news}()},\n\\code{\\link{build_reference}()},\n\\code{\\link{build_tutorials}()}\n}\n\\concept{site components}\n"
  },
  {
    "path": "man/build_favicons.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/build-favicons.R\n\\name{build_favicons}\n\\alias{build_favicons}\n\\title{Initialise favicons from package logo}\n\\usage{\nbuild_favicons(pkg = \".\", overwrite = FALSE)\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{overwrite}{If \\code{TRUE}, re-create favicons from package logo.}\n}\n\\description{\nThis function auto-detects the location of your package logo (with the name\n\\code{logo.svg} (recommended format) or \\code{logo.png}, created with \\code{usethis::use_logo()})\nand runs it through the \\url{https://realfavicongenerator.net} API to build a\ncomplete set of favicons with different sizes, as needed for modern web usage.\n\nYou only need to run the function once. The favicon set will be stored in\n\\code{pkgdown/favicon} and copied by \\code{\\link[=init_site]{init_site()}} to the relevant location when\nthe website is rebuilt.\n\nOnce complete, you should add \\verb{pkgdown/} to \\code{.Rbuildignore } to avoid a NOTE\nduring package checking. (\\code{usethis::use_logo()} does this for you!)\n}\n"
  },
  {
    "path": "man/build_home.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/build-home.R, R/build-home-index.R\n\\name{build_home}\n\\alias{build_home}\n\\alias{build_home_index}\n\\title{Build home section}\n\\usage{\nbuild_home(pkg = \".\", override = list(), preview = FALSE, quiet = TRUE)\n\nbuild_home_index(pkg = \".\", override = list(), quiet = TRUE)\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{override}{An optional named list used to temporarily override\nvalues in \\verb{_pkgdown.yml}}\n\n\\item{preview}{If \\code{TRUE}, or \\code{is.na(preview) && interactive()}, will preview\nfreshly generated section in browser.}\n\n\\item{quiet}{Set to \\code{FALSE} to display output of knitr and\npandoc. This is useful when debugging.}\n}\n\\description{\n\\code{build_home()} function generates pages at the top-level of the site\nincluding:\n\\itemize{\n\\item The home page\n\\item HTML files from any \\code{.md} files in \\verb{./} or \\verb{.github/}.\n\\item The authors page (from \\code{DESCRIPTION})\n\\item The citation page (from \\code{inst/CITATION}, if present).\n\\item The license page\n\\item A default 404 page if \\verb{.github/404.md} is not found.\n}\n\n\\code{build_home_index()} rebuilds just the index page; it's useful for rapidly\niterating when experimenting with site styles.\n}\n\\section{Home page}{\nThe main content of the home page (\\code{index.html}) is generated from\n\\code{pkgdown/index.md}, \\code{index.md}, or \\code{README.md}, in that order.\nMost packages will use \\code{README.md} because that's also displayed by GitHub\nand CRAN. Use \\code{index.md} if you want your package website to look\ndifferent to your README, and use \\code{pkgdown/index.md} if you don't want that\nfile to live in your package root directory.\n\nIf you use \\code{index.Rmd} or \\code{README.Rmd} it's your responsibility to knit\nthe document to create the corresponding \\code{.md}. pkgdown does not do this\nfor you because it only touches files in the \\verb{doc/} directory.\n\nExtra markdown files in the base directory (e.g. \\code{ROADMAP.md}) or in\n\\verb{.github/} (e.g. \\code{CODE_OF_CONDUCT.md}) are copied by \\code{build_home()} to \\verb{docs/} and converted to HTML.\n\nThe home page also features a sidebar with information extracted from the\npackage. You can tweak it via the configuration file, to help make the home\npage an as informative as possible landing page.\n\\subsection{Images and figures}{\n\nIf you want to include images in your \\code{README.md}, they must be stored\nsomewhere in the package so that they can be displayed on the CRAN website.\nThe best place to put them is \\code{man/figures}. If you are generating figures\nwith R Markdown, make sure you set up \\code{fig.path} as followed:\n\n\\if{html}{\\out{<div class=\"sourceCode r\">}}\\preformatted{knitr::opts_chunk$set(\n  fig.path = \"man/figures/\"\n)\n}\\if{html}{\\out{</div>}}\n\nThis should usually go in a chunk with \\code{include = FALSE}.\n\n\\if{html}{\\out{<div class=\"sourceCode markdown\">}}\\preformatted{```\\{r chunk-name, include=FALSE\\}`r ''`\nknitr::opts_chunk$set(\n  fig.path = \"man/figures/\"\n)\n```\n}\\if{html}{\\out{</div>}}\n}\n\n\\subsection{Package logo}{\n\nIf you have a package logo, you can include it at the top of your README\nin a level-one heading:\n\n\\if{html}{\\out{<div class=\"sourceCode markdown\">}}\\preformatted{# pkgdown <img src=\"man/figures/logo.png\" align=\"right\" />\n}\\if{html}{\\out{</div>}}\n\n\\code{\\link[=init_site]{init_site()}} will also automatically create a favicon set from your package logo.\n}\n\n\\subsection{YAML config - title and description}{\n\nBy default, the page title and description are extracted automatically from\nthe \\code{Title} and \\code{Description} fields \\code{DESCRIPTION} (stripping single quotes\noff quoted words). CRAN ensures that these fields don't contain phrases\nlike \"R package\" because that's obvious on CRAN. To make your package more\nfindable on search engines, it's good practice to override the \\code{title} and\n\\code{description}, thinking about what people might search for:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{home:\n  title: An R package for pool-noodle discovery\n  description: >\n    Do you love R? Do you love pool-noodles? If so, you might enjoy\n    using this package to automatically discover and add pool-noodles\n    to your growing collection.\n}\\if{html}{\\out{</div>}}\n\n(Note the use of YAML's \\code{>} i.e. \"YAML pipes\"; this is a convenient way of\nwriting paragraphs of text.)\n}\n\n\\subsection{Dev badges}{\n\npkgdown identifies badges in three ways:\n\\itemize{\n\\item Any image-containing links between \\verb{<!-- badges: start -->} and\n\\verb{<!-- badges: end -->}, as e.g. created by \\code{usethis::use_readme_md()}\nor \\code{usethis::use_readme_rmd()}. There should always be an empty line after\nthe \\verb{<!-- badges: end -->} line. If you divide badges into paragraphs,\nmake sure to add an empty line before the \\verb{<!-- badges: end -->} line.\n\\item Any image-containing links within \\verb{<div id=\"badges\"></div>}.\n\\item Within the first paragraph, if it only contains image-containing links.\n}\n\nIdentified badges are \\strong{removed} from the \\emph{main content}.\nThey are shown or not in the \\emph{sidebar} depending on the development mode and\nsidebar customization, see the sidebar section.\n}\n}\n\n\\section{Authors}{\nBy default, pkgdown will display author information in three places:\n\\itemize{\n\\item the sidebar,\n\\item the left part side of the footer,\n\\item the author page.\n}\n\nThis documentation describes how to customise the overall author display.\nSee \\code{?build_home} and \\code{?build_site} for details about changing the location\nof the authors information within the home sidebar and the site footer.\n\\subsection{Authors ORCID, ROR and bio}{\n\nAuthor ORCID identification numbers in the \\code{DESCRIPTION} are linked using\nthe ORCID logo,\nauthor ROR identification numbers are linked using the ROR logo:\n\n\\if{html}{\\out{<div class=\"sourceCode r\">}}\\preformatted{Authors@R: c(\n    person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\"),\n      comment = c(ORCID = \"0000-0003-4757-117X\")\n    ),\n    person(\"Jay\", \"Hesselberth\", role = \"aut\",\n      comment = c(ORCID = \"0000-0002-6299-179X\")\n    ),\n   person(\"Posit Software, PBC\", role = c(\"cph\", \"fnd\"),\n          comment = c(ROR = \"03wc8by49\"))\n  )\n}\\if{html}{\\out{</div>}}\n\nIf you want to add more details about authors or their involvement with the\npackage, you can use the comment field, which will be rendered on the\nauthors page.\n\n\\if{html}{\\out{<div class=\"sourceCode r\">}}\\preformatted{Authors@R: c(\n    person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\"),\n      comment = c(ORCID = \"0000-0003-4757-117X\", \"Indenter-in-chief\")\n    ),\n    person(\"Jay\", \"Hesselberth\", role = \"aut\",\n      comment = c(ORCID = \"0000-0002-6299-179X\")\n    )\n  )\n}\\if{html}{\\out{</div>}}\n}\n\n\\subsection{Additional control via YAML}{\n\nYou can control additional aspects of the authors display via the \\code{authors}\nYAML field:\n\\itemize{\n\\item display of each author in the footer, sidebar and authors page,\n\\item which authors (by role) are displayed in the sidebar and footer,\n\\item text before authors in the footer,\n\\item text before and after authors in the sidebar,\n\\item text before and after authors on the authors page.\n}\n\nYou can modify how each author's name is displayed by adding a subsection\nfor \\code{authors}. Each entry in \\code{authors} should be named the author's name\n(matching \\code{DESCRIPTION}) and can contain \\code{href} and/or \\code{html} fields:\n\\itemize{\n\\item If \\code{href} is provided, the author's name will be linked to this URL.\n\\item If \\code{html} is provided, it will be shown instead of the author's name.\nThis is particularly useful if you want to display the logo of a corporate\nsponsor. Use an absolute URL to an image, not a relative link. Use an empty\nalternative text rather than no alternative text so a screen-reader would\nskip over it.\n}\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{authors:\n  firstname lastname:\n    href: \"http://name-website.com\"\n    html: \"<img src='https://website.com/name-picture.png' width=72 alt=''>\"\n}\\if{html}{\\out{</div>}}\n\nBy default, the \"developers\" list shown in the sidebar and footer is\npopulated by the maintainer (\"cre\"), authors (\"aut\"), and funder (\"fnd\")\nfrom the \\code{DESCRIPTION}. You could choose other roles for filtering.\nWith the configuration below:\n\\itemize{\n\\item only the maintainer and funder(s) appear in the footer, after the text\n\"Crafted by\",\n\\item all authors and contributors appear in the sidebar,\n\\item the authors list on the sidebar is preceded and followed by some text,\n\\item the authors list on the authors page is preceded and followed by some text.\n}\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{authors:\n  footer:\n    roles: [cre, fnd]\n    text: \"Crafted by\"\n  sidebar:\n    roles: [aut, ctb]\n    before: \"So *who* does the work?\"\n    after: \"Thanks all!\"\n  before: \"This package is proudly brought to you by:\"\n  after: \"See the [changelog](news/index.html) for other contributors. :pray:\"\n}\\if{html}{\\out{</div>}}\n\nIf you want to filter authors based on something else than their roles,\nconsider using a custom sidebar/footer component\n(see \\code{?build_home}/\\code{?build_site}, respectively).\n}\n}\n\n\\section{Sidebar}{\nYou can customise the homepage sidebar with the \\code{home.sidebar} field.\nIt's made up of two pieces: \\code{structure}, which defines the overall layout,\nand \\code{components}, which defines what each piece looks like. This organisation\nmakes it easy to mix and match the pkgdown defaults with your own\ncustomisations.\n\nThis is the default structure:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{home:\n  sidebar:\n    structure: [links, license, community, citation, authors, dev]\n}\\if{html}{\\out{</div>}}\n\nThese are drawn from seven built-in components:\n\\itemize{\n\\item \\code{links}: automated links generated from \\code{URL} and \\code{BugReports} fields\nfrom \\code{DESCRIPTION} plus manual links from the \\code{home.links} field:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{home:\n  links:\n  - text: Link text\n    href: https://website.com\n  - text: Roadmap\n    href: /roadmap.html\n}\\if{html}{\\out{</div>}}\n\\item \\code{license}: Licensing information if \\code{LICENSE}/\\code{LICENCE} or\n\\code{LICENSE.md}/\\code{LICENCE.md} files are present.\n\\item \\code{community}: links to to \\code{.github/CONTRIBUTING.md},\n\\code{.github/CODE_OF_CONDUCT.md}, etc.\n\\item \\code{citation}: link to package citation information. Uses either\n\\code{inst/CITATION} or, if absent, information from the \\code{DESCRIPTION}.\n\\item \\code{authors}: selected authors from the \\code{DESCRIPTION}.\n\\item \\code{dev}: development status badges extracted from \\code{README.md}/\\code{index.md}.\nThis is only shown for \"development\" versions of websites; see\n\"Development mode\" in \\code{?build_site} for details.\n\\item \\code{toc}: a table of contents for the README (not shown by default).\n}\n\nYou can also add your own components, where \\code{text} is markdown text:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{home:\n  sidebar:\n    structure: [authors, custom, toc, dev]\n    components:\n      custom:\n        title: Funding\n        text: We are *grateful* for funding!\n}\\if{html}{\\out{</div>}}\n\nAlternatively, you can provide a ready-made sidebar HTML:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{home:\n  sidebar:\n    html: path-to-sidebar.html\n}\\if{html}{\\out{</div>}}\n\nOr completely remove it:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{home:\n  sidebar: FALSE\n}\\if{html}{\\out{</div>}}\n}\n\n\\seealso{\nOther site components: \n\\code{\\link{build_articles}()},\n\\code{\\link{build_llm_docs}()},\n\\code{\\link{build_news}()},\n\\code{\\link{build_reference}()},\n\\code{\\link{build_tutorials}()}\n}\n\\concept{site components}\n"
  },
  {
    "path": "man/build_llm_docs.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/build-llm.R\n\\name{build_llm_docs}\n\\alias{build_llm_docs}\n\\title{Build docs for LLMs}\n\\usage{\nbuild_llm_docs(pkg = \".\")\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n}\n\\description{\n\\code{build_llm_docs()} creates an \\code{LLMs.txt} at the root of your site\nthat contains the contents of your \\code{README.md}, your reference index,\nand your articles index. It also creates a \\code{.md} file for every existing\n\\code{.html} file in your site. Together, this gives an LLM an overview of your\npackage and the ability to find out more by following links.\n\nIf you don't want these files generated for your site, you can opt-out by\nadding the following to your \\code{pkgdown.yml}:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{llm-docs: false\n}\\if{html}{\\out{</div>}}\n}\n\\seealso{\nOther site components: \n\\code{\\link{build_articles}()},\n\\code{\\link{build_home}()},\n\\code{\\link{build_news}()},\n\\code{\\link{build_reference}()},\n\\code{\\link{build_tutorials}()}\n}\n\\concept{site components}\n"
  },
  {
    "path": "man/build_news.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/build-news.R\n\\name{build_news}\n\\alias{build_news}\n\\title{Build news section}\n\\usage{\nbuild_news(pkg = \".\", override = list(), preview = FALSE)\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{override}{An optional named list used to temporarily override\nvalues in \\verb{_pkgdown.yml}}\n\n\\item{preview}{If \\code{TRUE}, or \\code{is.na(preview) && interactive()}, will preview\nfreshly generated section in browser.}\n}\n\\description{\nA \\code{NEWS.md} will be broken up into versions using level one (\\verb{#}) or\nlevel two headings (\\verb{##}) that (partially) match one of the following forms\n(ignoring case):\n\\itemize{\n\\item \\verb{\\{package name\\} 1.3.0}\n\\item \\verb{\\{package name\\} v1.3.0}\n\\item \\verb{Version 1.3.0}\n\\item \\verb{Changes in 1.3.0}\n\\item \\verb{Changes in v1.3.0}\n}\n}\n\\details{\nA \\href{https://style.tidyverse.org/news.html}{common structure} for news files\nis to use a top level heading for each release, and use a second level\nheading to break up individual bullets into sections.\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{# foofy 1.0.0\n\n## Major changes\n\n* Can now work with all grooveable grobbles!\n\n## Minor improvements and bug fixes\n\n* Printing scrobbles no longer errors (@githubusername, #100)\n\n* Wibbles are now 55\\% less jibbly (#200)\n}\\if{html}{\\out{</div>}}\n\nIssues and contributors will be automatically linked to the corresponding\npages on GitHub if the GitHub repo can be discovered from the \\code{DESCRIPTION}\n(typically from a \\code{URL} entry containing \\code{github.com})\n\nIf a version is available on CRAN, the release date will automatically\nbe added to the heading (see below for how to suppress); if not\navailable on CRAN, \"Unreleased\" will be added.\n}\n\\section{YAML config}{\nTo automatically link to release announcements, include a \\code{releases}\nsection.\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{news:\n releases:\n - text: \"usethis 1.3.0\"\n   href: https://www.tidyverse.org/articles/2018/02/usethis-1-3-0/\n - text: \"usethis 1.0.0 (and 1.1.0)\"\n   href: https://www.tidyverse.org/articles/2017/11/usethis-1.0.0/\n}\\if{html}{\\out{</div>}}\n\nControl whether news is present on one page or multiple pages with the\n\\code{one_page} field. The default is \\code{true}.\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{news:\n  one_page: false\n}\\if{html}{\\out{</div>}}\n\nSuppress the default addition of CRAN release dates with:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{news:\n  cran_dates: false\n}\\if{html}{\\out{</div>}}\n}\n\n\\seealso{\n\\href{https://style.tidyverse.org/news.html}{Tidyverse style for News}\n\nOther site components: \n\\code{\\link{build_articles}()},\n\\code{\\link{build_home}()},\n\\code{\\link{build_llm_docs}()},\n\\code{\\link{build_reference}()},\n\\code{\\link{build_tutorials}()}\n}\n\\concept{site components}\n"
  },
  {
    "path": "man/build_redirects.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/build-redirects.R\n\\name{build_redirects}\n\\alias{build_redirects}\n\\title{Build redirects}\n\\usage{\nbuild_redirects(pkg = \".\", override = list())\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{override}{An optional named list used to temporarily override\nvalues in \\verb{_pkgdown.yml}}\n}\n\\description{\nIf you change the structure of your documentation (by renaming vignettes or\nhelp topics) you can setup redirects from the old content to the new content.\nOne or several now-absent pages can be redirected to a new page (or to a new\nsection of a new page). This works by creating a html page that performs a\n\"meta refresh\", which isn't the best way of doing a redirect but works\neverywhere that you might deploy your site.\n\nThe syntax is the following, with old paths on the left, and new paths or\nURLs on the right.\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{redirects:\n  - [\"articles/old-vignette-name.html\", \"articles/new-vignette-name.html\"]\n  - [\"articles/another-old-vignette-name.html\", \"articles/new-vignette-name.html\"]\n  - [\"articles/yet-another-old-vignette-name.html\", \"https://pkgdown.r-lib.org/dev\"]\n}\\if{html}{\\out{</div>}}\n\nIf for some reason you choose to redirect an existing page make sure to\nexclude it from the search index, see \\code{?build_search}.\n}\n"
  },
  {
    "path": "man/build_reference.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/build-reference.R\n\\name{build_reference}\n\\alias{build_reference}\n\\alias{build_reference_index}\n\\title{Build reference section}\n\\usage{\nbuild_reference(\n  pkg = \".\",\n  lazy = TRUE,\n  examples = TRUE,\n  run_dont_run = FALSE,\n  seed = 1014L,\n  override = list(),\n  preview = FALSE,\n  devel = TRUE,\n  topics = NULL\n)\n\nbuild_reference_index(pkg = \".\", override = list())\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{lazy}{If \\code{TRUE}, only rebuild pages where the \\code{.Rd}\nis more recent than the \\code{.html}. This makes it much easier to\nrapidly prototype. It is set to \\code{FALSE} by \\code{\\link[=build_site]{build_site()}}.}\n\n\\item{examples}{Run examples?}\n\n\\item{run_dont_run}{Run examples that are surrounded in \\\\dontrun?}\n\n\\item{seed}{Seed used to initialize random number generation in order to\nmake article output reproducible. An integer scalar or \\code{NULL} for no seed.}\n\n\\item{override}{An optional named list used to temporarily override\nvalues in \\verb{_pkgdown.yml}}\n\n\\item{preview}{If \\code{TRUE}, or \\code{is.na(preview) && interactive()}, will preview\nfreshly generated section in browser.}\n\n\\item{devel}{Determines how code is loaded in order to run examples.\nIf \\code{TRUE} (the default), assumes you are in a live development\nenvironment, and loads source package with \\code{\\link[pkgload:load_all]{pkgload::load_all()}}.\nIf \\code{FALSE}, uses the installed version of the package.}\n\n\\item{topics}{Build only specified topics. If supplied, sets \\code{lazy}\nand \\code{preview} to \\code{FALSE}.}\n}\n\\description{\nBy default, pkgdown will generate an index that lists all functions in\nalphabetical order. To override this, provide a \\code{reference} section in your\n\\verb{_pkgdown.yml} as described below.\n}\n\\section{Reference index}{\nTo tweak the index page, add a section called \\code{reference} to \\verb{_pkgdown.yml}.\nIt can contain three different types of element:\n\\itemize{\n\\item A \\strong{title} (\\code{title} + \\code{desc}), which generates an row containing an \\verb{<h2>}\nwith optional paragraph description.\n\\item A \\strong{subtitle} (\\code{subtitle} + \\code{desc}), which generates an row containing an\n\\verb{<h3>} with optional paragraph description.\n\\item A \\strong{list of topics} (\\code{contents}), which generates one row for each topic,\nwith a list of aliases for the topic on the left, and the topic title\non the right.\n}\n\n(For historical reasons you can include \\code{contents} with a title or\nsubtitle, but this is no longer recommended).\n\nMost packages will only need to use \\code{title} and \\code{contents} components.\nFor example, here's a snippet from the YAML that pkgdown uses to generate\nits own reference index:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{reference:\n- title: Build\n  desc:  Build a complete site or its individual section components.\n- contents:\n  - starts_with(\"build_\")\n- title: Templates\n- contents:\n  - template_navbar\n  - render_page\n}\\if{html}{\\out{</div>}}\n\nBigger packages, e.g. ggplot2, may need an additional layer of\nstructure in order to clearly organise large number of functions:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{reference:\n- title: Layers\n- subtitle: Geoms\n  desc: Geom is short for geometric element\n- contents:\n  - starts_with(\"geom\")\n- subtitle: Stats\n  desc: Statistical transformations transform data before display.\n  contents:\n  - starts_with(\"stat\")\n}\\if{html}{\\out{</div>}}\n\n\\code{desc} can use markdown, and if you have a long description it's a good\nidea to take advantage of the YAML \\code{>} notation:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{desc: >\n  This is a very _long_ and **overly** flowery description of a\n  single simple function. By using `>`, it's easy to write a description\n  that runs over multiple lines.\n}\\if{html}{\\out{</div>}}\n\\subsection{Topic matching}{\n\n\\code{contents} can contain:\n\\itemize{\n\\item Individual function/topic names.\n\\item Weirdly named functions with doubled quoting, once for YAML and once for\nR, e.g. \\code{\"`+.gg`\"}.\n\\item \\code{starts_with(\"prefix\")} to select all functions with common prefix.\n\\item \\code{ends_with(\"suffix\")} to select all functions with common suffix.\n\\item \\code{matches(\"regexp\")} for more complex regular expressions.\n\\item \\code{has_keyword(\"x\")} to select all topics with keyword \"x\";\n\\code{has_keyword(\"datasets\")} selects all data documentation.\n\\item \\code{has_concept(\"blah\")} to select all topics with concept \"blah\".\nIf you are using roxygen2, \\code{has_concept()} also matches family tags, because\nroxygen2 converts them to concept tags.\n\\item \\code{lacks_concepts(c(\"concept1\", \"concept2\"))} to select all topics\nwithout those concepts. This is useful to capture topics not otherwise\ncaptured by \\code{has_concepts()}.\n\\item Topics from other installed packages, e.g. \\code{rlang::is_installed()} (function name)\nor \\code{sass::font_face} (topic name).\n\\item \\code{has_lifecycle(\"deprecated\")} will select all topics with lifecycle\ndeprecated.\n}\n\nAll functions (except for \\code{has_keyword()}) automatically exclude internal\ntopics (i.e. those with \\verb{\\\\keyword\\{internal\\}}). You can choose to include\nwith (e.g.) \\code{starts_with(\"build_\", internal = TRUE)}.\n\nUse a leading \\code{-} to remove topics from a section, e.g. \\code{-topic_name},\n\\code{-starts_with(\"foo\")}.\n\npkgdown will check that all non-internal topics are included on\nthe reference index page, and error if you have missed any.\n}\n\n\\subsection{Missing topics}{\n\npkgdown will warn if there are (non-internal) topics that not listed\nin the reference index. You can suppress these warnings by listing the\ntopics in section with \"title: internal\" (case sensitive) which will not be\ndisplayed on the reference index.\n}\n\n\\subsection{Icons}{\n\nYou can optionally supply an icon for each help topic. To do so, you'll need\na top-level \\code{icons} directory. This should contain \\code{.png} files that are\neither 30x30 (for regular display) or 60x60 (if you want retina display).\nIcons are matched to topics by aliases.\n}\n}\n\n\\section{Examples}{\nIf you need to run extra code before or after all examples are run, you\ncan create \\code{pkgdown/pre-reference.R} and \\code{pkgdown/post-reference.R}.\n}\n\n\\section{Figures}{\nYou can control the default rendering of figures by specifying the \\code{figures}\nfield in \\verb{_pkgdown.yml}. The default settings are equivalent to:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{figures:\n  dev: ragg::agg_png\n  dpi: 96\n  dev.args: []\n  fig.ext: png\n  fig.width: 7.2916667\n  fig.height: ~\n  fig.retina: 2\n  fig.asp: 1.618\n  bg: NA\n  other.parameters: []\n}\\if{html}{\\out{</div>}}\n\nMost of these parameters are interpreted similarly to knitr chunk\noptions. \\code{other.parameters} is a list of parameters\nthat will be available to custom graphics output devices such\nas HTML widgets.\n}\n\n\\seealso{\nOther site components: \n\\code{\\link{build_articles}()},\n\\code{\\link{build_home}()},\n\\code{\\link{build_llm_docs}()},\n\\code{\\link{build_news}()},\n\\code{\\link{build_tutorials}()}\n}\n\\concept{site components}\n"
  },
  {
    "path": "man/build_search.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/build-search-docs.R\n\\name{build_search}\n\\alias{build_search}\n\\title{Build search index}\n\\usage{\nbuild_search(pkg = \".\", override = list())\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{override}{An optional named list used to temporarily override\nvalues in \\verb{_pkgdown.yml}}\n}\n\\description{\nGenerate a JSON search index from the built site. This is used by\n\\href{https://www.fusejs.io/}{fuse.js} to provide a javascript powered search for\nBS5 powered pkgdown sites.\n\nNB: \\code{build_search()} is called automatically by \\code{\\link[=build_site]{build_site()}}; you don't\nneed call it yourself. This page documents how it works and its customisation\noptions.\n}\n\\section{YAML config}{\nYou can exclude some paths from the search index using \\code{search.exclude}.\nBelow we exclude the changelog from the search index:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{search:\n  exclude: ['news/index.html']\n}\\if{html}{\\out{</div>}}\n}\n\n\\section{Debugging}{\nIf search is not working, run \\code{pkgdown::pkgdown_sitrep()} to eliminate\ncommon issues such as the absence of URL in the pkgdown configuration file\nof your package.\n}\n\n"
  },
  {
    "path": "man/build_site.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/build.R\n\\name{build_site}\n\\alias{build_site}\n\\title{Build a complete pkgdown website}\n\\usage{\nbuild_site(\n  pkg = \".\",\n  examples = TRUE,\n  run_dont_run = FALSE,\n  seed = 1014L,\n  lazy = FALSE,\n  override = list(),\n  preview = NA,\n  devel = FALSE,\n  new_process = !devel,\n  install = !devel,\n  quiet = TRUE\n)\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{examples}{Run examples?}\n\n\\item{run_dont_run}{Run examples that are surrounded in \\\\dontrun?}\n\n\\item{seed}{Seed used to initialize random number generation in order to\nmake article output reproducible. An integer scalar or \\code{NULL} for no seed.}\n\n\\item{lazy}{If \\code{TRUE}, will only rebuild articles and reference pages\nif the source is newer than the destination.}\n\n\\item{override}{An optional named list used to temporarily override\nvalues in \\verb{_pkgdown.yml}}\n\n\\item{preview}{If \\code{TRUE}, or \\code{is.na(preview) && interactive()}, will preview\nfreshly generated section in browser.}\n\n\\item{devel}{Use development or deployment process?\n\nIf \\code{TRUE}, uses lighter-weight process suitable for rapid\niteration; it will run examples and vignettes in the current process,\nand will load code with \\code{pkgload::load_all()}.\n\nIf \\code{FALSE}, will first install the package to a temporary library,\nand will run all examples and vignettes in a new process.\n\n\\code{build_site()} defaults to \\code{devel = FALSE} so that you get high fidelity\noutputs when you building the complete site; \\code{build_reference()},\n\\code{build_home()} and friends default to \\code{devel = TRUE} so that you can\nrapidly iterate during development.}\n\n\\item{new_process}{If \\code{TRUE}, will run \\code{build_site()} in a separate process.\nThis enhances reproducibility by ensuring nothing that you have loaded\nin the current process affects the build process.}\n\n\\item{install}{If \\code{TRUE}, will install the package in a temporary library\nso it is available for vignettes.}\n\n\\item{quiet}{If \\code{FALSE}, generate build messages for build functions that\ntake \\code{quiet} arguments.}\n}\n\\description{\n\\code{build_site()} is a convenient wrapper around six functions:\n\\itemize{\n\\item \\code{\\link[=init_site]{init_site()}}\n\\item \\code{\\link[=build_home]{build_home()}}\n\\item \\code{\\link[=build_reference]{build_reference()}}\n\\item \\code{\\link[=build_articles]{build_articles()}}\n\\item \\code{\\link[=build_tutorials]{build_tutorials()}}\n\\item \\code{\\link[=build_news]{build_news()}}\n\\item \\code{\\link[=build_redirects]{build_redirects()}}\n\\item \\code{\\link[=build_llm_docs]{build_llm_docs()}}\n}\n\nSee the documentation for the each function to learn how to control\nthat aspect of the site. This page documents options that affect the\nwhole site.\n}\n\\section{General config}{\n\\itemize{\n\\item \\code{destination} controls where the site will be generated, defaulting to\n\\verb{docs/}. Paths are relative to the package root.\n\\item \\code{url} is optional, but strongly recommended.\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{url: https://pkgdown.r-lib.org\n}\\if{html}{\\out{</div>}}\n\nIt specifies where the site will be published and is used to allow other\npkgdown sites to link to your site when needed (\\code{vignette(\"linking\")}),\ngenerate a \\code{sitemap.xml}, automatically generate a \\code{CNAME} when\n\\link[=build_site_github_pages]{deploying to github}, generate the metadata needed\nrich social \"media cards\" (\\code{vignette(\"metadata\")}), and more.\n\\item \\code{title} overrides the default site title, which is the package name.\nIt's used in the page title and default navbar.\n}\n}\n\n\\section{Navbar and footer}{\nThe \\code{navbar} and \\code{footer} fields control the appearance of the navbar\nfooter which appear on every page. Learn more about these fields in\n\\code{vignette(\"customise\")}.\n}\n\n\\section{Development mode}{\nThe \\code{development} field allows you to generate different sites for the\ndevelopment and released versions of your package. To use it, you first\nneed to set the development \\code{mode}:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{development:\n  mode: auto\n}\\if{html}{\\out{</div>}}\n\\subsection{Setting development mode}{\n\nThe development \\code{mode} of a site controls where the built site is placed\nand how it is styled (i.e. the colour of the package version in the\nnavbar, the version tooltip), and whether or not the site is indexed by\nsearch engines. There are four possible modes:\n\\itemize{\n\\item \\strong{automatic} (\\code{mode: auto}): determines the mode based on the version:\n\\itemize{\n\\item \\verb{0.0.0.9000} (\\verb{0.0.0.*}): unreleased.\n\\item four version components: development.\n\\item everything else -> release.\n}\n\\item \\strong{release} (\\code{mode: release}), the default. Site is written to \\verb{docs/}\nand styled like a released package, even if the content is for an\nunreleased or development version. Version in navbar gets the default\ncolouring. Development badges are not shown in the sidebar\n(see \\code{?build_home}).\n\\item \\strong{development} (\\code{mode: devel}). Site is written to \\verb{docs/dev/}.\nThe navbar version gets a \"danger\" class and a tooltip stating these are\ndocs for an in-development version of the package. The \\code{noindex} meta tag\nis used to ensure that these packages are not indexed by search engines.\nDevelopment badges are shown in the sidebar (see \\code{?build_home}).\n\\item \\strong{unreleased} (\\code{mode: unreleased}). Site is written to \\verb{docs/}.\nVersion in navbar gets the \"danger\" class, and a message indicating the\npackage is not yet on CRAN.\nDevelopment badges are shown in the sidebar (see \\code{?build_home}).\n}\n\nUse \\code{mode: auto} if you want both a released and a dev site, and\n\\code{mode: release} if you just want a single site. It is very rare that you\nwill need either devel or unreleased modes.\n\nYou can override the mode specified in the \\verb{_pkgdown.yml} by setting\nby setting \\code{PKGDOWN_DEV_MODE} to \\code{devel} or \\code{release}.\n}\n\n\\subsection{Selective HTML}{\n\nYou can selectively show HTML only on the devel or release site by adding\nclass \\code{pkgdown-devel} or \\code{pkgdown-release}. This is most easily accessed\nfrom \\code{.Rmd} files where you can use pandoc's \\verb{<div>} syntax to control\nwhere a block of markdown will display. For example, you can use the\nfollowing markdown in your README to only show GitHub install instructions\non the development version of your site:\n\n\\if{html}{\\out{<div class=\"sourceCode md\">}}\\preformatted{::: \\{.pkgdown-devel\\}\nYou can install the development version of pkgdown from GitHub with:\n`remotes::install_github(\"r-lib/pkgdown\")`\n:::\n}\\if{html}{\\out{</div>}}\n\nYou can use a similar technique to control where badges are displayed.\nThis markdown show the CRAN status badge on the site for the released\npackage and the GitHub check status for the development package:\n\n\\if{html}{\\out{<div class=\"sourceCode md\">}}\\preformatted{[![CRAN Status](https://www.r-pkg.org/badges/version/pkgdown)]\n  (https://cran.r-project.org/package=pkgdown)\\{.pkgdown-release\\}\n[![R-CMD-check](https://github.com/r-lib/pkgdown/workflows/R-CMD-check/badge.svg)]\n  (https://github.com/r-lib/pkgdown/actions)\\{.pkgdown-devel\\}\n}\\if{html}{\\out{</div>}}\n}\n\n\\subsection{Other options}{\n\nThere are three other options that you can control:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{development:\n  destination: dev\n  version_label: danger\n  version_tooltip: \"Custom message here\"\n}\\if{html}{\\out{</div>}}\n\n\\code{destination} allows you to override the default subdirectory used for the\ndevelopment site; it defaults to \\verb{dev/}. \\code{version_label} allows you to\noverride the style used for development (and unreleased) versions of the\npackage. It defaults to \"danger\", but you can set to \"default\", \"info\", or\n\"warning\" instead. (The precise colours are determined by your bootstrap\ntheme, but become progressively more eye catching as you go from default\nto danger). Finally, you can choose to override the default tooltip with\n\\code{version_tooltip}.\n}\n}\n\n\\section{Template}{\nThe \\code{template} field is mostly used to control the appearance of the site.\nSee \\code{vignette(\"customise\")} for details. But it's also used to control\n\\subsection{Other aspects}{\n\nThere are a few other \\code{template} fields that control other aspects of the\nsite:\n\\itemize{\n\\item \\code{noindex: true} will suppress indexing of your pages by search engines:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{template:\n  params:\n    noindex: true\n}\\if{html}{\\out{</div>}}\n\\item \\code{google_site_verification} allows you to verify your site with google:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{template:\n  params:\n    google_site_verification: _nn6ile-a6x6lctOW\n}\\if{html}{\\out{</div>}}\n\\item \\code{trailing_slash_redirect: true} will automatically redirect\n\\code{your-package-url.com} to \\verb{your-package-url.com/}, using a JS script\nadded to the \\verb{<head>} of the home page. This is useful in certain\nredirect scenarios.\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{template:\n  trailing_slash_redirect: true\n}\\if{html}{\\out{</div>}}\n}\n}\n\n\\subsection{Analytics}{\n\nTo capture usage of your site with a web analytics tool, you can make\nuse of the \\code{includes} field to add the special HTML they need. This HTML\nis typically placed \\code{in_header} (actually in the \\verb{<head>}), \\code{before_body},\nor \\code{after_body}.\nYou can learn more about how includes work in pkgdown at\n\\url{https://pkgdown.r-lib.org/articles/customise.html#additional-html-and-files}.\n\nI include a few examples of popular analytics platforms below, but we\nrecommend getting the HTML directly from the tool:\n\\itemize{\n\\item \\href{https://plausible.io}{plausible.io}:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{template:\n  includes:\n    in_header: |\n      <script defer data-domain=\"\\{YOUR DOMAIN\\}\" src=\"https://plausible.io/js/plausible.js\"></script>\n}\\if{html}{\\out{</div>}}\n\\item \\href{https://analytics.google.com/analytics/web/}{Google analytics}:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{template:\n  includes:\n    in_header: |\n       <!-- Global site tag (gtag.js) - Google Analytics -->\n       <script async src=\"https://www.googletagmanager.com/gtag/js?id=\\{YOUR MEASUREMENT ID\\}\" ></script>\n       <script>\n         window.dataLayer = window.dataLayer || [];\n         function gtag()\\{dataLayer.push(arguments);\\}\n         gtag('js', new Date());\n\n         gtag('config', '\\{YOUR MEASUREMENT ID\\}');\n       </script>\n       <!-- Google tag (gtag.js) -->\n}\\if{html}{\\out{</div>}}\n\\item \\href{https://www.goatcounter.com}{GoatCounter}:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{template:\n  includes:\n    after_body: >\n      <script data-goatcounter=\"https://\\{YOUR CODE\\}.goatcounter.com/count\" data-goatcounter-settings=\"\\{YOUR SETTINGS\\}\" async src=\"https://gc.zgo.at/count.js\"></script>\n}\\if{html}{\\out{</div>}}\n}\n}\n}\n\n\\section{Source repository}{\nUse the \\code{repo} field to override pkgdown's automatically discovery\nof your source repository. This is used in the navbar, on the homepage,\nin articles and reference topics, and in the changelog (to link to issue\nnumbers and user names). pkgdown can automatically figure out the necessary\nURLs if you link to a GitHub, GitLab or Codeberg repo in your \\code{BugReports}\nor \\code{URL} field.\n\nOtherwise, you can supply your own in the \\code{repo} field:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{repo:\n  url:\n    home: https://github.com/r-lib/pkgdown/\n    source: https://github.com/r-lib/pkgdown/blob/HEAD/\n    issue: https://github.com/r-lib/pkgdown/issues/\n    user: https://github.com/\n}\\if{html}{\\out{</div>}}\n\\itemize{\n\\item \\code{home}: path to package home on source code repository.\n\\item \\code{source}: path to source of individual file in default branch\n(more on that below).\n\\item \\code{issue}: path to individual issue.\n\\item \\code{user}: path to user.\n}\n\nThe varying components (e.g. path, issue number, user name) are pasted on\nthe end of these URLs so they should have trailing \\code{/}s.\n\nWhen creating the link to a package source, we have to link to a specific\nbranch. The default behaviour is to use current branch when in GitHub\nactions and \\code{HEAD} otherwise. You can overide this default with\n\\code{repo.branch}:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{repo:\n  branch: devel\n}\\if{html}{\\out{</div>}}\n\npkgdown can automatically link to Jira issues as well if specify both a\ncustom \\code{issue} URL as well Jira project names to auto-link in\n\\code{jira_projects}. You can specify as many projects as you would like:\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{repo:\n  jira_projects: [this_project, another_project]\n  url:\n    issue: https://jira.organisation.com/jira/browse/\n}\\if{html}{\\out{</div>}}\n}\n\n\\section{Deployment (\\code{deploy})}{\nThere is a single \\code{deploy} field\n\\itemize{\n\\item \\code{install_metadata} allows you to install package index metadata into\nthe package itself. Normally this metadata is made available on the\npublished site; installing it into your package means that it's\navailable for autolinking even if your website is not reachable at build\ntime (e.g. because behind a firewall or requires auth).\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{deploy:\n  install_metadata: true\n}\\if{html}{\\out{</div>}}\n}\n}\n\n\\examples{\n\\dontrun{\nbuild_site()\n\nbuild_site(override = list(destination = tempdir()))\n}\n}\n"
  },
  {
    "path": "man/build_site_github_pages.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/build-github.R\n\\name{build_site_github_pages}\n\\alias{build_site_github_pages}\n\\title{Build site for GitHub pages}\n\\usage{\nbuild_site_github_pages(\n  pkg = \".\",\n  ...,\n  dest_dir = \"docs\",\n  clean = TRUE,\n  install = FALSE,\n  new_process = FALSE\n)\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{...}{Additional arguments passed to \\code{\\link[=build_site]{build_site()}}.}\n\n\\item{dest_dir}{Directory to build site in.}\n\n\\item{clean}{Clean all files from old site.}\n\n\\item{install}{If \\code{TRUE}, will install the package in a temporary library\nso it is available for vignettes.}\n\n\\item{new_process}{If \\code{TRUE}, will run \\code{build_site()} in a separate process.\nThis enhances reproducibility by ensuring nothing that you have loaded\nin the current process affects the build process.}\n}\n\\description{\nDesigned to be run as part of automated workflows for deploying\nto GitHub pages. It cleans out the old site, builds the site into \\code{dest_dir}\nadds a \\code{.nojekyll} file to suppress rendering by Jekyll, and adds a \\code{CNAME}\nfile if needed.\n\nIt is designed to be run in CI, so by default it:\n\\itemize{\n\\item Cleans out the old site.\n\\item Does not install the package.\n\\item Runs \\code{\\link[=build_site]{build_site()}} in process.\n}\n}\n"
  },
  {
    "path": "man/build_tutorials.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/build-tutorials.R\n\\name{build_tutorials}\n\\alias{build_tutorials}\n\\title{Build tutorials section}\n\\usage{\nbuild_tutorials(pkg = \".\", override = list(), preview = FALSE)\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{override}{An optional named list used to temporarily override\nvalues in \\verb{_pkgdown.yml}}\n\n\\item{preview}{If \\code{TRUE}, or \\code{is.na(preview) && interactive()}, will preview\nfreshly generated section in browser.}\n}\n\\description{\nlearnr tutorials must be hosted elsewhere as they require an\nR execution engine. Currently, pkgdown will not build or publish tutorials\nfor you, but makes it easy to embed (using \\verb{<iframe>}s) published tutorials.\nTutorials are automatically discovered from published tutorials in\n\\code{inst/tutorials} and \\code{vignettes/tutorials}. Alternatively, you can\nlist in \\verb{_pkgdown.yml} as described below.\n}\n\\section{YAML config}{\nTo override the default discovery process, you can provide a \\code{tutorials}\nsection. This should be a list where each element specifies:\n\\itemize{\n\\item \\code{name}: used for the generated file name\n\\item \\code{title}: used in page heading and in navbar\n\\item \\code{url}: which will be embedded in an iframe\n\\item \\code{source}: optional, but if present will be linked to\n}\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{tutorials:\n- name: 00-setup\n  title: Setting up R\n  url: https://jjallaire.shinyapps.io/learnr-tutorial-00-setup/\n- name: 01-data-basics\n  title: Data basics\n  url: https://jjallaire.shinyapps.io/learnr-tutorial-01-data-basics/\n}\\if{html}{\\out{</div>}}\n}\n\n\\seealso{\nOther site components: \n\\code{\\link{build_articles}()},\n\\code{\\link{build_home}()},\n\\code{\\link{build_llm_docs}()},\n\\code{\\link{build_news}()},\n\\code{\\link{build_reference}()}\n}\n\\concept{site components}\n"
  },
  {
    "path": "man/check_pkgdown.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/check.R\n\\name{check_pkgdown}\n\\alias{check_pkgdown}\n\\alias{pkgdown_sitrep}\n\\title{Check \\verb{_pkgdown.yml}}\n\\usage{\ncheck_pkgdown(pkg = \".\")\n\npkgdown_sitrep(pkg = \".\")\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n}\n\\description{\nThis pair of functions checks that your \\verb{_pkgdown.yml} is valid without\nbuilding the whole site. \\code{check_pkgdown()} errors at the first problem;\n\\code{pkgdown_sitrep()} reports the status of all checks.\n\nCurrently they check that:\n\\itemize{\n\\item There's a \\code{url} in the pkgdown configuration, which is also recorded\nin the \\code{URL} field of the \\code{DESCRIPTION}.\n\\item All opengraph metadata is valid.\n\\item All reference topics are included in the index.\n\\item All articles/vignettes are included in the index.\n}\n}\n"
  },
  {
    "path": "man/clean.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/clean.R\n\\name{clean_site}\n\\alias{clean_site}\n\\alias{clean_cache}\n\\title{Clean site}\n\\usage{\nclean_site(pkg = \".\", quiet = FALSE, force = FALSE)\n\nclean_cache(pkg = \".\", quiet = FALSE)\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{quiet}{If \\code{TRUE}, suppresses a message.}\n\n\\item{force}{If \\code{TRUE}, delete contents of \\code{docs} even if it is not a pkgdown site.}\n}\n\\description{\nDelete all files in \\verb{docs/} (except for \\code{CNAME}).\n\nDelete all files in the pkgdown cache directory.\n}\n"
  },
  {
    "path": "man/deploy_site_github.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/deploy-site.R\n\\name{deploy_site_github}\n\\alias{deploy_site_github}\n\\title{Deploy a pkgdown site on Travis-CI to Github Pages}\n\\usage{\ndeploy_site_github(\n  pkg = \".\",\n  install = TRUE,\n  tarball = Sys.getenv(\"PKG_TARBALL\", \"\"),\n  ssh_id = Sys.getenv(\"id_rsa\", \"\"),\n  commit_message = construct_commit_message(pkg),\n  clean = FALSE,\n  verbose = FALSE,\n  host = \"github.com\",\n  ...,\n  repo_slug = Sys.getenv(\"TRAVIS_REPO_SLUG\", \"\")\n)\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{install}{Optionally, opt-out of automatic installation. This is\nnecessary if the package you're documenting is a dependency of pkgdown}\n\n\\item{tarball}{The location of the built package tarball. The default Travis\nconfiguration for R packages sets \\code{PKG_TARBALL} to this path.}\n\n\\item{ssh_id}{The private id to use, a base64 encoded content of the private\npem file. This should \\emph{not} be your personal private key. Instead create a\nnew keypair specifically for deploying the site. The easiest way is to use\n\\code{travis::use_travis_deploy()}.}\n\n\\item{commit_message}{The commit message to be used for the commit.}\n\n\\item{clean}{Clean all files from old site.}\n\n\\item{verbose}{Print verbose output}\n\n\\item{host}{The GitHub host url.}\n\n\\item{...}{Additional arguments passed to \\code{\\link[=build_site]{build_site()}}.}\n\n\\item{repo_slug}{The \\code{user/repo} slug for the repository.}\n}\n\\description{\n\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#superseded}{\\figure{lifecycle-superseded.svg}{options: alt='[Superseded]'}}}{\\strong{[Superseded]}}\n\n\\code{deploy_site_github()} was designed to deploy your site from Travis CI,\nwhich we no longer recommend, so this function is deprecated. There are\ntwo replacements:\n\\itemize{\n\\item \\code{\\link[usethis:use_pkgdown]{usethis::use_pkgdown_github_pages()}} will setup a GitHub action to\nautomatically build and deploy your package website to GitHub pages.\n\\item \\code{\\link[=deploy_to_branch]{deploy_to_branch()}} can be called locally to build and deploy your\nwebsite to any desired branch.\n}\n}\n\\keyword{internal}\n"
  },
  {
    "path": "man/deploy_to_branch.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/deploy-site.R\n\\name{deploy_to_branch}\n\\alias{deploy_to_branch}\n\\title{Build and deploy a site locally}\n\\usage{\ndeploy_to_branch(\n  pkg = \".\",\n  commit_message = construct_commit_message(pkg),\n  clean = TRUE,\n  branch = \"gh-pages\",\n  remote = \"origin\",\n  github_pages = (branch == \"gh-pages\"),\n  ...,\n  subdir = NULL\n)\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{commit_message}{The commit message to be used for the commit.}\n\n\\item{clean}{Clean all files from old site.}\n\n\\item{branch}{The git branch to deploy to}\n\n\\item{remote}{The git remote to deploy to}\n\n\\item{github_pages}{Is this a GitHub pages deploy. If \\code{TRUE}, adds a \\code{CNAME}\nfile for custom domain name support, and a \\code{.nojekyll} file to suppress\njekyll rendering.}\n\n\\item{...}{Additional arguments passed to \\code{\\link[=build_site]{build_site()}}.}\n\n\\item{subdir}{The sub-directory where the site should be built on the branch.\nThis argument can be used to support a number of site configurations.\nFor example, you could build version-specific documentation by setting\n\\code{subdir = \"v1.2.3\"}; \\code{deploy_to_branch()} will build and deploy the\npackage documentation in the \\verb{v.1.2.3/} directory of your site.}\n}\n\\description{\nAssumes that you're in a git clone of the project, and the package is\nalready installed. Use \\code{\\link[usethis:use_pkgdown]{usethis::use_pkgdown_github_pages()}} to automate\nthis process using GitHub actions.\n}\n"
  },
  {
    "path": "man/fig_settings.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/figure.R\n\\name{fig_settings}\n\\alias{fig_settings}\n\\title{Get current settings for figures}\n\\usage{\nfig_settings()\n}\n\\value{\nA list containing the entries from the \\code{figures} field in \\verb{_pkgdown.yml}\n(see \\code{\\link[=build_reference]{build_reference()}}), with default values added. Computed \\code{width} and\n\\code{height} values (in pixels) are also included.\n}\n\\description{\nYou will generally not need to use this function unless you are handling\ncustom plot output.\n\nPackages needing custom parameters should ask users to place them within\nthe \\code{other.parameters} entry under the package name, e.g.\n\n\\if{html}{\\out{<div class=\"sourceCode\">}}\\preformatted{figures:\n  other.parameters:\n    rgl:\n      fig.asp: 1\n}\\if{html}{\\out{</div>}}\n}\n\\keyword{internal}\n"
  },
  {
    "path": "man/in_pkgdown.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/pkgdown.R\n\\name{in_pkgdown}\n\\alias{in_pkgdown}\n\\title{Determine if code is executed by pkgdown}\n\\usage{\nin_pkgdown()\n}\n\\description{\nThis is occasionally useful when you need different behaviour by\npkgdown and regular documentation.\n}\n\\examples{\nin_pkgdown()\n}\n"
  },
  {
    "path": "man/index.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/test.R\n\\name{index}\n\\alias{index}\n\\alias{test-index}\n\\title{Index}\n\\description{\nIndex\n}\n\\seealso{\nOther tests: \n\\code{\\link{test-crayon}},\n\\code{\\link{test-dont}},\n\\code{\\link{test-figures}},\n\\code{\\link{test-links}},\n\\code{\\link{test-lists}},\n\\code{\\link{test-long-lines}},\n\\code{\\link{test-math-examples}},\n\\code{\\link{test-output-styles}},\n\\code{\\link{test-params}},\n\\code{\\link{test-sexpr-title}},\n\\code{\\link{test-tables}},\n\\code{\\link{test-verbatim}}\n}\n\\concept{tests}\n\\keyword{internal}\n"
  },
  {
    "path": "man/init_site.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/init.R\n\\name{init_site}\n\\alias{init_site}\n\\title{Initialise site infrastructure}\n\\usage{\ninit_site(pkg = \".\", override = list())\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{override}{An optional named list used to temporarily override\nvalues in \\verb{_pkgdown.yml}}\n}\n\\description{\n\\code{init_site()}:\n\\itemize{\n\\item creates the output directory (\\verb{docs/}),\n\\item generates a machine readable description of the site, used for autolinking,\n\\item copies CSS/JS assets and extra files, and\n\\item runs \\code{build_favicons()}, if needed.\n}\n\nTypically, you will not need to call this function directly, as all \\verb{build_*()}\nfunctions will run \\code{init_site()} if needed.\n\nThe only good reasons to call \\code{init_site()} directly are the following:\n\\itemize{\n\\item If you add or modify a package logo.\n\\item If you add or modify \\code{pkgdown/extra.scss}.\n\\item If you modify \\code{template.bslib} variables in \\verb{_pkgdown.yml}.\n}\n\nSee \\code{vignette(\"customise\")} for the various ways you can customise the\ndisplay of your site.\n}\n\\section{Build-ignored files}{\nWe recommend using \\code{\\link[usethis:use_pkgdown]{usethis::use_pkgdown_github_pages()}} to build-ignore \\verb{docs/} and\n\\verb{_pkgdown.yml}. If use another directory, or create the site manually,\nyou'll need to add them to \\code{.Rbuildignore} yourself. A \\code{NOTE} about\nan unexpected file during \\verb{R CMD CHECK} is an indication you have not\ncorrectly ignored these files.\n}\n\n"
  },
  {
    "path": "man/pkgdown-package.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/pkgdown-package.R\n\\docType{package}\n\\name{pkgdown-package}\n\\alias{pkgdown}\n\\alias{pkgdown-package}\n\\title{pkgdown: Make Static HTML Documentation for a Package}\n\\description{\n\\if{html}{\\figure{logo.png}{options: style='float: right' alt='logo' width='120'}}\n\nGenerate an attractive and useful website from a source package. 'pkgdown' converts your documentation, vignettes, 'README', and more to 'HTML' making it easy to share information about your package online.\n}\n\\seealso{\nUseful links:\n\\itemize{\n  \\item \\url{https://pkgdown.r-lib.org/}\n  \\item \\url{https://github.com/r-lib/pkgdown}\n  \\item Report bugs at \\url{https://github.com/r-lib/pkgdown/issues}\n}\n\n}\n\\author{\n\\strong{Maintainer}: Hadley Wickham \\email{hadley@posit.co} (\\href{https://orcid.org/0000-0003-4757-117X}{ORCID})\n\nAuthors:\n\\itemize{\n  \\item Jay Hesselberth (\\href{https://orcid.org/0000-0002-6299-179X}{ORCID})\n  \\item Maëlle Salmon (\\href{https://orcid.org/0000-0002-2815-0399}{ORCID})\n  \\item Olivier Roy\n  \\item Salim Brüggemann (\\href{https://orcid.org/0000-0002-5329-5987}{ORCID})\n}\n\nOther contributors:\n\\itemize{\n  \\item Posit Software, PBC (\\href{https://ror.org/03wc8by49}{ROR}) [copyright holder, funder]\n}\n\n}\n\\keyword{internal}\n"
  },
  {
    "path": "man/pkgdown_print.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/pkgdown_print.R\n\\name{pkgdown_print}\n\\alias{pkgdown_print}\n\\title{Print object in pkgdown output}\n\\usage{\npkgdown_print(x, visible = TRUE)\n}\n\\arguments{\n\\item{x}{Object to display}\n\n\\item{visible}{Whether it is visible or not}\n}\n\\value{\nEither a character vector representing printed output (which\nwill be escaped for HTML as necessary) or literal HTML produced\nby the htmltools or htmlwidgets packages.\n}\n\\description{\nThis lets package authors control how objects are printed just for\npkgdown examples. The default is to call \\code{\\link[=print]{print()}} apart from htmlwidgets\nwhere the object is returned as is (with sizes tweaked).\n}\n\\keyword{internal}\n"
  },
  {
    "path": "man/preview_site.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/preview.R\n\\name{preview_site}\n\\alias{preview_site}\n\\title{Open site in browser}\n\\usage{\npreview_site(pkg = \".\", path = \".\", preview = TRUE)\n}\n\\arguments{\n\\item{pkg}{Path to package.}\n\n\\item{path}{Path relative to destination}\n\n\\item{preview}{If \\code{TRUE}, or \\code{is.na(preview) && interactive()}, will preview\nfreshly generated section in browser.}\n}\n\\description{\n\\code{preview_site()} opens your pkgdown site in your browser, served via a\nlocal HTTP server. This enables dynamic features such as search to work\ncorrectly in preview.\n}\n\\seealso{\n\\code{\\link[=stop_preview]{stop_preview()}} to stop the server.\n}\n"
  },
  {
    "path": "man/rd2html.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/rd.R\n\\name{rd2html}\n\\alias{rd2html}\n\\title{Translate an Rd string to its HTML output}\n\\usage{\nrd2html(x, fragment = TRUE, ...)\n}\n\\arguments{\n\\item{x}{Rd string. Backslashes must be double-escaped (\"\\\\\\\\\").}\n\n\\item{fragment}{logical indicating whether this represents a complete Rd file}\n\n\\item{...}{additional arguments for as_html}\n}\n\\description{\nTranslate an Rd string to its HTML output\n}\n\\examples{\nrd2html(\"a\\n\\%b\\nc\")\n\nrd2html(\"a & b\")\n\nrd2html(\"\\\\\\\\strong{\\\\\\\\emph{x}}\")\n\n}\n"
  },
  {
    "path": "man/render_page.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/render.R\n\\name{render_page}\n\\alias{render_page}\n\\alias{data_template}\n\\title{Render page with template}\n\\usage{\nrender_page(pkg = \".\", name, data, path, depth = NULL, quiet = FALSE)\n\ndata_template(pkg = \".\", depth = 0L)\n}\n\\arguments{\n\\item{pkg}{Path to package to document.}\n\n\\item{name}{Name of the template (e.g. \"home\", \"vignette\", \"news\")}\n\n\\item{data}{Data for the template.\n\nThis is automatically supplemented with three lists:\n\\itemize{\n\\item \\code{site}: \\code{title} and path to \\code{root}.\n\\item \\code{yaml}: the \\code{template} key from \\verb{_pkgdown.yml}.\n\\item \\code{package}: package metadata including \\code{name} and\\code{version}.\n}\n\nSee the full contents by running \\code{\\link[=data_template]{data_template()}}.}\n\n\\item{path}{Location to create file; relative to destination directory.}\n\n\\item{depth}{Depth of path relative to base directory.}\n\n\\item{quiet}{If \\code{quiet}, will suppress output messages}\n}\n\\description{\nEach page is composed of four templates: \"head\", \"header\", \"content\", and\n\"footer\". Each of these templates is rendered using the \\code{data}, and\nthen assembled into an overall page using the \"layout\" template.\n}\n"
  },
  {
    "path": "man/stop_preview.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/preview.R\n\\name{stop_preview}\n\\alias{stop_preview}\n\\title{Stop HTTP preview}\n\\usage{\nstop_preview()\n}\n\\description{\nStops the HTTP server started by \\code{\\link[=preview_site]{preview_site()}}, if active. This can be\ncalled manually, but is not strictly necessary as the server is\nautomatically stopped when previewing a new site or ending the R session.\n}\n\\keyword{internal}\n"
  },
  {
    "path": "man/templates.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/template.R\n\\name{template_navbar}\n\\alias{template_navbar}\n\\alias{template_reference}\n\\alias{template_articles}\n\\title{Generate YAML templates}\n\\usage{\ntemplate_navbar(path = \".\")\n\ntemplate_reference(path = \".\")\n\ntemplate_articles(path = \".\")\n}\n\\arguments{\n\\item{path}{Path to package root}\n}\n\\description{\nUse these function to generate the default YAML that pkgdown uses for\nthe different parts of \\verb{_pkgdown.yml}. This are useful starting\npoints if you want to customise your site.\n}\n\\examples{\n\\dontrun{\npkgdown::template_navbar()\n}\n\n\\dontrun{\npkgdown::template_reference()\n}\n\n\\dontrun{\npkgdown::template_articles()\n}\n\n}\n"
  },
  {
    "path": "man/test-crayon.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/test.R\n\\name{test-crayon}\n\\alias{test-crayon}\n\\title{Test case: crayon}\n\\description{\nTest case: crayon\n}\n\\examples{\ncat(cli::col_red(\"This is red\"), \"\\n\")\ncat(cli::col_blue(\"This is blue\"), \"\\n\")\n\nmessage(cli::col_green(\"This is green\"))\n\nwarning(cli::style_bold(\"This is bold\"))\n}\n\\seealso{\nOther tests: \n\\code{\\link{index}},\n\\code{\\link{test-dont}},\n\\code{\\link{test-figures}},\n\\code{\\link{test-links}},\n\\code{\\link{test-lists}},\n\\code{\\link{test-long-lines}},\n\\code{\\link{test-math-examples}},\n\\code{\\link{test-output-styles}},\n\\code{\\link{test-params}},\n\\code{\\link{test-sexpr-title}},\n\\code{\\link{test-tables}},\n\\code{\\link{test-verbatim}}\n}\n\\concept{tests}\n\\keyword{internal}\n"
  },
  {
    "path": "man/test-dont.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/test.R\n\\name{test-dont}\n\\alias{test-dont}\n\\title{Test case: don't}\n\\description{\nTest case: don't\n}\n\\examples{\n# \\dontrun{} --------------------------------------------------------\n# always shown; never run\n\nx <- 1\n\\dontrun{x <- 2}\n\\dontrun{\n  x <- 3\n  x <- 4\n}\nx # should be 1\n\n# \\donttest{} -------------------------------------------------------\n# only multiline are shown; always run\n\nx <- 1\n\\donttest{x <- 2}\n\\donttest{\n  x <- 3\n  x <- 4\n}\nx # should be 4\n\n# \\testonly{} -----------------------------------------------------\n# never shown, never run\n\nx <- 1\n\\testonly{x <- 2}\n\\testonly{\n  x <- 3\n  x <- 4\n}\nx # should be 1\n\n# \\dontshow{} -------------------------------------------------------\n# never shown, always run\n\nx <- 1\n\\dontshow{x <- 2}\n\\dontshow{\n  x <- 3\n  x <- 4\n}\nx # should be 4\n\n# @examplesIf ------------------------------------------------------\n# If FALSE, wrapped in if; if TRUE, not seen\n\nx <- 1\n\n\\dontshow{if (FALSE) withAutoprint(\\{ # examplesIf}\nx <- 2\n\\dontshow{\\}) # examplesIf}\n\\dontshow{if (TRUE) withAutoprint(\\{ # examplesIf}\nx <- 3\n\\dontshow{\\}) # examplesIf}\nx # should be 3\n}\n\\seealso{\nOther tests: \n\\code{\\link{index}},\n\\code{\\link{test-crayon}},\n\\code{\\link{test-figures}},\n\\code{\\link{test-links}},\n\\code{\\link{test-lists}},\n\\code{\\link{test-long-lines}},\n\\code{\\link{test-math-examples}},\n\\code{\\link{test-output-styles}},\n\\code{\\link{test-params}},\n\\code{\\link{test-sexpr-title}},\n\\code{\\link{test-tables}},\n\\code{\\link{test-verbatim}}\n}\n\\concept{tests}\n\\keyword{internal}\n"
  },
  {
    "path": "man/test-figures.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/test.R\n\\name{test-figures}\n\\alias{test-figures}\n\\title{Test case: figures}\n\\description{\n\\figure{bacon.jpg}\n}\n\\examples{\nx <- seq(0, 2 * pi, length.out = 25)\nplot(x, sin(x))\n\nplot(1:10)\nlines(1:10)\ntext(2, 5, \"Hello\", srt = 30, cex = 2)\n\nplot(1:3, col = c(\"red\", \"green\", \"blue\"), pch = 16, cex = 10)\n}\n\\seealso{\nOther tests: \n\\code{\\link{index}},\n\\code{\\link{test-crayon}},\n\\code{\\link{test-dont}},\n\\code{\\link{test-links}},\n\\code{\\link{test-lists}},\n\\code{\\link{test-long-lines}},\n\\code{\\link{test-math-examples}},\n\\code{\\link{test-output-styles}},\n\\code{\\link{test-params}},\n\\code{\\link{test-sexpr-title}},\n\\code{\\link{test-tables}},\n\\code{\\link{test-verbatim}}\n}\n\\concept{tests}\n\\keyword{internal}\n"
  },
  {
    "path": "man/test-links.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/test.R\n\\name{test-links}\n\\alias{test-links}\n\\title{Test case: links}\n\\description{\n\\if{html}{\\out{<div class=\"sourceCode r\">}}\\preformatted{jsonlite::minify(\"\\{\\}\")\n#> \\{\\}\n}\\if{html}{\\out{</div>}}\n}\n\\examples{\njsonlite::minify(\"{}\")\n\nlibrary(jsonlite, warn.conflicts = FALSE)\nminify(\"{}\")\n}\n\\seealso{\nOther tests: \n\\code{\\link{index}},\n\\code{\\link{test-crayon}},\n\\code{\\link{test-dont}},\n\\code{\\link{test-figures}},\n\\code{\\link{test-lists}},\n\\code{\\link{test-long-lines}},\n\\code{\\link{test-math-examples}},\n\\code{\\link{test-output-styles}},\n\\code{\\link{test-params}},\n\\code{\\link{test-sexpr-title}},\n\\code{\\link{test-tables}},\n\\code{\\link{test-verbatim}}\n}\n\\concept{tests}\n\\keyword{internal}\n"
  },
  {
    "path": "man/test-lists.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/test.R\n\\name{test-lists}\n\\alias{test-lists}\n\\title{Test case: lists}\n\\description{\n\\subsection{Bulleted list}{\n\\itemize{\n  \\item a\n  \\item This is an item...\n\n    That spans multiple paragraphs.\n}\n}\n\n\\subsection{Bulleted list (single item)}{\n\\itemize{\\item a}\n}\n\n\\subsection{Numbered list}{\n\\enumerate{\n  \\item a\n  \\item b\n}\n}\n\n\\subsection{Definition list}{\n\\describe{\n  \\item{short}{short}\n  \\item{short}{Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do\n  eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad\n  minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip\n  ex ea commodo consequat. Duis aute irure dolor in reprehenderit in\n  voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur\n  sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt\n  mollit anim id est laborum.}\n  \\item{Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do\n  eiusmod tempor incididunt ut labore et dolore magna aliqua.}{short}\n  \\item{Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do\n  eiusmod tempor incididunt ut labore et dolore magna aliqua.}{Lorem ipsum\n  adipiscing elit, sed do  eiusmod tempor incididunt ut labore et dolore ad\n  minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip\n  ex ea commodo consequat. Duis aute irure dolor in reprehenderit in\n  voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur\n  sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt\n  mollit anim id est laborum.}\n}\n}\n}\n\\seealso{\nOther tests: \n\\code{\\link{index}},\n\\code{\\link{test-crayon}},\n\\code{\\link{test-dont}},\n\\code{\\link{test-figures}},\n\\code{\\link{test-links}},\n\\code{\\link{test-long-lines}},\n\\code{\\link{test-math-examples}},\n\\code{\\link{test-output-styles}},\n\\code{\\link{test-params}},\n\\code{\\link{test-sexpr-title}},\n\\code{\\link{test-tables}},\n\\code{\\link{test-verbatim}}\n}\n\\concept{tests}\n\\keyword{internal}\n"
  },
  {
    "path": "man/test-long-lines.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/test.R\n\\name{test-long-lines}\n\\alias{test-long-lines}\n\\title{Test case: long-lines}\n\\description{\nThe example results should have the copy button correctly placed when\nscrollings\n}\n\\examples{\npkgdown:::ruler()\n\ncat(rep(\"x \", 100), sep = \"\")\ncat(rep(\"xy\", 100), sep = \"\")\ncat(rep(\"x \", 100), sep = \"\")\ncat(rep(\"xy\", 100), sep = \"\")\n}\n\\seealso{\nOther tests: \n\\code{\\link{index}},\n\\code{\\link{test-crayon}},\n\\code{\\link{test-dont}},\n\\code{\\link{test-figures}},\n\\code{\\link{test-links}},\n\\code{\\link{test-lists}},\n\\code{\\link{test-math-examples}},\n\\code{\\link{test-output-styles}},\n\\code{\\link{test-params}},\n\\code{\\link{test-sexpr-title}},\n\\code{\\link{test-tables}},\n\\code{\\link{test-verbatim}}\n}\n\\concept{tests}\n\\keyword{internal}\n"
  },
  {
    "path": "man/test-math-examples.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/test.R\n\\name{test-math-examples}\n\\alias{test-math-examples}\n\\title{Test case: math rendering in examples}\n\\arguments{\n\\item{x}{\\eqn{f(x) > 0}: inline equation}\n}\n\\description{\nTest case: math rendering in examples\n}\n\\details{\nDisplay equation:\n\n\\deqn{y = \\alpha + \\beta X + \\varepsilon}\n\nMulti-line equation (correctly rendered by katex only):\n\n\\deqn{\\text{Minimize } l \\\\\n\\text{ subject to } \\\\\n\\sum_{i = 1}^{I} x_i r_{ij} + y_j \\geq t_j \\forall j \\in J \\\\\nl \\geq \\frac{y_j}{t_j} \\forall j \\in J \\\\\n\\sum_{i = 1}^{I} x_i c_i \\leq B}{\nMinimize l subject to\nsum_i^I (xi * rij) + yj >= tj for all j in J &\nl >= (yj / tj) for all j in J &\nsum_i^I (xi * ci) <= B}\n}\n\\seealso{\nOther tests: \n\\code{\\link{index}},\n\\code{\\link{test-crayon}},\n\\code{\\link{test-dont}},\n\\code{\\link{test-figures}},\n\\code{\\link{test-links}},\n\\code{\\link{test-lists}},\n\\code{\\link{test-long-lines}},\n\\code{\\link{test-output-styles}},\n\\code{\\link{test-params}},\n\\code{\\link{test-sexpr-title}},\n\\code{\\link{test-tables}},\n\\code{\\link{test-verbatim}}\n}\n\\concept{tests}\n\\keyword{internal}\n"
  },
  {
    "path": "man/test-output-styles.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/test.R\n\\name{test-output-styles}\n\\alias{test-output-styles}\n\\title{Test case: output styles}\n\\description{\nTest case: output styles\n}\n\\examples{\n# This example illustrates some important output types\n# The following output should be wrapped over multiple lines\na <- 1:100\na\n\ncat(\"This some text!\\n\")\nmessage(\"This is a message!\")\nwarning(\"This is a warning!\")\n\n# This is a multi-line block\n{\n  1 + 2\n  2 + 2\n}\n}\n\\seealso{\nOther tests: \n\\code{\\link{index}},\n\\code{\\link{test-crayon}},\n\\code{\\link{test-dont}},\n\\code{\\link{test-figures}},\n\\code{\\link{test-links}},\n\\code{\\link{test-lists}},\n\\code{\\link{test-long-lines}},\n\\code{\\link{test-math-examples}},\n\\code{\\link{test-params}},\n\\code{\\link{test-sexpr-title}},\n\\code{\\link{test-tables}},\n\\code{\\link{test-verbatim}}\n}\n\\concept{tests}\n\\keyword{internal}\n"
  },
  {
    "path": "man/test-params.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/test.R\n\\name{test-params}\n\\alias{test-params}\n\\title{Test case: params}\n\\arguments{\n\\item{...}{ellipsis}\n}\n\\description{\nTest case: params\n}\n\\seealso{\nOther tests: \n\\code{\\link{index}},\n\\code{\\link{test-crayon}},\n\\code{\\link{test-dont}},\n\\code{\\link{test-figures}},\n\\code{\\link{test-links}},\n\\code{\\link{test-lists}},\n\\code{\\link{test-long-lines}},\n\\code{\\link{test-math-examples}},\n\\code{\\link{test-output-styles}},\n\\code{\\link{test-sexpr-title}},\n\\code{\\link{test-tables}},\n\\code{\\link{test-verbatim}}\n}\n\\concept{tests}\n\\keyword{internal}\n"
  },
  {
    "path": "man/test-sexpr-title.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/test.R\n\\name{test-sexpr-title}\n\\alias{test-sexpr-title}\n\\title{Test case: \\Sexpr[stage=render,results=rd]{\"sexpr\"}}\n\\description{\nTest case: \\Sexpr[stage=render,results=rd]{\"sexpr\"}\n}\n\\seealso{\nOther tests: \n\\code{\\link{index}},\n\\code{\\link{test-crayon}},\n\\code{\\link{test-dont}},\n\\code{\\link{test-figures}},\n\\code{\\link{test-links}},\n\\code{\\link{test-lists}},\n\\code{\\link{test-long-lines}},\n\\code{\\link{test-math-examples}},\n\\code{\\link{test-output-styles}},\n\\code{\\link{test-params}},\n\\code{\\link{test-tables}},\n\\code{\\link{test-verbatim}}\n}\n\\concept{tests}\n\\keyword{internal}\n"
  },
  {
    "path": "man/test-tables.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/test.R\n\\name{test-tables}\n\\alias{test-tables}\n\\title{Test case: tables}\n\\description{\nTest case: tables\n}\n\\examples{\ngt::gt(head(mtcars))\n}\n\\seealso{\nOther tests: \n\\code{\\link{index}},\n\\code{\\link{test-crayon}},\n\\code{\\link{test-dont}},\n\\code{\\link{test-figures}},\n\\code{\\link{test-links}},\n\\code{\\link{test-lists}},\n\\code{\\link{test-long-lines}},\n\\code{\\link{test-math-examples}},\n\\code{\\link{test-output-styles}},\n\\code{\\link{test-params}},\n\\code{\\link{test-sexpr-title}},\n\\code{\\link{test-verbatim}}\n}\n\\concept{tests}\n\\keyword{internal}\n"
  },
  {
    "path": "man/test-verbatim.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/test.R\n\\name{test-verbatim}\n\\alias{test-verbatim}\n\\title{Test case: preformatted blocks & syntax highlighting}\n\\description{\nManual test cases for various ways of embedding code in sections.\nAll code blocks should have copy and paste button.\n}\n\\section{Should be highlighted}{\nValid R code in \\verb{\\preformatted{}}:\n\n\\if{html}{\\out{<div class=\"sourceCode\">}}\\preformatted{mean(a + 1)\n}\\if{html}{\\out{</div>}}\n\nR code in \\code{R} block:\n\n\\if{html}{\\out{<div class=\"sourceCode R\">}}\\preformatted{mean(a + 1)\n}\\if{html}{\\out{</div>}}\n\nR code in \\code{r} block:\n\n\\if{html}{\\out{<div class=\"sourceCode r\">}}\\preformatted{mean(a + 1)\n}\\if{html}{\\out{</div>}}\n\nYaml\n\n\\if{html}{\\out{<div class=\"sourceCode yaml\">}}\\preformatted{yaml: [a, 1]\n}\\if{html}{\\out{</div>}}\n}\n\n\\section{Shouldn't be highlighted}{\nNon-R code in \\verb{\\preformatted{}}\n\n\\if{html}{\\out{<div class=\"sourceCode\">}}\\preformatted{yaml: [a, b, c]\n}\\if{html}{\\out{</div>}}\n}\n\n\\seealso{\nOther tests: \n\\code{\\link{index}},\n\\code{\\link{test-crayon}},\n\\code{\\link{test-dont}},\n\\code{\\link{test-figures}},\n\\code{\\link{test-links}},\n\\code{\\link{test-lists}},\n\\code{\\link{test-long-lines}},\n\\code{\\link{test-math-examples}},\n\\code{\\link{test-output-styles}},\n\\code{\\link{test-params}},\n\\code{\\link{test-sexpr-title}},\n\\code{\\link{test-tables}}\n}\n\\concept{tests}\n\\keyword{internal}\n"
  },
  {
    "path": "pkgdown/_pkgdown.yml",
    "content": "url: https://pkgdown.r-lib.org\n\nhome:\n  title: Build websites for R packages\n\nauthors:\n  Salim Brüggemann:\n    href: https://salim.space\n  Jay Hesselberth:\n    href: https://hesselberthlab.org\n  Maëlle Salmon:\n    href: https://masalmon.eu\n  Hadley Wickham:\n    href: https://hadley.nz\n  Posit Software, PBC:\n    href: https://posit.co\n\ntemplate:\n  bootstrap: 5\n  math-rendering: mathjax\n  light-switch: true\n  bslib:\n    primary: \"#0054AD\"\n    border-radius: 0.5rem\n    btn-border-radius: 0.25rem\n    danger: \"#A6081A\"\n  includes:\n    in_header: |\n      <script src=\"https://cdn.jsdelivr.net/gh/posit-dev/supported-by-posit/js/badge.min.js\" data-max-height=\"43\" data-light-bg=\"#666f76\" data-light-fg=\"#f9f9f9\"></script>\n      <script defer data-domain=\"pkgdown.r-lib.org,all.tidyverse.org\" src=\"https://plausible.io/js/plausible.js\"></script>\"\n\ndevelopment:\n  mode: auto\n\narticles:\n- title: Customise your site\n  navbar:\n  contents:\n  - customise\n  - quarto\n  - translations\n  - accessibility\n  - linking\n  - metadata\n\n- title: Advanced techniques\n  contents:\n  - how-to-update-released-site\n\n- title: Testing\n  desc: >\n    These articles are used to test various pkgdown features that can not\n    easily be tested automatically.\n  contents:\n  - starts_with(\"test\")\n  - starts_with(\"articles/test\")\n\nreference:\n- title: Build\n\n- subtitle: Build the complete site\n  contents:\n  - build_site\n  - clean_site\n  - preview_site\n  - pkgdown_sitrep\n\n- subtitle: Build part of a site\n  desc: These functions are useful for rapid iteration when you're working on a specific part of your site.\n  contents:\n  - has_concept(\"site components\")\n  - build_search\n  - build_redirects\n  - init_site\n\n- subtitle: Customisation\n  contents:\n  - template_navbar\n\n- title: For expert use\n\n- subtitle: Deployment\n  contents:\n  - starts_with(\"deploy_\")\n  - build_site_github_pages\n\n- subtitle: Other helpers\n  contents:\n  - rd2html\n  - as_pkgdown\n  - in_pkgdown\n  - render_page\n  - build_favicons\n\n- title: Regression tests\n  contents:\n  - starts_with(\"test\", internal = TRUE)\n\n- title: Deprecated functions\n  contents:\n  - has_lifecycle(\"deprecated\")\n\nredirects:\n- [\"articles/search.html\", \"reference/build_search.html\"]\n\nnews:\n  releases:\n  - text: \"Version 2.2.0\"\n    href: https://tidyverse.org/blog/2025/11/pkgdown-2-2-0/\n  - text: \"Version 2.1.0\"\n    href: https://www.tidyverse.org/blog/2024/07/pkgdown-2-1-0/\n  - text: \"Version 2.0.0\"\n    href: https://www.tidyverse.org/blog/2021/12/pkgdown-2-0-0/\n  - text: \"Version 1.6.0\"\n    href: https://www.tidyverse.org/blog/2020/09/pkgdown-1-6-0/\n  - text: \"Version 1.5.0\"\n    href: https://www.tidyverse.org/blog/2020/03/pkgdown-1-5-0/\n  - text: \"Version 1.4.0\"\n    href: https://www.tidyverse.org/articles/2019/09/pkgdown-1-4-0/\n  - text: \"Version 1.3.0\"\n    href: https://www.tidyverse.org/articles/2018/12/pkgdown-1-3-0/\n  - text: \"Version 1.1.0\"\n    href: https://www.tidyverse.org/articles/2018/06/pkgdown-1-1-0/\n  - text: \"Version 1.0.0\"\n    href: https://www.tidyverse.org/articles/2018/05/pkgdown-1-0-0/\n"
  },
  {
    "path": "pkgdown/favicon/site.webmanifest",
    "content": "{\n  \"name\": \"\",\n  \"short_name\": \"\",\n  \"icons\": [\n    {\n      \"src\": \"/web-app-manifest-192x192.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\",\n      \"purpose\": \"maskable\"\n    },\n    {\n      \"src\": \"/web-app-manifest-512x512.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image/png\",\n      \"purpose\": \"maskable\"\n    }\n  ],\n  \"theme_color\": \"#ffffff\",\n  \"background_color\": \"#ffffff\",\n  \"display\": \"standalone\"\n}"
  },
  {
    "path": "pkgdown.Rproj",
    "content": "Version: 1.0\n\nRestoreWorkspace: Default\nSaveWorkspace: Default\nAlwaysSaveHistory: Default\n\nEnableCodeIndexing: Yes\nUseSpacesForTab: Yes\nNumSpacesForTab: 2\nEncoding: UTF-8\n\nRnwWeave: Sweave\nLaTeX: pdfLaTeX\n\nAutoAppendNewline: Yes\nStripTrailingWhitespace: Yes\nLineEndingConversion: Posix\n\nBuildType: Package\nPackageUseDevtools: Yes\nPackageInstallArgs: --no-multiarch --with-keep.source\nPackageRoxygenize: rd,collate,namespace\n\nSpellingDictionary: en_AU\n"
  },
  {
    "path": "po/R-ca.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pkgdown 2.0.6.9000\\n\"\n\"POT-Creation-Date: 2025-10-17 18:07-0600\\n\"\n\"PO-Revision-Date: 2024-06-16 09:24+0200\\n\"\n\"Last-Translator: Joan Maspons <joanmaspons@gmail.com>\\n\"\n\"Language-Team: Catalan <>\\n\"\n\"Language: ca\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Generator: Lokalize 24.05.0\\n\"\n\n#: build-404.R:12\nmsgid \"Page not found (404)\"\nmsgstr \"No s'ha trobat la pàgina (404)\"\n\n#: build-404.R:13\nmsgid \"Content not found. Please use links in the navbar.\"\nmsgstr \"No s'ha trobat el contingut. Useu els enllaços de la barra de navegació.\"\n\n#: build-articles.R:281 navbar.R:193 navbar.R:203 navbar.R:232\nmsgid \"Articles\"\nmsgstr \"Articles\"\n\n#: build-articles.R:436\nmsgid \"All vignettes\"\nmsgstr \"Totes les vinyetes\"\n\n#: build-footer.R:42\nmsgid \"Developed by\"\nmsgstr \"Desenvolupat per\"\n\n#: build-footer.R:49\nmsgid \"Site built with <a href=\\\"%s\\\">pkgdown</a> %s.\"\nmsgstr \"Lloc construït amb <a href=\\\"%s\\\">pkgdown</a> %s.\"\n\n#: build-home-authors.R:12\nmsgid \"Authors and Citation\"\nmsgstr \"Autors i citació\"\n\n#: build-home-authors.R:110\nmsgid \"More about authors...\"\nmsgstr \"Més sobre els autors...\"\n\n#: build-home-authors.R:113\nmsgid \"Developers\"\nmsgstr \"Desenvolupadors\"\n\n#: build-home-authors.R:220\nmsgid \"author\"\nmsgstr \"autor\"\n\n#: build-home-authors.R:221\nmsgid \"compiler\"\nmsgstr \"compilador\"\n\n#: build-home-authors.R:222\nmsgid \"contractor\"\nmsgstr \"contractista\"\n\n#: build-home-authors.R:223\nmsgid \"contributor\"\nmsgstr \"col·laborador\"\n\n#: build-home-authors.R:224\nmsgid \"copyright holder\"\nmsgstr \"titular dels drets d'autor\"\n\n#: build-home-authors.R:225\nmsgid \"maintainer\"\nmsgstr \"mantenidor\"\n\n#: build-home-authors.R:226\nmsgid \"data contributor\"\nmsgstr \"col·laborador de dades\"\n\n#: build-home-authors.R:227\nmsgid \"funder\"\nmsgstr \"finançador\"\n\n#: build-home-authors.R:228\nmsgid \"reviewer\"\nmsgstr \"revisor\"\n\n#: build-home-authors.R:229\nmsgid \"thesis advisor\"\nmsgstr \"supervisor de tesi\"\n\n#: build-home-authors.R:230\nmsgid \"translator\"\nmsgstr \"traductor\"\n\n#: build-home-authors.R:286 render.R:108\nmsgid \"Citation\"\nmsgstr \"Citació\"\n\n#: build-home-authors.R:287\nmsgid \"Citing %s\"\nmsgstr \"Citant %s\"\n\n#: build-home-community.R:22\nmsgid \"Contributing guide\"\nmsgstr \"Guia per contribuir\"\n\n#: build-home-community.R:26\nmsgid \"Code of conduct\"\nmsgstr \"Codi de conducta\"\n\n#: build-home-community.R:30\nmsgid \"Getting help\"\nmsgstr \"Obtenció d'ajuda\"\n\n#: build-home-community.R:37\nmsgid \"Community\"\nmsgstr \"Comunitat\"\n\n#: build-home-index.R:118\nmsgid \"Dev Status\"\nmsgstr \"Estat de desenvolupament\"\n\n#: build-home-index.R:190\nmsgid \"View on %s\"\nmsgstr \"Mostra a %s\"\n\n#: build-home-index.R:191\nmsgid \"Browse source code\"\nmsgstr \"Navega pel codi font\"\n\n#: build-home-index.R:192\nmsgid \"Report a bug\"\nmsgstr \"Informa d'un error\"\n\n#: build-home-index.R:196\nmsgid \"Links\"\nmsgstr \"Enllaços\"\n\n#: build-home-index.R:201 render.R:110\nmsgid \"Table of contents\"\nmsgstr \"Taula de continguts\"\n\n#: build-home-license.R:14 build-home-license.R:36\nmsgid \"License\"\nmsgstr \"Llicència\"\n\n#: build-home-license.R:31\nmsgid \"Full license\"\nmsgstr \"Llicència completa\"\n\n#: build-news.R:101 build-news.R:262 build-news.R:266\nmsgid \"Changelog\"\nmsgstr \"Registre de canvis\"\n\n#: build-news.R:128\nmsgid \"Version %s\"\nmsgstr \"Versió %s\"\n\n#: build-news.R:140 build-news.R:257\nmsgid \"News\"\nmsgstr \"Novetats\"\n\n#: build-news.R:259\nmsgid \"Releases\"\nmsgstr \"Versions\"\n\n#: build-news.R:314\nmsgid \"CRAN release: %s\"\nmsgstr \"Versió del CRAN: %s\"\n\n#: build-reference-index.R:23\nmsgid \"Package index\"\nmsgstr \"Índex del paquet\"\n\n#: build-reference-index.R:187\nmsgid \"All functions\"\nmsgstr \"Totes les funcions\"\n\n#: build-reference.R:377\nmsgid \"Usage\"\nmsgstr \"Ús\"\n\n#: build-tutorials.R:49 navbar.R:158\nmsgid \"Tutorials\"\nmsgstr \"Guies d'aprenentatge\"\n\n#: development.R:82\nmsgid \"Released version\"\nmsgstr \"Versió publicada\"\n\n#: development.R:83\nmsgid \"In-development version\"\nmsgstr \"Versió en desenvolupament\"\n\n#: development.R:84\nmsgid \"Unreleased version\"\nmsgstr \"Versió no publicada\"\n\n#: navbar-menu.R:212\nmsgid \"Search site\"\nmsgstr \"Cerca al lloc\"\n\n#: navbar-menu.R:213\nmsgid \"Search for\"\nmsgstr \"Cerca\"\n\n#: navbar.R:135\nmsgid \"Reference\"\nmsgstr \"Referència\"\n\n#: navbar.R:146\nmsgid \"Light switch\"\nmsgstr \"Interruptor de color\"\n\n#: navbar.R:149\nmsgid \"Light\"\nmsgstr \"Clar\"\n\n#: navbar.R:150\nmsgid \"Dark\"\nmsgstr \"Fosc\"\n\n#: navbar.R:151\nmsgid \"Auto\"\nmsgstr \"Automàtic\"\n\n#: navbar.R:187\nmsgid \"Get started\"\nmsgstr \"Comenceu\"\n\n#: navbar.R:228\nmsgid \"More articles...\"\nmsgstr \"Més articles...\"\n\n#: package.R:317\nmsgid \"deprecated\"\nmsgstr \"obsoleta\"\n\n#: package.R:318\nmsgid \"superseded\"\nmsgstr \"reemplaçada\"\n\n#: package.R:319\nmsgid \"experimental\"\nmsgstr \"experimental\"\n\n#: package.R:320\nmsgid \"stable\"\nmsgstr \"estable\"\n\n#: rd-data.R:23\nmsgid \"Details\"\nmsgstr \"Detalls\"\n\n#: rd-data.R:27\nmsgid \"Description\"\nmsgstr \"Descripció\"\n\n#: rd-data.R:31\nmsgid \"References\"\nmsgstr \"Referències\"\n\n#: rd-data.R:35 render.R:103\nmsgid \"Source\"\nmsgstr \"Font\"\n\n#: rd-data.R:39\nmsgid \"Format\"\nmsgstr \"Format\"\n\n#: rd-data.R:43\nmsgid \"Note\"\nmsgstr \"Nota\"\n\n#: rd-data.R:47\nmsgid \"Author\"\nmsgstr \"Autor\"\n\n#: rd-data.R:51\nmsgid \"See also\"\nmsgstr \"Vegeu també\"\n\n#: rd-data.R:67\nmsgid \"Arguments\"\nmsgstr \"Paràmetres\"\n\n#: rd-data.R:75\nmsgid \"Value\"\nmsgstr \"Valor\"\n\n#: render.R:100\nmsgid \"Skip to contents\"\nmsgstr \"Salta als continguts\"\n\n#: render.R:101\nmsgid \"Toggle navigation\"\nmsgstr \"Commuta la navegació\"\n\n#: render.R:102\nmsgid \"On this page\"\nmsgstr \"En aquesta pàgina\"\n\n#: render.R:104\nmsgid \"Abstract\"\nmsgstr \"Resum\"\n\n#: render.R:105\nmsgid \"Authors\"\nmsgstr \"Autors\"\n\n#: render.R:106\nmsgid \"Version\"\nmsgstr \"Versió\"\n\n#: render.R:107\nmsgid \"Examples\"\nmsgstr \"Exemples\"\n\n#: render.R:109\nmsgid \"Additional details\"\nmsgstr \"Detalls addicionals\"\n\n#: render.R:111\nmsgid \"Site navigation\"\nmsgstr \"Navegació del lloc\"\n\n#: repo.R:37\nmsgid \"Source:\"\nmsgstr \"Font:\"\n\n#: tweak-homepage.R:68\nmsgid \"Dev status\"\nmsgstr \"Estat de desenvolupament\"\n\n#: usage.R:52\nmsgid \"# Default %s method\"\nmsgstr \"# Mètode %s per defecte\"\n\n#: usage.R:54\nmsgid \"# %s method for class '%s'\"\nmsgstr \"# Mètode %s per a la classe «%s»\"\n\n#~ msgid \"Function reference\"\n#~ msgstr \"Llistat de funcions\"\n"
  },
  {
    "path": "po/R-de.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pkgdown 1.9000.9000.9000\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-10-17 18:07-0600\\n\"\n\"PO-Revision-Date: 2021-10-28 08:02-0500\\n\"\n\"Last-Translator: Automatically generated\\n\"\n\"Language-Team: none\\n\"\n\"Language: de\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: build-404.R:12\nmsgid \"Page not found (404)\"\nmsgstr \"Seite nicht gefunden (404)\"\n\n#: build-404.R:13\nmsgid \"Content not found. Please use links in the navbar.\"\nmsgstr \"Inhalt nicht gefunden. Bitte die Navigationleiste benutzen.\"\n\n#: build-articles.R:281 navbar.R:193 navbar.R:203 navbar.R:232\nmsgid \"Articles\"\nmsgstr \"Artikel\"\n\n#: build-articles.R:436\nmsgid \"All vignettes\"\nmsgstr \"Alle Artikel\"\n\n#: build-footer.R:42\nmsgid \"Developed by\"\nmsgstr \"Entwickelt von\"\n\n#: build-footer.R:49\nmsgid \"Site built with <a href=\\\"%s\\\">pkgdown</a> %s.\"\nmsgstr \"Seite erstellt mit <a href=\\\"%s\\\">pkgdown</a> %s.\"\n\n#: build-home-authors.R:12\nmsgid \"Authors and Citation\"\nmsgstr \"Autor:innen und Zitation\"\n\n#: build-home-authors.R:110\nmsgid \"More about authors...\"\nmsgstr \"Mehr zu den Autor:innen\"\n\n#: build-home-authors.R:113\nmsgid \"Developers\"\nmsgstr \"Entwicker:innen\"\n\n#: build-home-authors.R:220\nmsgid \"author\"\nmsgstr \"Autor:in\"\n\n#: build-home-authors.R:221\nmsgid \"compiler\"\nmsgstr \"Zusammensteller:in\"\n\n#: build-home-authors.R:222\nmsgid \"contractor\"\nmsgstr \"Auftragnehmer:in\"\n\n#: build-home-authors.R:223\nmsgid \"contributor\"\nmsgstr \"Beitragende:r\"\n\n#: build-home-authors.R:224\nmsgid \"copyright holder\"\nmsgstr \"Urheberrechtsinhaber:in\"\n\n#: build-home-authors.R:225\nmsgid \"maintainer\"\nmsgstr \"Maintainer:in\"\n\n#: build-home-authors.R:226\nmsgid \"data contributor\"\nmsgstr \"Datenbeitragende:r\"\n\n#: build-home-authors.R:227\nmsgid \"funder\"\nmsgstr \"Sponsor:in\"\n\n#: build-home-authors.R:228\nmsgid \"reviewer\"\nmsgstr \"Gutachter:in\"\n\n#: build-home-authors.R:229\nmsgid \"thesis advisor\"\nmsgstr \"Betreuer:in der Abschlussarbeit\"\n\n#: build-home-authors.R:230\nmsgid \"translator\"\nmsgstr \"Übersetzer:in\"\n\n#: build-home-authors.R:286 render.R:108\nmsgid \"Citation\"\nmsgstr \"Zitationsvorschlag\"\n\n#: build-home-authors.R:287\nmsgid \"Citing %s\"\nmsgstr \"%s zitieren\"\n\n#: build-home-community.R:22\nmsgid \"Contributing guide\"\nmsgstr \"Leitfaden zum Mitwirken\"\n\n#: build-home-community.R:26\nmsgid \"Code of conduct\"\nmsgstr \"Verhaltensregeln\"\n\n#: build-home-community.R:30\nmsgid \"Getting help\"\nmsgstr \"Hilfe erhalten\"\n\n#: build-home-community.R:37\nmsgid \"Community\"\nmsgstr \"Community\"\n\n#: build-home-index.R:118\nmsgid \"Dev Status\"\nmsgstr \"Entwicklungsstatus\"\n\n#: build-home-index.R:190\nmsgid \"View on %s\"\nmsgstr \"Auf %s ansehen\"\n\n#: build-home-index.R:191\nmsgid \"Browse source code\"\nmsgstr \"Quellcode ansehen\"\n\n#: build-home-index.R:192\nmsgid \"Report a bug\"\nmsgstr \"Bug melden\"\n\n#: build-home-index.R:196\nmsgid \"Links\"\nmsgstr \"Links\"\n\n#: build-home-index.R:201 render.R:110\nmsgid \"Table of contents\"\nmsgstr \"Inhaltsverzeichnis\"\n\n#: build-home-license.R:14 build-home-license.R:36\nmsgid \"License\"\nmsgstr \"Lizenz\"\n\n#: build-home-license.R:31\nmsgid \"Full license\"\nmsgstr \"Vollständige Lizenz\"\n\n#: build-news.R:101 build-news.R:262 build-news.R:266\nmsgid \"Changelog\"\nmsgstr \"Änderungsprotokoll\"\n\n#: build-news.R:128\nmsgid \"Version %s\"\nmsgstr \"Version %s\"\n\n#: build-news.R:140 build-news.R:257\nmsgid \"News\"\nmsgstr \"Neuigkeiten\"\n\n#: build-news.R:259\nmsgid \"Releases\"\nmsgstr \"Veröffentlichungen\"\n\n#: build-news.R:314\nmsgid \"CRAN release: %s\"\nmsgstr \"CRAN-Veröffentlichung: %s\"\n\n#: build-reference-index.R:23\nmsgid \"Package index\"\nmsgstr \"Paketindex\"\n\n#: build-reference-index.R:187\nmsgid \"All functions\"\nmsgstr \"Alle Funktionen\"\n\n#: build-reference.R:377\nmsgid \"Usage\"\nmsgstr \"Verwendung\"\n\n#: build-tutorials.R:49 navbar.R:158\nmsgid \"Tutorials\"\nmsgstr \"Tutorien\"\n\n#: development.R:82\nmsgid \"Released version\"\nmsgstr \"Veröffentlichte Version\"\n\n#: development.R:83\nmsgid \"In-development version\"\nmsgstr \"Version in Entwicklung\"\n\n#: development.R:84\nmsgid \"Unreleased version\"\nmsgstr \"Unveröffentlichte Version\"\n\n#: navbar-menu.R:212\nmsgid \"Search site\"\nmsgstr \"Suchen nach\"\n\n#: navbar-menu.R:213\nmsgid \"Search for\"\nmsgstr \"Suchen nach\"\n\n#: navbar.R:135\nmsgid \"Reference\"\nmsgstr \"Verzeichnis\"\n\n#: navbar.R:146\nmsgid \"Light switch\"\nmsgstr \"Erscheinungsbild\"\n\n#: navbar.R:149\nmsgid \"Light\"\nmsgstr \"Hell\"\n\n#: navbar.R:150\nmsgid \"Dark\"\nmsgstr \"Dunkel\"\n\n#: navbar.R:151\nmsgid \"Auto\"\nmsgstr \"Automatisch\"\n\n#: navbar.R:187\nmsgid \"Get started\"\nmsgstr \"Erste Schritte\"\n\n#: navbar.R:228\nmsgid \"More articles...\"\nmsgstr \"Mehr Artikel ...\"\n\n#: package.R:317\nmsgid \"deprecated\"\nmsgstr \"veraltet\"\n\n#: package.R:318\nmsgid \"superseded\"\nmsgstr \"überholt\"\n\n#: package.R:319\nmsgid \"experimental\"\nmsgstr \"experimentell\"\n\n#: package.R:320\nmsgid \"stable\"\nmsgstr \"stabil\"\n\n#: rd-data.R:23\nmsgid \"Details\"\nmsgstr \"Details\"\n\n#: rd-data.R:27\nmsgid \"Description\"\nmsgstr \"Beschreibung\"\n\n#: rd-data.R:31\nmsgid \"References\"\nmsgstr \"Literaturverzeichnis\"\n\n#: rd-data.R:35 render.R:103\nmsgid \"Source\"\nmsgstr \"Quelle\"\n\n#: rd-data.R:39\nmsgid \"Format\"\nmsgstr \"Format\"\n\n#: rd-data.R:43\nmsgid \"Note\"\nmsgstr \"Notiz\"\n\n#: rd-data.R:47\nmsgid \"Author\"\nmsgstr \"Autor:in\"\n\n#: rd-data.R:51\nmsgid \"See also\"\nmsgstr \"Siehe auch\"\n\n#: rd-data.R:67\nmsgid \"Arguments\"\nmsgstr \"Argumente\"\n\n#: rd-data.R:75\nmsgid \"Value\"\nmsgstr \"Rückgabewert\"\n\n#: render.R:100\nmsgid \"Skip to contents\"\nmsgstr \"Direkt zum Inhalt springen\"\n\n#: render.R:101\nmsgid \"Toggle navigation\"\nmsgstr \"Navigation ein-/ausschalten\"\n\n#: render.R:102\nmsgid \"On this page\"\nmsgstr \"Auf dieser Seite\"\n\n#: render.R:104\nmsgid \"Abstract\"\nmsgstr \"Kurzzusammenfassung\"\n\n#: render.R:105\nmsgid \"Authors\"\nmsgstr \"Autor:innen\"\n\n#: render.R:106\nmsgid \"Version\"\nmsgstr \"Version\"\n\n#: render.R:107\nmsgid \"Examples\"\nmsgstr \"Beispiele\"\n\n#: render.R:109\nmsgid \"Additional details\"\nmsgstr \"Zusätzliche Details\"\n\n#: render.R:111\nmsgid \"Site navigation\"\nmsgstr \"Seitennavigation\"\n\n#: repo.R:37\nmsgid \"Source:\"\nmsgstr \"Quelle:\"\n\n#: tweak-homepage.R:68\nmsgid \"Dev status\"\nmsgstr \"Entwicklungsstatus\"\n\n#: usage.R:52\nmsgid \"# Default %s method\"\nmsgstr \"# Standard-%s-Methode\"\n\n#: usage.R:54\nmsgid \"# %s method for class '%s'\"\nmsgstr \"# %s-Methode für '%s'\"\n\n#~ msgid \"Function reference\"\n#~ msgstr \"Funktionsverzeichnis\"\n"
  },
  {
    "path": "po/R-dk.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pkgdown 2.0.1.9000\\n\"\n\"POT-Creation-Date: 2025-10-17 18:07-0600\\n\"\n\"PO-Revision-Date: 2021-12-20 18:48+0100\\n\"\n\"Last-Translator: Automatically generated\\n\"\n\"Language-Team: none\\n\"\n\"Language: dk\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: build-404.R:12\nmsgid \"Page not found (404)\"\nmsgstr \"Side ikke fundet (404)\"\n\n#: build-404.R:13\nmsgid \"Content not found. Please use links in the navbar.\"\nmsgstr \"Indhold ikke fundet. Brug venligst links i menuen\"\n\n#: build-articles.R:281 navbar.R:193 navbar.R:203 navbar.R:232\nmsgid \"Articles\"\nmsgstr \"Artikler\"\n\n#: build-articles.R:436\nmsgid \"All vignettes\"\nmsgstr \"Alle vignetter\"\n\n#: build-footer.R:42\nmsgid \"Developed by\"\nmsgstr \"Udviklet af\"\n\n#: build-footer.R:49\nmsgid \"Site built with <a href=\\\"%s\\\">pkgdown</a> %s.\"\nmsgstr \"Side bygget med <a href=\\\"%s\\\">pkgdown</a> %s.\"\n\n#: build-home-authors.R:12\nmsgid \"Authors and Citation\"\nmsgstr \"Forfattere og citation\"\n\n#: build-home-authors.R:110\nmsgid \"More about authors...\"\nmsgstr \"Mere om forfatterene\"\n\n#: build-home-authors.R:113\nmsgid \"Developers\"\nmsgstr \"Udviklere\"\n\n#: build-home-authors.R:220\nmsgid \"author\"\nmsgstr \"forfatter\"\n\n#: build-home-authors.R:221\nmsgid \"compiler\"\nmsgstr \"compiler\"\n\n#: build-home-authors.R:222\nmsgid \"contractor\"\nmsgstr \"leverandør\"\n\n#: build-home-authors.R:223\nmsgid \"contributor\"\nmsgstr \"Bidragsyder\"\n\n#: build-home-authors.R:224\nmsgid \"copyright holder\"\nmsgstr \"Indehaver af ophavsret\"\n\n#: build-home-authors.R:225\nmsgid \"maintainer\"\nmsgstr \"maintainer\"\n\n#: build-home-authors.R:226\nmsgid \"data contributor\"\nmsgstr \"dataleverandør\"\n\n#: build-home-authors.R:227\nmsgid \"funder\"\nmsgstr \"bevilgingsgiver\"\n\n#: build-home-authors.R:228\nmsgid \"reviewer\"\nmsgstr \"bedømmer\"\n\n#: build-home-authors.R:229\nmsgid \"thesis advisor\"\nmsgstr \"vejleder\"\n\n#: build-home-authors.R:230\nmsgid \"translator\"\nmsgstr \"oversætter\"\n\n#: build-home-authors.R:286 render.R:108\nmsgid \"Citation\"\nmsgstr \"Reference\"\n\n#: build-home-authors.R:287\nmsgid \"Citing %s\"\nmsgstr \"Citér %s\"\n\n#: build-home-community.R:22\nmsgid \"Contributing guide\"\nmsgstr \"Guide til bidragsydere\"\n\n#: build-home-community.R:26\nmsgid \"Code of conduct\"\nmsgstr \"Etisk regelsæt\"\n\n#: build-home-community.R:30\nmsgid \"Getting help\"\nmsgstr \"Få hjælp\"\n\n#: build-home-community.R:37\nmsgid \"Community\"\nmsgstr \"Fællesskab\"\n\n#: build-home-index.R:118\nmsgid \"Dev Status\"\nmsgstr \"Udviklingsstatus\"\n\n#: build-home-index.R:190\nmsgid \"View on %s\"\nmsgstr \"Se på %s\"\n\n#: build-home-index.R:191\nmsgid \"Browse source code\"\nmsgstr \"Se kildekode\"\n\n#: build-home-index.R:192\nmsgid \"Report a bug\"\nmsgstr \"Rapportér en fejl\"\n\n#: build-home-index.R:196\nmsgid \"Links\"\nmsgstr \"Links\"\n\n#: build-home-index.R:201 render.R:110\nmsgid \"Table of contents\"\nmsgstr \"Indholdsfortegnelse\"\n\n#: build-home-license.R:14 build-home-license.R:36\nmsgid \"License\"\nmsgstr \"Licens\"\n\n#: build-home-license.R:31\nmsgid \"Full license\"\nmsgstr \"Fuld licens\"\n\n#: build-news.R:101 build-news.R:262 build-news.R:266\nmsgid \"Changelog\"\nmsgstr \"Ændringslog\"\n\n#: build-news.R:128\nmsgid \"Version %s\"\nmsgstr \"Version %s\"\n\n#: build-news.R:140 build-news.R:257\nmsgid \"News\"\nmsgstr \"Nyheder\"\n\n#: build-news.R:259\nmsgid \"Releases\"\nmsgstr \"Udgivelser\"\n\n#: build-news.R:314\nmsgid \"CRAN release: %s\"\nmsgstr \"CRAN udgivelse: %s\"\n\n#: build-reference-index.R:23\nmsgid \"Package index\"\nmsgstr \"Pakke indeks\"\n\n#: build-reference-index.R:187\nmsgid \"All functions\"\nmsgstr \"Alle funktioner\"\n\n#: build-reference.R:377\nmsgid \"Usage\"\nmsgstr \"Brug\"\n\n#: build-tutorials.R:49 navbar.R:158\nmsgid \"Tutorials\"\nmsgstr \"Vejledning\"\n\n#: development.R:82\nmsgid \"Released version\"\nmsgstr \"Udgivet version\"\n\n#: development.R:83\nmsgid \"In-development version\"\nmsgstr \"Version under udvikling\"\n\n#: development.R:84\nmsgid \"Unreleased version\"\nmsgstr \"Ikke-udgivet version\"\n\n#: navbar-menu.R:212\nmsgid \"Search site\"\nmsgstr \"Søg\"\n\n#: navbar-menu.R:213\nmsgid \"Search for\"\nmsgstr \"Søg\"\n\n#: navbar.R:135\nmsgid \"Reference\"\nmsgstr \"Reference\"\n\n#: navbar.R:146\nmsgid \"Light switch\"\nmsgstr \"Lyskontakt\"\n\n#: navbar.R:149\nmsgid \"Light\"\nmsgstr \"Lys\"\n\n#: navbar.R:150\nmsgid \"Dark\"\nmsgstr \"Mørk\"\n\n#: navbar.R:151\nmsgid \"Auto\"\nmsgstr \"Auto\"\n\n#: navbar.R:187\nmsgid \"Get started\"\nmsgstr \"Kom igang\"\n\n#: navbar.R:228\nmsgid \"More articles...\"\nmsgstr \"Flere artikler...\"\n\n#: package.R:317\nmsgid \"deprecated\"\nmsgstr \"udfaset\"\n\n#: package.R:318\nmsgid \"superseded\"\nmsgstr \"erstattet\"\n\n#: package.R:319\nmsgid \"experimental\"\nmsgstr \"eksperimentel\"\n\n#: package.R:320\nmsgid \"stable\"\nmsgstr \"stabil\"\n\n#: rd-data.R:23\nmsgid \"Details\"\nmsgstr \"Detaljer\"\n\n#: rd-data.R:27\nmsgid \"Description\"\nmsgstr \"Beskrivelse\"\n\n#: rd-data.R:31\nmsgid \"References\"\nmsgstr \"Referencer\"\n\n#: rd-data.R:35 render.R:103\nmsgid \"Source\"\nmsgstr \"Kilde\"\n\n#: rd-data.R:39\nmsgid \"Format\"\nmsgstr \"Format\"\n\n#: rd-data.R:43\nmsgid \"Note\"\nmsgstr \"Note\"\n\n#: rd-data.R:47\nmsgid \"Author\"\nmsgstr \"Forfatter\"\n\n#: rd-data.R:51\nmsgid \"See also\"\nmsgstr \"Se også\"\n\n#: rd-data.R:67\nmsgid \"Arguments\"\nmsgstr \"Argumenter\"\n\n#: rd-data.R:75\nmsgid \"Value\"\nmsgstr \"Værdi\"\n\n#: render.R:100\nmsgid \"Skip to contents\"\nmsgstr \"Spring til indhold\"\n\n#: render.R:101\nmsgid \"Toggle navigation\"\nmsgstr \"Slå navigation til og fra\"\n\n#: render.R:102\nmsgid \"On this page\"\nmsgstr \"På denne side\"\n\n#: render.R:104\nmsgid \"Abstract\"\nmsgstr \"Sammenfatning\"\n\n#: render.R:105\nmsgid \"Authors\"\nmsgstr \"Forfattere\"\n\n#: render.R:106\nmsgid \"Version\"\nmsgstr \"Version\"\n\n#: render.R:107\nmsgid \"Examples\"\nmsgstr \"Eksempler\"\n\n#: render.R:109\nmsgid \"Additional details\"\nmsgstr \"Yderligere detaljer\"\n\n#: render.R:111\nmsgid \"Site navigation\"\nmsgstr \"Navigation på siden\"\n\n#: repo.R:37\nmsgid \"Source:\"\nmsgstr \"Kilde:\"\n\n#: tweak-homepage.R:68\nmsgid \"Dev status\"\nmsgstr \"Udviklingsstatus\"\n\n#: usage.R:52\nmsgid \"# Default %s method\"\nmsgstr \"# Standard %s metode\"\n\n#: usage.R:54\nmsgid \"# %s method for class '%s'\"\nmsgstr \"# %s metode for '%s'\"\n\n#~ msgid \"Function reference\"\n#~ msgstr \"Funktionsoversigt\"\n"
  },
  {
    "path": "po/R-es.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pkgdown 2.0.9.9000\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-10-17 18:07-0600\\n\"\n\"PO-Revision-Date: 2024-06-17 07:31+0000\\n\"\n\"Last-Translator: @dieghernan\\n\"\n\"Language-Team: es\\n\"\n\"Language: es\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=n != 1;\\n\"\n\"X-Loco-Source-Locale: es_ES\\n\"\n\"X-Generator: Loco https://localise.biz/\\n\"\n\"X-Loco-Parser: loco_parse_po\\n\"\n\n#: build-404.R:12\nmsgid \"Page not found (404)\"\nmsgstr \"Página no encontrada (404)\"\n\n#: build-404.R:13\nmsgid \"Content not found. Please use links in the navbar.\"\nmsgstr \"\"\n\"Contenido no encontrado. Por favor utilice los enlaces de la barra de \"\n\"navegación.\"\n\n#: build-articles.R:281 navbar.R:193 navbar.R:203 navbar.R:232\nmsgid \"Articles\"\nmsgstr \"Artículos\"\n\n#: build-articles.R:436\nmsgid \"All vignettes\"\nmsgstr \"Todos los artículos\"\n\n#: build-footer.R:42\nmsgid \"Developed by\"\nmsgstr \"Desarrollado por\"\n\n#: build-footer.R:49\nmsgid \"Site built with <a href=\\\"%s\\\">pkgdown</a> %s.\"\nmsgstr \"Sitio creado con <a href=\\\"%s\\\">pkgdown</a> %s.\"\n\n#: build-home-authors.R:12\nmsgid \"Authors and Citation\"\nmsgstr \"Autores y Citas\"\n\n#: build-home-authors.R:110\nmsgid \"More about authors...\"\nmsgstr \"Más sobre los autores...\"\n\n#: build-home-authors.R:113\nmsgid \"Developers\"\nmsgstr \"Desarrolladores\"\n\n#: build-home-authors.R:220\nmsgid \"author\"\nmsgstr \"autor-a\"\n\n#: build-home-authors.R:221\nmsgid \"compiler\"\nmsgstr \"compilador-a\"\n\n#: build-home-authors.R:222\nmsgid \"contractor\"\nmsgstr \"contratista\"\n\n#: build-home-authors.R:223\nmsgid \"contributor\"\nmsgstr \"colaborador-a\"\n\n#: build-home-authors.R:224\nmsgid \"copyright holder\"\nmsgstr \"titular de los derechos de autor\"\n\n#: build-home-authors.R:225\nmsgid \"maintainer\"\nmsgstr \"mantenedor-a\"\n\n#: build-home-authors.R:226\nmsgid \"data contributor\"\nmsgstr \"colaborador-a de datos\"\n\n#: build-home-authors.R:227\nmsgid \"funder\"\nmsgstr \"patrocinador-a\"\n\n#: build-home-authors.R:228\nmsgid \"reviewer\"\nmsgstr \"revisor-a\"\n\n#: build-home-authors.R:229\nmsgid \"thesis advisor\"\nmsgstr \"director-a de tesis\"\n\n#: build-home-authors.R:230\nmsgid \"translator\"\nmsgstr \"traductor-a\"\n\n#: build-home-authors.R:286 render.R:108\nmsgid \"Citation\"\nmsgstr \"Cita\"\n\n#: build-home-authors.R:287\nmsgid \"Citing %s\"\nmsgstr \"Cómo citar %s\"\n\n#: build-home-community.R:22\nmsgid \"Contributing guide\"\nmsgstr \"Guía para colaboradores\"\n\n#: build-home-community.R:26\nmsgid \"Code of conduct\"\nmsgstr \"Código de conducta\"\n\n#: build-home-community.R:30\nmsgid \"Getting help\"\nmsgstr \"Ayuda y soporte\"\n\n#: build-home-community.R:37\nmsgid \"Community\"\nmsgstr \"Comunidad\"\n\n#: build-home-index.R:118\nmsgid \"Dev Status\"\nmsgstr \"Estado de Desarrollo\"\n\n#: build-home-index.R:190\nmsgid \"View on %s\"\nmsgstr \"Ver en %s\"\n\n#: build-home-index.R:191\nmsgid \"Browse source code\"\nmsgstr \"Ir al código fuente\"\n\n#: build-home-index.R:192\nmsgid \"Report a bug\"\nmsgstr \"Informar de un problema\"\n\n#: build-home-index.R:196\nmsgid \"Links\"\nmsgstr \"Enlaces\"\n\n#: build-home-index.R:201 render.R:110\nmsgid \"Table of contents\"\nmsgstr \"Índice de contenidos\"\n\n#: build-home-license.R:14 build-home-license.R:36\nmsgid \"License\"\nmsgstr \"Licencia\"\n\n#: build-home-license.R:31\nmsgid \"Full license\"\nmsgstr \"Licencia completa\"\n\n#: build-news.R:101 build-news.R:262 build-news.R:266\nmsgid \"Changelog\"\nmsgstr \"Registro de cambios\"\n\n#: build-news.R:128\nmsgid \"Version %s\"\nmsgstr \"Versión %s\"\n\n#: build-news.R:140 build-news.R:257\nmsgid \"News\"\nmsgstr \"Noticias\"\n\n#: build-news.R:259\nmsgid \"Releases\"\nmsgstr \"Lanzamientos\"\n\n#: build-news.R:314\nmsgid \"CRAN release: %s\"\nmsgstr \"Versión CRAN: %s\"\n\n#: build-reference-index.R:23\nmsgid \"Package index\"\nmsgstr \"Índice del paquete\"\n\n#: build-reference-index.R:187\nmsgid \"All functions\"\nmsgstr \"Todas las funciones\"\n\n#: build-reference.R:377\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\n#: build-tutorials.R:49 navbar.R:158\nmsgid \"Tutorials\"\nmsgstr \"Tutoriales\"\n\n#: development.R:82\nmsgid \"Released version\"\nmsgstr \"Versión publicada\"\n\n#: development.R:83\nmsgid \"In-development version\"\nmsgstr \"Versión en desarrollo\"\n\n#: development.R:84\nmsgid \"Unreleased version\"\nmsgstr \"Versión no publicada\"\n\n#: navbar-menu.R:212\nmsgid \"Search site\"\nmsgstr \"Buscar en el sitio\"\n\n#: navbar-menu.R:213\nmsgid \"Search for\"\nmsgstr \"Buscar\"\n\n#: navbar.R:135\nmsgid \"Reference\"\nmsgstr \"Índice\"\n\n#: navbar.R:146\nmsgid \"Light switch\"\nmsgstr \"Interruptor de color\"\n\n#: navbar.R:149\nmsgid \"Light\"\nmsgstr \"Claro\"\n\n#: navbar.R:150\nmsgid \"Dark\"\nmsgstr \"Oscuro\"\n\n#: navbar.R:151\nmsgid \"Auto\"\nmsgstr \"Auto\"\n\n#: navbar.R:187\nmsgid \"Get started\"\nmsgstr \"Primeros pasos\"\n\n#: navbar.R:228\nmsgid \"More articles...\"\nmsgstr \"Más artículos...\"\n\n# Assuming feminine (e.g. functions). Arguments in Spanish are masculine (e.g. obsoleto)\n#: package.R:317\nmsgid \"deprecated\"\nmsgstr \"obsoleta\"\n\n# Assuming feminine (e.g. functions). Arguments in Spanish are masculine (e.g. reemplazado)\n#: package.R:318\nmsgid \"superseded\"\nmsgstr \"reemplazada\"\n\n#: package.R:319\nmsgid \"experimental\"\nmsgstr \"experimental\"\n\n#: package.R:320\nmsgid \"stable\"\nmsgstr \"estable\"\n\n#: rd-data.R:23\nmsgid \"Details\"\nmsgstr \"Detalles\"\n\n#: rd-data.R:27\nmsgid \"Description\"\nmsgstr \"Descripción\"\n\n#: rd-data.R:31\nmsgid \"References\"\nmsgstr \"Referencias\"\n\n#: rd-data.R:35 render.R:103\nmsgid \"Source\"\nmsgstr \"Fuente\"\n\n#: rd-data.R:39\nmsgid \"Format\"\nmsgstr \"Formato\"\n\n#: rd-data.R:43\nmsgid \"Note\"\nmsgstr \"Nota\"\n\n#: rd-data.R:47\nmsgid \"Author\"\nmsgstr \"Autor-a\"\n\n#: rd-data.R:51\nmsgid \"See also\"\nmsgstr \"Ver también\"\n\n#: rd-data.R:67\nmsgid \"Arguments\"\nmsgstr \"Argumentos\"\n\n#: rd-data.R:75\nmsgid \"Value\"\nmsgstr \"Valor\"\n\n#: render.R:100\nmsgid \"Skip to contents\"\nmsgstr \"Ir al contenido\"\n\n#: render.R:101\nmsgid \"Toggle navigation\"\nmsgstr \"Cambiar la navegación\"\n\n#: render.R:102\nmsgid \"On this page\"\nmsgstr \"En esta página\"\n\n#: render.R:104\nmsgid \"Abstract\"\nmsgstr \"Resumen\"\n\n#: render.R:105\nmsgid \"Authors\"\nmsgstr \"Autores\"\n\n#: render.R:106\nmsgid \"Version\"\nmsgstr \"Versión\"\n\n#: render.R:107\nmsgid \"Examples\"\nmsgstr \"Ejemplos\"\n\n#: render.R:109\nmsgid \"Additional details\"\nmsgstr \"Detalles adicionales\"\n\n#: render.R:111\nmsgid \"Site navigation\"\nmsgstr \"Navegación del sitio\"\n\n#: repo.R:37\nmsgid \"Source:\"\nmsgstr \"Código:\"\n\n#: tweak-homepage.R:68\nmsgid \"Dev status\"\nmsgstr \"Estado de desarrollo\"\n\n#: usage.R:52\nmsgid \"# Default %s method\"\nmsgstr \"# Método %s por defecto\"\n\n#: usage.R:54\nmsgid \"# %s method for class '%s'\"\nmsgstr \"# Método %s para la clase '%s'\"\n\n#~ msgid \"Function reference\"\n#~ msgstr \"Índice de funciones\"\n"
  },
  {
    "path": "po/R-fr.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pkgdown 2.0.9.9000\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-10-17 18:07-0600\\n\"\n\"PO-Revision-Date: 2024-06-15 20:28-0400\\n\"\n\"Last-Translator: J.P. Le Cavalier <jplecavalier@me.com>\\n\"\n\"Language-Team: fr\\n\"\n\"Language: fr\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: potools 0.2.2\\n\"\n\n#: build-404.R:12\nmsgid \"Page not found (404)\"\nmsgstr \"Page introuvable (404)\"\n\n#: build-404.R:13\nmsgid \"Content not found. Please use links in the navbar.\"\nmsgstr \"\"\n\"Contenu introuvable. Merci d'utiliser les liens de la barre de navigation.\"\n\n#: build-articles.R:281 navbar.R:193 navbar.R:203 navbar.R:232\nmsgid \"Articles\"\nmsgstr \"Articles\"\n\n#: build-articles.R:436\nmsgid \"All vignettes\"\nmsgstr \"Tous les articles\"\n\n#: build-footer.R:42\nmsgid \"Developed by\"\nmsgstr \"Développé par\"\n\n#: build-footer.R:49\nmsgid \"Site built with <a href=\\\"%s\\\">pkgdown</a> %s.\"\nmsgstr \"Site créé avec <a href=\\\"%s\\\">pkgdown</a> %s.\"\n\n#: build-home-authors.R:12\nmsgid \"Authors and Citation\"\nmsgstr \"Auteur·rice·s et Citation\"\n\n#: build-home-authors.R:110\nmsgid \"More about authors...\"\nmsgstr \"À propos des auteur·rice·s...\"\n\n#: build-home-authors.R:113\nmsgid \"Developers\"\nmsgstr \"Développeur·se·s\"\n\n#: build-home-authors.R:220\nmsgid \"author\"\nmsgstr \"auteur·rice\"\n\n#: build-home-authors.R:221\nmsgid \"compiler\"\nmsgstr \"compilateur·rice\"\n\n#: build-home-authors.R:222\nmsgid \"contractor\"\nmsgstr \"fournisseur·se\"\n\n#: build-home-authors.R:223\nmsgid \"contributor\"\nmsgstr \"contributeur·rice\"\n\n#: build-home-authors.R:224\nmsgid \"copyright holder\"\nmsgstr \"titulaire des droits d'auteur\"\n\n#: build-home-authors.R:225\nmsgid \"maintainer\"\nmsgstr \"mainteneur·se\"\n\n#: build-home-authors.R:226\nmsgid \"data contributor\"\nmsgstr \"contributeur·rice des données\"\n\n#: build-home-authors.R:227\nmsgid \"funder\"\nmsgstr \"fondateur·rice\"\n\n#: build-home-authors.R:228\nmsgid \"reviewer\"\nmsgstr \"réviseur·se\"\n\n#: build-home-authors.R:229\nmsgid \"thesis advisor\"\nmsgstr \"directeur·rice de thèse\"\n\n#: build-home-authors.R:230\nmsgid \"translator\"\nmsgstr \"traducteur·rice\"\n\n#: build-home-authors.R:286 render.R:108\nmsgid \"Citation\"\nmsgstr \"Citation\"\n\n#: build-home-authors.R:287\nmsgid \"Citing %s\"\nmsgstr \"Citer %s\"\n\n#: build-home-community.R:22\nmsgid \"Contributing guide\"\nmsgstr \"Guide de contribution\"\n\n#: build-home-community.R:26\nmsgid \"Code of conduct\"\nmsgstr \"Code de conduite\"\n\n#: build-home-community.R:30\nmsgid \"Getting help\"\nmsgstr \"Obtenir de l'aide\"\n\n#: build-home-community.R:37\nmsgid \"Community\"\nmsgstr \"Communauté\"\n\n#: build-home-index.R:118\nmsgid \"Dev Status\"\nmsgstr \"Statut de développement\"\n\n#: build-home-index.R:190\nmsgid \"View on %s\"\nmsgstr \"Voir sur %s\"\n\n#: build-home-index.R:191\nmsgid \"Browse source code\"\nmsgstr \"Naviguer le code source\"\n\n#: build-home-index.R:192\nmsgid \"Report a bug\"\nmsgstr \"Signaler un bogue\"\n\n#: build-home-index.R:196\nmsgid \"Links\"\nmsgstr \"Liens\"\n\n#: build-home-index.R:201 render.R:110\nmsgid \"Table of contents\"\nmsgstr \"Table des matières\"\n\n#: build-home-license.R:14 build-home-license.R:36\nmsgid \"License\"\nmsgstr \"Licence\"\n\n#: build-home-license.R:31\nmsgid \"Full license\"\nmsgstr \"Licence complète\"\n\n#: build-news.R:101 build-news.R:262 build-news.R:266\nmsgid \"Changelog\"\nmsgstr \"Changements\"\n\n#: build-news.R:128\nmsgid \"Version %s\"\nmsgstr \"Version %s\"\n\n#: build-news.R:140 build-news.R:257\nmsgid \"News\"\nmsgstr \"Nouveautés\"\n\n#: build-news.R:259\nmsgid \"Releases\"\nmsgstr \"Versions\"\n\n#: build-news.R:314\nmsgid \"CRAN release: %s\"\nmsgstr \"Version CRAN : %s\"\n\n#: build-reference-index.R:23\nmsgid \"Package index\"\nmsgstr \"Index du paquet\"\n\n#: build-reference-index.R:187\nmsgid \"All functions\"\nmsgstr \"Toutes les fonctions\"\n\n#: build-reference.R:377\nmsgid \"Usage\"\nmsgstr \"Utilisation\"\n\n#: build-tutorials.R:49 navbar.R:158\nmsgid \"Tutorials\"\nmsgstr \"Tutoriels\"\n\n#: development.R:82\nmsgid \"Released version\"\nmsgstr \"Dernière version publiée\"\n\n#: development.R:83\nmsgid \"In-development version\"\nmsgstr \"Version en développement\"\n\n#: development.R:84\nmsgid \"Unreleased version\"\nmsgstr \"Version inédite\"\n\n#: navbar-menu.R:212\nmsgid \"Search site\"\nmsgstr \"Rechercher sur le site\"\n\n#: navbar-menu.R:213\nmsgid \"Search for\"\nmsgstr \"Rechercher\"\n\n#: navbar.R:135\nmsgid \"Reference\"\nmsgstr \"Référence\"\n\n#: navbar.R:146\nmsgid \"Light switch\"\nmsgstr \"Interrupteur\"\n\n#: navbar.R:149\nmsgid \"Light\"\nmsgstr \"Clair\"\n\n#: navbar.R:150\nmsgid \"Dark\"\nmsgstr \"Sombre\"\n\n#: navbar.R:151\nmsgid \"Auto\"\nmsgstr \"Automatique\"\n\n#: navbar.R:187\nmsgid \"Get started\"\nmsgstr \"Prise en main\"\n\n#: navbar.R:228\nmsgid \"More articles...\"\nmsgstr \"Plus d'articles...\"\n\n#: package.R:317\nmsgid \"deprecated\"\nmsgstr \"obsolète\"\n\n#: package.R:318\nmsgid \"superseded\"\nmsgstr \"remplacée\"\n\n#: package.R:319\nmsgid \"experimental\"\nmsgstr \"expérimentale\"\n\n#: package.R:320\nmsgid \"stable\"\nmsgstr \"stable\"\n\n#: rd-data.R:23\nmsgid \"Details\"\nmsgstr \"Détails\"\n\n#: rd-data.R:27\nmsgid \"Description\"\nmsgstr \"Description\"\n\n#: rd-data.R:31\nmsgid \"References\"\nmsgstr \"Références\"\n\n#: rd-data.R:35 render.R:103\nmsgid \"Source\"\nmsgstr \"Source\"\n\n#: rd-data.R:39\nmsgid \"Format\"\nmsgstr \"Format\"\n\n#: rd-data.R:43\nmsgid \"Note\"\nmsgstr \"Note\"\n\n#: rd-data.R:47\nmsgid \"Author\"\nmsgstr \"Auteur·rice\"\n\n#: rd-data.R:51\nmsgid \"See also\"\nmsgstr \"Voir également\"\n\n#: rd-data.R:67\nmsgid \"Arguments\"\nmsgstr \"Arguments\"\n\n#: rd-data.R:75\nmsgid \"Value\"\nmsgstr \"Valeur de retour\"\n\n#: render.R:100\nmsgid \"Skip to contents\"\nmsgstr \"Passer au contenu\"\n\n#: render.R:101\nmsgid \"Toggle navigation\"\nmsgstr \"Activer la navigation\"\n\n#: render.R:102\nmsgid \"On this page\"\nmsgstr \"Sur cette page\"\n\n#: render.R:104\nmsgid \"Abstract\"\nmsgstr \"Résumé\"\n\n#: render.R:105\nmsgid \"Authors\"\nmsgstr \"Auteur·rice·s\"\n\n#: render.R:106\nmsgid \"Version\"\nmsgstr \"Version\"\n\n#: render.R:107\nmsgid \"Examples\"\nmsgstr \"Exemples\"\n\n#: render.R:109\nmsgid \"Additional details\"\nmsgstr \"Détails supplémentaires\"\n\n#: render.R:111\nmsgid \"Site navigation\"\nmsgstr \"Navigation sur le site\"\n\n#: repo.R:37\nmsgid \"Source:\"\nmsgstr \"Source :\"\n\n#: tweak-homepage.R:68\nmsgid \"Dev status\"\nmsgstr \"Statut de développement\"\n\n#: usage.R:52\nmsgid \"# Default %s method\"\nmsgstr \"# Méthode %s par défaut\"\n\n#: usage.R:54\nmsgid \"# %s method for class '%s'\"\nmsgstr \"# Méthode %s pour la classe %s\"\n\n#~ msgid \"Function reference\"\n#~ msgstr \"Documentation des fonctions\"\n"
  },
  {
    "path": "po/R-ja.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pkgdown 2.0.9.9000\\n\"\n\"POT-Creation-Date: 2025-10-20 18:57-0600\\n\"\n\"PO-Revision-Date: 2024-05-24 09:36-0500\\n\"\n\"Last-Translator: Positron Assistant (Claude Sonnet 4)\\n\"\n\"Language-Team: none\\n\"\n\"Language: ja\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\n#: build-404.R:12\nmsgid \"Page not found (404)\"\nmsgstr \"ページが見つかりません (404)\"\n\n#: build-404.R:13\nmsgid \"Content not found. Please use links in the navbar.\"\nmsgstr \"コンテンツが見つかりません。ナビゲーションからお探しください。\"\n\n#: build-articles.R:281 navbar.R:193 navbar.R:203 navbar.R:232\nmsgid \"Articles\"\nmsgstr \"記事\"\n\n#: build-articles.R:436\nmsgid \"All vignettes\"\nmsgstr \"すべての解説記事\"\n\n#: build-footer.R:42\nmsgid \"Developed by\"\nmsgstr \"開発者\"\n\n#: build-footer.R:49\nmsgid \"Site built with <a href=\\\"%s\\\">pkgdown</a> %s.\"\nmsgstr \"<a href=\\\"%s\\\">pkgdown</a> %s で構築されたサイト。\"\n\n#: build-home-authors.R:12\nmsgid \"Authors and Citation\"\nmsgstr \"作者と引用\"\n\n#: build-home-authors.R:110\nmsgid \"More about authors...\"\nmsgstr \"作者情報...\"\n\n#: build-home-authors.R:113\nmsgid \"Developers\"\nmsgstr \"開発者\"\n\n#: build-home-authors.R:220\nmsgid \"author\"\nmsgstr \"作者\"\n\n#: build-home-authors.R:221\nmsgid \"compiler\"\nmsgstr \"編集者\"\n\n#: build-home-authors.R:222\nmsgid \"contractor\"\nmsgstr \"契約者\"\n\n#: build-home-authors.R:223\nmsgid \"contributor\"\nmsgstr \"貢献者\"\n\n#: build-home-authors.R:224\nmsgid \"copyright holder\"\nmsgstr \"著作権者\"\n\n#: build-home-authors.R:225\nmsgid \"maintainer\"\nmsgstr \"メンテナ\"\n\n#: build-home-authors.R:226\nmsgid \"data contributor\"\nmsgstr \"データ提供者\"\n\n#: build-home-authors.R:227\nmsgid \"funder\"\nmsgstr \"資金提供者\"\n\n#: build-home-authors.R:228\nmsgid \"reviewer\"\nmsgstr \"査読者\"\n\n#: build-home-authors.R:229\nmsgid \"thesis advisor\"\nmsgstr \"論文指導教員\"\n\n#: build-home-authors.R:230\nmsgid \"translator\"\nmsgstr \"翻訳者\"\n\n#: build-home-authors.R:286 render.R:108\nmsgid \"Citation\"\nmsgstr \"引用\"\n\n#: build-home-authors.R:287\nmsgid \"Citing %s\"\nmsgstr \"%s の引用\"\n\n#: build-home-community.R:22\nmsgid \"Contributing guide\"\nmsgstr \"貢献ガイド\"\n\n#: build-home-community.R:26\nmsgid \"Code of conduct\"\nmsgstr \"行動規範\"\n\n#: build-home-community.R:30\nmsgid \"Getting help\"\nmsgstr \"ヘルプ\"\n\n#: build-home-community.R:37\nmsgid \"Community\"\nmsgstr \"コミュニティ\"\n\n#: build-home-index.R:118\nmsgid \"Dev Status\"\nmsgstr \"開発ステータス\"\n\n#: build-home-index.R:190\nmsgid \"View on %s\"\nmsgstr \"%s で見る\"\n\n#: build-home-index.R:191\nmsgid \"Browse source code\"\nmsgstr \"ソースコードを見る\"\n\n#: build-home-index.R:192\nmsgid \"Report a bug\"\nmsgstr \"バグを報告\"\n\n#: build-home-index.R:196\nmsgid \"Links\"\nmsgstr \"リンク\"\n\n#: build-home-index.R:201 render.R:110\nmsgid \"Table of contents\"\nmsgstr \"目次\"\n\n#: build-home-license.R:14 build-home-license.R:36\nmsgid \"License\"\nmsgstr \"ライセンス\"\n\n#: build-home-license.R:31\nmsgid \"Full license\"\nmsgstr \"ライセンス全文\"\n\n#: build-news.R:101 build-news.R:262 build-news.R:266\nmsgid \"Changelog\"\nmsgstr \"変更履歴\"\n\n#: build-news.R:128\nmsgid \"Version %s\"\nmsgstr \"バージョン %s\"\n\n#: build-news.R:140 build-news.R:257\nmsgid \"News\"\nmsgstr \"ニュース\"\n\n#: build-news.R:259\nmsgid \"Releases\"\nmsgstr \"リリース\"\n\n#: build-news.R:314\nmsgid \"CRAN release: %s\"\nmsgstr \"CRANリリース: %s\"\n\n#: build-reference-index.R:23\nmsgid \"Package index\"\nmsgstr \"パッケージ索引\"\n\n#: build-reference-index.R:187\nmsgid \"All functions\"\nmsgstr \"すべての関数\"\n\n#: build-reference.R:377\nmsgid \"Usage\"\nmsgstr \"使用法\"\n\n#: build-tutorials.R:49 navbar.R:158\nmsgid \"Tutorials\"\nmsgstr \"チュートリアル\"\n\n#: development.R:82\nmsgid \"Released version\"\nmsgstr \"リリース版\"\n\n#: development.R:83\nmsgid \"In-development version\"\nmsgstr \"開発版\"\n\n#: development.R:84\nmsgid \"Unreleased version\"\nmsgstr \"未リリース版\"\n\n#: navbar-menu.R:212\nmsgid \"Search site\"\nmsgstr \"サイト内検索\"\n\n#: navbar-menu.R:213\nmsgid \"Search for\"\nmsgstr \"検索\"\n\n#: navbar.R:135\nmsgid \"Reference\"\nmsgstr \"リファレンス\"\n\n#: navbar.R:146\nmsgid \"Light switch\"\nmsgstr \"テーマ切替\"\n\n#: navbar.R:149\nmsgid \"Light\"\nmsgstr \"ライト\"\n\n#: navbar.R:150\nmsgid \"Dark\"\nmsgstr \"ダーク\"\n\n#: navbar.R:151\nmsgid \"Auto\"\nmsgstr \"自動\"\n\n#: navbar.R:187\nmsgid \"Get started\"\nmsgstr \"はじめに\"\n\n#: navbar.R:228\nmsgid \"More articles...\"\nmsgstr \"さらに記事を見る...\"\n\n#: package.R:317\nmsgid \"deprecated\"\nmsgstr \"非推奨\"\n\n#: package.R:318\nmsgid \"superseded\"\nmsgstr \"後継があります\"\n\n#: package.R:319\nmsgid \"experimental\"\nmsgstr \"実験的\"\n\n#: package.R:320\nmsgid \"stable\"\nmsgstr \"安定版\"\n\n#: rd-data.R:23\nmsgid \"Details\"\nmsgstr \"詳細\"\n\n#: rd-data.R:27\nmsgid \"Description\"\nmsgstr \"説明\"\n\n#: rd-data.R:31\nmsgid \"References\"\nmsgstr \"参考文献\"\n\n#: rd-data.R:35 render.R:103\nmsgid \"Source\"\nmsgstr \"ソース\"\n\n#: rd-data.R:39\nmsgid \"Format\"\nmsgstr \"形式\"\n\n#: rd-data.R:43\nmsgid \"Note\"\nmsgstr \"注記\"\n\n#: rd-data.R:47\nmsgid \"Author\"\nmsgstr \"作者\"\n\n#: rd-data.R:51\nmsgid \"See also\"\nmsgstr \"参照\"\n\n#: rd-data.R:67\nmsgid \"Arguments\"\nmsgstr \"引数\"\n\n#: rd-data.R:75\nmsgid \"Value\"\nmsgstr \"戻り値\"\n\n#: render.R:100\nmsgid \"Skip to contents\"\nmsgstr \"コンテンツへスキップ\"\n\n#: render.R:101\nmsgid \"Toggle navigation\"\nmsgstr \"ナビゲーション切替\"\n\n#: render.R:102\nmsgid \"On this page\"\nmsgstr \"このページ\"\n\n#: render.R:104\nmsgid \"Abstract\"\nmsgstr \"概要\"\n\n#: render.R:105\nmsgid \"Authors\"\nmsgstr \"作者\"\n\n#: render.R:106\nmsgid \"Version\"\nmsgstr \"バージョン\"\n\n#: render.R:107\nmsgid \"Examples\"\nmsgstr \"例\"\n\n#: render.R:109\nmsgid \"Additional details\"\nmsgstr \"追加の詳細\"\n\n#: render.R:111\nmsgid \"Site navigation\"\nmsgstr \"サイトナビゲーション\"\n\n#: repo.R:37\nmsgid \"Source:\"\nmsgstr \"ソース:\"\n\n#: tweak-homepage.R:68\nmsgid \"Dev status\"\nmsgstr \"開発ステータス\"\n\n#: usage.R:52\nmsgid \"# Default %s method\"\nmsgstr \"# デフォルトの %s メソッド\"\n\n#: usage.R:54\nmsgid \"# %s method for class '%s'\"\nmsgstr \"# クラス '%2$s' の %1$s メソッド\"\n"
  },
  {
    "path": "po/R-ko.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pkgdown 1.9000.9000.9000\\n\"\n\"POT-Creation-Date: 2025-10-17 18:07-0600\\n\"\n\"PO-Revision-Date: 2021-11-26 15:57-0600\\n\"\n\"Last-Translator: Chanyub Park <mrchypark@gmail.com>\\n\"\n\"Language-Team: @mrchypark\\n\"\n\"Language: ko\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: build-404.R:12\nmsgid \"Page not found (404)\"\nmsgstr \"페이지를 찾을 수 없습니다 (404)\"\n\n#: build-404.R:13\nmsgid \"Content not found. Please use links in the navbar.\"\nmsgstr \"콘텐츠를 찾을 수 없습니다. 네비게이션 바의 링크를 이용해 주세요.\"\n\n#: build-articles.R:281 navbar.R:193 navbar.R:203 navbar.R:232\nmsgid \"Articles\"\nmsgstr \"관련 글 목록\"\n\n#: build-articles.R:436\nmsgid \"All vignettes\"\nmsgstr \"전체 사용설명서(비네트)\"\n\n#: build-footer.R:42\nmsgid \"Developed by\"\nmsgstr \"개발자:\"\n\n#: build-footer.R:49\nmsgid \"Site built with <a href=\\\"%s\\\">pkgdown</a> %s.\"\nmsgstr \"\"\n\"현재 사이트는 다음 패키지로 생성하였습니다. - <a href=\\\"%s\\\">pkgdown</a> %s\"\n\n#: build-home-authors.R:12\nmsgid \"Authors and Citation\"\nmsgstr \"저자와 인용\"\n\n#: build-home-authors.R:110\nmsgid \"More about authors...\"\nmsgstr \"저자에 대한 부분은...\"\n\n#: build-home-authors.R:113\nmsgid \"Developers\"\nmsgstr \"개발자들\"\n\n#: build-home-authors.R:220\nmsgid \"author\"\nmsgstr \"저자\"\n\n#: build-home-authors.R:221\nmsgid \"compiler\"\nmsgstr \"편집자\"\n\n#: build-home-authors.R:222\nmsgid \"contractor\"\nmsgstr \"계약자\"\n\n#: build-home-authors.R:223\nmsgid \"contributor\"\nmsgstr \"기여자\"\n\n#: build-home-authors.R:224\nmsgid \"copyright holder\"\nmsgstr \"저작권자\"\n\n#: build-home-authors.R:225\nmsgid \"maintainer\"\nmsgstr \"관리자\"\n\n#: build-home-authors.R:226\nmsgid \"data contributor\"\nmsgstr \"데이터 기여자\"\n\n#: build-home-authors.R:227\nmsgid \"funder\"\nmsgstr \"자금 제공자\"\n\n#: build-home-authors.R:228\nmsgid \"reviewer\"\nmsgstr \"리뷰어\"\n\n#: build-home-authors.R:229\nmsgid \"thesis advisor\"\nmsgstr \"지도교수\"\n\n#: build-home-authors.R:230\nmsgid \"translator\"\nmsgstr \"번역자\"\n\n#: build-home-authors.R:286 render.R:108\nmsgid \"Citation\"\nmsgstr \"인용\"\n\n#: build-home-authors.R:287\nmsgid \"Citing %s\"\nmsgstr \"%s 인용하기\"\n\n#: build-home-community.R:22\nmsgid \"Contributing guide\"\nmsgstr \"기여 가이드\"\n\n#: build-home-community.R:26\nmsgid \"Code of conduct\"\nmsgstr \"행동강령\"\n\n#: build-home-community.R:30\nmsgid \"Getting help\"\nmsgstr \"도움말\"\n\n#: build-home-community.R:37\nmsgid \"Community\"\nmsgstr \"커뮤니티\"\n\n#: build-home-index.R:118\nmsgid \"Dev Status\"\nmsgstr \"개발 상태\"\n\n#: build-home-index.R:190\nmsgid \"View on %s\"\nmsgstr \"%s에서 보기\"\n\n#: build-home-index.R:191\nmsgid \"Browse source code\"\nmsgstr \"소스코드 보기\"\n\n#: build-home-index.R:192\nmsgid \"Report a bug\"\nmsgstr \"버그 신고\"\n\n#: build-home-index.R:196\nmsgid \"Links\"\nmsgstr \"링크\"\n\n#: build-home-index.R:201 render.R:110\nmsgid \"Table of contents\"\nmsgstr \"목차\"\n\n#: build-home-license.R:14 build-home-license.R:36\nmsgid \"License\"\nmsgstr \"라이선스\"\n\n#: build-home-license.R:31\nmsgid \"Full license\"\nmsgstr \"전체 라이선스\"\n\n#: build-news.R:101 build-news.R:262 build-news.R:266\nmsgid \"Changelog\"\nmsgstr \"변경 사항\"\n\n#: build-news.R:128\nmsgid \"Version %s\"\nmsgstr \"버전 %s\"\n\n#: build-news.R:140 build-news.R:257\nmsgid \"News\"\nmsgstr \"뉴스\"\n\n#: build-news.R:259\nmsgid \"Releases\"\nmsgstr \"릴리즈\"\n\n#: build-news.R:314\nmsgid \"CRAN release: %s\"\nmsgstr \"CRAN 배포: %s\"\n\n#: build-reference-index.R:23\nmsgid \"Package index\"\nmsgstr \"패키지 색인\"\n\n#: build-reference-index.R:187\nmsgid \"All functions\"\nmsgstr \"모든 함수\"\n\n#: build-reference.R:377\nmsgid \"Usage\"\nmsgstr \"사용법\"\n\n#: build-tutorials.R:49 navbar.R:158\nmsgid \"Tutorials\"\nmsgstr \"튜토리얼\"\n\n#: development.R:82\nmsgid \"Released version\"\nmsgstr \"배포 버전\"\n\n#: development.R:83\nmsgid \"In-development version\"\nmsgstr \"개발 버전\"\n\n#: development.R:84\nmsgid \"Unreleased version\"\nmsgstr \"배포전 버전\"\n\n#: navbar-menu.R:212\nmsgid \"Search site\"\nmsgstr \"사이트 검색\"\n\n#: navbar-menu.R:213\nmsgid \"Search for\"\nmsgstr \"검색\"\n\n#: navbar.R:135\nmsgid \"Reference\"\nmsgstr \"참조\"\n\n#: navbar.R:146\nmsgid \"Light switch\"\nmsgstr \"테마 전환\"\n\n#: navbar.R:149\nmsgid \"Light\"\nmsgstr \"밝음\"\n\n#: navbar.R:150\nmsgid \"Dark\"\nmsgstr \"어두움\"\n\n#: navbar.R:151\nmsgid \"Auto\"\nmsgstr \"자동\"\n\n#: navbar.R:187\nmsgid \"Get started\"\nmsgstr \"시작하기\"\n\n#: navbar.R:228\nmsgid \"More articles...\"\nmsgstr \"더 보기...\"\n\n#: package.R:317\nmsgid \"deprecated\"\nmsgstr \"더 이상 사용되지 않음\"\n\n#: package.R:318\nmsgid \"superseded\"\nmsgstr \"대체됨\"\n\n#: package.R:319\nmsgid \"experimental\"\nmsgstr \"실험적\"\n\n#: package.R:320\nmsgid \"stable\"\nmsgstr \"안정\"\n\n#: rd-data.R:23\nmsgid \"Details\"\nmsgstr \"세부사항\"\n\n#: rd-data.R:27\nmsgid \"Description\"\nmsgstr \"설명\"\n\n#: rd-data.R:31\nmsgid \"References\"\nmsgstr \"참조\"\n\n#: rd-data.R:35 render.R:103\nmsgid \"Source\"\nmsgstr \"소스코드\"\n\n#: rd-data.R:39\nmsgid \"Format\"\nmsgstr \"양식\"\n\n#: rd-data.R:43\nmsgid \"Note\"\nmsgstr \"노트\"\n\n#: rd-data.R:47\nmsgid \"Author\"\nmsgstr \"저자\"\n\n#: rd-data.R:51\nmsgid \"See also\"\nmsgstr \"더 보기\"\n\n#: rd-data.R:67\nmsgid \"Arguments\"\nmsgstr \"인수\"\n\n#: rd-data.R:75\nmsgid \"Value\"\nmsgstr \"값\"\n\n#: render.R:100\nmsgid \"Skip to contents\"\nmsgstr \"콘텐츠로 바로가기\"\n\n#: render.R:101\nmsgid \"Toggle navigation\"\nmsgstr \"네비게이션바 열기\"\n\n#: render.R:102\nmsgid \"On this page\"\nmsgstr \"목차\"\n\n#: render.R:104\nmsgid \"Abstract\"\nmsgstr \"초록\"\n\n#: render.R:105\nmsgid \"Authors\"\nmsgstr \"저자들\"\n\n#: render.R:106\nmsgid \"Version\"\nmsgstr \"버전\"\n\n#: render.R:107\nmsgid \"Examples\"\nmsgstr \"예시 코드\"\n\n#: render.R:109\nmsgid \"Additional details\"\nmsgstr \"추가 정보\"\n\n#: render.R:111\nmsgid \"Site navigation\"\nmsgstr \"사이트 탐색\"\n\n#: repo.R:37\nmsgid \"Source:\"\nmsgstr \"소스코드:\"\n\n#: tweak-homepage.R:68\nmsgid \"Dev status\"\nmsgstr \"개발 상태\"\n\n#: usage.R:52\nmsgid \"# Default %s method\"\nmsgstr \"# 기본 %s 메서드\"\n\n#: usage.R:54\nmsgid \"# %s method for class '%s'\"\nmsgstr \"# '%s' 클래스의 %s 메서드\"\n\n#~ msgid \"Function reference\"\n#~ msgstr \"함수 레퍼런스\"\n"
  },
  {
    "path": "po/R-nl.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pkgdown 2.0.9.9000\\n\"\n\"POT-Creation-Date: 2025-10-20 18:57-0600\\n\"\n\"PO-Revision-Date: 2025-10-16 23:28+1\\n\"\n\"Last-Translator: Pepijn de Vries <pepijn.devries@outlook.com>\\n\"\n\"Language-Team: @pepijn-devries\\n\"\n\"Language: nl\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: build-404.R:12\nmsgid \"Page not found (404)\"\nmsgstr \"Pagina niet gevonden (404)\"\n\n#: build-404.R:13\nmsgid \"Content not found. Please use links in the navbar.\"\nmsgstr \"Inhoud niet gevonden. Gebruik alstublieft de links in de navigatiebalk.\"\n\n#: build-articles.R:281 navbar.R:193 navbar.R:203 navbar.R:232\nmsgid \"Articles\"\nmsgstr \"Artikelen\"\n\n#: build-articles.R:436\nmsgid \"All vignettes\"\nmsgstr \"Alle vignetten\"\n\n#: build-footer.R:42\nmsgid \"Developed by\"\nmsgstr \"Ontwikkeld door\"\n\n#: build-footer.R:49\nmsgid \"Site built with <a href=\\\"%s\\\">pkgdown</a> %s.\"\nmsgstr \"Website gebouwd met <a href=\\\"%s\\\">pkgdown</a> %s.\"\n\n#: build-home-authors.R:12\nmsgid \"Authors and Citation\"\nmsgstr \"Auteurs en citatie\"\n\n#: build-home-authors.R:110\nmsgid \"More about authors...\"\nmsgstr \"Meer over de auteurs...\"\n\n#: build-home-authors.R:113\nmsgid \"Developers\"\nmsgstr \"Ontwikkelaars\"\n\n#: build-home-authors.R:220\nmsgid \"author\"\nmsgstr \"auteur\"\n\n#: build-home-authors.R:221\nmsgid \"compiler\"\nmsgstr \"samensteller\"\n\n#: build-home-authors.R:222\nmsgid \"contractor\"\nmsgstr \"aannemer\"\n\n#: build-home-authors.R:223\nmsgid \"contributor\"\nmsgstr \"bijdrager\"\n\n#: build-home-authors.R:224\nmsgid \"copyright holder\"\nmsgstr \"auteursrechthebbende\"\n\n#: build-home-authors.R:225\nmsgid \"maintainer\"\nmsgstr \"beheerder\"\n\n#: build-home-authors.R:226\nmsgid \"data contributor\"\nmsgstr \"databijdrager\"\n\n#: build-home-authors.R:227\nmsgid \"funder\"\nmsgstr \"financier\"\n\n#: build-home-authors.R:228\nmsgid \"reviewer\"\nmsgstr \"recensent\"\n\n#: build-home-authors.R:229\nmsgid \"thesis advisor\"\nmsgstr \"scriptiebegeleider\"\n\n#: build-home-authors.R:230\nmsgid \"translator\"\nmsgstr \"vertaler\"\n\n#: build-home-authors.R:286 render.R:108\nmsgid \"Citation\"\nmsgstr \"Citatie\"\n\n#: build-home-authors.R:287\nmsgid \"Citing %s\"\nmsgstr \"%s citeren\"\n\n#: build-home-community.R:22\nmsgid \"Contributing guide\"\nmsgstr \"Gids om bij te dragen\"\n\n#: build-home-community.R:26\nmsgid \"Code of conduct\"\nmsgstr \"Gedragscode\"\n\n#: build-home-community.R:30\nmsgid \"Getting help\"\nmsgstr \"Hulp krijgen\"\n\n#: build-home-community.R:37\nmsgid \"Community\"\nmsgstr \"Gemeenschap\"\n\n#: build-home-index.R:118\nmsgid \"Dev Status\"\nmsgstr \"Ontwikkelingsstatus\"\n\n#: build-home-index.R:190\nmsgid \"View on %s\"\nmsgstr \"Op %s bekijken\"\n\n#: build-home-index.R:191\nmsgid \"Browse source code\"\nmsgstr \"Broncode bekijken\"\n\n#: build-home-index.R:192\nmsgid \"Report a bug\"\nmsgstr \"Bug melden\"\n\n#: build-home-index.R:196\nmsgid \"Links\"\nmsgstr \"Links\"\n\n#: build-home-index.R:201 render.R:110\nmsgid \"Table of contents\"\nmsgstr \"Inhoudsopgave\"\n\n#: build-home-license.R:14 build-home-license.R:36\nmsgid \"License\"\nmsgstr \"Licentie\"\n\n#: build-home-license.R:31\nmsgid \"Full license\"\nmsgstr \"Volledige licentie\"\n\n#: build-news.R:101 build-news.R:262 build-news.R:266\nmsgid \"Changelog\"\nmsgstr \"Wijzigingslogboek\"\n\n#: build-news.R:128\nmsgid \"Version %s\"\nmsgstr \"Versie %s\"\n\n#: build-news.R:140 build-news.R:257\nmsgid \"News\"\nmsgstr \"Nieuws\"\n\n#: build-news.R:259\nmsgid \"Releases\"\nmsgstr \"Uitgaven\"\n\n#: build-news.R:314\nmsgid \"CRAN release: %s\"\nmsgstr \"CRAN uitgave: %s\"\n\n#: build-reference-index.R:23\nmsgid \"Package index\"\nmsgstr \"Pakketindex\"\n\n#: build-reference-index.R:187\nmsgid \"All functions\"\nmsgstr \"Alle functies\"\n\n#: build-reference.R:377\nmsgid \"Usage\"\nmsgstr \"Gebruik\"\n\n#: build-tutorials.R:49 navbar.R:158\nmsgid \"Tutorials\"\nmsgstr \"Handleidingen\"\n\n#: development.R:82\nmsgid \"Released version\"\nmsgstr \"Uitgebrachte versie\"\n\n#: development.R:83\nmsgid \"In-development version\"\nmsgstr \"Versie in ontwikkeling\"\n\n#: development.R:84\nmsgid \"Unreleased version\"\nmsgstr \"Onuitgebrachte versie\"\n\n#: navbar-menu.R:212\nmsgid \"Search site\"\nmsgstr \"Zoeken op site\"\n\n#: navbar-menu.R:213\nmsgid \"Search for\"\nmsgstr \"Zoeken naar\"\n\n#: navbar.R:135\nmsgid \"Reference\"\nmsgstr \"Referentie\"\n\n#: navbar.R:146\nmsgid \"Light switch\"\nmsgstr \"Lichtknop\"\n\n#: navbar.R:149\nmsgid \"Light\"\nmsgstr \"Licht\"\n\n#: navbar.R:150\nmsgid \"Dark\"\nmsgstr \"Donker\"\n\n#: navbar.R:151\nmsgid \"Auto\"\nmsgstr \"Automatisch\"\n\n#: navbar.R:187\nmsgid \"Get started\"\nmsgstr \"Beginnen\"\n\n#: navbar.R:228\nmsgid \"More articles...\"\nmsgstr \"Meer artikelen...\"\n\n#: package.R:317\nmsgid \"deprecated\"\nmsgstr \"verouderd\"\n\n#: package.R:318\nmsgid \"superseded\"\nmsgstr \"vervangen\"\n\n#: package.R:319\nmsgid \"experimental\"\nmsgstr \"experimenteel\"\n\n#: package.R:320\nmsgid \"stable\"\nmsgstr \"stabiel\"\n\n#: rd-data.R:23\nmsgid \"Details\"\nmsgstr \"Details\"\n\n#: rd-data.R:27\nmsgid \"Description\"\nmsgstr \"Omschrijving\"\n\n#: rd-data.R:31\nmsgid \"References\"\nmsgstr \"Referenties\"\n\n#: rd-data.R:35 render.R:103\nmsgid \"Source\"\nmsgstr \"Bron\"\n\n#: rd-data.R:39\nmsgid \"Format\"\nmsgstr \"Formaat\"\n\n#: rd-data.R:43\nmsgid \"Note\"\nmsgstr \"Aantekening\"\n\n#: rd-data.R:47\nmsgid \"Author\"\nmsgstr \"Auteur\"\n\n#: rd-data.R:51\nmsgid \"See also\"\nmsgstr \"Zie ook\"\n\n#: rd-data.R:67\nmsgid \"Arguments\"\nmsgstr \"Argumenten\"\n\n#: rd-data.R:75\nmsgid \"Value\"\nmsgstr \"Waarde\"\n\n#: render.R:100\nmsgid \"Skip to contents\"\nmsgstr \"Ga naar inhoud\"\n\n#: render.R:101\nmsgid \"Toggle navigation\"\nmsgstr \"Schakel navigatie in\"\n\n#: render.R:102\nmsgid \"On this page\"\nmsgstr \"Op deze pagina\"\n\n#: render.R:104\nmsgid \"Abstract\"\nmsgstr \"Samenvatting\"\n\n#: render.R:105\nmsgid \"Authors\"\nmsgstr \"Auteurs\"\n\n#: render.R:106\nmsgid \"Version\"\nmsgstr \"Versie\"\n\n#: render.R:107\nmsgid \"Examples\"\nmsgstr \"Voorbeelden\"\n\n#: render.R:109\nmsgid \"Additional details\"\nmsgstr \"Aanvullende details\"\n\n#: render.R:111\nmsgid \"Site navigation\"\nmsgstr \"Website navigatie\"\n\n#: repo.R:37\nmsgid \"Source:\"\nmsgstr \"Bron:\"\n\n#: tweak-homepage.R:68\nmsgid \"Dev status\"\nmsgstr \"Ontwikkelingsstatus\"\n\n#: usage.R:52\nmsgid \"# Default %s method\"\nmsgstr \"# Standaard %s methode\"\n\n#: usage.R:54\nmsgid \"# %s method for class '%s'\"\nmsgstr \"# %s methode voor klasse '%s'\"\n"
  },
  {
    "path": "po/R-pkgdown.pot",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pkgdown 2.2.0\\n\"\n\"POT-Creation-Date: 2025-11-05 10:47-0600\\n\"\n\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n\"\n\"Last-Translator: FULL NAME <EMAIL@ADDRESS>\\n\"\n\"Language-Team: LANGUAGE <LL@li.org>\\n\"\n\"Language: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: build-404.R:12\nmsgid \"Page not found (404)\"\nmsgstr \"\"\n\n#: build-404.R:13\nmsgid \"Content not found. Please use links in the navbar.\"\nmsgstr \"\"\n\n#: build-articles.R:281 navbar.R:193 navbar.R:203 navbar.R:232\nmsgid \"Articles\"\nmsgstr \"\"\n\n#: build-articles.R:436\nmsgid \"All vignettes\"\nmsgstr \"\"\n\n#: build-footer.R:42\nmsgid \"Developed by\"\nmsgstr \"\"\n\n#: build-footer.R:49\nmsgid \"Site built with <a href=\\\"%s\\\">pkgdown</a> %s.\"\nmsgstr \"\"\n\n#: build-home-authors.R:12\nmsgid \"Authors and Citation\"\nmsgstr \"\"\n\n#: build-home-authors.R:110\nmsgid \"More about authors...\"\nmsgstr \"\"\n\n#: build-home-authors.R:113\nmsgid \"Developers\"\nmsgstr \"\"\n\n#: build-home-authors.R:220\nmsgid \"author\"\nmsgstr \"\"\n\n#: build-home-authors.R:221\nmsgid \"compiler\"\nmsgstr \"\"\n\n#: build-home-authors.R:222\nmsgid \"contractor\"\nmsgstr \"\"\n\n#: build-home-authors.R:223\nmsgid \"contributor\"\nmsgstr \"\"\n\n#: build-home-authors.R:224\nmsgid \"copyright holder\"\nmsgstr \"\"\n\n#: build-home-authors.R:225\nmsgid \"maintainer\"\nmsgstr \"\"\n\n#: build-home-authors.R:226\nmsgid \"data contributor\"\nmsgstr \"\"\n\n#: build-home-authors.R:227\nmsgid \"funder\"\nmsgstr \"\"\n\n#: build-home-authors.R:228\nmsgid \"reviewer\"\nmsgstr \"\"\n\n#: build-home-authors.R:229\nmsgid \"thesis advisor\"\nmsgstr \"\"\n\n#: build-home-authors.R:230\nmsgid \"translator\"\nmsgstr \"\"\n\n#: build-home-authors.R:286 render.R:108\nmsgid \"Citation\"\nmsgstr \"\"\n\n#: build-home-authors.R:287\nmsgid \"Citing %s\"\nmsgstr \"\"\n\n#: build-home-community.R:22\nmsgid \"Contributing guide\"\nmsgstr \"\"\n\n#: build-home-community.R:26\nmsgid \"Code of conduct\"\nmsgstr \"\"\n\n#: build-home-community.R:30\nmsgid \"Getting help\"\nmsgstr \"\"\n\n#: build-home-community.R:37\nmsgid \"Community\"\nmsgstr \"\"\n\n#: build-home-index.R:118\nmsgid \"Dev Status\"\nmsgstr \"\"\n\n#: build-home-index.R:190\nmsgid \"View on %s\"\nmsgstr \"\"\n\n#: build-home-index.R:191\nmsgid \"Browse source code\"\nmsgstr \"\"\n\n#: build-home-index.R:192\nmsgid \"Report a bug\"\nmsgstr \"\"\n\n#: build-home-index.R:196\nmsgid \"Links\"\nmsgstr \"\"\n\n#: build-home-index.R:201 render.R:110\nmsgid \"Table of contents\"\nmsgstr \"\"\n\n#: build-home-license.R:14 build-home-license.R:36\nmsgid \"License\"\nmsgstr \"\"\n\n#: build-home-license.R:31\nmsgid \"Full license\"\nmsgstr \"\"\n\n#: build-news.R:101 build-news.R:262 build-news.R:266\nmsgid \"Changelog\"\nmsgstr \"\"\n\n#: build-news.R:128\nmsgid \"Version %s\"\nmsgstr \"\"\n\n#: build-news.R:140 build-news.R:257\nmsgid \"News\"\nmsgstr \"\"\n\n#: build-news.R:259\nmsgid \"Releases\"\nmsgstr \"\"\n\n#: build-news.R:314\nmsgid \"CRAN release: %s\"\nmsgstr \"\"\n\n#: build-reference-index.R:23\nmsgid \"Package index\"\nmsgstr \"\"\n\n#: build-reference-index.R:187\nmsgid \"All functions\"\nmsgstr \"\"\n\n#: build-reference.R:377\nmsgid \"Usage\"\nmsgstr \"\"\n\n#: build-tutorials.R:49 navbar.R:158\nmsgid \"Tutorials\"\nmsgstr \"\"\n\n#: development.R:82\nmsgid \"Released version\"\nmsgstr \"\"\n\n#: development.R:83\nmsgid \"In-development version\"\nmsgstr \"\"\n\n#: development.R:84\nmsgid \"Unreleased version\"\nmsgstr \"\"\n\n#: navbar-menu.R:212\nmsgid \"Search site\"\nmsgstr \"\"\n\n#: navbar-menu.R:213\nmsgid \"Search for\"\nmsgstr \"\"\n\n#: navbar.R:135\nmsgid \"Reference\"\nmsgstr \"\"\n\n#: navbar.R:146\nmsgid \"Light switch\"\nmsgstr \"\"\n\n#: navbar.R:149\nmsgid \"Light\"\nmsgstr \"\"\n\n#: navbar.R:150\nmsgid \"Dark\"\nmsgstr \"\"\n\n#: navbar.R:151\nmsgid \"Auto\"\nmsgstr \"\"\n\n#: navbar.R:187\nmsgid \"Get started\"\nmsgstr \"\"\n\n#: navbar.R:228\nmsgid \"More articles...\"\nmsgstr \"\"\n\n#: package.R:317\nmsgid \"deprecated\"\nmsgstr \"\"\n\n#: package.R:318\nmsgid \"superseded\"\nmsgstr \"\"\n\n#: package.R:319\nmsgid \"experimental\"\nmsgstr \"\"\n\n#: package.R:320\nmsgid \"stable\"\nmsgstr \"\"\n\n#: rd-data.R:23\nmsgid \"Details\"\nmsgstr \"\"\n\n#: rd-data.R:27\nmsgid \"Description\"\nmsgstr \"\"\n\n#: rd-data.R:31\nmsgid \"References\"\nmsgstr \"\"\n\n#: rd-data.R:35 render.R:103\nmsgid \"Source\"\nmsgstr \"\"\n\n#: rd-data.R:39\nmsgid \"Format\"\nmsgstr \"\"\n\n#: rd-data.R:43\nmsgid \"Note\"\nmsgstr \"\"\n\n#: rd-data.R:47\nmsgid \"Author\"\nmsgstr \"\"\n\n#: rd-data.R:51\nmsgid \"See also\"\nmsgstr \"\"\n\n#: rd-data.R:67\nmsgid \"Arguments\"\nmsgstr \"\"\n\n#: rd-data.R:75\nmsgid \"Value\"\nmsgstr \"\"\n\n#: render.R:100\nmsgid \"Skip to contents\"\nmsgstr \"\"\n\n#: render.R:101\nmsgid \"Toggle navigation\"\nmsgstr \"\"\n\n#: render.R:102\nmsgid \"On this page\"\nmsgstr \"\"\n\n#: render.R:104\nmsgid \"Abstract\"\nmsgstr \"\"\n\n#: render.R:105\nmsgid \"Authors\"\nmsgstr \"\"\n\n#: render.R:106\nmsgid \"Version\"\nmsgstr \"\"\n\n#: render.R:107\nmsgid \"Examples\"\nmsgstr \"\"\n\n#: render.R:109\nmsgid \"Additional details\"\nmsgstr \"\"\n\n#: render.R:111\nmsgid \"Site navigation\"\nmsgstr \"\"\n\n#: repo.R:37\nmsgid \"Source:\"\nmsgstr \"\"\n\n#: tweak-homepage.R:68\nmsgid \"Dev status\"\nmsgstr \"\"\n\n#: usage.R:52\nmsgid \"# Default %s method\"\nmsgstr \"\"\n\n#: usage.R:54\nmsgid \"# %s method for class '%s'\"\nmsgstr \"\"\n"
  },
  {
    "path": "po/R-pt.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pkgdown 2.0.9.9000\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-10-17 18:07-0600\\n\"\n\"PO-Revision-Date: 2024-06-16 00:00-0500\\n\"\n\"Last-Translator: Automatically generated\\n\"\n\"Language-Team: none\\n\"\n\"Language: pt\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: build-404.R:12\nmsgid \"Page not found (404)\"\nmsgstr \"Página não encontrada (404)\"\n\n#: build-404.R:13\nmsgid \"Content not found. Please use links in the navbar.\"\nmsgstr \"Conteúdo não encontrado. Por favor, use links na navbar.\"\n\n#: build-articles.R:281 navbar.R:193 navbar.R:203 navbar.R:232\nmsgid \"Articles\"\nmsgstr \"Artigos\"\n\n#: build-articles.R:436\nmsgid \"All vignettes\"\nmsgstr \"Todas as vinhetas\"\n\n#: build-footer.R:42\nmsgid \"Developed by\"\nmsgstr \"Desenvolvido por\"\n\n#: build-footer.R:49\nmsgid \"Site built with <a href=\\\"%s\\\">pkgdown</a> %s.\"\nmsgstr \"Site criado com <a href=\\\"%s\\\">pkgdown</a> %s.\"\n\n#: build-home-authors.R:12\nmsgid \"Authors and Citation\"\nmsgstr \"Autores e citação\"\n\n#: build-home-authors.R:110\nmsgid \"More about authors...\"\nmsgstr \"Mais sobre autores...\"\n\n#: build-home-authors.R:113\nmsgid \"Developers\"\nmsgstr \"Desenvolvedores\"\n\n#: build-home-authors.R:220\nmsgid \"author\"\nmsgstr \"autor\"\n\n#: build-home-authors.R:221\nmsgid \"compiler\"\nmsgstr \"compilador\"\n\n#: build-home-authors.R:222\nmsgid \"contractor\"\nmsgstr \"contratante\"\n\n#: build-home-authors.R:223\nmsgid \"contributor\"\nmsgstr \"contribuinte\"\n\n#: build-home-authors.R:224\nmsgid \"copyright holder\"\nmsgstr \"titular dos direitos autorais\"\n\n#: build-home-authors.R:225\nmsgid \"maintainer\"\nmsgstr \"mantenedor\"\n\n#: build-home-authors.R:226\nmsgid \"data contributor\"\nmsgstr \"contribuidor de dados\"\n\n#: build-home-authors.R:227\nmsgid \"funder\"\nmsgstr \"financiador\"\n\n#: build-home-authors.R:228\nmsgid \"reviewer\"\nmsgstr \"revisor\"\n\n#: build-home-authors.R:229\nmsgid \"thesis advisor\"\nmsgstr \"orientador de tese\"\n\n#: build-home-authors.R:230\nmsgid \"translator\"\nmsgstr \"tradutor\"\n\n#: build-home-authors.R:286 render.R:108\nmsgid \"Citation\"\nmsgstr \"Citação\"\n\n#: build-home-authors.R:287\nmsgid \"Citing %s\"\nmsgstr \"Citando %s\"\n\n#: build-home-community.R:22\nmsgid \"Contributing guide\"\nmsgstr \"Guia de contribuição\"\n\n#: build-home-community.R:26\nmsgid \"Code of conduct\"\nmsgstr \"Código de conduta\"\n\n#: build-home-community.R:30\nmsgid \"Getting help\"\nmsgstr \"Obter ajuda\"\n\n#: build-home-community.R:37\nmsgid \"Community\"\nmsgstr \"Comunidade\"\n\n#: build-home-index.R:118\nmsgid \"Dev Status\"\nmsgstr \"Estado de Desenvolvimento\"\n\n#: build-home-index.R:190\nmsgid \"View on %s\"\nmsgstr \"Veja no %s\"\n\n#: build-home-index.R:191\nmsgid \"Browse source code\"\nmsgstr \"Navegue pelo código-fonte\"\n\n#: build-home-index.R:192\nmsgid \"Report a bug\"\nmsgstr \"Reportar um erro\"\n\n#: build-home-index.R:196\nmsgid \"Links\"\nmsgstr \"Links\"\n\n#: build-home-index.R:201 render.R:110\nmsgid \"Table of contents\"\nmsgstr \"Índice\"\n\n#: build-home-license.R:14 build-home-license.R:36\nmsgid \"License\"\nmsgstr \"Licença\"\n\n#: build-home-license.R:31\nmsgid \"Full license\"\nmsgstr \"Licença completa\"\n\n#: build-news.R:101 build-news.R:262 build-news.R:266\nmsgid \"Changelog\"\nmsgstr \"Changelog\"\n\n#: build-news.R:128\nmsgid \"Version %s\"\nmsgstr \"Versão %s\"\n\n#: build-news.R:140 build-news.R:257\nmsgid \"News\"\nmsgstr \"Notícia\"\n\n#: build-news.R:259\nmsgid \"Releases\"\nmsgstr \"Lançamentos\"\n\n#: build-news.R:314\nmsgid \"CRAN release: %s\"\nmsgstr \"Lançamento CRAN: %s\"\n\n#: build-reference-index.R:23\nmsgid \"Package index\"\nmsgstr \"Índice de pacotes\"\n\n#: build-reference-index.R:187\nmsgid \"All functions\"\nmsgstr \"Todas as funções\"\n\n#: build-reference.R:377\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\n#: build-tutorials.R:49 navbar.R:158\nmsgid \"Tutorials\"\nmsgstr \"Tutoriais\"\n\n#: development.R:82\nmsgid \"Released version\"\nmsgstr \"Versão lançada\"\n\n#: development.R:83\nmsgid \"In-development version\"\nmsgstr \"Versão em desenvolvimento\"\n\n#: development.R:84\nmsgid \"Unreleased version\"\nmsgstr \"Versão não lançada\"\n\n#: navbar-menu.R:212\nmsgid \"Search site\"\nmsgstr \"Pesquisar site\"\n\n#: navbar-menu.R:213\nmsgid \"Search for\"\nmsgstr \"Procurar\"\n\n#: navbar.R:135\nmsgid \"Reference\"\nmsgstr \"Referência\"\n\n#: navbar.R:146\nmsgid \"Light switch\"\nmsgstr \"Interruptor de luz\"\n\n#: navbar.R:149\nmsgid \"Light\"\nmsgstr \"Clara\"\n\n#: navbar.R:150\nmsgid \"Dark\"\nmsgstr \"Escuro\"\n\n#: navbar.R:151\nmsgid \"Auto\"\nmsgstr \"Auto\"\n\n#: navbar.R:187\nmsgid \"Get started\"\nmsgstr \"Primeiros passos\"\n\n#: navbar.R:228\nmsgid \"More articles...\"\nmsgstr \"Mais artigos...\"\n\n#: package.R:317\nmsgid \"deprecated\"\nmsgstr \"obsoleta\"\n\n#: package.R:318\nmsgid \"superseded\"\nmsgstr \"substituída\"\n\n#: package.R:319\nmsgid \"experimental\"\nmsgstr \"experimental\"\n\n#: package.R:320\nmsgid \"stable\"\nmsgstr \"estável\"\n\n#: rd-data.R:23\nmsgid \"Details\"\nmsgstr \"Detalhes\"\n\n#: rd-data.R:27\nmsgid \"Description\"\nmsgstr \"Descrição\"\n\n#: rd-data.R:31\nmsgid \"References\"\nmsgstr \"Referências\"\n\n#: rd-data.R:35 render.R:103\nmsgid \"Source\"\nmsgstr \"Fonte\"\n\n#: rd-data.R:39\nmsgid \"Format\"\nmsgstr \"Formato\"\n\n#: rd-data.R:43\nmsgid \"Note\"\nmsgstr \"Nota\"\n\n#: rd-data.R:47\nmsgid \"Author\"\nmsgstr \"Autor\"\n\n#: rd-data.R:51\nmsgid \"See also\"\nmsgstr \"Veja também\"\n\n#: rd-data.R:67\nmsgid \"Arguments\"\nmsgstr \"Argumentos\"\n\n#: rd-data.R:75\nmsgid \"Value\"\nmsgstr \"Valor\"\n\n#: render.R:100\nmsgid \"Skip to contents\"\nmsgstr \"Avance para o conteúdo\"\n\n#: render.R:101\nmsgid \"Toggle navigation\"\nmsgstr \"Alternar de navegação\"\n\n#: render.R:102\nmsgid \"On this page\"\nmsgstr \"Nesta página\"\n\n#: render.R:104\nmsgid \"Abstract\"\nmsgstr \"Resumo\"\n\n#: render.R:105\nmsgid \"Authors\"\nmsgstr \"Autores\"\n\n#: render.R:106\nmsgid \"Version\"\nmsgstr \"Versão\"\n\n#: render.R:107\nmsgid \"Examples\"\nmsgstr \"Exemplos\"\n\n#: render.R:109\nmsgid \"Additional details\"\nmsgstr \"Detalhes adicionais\"\n\n#: render.R:111\nmsgid \"Site navigation\"\nmsgstr \"Navegação do site\"\n\n#: repo.R:37\nmsgid \"Source:\"\nmsgstr \"Fonte:\"\n\n#: tweak-homepage.R:68\nmsgid \"Dev status\"\nmsgstr \"Status de desenvolvimento\"\n\n#: usage.R:52\nmsgid \"# Default %s method\"\nmsgstr \"# Método %s padrão\"\n\n#: usage.R:54\nmsgid \"# %s method for class '%s'\"\nmsgstr \"# método %s para a classe '%s'\"\n\n#~ msgid \"Function reference\"\n#~ msgstr \"Referência para funções\"\n"
  },
  {
    "path": "po/R-tr.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pkgdown 1.9000.9000.9000\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-10-17 18:07-0600\\n\"\n\"PO-Revision-Date: 2021-10-28 08:02-0500\\n\"\n\"Last-Translator: Automatically generated\\n\"\n\"Language-Team: none\\n\"\n\"Language: tr\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: build-404.R:12\nmsgid \"Page not found (404)\"\nmsgstr \"Sayfa bulunamıyor (404)\"\n\n#: build-404.R:13\nmsgid \"Content not found. Please use links in the navbar.\"\nmsgstr \"\"\n\"İçerik bulunamıyor. Lütfen yukarıdaki gezinme çubuğundaki bağları kullanın.\"\n\n#: build-articles.R:281 navbar.R:193 navbar.R:203 navbar.R:232\nmsgid \"Articles\"\nmsgstr \"Makaleler\"\n\n#: build-articles.R:436\nmsgid \"All vignettes\"\nmsgstr \"Bütün makaleler\"\n\n#: build-footer.R:42\nmsgid \"Developed by\"\nmsgstr \"Geliştiren\"\n\n#: build-footer.R:49\nmsgid \"Site built with <a href=\\\"%s\\\">pkgdown</a> %s.\"\nmsgstr \"Site <a href=\\\"%s\\\">pkgdown</a> %s ile geliştirilmiştir.\"\n\n#: build-home-authors.R:12\nmsgid \"Authors and Citation\"\nmsgstr \"Yazarlar ve Alıntı\"\n\n#: build-home-authors.R:110\nmsgid \"More about authors...\"\nmsgstr \"Yazarlar hakkında daha fazla bilgi...\"\n\n#: build-home-authors.R:113\nmsgid \"Developers\"\nmsgstr \"Geliştiriciler\"\n\n#: build-home-authors.R:220\nmsgid \"author\"\nmsgstr \"yazar\"\n\n#: build-home-authors.R:221\nmsgid \"compiler\"\nmsgstr \"derleyici\"\n\n#: build-home-authors.R:222\nmsgid \"contractor\"\nmsgstr \"yüklenici\"\n\n#: build-home-authors.R:223\nmsgid \"contributor\"\nmsgstr \"katılımcı\"\n\n#: build-home-authors.R:224\nmsgid \"copyright holder\"\nmsgstr \"telif hakkı sahibi\"\n\n#: build-home-authors.R:225\nmsgid \"maintainer\"\nmsgstr \"bakımcı\"\n\n#: build-home-authors.R:226\nmsgid \"data contributor\"\nmsgstr \"veri katılımcısı\"\n\n#: build-home-authors.R:227\nmsgid \"funder\"\nmsgstr \"fon sağlayıcı\"\n\n#: build-home-authors.R:228\nmsgid \"reviewer\"\nmsgstr \"eleştirmen\"\n\n#: build-home-authors.R:229\nmsgid \"thesis advisor\"\nmsgstr \"tez danışmanı\"\n\n#: build-home-authors.R:230\nmsgid \"translator\"\nmsgstr \"çevirmen\"\n\n#: build-home-authors.R:286 render.R:108\nmsgid \"Citation\"\nmsgstr \"Alıntı\"\n\n#: build-home-authors.R:287\nmsgid \"Citing %s\"\nmsgstr \"%s'ı kaynak gösterme\"\n\n#: build-home-community.R:22\nmsgid \"Contributing guide\"\nmsgstr \"Katkıda bulunma rehberi\"\n\n#: build-home-community.R:26\nmsgid \"Code of conduct\"\nmsgstr \"Davranış kuralları\"\n\n#: build-home-community.R:30\nmsgid \"Getting help\"\nmsgstr \"Yardım\"\n\n#: build-home-community.R:37\nmsgid \"Community\"\nmsgstr \"Komünite\"\n\n#: build-home-index.R:118\nmsgid \"Dev Status\"\nmsgstr \"Geliştirme statüsü\"\n\n#: build-home-index.R:190\nmsgid \"View on %s\"\nmsgstr \"%s'da gör\"\n\n#: build-home-index.R:191\nmsgid \"Browse source code\"\nmsgstr \"Kaynak koduna göz at\"\n\n#: build-home-index.R:192\nmsgid \"Report a bug\"\nmsgstr \"Hata bildir\"\n\n#: build-home-index.R:196\nmsgid \"Links\"\nmsgstr \"Bağlantılar\"\n\n#: build-home-index.R:201 render.R:110\nmsgid \"Table of contents\"\nmsgstr \"İçindekiler\"\n\n#: build-home-license.R:14 build-home-license.R:36\nmsgid \"License\"\nmsgstr \"Lisans\"\n\n#: build-home-license.R:31\nmsgid \"Full license\"\nmsgstr \"Tam lisans\"\n\n#: build-news.R:101 build-news.R:262 build-news.R:266\nmsgid \"Changelog\"\nmsgstr \"Değişiklik günlüğü\"\n\n#: build-news.R:128\nmsgid \"Version %s\"\nmsgstr \"Sürüm %s\"\n\n#: build-news.R:140 build-news.R:257\nmsgid \"News\"\nmsgstr \"Haberler\"\n\n#: build-news.R:259\nmsgid \"Releases\"\nmsgstr \"Yayınlar\"\n\n#: build-news.R:314\nmsgid \"CRAN release: %s\"\nmsgstr \"CRAN yayını: %s\"\n\n#: build-reference-index.R:23\nmsgid \"Package index\"\nmsgstr \"Paket dizini\"\n\n#: build-reference-index.R:187\nmsgid \"All functions\"\nmsgstr \"Bütün fonksiyonlar\"\n\n#: build-reference.R:377\nmsgid \"Usage\"\nmsgstr \"Kullanım\"\n\n#: build-tutorials.R:49 navbar.R:158\nmsgid \"Tutorials\"\nmsgstr \"Öğreticiler\"\n\n#: development.R:82\nmsgid \"Released version\"\nmsgstr \"Yayımlanan sürüm\"\n\n#: development.R:83\nmsgid \"In-development version\"\nmsgstr \"Geliştirme aşamasındaki sürüm\"\n\n#: development.R:84\nmsgid \"Unreleased version\"\nmsgstr \"Yayınlanmamış sürüm\"\n\n#: navbar-menu.R:212\nmsgid \"Search site\"\nmsgstr \"Ara\"\n\n#: navbar-menu.R:213\nmsgid \"Search for\"\nmsgstr \"Ara\"\n\n#: navbar.R:135\nmsgid \"Reference\"\nmsgstr \"Referans\"\n\n#: navbar.R:146\nmsgid \"Light switch\"\nmsgstr \"Koyu/açık\"\n\n#: navbar.R:149\nmsgid \"Light\"\nmsgstr \"Açık\"\n\n#: navbar.R:150\nmsgid \"Dark\"\nmsgstr \"Koyu\"\n\n#: navbar.R:151\nmsgid \"Auto\"\nmsgstr \"Otomatik\"\n\n#: navbar.R:187\nmsgid \"Get started\"\nmsgstr \"Başla\"\n\n#: navbar.R:228\nmsgid \"More articles...\"\nmsgstr \"Diğer makaleler...\"\n\n#: package.R:317\nmsgid \"deprecated\"\nmsgstr \"artık kullanılmayan\"\n\n#: package.R:318\nmsgid \"superseded\"\nmsgstr \"yerine gelen\"\n\n#: package.R:319\nmsgid \"experimental\"\nmsgstr \"deneysel\"\n\n#: package.R:320\nmsgid \"stable\"\nmsgstr \"sabit\"\n\n#: rd-data.R:23\nmsgid \"Details\"\nmsgstr \"Detaylar\"\n\n#: rd-data.R:27\nmsgid \"Description\"\nmsgstr \"Açıklama\"\n\n#: rd-data.R:31\nmsgid \"References\"\nmsgstr \"Referanslar\"\n\n#: rd-data.R:35 render.R:103\nmsgid \"Source\"\nmsgstr \"Kaynak\"\n\n#: rd-data.R:39\nmsgid \"Format\"\nmsgstr \"Format\"\n\n#: rd-data.R:43\nmsgid \"Note\"\nmsgstr \"Not\"\n\n#: rd-data.R:47\nmsgid \"Author\"\nmsgstr \"Yazar\"\n\n#: rd-data.R:51\nmsgid \"See also\"\nmsgstr \"Ayrıca bak\"\n\n#: rd-data.R:67\nmsgid \"Arguments\"\nmsgstr \"Argümanlar\"\n\n#: rd-data.R:75\nmsgid \"Value\"\nmsgstr \"Değer\"\n\n#: render.R:100\nmsgid \"Skip to contents\"\nmsgstr \"İçeriğe atla\"\n\n#: render.R:101\nmsgid \"Toggle navigation\"\nmsgstr \"Gezinmeyi aç/kapat\"\n\n#: render.R:102\nmsgid \"On this page\"\nmsgstr \"Bu sayfada\"\n\n#: render.R:104\nmsgid \"Abstract\"\nmsgstr \"Özet\"\n\n#: render.R:105\nmsgid \"Authors\"\nmsgstr \"Yazarlar\"\n\n#: render.R:106\nmsgid \"Version\"\nmsgstr \"Sürüm\"\n\n#: render.R:107\nmsgid \"Examples\"\nmsgstr \"Örnekler\"\n\n#: render.R:109\nmsgid \"Additional details\"\nmsgstr \"Ek detaylar\"\n\n#: render.R:111\nmsgid \"Site navigation\"\nmsgstr \"Site navigasyonu\"\n\n#: repo.R:37\nmsgid \"Source:\"\nmsgstr \"Kaynak:\"\n\n#: tweak-homepage.R:68\nmsgid \"Dev status\"\nmsgstr \"Geliştirme statüsü\"\n\n#: usage.R:52\nmsgid \"# Default %s method\"\nmsgstr \"# Varsayılan %s metodu\"\n\n#: usage.R:54\nmsgid \"# %s method for class '%s'\"\nmsgstr \"# %s için %s metodu\"\n"
  },
  {
    "path": "po/R-zh_CN.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: pkgdown 1.9000.9000.9000\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-10-17 18:07-0600\\n\"\n\"PO-Revision-Date: 2021-10-28 08:02-0500\\n\"\n\"Last-Translator: Automatically generated\\n\"\n\"Language-Team: none\\n\"\n\"Language: zh_CN\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: build-404.R:12\nmsgid \"Page not found (404)\"\nmsgstr \"页面未找到（404）\"\n\n#: build-404.R:13\nmsgid \"Content not found. Please use links in the navbar.\"\nmsgstr \"请求的页面未找到。请使用导航栏内的链接。\"\n\n#: build-articles.R:281 navbar.R:193 navbar.R:203 navbar.R:232\nmsgid \"Articles\"\nmsgstr \"文章\"\n\n#: build-articles.R:436\nmsgid \"All vignettes\"\nmsgstr \"所有文章\"\n\n#: build-footer.R:42\nmsgid \"Developed by\"\nmsgstr \"开发者：\"\n\n#: build-footer.R:49\nmsgid \"Site built with <a href=\\\"%s\\\">pkgdown</a> %s.\"\nmsgstr \"该网站由 <a href=\\\"%s\\\">pkgdown</a> %s 构建。\"\n\n#: build-home-authors.R:12\nmsgid \"Authors and Citation\"\nmsgstr \"作者与引用\"\n\n#: build-home-authors.R:110\nmsgid \"More about authors...\"\nmsgstr \"关于作者…\"\n\n#: build-home-authors.R:113\nmsgid \"Developers\"\nmsgstr \"开发者\"\n\n#: build-home-authors.R:220\nmsgid \"author\"\nmsgstr \"作者\"\n\n#: build-home-authors.R:221\nmsgid \"compiler\"\nmsgstr \"编译者\"\n\n#: build-home-authors.R:222\nmsgid \"contractor\"\nmsgstr \"合同员工\"\n\n#: build-home-authors.R:223\nmsgid \"contributor\"\nmsgstr \"合作者\"\n\n#: build-home-authors.R:224\nmsgid \"copyright holder\"\nmsgstr \"版权所有者\"\n\n#: build-home-authors.R:225\nmsgid \"maintainer\"\nmsgstr \"维护者\"\n\n#: build-home-authors.R:226\nmsgid \"data contributor\"\nmsgstr \"数据提供者\"\n\n#: build-home-authors.R:227\nmsgid \"funder\"\nmsgstr \"赞助者\"\n\n#: build-home-authors.R:228\nmsgid \"reviewer\"\nmsgstr \"审核者\"\n\n#: build-home-authors.R:229\nmsgid \"thesis advisor\"\nmsgstr \"论文导师\"\n\n#: build-home-authors.R:230\nmsgid \"translator\"\nmsgstr \"翻译者\"\n\n#: build-home-authors.R:286 render.R:108\nmsgid \"Citation\"\nmsgstr \"引用\"\n\n#: build-home-authors.R:287\nmsgid \"Citing %s\"\nmsgstr \"引用 %s\"\n\n#: build-home-community.R:22\nmsgid \"Contributing guide\"\nmsgstr \"开发指南\"\n\n#: build-home-community.R:26\nmsgid \"Code of conduct\"\nmsgstr \"行为准则\"\n\n#: build-home-community.R:30\nmsgid \"Getting help\"\nmsgstr \"获取帮助\"\n\n#: build-home-community.R:37\nmsgid \"Community\"\nmsgstr \"社区\"\n\n#: build-home-index.R:118\nmsgid \"Dev Status\"\nmsgstr \"开发状态\"\n\n#: build-home-index.R:190\nmsgid \"View on %s\"\nmsgstr \"访问%s\"\n\n#: build-home-index.R:191\nmsgid \"Browse source code\"\nmsgstr \"浏览源代码\"\n\n#: build-home-index.R:192\nmsgid \"Report a bug\"\nmsgstr \"缺陷报告\"\n\n#: build-home-index.R:196\nmsgid \"Links\"\nmsgstr \"链接\"\n\n#: build-home-index.R:201 render.R:110\nmsgid \"Table of contents\"\nmsgstr \"目录\"\n\n#: build-home-license.R:14 build-home-license.R:36\nmsgid \"License\"\nmsgstr \"许可\"\n\n#: build-home-license.R:31\nmsgid \"Full license\"\nmsgstr \"许可全部条款\"\n\n#: build-news.R:101 build-news.R:262 build-news.R:266\nmsgid \"Changelog\"\nmsgstr \"更改日志\"\n\n#: build-news.R:128\nmsgid \"Version %s\"\nmsgstr \"%s 版\"\n\n#: build-news.R:140 build-news.R:257\nmsgid \"News\"\nmsgstr \"新闻\"\n\n#: build-news.R:259\nmsgid \"Releases\"\nmsgstr \"发布版本\"\n\n#: build-news.R:314\nmsgid \"CRAN release: %s\"\nmsgstr \"CRAN发布版本：%s\"\n\n#: build-reference-index.R:23\nmsgid \"Package index\"\nmsgstr \"包索引\"\n\n#: build-reference-index.R:187\nmsgid \"All functions\"\nmsgstr \"所有函数\"\n\n#: build-reference.R:377\nmsgid \"Usage\"\nmsgstr \"用法\"\n\n#: build-tutorials.R:49 navbar.R:158\nmsgid \"Tutorials\"\nmsgstr \"教程\"\n\n#: development.R:82\nmsgid \"Released version\"\nmsgstr \"已发布的版本\"\n\n#: development.R:83\nmsgid \"In-development version\"\nmsgstr \"开发中的版本\"\n\n#: development.R:84\nmsgid \"Unreleased version\"\nmsgstr \"未发布的版本\"\n\n#: navbar-menu.R:212\nmsgid \"Search site\"\nmsgstr \"搜索网站\"\n\n#: navbar-menu.R:213\nmsgid \"Search for\"\nmsgstr \"搜索\"\n\n#: navbar.R:135\nmsgid \"Reference\"\nmsgstr \"参考\"\n\n#: navbar.R:146\nmsgid \"Light switch\"\nmsgstr \"主题切换\"\n\n#: navbar.R:149\nmsgid \"Light\"\nmsgstr \"浅色\"\n\n#: navbar.R:150\nmsgid \"Dark\"\nmsgstr \"深色\"\n\n#: navbar.R:151\nmsgid \"Auto\"\nmsgstr \"自动\"\n\n#: navbar.R:187\nmsgid \"Get started\"\nmsgstr \"入门简介\"\n\n#: navbar.R:228\nmsgid \"More articles...\"\nmsgstr \"更多文章…\"\n\n#: package.R:317\nmsgid \"deprecated\"\nmsgstr \"已弃用\"\n\n#: package.R:318\nmsgid \"superseded\"\nmsgstr \"已取代\"\n\n#: package.R:319\nmsgid \"experimental\"\nmsgstr \"实验性\"\n\n#: package.R:320\nmsgid \"stable\"\nmsgstr \"稳定\"\n\n#: rd-data.R:23\nmsgid \"Details\"\nmsgstr \"细节\"\n\n#: rd-data.R:27\nmsgid \"Description\"\nmsgstr \"概述\"\n\n#: rd-data.R:31\nmsgid \"References\"\nmsgstr \"参考文献\"\n\n#: rd-data.R:35 render.R:103\nmsgid \"Source\"\nmsgstr \"参考文献出处\"\n\n#: rd-data.R:39\nmsgid \"Format\"\nmsgstr \"格式\"\n\n#: rd-data.R:43\nmsgid \"Note\"\nmsgstr \"注释\"\n\n#: rd-data.R:47\nmsgid \"Author\"\nmsgstr \"作者\"\n\n#: rd-data.R:51\nmsgid \"See also\"\nmsgstr \"相关话题\"\n\n#: rd-data.R:67\nmsgid \"Arguments\"\nmsgstr \"参数\"\n\n#: rd-data.R:75\nmsgid \"Value\"\nmsgstr \"值\"\n\n#: render.R:100\nmsgid \"Skip to contents\"\nmsgstr \"跳到正文\"\n\n#: render.R:101\nmsgid \"Toggle navigation\"\nmsgstr \"切换导航栏\"\n\n#: render.R:102\nmsgid \"On this page\"\nmsgstr \"该页面\"\n\n#: render.R:104\nmsgid \"Abstract\"\nmsgstr \"摘要\"\n\n#: render.R:105\nmsgid \"Authors\"\nmsgstr \"作者\"\n\n#: render.R:106\nmsgid \"Version\"\nmsgstr \"版本\"\n\n#: render.R:107\nmsgid \"Examples\"\nmsgstr \"范例\"\n\n#: render.R:109\nmsgid \"Additional details\"\nmsgstr \"附加信息\"\n\n#: render.R:111\nmsgid \"Site navigation\"\nmsgstr \"网站导航\"\n\n#: repo.R:37\nmsgid \"Source:\"\nmsgstr \"来源：\"\n\n#: tweak-homepage.R:68\nmsgid \"Dev status\"\nmsgstr \"开发状态\"\n\n#: usage.R:52\nmsgid \"# Default %s method\"\nmsgstr \"# 默认 %s 方法\"\n\n#: usage.R:54\nmsgid \"# %s method for class '%s'\"\nmsgstr \"# %2$s 类的 %1$s 方法\"\n\n#~ msgid \"Function reference\"\n#~ msgstr \"函数参考\"\n"
  },
  {
    "path": "revdep/.gitignore",
    "content": "checks\nlibrary\nchecks.noindex\nlibrary.noindex\ndata.sqlite\n*.html\ncloud.noindex\n"
  },
  {
    "path": "revdep/README.md",
    "content": "# Revdeps\n\n## Failed to check (1)\n\n|package  |version |error |warning |note |\n|:--------|:-------|:-----|:-------|:----|\n|multinma |0.8.1   |1     |        |     |\n\n"
  },
  {
    "path": "revdep/cran.md",
    "content": "## revdepcheck results\n\nWe checked 165 reverse dependencies, comparing R CMD check results across CRAN and dev versions of this package.\n\n * We saw 0 new problems\n * We failed to check 1 packages\n\nIssues with CRAN packages are summarised below.\n\n### Failed to check\n\n* multinma (NA)\n"
  },
  {
    "path": "revdep/email.yml",
    "content": "release_date: ???\nrel_release_date: ???\nmy_news_url: ???\nrelease_version: ???\n"
  },
  {
    "path": "revdep/failures.md",
    "content": "# multinma (0.8.1)\n\n* GitHub: <https://github.com/dmphillippo/multinma>\n* Email: <mailto:david.phillippo@bristol.ac.uk>\n* GitHub mirror: <https://github.com/cran/multinma>\n\nRun `revdepcheck::cloud_details(, \"multinma\")` for more info\n\n## In both\n\n*   checking whether package ‘multinma’ can be installed ... ERROR\n     ```\n     Installation failed.\n     See ‘/tmp/workdir/multinma/new/multinma.Rcheck/00install.out’ for details.\n     ```\n\n## Installation\n\n### Devel\n\n```\n* installing *source* package ‘multinma’ ...\n** this is package ‘multinma’ version ‘0.8.1’\n** package ‘multinma’ successfully unpacked and MD5 sums checked\n** using staged installation\n** libs\nusing C++ compiler: ‘g++ (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0’\nusing C++17\n\n\ng++ -std=gnu++17 -I\"/opt/R/4.5.1/lib/R/include\" -DNDEBUG -I\"../inst/include\" -I\"/usr/local/lib/R/site-library/StanHeaders/include/src\" -DBOOST_DISABLE_ASSERTS -DEIGEN_NO_DEBUG -DBOOST_MATH_OVERFLOW_ERROR_POLICY=errno_on_error -DUSE_STANC3 -D_HAS_AUTO_PTR_ETC=0 -I'/usr/local/lib/R/site-library/BH/include' -I'/usr/local/lib/R/site-library/Rcpp/include' -I'/usr/local/lib/R/site-library/RcppEigen/include' -I'/usr/local/lib/R/site-library/RcppParallel/include' -I'/usr/local/lib/R/site-library/rstan/include' -I'/usr/local/lib/R/site-library/StanHeaders/include' -I/usr/local/include    -I'/usr/local/lib/R/site-library/RcppParallel/include' -D_REENTRANT -DSTAN_THREADS   -fpic  -g -O2   -c RcppExports.cpp -o RcppExports.o\n...\n/usr/local/lib/R/site-library/StanHeaders/include/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp:22:0:   required from ‘double stan::mcmc::dense_e_metric<Model, BaseRNG>::T(stan::mcmc::dense_e_point&) [with Model = model_survival_param_namespace::model_survival_param; BaseRNG = boost::random::additive_combine_engine<boost::random::linear_congruential_engine<unsigned int, 40014, 0, 2147483563>, boost::random::linear_congruential_engine<unsigned int, 40692, 0, 2147483399> >]’\n/usr/local/lib/R/site-library/StanHeaders/include/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp:21:0:   required from here\n/usr/local/lib/R/site-library/RcppEigen/include/Eigen/src/Core/DenseCoeffsBase.h:654:74: warning: ignoring attributes on template argument ‘Eigen::internal::packet_traits<double>::type’ {aka ‘__m128d’} [-Wignored-attributes]\n  654 |   return internal::first_aligned<int(unpacket_traits<DefaultPacketType>::alignment),Derived>(m);\n      |                                                                          ^~~~~~~~~\ng++: fatal error: Killed signal terminated program cc1plus\ncompilation terminated.\nmake: *** [/opt/R/4.5.1/lib/R/etc/Makeconf:209: stanExports_survival_param.o] Error 1\nERROR: compilation failed for package ‘multinma’\n* removing ‘/tmp/workdir/multinma/new/multinma.Rcheck/multinma’\n\n\n```\n### CRAN\n\n```\n* installing *source* package ‘multinma’ ...\n** this is package ‘multinma’ version ‘0.8.1’\n** package ‘multinma’ successfully unpacked and MD5 sums checked\n** using staged installation\n** libs\nusing C++ compiler: ‘g++ (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0’\nusing C++17\n\n\ng++ -std=gnu++17 -I\"/opt/R/4.5.1/lib/R/include\" -DNDEBUG -I\"../inst/include\" -I\"/usr/local/lib/R/site-library/StanHeaders/include/src\" -DBOOST_DISABLE_ASSERTS -DEIGEN_NO_DEBUG -DBOOST_MATH_OVERFLOW_ERROR_POLICY=errno_on_error -DUSE_STANC3 -D_HAS_AUTO_PTR_ETC=0 -I'/usr/local/lib/R/site-library/BH/include' -I'/usr/local/lib/R/site-library/Rcpp/include' -I'/usr/local/lib/R/site-library/RcppEigen/include' -I'/usr/local/lib/R/site-library/RcppParallel/include' -I'/usr/local/lib/R/site-library/rstan/include' -I'/usr/local/lib/R/site-library/StanHeaders/include' -I/usr/local/include    -I'/usr/local/lib/R/site-library/RcppParallel/include' -D_REENTRANT -DSTAN_THREADS   -fpic  -g -O2   -c RcppExports.cpp -o RcppExports.o\n...\n/usr/local/lib/R/site-library/StanHeaders/include/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp:22:0:   required from ‘double stan::mcmc::dense_e_metric<Model, BaseRNG>::T(stan::mcmc::dense_e_point&) [with Model = model_survival_param_namespace::model_survival_param; BaseRNG = boost::random::additive_combine_engine<boost::random::linear_congruential_engine<unsigned int, 40014, 0, 2147483563>, boost::random::linear_congruential_engine<unsigned int, 40692, 0, 2147483399> >]’\n/usr/local/lib/R/site-library/StanHeaders/include/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp:21:0:   required from here\n/usr/local/lib/R/site-library/RcppEigen/include/Eigen/src/Core/DenseCoeffsBase.h:654:74: warning: ignoring attributes on template argument ‘Eigen::internal::packet_traits<double>::type’ {aka ‘__m128d’} [-Wignored-attributes]\n  654 |   return internal::first_aligned<int(unpacket_traits<DefaultPacketType>::alignment),Derived>(m);\n      |                                                                          ^~~~~~~~~\ng++: fatal error: Killed signal terminated program cc1plus\ncompilation terminated.\nmake: *** [/opt/R/4.5.1/lib/R/etc/Makeconf:209: stanExports_survival_param.o] Error 1\nERROR: compilation failed for package ‘multinma’\n* removing ‘/tmp/workdir/multinma/old/multinma.Rcheck/multinma’\n\n\n```\n"
  },
  {
    "path": "revdep/problems.md",
    "content": "*Wow, no problems at all. :)*"
  },
  {
    "path": "tests/testthat/.gitignore",
    "content": "assets/*/docs\n"
  },
  {
    "path": "tests/testthat/_snaps/build-article.md",
    "content": "# bad width gives nice error\n\n    Code\n      rmarkdown_setup_pkgdown(pkg)\n    Condition\n      Error in `rmarkdown_setup_pkgdown()`:\n      ! In _pkgdown.yml, code.width must be a whole number, not the string \"abc\".\n\n# output is reproducible by default, i.e. 'seed' is respected\n\n    Code\n      cat(output)\n    Output\n      ## [1] 0.080750138 0.834333037 0.600760886 0.157208442 0.007399441\n\n# reports on bad open graph meta-data\n\n    Code\n      build_article(\"test\", pkg)\n    Message\n      Reading vignettes/test.Rmd\n    Condition\n      Error in `build_article()`:\n      ! In vignettes/test.Rmd, opengraph.twitter must be a list, not the number 1.\n\n# build_article styles ANSI escapes\n\n    <span class=\"co\">## <span style=\"color: #BB0000;\">X</span></span>\n\n# build_article copies image files in subdirectories\n\n    Code\n      build_article(\"test\", pkg)\n    Message\n      Reading vignettes/test.Rmd\n      Writing `articles/test.html`\n\n# warns about missing images\n\n    Code\n      build_article(\"kitten\", pkg)\n    Message\n      Reading vignettes/kitten.Rmd\n      Writing `articles/kitten.html`\n      Missing images in 'vignettes/kitten.Rmd': 'kitten.jpg'\n      i pkgdown can only use images in 'man/figures' and 'vignettes'\n\n# warns about missing alt-text\n\n    Code\n      build_article(\"kitten\", pkg)\n    Message\n      Reading vignettes/kitten.Rmd\n      Writing `articles/kitten.html`\n      x Missing alt-text in 'vignettes/kitten.Rmd'\n      * kitten.jpg\n      i Learn more in `vignette(pkgdown::accessibility)`.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-articles.md",
    "content": "# validates articles yaml\n\n    Code\n      data_articles_index_(1)\n    Condition\n      Error in `data_articles_index_()`:\n      ! In _pkgdown.yml, articles must be a list, not the number 1.\n    Code\n      data_articles_index_(list(1))\n    Condition\n      Error in `data_articles_index_()`:\n      ! In _pkgdown.yml, articles[1] must be a list, not the number 1.\n    Code\n      data_articles_index_(list(list()))\n    Condition\n      Error in `data_articles_index_()`:\n      ! In _pkgdown.yml, articles[1] must have components \"title\" and \"contents\".\n      2 missing components: \"title\" and \"contents\".\n    Code\n      data_articles_index_(list(list(title = 1, contents = 1)))\n    Condition\n      Error in `data_articles_index_()`:\n      ! In _pkgdown.yml, articles[1].title must be a string, not the number 1.\n    Code\n      data_articles_index_(list(list(title = \"a\\n\\nb\", contents = 1)))\n    Condition\n      Error in `data_articles_index_()`:\n      ! In _pkgdown.yml, articles[1].title must be inline markdown.\n    Code\n      data_articles_index_(list(list(title = \"a\", contents = 1)))\n    Condition\n      Error in `data_articles_index_()`:\n      ! In _pkgdown.yml, articles[1].contents[1] must be a string.\n      i You might need to add '' around special YAML values like 'N' or 'off'\n\n# validates external-articles\n\n    Code\n      data_articles_(1)\n    Condition\n      Error in `data_articles_()`:\n      ! In _pkgdown.yml, external-articles must be a list, not the number 1.\n    Code\n      data_articles_(list(1))\n    Condition\n      Error in `data_articles_()`:\n      ! In _pkgdown.yml, external-articles[1] must be a list, not the number 1.\n    Code\n      data_articles_(list(list(name = \"x\")))\n    Condition\n      Error in `data_articles_()`:\n      ! In _pkgdown.yml, external-articles[1] must have components \"name\", \"title\", \"href\", and \"description\".\n      3 missing components: \"title\", \"href\", and \"description\".\n    Code\n      data_articles_(list(list(name = 1, title = \"x\", href = \"x\", description = \"x\")))\n    Condition\n      Error in `data_articles_()`:\n      ! In _pkgdown.yml, external-articles[1].name must be a string, not the number 1.\n    Code\n      data_articles_(list(list(name = \"x\", title = 1, href = \"x\", description = \"x\")))\n    Condition\n      Error in `data_articles_()`:\n      ! In _pkgdown.yml, external-articles[1].title must be a string, not the number 1.\n    Code\n      data_articles_(list(list(name = \"x\", title = \"x\", href = 1, description = \"x\")))\n    Condition\n      Error in `data_articles_()`:\n      ! In _pkgdown.yml, external-articles[1].href must be a string, not the number 1.\n    Code\n      data_articles_(list(list(name = \"x\", title = \"x\", href = \"x\", description = 1)))\n    Condition\n      Error in `data_articles_()`:\n      ! In _pkgdown.yml, external-articles[1].description must be a string, not the number 1.\n\n# articles in vignettes/articles/ are unnested into articles/\n\n    Code\n      build_redirects(pkg)\n    Message\n      -- Building redirects ----------------------------------------------------------\n      Adding redirect from articles/articles/nested.html to articles/nested.html.\n\n# warns about articles missing from index\n\n    Code\n      . <- data_articles_index(pkg)\n    Condition\n      Error:\n      ! In _pkgdown.yml, 1 vignette missing from index: \"c\".\n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-favicons.md",
    "content": "# missing logo generates message\n\n    Code\n      expect_output(build_favicons(pkg), \"Building favicons\")\n    Message\n      -- Building favicons -----------------------------------------------------------\n    Condition\n      Error in `build_favicons()`:\n      ! Can't find package logo PNG or SVG to build favicons.\n      i See `usethis::use_logo()` for more information.\n\n# existing logo generates message\n\n    Code\n      build_favicons(pkg)\n    Message\n      -- Building favicons -----------------------------------------------------------\n      Favicons already exist in 'pkgdown'\n      i Set `overwrite = TRUE` to re-create.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-footer.md",
    "content": "# works by default\n\n    $left\n    [1] \"<p>Developed by First Last.</p>\"\n    \n    $right\n    [1] \"<p>Site built with <a href=\\\"https://pkgdown.r-lib.org/\\\">pkgdown</a> {version}.</p>\"\n    \n\n# validates meta components\n\n    Code\n      data_footer_(footer = 1)\n    Condition\n      Error in `data_footer_()`:\n      ! In _pkgdown.yml, footer must be a list, not the number 1.\n    Code\n      data_footer_(footer = list(structure = 1))\n    Condition\n      Error in `data_footer_()`:\n      ! In _pkgdown.yml, footer.structure must be a list, not the number 1.\n    Code\n      data_footer_(footer = list(components = 1))\n    Condition\n      Error in `data_footer_()`:\n      ! In _pkgdown.yml, footer.components must be a list, not the number 1.\n    Code\n      data_footer_(authors = list(footer = list(roles = 1)))\n    Condition\n      Error in `data_footer_()`:\n      ! In _pkgdown.yml, authors.footer.roles must be a character vector, not the number 1.\n    Code\n      data_footer_(authors = list(footer = list(text = 1)))\n    Condition\n      Error in `data_footer_()`:\n      ! In _pkgdown.yml, authors.footer.text must be a string, not the number 1.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-github.md",
    "content": "# a CNAME record is built if a url exists in metadata\n\n    Code\n      build_github_pages(pkg)\n    Message\n      -- Extra files for GitHub pages ------------------------------------------------\n      Writing `.nojekyll`\n      Writing `CNAME`\n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-home-authors.md",
    "content": "# data_authors validates yaml inputs\n\n    Code\n      data_authors_(authors = 1)\n    Condition\n      Error in `data_authors_()`:\n      ! In _pkgdown.yml, authors must be a list, not the number 1.\n    Code\n      data_authors_(authors = list(before = 1))\n    Condition\n      Error in `data_authors_()`:\n      ! In _pkgdown.yml, authors.before must be a string, not the number 1.\n    Code\n      data_authors_(authors = list(after = 1))\n    Condition\n      Error in `data_authors_()`:\n      ! In _pkgdown.yml, authors.after must be a string, not the number 1.\n\n# data_home_sidebar_authors validates yaml inputs\n\n    Code\n      data_home_sidebar_authors_(authors = list(sidebar = list(roles = 1)))\n    Condition\n      Error in `data_home_sidebar_authors_()`:\n      ! In _pkgdown.yml, authors.sidebar.roles must be a character vector, not the number 1.\n    Code\n      data_home_sidebar_authors_(authors = list(sidebar = list(before = 1)))\n    Condition\n      Error in `data_home_sidebar_authors_()`:\n      ! In _pkgdown.yml, authors.sidebar.before must be a string, not the number 1.\n    Code\n      data_home_sidebar_authors_(authors = list(sidebar = list(before = \"x\\n\\ny\")))\n    Condition\n      Error in `data_home_sidebar_authors_()`:\n      ! In _pkgdown.yml, authors.sidebar.before must be inline markdown.\n\n# sidebar can accept additional before and after text\n\n    Code\n      cat(data_home_sidebar_authors(pkg))\n    Output\n      <div class='developers'>\n      <h2 data-toc-skip>Developers</h2>\n      <ul class='list-unstyled'>\n      <li>BEFORE</li>\n      <li>Jo Doe <br />\n      <small class = 'roles'> Author, maintainer </small>   </li>\n      <li>AFTER</li>\n      </ul>\n      </div>\n\n# role has multiple fallbacks\n\n    Code\n      role_lookup(\"unknown\")\n    Condition\n      Warning:\n      Unknown MARC role abbreviation: unknown\n    Output\n      [1] \"unknown\"\n\n# multiple citations all have HTML and BibTeX formats\n\n    [[1]]\n    [[1]]$html\n    [1] \"<p>A &amp; B (2021): Proof of b &lt; a &gt; c.</p>\"\n    \n    [[1]]$bibtex\n    [1] \"@Misc{,\\n  title = {Proof of b < a > c},\\n  author = {{A} and {B}},\\n  year = {2021},\\n}\"\n    \n    \n    [[2]]\n    [[2]]$html\n    [1] \"<p>Two A (2022).\\n&ldquo;Title Two.&rdquo; \\n</p>\"\n    \n    [[2]]$bibtex\n    [1] \"@Misc{,\\n  title = {Title Two},\\n  author = {Author Two},\\n  year = {2022},\\n}\"\n    \n    \n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-home-community.md",
    "content": "# handles CoC and SUPPORT if present\n\n    <div class='community'>\n    <h2 data-toc-skip>Community</h2>\n    <ul class='list-unstyled'>\n    <li><a href='CODE_OF_CONDUCT.html'>Code of conduct</a></li>\n    <li><a href='SUPPORT.html'>Getting help</a></li>\n    </ul>\n    </div>\n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-home-index.md",
    "content": "# messages about reading and writing\n\n    Code\n      build_home_index(pkg)\n    Message\n      Reading 'DESCRIPTION'\n      Writing `index.html`\n    Code\n      build_home_index(pkg)\n    Message\n      Reading 'DESCRIPTION'\n\n# data_home() validates yaml metadata\n\n    Code\n      data_home_(home = 1)\n    Condition\n      Error in `data_home_()`:\n      ! In _pkgdown.yml, home must be a list, not the number 1.\n    Code\n      data_home_(home = list(title = 1))\n    Condition\n      Error in `data_home_()`:\n      ! In _pkgdown.yml, home.title must be a string, not the number 1.\n    Code\n      data_home_(home = list(description = 1))\n    Condition\n      Error in `data_home_()`:\n      ! In _pkgdown.yml, home.description must be a string, not the number 1.\n    Code\n      data_home_(template = list(trailing_slash_redirect = 1))\n    Condition\n      Error in `data_home_()`:\n      ! In _pkgdown.yml, template.trailing_slash_redirect must be true or false, not the number 1.\n\n# data_home_sidebar() works by default\n\n    Code\n      cat(data_home_sidebar(pkg))\n    Output\n      <div class='links'>\n      <h2 data-toc-skip>Links</h2>\n      <ul class='list-unstyled'>\n      <li><a href='{{ BugReports }}'>Report a bug</a></li>\n      </ul>\n      </div>\n      \n      <div class='license'>\n      <h2 data-toc-skip>License</h2>\n      <ul class='list-unstyled'>\n      <li>{{ License }}</li>\n      </ul>\n      </div>\n      \n      \n      <div class='citation'>\n      <h2 data-toc-skip>Citation</h2>\n      <ul class='list-unstyled'>\n      <li><a href='authors.html#citation'>Citing testpackage</a></li>\n      </ul>\n      </div>\n      \n      <div class='developers'>\n      <h2 data-toc-skip>Developers</h2>\n      <ul class='list-unstyled'>\n      <li>Jo Doe <br />\n      <small class = 'roles'> Author, maintainer </small>   </li>\n      </ul>\n      </div>\n      \n      <div class='dev-status'>\n      <h2 data-toc-skip>Dev Status</h2>\n      <ul class='list-unstyled'>\n      <li>placeholder</li>\n      </ul>\n      </div>\n\n---\n\n    <div class=\"developers\">\n    <h2 data-toc-skip>Developers</h2>\n    <ul class=\"list-unstyled\">\n    <li>Hadley Wickham <br><small class=\"roles\"> Author, maintainer </small>   </li>\n    <li>RStudio <br><small class=\"roles\"> Copyright holder, funder </small>   </li>\n    <li><a href=\"authors.html\">More about authors...</a></li>\n    </ul>\n    </div>\n\n# data_home_sidebar() can be defined by a HTML file\n\n    Code\n      data_home_sidebar(pkg)\n    Condition\n      Error:\n      ! In _pkgdown.yml, home.sidebar.html specifies a file that doesn't exist ('sidebar.html').\n\n# data_home_sidebar() can get a custom markdown formatted component\n\n    <div class=\"fancy-section\">\n    <h2 data-toc-skip>Fancy section</h2>\n    <ul class=\"list-unstyled\">\n    <li><p>How <em>cool</em> is pkgdown?!</p></li>\n    </ul>\n    </div>\n\n# data_home_sidebar() can add a TOC\n\n    <div class=\"table-of-contents\">\n    <h2 data-toc-skip>Table of contents</h2>\n    <ul class=\"list-unstyled\">\n    <li><nav id=\"toc\"></nav></li>\n    </ul>\n    </div>\n\n# data_home_sidebar() outputs informative error messages\n\n    Code\n      data_home_sidebar_(html = 1)\n    Condition\n      Error in `data_home_sidebar_()`:\n      ! In _pkgdown.yml, home.sidebar.html must be a string, not the number 1.\n    Code\n      data_home_sidebar_(structure = 1)\n    Condition\n      Error in `data_home_sidebar_()`:\n      ! In _pkgdown.yml, home.sidebar.structure must be a character vector, not the number 1.\n    Code\n      data_home_sidebar_(structure = \"fancy\")\n    Condition\n      Error in `data_home_sidebar_()`:\n      ! In _pkgdown.yml, home.sidebar.components must have component \"fancy\".\n      1 missing component: \"fancy\".\n    Code\n      data_home_sidebar_(structure = c(\"fancy\", \"cool\"))\n    Condition\n      Error in `data_home_sidebar_()`:\n      ! In _pkgdown.yml, home.sidebar.components must have components \"fancy\" and \"cool\".\n      2 missing components: \"fancy\" and \"cool\".\n    Code\n      data_home_sidebar_(structure = \"fancy\", components = list(fancy = list(text = \"bla\")))\n    Condition\n      Error in `data_home_sidebar_()`:\n      ! In _pkgdown.yml, home.sidebar.components.fancy must have components \"title\" and \"text\".\n      1 missing component: \"title\".\n    Code\n      data_home_sidebar_(structure = \"fancy\", components = list(fancy = list()))\n    Condition\n      Error in `data_home_sidebar_()`:\n      ! In _pkgdown.yml, home.sidebar.components.fancy must have components \"title\" and \"text\".\n      2 missing components: \"title\" and \"text\".\n\n# allow email in BugReports\n\n    Code\n      xpath_xml(html, \".//li/a\")\n    Output\n      <a href=\"mailto:me@tidyverse.com\">Report a bug</a>\n      <a href=\"authors.html#citation\">Citing testpackage</a>\n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-llm-dl.md",
    "content": "# dd with block elements simplifies correctly\n\n    Code\n      xpath_xml(html, \".//li\")\n    Output\n      <li>\n      <p>a: </p>\n                <p>b</p>\n                <p>c</p>\n              </li>\n\n# warns if not applied\n\n    Code\n      . <- simplify_dls(html)\n    Condition\n      Warning:\n      Skipping this <dl>: not a simple term-definition list\n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-llm.md",
    "content": "# integration test for convert_md()\n\n    Code\n      write_lines(read_lines(path), stdout())\n    Output\n      # Page title\n      \n      ## Heading\n      \n      Some text\n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-news.md",
    "content": "# data_news works as expected for h1 & h2\n\n    # A tibble: 2 x 3\n      version    page  anchor             \n      <chr>      <chr> <chr>              \n    1 1.0.0.9000 dev   testpackage-1009000\n    2 1.0.0      1.0   testpackage-100    \n\n---\n\n    # A tibble: 2 x 3\n      version    page  anchor             \n      <chr>      <chr> <chr>              \n    1 1.0.0.9000 dev   testpackage-1009000\n    2 1.0.0      1.0   testpackage-100    \n\n# multi-page news are rendered\n\n    Code\n      data_news(pkg)[c(\"version\", \"page\", \"anchor\")]\n    Output\n      # A tibble: 4 x 3\n        version page  anchor         \n        <chr>   <chr> <chr>          \n      1 2.0     2.0   testpackage-20 \n      2 1.1     1.1   testpackage-11 \n      3 1.0.1   1.0   testpackage-101\n      4 1.0.0   1.0   testpackage-100\n\n---\n\n    Code\n      build_news(pkg)\n    Message\n      -- Building news ---------------------------------------------------------------\n      Writing `news/news-2.0.html`\n      Writing `news/news-1.1.html`\n      Writing `news/news-1.0.html`\n      Writing `news/index.html`\n\n# news headings get class and release date\n\n    <div>\n      <h2 class=\"page-header\" data-toc-text=\"1.0\">\n        <small>2020-01-01</small>\n      </h2>\n    </div>\n\n---\n\n    <div>\n      <h2 class=\"pkg-version\" data-toc-text=\"1.0\"/>\n      <p class=\"text-muted\">CRAN release: 2020-01-01</p>\n    </div>\n\n# clear error for bad hierarchy - bad nesting\n\n    Code\n      data_news(pkg)\n    Condition\n      Error:\n      ! In NEWS.md, inconsistent use of section headings.\n      i Top-level headings must be either all <h1> or all <h2>.\n      i See `?pkgdown::build_news()` for more details.\n\n# clear error for bad hierarchy - h3\n\n    Code\n      data_news(pkg)\n    Condition\n      Error:\n      ! In NEWS.md, inconsistent use of section headings.\n      i Top-level headings must be either all <h1> or all <h2>.\n      i See `?pkgdown::build_news()` for more details.\n\n# news can contain footnotes\n\n    Code\n      x <- data_news(pkg)\n    Condition\n      Warning:\n      Footnotes in NEWS.md are not currently supported\n\n# data_news warns if no headings found\n\n    Code\n      . <- data_news(pkg)\n    Condition\n      Warning:\n      In NEWS.md, no version headings found\n      i See `?pkgdown::build_news()` for expected structure.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-quarto-articles.md",
    "content": "# we find out if quarto styles change\n\n    Code\n      cat(data$includes$style)\n    Output\n      \n          code{white-space: pre-wrap;}\n          span.smallcaps{font-variant: small-caps;}\n          div.columns{display: flex; gap: min(4vw, 1.5em);}\n          div.column{flex: auto; overflow-x: auto;}\n          div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\n          ul.task-list{list-style: none;}\n          ul.task-list li input[type=\"checkbox\"] {\n            width: 0.8em;\n            margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ \n            vertical-align: middle;\n          }\n        \n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-redirects.md",
    "content": "# build_redirect() works\n\n    Code\n      build_redirect(c(\"old.html\", \"new.html#section\"), 1, pkg = pkg)\n    Message\n      Adding redirect from old.html to new.html#section.\n\n# build_redirect() errors if one entry is not right.\n\n    Code\n      data_redirects_(redirects = \"old.html\")\n    Condition\n      Error in `data_redirects_()`:\n      ! In _pkgdown.yml, redirects must be a list, not the string \"old.html\".\n    Code\n      data_redirects_(redirects = list(\"old.html\"))\n    Condition\n      Error in `data_redirects_()`:\n      ! In _pkgdown.yml, redirects[1] must be a character vector of length 2, not the string \"old.html\".\n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-reference-index.md",
    "content": "# can generate three types of row\n\n    Code\n      data_reference_index(pkg)\n    Output\n      pagetitle: Package index\n      rows:\n      - title: A\n        slug: a\n        desc: ~\n        is_internal: no\n      - subtitle: B\n        slug: b\n        desc: ~\n        is_internal: no\n      - topics:\n        - path: a.html\n          title: A\n          lifecycle: ~\n          aliases: a()\n          icon: ~\n        - path: b.html\n          title: B\n          lifecycle: ~\n          aliases: b()\n          icon: ~\n        - path: c.html\n          title: C\n          lifecycle: ~\n          aliases: c()\n          icon: ~\n        - path: e.html\n          title: E\n          lifecycle: ~\n          aliases: e\n          icon: ~\n        - path: help.html\n          title: D\n          lifecycle: ~\n          aliases: '`?`()'\n          icon: ~\n        names:\n        - a\n        - b\n        - c\n        - e\n        - '?'\n        row_has_icons: no\n        is_internal: no\n      has_icons: no\n      \n\n# warns if missing topics\n\n    Code\n      data_reference_index(pkg)\n    Condition\n      Error:\n      ! In _pkgdown.yml, 3 topics missing from index: \"c\", \"e\", and \"?\".\n      i Either add to the reference index, or use `@keywords internal` to drop from the index.\n\n# gives informative errors\n\n    Code\n      data_reference_index_(1)\n    Condition\n      Error in `config_pluck_reference()`:\n      ! In _pkgdown.yml, reference must be a list, not the number 1.\n    Code\n      data_reference_index_(list(1))\n    Condition\n      Error in `data_reference_index_()`:\n      ! In _pkgdown.yml, reference[1] must be a list, not the number 1.\n    Code\n      data_reference_index_(list(list(title = 1)))\n    Condition\n      Error in `data_reference_index_()`:\n      ! In _pkgdown.yml, reference[1].title must be a string, not the number 1.\n    Code\n      data_reference_index_(list(list(title = \"a\\n\\nb\")))\n    Condition\n      Error in `data_reference_index_()`:\n      ! In _pkgdown.yml, reference[1].title must be inline markdown.\n    Code\n      data_reference_index_(list(list(subtitle = 1)))\n    Condition\n      Error in `data_reference_index_()`:\n      ! In _pkgdown.yml, reference[1].subtitle must be a string, not the number 1.\n    Code\n      data_reference_index_(list(list(subtitle = \"a\\n\\nb\")))\n    Condition\n      Error in `data_reference_index_()`:\n      ! In _pkgdown.yml, reference[1].subtitle must be inline markdown.\n    Code\n      data_reference_index_(list(list(title = \"bla\", contents = 1)))\n    Condition\n      Error in `data_reference_index_()`:\n      ! In _pkgdown.yml, reference[1].contents[1] must be a string.\n      i You might need to add '' around special YAML values like 'N' or 'off'\n    Code\n      data_reference_index_(list(list(title = \"bla\", contents = NULL)))\n    Condition\n      Error in `data_reference_index_()`:\n      ! In _pkgdown.yml, reference[1].contents is empty.\n    Code\n      data_reference_index_(list(list(title = \"bla\", contents = list(\"a\", NULL))))\n    Condition\n      Error in `data_reference_index_()`:\n      ! In _pkgdown.yml, reference[1].contents[2] is empty.\n    Code\n      data_reference_index_(list(list(title = \"bla\", contents = list())))\n    Condition\n      Error in `data_reference_index_()`:\n      ! In _pkgdown.yml, reference[1].contents is empty.\n    Code\n      data_reference_index_(list(list(title = \"bla\", contents = \"notapackage::lala\")))\n    Condition\n      Error in `build_reference_index()`:\n      ! The package \"notapackage\" is required as it's used in the reference index.\n    Code\n      data_reference_index_(list(list(title = \"bla\", contents = \"rlang::lala\")))\n    Condition\n      Error in `build_reference_index()`:\n      ! Could not find documentation for `rlang::lala()`.\n\n# can use a topic from another package\n\n    Code\n      data_reference_index(pkg)\n    Output\n      pagetitle: Package index\n      rows:\n      - title: bla\n        slug: bla\n        desc: ~\n        is_internal: no\n      - topics:\n        - path: https://rlang.r-lib.org/reference/is_installed.html\n          title: Are packages installed in any of the libraries? (from rlang)\n          lifecycle: ~\n          aliases:\n          - is_installed()\n          - check_installed()\n          icon: ~\n        - path: https://rstudio.github.io/bslib/reference/bs_bundle.html\n          title: Add low-level theming customizations (from bslib)\n          lifecycle: ~\n          aliases:\n          - bs_add_variables()\n          - bs_add_rules()\n          - bs_add_functions()\n          - bs_add_mixins()\n          - bs_bundle()\n          icon: ~\n        names:\n        - rlang::is_installed()\n        - bslib::bs_add_rules\n        row_has_icons: no\n        is_internal: no\n      has_icons: no\n      \n\n# can use a selector name as a topic name\n\n    Code\n      data_reference_index(pkg)\n    Output\n      pagetitle: Package index\n      rows:\n      - title: bla\n        slug: bla\n        desc: ~\n        is_internal: no\n      - topics:\n        - path: matches.html\n          title: matches\n          lifecycle: ~\n          aliases: matches()\n          icon: ~\n        - path: A.html\n          title: A\n          lifecycle: ~\n          aliases: A()\n          icon: ~\n        names:\n        - matches\n        - A\n        row_has_icons: no\n        is_internal: no\n      has_icons: no\n      \n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-reference.md",
    "content": "# parse failures include file name\n\n    Code\n      build_reference(pkg)\n    Message\n      -- Building function reference -------------------------------------------------\n      Writing `reference/index.html`\n      Reading man/f.Rd\n    Condition\n      Error in `build_reference()`:\n      ! Failed to parse Rd in 'f.Rd'\n      Caused by error:\n      ! Failed to parse tag \"\\\\url{}\".\n      i Check for empty \\url{} tags.\n\n# examples are reproducible by default, i.e. 'seed' is respected\n\n    Code\n      cat(examples)\n    Output\n      #> [1] 0.600760886 0.157208442 0.007399441 0.466393497 0.497777389\n\n"
  },
  {
    "path": "tests/testthat/_snaps/build-search-docs.md",
    "content": "# build_search_index() has expected structure\n\n    Code\n      str(build_search_index(pkg))\n    Output\n      List of 1\n       $ :List of 8\n        ..$ path             : chr \"https://example.com/index.html\"\n        ..$ id               : chr \"my-package\"\n        ..$ dir              : chr \"\"\n        ..$ previous_headings: chr \"\"\n        ..$ what             : chr \"A test package\"\n        ..$ title            : chr \"A test package\"\n        ..$ text             : chr \"pakage \"\n        ..$ code             : chr \"\"\n\n# build sitemap only messages when it updates\n\n    Code\n      build_sitemap(pkg)\n    Message\n      -- Building sitemap ------------------------------------------------------------\n      Writing `sitemap.xml`\n    Code\n      build_sitemap(pkg)\n    Message\n      -- Building sitemap ------------------------------------------------------------\n\n"
  },
  {
    "path": "tests/testthat/_snaps/check-built.md",
    "content": "# check images in readme\n\n    Code\n      check_built_site(pkg)\n    Message\n      -- Checking for problems -------------------------------------------------------\n      Missing images in 'README.md': 'articles/kitten.jpg'\n      i pkgdown can only use images in 'man/figures' and 'vignettes'\n\n"
  },
  {
    "path": "tests/testthat/_snaps/check.md",
    "content": "# sitrep complains about BS3\n\n    Code\n      pkgdown_sitrep(pkg)\n    Message\n      -- Sitrep ----------------------------------------------------------------------\n      x Bootstrap 3 is deprecated; please switch to Bootstrap 5.\n      i Learn more at <https://www.tidyverse.org/blog/2021/12/pkgdown-2-0-0/#bootstrap-5>.\n      v URLs ok.\n      v Favicons ok.\n      v Open graph metadata ok.\n      v Articles metadata ok.\n      v Reference metadata ok.\n\n# sitrep reports all problems\n\n    Code\n      pkgdown_sitrep(pkg)\n    Message\n      -- Sitrep ----------------------------------------------------------------------\n      x URLs not ok.\n        In DESCRIPTION, URL is missing package url (http://test.org).\n        See details in `vignette(pkgdown::metadata)`.\n      v Favicons ok.\n      v Open graph metadata ok.\n      v Articles metadata ok.\n      x Reference metadata not ok.\n        In _pkgdown.yml, 1 topic missing from index: \"?\".\n        Either add to the reference index, or use `@keywords internal` to drop from the index.\n\n# checks fails on first problem\n\n    Code\n      check_pkgdown(pkg)\n    Condition\n      Error in `check_pkgdown()`:\n      ! In DESCRIPTION, URL is missing package url (http://test.org).\n      i See details in `vignette(pkgdown::metadata)`.\n\n# both inform if everything is ok\n\n    Code\n      pkgdown_sitrep(pkg)\n    Message\n      -- Sitrep ----------------------------------------------------------------------\n      v URLs ok.\n      v Favicons ok.\n      v Open graph metadata ok.\n      v Articles metadata ok.\n      v Reference metadata ok.\n    Code\n      check_pkgdown(pkg)\n    Message\n      v No problems found.\n\n# check_urls reports problems\n\n    Code\n      check_urls(pkg)\n    Condition\n      Error:\n      ! In _pkgdown.yml, url is missing.\n      i See details in `vignette(pkgdown::metadata)`.\n\n---\n\n    Code\n      check_urls(pkg)\n    Condition\n      Error:\n      ! In DESCRIPTION, URL is missing package url (https://testpackage.r-lib.org).\n      i See details in `vignette(pkgdown::metadata)`.\n\n# check_favicons reports problems\n\n    Code\n      check_favicons(pkg)\n    Condition\n      Error in `check_favicons()`:\n      ! Found package logo but not favicons.\n      i Do you need to run `build_favicons()`?\n\n---\n\n    Code\n      check_favicons(pkg)\n    Condition\n      Error in `check_favicons()`:\n      ! Package logo is newer than favicons.\n      i Do you need to rerun `build_favicons()`?\n\n"
  },
  {
    "path": "tests/testthat/_snaps/config.md",
    "content": "# config_pluck_character generates informative error\n\n    Code\n      config_pluck_character(pkg, \"x\")\n    Condition\n      Error:\n      ! In _pkgdown.yml, x must be a character vector, not the number 1.\n\n# config_pluck_string generates informative error\n\n    Code\n      config_pluck_string(pkg, \"x\")\n    Condition\n      Error:\n      ! In _pkgdown.yml, x must be a string, not the number 1.\n\n# config_check_list gives informative errors\n\n    Code\n      config_check_list_(1, has_names = \"x\")\n    Condition\n      Error in `config_check_list_()`:\n      ! In _pkgdown.yml, path must be a list, not the number 1.\n    Code\n      config_check_list_(list(x = 1, y = 1), has_names = c(\"y\", \"z\"))\n    Condition\n      Error in `config_check_list_()`:\n      ! In _pkgdown.yml, path must have components \"y\" and \"z\".\n      1 missing component: \"z\".\n\n"
  },
  {
    "path": "tests/testthat/_snaps/development.md",
    "content": "# validates yaml\n\n    Code\n      data_development_(development = 1)\n    Condition\n      Error in `as_pkgdown()`:\n      ! In _pkgdown.yml, development must be a list, not the number 1.\n    Code\n      data_development_(development = list(mode = 1))\n    Condition\n      Error in `as_pkgdown()`:\n      ! In _pkgdown.yml, development.mode must be a string, not the number 1.\n    Code\n      data_development_(development = list(mode = \"foo\"))\n    Condition\n      Error in `as_pkgdown()`:\n      ! In _pkgdown.yml, development.mode must be one of auto, default, release, devel, or unreleased, not foo.\n    Code\n      data_development_(development = list(destination = 1))\n    Condition\n      Error in `as_pkgdown()`:\n      ! In _pkgdown.yml, development.destination must be a string, not the number 1.\n    Code\n      data_development_(development = list(version_label = 1))\n    Condition\n      Error in `as_pkgdown()`:\n      ! In _pkgdown.yml, development.version_label must be a string, not the number 1.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/external-deps.md",
    "content": "# check integrity validates integrity\n\n    Code\n      check_integrity(temp, \"sha123-abc\")\n    Condition\n      Error in `check_integrity()`:\n      ! integrity must use SHA-256, SHA-384, or SHA-512\n      i This is an internal error that was detected in the pkgdown package.\n        Please report it at <https://github.com/r-lib/pkgdown/issues> with a reprex (<https://tidyverse.org/help/>) and the full backtrace.\n    Code\n      check_integrity(temp, \"sha256-abc\")\n    Condition\n      Error in `check_integrity()`:\n      ! Downloaded asset does not match known integrity\n      i This is an internal error that was detected in the pkgdown package.\n        Please report it at <https://github.com/r-lib/pkgdown/issues> with a reprex (<https://tidyverse.org/help/>) and the full backtrace.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/highlight.md",
    "content": "# highlight_examples runs and hides DONTSHOW calls()\n\n    Code\n      cat(strip_html_tags(out))\n    Output\n      x\n      #&gt; [1] 1\n\n# pre() can produce needed range of outputs\n\n    Code\n      cat(pre(\"x\"))\n    Output\n      <pre><code>x</code></pre>\n    Code\n      cat(pre(\"x\", r_code = TRUE))\n    Output\n      <pre class='sourceCode r'><code>x</code></pre>\n\n# tweak_highlight_other() renders nested code blocks for roxygen2 >= 7.2.0\n\n    Code\n      cat(xpath_text(div, \"pre/code\"))\n    Output\n      \n      blablabla\n      \n      ```{r results='asis'}\n      lalala\n      ```\n\n"
  },
  {
    "path": "tests/testthat/_snaps/init.md",
    "content": "# informative print method\n\n    Code\n      init_site(pkg)\n    Message\n      -- Initialising site -----------------------------------------------------------\n      Copying <pkgdown>/BS5/assets/katex-auto.js to katex-auto.js\n      Copying <pkgdown>/BS5/assets/lightswitch.js to lightswitch.js\n      Copying <pkgdown>/BS5/assets/link.svg to link.svg\n      Copying <pkgdown>/BS5/assets/pkgdown.js to pkgdown.js\n      Updating deps/bootstrap-5.3.1/bootstrap.bundle.min.js\n      Updating deps/bootstrap-5.3.1/bootstrap.bundle.min.js.map\n      Updating deps/bootstrap-5.3.1/bootstrap.min.css\n      Updating deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\n      Updating deps/clipboard.js-2.0.11/clipboard.min.js\n      Updating deps/font-awesome-6.5.2/css/all.css\n      Updating deps/font-awesome-6.5.2/css/all.min.css\n      Updating deps/font-awesome-6.5.2/css/v4-shims.css\n      Updating deps/font-awesome-6.5.2/css/v4-shims.min.css\n      Updating deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf\n      Updating deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2\n      Updating deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf\n      Updating deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2\n      Updating deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf\n      Updating deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2\n      Updating deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf\n      Updating deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2\n      Updating deps/headroom-0.11.0/headroom.min.js\n      Updating deps/headroom-0.11.0/jQuery.headroom.min.js\n      Updating deps/jquery-3.6.0/jquery-3.6.0.js\n      Updating deps/jquery-3.6.0/jquery-3.6.0.min.js\n      Updating deps/jquery-3.6.0/jquery-3.6.0.min.map\n      Updating deps/search-1.0.0/autocomplete.jquery.min.js\n      Updating deps/search-1.0.0/fuse.min.js\n      Updating deps/search-1.0.0/mark.min.js\n\n# site meta doesn't break unexpectedly\n\n    Code\n      yaml\n    Output\n      pandoc: '{version}'\n      pkgdown: '{version}'\n      pkgdown_sha: '{sha}'\n      articles:\n        a: a.html\n        b: b.html\n      last_built: 2020-01-01T00:00Z\n      \n\n"
  },
  {
    "path": "tests/testthat/_snaps/markdown.md",
    "content": "# markdown_text_inline() works with inline markdown\n\n    Code\n      markdown_text_inline(pkg, \"x\\n\\ny\", error_path = \"title\")\n    Condition\n      Error:\n      ! In _pkgdown.yml, title must be inline markdown.\n\n# validates math yaml\n\n    Code\n      config_math_rendering_(`math-rendering` = 1)\n    Condition\n      Error in `config_math_rendering_()`:\n      ! In _pkgdown.yml, template.math-rendering must be a string, not the number 1.\n    Code\n      config_math_rendering_(`math-rendering` = \"math\")\n    Condition\n      Error in `config_math_rendering_()`:\n      ! In _pkgdown.yml, template.math-rendering must be one of mathml, mathjax, and katex, not math.\n\n# preserves ANSI characters\n\n    Code\n      markdown_text(pkg, sprintf(\"prefer %s\", cli::col_blue(\"a\")))\n    Output\n      {html_document}\n      <html>\n      [1] <body><p>prefer \\u2029[34ma\\u2029[39m</p></body>\n\n"
  },
  {
    "path": "tests/testthat/_snaps/navbar-menu.md",
    "content": "# can construct menu with children\n\n    Code\n      cat(navbar_html(menu))\n    Output\n      <li class=\"nav-item dropdown\">\n        <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-title\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Title</button>\n        <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-title\">\n          <li><h6 class=\"dropdown-header\" data-toc-skip>Heading</h6></li>\n          <li><hr class=\"dropdown-divider\"></li>\n          <li><a class=\"dropdown-item\" href=\"https://example.com\">Link</a></li>\n        </ul>\n      </li>\n\n# bad inputs give clear error\n\n    Code\n      navbar_html(1)\n    Condition\n      Error in `menu_type()`:\n      ! Navbar components must be named lists, not the number 1.\n    Code\n      navbar_html(list(foo = 1))\n    Condition\n      Error in `menu_type()`:\n      ! Unknown navbar component with names foo.\n    Code\n      navbar_html(submenu)\n    Condition\n      Error in `menu_type()`:\n      ! Nested menus are not supported.\n\n# can construct bullets\n\n    Code\n      cat(navbar_html(menu_icon(\"fa-question\", \"https://example.com\", \"label\")))\n    Output\n      <li class=\"nav-item\"><a class=\"nav-link\" href=\"https://example.com\" aria-label=\"label\"><span class=\"fa fa-question\"></span></a></li>\n    Code\n      cat(navbar_html(menu_heading(\"Hi\")))\n    Output\n      <li class=\"nav-item\"><h6 class=\"dropdown-header\" data-toc-skip>Hi</h6></li>\n    Code\n      cat(navbar_html(menu_link(\"Hi\", \"https://example.com\")))\n    Output\n      <li class=\"nav-item\"><a class=\"nav-link\" href=\"https://example.com\">Hi</a></li>\n\n# icons warn if no aria-label\n\n    Code\n      . <- navbar_html(menu_icon(\"fa-question\", \"https://example.com\", NULL))\n    Message\n      x Icon \"fa-question\" lacks an `aria-label`.\n      i Specify `aria-label` to make the icon accessible to screen readers.\n      i Learn more in `vignette(pkgdown::accessibility)`.\n      This message is displayed once every 8 hours.\n\n# can construct theme menu\n\n    Code\n      cat(navbar_html(lightswitch))\n    Output\n      <li class=\"nav-item dropdown\">\n        <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-lightswitch\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\" aria-label=\"Light switch\"><span class=\"fa fa-sun\"></span></button>\n        <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-lightswitch\">\n          <li><button class=\"dropdown-item\" data-bs-theme-value=\"light\"><span class=\"fa fa-sun\"></span> Light</button></li>\n          <li><button class=\"dropdown-item\" data-bs-theme-value=\"dark\"><span class=\"fa fa-moon\"></span> Dark</button></li>\n          <li><button class=\"dropdown-item\" data-bs-theme-value=\"auto\"><span class=\"fa fa-adjust\"></span> Auto</button></li>\n        </ul>\n      </li>\n\n# simple components don't change without warning\n\n    Code\n      cat(navbar_html(menu_heading(\"a\")))\n    Output\n      <li class=\"nav-item\"><h6 class=\"dropdown-header\" data-toc-skip>a</h6></li>\n    Code\n      cat(navbar_html(menu_link(\"a\", \"b\")))\n    Output\n      <li class=\"nav-item\"><a class=\"nav-link\" href=\"b\">a</a></li>\n    Code\n      cat(navbar_html(menu_separator()))\n    Output\n      <li class=\"nav-item\"><hr class=\"dropdown-divider\"></li>\n    Code\n      cat(navbar_html(menu_search()))\n    Output\n      <li class=\"nav-item\"><form class=\"form-inline\" role=\"search\">\n       <input class=\"form-control\" type=\"search\" name=\"search-input\" id=\"search-input\" autocomplete=\"off\" aria-label=\"Search site\" placeholder=\"Search for\" data-search-index=\"search.json\"> \n      </form></li>\n\n"
  },
  {
    "path": "tests/testthat/_snaps/navbar.md",
    "content": "# adds github/gitlab/codeberg link when available\n\n    reference:\n      text: Reference\n      href: reference/index.html\n    search:\n      search: []\n    \n\n---\n\n    reference:\n      text: Reference\n      href: reference/index.html\n    search:\n      search: []\n    github:\n      icon: fab fa-github fa-lg\n      href: https://github.com/r-lib/pkgdown\n      aria-label: GitHub\n    \n\n---\n\n    reference:\n      text: Reference\n      href: reference/index.html\n    search:\n      search: []\n    github:\n      icon: fab fa-gitlab fa-lg\n      href: https://gitlab.com/r-lib/pkgdown\n      aria-label: GitLab\n    \n\n# vignette with package name turns into getting started\n\n    reference:\n      text: Reference\n      href: reference/index.html\n    search:\n      search: []\n    intro:\n      text: Get started\n      href: test.html\n    \n\n# can control articles navbar through articles meta\n\n    Code\n      navbar_articles(pkg())\n    Output\n      articles:\n        text: Articles\n        menu:\n        - text: Title a\n          href: a.html\n        - text: Title b\n          href: b.html\n      \n\n---\n\n    Code\n      navbar_articles(pkg(articles = list(list(name = \"all\", contents = c(\"a\", \"b\")))))\n    Output\n      articles:\n        text: Articles\n        href: articles/index.html\n      \n\n---\n\n    Code\n      navbar_articles(pkg(articles = list(list(name = \"all\", contents = c(\"a\", \"b\"),\n      navbar = NULL))))\n    Output\n      articles:\n        text: Articles\n        menu:\n        - text: Title a\n          href: a.html\n        - text: Title b\n          href: b.html\n      \n\n---\n\n    Code\n      navbar_articles(pkg(articles = list(list(name = \"all\", contents = c(\"a\", \"b\"),\n      navbar = \"Label\"))))\n    Output\n      articles:\n        text: Articles\n        menu:\n        - text: '---------'\n        - text: Label\n        - text: Title a\n          href: a.html\n        - text: Title b\n          href: b.html\n      \n\n---\n\n    Code\n      navbar_articles(pkg(articles = list(list(name = \"a\", contents = \"a\", navbar = NULL),\n      list(name = \"b\", contents = \"b\"))))\n    Output\n      articles:\n        text: Articles\n        menu:\n        - text: Title a\n          href: a.html\n        - text: '---------'\n        - text: More articles...\n          href: articles/index.html\n      \n\n# data_navbar() works by default\n\n    Code\n      data_navbar(pkg)\n    Output\n      $bg\n      [1] \"light\"\n      \n      $type\n      [1] \"light\"\n      \n      $left\n      [1] \"<li class=\\\"nav-item\\\"><a class=\\\"nav-link\\\" href=\\\"reference/index.html\\\">Reference</a></li>\\n<li class=\\\"nav-item\\\"><a class=\\\"nav-link\\\" href=\\\"news/index.html\\\">Changelog</a></li>\"\n      \n      $right\n      [1] \"<li class=\\\"nav-item\\\"><form class=\\\"form-inline\\\" role=\\\"search\\\">\\n <input class=\\\"form-control\\\" type=\\\"search\\\" name=\\\"search-input\\\" id=\\\"search-input\\\" autocomplete=\\\"off\\\" aria-label=\\\"Search site\\\" placeholder=\\\"Search for\\\" data-search-index=\\\"search.json\\\"> \\n</form></li>\\n<li class=\\\"nav-item\\\"><a class=\\\"nav-link\\\" href=\\\"https://github.com/r-lib/pkgdown/\\\" aria-label=\\\"GitHub\\\"><span class=\\\"fa fab fa-github fa-lg\\\"></span></a></li>\"\n      \n\n# data_navbar() can re-order default elements\n\n    Code\n      data_navbar(pkg)[c(\"left\", \"right\")]\n    Output\n      $left\n      [1] \"<li class=\\\"nav-item\\\"><a class=\\\"nav-link\\\" href=\\\"https://github.com/r-lib/pkgdown/\\\" aria-label=\\\"GitHub\\\"><span class=\\\"fa fab fa-github fa-lg\\\"></span></a></li>\\n<li class=\\\"nav-item\\\"><form class=\\\"form-inline\\\" role=\\\"search\\\">\\n <input class=\\\"form-control\\\" type=\\\"search\\\" name=\\\"search-input\\\" id=\\\"search-input\\\" autocomplete=\\\"off\\\" aria-label=\\\"Search site\\\" placeholder=\\\"Search for\\\" data-search-index=\\\"search.json\\\"> \\n</form></li>\"\n      \n      $right\n      [1] \"<li class=\\\"nav-item\\\"><a class=\\\"nav-link\\\" href=\\\"news/index.html\\\">Changelog</a></li>\"\n      \n\n# data_navbar() works with empty side\n\n    Code\n      data_navbar(pkg)\n    Output\n      $bg\n      [1] \"light\"\n      \n      $type\n      [1] \"light\"\n      \n      $left\n      [1] \"\"\n      \n      $right\n      [1] \"\"\n      \n\n# data_navbar_() errors with bad yaml specifications\n\n    Code\n      data_navbar_(navbar = list(structure = list(left = 1)))\n    Condition\n      Error in `data_navbar_()`:\n      ! In _pkgdown.yml, navbar.structure.left must be a character vector, not the number 1.\n    Code\n      data_navbar_(navbar = list(right = \"github\"))\n    Condition\n      Error in `data_template()`:\n      ! In _pkgdown.yml, navbar is incorrectly specified.\n      i See details in `vignette(pkgdown::customise)`.\n\n# render_navbar_links BS3 & BS4 default\n\n    Code\n      cat(render_navbar_links(x, pkg = list(bs_version = 3)))\n    Output\n      <li>\n        <a href=\"articles/pkgdown.html\">Get started</a>\n      </li>\n      <li>\n        <a href=\"reference/index.html\">Reference</a>\n      </li>\n      <li class=\"dropdown\">\n        <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n          Articles\n           \n          <span class=\"caret\"></span>\n        </a>\n        <ul class=\"dropdown-menu\" role=\"menu\">\n          <li>\n            <a href=\"articles/linking.html\">Auto-linking</a>\n          </li>\n          <li>\n            <a href=\"articles/search.html\">Search</a>\n          </li>\n          <li>\n            <a href=\"articles/metadata.html\">Metadata</a>\n          </li>\n          <li>\n            <a href=\"articles/customization.html\">Customize your pkgdown website</a>\n          </li>\n          <li class=\"divider\"></li>\n          <li>\n            <a href=\"articles/index.html\">More...</a>\n          </li>\n        </ul>\n      </li>\n      <li>\n        <a href=\"news/index.html\">News</a>\n      </li>\n\n---\n\n    Code\n      cat(render_navbar_links(x, pkg = list(bs_version = 4)))\n    Output\n      <li class=\"nav-item\"><a class=\"nav-link\" href=\"articles/pkgdown.html\">Get started</a></li>\n      <li class=\"nav-item\"><a class=\"nav-link\" href=\"reference/index.html\">Reference</a></li>\n      <li class=\"nav-item dropdown\">\n        <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-articles\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Articles</button>\n        <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n          <li><a class=\"dropdown-item\" href=\"articles/linking.html\">Auto-linking</a></li>\n          <li><a class=\"dropdown-item\" href=\"articles/search.html\">Search</a></li>\n          <li><a class=\"dropdown-item\" href=\"articles/metadata.html\">Metadata</a></li>\n          <li><a class=\"dropdown-item\" href=\"articles/customization.html\">Customize your pkgdown website</a></li>\n          <li><hr class=\"dropdown-divider\"></li>\n          <li><a class=\"dropdown-item\" href=\"articles/index.html\">More...</a></li>\n        </ul>\n      </li>\n      <li class=\"nav-item\"><a class=\"nav-link\" href=\"news/index.html\">News</a></li>\n\n"
  },
  {
    "path": "tests/testthat/_snaps/not-in-rcmcheck/build-article.md",
    "content": "# build_article yields useful error if R fails\n\n    Code\n      build_article(\"test\", pkg)\n    Message\n      Reading vignettes/test.Rmd\n    Condition\n      Error in `build_article()`:\n      ! Failed to render 'vignettes/test.Rmd'.\n      x Quitting from test.Rmd:4-10 [unnamed-chunk-1]\n      Caused by error:\n      ! Error!\n\n---\n\n    Code\n      summary(expect_error(build_article(\"test\", pkg)))\n    Message\n      Reading vignettes/test.Rmd\n    Output\n      <error/rlang_error>\n      Error in `build_article()`:\n      ! Failed to render 'vignettes/test.Rmd'.\n      x Quitting from test.Rmd:4-10 [unnamed-chunk-1]\n      Caused by error:\n      ! Error!\n      ---\n      Backtrace:\n          x\n       1. \\-global f()\n       2.   \\-global g()\n       3.     \\-global h()\n\n"
  },
  {
    "path": "tests/testthat/_snaps/package.md",
    "content": "# is_pkgdown checks its inputs\n\n    Code\n      as_pkgdown(1)\n    Condition\n      Error in `as_pkgdown()`:\n      ! `pkg` must be a single string, not the number 1.\n    Code\n      as_pkgdown(override = 1)\n    Condition\n      Error in `as_pkgdown()`:\n      ! `override` must be a list, not the number 1.\n\n# check_bootstrap_version() allows 3, 4 (with warning), and 5\n\n    Code\n      expect_equal(check_bootstrap_version(4, pkg), 5)\n    Condition\n      Warning:\n      In _pkgdown.yml, `template.bootstrap: 4` no longer supported\n      i Using `template.bootstrap: 5` instead\n\n# check_bootstrap_version() gives informative error otherwise\n\n    Code\n      check_bootstrap_version(1, pkg)\n    Condition\n      Error in `check_bootstrap_version()`:\n      ! In _pkgdown.yml, template.bootstrap must be 3 or 5, not 1.\n\n# package_vignettes() detects conflicts in final article paths\n\n    Code\n      package_vignettes(dir)\n    Condition\n      Error in `package_vignettes()`:\n      ! Rendered articles must have unique names. Rename or relocate:\n      x vignettes/articles/test.Rmd and vignettes/test.Rmd\n\n# read_meta() errors gracefully if _pkgdown.yml failed to parse\n\n    Code\n      as_pkgdown(pkg$src_path)\n    Condition\n      Error in `as_pkgdown()`:\n      ! Could not parse config file at '<src>/_pkgdown.yml'.\n      Caused by error in `yaml.load()`:\n      ! Scanner error: mapping values are not allowed in this context at line 2, column 8\n\n"
  },
  {
    "path": "tests/testthat/_snaps/preview.md",
    "content": "# checks its inputs\n\n    Code\n      preview_site(pkg, path = 1)\n    Condition\n      Error in `preview_site()`:\n      ! `path` must be a single string, not the number 1.\n    Code\n      preview_site(pkg, path = \"foo\")\n    Condition\n      Error in `preview_site()`:\n      ! Can't find file 'foo'.\n    Code\n      preview_site(pkg, preview = 1)\n    Condition\n      Error in `preview_site()`:\n      ! `preview` must be `TRUE`, `FALSE`, or `NA`, not the number 1.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/rcmdcheck/build-article.md",
    "content": "# build_article yields useful error if R fails\n\n    Code\n      build_article(\"test\", pkg)\n    Message\n      Reading vignettes/test.Rmd\n    Condition\n      Error in `build_article()`:\n      ! Failed to render 'vignettes/test.Rmd'.\n      x Quitting from test.Rmd:4-10 [unnamed-chunk-1]\n      x ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      x <error/rlang_error>\n      x Error in `h()`:\n      x ! Error!\n      x ---\n      x Backtrace:\n      x  ▆\n      x  1. └─global f()\n      x  2.  └─global g()\n      x  3.  └─global h()\n      x ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      Caused by error:\n      ! Error!\n\n---\n\n    Code\n      summary(expect_error(build_article(\"test\", pkg)))\n    Message\n      Reading vignettes/test.Rmd\n    Output\n      <error/rlang_error>\n      Error in `build_article()`:\n      ! Failed to render 'vignettes/test.Rmd'.\n      x Quitting from test.Rmd:4-10 [unnamed-chunk-1]\n      x ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      x <error/rlang_error>\n      x Error in `h()`:\n      x ! Error!\n      x ---\n      x Backtrace:\n      x  ▆\n      x  1. └─global f()\n      x  2.  └─global g()\n      x  3.  └─global h()\n      x ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      Caused by error:\n      ! Error!\n      ---\n      Backtrace:\n          x\n       1. \\-global f()\n       2.   \\-global g()\n       3.     \\-global h()\n\n"
  },
  {
    "path": "tests/testthat/_snaps/rd-example.md",
    "content": "# @examplesIf\n\n    Code\n      expect_equal(strtrim(rd2ex(rd3), 40), strtrim(exp3, 40))\n    Condition\n      Warning:\n      @examplesIf condition \"TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && TRUE && FALSE\" is \"FALSE\"\n\n"
  },
  {
    "path": "tests/testthat/_snaps/rd-html.md",
    "content": "# converts Rd unicode shortcuts\n\n    Code\n      rd2html(\"``a -- b --- c''\")\n    Output\n      [1] \"“a – b — c”\"\n\n# subsection generates h3\n\n    Code\n      cli::cat_line(rd2html(\"\\\\subsection{A}{B}\"))\n    Output\n      <div class='section' id='a'>\n      <h3>A</h3>\n      <p>B</p>\n      </div>\n\n---\n\n    Code\n      cli::cat_line(rd2html(\"\\\\subsection{A}{\\n    p1\\n\\n    p2\\n  }\"))\n    Output\n      <div class='section' id='a'>\n      <h3>A</h3>\n      <p>p1</p>\n      <p>p2</p>\n      </div>\n\n# nested subsection generates h4\n\n    Code\n      cli::cat_line(rd2html(\"\\\\subsection{H3}{\\\\subsection{H4}{}}\"))\n    Output\n      <div class='section' id='h-'>\n      <h3>H3</h3>\n      <div class='section' id='h-'>\n      <h4>H4</h4>\n      \n      </div>\n      </div>\n\n# Sexprs in file share environment\n\n    Code\n      rd2html(\"\\\\Sexpr{x}\")\n    Condition\n      Error:\n      ! object 'x' not found\n\n# bad specs throw errors\n\n    Code\n      rd2html(\"\\\\url{}\")\n    Condition\n      Error:\n      ! Failed to parse tag \"\\\\url{}\".\n      i Check for empty \\url{} tags.\n    Code\n      rd2html(\"\\\\url{a\\nb}\")\n    Condition\n      Error:\n      ! Failed to parse tag \"\\\\url{}\".\n      i This may be caused by a \\url tag that spans a line break.\n    Code\n      rd2html(\"\\\\email{}\")\n    Condition\n      Error:\n      ! Failed to parse tag \"\\\\email{}\".\n      i empty\n    Code\n      rd2html(\"\\\\linkS4class{}\")\n    Condition\n      Error:\n      ! Failed to parse tag \"\\\\linkS4class{}\".\n\n# \\describe items can contain multiple paragraphs\n\n    <dl>\n    <dt>Label 1</dt>\n    <dd><p>Contents 1</p></dd>\n    \n    <dt>Label 2</dt>\n    <dd><p>Contents 2</p></dd>\n    \n    \n    </dl>\n\n---\n\n    <dl>\n    <dt>Label</dt>\n    <dd><p>Paragraph 1</p>\n    <p>Paragraph 2</p></dd>\n    \n    \n    </dl>\n\n# can add ids to descriptions\n\n    <dl>\n    <dt id='fooabc'>abc<a class='anchor' aria-label='anchor' href='#fooabc'></a></dt>\n    <dd><p>Contents 1</p></dd>\n    \n    <dt id='fooxyz'>xyz<a class='anchor' aria-label='anchor' href='#fooxyz'></a></dt>\n    <dd><p>Contents 2</p></dd>\n    \n    \n    </dl>\n\n# nested item with whitespace parsed correctly\n\n    <dl>\n    <dt>Label</dt>\n    <dd>\n    \n    <p>This text is indented in a way pkgdown doesn't like.</p></dd>\n    \n    </dl>\n\n"
  },
  {
    "path": "tests/testthat/_snaps/render.md",
    "content": "# capture data_template()\n\n    package:\n      name: testpackage\n      version: 1.0.0\n    site:\n      root: ''\n      title: testpackage\n    year: <year>\n    lang: en\n    translate:\n      skip: Skip to contents\n      toggle_nav: Toggle navigation\n      on_this_page: On this page\n      source: Source\n      abstract: Abstract\n      authors: Authors\n      version: Version\n      examples: Examples\n      citation: Citation\n      author_details: Additional details\n      toc: Table of contents\n      site_nav: Site navigation\n    has_favicons: no\n    opengraph: []\n    extra:\n      css: ~\n      js: ~\n    yaml:\n      .present: yes\n    headdeps: ''\n    development:\n      destination: dev\n      mode: default\n      version_label: muted\n      in_dev: no\n      prefix: ''\n      version_tooltip: ''\n    navbar:\n      bg: light\n      type: light\n      left: <li class=\"nav-item\"><a class=\"nav-link\" href=\"reference/index.html\">Reference</a></li>\n      right: \"<li class=\\\"nav-item\\\"><form class=\\\"form-inline\\\" role=\\\"search\\\">\\n <input\n        class=\\\"form-control\\\" type=\\\"search\\\" name=\\\"search-input\\\" id=\\\"search-input\\\"\n        autocomplete=\\\"off\\\" aria-label=\\\"Search site\\\" placeholder=\\\"Search for\\\" data-search-index=\\\"search.json\\\">\n        \\n</form></li>\"\n    footer:\n      left: <p>Developed by Jo Doe.</p>\n      right: <p>Site built with <a href=\"https://pkgdown.r-lib.org/\">pkgdown</a> {version}.</p>\n    lightswitch: no\n    uses_katex: no\n    uses_mathjax: no\n    \n\n# check_opengraph validates inputs\n\n    Code\n      data_open_graph_(list(foo = list()))\n    Condition\n      Warning in `data_open_graph_()`:\n      In _pkgdown.yml, template.opengraph contains unsupported fields \"foo\".\n    Code\n      data_open_graph_(list(foo = list(), bar = list()))\n    Condition\n      Warning in `data_open_graph_()`:\n      In _pkgdown.yml, template.opengraph contains unsupported fields \"foo\" and \"bar\".\n    Code\n      data_open_graph_(list(twitter = 1))\n    Condition\n      Error in `data_open_graph_()`:\n      ! In _pkgdown.yml, template.opengraph.twitter must be a list, not the number 1.\n    Code\n      data_open_graph_(list(twitter = list()))\n    Condition\n      Error in `data_open_graph_()`:\n      ! In _pkgdown.yml, opengraph.twitter must include either creator or site.\n    Code\n      data_open_graph_(list(image = 1))\n    Condition\n      Error in `data_open_graph_()`:\n      ! In _pkgdown.yml, template.opengraph.image must be a list, not the number 1.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/repo.md",
    "content": "# repo_source() truncates automatically\n\n    Code\n      cat(repo_source(pkg, character()))\n      cat(repo_source(pkg, \"a\"))\n    Output\n      Source: <a href='https://github.com/r-lib/pkgdown/blob/HEAD/a'><code>a</code></a>\n    Code\n      cat(repo_source(pkg, letters[1:10]))\n    Output\n      Source: <a href='https://github.com/r-lib/pkgdown/blob/HEAD/a'><code>a</code></a>, <a href='https://github.com/r-lib/pkgdown/blob/HEAD/b'><code>b</code></a>, <a href='https://github.com/r-lib/pkgdown/blob/HEAD/c'><code>c</code></a>, and 7 more\n\n"
  },
  {
    "path": "tests/testthat/_snaps/templates.md",
    "content": "# Invalid bootstrap version spec in template package\n\n    Code\n      local_pkgdown_site(meta = list(template = list(package = \"templatepackage\")))\n    Condition\n      Error in `as_pkgdown()`:\n      ! In _pkgdown.yml, must set only one of template.bootstrap and template.bslib.version.\n      i Specified locally and in template package templatepackage.\n\n# Invalid bootstrap version spec in _pkgdown.yml\n\n    Code\n      local_pkgdown_site(meta = list(template = list(bootstrap = 4, bslib = list(\n        version = 5))))\n    Condition\n      Error in `as_pkgdown()`:\n      ! In _pkgdown.yml, must set only one of template.bootstrap and template.bslib.version.\n\n# Warns when Bootstrap theme is specified in multiple locations\n\n    Code\n      get_bslib_theme(pkg)\n    Condition\n      Warning:\n      Multiple Bootstrap preset themes were set. Using \"flatly\" from template.bslib.preset.\n      x Found template.bslib.preset, template.bslib.bootswatch, template.bootswatch, and template.params.bootswatch.\n      i Remove extraneous theme declarations to avoid this warning.\n    Output\n      [1] \"flatly\"\n\n"
  },
  {
    "path": "tests/testthat/_snaps/theme.md",
    "content": "# check_bslib_theme() works\n\n    Code\n      check_bslib_theme(\"paper\", pkg, bs_version = 4)\n    Condition\n      Error:\n      x In _pkgdown.yml, template.bootswatch contains unknown Bootswatch/bslib theme \"paper\".\n      i Using Bootstrap version 4 (template.bootstrap).\n\n# validations yaml specification\n\n    Code\n      build_bslib_(theme = 1)\n    Condition\n      Error in `bs_theme_rules()`:\n      ! In _pkgdown.yml, template.theme must be a string, not the number 1.\n    Code\n      build_bslib_(theme = \"fruit\")\n    Condition\n      Error in `build_bslib_()`:\n      ! In _pkgdown.yml, template.theme uses theme \"fruit\"\n    Code\n      build_bslib_(`theme-dark` = \"fruit\")\n    Condition\n      Error in `build_bslib_()`:\n      ! In _pkgdown.yml, template.theme-dark uses theme \"fruit\"\n\n"
  },
  {
    "path": "tests/testthat/_snaps/topics-external.md",
    "content": "# can get info about external function\n\n    Code\n      str(ext_topics(\"base::mean\"))\n    Output\n      tibble [1 x 12] (S3: tbl_df/tbl/data.frame)\n       $ name     : chr \"base::mean\"\n       $ file_in  : chr NA\n       $ file_out : chr \"https://rdrr.io/r/base/mean.html\"\n       $ alias    :List of 1\n        ..$ : chr(0) \n       $ funs     :List of 1\n        ..$ : chr \"mean()\"\n       $ title    : chr \"Arithmetic Mean (from base)\"\n       $ rd       :List of 1\n        ..$ : chr(0) \n       $ source   : chr NA\n       $ keywords :List of 1\n        ..$ : chr(0) \n       $ concepts :List of 1\n        ..$ : chr(0) \n       $ internal : logi FALSE\n       $ lifecycle:List of 1\n        ..$ : NULL\n\n# fails if documentation not available\n\n    Code\n      ext_topics(\"base::doesntexist\")\n    Condition\n      Error in `build_reference_index()`:\n      ! Could not find documentation for `base::doesntexist()`.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/topics.md",
    "content": "# bad inputs give informative warnings\n\n    Code\n      select_topics_(\"x + \", topics)\n    Condition\n      Error in `select_topics_()`:\n      ! In _pkgdown.yml, reference[1].contents[1] (x + ) must be valid R code.\n    Code\n      select_topics_(\"y\", topics)\n    Condition\n      Error in `select_topics_()`:\n      ! In _pkgdown.yml, reference[1].contents[1] (y) must be a known topic name or alias.\n    Code\n      select_topics_(\"paste(1)\", topics)\n    Condition\n      Error in `select_topics_()`:\n      ! In _pkgdown.yml, reference[1].contents[1] (paste(1)) failed to evaluate.\n      Caused by error in `paste()`:\n      ! could not find function \"paste\"\n    Code\n      select_topics_(\"starts_with\", topics)\n    Condition\n      Error in `select_topics_()`:\n      ! In _pkgdown.yml, reference[1].contents[1] (starts_with) must be a known topic name or alias.\n    Code\n      select_topics_(\"1\", topics)\n    Condition\n      Error in `select_topics_()`:\n      ! In _pkgdown.yml, reference[1].contents[1] (1) must be a string or function call.\n    Code\n      select_topics_(\"starts_with('y')\", topics)\n    Condition\n      Error in `select_topics_()`:\n      ! In _pkgdown.yml, reference[1].contents failed to match any topics.\n\n# selector functions validate their inputs\n\n    Code\n      select_topics_(\"starts_with('x', 'y')\", topics)\n    Condition\n      Error in `select_topics_()`:\n      ! In _pkgdown.yml, reference[1].contents[1] (starts_with('x', 'y')) failed to evaluate.\n      Caused by error in `starts_with()`:\n      ! `internal` must be `TRUE` or `FALSE`, not the string \"y\".\n    Code\n      select_topics_(\"starts_with(c('x', 'y'))\", topics)\n    Condition\n      Error in `select_topics_()`:\n      ! In _pkgdown.yml, reference[1].contents[1] (starts_with(c('x', 'y'))) failed to evaluate.\n      Caused by error in `starts_with()`:\n      ! `x` must be a single string, not a character vector.\n\n# can select by name or alias\n\n    Code\n      select_topics_(\"a4\", topics)\n    Condition\n      Error in `select_topics_()`:\n      ! In _pkgdown.yml, reference[1].contents[1] (a4) must be a known topic name or alias.\n    Code\n      select_topics_(\"c::a\", topics)\n    Condition\n      Error in `select_topics_()`:\n      ! In _pkgdown.yml, reference[1].contents[1] (c::a) must be a known topic name or alias.\n\n# can combine positive and negative selections\n\n    Code\n      select_topics_(\"c(a, -x)\", topics)\n    Condition\n      Error in `select_topics_()`:\n      ! In _pkgdown.yml, reference[1].contents[1] (c(a, -x)) must be all negative or all positive.\n\n# an unmatched selection generates a warning\n\n    Code\n      select_topics_(c(\"a\", \"starts_with('unmatched')\"), topics)\n    Condition\n      Error in `select_topics_()`:\n      ! In _pkgdown.yml, reference[1].contents (starts_with('unmatched')) must match a function or concept.\n\n"
  },
  {
    "path": "tests/testthat/_snaps/tweak-homepage.md",
    "content": "# can remove logo\n\n    Code\n      xpath_xml(html, \".//div\")\n    Output\n      <div class=\"page-header\">\n      <img src=\"mylogo.png\" class=\"logo\" alt=\"\"><h1>First </h1>\n      </div>\n\n---\n\n    Code\n      xpath_xml(html, \".//div\")\n    Output\n      <div class=\"page-header\">\n      <img src=\"mylogo.png\" class=\"logo\" alt=\"\"><h1>First </h1>\n      </div>\n\n# can move badges to sidebar\n\n    Code\n      xpath_xml(html, \".//div\")\n    Output\n      <div class=\"dev-status\">\n      <h2 data-toc-skip>Dev status</h2>\n      <ul class=\"list-unstyled\">\n      <li><a href=\"x\"><img src=\"y\"></a></li>\n      </ul>\n      </div>\n\n# remove badges even if no dev-status div\n\n    Code\n      html\n    Output\n      {html_document}\n      <html>\n      [1] <body>\\n<h1>Title</h1>\\n    </body>\n\n"
  },
  {
    "path": "tests/testthat/_snaps/tweak-tabset.md",
    "content": "# sections with class .tabset are converted to tabsets\n\n    <div class=\"section level1 tabset tabset-pills\">\n    <h1 id=\"tabset\">Tabset<a class=\"anchor\" aria-label=\"anchor\" href=\"#tabset\"></a>\n    </h1>\n    \n    \n    <ul class=\"nav nav-pills\" id=\"tabset\" role=\"tablist\">\n    <li role=\"presentation\" class=\"nav-item\"><button data-bs-toggle=\"tab\" data-bs-target=\"#tab-1\" id=\"tab-1-tab\" type=\"button\" role=\"tab\" aria-controls=\"tab-1\" aria-selected=\"true\" class=\"active nav-link\">Tab 1</button></li>\n    <li role=\"presentation\" class=\"nav-item\"><button data-bs-toggle=\"tab\" data-bs-target=\"#tab-2\" id=\"tab-2-tab\" type=\"button\" role=\"tab\" aria-controls=\"tab-2\" aria-selected=\"false\" class=\"nav-link\">Tab 2</button></li>\n    </ul>\n    <div class=\"tab-content\">\n    <div class=\"active  tab-pane\" id=\"tab-1\" role=\"tabpanel\" aria-labelledby=\"tab-1-tab\">\n    \n    <p>Contents 1</p>\n    </div>\n    <div class=\"tab-pane\" id=\"tab-2\" role=\"tabpanel\" aria-labelledby=\"tab-2-tab\">\n    \n    <p>Contents 2</p>\n    </div>\n    </div>\n    </div>\n\n"
  },
  {
    "path": "tests/testthat/_snaps/tweak-tags.md",
    "content": "# anchor html added to headings\n\n    <h1 id=\"x\">abc<a class=\"anchor\" aria-label=\"anchor\" href=\"#x\"/></h1>\n\n# can process footnote with code\n\n    Code\n      xpath_attr(html, \".//a\", \"data-bs-content\")\n    Output\n      [1] \"<p>Including code:</p>\\n<pre><code>1 +\\n2 +</code></pre>\\n<p>And more text</p>\"\n\n"
  },
  {
    "path": "tests/testthat/_snaps/usage.md",
    "content": "# usage generates user facing code for S3/S4 infix/replacement methods\n\n    Code\n      cat(usage2text(\"\\\\S3method{$}{indexed_frame}(x, name)\"))\n    Output\n      # S3 method for class 'indexed_frame'\n      x$name\n    Code\n      cat(usage2text(\"\\\\method{[[}{indexed_frame}(x, i) <- value\"))\n    Output\n      # S3 method for class 'indexed_frame'\n      x[[i]] &lt;- value\n    Code\n      cat(usage2text(\"\\\\S4method{>=}{MyType,numeric}(e1, e2)\"))\n    Output\n      # S4 method for class 'MyType,numeric'\n      e1 &gt;= e2\n\n"
  },
  {
    "path": "tests/testthat/_snaps/utils-fs.md",
    "content": "# missing template package yields custom error\n\n    Code\n      path_package_pkgdown(\"x\", \"missing\", 3)\n    Condition\n      Error:\n      ! Template package \"missing\" is not installed.\n      i Please install before continuing.\n\n# out_of_date works as expected\n\n    Code\n      out_of_date(\"doesntexist\", temp1)\n    Condition\n      Error:\n      ! 'doesntexist' does not exist\n\n"
  },
  {
    "path": "tests/testthat/assets/-find-assets.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta charset=\"utf-8\">\n<meta name=\"generator\" content=\"pandoc\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EDGE\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"author\" content=\"Hadley Wickham\">\n<title>R Markdown Vignette with an Image</title>\n<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to\n// be compatible with the behavior of Pandoc < 2.8).\ndocument.addEventListener('DOMContentLoaded', function(e) {\n  var hs = document.querySelectorAll(\"div.section[class*='level'] > :first-child\");\n  var i, h, a;\n  for (i = 0; i < hs.length; i++) {\n    h = hs[i];\n    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6\n    a = h.attributes;\n    while (a.length > 0) h.removeAttribute(a[0].name);\n  }\n});\n</script><style type=\"text/css\">\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\nspan.underline{text-decoration: underline;}\ndiv.column{display: inline-block; vertical-align: top; width: 50%;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\n</style>\n<style type=\"text/css\">body {\nbackground-color: #fff;\nmargin: 1em auto;\nmax-width: 700px;\noverflow: visible;\npadding-left: 2em;\npadding-right: 2em;\nfont-family: \"Open Sans\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\nfont-size: 14px;\nline-height: 1.35;\n}\n#TOC {\nclear: both;\nmargin: 0 0 10px 10px;\npadding: 4px;\nwidth: 400px;\nborder: 1px solid #CCCCCC;\nborder-radius: 5px;\nbackground-color: #f6f6f6;\nfont-size: 13px;\nline-height: 1.3;\n}\n#TOC .toctitle {\nfont-weight: bold;\nfont-size: 15px;\nmargin-left: 5px;\n}\n#TOC ul {\npadding-left: 40px;\nmargin-left: -1.5em;\nmargin-top: 5px;\nmargin-bottom: 5px;\n}\n#TOC ul ul {\nmargin-left: -2em;\n}\n#TOC li {\nline-height: 16px;\n}\ntable {\nmargin: 1em auto;\nborder-width: 1px;\nborder-color: #DDDDDD;\nborder-style: outset;\nborder-collapse: collapse;\n}\ntable th {\nborder-width: 2px;\npadding: 5px;\nborder-style: inset;\n}\ntable td {\nborder-width: 1px;\nborder-style: inset;\nline-height: 18px;\npadding: 5px 5px;\n}\ntable, table th, table td {\nborder-left-style: none;\nborder-right-style: none;\n}\ntable thead, table tr.even {\nbackground-color: #f7f7f7;\n}\np {\nmargin: 0.5em 0;\n}\nblockquote {\nbackground-color: #f6f6f6;\npadding: 0.25em 0.75em;\n}\nhr {\nborder-style: solid;\nborder: none;\nborder-top: 1px solid #777;\nmargin: 28px 0;\n}\ndl {\nmargin-left: 0;\n}\ndl dd {\nmargin-bottom: 13px;\nmargin-left: 13px;\n}\ndl dt {\nfont-weight: bold;\n}\nul {\nmargin-top: 0;\n}\nul li {\nlist-style: circle outside;\n}\nul ul {\nmargin-bottom: 0;\n}\npre, code {\nbackground-color: #f7f7f7;\nborder-radius: 3px;\ncolor: #333;\nwhite-space: pre-wrap; \n}\npre {\nborder-radius: 3px;\nmargin: 5px 0px 10px 0px;\npadding: 10px;\n}\npre:not([class]) {\nbackground-color: #f7f7f7;\n}\ncode {\nfont-family: Consolas, Monaco, 'Courier New', monospace;\nfont-size: 85%;\n}\np > code, li > code {\npadding: 2px 0px;\n}\ndiv.figure {\ntext-align: center;\n}\nimg {\nbackground-color: #FFFFFF;\npadding: 2px;\nborder: 1px solid #DDDDDD;\nborder-radius: 3px;\nborder: 1px solid #CCCCCC;\nmargin: 0 5px;\n}\nh1 {\nmargin-top: 0;\nfont-size: 35px;\nline-height: 40px;\n}\nh2 {\nborder-bottom: 4px solid #f7f7f7;\npadding-top: 10px;\npadding-bottom: 2px;\nfont-size: 145%;\n}\nh3 {\nborder-bottom: 2px solid #f7f7f7;\npadding-top: 10px;\nfont-size: 120%;\n}\nh4 {\nborder-bottom: 1px solid #f7f7f7;\nmargin-left: 8px;\nfont-size: 105%;\n}\nh5, h6 {\nborder-bottom: 1px solid #ccc;\nfont-size: 105%;\n}\na {\ncolor: #0033dd;\ntext-decoration: none;\n}\na:hover {\ncolor: #6666ff; }\na:visited {\ncolor: #800080; }\na:visited:hover {\ncolor: #BB00BB; }\na[href^=\"http:\"] {\ntext-decoration: underline; }\na[href^=\"https:\"] {\ntext-decoration: underline; }\n\ncode > span.kw { color: #555; font-weight: bold; } \ncode > span.dt { color: #902000; } \ncode > span.dv { color: #40a070; } \ncode > span.bn { color: #d14; } \ncode > span.fl { color: #d14; } \ncode > span.ch { color: #d14; } \ncode > span.st { color: #d14; } \ncode > span.co { color: #888888; font-style: italic; } \ncode > span.ot { color: #007020; } \ncode > span.al { color: #ff0000; font-weight: bold; } \ncode > span.fu { color: #900; font-weight: bold; } \ncode > span.er { color: #a61717; background-color: #e3d2d2; } \n</style>\n</head>\n<body>\n\n\n\n\n<h1 class=\"title toc-ignore\">R Markdown Vignette with an Image</h1>\n<h4 class=\"author\">Hadley Wickham</h4>\n\n\n\n<p>Some words, and then an image like this:</p>\n<p><img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAAEWCAYAAABYPxq5AAAAAXNSR0IArs4c6QAAAAlwSFlzAAAhOAAAITgBRZYxYAAAAVlpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KTMInWQAAQABJREFUeAHsvQmAXkd153u/r/dWa7cty7a877tlAcZmsQmBACEkASt52WYy703IvBd4YTEhMywiEMiAgXmQ5cEkj7xJZpLIBAZCHLZggwHbIMl43/dFliVrb/XePf/f/1Tde79eJLXc3rBu93dv1alTp06dqnOr6tRyi+Lg9VMlgfuv+kJ3ztCNaz9x3I/X/udTsp+wiaJoZP/B5/NfAgcL8/lfhs7BxFVr2tfftbyx6q1vHQGwfu2nfq/ZmHifFLZ7Ynzi492N3ZefsXrN8Nq1a9uO37atmfF+SrL/gs3GQQV+nhf9xMREY/3nP9+eFXLDFZ9+XdEY/0hfT/fKkdGxQuFFV2dHsat/4I6JxvgHz3/LZWvJ8rrPfa7jaxs3jq1Zs2b8eS6CFzT7BxX4eVr8UrzmB08/vdFYvXqMLNzwxY+fVBRtH+/s6PjFtrZmsWdgCMV0mJ7Nnq7ONvAGhke+LbV+z4ve8q4b8E+oRS5uu22icVCREcfz7jqowM+zIpuQ4q5fvrwtt7g3fuMT88Z2NN7XaDTeM39eT3Nn/wCj3NHGRNFU97mZsqd2uBhXYTf7ersbA0PDxejY2J/3tnV/4LRf/r0nwblKXfCLLxZO42CL/HyqEgcV+HlUWld+5jNdr3vb24cbjUL6SKv7qX8zMT7+0SWL5h+xfWd/MT4xMSrlbVPotOUqJZciT6gBLtqXLOwrtu7Yvb3ZaLz/nPGj/iK35FdeqTRerzTUOD+PRPOCZXXagn7BSuM5mnHGqz2LFzfOWL16GBbX/cMnL2k0iz9aNL/3ZYNDI8XQ8MiQwJ36zaY8hzo62rvm93YXT+7YTXf6A+df+q6v6VncunZN5616rpbRC//B67krgdkU+HM3Fz+9nDU09dN13CW/PUgWGedOjDffL8X7zZ7urmLn7n4pmNrVRqMDY9VsLrXiMnAVo4ozpm51l7rUxdDQyJcn2ooPrfzld90ILaadjr343w7Rcs+G9kHcZ04CBxX4mZP1rFKi1T1fVmKMS+v+6XO9xZ5df9hsNt6+aMG8BTt27SnGx8cHpVjdFOAcaBcviK5F8+c1duzuHyomGn/e1tP94bN//v/cBtPr1n2uY9WqmJ7Cf/B67kjgoAI/d8rCnGCkuvqVRfOSS9bQOhYbrvjkb+mxZsG8nuMGh0eK4ZGRYTW6TRVc+ywbXdOf7pZaYyzWox3tbV3Ruu/ZqA75h1e+5V1/QRxbqy+VtfqgkWs6ET5rsIMK/KyJvjXhtWsv1TTPpRp3xrTQdX//yQvam8XlGqNeNDY2Xkh5UTCmhjoi5hy0u60sZN+oKDe6OzvapMyaPx7coGQvO3/1Zd8BYTKfOdLB57MjgYMK/OzIvUx18sqodf/46eWN8fGPdHW0/7uO9o6if8/guFpC7MpMCc19ebW8B/A4CRx6WUwUvd2dbbT0e4aG1nY02/7w7De/4z6YZ+VXsfn0iWy9BnbweuYlMPcV4pnPw/MyRelE454rP9N50uvfjgW5uFvTN7v6R39PuvrBxQv75m/d0Y/S0uq21zPYeBp0GPpobL7XnUw7keaiBb1tmqoakeXrY8PDuz95wW+s2QkefJ/4urdpauugoctye4ZvBxX4GRY4ya3VNM0ZerI2Gf9Prvj0L49NjH1o6aL5Z2rJY6ElkDIqNbqzrs6otHNVeqG9sNJySXnD78fEUFuz2SUjWvHk9l33K2DNykvf9d9AYBHIYZtPb+Zproh08P5MSGCuqsAzwevzPg3WLV/91x/quuS313haaMMXP7VK7daa7q6ON7D8cfeewUHpSrsWV7Qn1ZEO14qo5mwVRmtAq6/CzDQrCK7poXUwigwfWiiiRSDjI/N6urtlERe/Q1erk/Ch8y697GooXfWFNd0XP1gMH1yWiTSemWumsn5mUn8BpcK0UF7+uGHtRw+daHSuUSv71kV9vW07du9Bi+hKaytgFAmW4exOIAC6Unh44h7Idcjs3Nbhsr1NcWuKLWf4smMCXttlGW/btWdQYeN/I7bev/LN736QyAennZIIn4FH1IZnIKEXaBINWW2bl156Rjn9sm7t5f+3Wtj3LejrPUQbDrQmeZTFGG3SQRuLrKAqlbLlLUsoQaZTVuOUiLMUdVbKSdFkuQqlBR449guOTU1urZsuRjSj1dXXy6KSgd1C/Pg9Eys+iiWd3sYVV1zRlBvLeUUKcgevOZPAgZb6nDHw00roqjXaHEAlT7t81n/x8tc2JhqfUKt1FvO5QxroSgHQhBYjleZ4LZLybkfy1ZW37q7HqOG3yjbpkB5TtWkSpD7BbHzC7TDDLOGqXWNodEdbW7sWdEmR99wn5f2Dlavf/UVw2DX1Ss1rX3zJGhnDpkm6Ruigc/YSiJox+3gHY8wgAQw682sb69d98fJT2yYaH+3t6foljSGLgcHhUVXjZqFmWIowjfwFin+lkB2BJktvlWpyu102OIXVcCpsubKnVMhEqq6Mcodq1hSUcMMdUU7CauFwySaJCBjX/HG7/tl//K1ms/nec978Ds0jp91O4KYFKsAOXk9dArlYnzqlFzgF1d8WA9UP135qSbcWQKh2v0eW2+a2nf3Tt7jTya1UTgKz8kVRTafEQUKqbJRakSZ/CTFC6aulnJQzK2aptKAobHxcd/1Zd+kR5ysrcgtNLzjREKGjf2DQ2xYbnV1/vPJNb3uMWAcNXVl2c/NskfzckHzhUWH3zhOHFuN5+eP6L37y32sZxPsPWTx/Bdv8xrRuWVIpz6rap4SmtKKpmMrSKh2pZS1HzIm0wmsoeErlNhz8jJOfimp91I0WN/1kdY5WN/uNBE6VVLhaEgSEoatLU2NMO21Rh+Ojd43v/DN2OLFc9J4XL+nIc+AR/+D9QCQwReoHQuSFGofx3a/XKuINay//WaxV2t1zoZSWUzEGtWq5Xcqidcu5xu9LWjWFEmpVQJWrAtZgiWypqDmZlpdBpp3iKSwUOcHNYlJe8W8tTQqsc7XCj+ZOzovTaOWFnoLyTGs8rGmynq6OjkKbMG6UCexD569+55dhLxaBbJUh7OAhAsjjQK5WqR8IhRdonPq00E3/+OnjRyfGP6qFDr/S29VV7NozQMVlM0LX7MWTlEkRq8KpXDVgC4bTcdQaLsil16qa/AloBYYMqzS5asrrFldKXG95cVuBhVrSxZnTqQFNL98msLQ35/V2t4+MjMqAN/LPRWPiP+p8rpvAODjtlOU0++dMEp89pRdADMa5aWoEBfXG96FG3/tVOd8t63K3FmKw2IHVVWp1C460meWVFSGiVYVTuSrFqcFAd9Q6zICUfsDdUBoSYVXrK78bVnWXaXnd6lZd5xQ4peGtkcoMxNMBU26IgxMzO9VDYdEKTfyfjk+MfGDV6vfuAJt14Zdeeqmmpw4uy0Qe+3NFye4P5gsYRw2PTn78XPv5v/M7o7lybfji5f9bMdH8E52KcbRaXBlrxsdU7dCJ3JzNUmKhVDlSa8EkXwksHUZvMWwFxAodtAK3RXkJEDgUuIkVme6u9JaFVvxQ3tyFphHOr6L8DMplIiWtRDgHT/9kc8Y4q810hhfd6i2i+j6dBvK5jO6NEhd/UEa/g4qcZTLTs7UmzIT1AobTVV6/fn3x1s9/Ps5b1jY/Lbv42MK+nos9n6sNuhJimyrhASpuFq61IHvQL1214imdpSMwKs20PwErd6hpIlWLq3j2NVHgZiitlHd8TLNcKDEKbH2tlNbd50Q5xZZPVOK/dLfwXeNkkhPCozpdpKOvp6vYunP3etH8A62v/lfwPB03X+dcHzxIYJLYWr21Em0NeKH7vADhmKKzXLf8j396zMTowH/q7Oz492nD+7BqoFYwW3nnQFylFoRimWIqnpZSqjyhu5U/orT6o5XN7OUwPeNfI9M2/UKBUd5QYJRYrXAe7+boPBOJOVDgoKp1mBoPj/b19nSy73lgePjvJkabHz7/V99xOwj3a331j+fdOrJ69RUetkSkg/csgVyi2X/wKQlc+Zm3db3+7Z+lxR2fuP+q7muv+cHvd3V1veewQxYv3rx1B11KH2czt8IqNcNkw9cKK7UHDAVVSpQ5MTB7qvBEpoyfWm3iN9qkwLTAjHt1Ltb42EitFa5aXxOt0SmdMMKlR7iyI8EjdK93MJWSjvIpOrSVUnPmuwf08vh0c3fbJ8777XdsJzIW64PTTlPFuP9Snhr3pw4yMbGmedsVRXve5nft3/zx6oE9uz/Q1SzO4JiK9q6ewZ7ePq0abLaNqbIzNpw6/nwqYsmVv6YMkCtLqXRMk24VNzhI6l1GSQ4/wg3v0QLrMBDGwFJit8BlSxx5LHNUkkiOeoBAiWpyTMYpkad18E4RCwy8h3QSSI9sghof998vu+Efr1z9zr8iEtbq++5bPJ5PLZmW0AsMODsp/5QKBz38/Od/p/2tb41x7rq///jKXTu3/0kxNvqzjAf3DAyPSlnHNafb2dnVXfQtWFB09/ZWY8c5U2QVR/wnSafiKUupdExV4NSqVkUk5azQBa55UFwQeboL7Y82lErc2hJng1ZFIsWGQrpELf5b/C1pZtR9POFL70rbG7S2ugO6mk//ofoJ7z3n0ndeQ3Qf+FczKO6D5E91MPJ6wV6Mc08//VadChPjq1u//pdLNj/8wEeGBwf/Q4fqdL92C6mVGlElYjEGC345DdKVv7O7p5i/cGHR1SNFlgQJc9Wz76mIVNTiPxFJReRHcitkSsvfoq1ZQTMfVTxDEm7VAtfsb8oHeeHFNT6axsRsA075m6q8UBT9lEQ8sj8BMxuzeyJQ5tLb5/V0NbT5QwcdjP739man1le//RFIHfwsTCl2xPHCuVQZNS30Vn0QLFpccv69v3z/7w0NDny4u6Nt0c7+PYBkNHFNr9VuwHGhyFzdUuC+BSgyB2ik6RhV9ikKFtH28x4KUFX/qQrRSj+HZ/J7UWATzeGyQGOF1s8XKsNlJVbLqzyOj2fDlsRhJQ6U6l5xWelxnZ9aeBVpNi5S5bMwbQv7egvtnR4U9x/unNjpry1CiBb5hfqhtqcs3dmUxHMBd+2aNZ2HFlePX7Lmah/bes0X1vzc4J49H5vX1XautsJp3fKElvb5yNb9kk1W5J7eecU8da271MXOVl1arVZFm40ElHziIB7ZXwGTGgbR/W2BHX0aBc7Kqw5s6KkAcowzpcSPMT9PB4Kc+KhnKbOYw1JadZSn6B6R/aFjYd88fRZm1z1Fs/mHK9/8Dm9b5LTMMwr90tcrnmI6z5vo05TC84b3WTGKgerqv66mhb73X9ecPTTU/4GOtsabqZj9g8NDrFtW/U0Dwv0kj+JQ0VXBUdbueX1F3/z5BV1s/LEo4kAVOTSiKqTwZ+VpfTnkMPjOCprzUFEI3crhejIGtvJnnOhCO6byhcLaQs20Ulbmco7YSeVE/AwqiZYfmW4L2gF5oERrrMeIxsddHEMkg/U32pttHzznLb9/PUS922ne6SMvlNMy5066SO85eqVpIXbHaPnjp5Y8tnnjH46Ojr6tr7uzS10yVvywwqorWpcDywRKQHwrsrqkbpHnq0Xu5pQcLT2SgnOFsswyDcWvCkoueyolLKlZEZ1KhZ9wK5wI9x26dKHLtdCC0vBy41J+7GtRZFpiFnlg3NKLyYiTbwlaBpaOyYgH5CebSpt5+Obi+X3t23dxgmfjc22N9j/O42MUOc/hH1Aiz5NIcyvZ51im6VZt27a4ma3L3/zz9/zu2MjIf5LiHsVxNiNjPv2xUxVCE6Fifg6kUVdkbWiXtbrqWiMeG8GczmwTE378B6OZhmH21OCkVFP6jAuYKyk6vFp5UeIIQV+TAtshaGqRE5zWWJlIPQsaQwQ36QJUEiwdk5CemjeUGD2eGGpva+tmWaYUWcsyJz6x8tJ3f0KpTtjIBSvpsPynluJzM/bTI91nOa9eRaW38yVr4vMk3/iL975qfHj4T2SgehHzt7JosvyRq4O65obG3rJuJ9+BP1AOlJVWqqkWrnuejF3zF6prrRY5tWgHRB2lc0Td7Ug5yXBqdnkl3BKUcUFAeeUXb1ZkQVpVUT7+LZzkDoAx89DACl0XIKR9Qa1MOMHm/kEKSolTTia6tGcxnQZym17JGh+/66ukyLLM7363GFe94I3zU3U9/RJ+BsUVn/3gs5gxLfSNz777OI3b/kTntK6mkmrtMgXIPNC039Ct18MWPXiqeVANG1fLBQ+9jJFlte7o5GugNQWZbWUXLaunSzCK0QoJ0RrzSYVrupSKnPjgJQUmWnWFwuK3AiclRiV5+cQVLXO0yKmVRpWerYuND7H/uNnT3alDbxvMH18phi/T+Vy3wRYt8hV6/jQtBEml+WxJfW7S9Xyu5gtXr4mD0r/x3/TV+q2PvUdN4H/UiYnt2i2kmtVAeZkv2Weeo6IKcZ+Ys+c/j5F7++arRV7QosgoS6mE+0U6KyHIwWzwnBi3p1ThjBK4QvHGKeGEItcyO0lJQy+lHziycEjSXm5JgXkGQiseuM/cBYfq+hSN+X09TbZ4iqdPDY43/vjC1e/cChucoHL6pYXsHs//FrlWas+chOcyJQxUr9u6dCSf/vjNz77zN0ZHxz+yqK/7mB27B9ify6qe9EGw2aWc6/HcKjIinyjoyrdpHTKKPE+/qkWm283LYxZFgxKiwI6SFDJntaRjjBKH4Ky4LUasHE9PK2MSQr0r7RDURBiJoJy4FYNnjmMUIyZcAM/o5bJPx/o8IU4+8E+37vqvdKXlbvm0zTPK1RwmNotaMoepzgEpukNX99/WkS2N//LZd188MTr6wb6ezot1YmsxODQ8qBraqQwewMb6VgZTfXRdDTXIlbIVbzY+lIfKjiK3t7cXPfOkyPP7pMg6xEPwPL+8/4ocChyKnJU1Fa+VONyhzxW8xC8VPecCZcQdeW1RYAUkaEbWE5qCOiyeDsSZsBPBWpyn11njaKinU9aH7s5ix84910t71+hYn6+TOpskHunZOpbPM3t6OZp76qkk557w00mxvjOFca6WPq5pa2/7LU560HGmI9QhDYI6o5LNHSdRoVVVqeyuHU89BWihrPxQZFpkfp0aI6M0wPdfiZVX0QulJN9yZcXMT8MizHfg+afs4HSuyqzJkQChxIqVlRQCWSgIBJnkK8Fb4yiwxC8TyDGetqfzNFH4O1Q6OaVzYGi40DTiWrHyoTw+fr5OO9VF/rQJcK4Ix5Er8ZFpDFYnNS94r1qwy5rjIws3Pf6ECmVksNnW3qVK63XLc5VunU5Z/wS0ciDBOrCOvN9uFI3ZmZieadNnRXv7+tQia4ysw+A4Txqrb6mM+0NXBAPf6pyUlIj4lZhLnmfdH+EV+aRk1mFu2U+baqBQE8yRgl4Vn+AIr7fg08dtibUfnnq6+0Ynu3CstId0GoimnXpZBKJv2kz8afvA+B+d81uX9SuwcfWH1rTl2Yt9U332MVyMzz4be+eAVVRXXHG6pvPi49cb/uGTb9bczMcWzOs+iVMxNObVWWnDjd07d7b379rpyt7U+PLpvKiXVCEUr1SsVFkPPN2oZlR2rLv62EHRKyXuU4vcbkWWHW5W9VbKGQyapZJPYLqygpOJSqkdVN2cnlXO1d8Bzrtv8gZDxpCznp58EW4U8BMdxSlbZgg+JblF+pDZnwuOJEWOPxrv0DfMe7o6i539A4/K+/7zL73sC9Dg2Nvig+RlDcRnlwAEnsErSvIZTHA2SfnzJKdXH5He8PefPEfH2Xx8Xm/Xa0Y1dhwcGhlDusqEXqpRK4eHh4pdO3YUg/27LXkWU5QVaTaJ7ycudQ8e1GWnxFNxz02ZW5HV8rapaz1Pc8jztEQTtyu/E1Y6SRn3yi4KaryaoqZ4GQ6dqAzcW/kvfXbo5v94ZtwWhbQoRCelGbwRmZ/uVtiIn1V6VkocZEyruk0LrIKnd3l5XFdnR1tXZ7ta5MFrZZl493mXvuuHoNPjO/TQ2xrP5fFxlNn0mXvWoLGx/nRtrF/tccuNX/rEYWNjzfdp7evb/P2d/gG+s0OlbKoy1PLANEzsrBkcHCh2S5GHBvaEgnnJYBiOno6MRaVEUcxYqqsHVKmmsAdtj5HVCrMYhO41ikylB86V3l9T4lYAMYaSwqD/zWi4s6IBqqkxvsgBAXLZQ+tZhWTFi/wDTxdpOK300hA4aFV0HNfeCIkkkjthZ3LTPjNqGTgFUIbM5BCP6uwoRzJFyIbSjgFUx5z99URjYk3+2qKnnYrTx56LK7pcZDNl7tmAx2Hfb9cX34sJVtAs3NL3H1QVPqCpgEN0wj8sodSxCmIaBnNFoguNe3BPf6GudaGtgsYG7uoYtXAaCgcOqir23CsyyoCysjuoo6PLO596582TImuGTAnvtyInZYWeFSy0WZnO/pR/8KbVh9xmKtDhgZTlHrFzxKCpu8iz4kuhjka4HXpAL7kNzW5w9n5lToheXS2eCrx/rhHRalu8qK+5fcdufW1x4mPNBRP/zzmvvayf6M9FQxcifU5cKOtRA0va8rlH6//hE2/UQvsPLpo/73yshkPDIwNitkt1Qa3uvlmmQlFB6UJT6fdoj2//rh2FLNYBTwq+b0qzx4A/KhcVNxSFerofTO9HUtBDWTFqMeXUq241q7uwYLPaiy8ohGLug5joBG9UAf2sXVbj5J5UNfIJrykbldIFoJ6/1phB3+RTmnBW4ie5hL+SUenPIMhkNwTSNVWJp0HKyPt4wqPYgcAgx/qwvnrrjt136NC9P1r5lnf/HdFpjQe2LZ/I33reB8mnPbhV1k97ctMnUJ8WWrf2U2epiv6RxiW/qB+WQvbn6oslmhY6gLKhIlBRUeQxnfW0p58WeUcxorFyU1vpgJeVaXr2DhgKv0+LIis/FByruuC9Q1+DmNe3QF1rtcgyfFnBU773znwoMcpbKr3cVmM/7axIJPnXlSZXoFYZlogR10hKIwwFZVrGQkhJM4NGFTe5rFUZxwTLgJBvyWAJLx1l0GwcyEK8UO/GdTZXF5/JGRwc/pbagQ+c/6vvug5a7im+Xj3FFsZmk8rc4Gb5zw21WVJhMUYeV1z3t2sWdHX1rZHo/y+Z+Dt39w9QrGwBZDFGfv/PMoWMrionYjZoqVTGdFTMnt27rMi4nxmLdWqRvUqXOvnUKhk5SxXNrTHUWM3F1BMtMqu89luRJZNQ4NjYYKkJ5rcEvQgDprmlPDgnZX5q+cpOCPgHLeimp8CBwl0/exRuWikkHgrCoV96yBN+30skQxOh5H7KD52rVHTO7+1paI0BCf1VR2fb+8560+9vgjI9x2fTyIVYn9FLZaPPk6zVV+urT2jcoK/5Cf5hfZJyGdv8ZGFmCRzWqDmdC0JpXC8xdMkxOjKibvVO/2jNnjFFpgLDCJcrazgP/A4tXlLqQquKochsmOjRGJlehvfv7pO4aDBOtdE+K1iNz8nxJ/FdtsrWsISc9MrKW8ZPNJ3/nE7ErlfGsjVWOpFUEDNmppueZdoZ3qrlZcoH7mhwntB4s9no4LRMKfIONcofWfUr77o80/TWxVqdzvCn+1mX2dOdls4u+p2O+xa/ujwWdMPaT71SbevlOutolce5fLU+GqowJT/dHCVFGhkelsV6u7rXmnpSbWH7nzW9XhnnkJdc96MOqwhc8cra95RTIg8eI+t4n/lWZB28lxTZioGutmqV0jTQ+bZaWQYCy8if3zWVo5XXFqWqy6yOVtY06OEhPadkThgjJUHokSKSD36mKVimVzoD0JJ+xqkji/IcXexkG9f+4/Y+KfL23f23q5dz2arVl/0z9Ndo/vjnly9veybHx6VY5yiD05Lh7XRP3+PtpYFq7adO1OagNfqS3683dSxK/55BWlxa22dGcWtcWmE1DqYyYeDScbKyXGvqSRWHLnfuptaizJkz19OozyoKV76yBj7FdDSO4wgcJcIe5L4Fi3QAX497GSg3cKebRZ5qAirlS4F2g8R/IE/LE7RaL/kNSrQILJ2RgumZNgGCyR2KKi/0Mk09oR9hKR0eySmXw6q4OayGAFI9gv0HfhPHbIYY49hbjvVRi/zV8YnG+1atfufNUJ38vegDT2nfMUux7hv1wDDqpvfrrvzMgq7+kXfobfuexRro6gR+1TCdONiIjfUHlsJcxKKS6O2hcSOOwQHNIcvQVc0hc24UQZMrxVyk7SRDSSDnhHDMTVooBhsmyBdH4DJGRpFjjByKAU6oFenWLutWKFepgYJlXHM4hc0EmAQnW6HEpSNeCgSkQEKsiMg5y1pPk/ITVyJcc8Jx5ETAFAyspGFPvtURMmz2z+DV51c3Fi2Y1759R79a54lPD4+0f+KCX4vx8f1XfaH7uEt+GzvO3CQ6DZvw8bRcDO4P21w081cONlzxyd9SQu9fvKDvxN36mp96y0zMdlN3clk9LYzMgmi0SnnqSZZHLQIJRRarYpRK/3QpMWxaDtRnPFTqORJMtG5htYZ0lw7cm0fXWofT5zFyznskDlb9SkpsRQPeWm0qX62eZmdkJoiViMlB4Zum/CVtoTrfENAPd/zbHepMWARn1UhqLm9GTggJ1fjlbVpgGXoAjgGNj3s4LVON0qPKysfOe8u7/gw66MH8u/SRtre+lV7mnF+lSOeKskTTuG3t2o68imrd2stfpo7oR3p7ul5JGfUPDGohhoqNVnfO5Tg3uciVOaaexooBdal3q2s9PDToCj/91BOinJsMZbm4cpvs3NCFHrSxTuPuUkvMoQKc26UKOI3VurV6EIe/0N8U1ooSBTATu+CKRlz2mA9cmD5irkHPLADLU8TkL0GClS/RCliDBfVQ6BojNWfGiOdTv4dcJzimeEyngXTpQ+98/3idFgm+P29bjEMEPqipqac4oTKJXWQ3J5dk2bKTY8NX/vMRxXDbR7W08d/oZH0yhJ1CJwk22Cc3h+lOKRnnB6E+tSsqjSutCgQr9R4tzkGRsV7Tcrky1pMpWSkdwcIkb8lXPW4JTFFqcZ5yVkraSlDELBsVWChya4sshEoZFK9kscZEJVvolcQT4zV/GYfMJEQ/uPlVEHPDCnZ2S1pyUKGEZUWUu1TawKwpdQgqFNYREjEescxU0LgCNfv0nAKohR2wk5WC7VqW2Rwa5msSY18S+38gRb4HirTIF8/ht49LkR0ouxKsFPdD5RYs1jHfcEXfe1RL3qeVLPM40kQrhEYbE8xRZIvJgaYW8Sx2SYVWQ98ZiwpZKwyWto7rU5U8uaoKF/Fnd4dGiIkjWJk37t+1y1NP+qa3LdZ1+lHhSCFVjmDWvqnCrkFqzjp/ZAGabvtmwKnjT3WnSHqEykzFyNNMfO+pb2EYu8BGafjV89cSm5eB/sqrVNgMSTKwF7zADTQYUmxAzmOKYxTdUtkZCh8gGbFGU6ak7CuVNaEZN5GssIJEApehrf458cGZP2Kuz6Z6j7qoXj7e3feRVW98qz/7YUX+ruw/T/GgPYvrQFnma3Ff+9rGMZnP/apb9w+X/6Lq+McXL5h/0i4tXRzVdznUYeBEjDmzLuc3sT4MrW2EY8XmbTsLPvmpnUkaozYKBMYRKhprF+2yELI4fZzlhRia65XtQDJN5dBLgy40rTBrrFkQwlJNNlGg4FQ8V5hcAe1XvFzTahKvnJVrJhatTCJjlamhT5+NhKDH3vJckkmKR4vMRZd6vhQZ6zXxY355kiKnOI6AItqRb60+oAHRHYc9qUoAkmxCPLpnujiFGnAcspzrYUgpW7yhnvleRsg4jkOskpJJJHAZ2uqfMx+JjmmrXPvC+b3F9p39j05M6GsSq9/xNzkFutayEzE+rjGYQ/f9tCj3jdaKwdujvm553T9+emVzbPzDOkTs9XykeY/Os1EMzqE6IPqtqVU+lrRpDs6/TU9uL6676c5i/W33S0ndVVG6w8Whi+cXiySs0447qjjnlGOLZYcsUp1oFNowrLKOqaGK4mxd1DbFkag9xSRlHhoaKvq162lAmybyYhDSszK4EqnqzFQ0STqVkCrXTJKDFuTAzHU9ctEad7JKBU6tQFojp+CgwfeQiN/DoQIydvFFRl5O1fRTLa2ScMByuvbV0IJnAPr5oZvlEr0LO0taySEgqI6rjIcK49MvPcC0cio85FwLiEDuvkolBmXKNS1wCtYBAiA+oqXBnRojo8jX6DCl/3T+pe+5BnpPZX018pnVlUzjg0T64dpPHdndmPgDifn3pDSN7bv22NKmuiED1dwJxF1hkeNrkyz4uOnOB4pvXXeTLH79xUlHH+5Wdsu2XWp5+4ontu6UEi8olh+6yO5Tjz3CinyIYLA0LEWmVuitOKt8O5Ki5Aqq7WaqOWGZhtCQ5pCxWLMP2UfIqsKDgtuVLW4pzUlpJ28FnQJo4bWqqIHnLm4ZpaJCpNK3t/y2hKWWVonwQkJxe7Q0s1fbGPnKRPVyCuJZHpFQyUQ9ZdjQRVjQJo6tIJKPYbV7ljMhWWSOmepTKCGy52csPSp/GR5BGaH0RZQyYgmfgjgp5Kl6EbFYxtA1roVLnWrkONbnC+MTzY/m8bH0qeell76Dj8cnBvedapL4vhH5AtyujRsnOG5EytnY8I+f/H2Na/9AXdVl+jwJ480BJdwtWSr1WvpJ8PtOYXoMWrL29jaNdZvFw48/Wdx5/yPFjXc96C6zLNtufZcunF9ccPbJxWFLFxYPPra5uGbD7cXCvh4r9l0PPl4ctWxJseqME4ozTzy6WLKwT0s1x939Rqiu/NMnXYOCyH8Slx/hc05FKFummTvepVVdA1JkLlZ1xcusJpOScqKHH6dQKl2qp1VGmOSQIiQI+ahRC3dFLLAm+2ekltFjSBA9C74yIUVWi8w0FAkAt1SccD114ssPKKWZQ/OTdjeuMgfy4hZ8UhBe6hRViRy7fqVopWzt101IKSjR04OrAiZvAkyCO9DImYmA7N99WmLTRWUKtWfxAk077erfLpb/y8TWXZ9Y9dY1ezgN5IrTdUTy6jgiebrIddg+uURZ16//fPuqVTGPtf6KT/68NPQj6i6fw/hSvWU+otum3mR76GoryVKcEVhPe6/uKBhZSLUjie/0rr/1nuJ7UsyRkbHihBXLmI7SVq9+G7Le8Irzi5WnHW9lJpknd+wqfnL7/cWG2+/jKwxWZHr1xx+1rHjxmScWpxx3pMbK3YbTLd97a6z8+D/ly4+kLKly5tbESiQYFRsF3rVjWzGkOW924cSLggJOdFpyX4PVk4mEWzATMwqp4mTRwk75Qkq8TYo8xQuVitKU4EhOtOg+8zJlsQuK7K41iqzE3eNw1ETJj8xhhuVUZqrkhKewzLu8ESvXIgFASQ8cDjEsxu9mQzwBiqty1YAOKrGMkvkjqBYniGRGsq96TkGdAqhwk4vsySzDoRQj+pKEDsvUrrv+wbsFW6PVXP8DtP39ZGqd65aEWNf5SjUg+YCvdV+8/FQdjf7x7q7ON2IcklIxJFEfK525LK5MzMKvk1WGnKckrlzbWlKrPIGqXdVKg9brwceeKL517Y3FHQ9sLHo1fkChSZ8LxcMSvUuW7ovOPaV42crTik6dWsE4mUq1Wd3pn9xxf3HPw48XOo3Qir19557i6OWHFOeffnxxyrFHultOi+wxq9jO1S44MqCCRQZr+RRWyi8PsobBx2gIx7ueUGRNPXHKLd1qrGnTXhGLyOEqHTVscef0KpBxEwzZ8SMPdbygV8XJrqr9zpDac0qk4If9xuSRaTR/iVFLNNnOSMrx0q0ilrI0SLco3LL7nMHBND4jhExdTzKFrGopnId+QPOLXipRRncu9qnETt00jD/lltKaAp8GYNRZ4LeSYNjJ1yRkgm1oiDh0lYyul52/+t3rQWMZ8oduu00NcxiKW6PmulKD0oRf/cqimbdIeZtf94L3SVLvYm4LZdE1quxPtS6rIlnkqULlVid01hKvBBbAWspiVjDiaDO1W911anW/+cMb3T1dLmPU8kMX2+qsTdYFh5HRdcdodcwRhxVnnXRMsUKKOaSWFmOWDgKwctP9Xn/rvcWXv/MjKylGNl4CtLwrli0tLpTi0zIDKxVZXFnRlMlcheQAmh4OsN8w8suPSqPKbWOP6FOpiME+5N1p19PY6IhQ89QXNPPlBEwGmpFQLcygwAFqV5JzHZ/0qEpUbtxVjEyLZ9WBrUNb3FMiTgFInppGkyL3aC9yfC6mUmR4qL9EzFTcpMCiRVmXCQbPZXYcEvxHTjJi1CHyS/6gYZknusYCli/KI7v38cyYraPPqbGnQPYN2EfKDiazLCtuk4416C2qLn6urW38A+f88mVPgIHhePPmWyfyZ4My0UqGgiSTNhZkXxu++Ml/pzr40cUL+5bpy2+SlVebaAVDTfYJNz9caC4JVZ6qRMSbcurM8kziqgkb5aXlJORetZjfvvYmG5w4dfLwpYsKzPAcZEe3HeMVx+vQIr/2wnOLM08+xq3xFsGuWX9bceu9DxevfslZ7irfJveX/vVHxbmySGOVhvY9Dz1uRcE4xjz1sUccWrzsvNP0IjhU5zFLkZVGdK1pMSUiSykpg/0hNkOSH7eVNytwejL94Ut4MYccU09jSoMWOcbOSXo5KRKMJBQQ7pR6IpUCSdsYJXIVT2Iu58EDKZF0IThedaviV64qtIWXGthClJ8hQ3xlQnuRNUbWJ8bMR8gDZ6Yaadc5qEKElT0pDcejrtThipxqj+uRK1UdRtxavaLOOT3TsCtRF1+t3hrdEgViEb8OmsndQq/FM1OMyXAiYVho1/pqrNU7BFgzsfXOP1v11s/bQHzlZz7T9bq3vU1HTgX3zhb97Z7FGxt53fL6tZ94lRA+IgPVS2nNdMjXkAhpBVVZEpMTbvFH60WBQF4/HkmoFgds2i+f3KG8+liz5o5/cMMdxb9ef4vGqF3F8kMWl0p7lFrLAVnu7rj/MY3DmsVLzz5JreepxTIpN+Phhx/fUqz95rWyPO8ojlA8WmcszrTAb3j5yuJFGvvSKoP39R/coCN6tKnflsAxd8HBXaVu9RkydNGi0yIDG5MCYkAru76WGFWLfJFHdYmdT/KiHzuA1Pr6NxGbCAxXWJ56Gtb2RRaDDGhlVxiI2kXCQqrkJReCC7g9yU264Xd4ciLSuCqX/fAkh4u7HjVhV7QyID+dw/DU0suh5RO++ZGOeho6l9sWa476ia9MSMHdG1HlEV5wp7uZgrDg0lCUNGRqEJ7AIaHMfERWjBTfREpgwMFviSyveGu98KcEJgWFtIhTxShhFWhml+PVIs+MudcQcTekutvFsT5P7th9s0TwvpWr42uLdX1t1I+zuXHtfzllvDH2PkX8DZ0kouNs+tO65cYsp4VSxVOBuQJSwPlKwqRSu9D1ZLy7Y3d/8XdXXqMWclNx4orDPV1EwRN/WIYruhW7Zcw6/fgjiwvOOVnPFRrvtgt/Y3H/o+5l2AKtqSxWvhR7hL/y1GOLl59/usa8h1rJ77j/0eL6m+7Si2C4wIJNPIxZpNHZ3l5senJHceiSBRobH1GcccLRxYojDnGvAGXnqjb8R75K5c11wa1uVuD0rI3NnGfTiZZ9WC8QKzJzyMorB9S5kksmlptw89MVzmKsyTLXslqlKasONGBaF+K3uHEHxDA767ccIcGsUDm8DCsdEVJ6ZY9QQuSDrnVbe6e/MMG51v7ukxgIRc4Ey0Ssn+5WC1SSkzvnBf5zM9yqvInGpAfx8quiJKL0M72gXPlqAaZUYpYopaMlpRJaOnLwFEAO2O+n60GhHq9MKVLirrS+4iuN9uaa837pHT+B0P36iLnldcdX/mp+//C296rANJ87bwHdZV02dVt2+GZ7SeowkSu5K4OIUZEsQASafp1qJW+664Hi8v//n4oLzjqxOOKwxVYmWlFw3BLqBOiLzjvF00G0uijpj2+RZVpd5jNPOrp4RFNMyzSN9NDGLVZ+LNOnHX+Ux9OPbHqyWKdx8A0yaNFNx2R+yKIFxblScFrb7bt2i9a9Hncz/t6pdJsyKZx09BHFeaedUCw/bIl41ouE43fIU7l8UxmyBHOW1F1OFTj24qolJsP8uIirBz6e+YXgxSA71SJLkQ3Xy8RXRixjBTgqXNDML4UUUj7KCuy4JbjFUb0cauCcnxIUPE8lMwUxxRC+8okRkV5Im4yK8QG3BUV7/lyMutyRdpJLJm6SKT0FRdeZF1GkZWxuk5LO4cEA9QqXb/HMTsFyUVThEatEtzersCLW4hJUelO0hF73Jfe0mNPg7RcIw1OXdFNrLXYPKw9/IdX+yKpfe/eWtu/+5ZpfGx0f+sqSBfPfAJKsy3SXmfnQQGYuriReKzN1WP5UALkc6BIPq5V74JHHi1M1xcM0EONczOu0vHSfV7/2wuK8U49Ty9ld3PXgY8U/f299cf3Nd8t4dbS71ndrXLtxy7bixXoB/MIlL/a4lsIa0pJHppS+qTG1zjVyl/wQLbX82QvPseGLeWFa2LseeEzd7+3FvQ9tUvdZB6krnev1grj9voettLTUbBeTZJgC8LOqVuHK+SqllmqL88x4l7y7Oy4jlp5SYT9Z6cSqJ/br0kqNjAy7jvKiiEsJkmaqPjMpLRgobpYr/rimQoCbpJ6hTIHp+zToLUpShpeOWmSc0YOgXBkiDGl/9cAeDReUt3b1mjhBExWJfIhG/Jc0oGrekoO0y3EwMEeIXox5NyzAVK4oBwGB4ynDocQfVwbaM7M3oU0n1RRzStyAT6JfIs/eoSzwRh+XPWhEDZC61b0XjIyP/ebvrn7NYOPKz777kcOXLjlyYHhsWB/UUqPQ1o725sKdfXKtMdwCu9IiWDKVM5YKMFVyCnTTlu029Pzghtu1RPI+tcRLOE7W65pfI4Wj1cQyzRiZ1vD4Iw8rjjvqMM333l8s6ustfkaGq5PU/SWdYcVjvTTkMaawUuuaDbeZ1kvPOcXjYbrt0Yrf7lb3ONH7mQvO9vj5e+tuc9dbX3230YtcMeY+9/QTiwVS5DB0McYlS8qbZOZLCcYYWF1opZvDCSvzL9TSHbGChugQl5Z41/ZtOiGEOWRVVMssSmRm5d1rFUupZNnnROPpLJDK9MHirY4f3JSQMqx0lEF1B3wjD4YJfGWCMXJ5gqaERGxTgIkkUwOkuciK+sFVpi5Y5jdCFJjqkhG5kaY93PUrEVNY6S8dCafyZwpV9CrMpPNtCngKIGMe8BOKks6oGoKJro5mx+YtTxZtP7vyxN/VWuKlMluTfS3GQJgxnolKdsDplRGh48KBMlJPkg/6OaRwC0eFpTXeok0KO9SVZ1kkXWksy3c+oDGsurqHa0rpGE0ZbZTC02JeIIPWGy9+UXG0rMgo1p0PPFJs0AuAZPQZFhuh+mQMYN6XbjEt7D0PbdRa6rtsNGNM/HoZul7/ylXFsZpSOmzxIr6XUzy2eWtx7JHL1J3f7pacl8C96iWMqFVnXplxNHlgbpSLeetQ5MgjL6+Guuy0pBh33PWm++0ueNWChASob1GROzWv6pMlNY4cVWuM9ZrLckyyMyDdqN6ZRh0+s7sVGx85oAJYRVqDAbrmhCPuuUSJYvQyTumooyfeYz31kFpjFrpQ4/jmE0ZCLmKaB+WxrBsGRpizzg0YOETSFS7gFcRIgEosEHN4ilXSqMFrzoq2E8GraxJCAKe57y/eNFEngeKlHWse2hoTza3btk/cdvcDTZ1zvqXtdatOetvo8NDS3Xv6J0bHxzS3q4RTRsm8BdmS8UnU99sbtEp60EwCzOTZNaSFIlKawzR+XeFFFvc/sslW4jA2FVoKOc8ixPLMmPdXX3dh8aKzTpJBq624Twawr/9gQ3H/I08UjHuv+Pb1xR5PE2FVVtdNXTrGt9feeGfxN/98TbEQpT7myOJnXnq2xt4nq8Vuc9wvfvOHxQ1q1Wl9GTPT9X1cStyP1VoGtbv1IsHaDb/z1fJnRR5z7VNXWelYebOyugeSYGWekQfCQw7+tzyA5MPZWbLIOmTGymN6aViRia/WHsMs0U2CSAd8BQXT0o0sWI9FL5RoGsItiVbxWzBbcFJI5plhiAxdg1LkIR2WwNWul5U/F2OhpBcSbuikXykvAMB04y9cfphn4wXYeC0YQSSQHXEyBQFz3ISVMSr4JATTmRpvCqFEbzYPXnI0DKqaqsv9xW33PIi9ZqK3vWjO7+0caHz+3b9yV3dH+0kaK7K5tY0tZPNlOeSLeD2qQHRDXYlVKVONm036JW6M/aARLQ+0EIMriyt+1BwbP+THKgzC42oFb7jt3uJHGo+yiOSYw5c6DgrKsshLXnym3+A33HGfNzh06Y3O2Hm3FPwMvQReIuWmZUbZaD1R3mtvurt4+Xmn2sh12gkrCtZSb1brequE82XNGaPoK7V2+pjlhxXH2yKu42dlAd/05Lbi1rsf5NiUYp6s9GxlxML9Us0hn6iWnVZe60S0jTJNGeVyzhohzuNtSsYB4kdEkXf7624FokS8DBgX92uzxB4tCEGRPSWlsJIe8ebkCqbzW5/6PqMik17O45S0Kd/gaSbOoMuQgbGxvzKhOWR/ZUJlSMV1z8b5JxHkkBNJDj/CXd1JrZZuCNgwOx2UOdIzOyFNmgbUgMkZj3Qvg0sHsatrCngKoMK1S9ynvGSZOf+K1tmunXRarXyvbDw33PmgBsNjxanHHDKmxqetf2B4a+Pz75ICd7afNKKTz1RR2thlwxueblwfK2ykyPq0ud4AsY2vKSvtvtiZxF3pjS5kVmA9y5CoukE4KjVvaK4uvUAwoT/6xJPFjVrbvF4/FnOsOHyJWtmtDsfIdbumiFgcvmzJQi/COPtkLdw4+RiNV3uLx57YWvyYtdTrb3clOF/rppkXpnvMWul71Z1ep5fEnTJkHXXY0uI1LzuvOPLwQ23IIq0uWU+5BrV1cLuU9+of3VxcrxeBFrjYgIYR7EytBHuRWvHjViwvemUsGx4dNx/RPZTEUkWKBxIE1prv0k9iCd+VSm53zVWDRzz1pO2L2ofMCi9WQlkRjA/dvV37Cq+XSMWCKaJIk0jvVbHBJUJLkgLEf6KkwKSVGLt4aXTIoMcYmWWa7RovezEIpEg/4QbhRKLGVCuHkbDvyCYcESl7M3OWHUERMLMSm0iZp/AlWGInkywTyvDJz5SXyFMtEyJAY6NJEPWyxopHN20urrvlfq/7P+PoxcURS+ergRjz8gThbW1740Vnvk0b4Zdq5ZE4UTVJgqIlHB4a0NLEASsQLactgbQuwmEN8oFcmWHHJi2XchJ9mSmNJ5PxBgUCjHLSGp509HLxM1bcp6410090rWlteaJIR2i55RsvXiVr9lEcKGCj19dksf7Oj28tjlNL/LqXrSxequWTy5ZqWabWSjMWxqLN/DOt6Vtk7V6hllffHC7W3XK3FRWlpdTY4URvZJus5MxBkyaLQYh3iF4cX//euuJxWcKZQ1+iAwW6NBxg9RgVIlcu8h2S093/CjEg+yO8rKyAhRBrkBkztutUyXk+zwr5a/jj7iitdKYMfF9XrnZOWsiT/cSHr+CtRi3YJLQGDGfO4zRBzoPpGTVSy2kCCvuBTjzRUIHx8bAs14wTmEPG2GWlUgSnMTnpxGQFxqWf8XOcHKon/34AC3+Z2ewFnq/kJG3zzPil5Ur+ElyL24JHWetH3dbPecbvXmkg8i7p0EB2u9bPs3nn+zc/VBy+qLdYeeJhxeI+1XE1OGqdJ9RLbEplB9reeOGZb5NnqTzMpYc1QWzCLInQvRkezopMZVQmlAgsZgZaeNyXRxGhnf6dIRMjIyUQIvIJjTQoPJQWfhZJMU46ZrmNWBi3Hty4WV3gPqfKSwWFoRvNJv9vaxPEv/zwJzZCvU5W7NdrbvhkWal5Odyoeef/roUjR8rSvVArtG6795HiVbJin3HiMW7hdVZ1cdX1N3t66cY77/dYmpfa//z2dcXN6kafLIMY6fWqd/KExseso6b8HtFKrxtuu8dTYZwOskRTVixUoRfBRZ648bAQ/Mw3wUXTf0Io60NAjO6ureLTOnXrywscTIdy080ijHXWT+ki0WCuImOeKy8u56MVVPMpB3UacmdvlSeh1zx26oZMqdDj6l3wZUk+E8vFHLLnzZVHGhJk1HKVMq1BQUk/81MylYGZr4xIXLnx4jJ+YlJKiysF1RxG3fsN3lTn/ENZcetpISks8o5m6dOmg3uKGzUcvPK6O9wQvPikw4sjFneHHjLKtXx0rocIoMC82uJq4U4gVQoqrDYKKiGNwbT8b+fotmJgQBsJerQvVK1At7o7rB0O48Pe85BDPa5piu5EZACxlIWB7NKEnx/mSS2+/ibUp3BFVYuMAjLmXKGWjxaUaacHtYCD+V3Gyax97pEBikUZxxx+SPFzF50r/OX2Py7L9dXrbvWYekDnyZMO661jb7HWQEvRWKfMi+JULQS5X+PmY4881C+BO77+iJZW6nxltYI/uvkuj7W1F8xTXQ9p1xSy4AA/Wulb9IK4Wb/zzzi5uHDl6bKcL1FO40XE+KasCBYMlbaUUFQO5d0tby4fVSDLJlUqXhecx4sCd8pWQWUvp56oMBVBEYZIJpTTqT0nB03211Cz03WDXPi/ZN7BLUmnILEa+QJjEn17jaCgFOZKLtRRhi2bHy/2aPw/T8f8MF8uU41fVpDKl88mbklYIaLVklQmnqEt4RkTIO7ww34OKdNSpkOdK0iFlTKcy0Bet4sG53IOqu70ihJdZXpSD2/cVHz/xvuLRkdXcfG5xxfztTdkRHVzcDhe/iiv06nYKya1wH4tUCbUHlcqegt+61vzUSItNNDxqoNDezydEkzoswq8WSJ6ztVen1HBlAZJgWnhy2UA8Eg/4K3ByNebDcTT4Vr3fLoMUexWYrpn4+btxSFqkXXqgbvdjN3p4rJ76Za7Hyr+x5Xf91TUS848SXuIj3MXeOMT22y4ekTjbOaR++bpUyTKC8YstjOyyQHrNd3lc7WY5MhlhxRbtu90/p7Q8ksMfYdpdRgrxA5XFx557dCSThR5646dxQ/VFRrWLiQWqLOYhCEI/OfWFH+lcJZGlkpk3DVIcN55llWSh30O9JY+LNbt+uSoTnrQiyiOWTJdysWXhVtVyIiawmb3oHwievBLOuGq87ZvmpbBDGimmeodLfJA/y6ffIJyd6iXxRQdypblmGVo/cs0WzwAxXXKdzySx/iEhbLk6DzJl9QsHDmTOYCnMQiXDNLMQx4SUI/cqyrLWHITT/Rstem1GB8dKjZv3lL84Cd3FTc+sLU468QjizNXLCqaY+xBYCUldQPSJJx5VfMnwmpMUhe62dQYWFQFBM3IREpMZyU2MYdH15qPZnMCBYvzU3RbhHN8oc58JabMVy1zpOorGCl5AGZcQ8hU4DHvi6JgyGLpJK0wa5o3aZqH1nRQYyosz/dpF9KdWsHFuPXXX//y4hVaI33C0cugqu7zw15EskTWaIxRKBrXg49tshKzFvtRWb0xSLG4nO45Sze71a27WFbw12pc/YpVZ8lyHYcFnKzx9woZwbZs2+GWnbc1xwDdoh9y4uUyT3Q4UZOCpI5NJ7MkCfOSxYLH5RLQLA33ToBz7A2KTK8Ia/W4KoFFKd65ogoYkigcwEPR4Td+VXxo53KpoAD9Hw4HoHQtGDN64FRE/aPnFWPkXbLP8HnYppZqpq610Ny7CybkmZxA8rc8Mk4GZn9iJ9GYBHVgjDbFl18w0XjtTWmRQFZc7foo2rQWcrsW6zA8u/7OjcVS2WRefPLhRW9DMx582ifL19mHPskGJ7orWF1oTsHBCq0vvJw0rMGjgG1GdGSSRHBETFUGt4QW/fAE442ljDImo+JguZ6nsRnGh3gdEH/6q8HiBt5QJOo0ScAJpghJdHAM81mgPO0Gqj+6+1KEDrWYjDe3ab/w7Tp6h51NdJkP0VlZjEcPk6GJ+eNLXnSmlPdwG7nIxcbNGhqoq3LEoZ9l6PsAAEAASURBVEtttWa+l+4vGyWgjeAflgJj2OIoWaaUaNXfeMlLvJYa7qDB1kT2LNOCM5/NFNj/+/f/orxoGKCXDPHZy8yGiZevOlPbII8tFs/v04tGYx8pm3PvAnCGLQO5nFfyCR2/TO22l9B0wSeovIfDyDgq5WXaiQ+bc4omLReVHhxoTb4ijUlQ0Cgeg+tlk/EqmCnqloozIwSB5Iu0a0EzOjN/KiGS8I1HdEMob8BdOkHTVmsN6chbvBBDBhXpREuPTDVclc9+yyXFIkh+PwAheF9mRnykfAdzIOhHE8eVwsrUon6yPl6zQl5WepfWEtzxyDZ9fG5BcfIROsq3MVrs0swCccsvgAi3TAderGukMjEmRW0bHUtWaBuxGNzxWhFD8Rd84OafC7fN+kKlJbGwXMHVpVUXh6V/fI6EU3YoKKY4PI3iTCIMUwtiKXMwaCZTupFWStCeSN94wYSpGCOCTM9vZxUqRizGoSs09mVXUWwhfFIbFvq9EAPlu+vBjTHulbWYcfJSrfbiGFpWgKG03/vxLcXXv79BQwS1vJqCYm02C0W4aO1p9S997cu0a2q507vh9nuLz/7t19TK3m9FJm0s1bTsm9UK8xKhd8B2SU7HpICu3XBHcbdeMmysWMwLRmuvkZmmCKr8OUVVnJRP8pyrUVkoxnFds4uXpkrGLx5eZl16cXXpvGeUd5Seksopd+lS1PJB6Uz5y+UCE+WFO/8CWC/HkrcybuDsn/JWOSyTS1xFkqEk1C1lxGNkDhJkWKcKFyu7JN9cT8VCKbSgzH2aNCT7FrD8JaazGq2sX4LuFkfDg7+SGRyDXF2e58YAy9ZSDWseePiR4oc33yd7Uofmcw8vjl2qIc8enTMuqzsbP9zoiQRPt+jQcyaCsnVFnBKs6h5daLVcqQsdoyzwE6JjwaAvHuQTpaXVUyYZA1eKLLdaEqafBgf63c1BCCxep9ImKkEr+yIx+UiU/3jaA6Yj+WZPeMOfg8pQCVYZs0WYMSbd5WPUUrKEUl+S0/bBTd6auOr0E4ovfed6KbVWAYnBa2+8Q/PE9/r5g5/c4XOmT1QLzXJJ5MAYdWRYxjMpBAwtP3SJ5pFPUn2JMH1msrjjvkd8Ish9Mno9rtb4dinvtT+5TV3zHcVrtUzz4pecrQMFjrPB60ktADlO53pB5wHxRGuPsjGvzCYK5Ilsc8EhBssBYfpSJks3TnAVEM2znPoTzygMdJB9tzZKcN4zlX5E3U8OvqfyRcSgmogkmAlO6yaEizTyLyCJguGCmMcaoxlp2uc+8JSo64biinzQVt5smVYIRqBQZB3Rpny5B6i8+qUBaTONY1I6yJlf/cp+8oGCqpzL5a+43c7paUZgTL8cJ9HxbjS9LHk21F3eunVrcd2NdxUPbh0pjpcB9vhDe4u2UX2yhz3hotiulYKZN+oZDZJlW0svegHOPMs11IVOCqzK42kkUSBWyix8gawrPewmv3LkFTRUEISUu5oOA0cVZETnQKHI0SLL0KUuMxUVEXC54pFxCZpEDNXNrsqT0ndAhQcB8VdHyx4bhRTMPDCCZYXUMSzPZG5YLSBGJ6aeyB8t9o9uvserqxjb0sKecNThVv4duwfcAnfoBcS4ldQwhtGaH6UVYRxVO65tjrTyuzRuoWXGSMWhAcwFv0Jd9ddofMxST3jYrfXVjKuZK6YnQGuMYQyD2E3a6viQTtRkFRmKzDxz7g6SVV/OrFyWmZ4qReSNJKc8wNFFlNzyMS7m6wsoMzCmnqCV3/SZvCPWbsBdLZB3OOJZw5nOCSpXYsU0AjL5nvifDJ7sF71U4qkuCwBx4H4Zxby455F1zC/KzVrr4EN1wXLKTEFccTNz9bSIYGOU6qWVF7VICuU2LtFwHGhUkdELDjZgnKvK4e7yLXfdV2y454li2eHLi1OOXFx0jWl6TK0ui30oE6o/5YHStqncW5SXvIkfUnQ5khYOzSRJ9/I8cFtSYLiEmVRQ4QwQbl3kl2rjfOOGYeg5MMKMCK5iEs6Bbkxz8HEwcGkREC4VJy5hWsrBaAgczgn1rXKX/KWoRvOthg6dyAN8ZUVgVRZrn3ky5rzjvkd9NA/dV1poTuHgqw6cPb17z5CtgOdoz/AbXn6+41z1o1tsLOO9wAHdnMHlN7TSuu3eh4qHpLi80OhCn6YDAVZq5xJTXSgpK7f+9qvf8Xzz0Too4I3a8ni8XhQDGpOzt5lC2yP39TqsnoUj9B6Yn+5o17gO+SbraJKGyyBJQIKm26yrupVBOEK2AUK2VGpvX9T0Ez0VNkwYL7/1qTC1nzxQCQL7fU91hJhSAl/mD37qRBKwDtqLm3J1PhMN+8GXjCCc+dYhMlqttlPDoiEpSVbkiIssk8RaUyK+ZSA1oIuO8tZoVjJQWpRJLTb1mtVk7MFHeYc1S/PgI48W1936gAbqC2xdnt+UHuza5nUGUgIPn4RsvumlskiHIafzlPNnYZGe/smj/pnjVXC0wG+66Ky3KVLZAhMScWE+c1g6FN+UHGCCQS8qGWgkkNFzegCU+JjGYFit2cBOpUQ4KLLRS0GZdEpbIREYQN8rGPEzkxnNT/Cg52eQABdF5tKRuNqquFTTQUs9LmUfMTuS5klpMD6xCwql4yxpVm7R+mKZPlTbGTHtM12EtZq9xNBlDpgNFBjKaI3Z1XS2ust5Gmq91nF/f8Ot7r6/Ti+DX3jVBVZepsBOPvYoteaHOE3kiZUbZfbxQdqLzBgdRaZnIKEpD5QAslNGrLhZyAi+9YK3yb8kUCOyOKJX86qsQ8ZizYF7lBNxIoFWevvvE4eT2IHdoCtHCnMe9p9owozILZWckBZikQfSo5cxIEMe86m2yUienk8VGeSd8xpd5ViWKoSkvIln11+lIXz+IgOuXaaB4vJr07GtY3pxbNr0hE5DfaB4fPeEX+RHLGgvBrYzfJMh0bvS6IRzRavbroYD5TUvggZlvWLMHwDceqrsuZCu5r1DgX/BSynbNAYes2naGLqFPDKpgDq6booeBA0GIAeZ4xclFRG443dEaIZnXBVlRAYvFodg1SWxmAvlzUfWhBcMRGaIlrJVPv1WB4+w2pVBKU56CEFFnuLQ6sALVmmMSygyBwewnHKzurOLFugjX1JmDsnjuUAKTwt9rPYen7BiuVdzoazMDbPc8grtXkJZzzhxhXY2nWODWL/Og2bMTcvMWmvGu7/4MxcUF2hPMd3jux981PE5rO/QJYu8aGTTlq1eOELXmlYYef5AJ45gEOMlgnKj0LyInIdatutO8pYrQx0+2U3viCsfKMBeXSuyKhrlyYtkqoAdZe+3VN7TIaF45o2CURqpmKdD3ScMWr5aHjWP+PD4VXgj6lJ7/bheVEzfuWud82d5Ka8wA6xkClrUax5VpkiXssmK26RFV6u7desW7RZ6qLh/c3+xbNmy4sTli4qx/q06kXR70dTiDNdtt/6ip3TaUFz9/PIgI04Hh1jI6aXshA6FjpG4x8AyaLeFAsuIpYlg8QX3QQEipTM7RKAMTY4awFjW4CqyYdUtaOK3APTWV/cNRWbxQa5QUQFDkGUhkRwMEdf0ACSn/S2YgVKHp8wECRWA4jLmxQpMi3ryMct9zCyK/IBWdXHRTb71noe9L5hu9ZA+oEYcpqlYOvljKS8tLxsjLtAhAeepywzvd2pjxQ9lZf7692/wi2GljGaXyIh1jDZPMN6lNf6ylP7GO+7VOHqhlZOx76F6ofxEmzXoDTDGZgEJfN6qBSjAOTIXCzsvFF4YjLkp51JZlXbpdg5muoUQPYJRHF4IxGNVV4+mABmXjcpiStkoICnyTLSmgSvOvi5KCzRXH+dhXzFmDnfJO0mo8QvCAXIKpZKwdoEDE6hvvLAwdrFXu4xZ8j5ZcaEG3aS4NDxSRu3PLfb07yzuvPeB4u7Hthc98xcXJ2iIpLVxxY6tT7jRZHENuPCGsiLfDpU3Q0ku8+/eFB7SqemZvAEBXCmwULRiuq7A9Gn1XmipEAJMd6H+rZdZECg9c7CZgQNYqC5XMmD6+U1Di6KB/9gom9dj3+sERgBd4AZ+ereYzUgnU2WJod2QDFfE9R0i/rejjocwMb4xXcQ0EXO4Jx9zRLmqi+WZdJNZ4EELzK6m72gn0m61rryBOfYHxT331ON18MBCG6eu1vrpr1x1fXGN5qAvUmv7mgvP01j4BI+vWczxT1f9yONhXhqPyVoN3dN1Eib0BmTY+rGWaNJdx+jFx9sYH4cVv+k9zneoW033mlNBbFjTCyj3KCynnOfySY6d6/RM7iwIQwMWS2exWPfYYt1EkdUlRJltWKEHk8u2pD+zI6U0M0JKG75drPj3J9IMFKdGrTOLWy8j5Yk06FoPat0xigyM4QSttRsRmCmjQlU/KeCEuslx1pm0x93lweLBhx4ubr3vMY1z5xdHa/HOoi7N7ezcIuOtyq0zPgpH3FBctfyyNttwRZ5TItTZ7CZr1AUu5wdmSR6QbunpLrReB7UWONZESkuqa/oKUc9chVu6nKCTToqXGEkIiQ/5xDYVIv6DWXFHa8BcZfWjldHbS3juZmMdJA1dtWwGPUOFGsGOE0gB8D0HypPXz9JrogPCQgtaQg6xO13dYZZnModLi4hQ2QHFGVt80gVlfsMrVulIn2Ue29ygFvKfv/tjH5yHdfrfvukSrdI6K5ZdatroG99fX3z9mvVWPsa+rBRjI8UbXvEiddO1flpdY7rbTEPRug4qzde+9LzilS86o+hR5bpH89O9Gp9zFvYNdzygTRaPugVmzfYCLRzhyoqcxKBHEgQPl0sCJXCJ53BQUKR4y9M6cEYXU08YdKjwdBmpiPtzuYwmpzMlYpQgYPBh0RXU/inIMwBcoxSmZyYnOlOTzvVNT+UN2wvofJSOrvWIejfMknSoVW65qJOeDooW1PPLWua4ZfNmzfvfV+wYbS9WHLm8WNqjHtGe+CYW8qKLDkPwgcJiSGMrbik/AsxnyDzSTAqKh3IAJcnbSp3KJhlC1ALvQ4GDKMLNLtMNTxaWuHAwBUCCMJV+RqxHrshY2LAYBU2EFM84CpEi88ZjX7CftND6CRD8kDFeAPlq6RUkXsow8ILhuKd4POwUvp7wgiLTGUGRj5Shi00QnMv1XZ2RxUorrNRMPTFOxaBF9B9orfOV39ug7vHu4pWrzih+8dUv8dZH8keL+ZV/vU7nWT/qqSu6vRt1MABfkvilV1/otdOkjfL+iCNv1U3n7K83verFfonoADN3pRlfs12SrjtpsqKMY4ZQZPyL1Uuge02aEpGvmZQI6RBn8mU4AWJIItClLqIqdZ5DBsTUIGXjFVGg7PUKue4VZVJg5jnSjzoxCSV5oyTtqTmn4Co/HhmqrsRUkHpdgkE/omkIofIc1DQgX5fkuCS61fR6PMZVCw0mYhlXT4TxLN3lB7f0F4cfcVSxfLEOItyzTfF3e6MLKxIpTy56LW3q2aG47sEooPwzXwkRZDFUz0Z2Wx45HBwzrpu+boMCN/7ysl+9S/OiJ6ky0qlvI3y/LuE5yZanU0rRa8xJeLy3YYZxFy2pf8pgu6ZJ3EXUk7c+rQ8WVyyGZNpCUCVivMKPtxtvT9zNDPNgLmUOMTiTwUaefjGvUs7gWryBYxaByUk0uyIo++CFuWvO6LpRXWC+7MA+YoxbzAezk4mIjEvf9KqXuDvMGmyU/Lvrbin+vy9fpSWai4yPAYrD6l9y9inegMGRPbwUMIT97T9912d9/fwrX1Scow0TKCPzxRQL3W14oJPEKSDfue5GL8nEmsoXKphT5vMw56mrfrKmybwYRL0W5sHJYqVsVMSqXCyTmj+HZDmQMWD4Q7F0WKDGkLu264wwVVhESPm4xu6l4uR6ksRbe1Qp1YDJGd3KXExZKXK5GGlv0TNB6lxUuuBTOYJm9DTSghnhQorh1CiWeF19OlRg8WLN2WqIw7AOBX10o2YbNu0olh56WHHkIfOL4f7thqtJt3yyssErLSe/WHZM7dcFL3qE3OW1D16YijUGHvPC4NnlIb0wr1pvEL1SeqiqXGPjOnyjsTUdQGyqKYOZUiK4rwfMMgCXBoQSONnEWhU5qOouXLGbBKamYlRuwBMsf+MZLWB7m9ZXa78GwqDljRaZ8YpOaRiX0UGwhsZnY1LuUpGl3IjFl1vkSA+/qwPEuEjIT90Mk19BjgI84wlGi8ePcTD7hTn2lq8esn+Ylpruso4k8rwy00+MWTluhy2HL9EJHayZ1gH5th5Dg51MvTrthEUdd6i7fJXG1Ddpf/GrXnKm10cfIWs1hjSMVhyfSyt7kY7/YRUX00mE0SPgRE1eLlSSw9TVZ5nml791nc6xPt4t99E675otkl6/rfKmcvHSrF/ALInIfhkEVkgo8C075ZWywWK9dNnhXjK7W5vOhzUtqAKNCgu9LNuSGqI1hRoEZ6QwCVjzxssGlnOdgBtnYZqodZC5BlG//OKBC1izskg5KLuIk+qfXnbohdNS+PYntxTbtmrDijaH8PK897EtxVh7b3HyiccVXQ1trX3yUbhR3dNpLRAmObhHcUnXfwQZGnyQPjgBcrzgAUB0m8IPEvyF5Ag1tw6E36TcgldW6GnGwJCZ6bIgFQjx0m0PLWyClU8CaohywosFiot/PLUrwgNm+hAVThgZyGyEWbHVzY5xiioqNBCgfiVFv1kQRr4qV4rggDIfAhpbaMCg5VZVBcuaaQ4U4AuHKASrrryyS13rb+hDbI9u2uJpIqaKGJ8eKYUE9ygpLh8g36puNmukv7f+1uLzV3zbLe2v/NxFWmp5ls/mokXHSEVLz4EF+qyGT9hk99NmjZu/9O1rPS5nmSf5o9eC7Birw+dpJxzFN2d17M9NmpOObZWsHqN1yWPkMvelQ3nMopn0DDj3kF8uJ+aO8/ZFpgK9GER8uEWejtqUBKYAJqWMlxyqsqrswbbP9UT+FL0sY9DThRwUyfIAMeIpPvXHP2gJqn/bXNRNxphlO67CiT+omZHHNj5WPPbIQ8X2IX0IYPmK4vhl+ra0poX6NWZub+9SXvUCVZrmT3HcRc88AE9ySKymkHhEWM5E5KK8wxpZEM282Ml85xePGGUeWAi1LrS2Iyk9daGDTEtq03hE2wKwIHI4CcvdwnDNE5ThLONEQYTC03XGxE73OLrTrErRcT9encJyRrraFhoZExGv5lILbKOEcKPQ1G1RpW62qbtNC5W613RJ4C7+5Ez+GjOiGBwalpzxAsUjpvVACVBcTrmke4sC87kWNkhgyUbR96hLiyHsVG2mYMshp11SsVG6WzRP+JWr1+vbTidqscexXt6Jcm/VvC+bJmiBkQPFgCJ+VxsrUHj8dNnZyRQtacOWas4KY1zNx9k4OZP38CH6YiNfrCAOn1xdpektFot0imdab8o4FE3ZypdwfVFe07lrYMtRNFzBlC9aLpYvcuge8/se5gjeWpck+Uy3TAAACU53lcgVP6mEgm6Eux46OpWK+hQ/3MbQjXSJU7a6uFWOHuPylD/3TkbUXd6l9cnbt20rmrIid3ax9bNXMxQLi13a1cWUU7t+mYcqDbucm1Do6gViHn1L+YTV1DJHLBjkP7XCAMUTdFBg6ixr18dVztiEdODEWIMudLO5tRoDJwUmYhCdTqiWUWuAGNl7jECPehGUS/oI239BF+HTXfHSt6zMqghUNuZrqdhYCbHqAYMmgi8VmTei4FmRQ7FRHik5bwnnLVUkuS01qEDIl4SWnTUXoDrnREVR2uFJLxyUgvEqZ1FjIZ7Xw3fgCrWgA6ocMQ6FX4xTWzX1dJiU8E2XvMjGKeg8pgMFrtUmCrrMfKj8JZqaYvrqYbW637n+Jh/eh/UZGrTCLzn7ZBm/lrg1ZsfVheee5i8xkpFv6Fjdr2qqipVirPzhQAN95U4t8wp9teJkKzJyxppOXnH7igxWssCfhZHDBMpOgih3KjIvScZ6tGJYdK3IslqzYEIBQlQs/fiLKz+Td6ZHDa3mNHakHRGpA84HL2vzHIxHssEj8a3EKCw9Nj3plaDoxMV4heLu4tRPwbt69aJUfePF1NnRLI7UOWk+2zvRcV7IU8qbE1ay1D/oTf6ZU8GzTKn3RA2RhANanqJNcL8IkJ/4gV9OiqHHqSHlWGN0vG18OgU2Q05t+hs8VFfNQ+JVQOmC0dYLvMAs8cmwkJxpPREcioxy0EW0UisjVJJ2PRn7+RMdtL4ILMW14YtWd7IigyMY4dL4EBpTU/mqsVhzQjVjxFMM1zl3912A4LPphRYPaFnl93XEDx8k51B6Dt6jpWZRyK7+weJF2vTPB9c6OllRxVzy7mLt13+onVB3FeeefIyNYsxHYxTjBBG65xilBmWdRvb0RFiRhYGKD7wxD82Bf9Bmc/hPdJ4S89MYyDjXi14MBjXGzsw5M5bm4AFODiEzLEzhQvbO3KQsOzAybSc3vBkNN3UGv1+SosOm+372Ie/Q2dmyVXgXlxBzuQcFReCaRDuA1b0Kns7lVI3syk4exAmYVgY54onSVj8rLpjIRvnfuVMfEbAFerTo1n72DrW89CTYVTcq/ufrKxIrtG6dVtD0UPxa/bHseHfoBeIen9goFRjJJH8wyp36Dq+SiHkEZq5DgVU18fF9LrfASo+e34Rb4FDgYkQtcFtzq8fAsgSnUyldvaE242UZORQGapcCQgGDuXw3n6CW6BFCzIwTWQmmwYtMpcyRSeHy4+7RrxAoEIRosrx5CUWowO3JN8UUfi5IE1eQhQ5VEy+Zc1SIToK0wHMYsqDi0AWjG8mLJi/PZA6Zls+7jiR4Dr+jk0OC7FjyaiopNxsoTtdyzhN04ibH8PAlCRTwbs37sslCn7vxi4vWlzwzfcTY+tVasvli7XIiPnuYv/StH7q7jbI6T+Lt1Rec640VT2r1F4oPf5wvzIfk+PQMRjGmqajIlqdyXZVvZNn3MsPykWf8CWZnKnvLWCVEj4ippx7tfAJvVGP6MRbm1CPWyO/dGSUPTuXCB6+q4JI//PMKsV5RpPzk4QVLN5kxeu4uQ8Rlryi79VG7TU880dipl40ORNfBALzUtKBGmyBYwJJfSDQavDQnZAmGpuud8wIbwYdpZn4IAw6b5tMOXNlhF3zGhaP0hBIL4l4mURxM2mZPLCpz4+O0aFrI8TKOlU1LKRUnCM58h7e4SkcGVGCC8q8eWotCZmreEj1nReyKUfmcL99cMABKHIXTRXXOEJgEzZWVO0WIXBNL+KYZRBNndS4ESoI3VLdIOaHyIEA/hycPMqEAYZcxMD2Eo5Yt8TprCp5dSoxPaU1ZP/0jnVFNlxtFXqQVVZzggaGLtyxGLnY5HSqjGDRRvLPVMrP6izlivt30ei0gOdIbIPYU1+iAPrrMLPXEyo3hi5Vhb37NRVpfvcKbNlgUwoYNxuPswqJVxkjGgX3sgMIwx0YOuqL0Csh12A7IcLoiw9k37dOVmBBErbzwwmAhCAcKUE4smQWeK/tU4abIk6i7DHxTgGVPy6TyRub6Qcd2ShWA5/HdRY7xInWBH2WT09XijQnOoXpy65PKpr5nvGCxhmUdVtxhbX91S6oXg19IegGQFivffIlQKDa8BA/mCT5Kf3IHs7rL75+ZsCuIVXdbq0Hjcl7j5ZSjmRcyoZ9kyY1uJSuxtBsJBeZzAoozLfUg6zt8xlU6MmD/njkvxiZrkb0cOQeTB/ildasXdOQBRYzwwMMf3Rt3pXgjC8FdJRB9pQi4ccYtgnSP3KQ86YEwqqvuDnpUBpeZ40a4/dyEMpIUmdVWZ8gyzLJHFBlDFosyOHzvO/pIG1NPDBM26EABllpiqKLlpjh8zI7ogcu88y9pgch5p55gid2h0zy+rCNuf6JuMwrIeJslmD9/8Yt13teZOly+yxbx7/74Zk173eupKw7sY9pro476IcdsyGDczV5klHqBWmS62ZQIcneFlzukk59IJbkrAZDl2oX0KBPqGcctsQ9Ze5w1BYUyYbFmv7gVJcnLQqtRwNlKUwAlm5XQwicVIZFOKC51IBl6UFq3WEJI8byKbuvWiU2bn2joQwaNnr5FRYe2VDK3PbB7h+nQe+AlxpJJiMeLqK1YsCBeqPRRYRmiwUvmyZCSv5Bd4JF+ia9ctRqwCMs5TU8eSidboDMG+ZRAxZZuKLBbYCuwdiP5SJ3UFyXGDFcwT6C5mgFrP8At0akyrVeuG0BDoGKczCc0+8iPYFQS8hxKq1LTRWuMEA2zcgPN8YVNhPLCI8rxX0JzWjFBnH35KfTMpOMBT2H4SVtyZg65R/Oxx2ojAyeDoCgsydyjVvFobVig5eTsrAe0mZ+Wm8Pgd2s8CyW46lEX+QIdRP8yHU3LyjAU/F+1kOPbMm6xMIQzsEmDU0Zer2WZnFcde521AkynjnD8LaeScAbXBeec6gPvTzzmCL1Q5ulbypv9YkBpr7xmnRerQJMDBWj5UbaqImaxpDxmL08xGlA5qGQBMhARuQWULFjh1KPeBlNQGJKsyFI4usFBIMoxU6sKKcJdSyAoZJJBQaHt1XooLMpLXXAgT2EKn/qzc9eu4olNmzgwrtE9b76WicZZZCgu3WXbR0SZca4JkwmnxVRds1goBXaX1uCkvOCg0Dx1Jy3LyyyWUIJmvkJcDreTfMmH8roO12JaOuSPTNKFpgX2fmAfqaNcll1ocyDv1JRTnqYNK9PK0UvADI4WPATBX3WRVvaHcoayUjIw6x9uORwuCLCoMCoIC9TWBWWaAs6xSMOREgw/F+HBVOQz8WMmMifgBY5dGaxnQOthiq8CjpVZ42592ex/pLrXXHzKZYWUGIVCeen+oowczkceqNgsBEHxOISA1WD/U8syOWWTVpdT+lna+bqXnW9jFjiMh7+vKSTOy6a1f6k2VFz84rOtuIyfOXNrmbYvHiW6h+n5Y31jeZG2NDKVdcvd2sOqrjbp8BUMWk5EVpW52Z56yzKw/CgLUJBveuoBDXef5e5kDlldazYQMDblrC5KLg+BiFVdSZ5uWyIhyhH5MLZ1ucrNi9x1gDDzLFz9DyrPW558stimaaE2benr0Qor+PKJGIP6kL3riF4IkjsvXErcc7AwQJge9JCswBaEYABTPLuJVYMRNQB6mAIACwNHDYYv6myIijuEUGDFpBHCz/iASw94VJ71rspj4IvO3scY2JwpdhAOhqEWflzllVDLEDnAj8wJqwwoY4SjBR5ZBpQFidt+YMpAvGXx8E/B6alb+SNIMCuywv1mlDC4QpF5y9oHJP0bALCFz/KNOhPzCDqHJUbjkbkm/8KQ1wYmPTmJkm8Rc+4We46/8YOfeOEAX1vkk6nM/2LAGtTB8xzHw9wwceluf1OLRbA6o8AXaY73Eikn42dWgPH9Yw655wuNfILmldpMca6mpTBW3aOu8r9oM8Utdz3o7y5zcMEyLeuk9bpSn4ThJXHuaSd46yQbM46T1ZUWHyutZRCSmfaOrH1RBjg8IMWRAtIDibiMpHDIAwMdX5fgMDdOzRyVYS1kpbIKQlEWQiYNhkmUqXtk7lVFemW553SEz7TQNi353LJliyzt6gXJutymtQGMcfn5ZcIB8aJHnaII4cnpU6LywK+fqjsLZV+wNd2wgOse/0R0nDJQjrjEuRz8wKnfo94C85RwEmLGRHlR4hQNrCQ7Pa3AY+5Cax4GEvt77Rs5Y+Rnppz9ZjYD8zNzjR+3mZLi1eGCBQ0ywOmN2tygTGoyTC2VDCZyy7BuQ1Cb3qZjbTImjWthhXAxDnm9taadEEq8xbQ8EyHp7dpgWThfitAzKp+e7taJptONAoWzKReCTwVYhqU3ZjyiCMkYXTAqG6t8cHOQANM5GKmu1xcTmVKiRaZ7SwtKC8t51HzniWkovov8nv/9l7wvmYMAeqXkQ9oKeZv2LK+/9W7tWHrc66bf8Zu/oAPqOTqoR2umd7mVpdv9sLZHnqPFI1RK5MXUEp9J5egfn0YihUJpbxc9Fn1EOUjq5C9VsDKPdlBA6VJ4+HS3I4UZjjv5QRc5FNFOtay987UcVVbrfs3D9mtKh7XHMeUHhitsUlpoIE/9ydmiuFQO8clsQH+/7AiawhqSnDu0EIN1A+ym4uRKXgJ0NJ0d8ZCiCaYLD5eBPOWosW1/AmdcZMnlR3Ib4ARSdKNkQtDM7lbykXCE5dpOVEMy7fx0IprCNG1udmTsFDrjIyNnBCUh0GRoDq0/6zhlNgBmT+lODuD1SPKEV4UoRfWCfVXGcSlx0y8ljXnUBaXbOtbG1A5KHCuk2tvlV2G2Mx8sQaDYtOYok+eQESzKLM3DKohiT9B1E657A3rmAqvniYrUCk8MT6PI4PEjDjua6GKzcR9lZivh+lvuM19MK1EZOVCAcS/zvXSXGSMzrUE3d6NaU8bOtJgoJFsPzzzpWH+tAqsvedupqamN2vrI1yte/3Id9aMzvrBWs7Pp+1rOuUEWcT5Tg6JjleaAgf/j0tcaxlga2fhCDsinvJJbj1RSCpEHcMbTEx7Ky87wWwYKgM8GM0xKZ74+ncLnRfs1jbMbRfaBAil9pQIplUgkobJDhoqoFXcx5BjQuuwdOzT/rHXhHF3DOJd56EHRyy8MF6TiqQjQ4+A3MQjIcPtTPasy5zCn6RznuiAEcHS5HoSz9R7vqhIvB1oSph8yiTuhmSaQ5JbTdaclshS4ipRCEjMZz9IqPTM56pGmUFSkejg0AqcFKo+h3Aiwp3QQKa4cCQWzoqkSSFl5obPJmnHjmBU5FoO0qSVGEUalzO1jUl652QDhFpnKqcJ0V1tPLy/VpoqmlTiljRJaiXmiyKowevKrXy68SbAy3y2KTCzFzbhKly8/QO8UnY917BHLtPXwMZ+ztVMtJN3jneoe/81Xr7aVmTXWGMCYK+bCTUvLvPAqLdBgXpd10SzQ4ISP49VN55On5JFxNq0SH03/gbrbfKTtHE05dWvRB1sZmb66SMay44XP8kwrHz0R8egCqWc5gcyEbwC4IiAqekbSMwfLYWfyh2gIF1weG4wWL5EVfV6xU63obq3sovx4wWK19ioqlTfy8sYWyZJTNsBlJRU9Lp+AAZyushS4LAclY7GTD7npOXM5W9xy/upuAeE48hPYTF25e4sXQqqLvOCnXIn+ZPgMYKHpxaL7ZFL4I45cLYFs+JlyVegOqkeAVwHroIxTwSrXFNIlIOO0ZgVoiyAcLCgVyCWd48lrcCgxQaAgZIzpHierRR6XIusIe7dOTSkwlZJVUx1qiakUscpLCxxUSakQ0KAXDR0vENCTVpi0Hb4PRSYeeFOvBPPDCUiGGS9cgrprTLp8s4kW+N6HHlOFnZAl+W6v0BJn7mazKosuNEsz2UZ4iuZ7MXbx/eLbta/4JrXMfCXxFC0Q4fB5Wnno8KkXpqhYLcZ51FjFadXpRr9aJ4fwoXJ2SrGhwkaUlBeqFdWYK+5yZPYBIDhCUqC9NbCcKQxVyFeFnyEgwWdDvw7xcejhhxfzBxYVOzSWZYnjqE56ZDkjxihW1nHK6S6toNqh1pq92Q7TOnqs25y7FkxGM+uhk3imjDK7Tpd8OC85Q9WT7PPSyJlFCjQaYOR8ZGxohVv3HAgwXeS8kmKG6pmEVUbBIRKZbsDrvhwYIdMocI34ZGemk58p1eyt0CdDEmKFkFx1vEmsEsQPMFqtjOaubc4gAo4J8CRU46ZuGW9FKR/TZeMSepMutZSa9aSj7Tr/WV3pDioDbrVMKDOF7KdaYUVODS/KLMIUpJ5MlbsoBOJNzA+lzYoLC7A986VQ3jhkrPa2AoSiUcGwFvN1RRZkUDF9RvS68eJOKfTRsmIfKwMYp4IwPr5ISseqr8e0qWG9usN0edl9hBLSyt6nsfQjwsMIhqGLE0Q4kZOpIxaHMG30spVnFMfJ6MWSzwG10HTHW/KAJ/E6RZEjJy4m8gT/fjp/OZ8CEea/WoSkDJXEJF3SthxiUQznWHdJmflcDyvVOGNcY+SJrU9sQqkb0VPAUiyLuXoZjHVJKxRPTmckelq2fcAS4QQQ5ke48dKtdutK2SovWMlD6aFJVHCN6egpAUjqIoxnXOS3fuGrBcvXGl7itiK1gFPS4km09IsxcImCYwaiLTjJM21C0wHrsJnot+Jkn+sNHjmI6XspxBAqxRFsB22/6dSldiatfLglTr3ZecPTndTCFXWrQ5FR4KzEdLnb2llFJKWWIjM2g2qTypYMXVQOLzpXaTstc4WLP5jM3OOZ7krhdbQkFl4EfKDK3X4pFBWaM7NoYW9V68qhAnyHCaWm6/tVnb91/N2He6XVIxrrXqixMorNuJlFJCy1ZDUYdKAR01H6VKcWhlxwzmnFGScd45VgGLTg3hsQlOPETsV85tUFEqEZx9iVJwSP8E1FoQ7LNOWp40JX+UWmfgkm2cULUXYCtbLsuV287Mji0COK4r6775y4SV+80HSbooT8IcF4mTJG+a2FJb9R3rJGpmRz4kIrL2DiQfS4sJ9Ai95atwyF2E2iHiAh6oHRWsqZ5KJOpLC9PUIgJOkrkyvlUo9rwoHqeq6wnDUcU8fADi5J1knV3JHhElBSFGRvUY2XkI03EzI4EZZJ53pDJnJouFLmBLR4k3CitVal0frVMRUqFcL6J+WFBofqWpFpmWUEGUWJMXChuDowoF2KrP0eKjy1zLTIVJaUhrtRrnCiT8vsCij6pAFtFBvk/bpSburoOR03HKrEGs/Om4fCneJuL2NXtgtymgcGqRu0gQGF7pVC0z0+Vpv5Odcaq/YTegmgwISDzyqsF591SnHR+WcUh2iMjAzoenvhADwjvzovzkMGpLBUbECT0y4qfUDiaZWV4gCzu0SWwzJDTklWk+Q1oVkGGOlitZTmjYd08uO9jzyi70k9rI048XEATwHZqgyqyjgpICk6TeFFq+vUDc11xm0AkJyuMkMvhda3R/JaoPOye6S8LH/l5edL+SvL1fFShuQusxaYrXcCS2G1YgZnId+4ByoEcrQy7iQExD27LnQrW9P4lEJOJHPAsw7LsQzTzflpzVSg1COhFkEHTH6IDGhg8RQ0IUVFEkyvStcpClJuJg34KlRjXE8LXU9FA98WaVpmdcXa9RxHkaXQbXLTKqPcdKVRTuLGi16Vj1e7Uxdd1wq67BilFIbSK3TvV+SmwsGvK0V0PZGH7i0glku+QsrHdkG+vrhLFtelGgvfrHEveWCTApWOg/PYK8xYmq4zH2ljioilloyZeVGByxWtrhwls6XD4a234I9WKOTPCzHxHMI0uiHlLYUTItL6sF6SD+m0pkVZMNXD9E+Xll+OqUv82EM6AeXu+/8Xbe/1ZUmSnHdGV2VmaS1bi9GDERhIAiAoAC4Pz5IPfOCefdiH/Rt3H3YPdw9JkFxgB5whZoCZxrSYVlVdWqssXcXv95mZh0fce7OyexqeecPdzU25sHAPdw8Pb8o4emD3cO0ub3ixZhxlbIFRUKalUm247nWbdkYrrYnYGIXLTYy6PqybIT/3uq5gsKU7+bJD+QwCd7gBKgGicCRVWME5ZtOsw7Es91bJo3k9s5HTlzJg8pPl1dgvDSCnZEGjaK+raZxeSECEsRzJaXMekzupFLNeAi4YMdQYMjiqHBsweGLIczQfq2B4jcE+Y9kpDZlnqzUNqalkz1xjyGo4LFtp0tuNoAwVtZtBqxGWLD9TtYIQ0oILygCjkEJtnBZQeABmUwK3q6MHDwz/Rl+AoJf9lT6sRo9LT4Gx/vjn77vHpp7I8xmt//7Jj77rjR371ZMz602vDh83YsuiZPmlU5D0UAZYpMGzwSICIMvbwZi9tnCQTSA5jFT0z02N8MyV4TJc3rvvoFOvXTo3fPhRfPHx2IE9w6uvauup5gfYgeVXRlUmTUPJc53Lpx7Jd7mFtuqsjIZ75LDOv9JNcLfmBaQcmTEvsmBXDNB/CVNhF2KkNySBCWdyeIVbjJb4PT3JSQK4jQAS9qUMeInI5aBekQzbW5KHESSMHmlMQH3LiaZMUIlYoLsDfP1U6lXeUQE0UirEpEHCa2GgMkSVFWISOwSgdwbPhszQWobsobR8DNlGjJFrWM1fjKzERMatFlXqWa9oWjLnp+IphbhphCGjh4QvOBTs4M7XFMk8E6Xe42UIzdCaLZr0wvS0PM/SG29o8wey//d/++ferkkD53B6z7C7kMTM/EqudEBXiy0YPrrxc7LLi7ANploXANeH8AI1eCHHBiu+Zll8hQ5ANzrKFYPcvZfhst6bvqUvVHzy8fCplrt2a0PJ1185alSWtby0JX5wCfLQzTcA1Q1V0evl3IAiAm4c9O7cALgZsz3y8KGD3qsuDK9gwJfOt94OSlLTg0O1hKtMVhw/TblPavihr7ErnTTp21w1UqUXSkubBUiHfMkk1gzzC0WLbXJPr4MGt8pUp2WBQAhwQqon6nBbaRoT46RxpBTX6lhYUZnwmjBQVHT5fDwaL0YMPyqaxqLGJUOmR2YY7Z5ZLcTryRqmYtQaiarx0aCiZ2QChUbDkB2VIhc0rDBkjBgVRzeJjGBCmaUpMGJ1J/byiVocM9NMUrEuzE4vvprIS/28qshJJpzOQevzGy7Ft8ostZxqkkgGZoobmHMXpemyVhpw0HGKVg8b+YSWXyEkX8FYo1Up6Y2g/d6J9VAHrX/w3ofDx5+dVXk9H149xoH6G3qzK9akmVRyxyp5Fm1jjZGOqqrr+VFEDtX0R56Rysv5TE4e1ke16XXpcSnHuIFE2VhTqwplOmeBS7qWUIAt/MKtMrIA4TsD+PqB47KVT1C/Tpph46UxNKj1wMVnRPwyoRQ7kz6Ljoz7hNJLqVNwxuwJqcPrMcm/moQuQgS3GXWUDRUVxjyKd4i7to1N6e6B8aEBn8qlYegZyYYcz8RMbtHDMbSuYTVLL9Elc0tVGCX8HzqjEurJjgWnUWHIRAS0wvImYeJzN+JWyENrRTyLLH4sP3EaJWbG0ymz2fTWXhoqeVZGF+XPOra4GJmxAaNapQb0GA9ERhwbuWd/NdmXLIUBo8CCpjmMKV9C2KnnXF4z1KLt8PmZT4YPfv2RzxM7dmif3pPWq4cieyRcRgwYKCzbm0epYgyXUQsZKafUl76UMSdzovIB7UE/qh53r2bguemaRnDvcQbXWicPZcRsklexbvnoAyZJOsGDDwgjLJh1IOkbqRLgMpWHLAFLJByKRSYJMEllEgtAFTcU23WInzKbU26dOsPukVfmW0jg9Q2iYwPYOXHFgaaiNF8VFmmKLDVipQEHJ4xXTV+Nhudi7NKGrJ6ZOzUz1J6dVpg464QYdxgyw2p+NHLRoZsVyMYAxEBuCqT1hgwyzgkRXBLt0wsTWR4eih+TXeLeDAkD3ymjEUY0EIdcKAoBrbC4RWEZ7susESMvXC9ZZBSSHM+d0ZKUXsgUaufYYMFz7u4DB32m2PVrl4ZfffBrvXRwQ8a1TzPocagfz/oMd12OrhjqRzdO5Y8bKpOJDKdjXqMEZF7kua5VPxjvXs0qH9UzLu8/Y6xoRH0zZ8DNofItbsGoqaxAC5eM7fnWewkq7FLLJakCITLza72I08GALX/u3AOT6AyTCvEXdJBM6h4WW2pZAgppRlCKdqoUpiklrCXN9DWnVAidtm3EMBZdDavdzyBHMK046hk57th+DrMhhwE/1ZDMs9bqKbz8pGcrhtY0jhhai+9ED+cAYfrnJiFfs9ZtGcfJzkUhGnVanmP6GBIbDM4NEpFVYuUXZpQdUMrHzkmKtHgEWnqiGSognWEpZRjlRj5cK/IJZixCAql8ELhr/xG/hXTvzk2ta388fHLm3HBQhw+889pxbyrxTLom2eBX6gSzkMGIAqNl1BQNfVQbAvKNgbMktFsbQE6ePORlNE6SZERCeVMvngegrPiVS73FuDEtUKHM/Y46k7q2KchK+p6wwiBn2EETc+kSCjelTYbQwKbFZg6JOvWcxxmzKcYXic0ZZbzACJu5llStrHCEqnbsPJPEDyOOyqXSgYVhzliOURqIEI2nCi58no35+hvDNve+GLIMmLCH1Ex8uTfOHpkHZP1Qp/Tws3rq0wRKJ90OhJfPqE4gz1Cmm0WdwUwnCTcaLbGOoNgYpAvKNN4VTxK4KBnUaVsQwC5SIkh5ypwpVH649CpMOoa2vltH6+jlgscP7w2//uAjLwtpl+vw9ivH/KxOGTLUp2xxpTJh6PkxH+GdV8Lx7jhQjRjY7qF1o+A1xeMaKnPCCM/NqBY3SqFzY1UG6wd/O3hZtGT1wjN57k3Lep5a8WDEVVwNXGAtcPCKdNAcQmnoFggAJq6CC68TFn6gTGMw3JYrsm0hC2kVfunZpxcseZNkkBtlCQRCkUXROEklEXZDY5BIAX0HL5K5L5xqOOOyEzDReaJrZshqgDG01hBPjYhfrCPTI8fQ2iNZ6wRzae6Rxpg5eg4y0zYOOGdjuqPo2UBCtgsAMUI1gAm8Bh0xE2SvlVuWVuOdgRY3uXs/WYPzp4iA4hL/EQ40ochwucFpuMy7uJTlhbOfDL98/0Ntibw/vHn6iA4S2M2OKr+V5U0Zoo26SiZi7DqwPPTj0yf0zuBp2C7dSPdzsPwN7To7pPek/UF0TTI6DVzY6VJGG71v0FuScMgDF6rFzvEMp/dCoy3ajqxAjdYCljDvaKxHk6lA6Zawoob3WqvsTCyvBAdyxUgt8sKkYMbw9kIQiE96ZrmMR8FaqYqswUY9ClSyo6qFKhTbCWQgOU5RbtOIYQgNy06qb5acbMBiCl83rmxA7pE1ubVTM9aeuVbDjGdjGbaH1bF7yMZJr568W34UB8owj+Fm21yBAnZdLhdAAJSOTomNN70/KMWFkHySJPBTn05Eq9NkKK1skDUBVZIyWdKCoXtc6a8HXRvu+vrGcO3q5eFX772nM8GuD6ePHRx+8I2XVXZ6eUOvNBKgHEN9MhAcQ16kMaOOgddNl14UGkY76Mkrlgc1QXVAJ5KwiYXelreS+hn/Ml77okeeXYiz/q2ZNVigZOlEZKvrjG6OuowPMFRZIM0yaQ0YZiBl+VQ0e2AKTqDKFKnpCjQKKEhhLCddxCr8TKkWshqxCJbq5ZorpbpMQTRhmcaG0VJ5FIDXZRV3GQnmBjRKWx5Sg2Ay4Sn4khA7u2JI7WG1mMXQWr2vZqc9pKZXphfSz5tBnkdvzB5rPyO7DLLg0yvdWav0K3RNm0RocQUmICLl4IKOxNVAJrwnEfMgR5SnizEVMCxLEqOMT9dkj5ti5uUGDnzW9+i9ZR2ju3nvzvCLX/xi+OCTM17O+v7XX9EZXjv9ooUNUnxUqqYJ4cQU59/lqdsZxmvFnBX1wPEZFHrb/XojC6Pdp8kpdpaBR7lTzxhvqk8JWEY9+xYcOXaiq2AEIhamBUZLDfzJNQtsAlsWWcQb+c/xybPywRbeJJtrQJwkzbZkaJH/hGslzxmZDQVcCBOqPpIIL8QLGtAWZfX8FC5eVFYh268I+ArTkrNCXWhZYbXBgwpvjWQmYhKFrWi5w3tLJqzVm5J96PmRZkP2unEYcExyyYgxaCZT/LKEjJnnMT+TTaQ4giiG4YtGXLiZeRDLkc0Ku0AiBgqr062MDAZKacinbDoXyVEmz7TE4w9b+xkdFvDphBKVnkwsrWlZaEOnPD5/om87/fr94efvfmDeHB10aJ+OtNWbVd4xJhpkBJcxhBnBGuNmFFN14uoDX4l82f6Etonu16klfAKWGyFwDJd8MLSGY1zwFFMdLUxaVRZE6+CoBtRF7vDWl2K0DMuaLEtIWKXDQ7+elcMdIO7GjReUtNs2ieWU4keko3VaXgqFZAo76r6ggTSNARNkBpxFg3B23QpnQb1Cxq/MoqAdDcNVaYUL1ckeZwPephHDT2zdM9SQ2s/E0ZBoTPzCkMOA6YWbEbMtUz2xlz/Y0UVvzERXFGSoq2vpGEZMoyxIoVTeCi6/gQgAb4AWKs5k2yKLHAwBIir91ZtivFSyy6lxK57oITw9k/Kcu6HN/zwAsP3x5+++r7O+bvvVx+OH9pgHG0zgzZtWLiPI7YK/YYxyMF6erTsxTUXhHz9y2EYrmxQeNzn0RnV0T8zyyCBwfr5ZZkLxrowBLhiB+O+B1rQu87oq+KKfTFFjkgh8FKpcT1KJRDsqtMxZz4R60R9z6ypVSGZu5D9LiGhLphBUQKFSSIhwKSVYgMtbyi8SE7HPULGZUfWYhCdolUgFThJgIgAVWvwUZTgc4C9gxGalItQQ76luDp7YUj9HcdiAaYwcKiBA9cprgoUxy2cTCGvKeh+MjzIz0cVk2bLG4WG41peXOwlsLnPFDaxlUIkeQ4PUw7PO6maHRYgVRmvDpUdLJrAKKVwjVs+ku7VvmRfp792+ro0YH/tD5iePHhh++I3XNMLQ7if1uhyyAHuYjMar8qm4AvCLNd2QJGxJgmjmBIKHil0IS8pL6aai7jN9fFzpeKWYyn6koFCHsyKI/LlbVm9znGVxdDW3YmnlC1PAWV0WmjEUiSF04c/9YjahGpEquZi1hy0DJqkjUYVacgt0VB1MweXiBdV/YZZf7BtNlwCsRangdKyfqgk5BnhZBRXuUh/DpBGKRW3F9HlaLDuJwI02exYbrfDLeNdEhIGCE7PVDKtH3Uoez8TjxFZBex/h+hdpUJORCoU/NWTyqxtOsuC7O7zChyHFDS5oKt1o8Kd3lFvTp0jWdVD7Ax1bc/7sGX1B8Yz7gu997RWdZb3T67CPHwe17w0uHFTMclK8yqU33KVGa4njJapO+mW2xpQEgaAfRmXjRYHCbRlSoMEacGRVoMIZU5aG5m1ma4MemZaYZUwpsrZF2JWrsk8CPLhMh9DLuAAb5TUGPWrey0dQcTckiAMnUQwq+Eg2kdPAfZWm9sW39BK4T1HLWGA1SXePVHzDeGFFgZFZ6j/CEypLXXkRKofsVW/My/+euXaDDQOvYfUak0IylHFYHUseNAJ2dGH2bgCVPwlFkxcbcWmHMgp39BEhYwoZTjiGq/UMa3gkmry4QVQNlN4Ww+Wj6+e1LPTxp2eHa1oWeuX4weGo3hhiA4W/KIFw5DASUb78h1qE+XHTyjTkVG2MMg101OpWQupXUfyWTpp+jstfMN4iknycrxGMlAqX35Ai2dcmrIMtCVZ5kYRG443VgI6iF9aBCVpPBGaZCXWOPTHgQJ0xmUf7DCQ35Lhc7VNVvUmDBFERJtFWfBO3KBrpGJhSF2KxJq5wRSmIQjEhCQBc2YEFhk3ZUYWVnvVsko5bxld49Mb6acdHNFQMWYzaLxstOMCq91WkMex74rqTZ5ZsxNNdW41MAXj0Oe3jxV+5RB9PPNHza7bTVGQYXomXbMAFxDPkmpaEKJcb1y4PZ8+eHS7qLC22J37nrZPmEZ8spRxThni3fMPGcpEdcKSB21wXjLQuN25gDXMaqDT5ZiG/TVr1PDNrTaTjCay0KefF2Byv57+IbYhy7MFPT1r1OiGZ8YIuqqP8xO7wJgY8YbadCIx6rRb5BwT5wg25ukITkaSQV3w6eENrgRG9DzWSPqBwPNqKWBXa7INAwxOXqnQpMDViJ410EyIUeoHDkPWpj2jAZcTKpkiB9QYMJyo0ZqRDOXDYvtme38hPimSSh6aazXWJIiNy0RhJPDFYD4Plw3FMn+Up9aR8vCFFz+gsC507f264dPW6dN05vH7qiF/34/1i9CUP+NHrxvN/9bLAK4wuTfKogFUk2kDih/wtXaYbK8MLGzVmDJzTLrvoYmMBr4PPyJZHC/8Fas6JXU4GJoPi0yGiF6M2/JF9hyi1fzMDRlhxxu94E6Y8e1CnWwaLeI5FPNJaqAUWuRT1RAUBCw5FkzRrEKYRrKS5uGT5tEPuOrXUNJVa3ID2UqZYJMWwGoOVIejg+ee8sSPmutqngtDOyx/okT8MlyR6aGDEWyaQajqBlDbJ0tRRAABAAElEQVRxwJ0poNkwBfMfaavoOibgUiIYKa8iPta3g86evaSjbi+5Z+PbSRzfg25sxkAFi8xhsecDspcto236GtOqNYmVg5aXylP5DXMxULQoYT3wZ2VlKopZjrzxX458lm49vEMxapNThHO/Jyjk8ue4jWMS9bQdrvVSfVEuoDS0iigpDHhLQR3HLYPimoIoSKQhJ1ir2GQM9MI4e05sTSUSJkQglEvCkWElTPyicBvVxZUFRiWYTfLqKIEYhcqHqgzXODQMYIXUEWb6CClBI8Qhhsv6eyIm7OHl7GMMmTCVhPx6CYENCAyROfFjpzYLe8ug0jEEZsRaIwdmXZnhZapsdGjhKlegcCKHY95box3JWggZ9GJMal3U7qn39SVE3idmdvnAXg2jhcm+5dAdPPXqfiTg2b5GFzHhUnIoWbtRhYC4zJUiP9JHhDEUSUuvSYeH3pNRjHLfO8qid6v4T7GCooetomu8QQap/Ao3BAI9x0nCQqTYLCQovzbgFyq0QLkIoIFnWSpxjJRwG0ZV4oy8cCLXkAORS8Wi4FukwC09kPOapHhmo0vjzx1ExtjyK4VbGpVv3MCJu00yE4WNuBdUST1s5Iz0SYojNO4cVmO8rP+6gSM7C88+Yf4No+dOAy2WLQMhog2pkwcZD9QiAG9GFKTtamMUPYarRWCdxXzHR/VcvHZreE1v9Lx2SstFwmb7otdpoZQcNlA0A3b+xufbYK68RaCp4LhkVZ4VGHEKt/xArthSn2x7BCPdG88FzCyL9EqnusFUdfUltsAiAcZB5hy5mPaEc5yOh9FbugKEyUzhKE6bDHhBp74MGIL6weE3d8hs09+lj5UR74ojxuKMXOWXyYkEI5yjhAOeUNM3dkViAjD0Ez0VBJugYThCmIo2ojnGyEAAAW3S4BOFSxAqBKAxisRgUcwrlj7UvUtGsGC22j2WdGO4J1fYNECHE33N54ZyIkht9oABuoy8AxW4wJWxMXnLEKaORN8k9Fx8f/OevqF0ZXj/0wv6RtOu4YdfP63lq3gpnhFEPENLFPrL0OtZ3vEs5RKYObGuVrfy1vnG/YI6N/4Ug2klaSvjHSsxxCWDZrzFcLt+lr3bDWUOXcJWsohKWornm6f0r4+nlV6MrBxGf/OXD5/ipWD3DFwadKkrtfkSCaXAspw2BaNHLO6tAVQFLNzyxrzEWi6U00xCWgXiVMWpc3JpdtYLSUDS0cBEGIZOow14YHV4Db8C6S9BmdacEMSUXUz1ZhMkPVnEkR0/OGPEkRcNT6Wjh87S31lQet8Tt7KDcImDD40fHpx5zVcOLl+7rs+TXvLnV771xvFh3259zU8bMR49SW3QhV7Wxhs9L6wFtutllk4oZyOjTMGSH8gNI+Jf4DqyMHPzX3njSt3SWy5lGU5lCopQfCzoGZfoAFYmT7Ely+LgSVhyOGNNJTvcv7053NWI58HNe95Kuufw/uHI6yd9tpkLeVJkoXRnwCWnxwqkSvlSPkqKZc/VfAD07Ak3Aw3sSm4NY6FQR40oADt5hPxLEPBo+MaIREToB0s3CIuUJPkEISXcnoeTFw1lwitZTjzz6iCdHgEdETCIpwyrSZAy7snw82dYF/fkloatZazctb1f2j0QvTnD9Jyllq6t7EKw+dpw1fOjxbOnj4dr+q7QZzpPmk+dHj+8b3jnlcN+ba+2P9ayT+lWOpmlFB9zk0LwBGyGS0EathQzcAPjhddgBR8EhIyQI9C8nKNQR57WFdoo3zFhFlJ5LzrBAFdeCgF26YqqA0VKJRQivuodt1NvTz3Qd6GvfnxhuPnB58NjGe9LjLZk1Fdv6ZtPP3hjePuPvqe199h+ayJfQspowL1UwuZfwGUajKwqRKNzYUIukjaMTnbBLXn1Vl3sy6+aMEHfNwYHX+eFDLDRl0YzX+mBkoh4wdJw141hAhJxJuCLYVPpwY88vtCIe9Epo4GSTx9/pqWYR/RuEhLDVPltcogw8NjoEfLZ2KFtj49jljqOv423nWLiK/B1dZ1gyIj1bLZ8Jqg2Nzf1DaUrw8VrN/X50nV9R+m4Tzm8v8nnSXD5jAshma+f05xcofAzn2FQlFmWY2ERrXD5DbaQUhgzP/GgE/+QMUNRlHyXqxBlQMrEZXQGDZRlKlEGOPK2woExSe3FZjvi9snN98bZK8OFn304PLxya1g7qJdBTugD5HYvDRuaNLz9d58N1189MZz+5utSnaW/cJU/Xp4cK8ZSiQupFC2K5pO4wvWK9iiQKC29MWUBoKSevcO6zAqrRwlmaqQCTuDV2CY+2JF1D7nd46NYNHLviaZRQINMvMQP5qOQyOoYDz1+sytv/TxRJbUeT3pET5yzu06LIVeTJBxesXukryvwHLi2tq53Ytft19JT3Wzce4vH44f39dX6G3o/96pz9/KJA8M+vVPLeVp+R1fM65tA87InrlyHoxBwABQugy2jqmRQogp7CNByq+CV3vnIIUo95Y9oNWjCzYGYyobxRkqVR8PrA9Q97kUqNbzliFVGpE5lo3rofvF9bYb58a+Gnft2Dbt1wAFzIzxWYZOml4z14/uH22cuDyfe0UfqRBe6F/f+GTgomt4jSqfAcl2d3/4yCgIKJxEmw7HjLQA4Si/e+L1wkquwCM9d0gWJrkVrmjCAoq8kWLiIBLDhl2wQCGe8wODjiPc85nEj/YYXKvHJs8dtcoi11vjx7BnGvfY8XqNzLqxz3Gb4yv1DPctS/hjyhj5Jwgv13tmlYRnfD7pz66Y+dnbVnyw9cnCPloV0mLl4PNDbQmZVk0HKXBypG8tBZbbgGK/LZ5tAcsMkgQbaIVSB9qCtwhPaEdFgLsixjEBsxktUyrX4SBpK93HCZGT0IhIsI7ydK+1smtkJlUUIB32tl/izVHj+3U+Hyz95373sU53V/eDCDTewHVpf38mpmfCVIb+kIfbDG3d10300bAg+yL57NxlCh+GhD2JX5WQOt4qNZ+UFXnbyIjTGGzKBNLQqTGMnqpMmyGMkUVolRArQqD60mmo20vYhsOtlhlbI1jjKgGwE16AiPupFovC2I6gX+qKwBDzDGGWwXraxEUtT9Z68XsjSzboM1Gu14AoeOsQd2ob84MGw+dJdG/LuPXv8IsQtfYqTg9839Hz16vEDbkh8ZJz89KdXkGGWuBji+aahm0oN4SkL/1QQrmP7ZAho52bRLuULBxurrIzeeLdklhUFfrgXVdSL0uECrxme5QheYkKYyjVGdhg4YX7sarv43tnhyk8/HNZ0IMGTew+G/W+eHA69dkLvU28MNzWkvvXhORkxN1bR64b67L4O6tcj1piPEIA4G7DLhQtOnugWlHHa0gt0InCewniS01LslvcSl3JjaABJ8RrVNesZt4ItyhKERDKRSIU7Y9GizYhXGaMLCJ5Im3JDy8h1Y/eVBRhOPbLx8j3j6Ik31rNHVnxNd2cMj7Kr5ZxQT5UuOg4yj4ajD5jJoDlP6qh63V0yYG4C4yt5o8pjqQPT8pJ2Y3mpy8Xpy4gsuVUai/Uwov3GoSp/ayQNs80s8C0dJwlzzVLjqRftvTIzoe8jc159msLQJwrlziMLBvhUN0nS1jTPwDPv5Z9+MLykL06s6+zr0z/63nDo5BFNXPFU/NJwSNtTP9Y3q+5+ennYOKizsVVPrkP5OERYTV8wYCYuEdrrtqShCmMLJ+Ke3mFd0ohi2IzEDikVsCg4V6VAY1d+UEUMnplcWB3LMQWkPqFRz8kbSRkxAIdFH80zTLTnh6pNTSTN4o3pVxHwkJovLUTvSw+8/my9GTRLEOQUXauXRGxr5JqsenA/huQcO8OIAUMmveEs0zOYOoUS6IszSlNXeERkGYevBoYecqVD+cruatfpPkfq662lWcZWDMFMRaZEk1jVAbvB6GmZR7j26aXh3uWbw+u/+83hwZ0Hw3kZ7zMZ9MGvvTy8/nvf0jG7e/QBN97BjrHxmgz7qJ5377x/ThJ1GAJOoquu5lrkEBqMxCSHq3oic9vqEuzNgiAtuzkKqAqpg28PZPVsUEVadPYL2IRNAlS6aQXtwxMkRQJHGOJZ+IEDf4ZDxCIc8LqKRkRLG0ehfFk/s/bUR67KiGXInI28vs4mCg2ldSiAl5GE5yG2lPCQupOnTsAH4vhOLji99paukstPZB41nH2VRYxGlJA40/LakvsXTqTO4r/kL2FR7QF9COsXdZ3xnqRwXwCjvHC1nXVEz0wnwCITl8cObqR3rtwcrv763HD9r94fDv7oLSpnuPLh58ODM1eHQz98a3jjD7+jpaH14QnfZfaSXvBE5i59gG5Nm2ioawwXnvTQTW1kpQrt20gts1Y4ygD9pqoCCZf6VnSF76w5jYPkcH44b6p03FM7mYmwItIUNuXsIjTSowfYEhOsCXHFlje6gFZjrUoMBmGohMnO9spgIvpLRSp3THA9eqYv1MuAx9+GT2Ks5SGUsqGuUI68u9xepMlSIw9NWtm0eqQeqlQXGZe8aXnbLBeRl0Cq95lV4xLMEbSoTZXiiGPIIqIRxnqPR5Smw0je1MFgd+iwPlYPeFbl6xFn/ssvhqdajls/fWjY0LPubfXCrPPuev2Ye+M1retyWknUm5TgnzrTPwa7Qz246xJ5rAvLyKPBZSlmdoRFo8xcBB/jFcicEzl0j8iYnny7jE2D8BZN8vCJkA5zSWArCksLPadMlsfEutpNGPJyNLNHVKoSgboGTWlSOlFM1SjnDQ+KPv/BIYx7hd0Eyhe4LuWD/nI8U7knVkPh2fjpUy0dcRCAKh79o/EpR/4fc2bi/oKQPiOgpoxCa0UGAFzTRGqVDzEvwQV4vKboYrltky0CcTJNF2/Mgc2yNtdhltxIW6D4Li1ssAqBbAe3spUxRc+hMsbHmsU//+5nw74TB4cDxw97I8aannGf6nn2kXZYXX94YXhya3N461//wbBbw2aMl+djuDJCCpcBi+KiuOS6B06kau9F4WNl3TuqcjzQFI1DVjgZRrsImgmHylSxszxHIB/bRvKJFjWZC4qU4DNyIVSwop2mEiujRSV+xhRZUZoCYA8wUsHGSIWSi0nbBXohuBIzvBSvEXxVgemtw1wzL/TGj59pdtK9sc6d8tovw2kNt5yZMGQNwJT9vgC21g3c6mGrTMo3l7FSxaiUoTQKa+Q/N6gx5UWhjhtskZkGNKdseSvxUimoF/PccMVk0oxnTHu8WZL1KCMmjTZx7bNLw+VffjrcP3dtOPbv/tSGiS3ZSDVH8fju/WFTk1eHf/j2cOj0UffQGK+dPXRVgH/94En97tDz8DN92+mlXVoRmLxxNuYtn4EbvYhtxgHgagEtaiEuS/OoxJHhtKxTMZGHS/xCR9EENU5mXvj4hdzDCBeFQkIBy0Y8gg0kSlr5CoabAIpolSyRJBNXbqGJrGtqQlJMyixkIUX+xl7JhVGqzEz1Q3ph+bGBg56YPc5Rj/iax3yhaPI1zcsiyaTIrMOKcktxL+K3KKGDwLo1vgxvo2C3lFnFUGojbhnPapSZjsEWqX3RAMMIP//5R8ONv/1Ew9wdw/6vndaklGaOVRcMq6kj97Ka7t+hG+wxTU6x9MeoKfSMKzwtw8wlS/wxYOeftWCG0NZZCOAYD+XUe/s/wroW2wBA1P8KzTB65VYQLWCUEFZl00krBvhVSKlQ6WVflz7ek43hKQYa8APanNUq3SJvLY1AETXgAqCljHkNkAtZhYv/D+UmnCcRynaUzbMXC/0PtVT0UDuyHmnYxtlUqEZdzEi3p+6KfC0tob6ROCwRhfhlfHqnakQTbWGWbpYpbkDN9bp34Ja+3UDxKV90aOA6V4Ayv6tdUutH9IlU6btH2yBZ2uPxphyTT0/vPhj26eWQvfr6Ist94dQeKzsOcAOV0wXj5edeWnXL83U8Aydp57kHhrCII43Gzl2GmC/yK04GEktJDvoy4pmKNMFJqpSgyivAMmKwGm70HNzBapgBj2Vu5JtS5KHzBL+QSl4p3zMsnEYoQMGm3Hoqh12Z8Gy1sYDymwOaXsFqctPo8hOTKCwZaYb66c5hQ7Oc43APJi1TU51WJK0Am3bOaaLiP1RZWKgumWcbLTAJX3J77vKY2iXumDDR2uCuOB23SEKzOsageHvoyeYjbbrQIQcy1L1HD0aPK6Nz01Y5QIYx7tfQmaWlMsxWRAo0GdnW4m0vMiV62cEOlgoJh4bOr4O6qB+FHCb9XxnryLrwIEQ4vxbeojcOqYsFFdR1DR3AZSiIsn7Fip0G3MwgX/Jz4RSLEORYcms6NhTr3RdYS4lAI+zhBexhS8JTZZYgbB9EVie11JFOjLewgsCVQtkxm8nzlyw5l4yEQDZwhRuxr+xapfRV+kuVo5y34RawKv897VZInZxCixWUYED737xxRwbKrjk9vhzaO+zRbDPlW5tqPHxWe2Z75G69qABNjBRKmfLFk6B+eBg5dQcBN2XPSENMmq/jRaaXxmoGqnyYGDkIgqUTk2oMJ0/DG0mRCVrpc6Gj+DFEQbB9b/PWveHC3382PLr/UGcPa4CAhl1hjhQZEvOl/KVHaRr5SXwDI58LvLYEFLctkb6axD5DXXheDjQG7tBzeOU3s7pUp47t0vQFYFXmQsI/HAD9y/XhVuEA+4z04SLEnxBPSUa0GdKYMA2pLWKYPMduXr3t2eZnD58Mu3Ws7vqeDdmd1uppr2mA7GfeoVlqXhsMVx2I5MV/Gkr0sPTck2N+3QPnxCSyp9pgHulUQWGEoIw/YGPdFRwawn2ao3ExURdXfuLOs6qEO1wFr//s4+Gzv/r74eqZS26gDD227ZaI6LU2H6te+d0250QsblERUQokjaEvynE7+HMjJZtxX3OosYj6Im+hT+C05BcHxM51taQc3RDGxvBiXl8BRpX2gjpdcUdNbC0s2t8qnCorSZnwDfzSgRh8mBh8rA7moXpgb7BQIe/RVxdZ7sGAheJ2a2pYCh5LfGUvIcTXrjxLNDcHeKBMP4QufvYTWQZMaPmvGgEEyBllJXXmtuDlW4CJIMyYFSKcgVnLqsbIs8XakX1eBL/0kw+HM//tveGOTinohCfDzmu8O5iDaaQKk5dSJZOABoyESaIxVl5GdELcA5P4C/BYyXwbCc4uBaYfYZddKwMpQV57XVraEuZR8EsSinEm9XgwnwhYTr4ainK9gqsxl6Z0pLNaXUQv3IUyKICMREHaB0bGp3IAFNmEIUBw1QPfv31veKLJKdxO7XHep4ksbrLwYthLGJ72OZyQibniqmDw76+wjrhfKbQgkdAD03vDS9G6ETnfQmcHtbnZ0yUKRFcAdolQsQkcYAIaPBHLK3L5KLDaRarZkHkpzUL45vnrw8Wf/drPGS6QHDJGYVFaqznOU8iT+VeCI5VjFcbauIYKCsnLfkFeKSApPBZYJP+G1z5b5LVcC7mlCDoCMkzDQZ2uDrepWzWOkoXf2PfACoegMf+Wk+VS4WU4VXTGKWbb8CflgGYwQsdOyw7HiSsvQUvyTtU7PeflX58fzvz0fRtgGd8CeZLd5/lXPSXvcG8c3eftjxielzTrGRZiqUan5EP3nO9ob9VezC55ppfD8JSs/NCD25FN/ZzfJGz3hVgnFlSF2q8ZR0MAu35GCYZZgETMD78CCWnRpIiJ59SkYETLFQOGInI79VxBAXhYgW7KDENqJrk8LJGAMOZisJUf2nDt9aJwr2k5gP2ryOpfEJhyK8qOugsG18KZUn4VsVZMqtQKlx/8R/hXIW8VD5ogf0tdn/0VKBO6qu8JUJFV8MTbUgdwXiTbBRdIty/fGD7+r78Yzv/FL4Z7Z67opYP7YTR94QrVvakshgnCzWsxfOaFhb3Hx+Uj1PYykjoadGB/uhZ/1a6ipxeg5S2yCFKCFMS5Bw6w0cfn51GhKv/ocuDEv/wMmhFxF0SlVUQ+SeEIZKTBKm2Jjw6NpBQqHx1IT0aA9WOWj5zwYvoTvbnB9P19FfITTR5QMDtZJxOJe6okHSX3uo6sSQ9U3eHE475emv7s3/9suPCrMzqj6IGn7n3sqxHBnDFeAgJ1dIUwoxsRvlxoLKqg74wZQJMWBbl9GXO+yyhpfJ2jEfV/XVILRin0WBFuCATQteqcHLgyR4wmtWXORCPCdkONUbQVlmfu3bw7fPJ//8Qjvd0vH9a3jZ8O93hkA7fklS8YO90e6f3cR2ovAyM2dY779Pxrl+UTQ+hUChrjFZOAt+w6qjTk5e+5dl/ZctUu9T1W6zHBp28L8LJTKeGoQhbCxGWc4o8hXeBEODBBQYcXuWoHridHOiqA+gEeddBUve50189dGa7qZWhOMMCt6aVn7n4HdBzJfj2DULhsLYznDSEsVQj+Yp4iyQ9up2a81/Su7E3xv/v5leHIN14dDr+iM6I0lF9+YzDZNi8hI5C7vG6TGrSRagz15IZ2SZbYi+2RtxuG3xIe9PNVbj2rZbA+vQ+DuzBekDUgLuBdZnpCh1OpZShL9J2ShwRghO5dvZWPa/owOUNfAe/qxYPjb53WCG+nh7PuyJIJ4Qd3tP6rF/GHDc3X7Nsz7DmoDRrxcrWxMGA34JTBqK69AeZGjeI5LG7qZEANnx54h0ae7KN+fPG29lqvByfIMs/RuXKwu+gg5YerXrcKt+Ck1b4LF35aIfgZBAM0G94IM2h6qcRiTqYK1mMCI02/yzKszQvXfYckc+BzF3xw6eZw6+Pzw4E3Tw0n9GlL3q98plfvrFfHqxeB2CwH+xSl75qKretUxqfaYXNZz923Zciv/Ogb2ny+27OBHbsIFpOFhK0AlWlwXsCA5B6lK6PuHiQcIVXlJNueDNAXcmaXRirefgFlCwZ9eS5Do+x7V9kIIyYFWdt3o7wul8uDM6YhhRuyH8s0srt/XUtBYDHklR6s2T7QoxSjsH1HDghEdxcuhsE6/lXtjs0yL2lguFu97/rujfbcDCYzxy1PksWjHvKaoalAsC/bWrD2tfJFZ/Xo3I1hQ8fKvvm//ok6kmPuwKCvbFYnRScdNwMFYGimyHKC0gj4J48o+Aa1WNDkbGyjA28rZ0YdQrHr4CjrQtOdEeNlPY2T+ygQFrd5PmYBnb2it3UMyWd/+cvhtgrfy06V007EGJSQlNPEobgK23c/Da02ZMibZ696PdplsowfxPUbmX+BUBGXv0hKRS+IFgCjKjj+iAUvA8Jfdk3Col+GshKW1jfKE6ZEuoms8Oe8+jaCttE7hd4TvhPC0BajX+mWJlUup4nsSWavwQOeZVXfnpCS4fECwRO9fHDvxm1lSrSprI1eYd4Es9FDo/Oy953Qm0cyzjYSlZgWRldYMAmVfCrv+GjEr2WJiMr3iUaYJ//s+8PX/vy33Skx1C+exodEDOBB3w4LM/HklaJRSOM1QqkEhB2+GzfkBgqnhgbgNM0c2f4FXuY3knBnBMisH5MEGJoLXRl+Sc8Ja/S8GnJ8rsmIG+ev+Rm2tfA5s4491etGkw0Tid4cocpc04vV/tQIwJk+gJqLkhSOkCifL/1jSoLfjEcTtCoQjbTyQn4iT6vwZ/A+72OhzZC+bDTKhHLxL9lUFL8T/2WFjPUTRdHxkYAllUcZeylI8ynsNd778pFGQ4dw99IN7wrk5lL60Znw/Psg139Z3tl7+EAzrmIQQ2iyi2zap8ys2TDlAGbp5UiRqmd/PrzyvXf8zjA9u9u5FDCrrBvslJsG/LE4BywMrBRkAmOGrBCXQpWYIesRisLH3EZ+RJc54YG6UNbgUlr8zKsjTvhTFSDDHQrl6QPt+yVuEsFUoKzJXfj/3x1uXbru3S+9jNCveGIkpbNg8BSAAiF3vvkKRgVG/sInvPArmuKH7nP9Bdq+KwbpI5O/0qV4lw/jPqOEKZPtC1yNuYwJdSHnmwT+HEd6Stn8GXW8FHyEtFDxa4BJIMpgAuoivmVJEW7mUV9dYhesnhQj81IQ7+Wq3RzRIxgGSQfByG5Tp0Q+1HNuDFVTM+luo+f5V3ne0LwLp2d484bzRZbpZKRHNQDhMYlF1L0oxZL6zF+3pBxJ440m9PNsduK7iH2BWO2Ujley1twBW3iw5cqX5d2U1YCbNOjkaNgA65GL/aGEUTgKB0W5O8RUWXzZgIVt6MKNkoh3CcSI6tIKAGQrJRvTDPSRb78+HNZB11QUBXxLu7Xu6V1LTvEzjW46O3W634X/9v6w/k9+oDvkfk0G1MTWoqzIuigV2OFMOSej/BQfOivyRVxPNBX9Ai6rkINh5BMcxVXOfuYimPKiMZcI4a1iVyjlJ8sxmvXgOrbUSlrwqbeS70pskQXUCcD1PYEo0gPJE7znOBmnzfFHj8R6Lm0C5J0bGrG1fLeAqWj8rGDcv6ZhstyaDHafDlFf1yTm/fObOi1yz/Dw0q3h3vU7foMIHNoHBsX+ZxwH6u89edgrILV/3wm62FAzgm5+BqYzlIt86LokQ4DQ1IZLoEOrIqFYwathuU3VAIBK7X/ZHYmgqIJpRJMKGoEN810BPgGwMIdrWJhp7tmDrpcX4cIJH3Jml5/peJLD33hleOW33hr26s63e//e4cjLx4Y3fvdbw8nf+ebwXEbKiw9w5ZlGhysPl37xiQ8M4w4YBQC3+qFj1bGVjJtSBIWmEjRq4le4MvVF/SybmfhQ4ktdq/yibKOJSkndhMhrxOeMl0PnWI6/CDVbFA10qasWtyxxq7QenzKXy5xGZHalh/SeeU023Th3dfjo//3vw20Nf8fvSE0Joho1FN7Uq5csBaked+k1v409WtHQhNQzjercDjWsvqtPq0YvKA2E5yVMGTVDbLLdlo9KhPVV+av3DJ3N3u3XzQU8iivzFVFukuFWlGSWcKT6KgL3wMq7RoihHBlBSFyiy4ctioRwh0K48SqoCLShg4IZN7PecOFDPO5ERjdOEsIBPkkPd3hSQTwH7NTzwGF96Ik45x4zbPFxneJ38muvDqd06h89dBUCh2Pf1zCI0xJiBjD4IyN+5LHkhQ4k2fW+8UFNfRLlS3nmlfKVD88/9LDIsViXAkukVAYnSTN8RhITvElkQvkbRWZGvGCXC4DV0lbeCBrJkjxktu9oKeizv35vOPMffjY80M49XjLoe8HGQoGoRb1JpJdmOLOKtrFHs830aPv0QgJtAqNl/uOeeD2UoccwuvY/y+jFhSXHPZpQtRzXIaRSiKJX28RlNAyeSMKmdWPwwmUsj8xkYhBDn3gGtiHHGlVlDN+yhBnPf1BAVAqZhWHTHjqNFXTwdQmd5UugyskwCJ3RVMhIIGLX8jyKVV0hpeFqun/jqJ43dJf05m4x4w7EnZACfKL0o2+cGo5+701XSlEzrL6p2elN7Vv164m0gWAc3K0gQvU/a2zRXCTDmLoEIOh0bfBK/7I+jJb9GlDpnWzETKKirZtLpY2VD+QrcAhU+UzkLrCN1Fkxmg7aZW4puIBZwGMNJKBjxOwsu+c+/j9/PNz56IK33m7oTKpN7ax6rJlchq5Vr1XEtDMPhdmswRyH5kz2qAfG6FjP3dCB9890vhUrHk80wcUwOtrrcy0t3Vf7Uueh0Z1f3hct/GlG8aNtk2Xlt2C0VTZyuK2V8mOvC2QsnShjXxswA5mBqGvZk/JGWNdsAIo0IQkrcc0HvsyQjY/OEdA1MlCGa+tEILIi0bIMCNwk0SOdFHahGNGJLMVxar2n00FEjn+6SgbDXbasHX/75WGPNnU8U+VRiLUkcFPbJDF8y2wFY0Z5EY+l8B5nMVwaLqZ8SUhla+IrEoU2Y1oKlxbp03icVOkRLawZk6XZ7k115BKU8zh1heNaDc8qzBELmPgmysscNatW3iqtIQwqZmp5oZ7vC9kJ/Jj9Adps4ZGX5BUX9KMNsEzzQL00bkPG62NwZMDrMsj9WnN9ek9HvaqhMzt9h70HmpSiPd1Xr23jVHifNhBxnG+qYfyoJw2hmcSig9HfE31hMCZIC7W0sfhsxuSlSkF+BsEsaGK7LZCHOPtMfjMkYVikEqu9OA3KAiQXohNDRlL+4EEitIEXhlsIRUti4EDBHw7aPhbQSCLcsAyqC4XlYY+Wmo5qB5V31Cjr3FV3aih0+5NLvnuS6SVFEmw6UcW39xcKMhNHrXrsryhczPF9o1qm5KJmNqSZCotYc4RVGKvgHb0atBu2QEwuuppEJrB/HeYYnLDtIl0W4Vl8i5C88YfjMWq3XqLfrxlkTnx0g6MteDukNmikKkULa9ocPekjfcYTt0fD5jVNeNUN/oC+jAAhmykYwW1evDE84rtR0uW+emPczj3rnhytaRKPVAXHx8GLTuSxevAjv/OODmo/HfxJzPy1HDuPi+WUaEqAKNxoU/TAHNLP6Jk7hQTzQ3H76jH5sytOqVzyiiTSILNWDngojHHH8NsdvO9GHvJaRhg3tuQ2CbXlCmAZ8Cl9AmSyAFsSlwZLsjDip8MBnUu0+9Shtn+aXvipKuyOlpWCDt6Viz6ceSEN/ngZBnukIbboQP0HdwiJQgsFZwKj7mbAVdGuYUxQevhCOAATcBrZToZ00u2eZmk5YhVDLuMTyqQhIq/nMZFPGgR6luKG65dWNFT25h012niJRY0XPIbAStt/6ihE/rldSJdNDa0xZHrh0qMKbVObNJgvYZ8xE1c8/4IDC9Z1d5086EexHTLsx+p1H9zb9Jqw9z9rpLdbM9a7NMeCfFy0XwIh4Ynyv0sz1G/8+Y+Gt/7ouzqpQ1stYS7l3KTKD2pfV12qXY2+eKicPYSWr2WkkGpPQcuBG2CAPJQaHgpYEEjpQLFWBqnS9AcIIHeo2IYnqCIcV2oMeJovPIUKrYNBaSVgUQ6wBaUPfqI2FPPR5gsZ7IHXjg/3defcuVvvUdILa4h1VzOUx3Sn5sUHCnNKLobAElhpLig1AOCVVvKW+UWHeuTH/jLELwsrnihTdYDQFIy80pPibQkEvwpnAcGogtGQtHyjm+TVj84NN3752fDOv/5Df0nPhtPrAdEWLgw3PgBG2bMX+IGGoA/Ukz327LCGvOx/lwFt7NkdxwYpo8wGrwvmZ1cNqTHqh1oieqRJKs5gfqolH5eRbvbslb93WfufVVDspef5t8oSg2RIvv/VY8M17YceDuhrgKpFet61nbFDi2VT9t/zhpAnq6rAJQCe8OD0yX1aHWFoXmd4k5+JE584zhkRXcEQJN7XqVsS/IODh/d+BtZkW9w9lEKqMcLQMETiSTMyNPOEdoI9pBa2j6VFiRxf4DViyFTg9sTfa8SWI/gODCj54vU/ohRAnz5qptTRodI+HS7mk/KRrQJlBvuhnnnu67noADON2gI3upTZg8bEDAmH9ERdSJ4BjLYFbldsM8rF6Gq1ENClmilxtVLgLWkLRRbFNQj1X7XfhxtCBnievKE949fe/XR4qFn/dU0CuR6ZuLASoWdTpzEo7gHAeKljPlT+SAfF3bqgT6B+dtFbaJ9qbde9He1RN9Rdpw8Pp7V0ePB07BHepRcK9r58dLj9q7OuawyYURfPrD6nChFSA9qHdzfdFojvUjvhk52+cQgFnwmn/eo9r6sjeK7J0R1qO+x9Zl2ZN5WY9NrLrLXoyVNrl+gGU7kjegmGTsITaYwQy3ghoHpwgRo+vFxAlDR/ATYI3BaQBOFCyhB6hzZjqwMGmD+QSQYDD+x0KGdwcQBeYXCdmqCihQCF5TOYZlhuPNKVKRu9eRgQcWewaYyUcAJZHVD1mzuDlEBFc3fm040UuNVSIs/FsQgP5vyXoAX4HC8z0/DmWkzjRT2Fhv4t2yCtcFWpi8kURg/tJS0pO1AbuAV6BqvDPTrhUMr4GMSVj84Pn/8fP/YbYhsn+bq8dCmcwie+8NMGFP4Ep84YGaHj1Y8vDJ/8p78Zzv/Hn+nd3Mte06d35cv1G5w7pdNaHqlHPPP//FQz0DdyaC2j06mPFq169pCY+taLCnVjsK9Cx6j9JpHCezkGFkN1B50FKn3Y/LNbvexTfRSOnX0PJO/251c15N45rKtd8dwdBRB1GRHUVwbEl+9Y0TuH4Y4V5RBlYlfyiCg8ojmV4pqBxBqbiV+bhaYSnGA+SjQVUgjPGQtWf5lmWiyxczZMgYJv8QlepYDTUhmzQq4CmHl9ssOqwFcB3jCqSjAIdt0PnFBJjWFDLyNonY73iJ0HlQbLAgyFmPiwusKnvMMR4ZeuCxZoTC9c/LlB92mLlCNkGprnY5qasaZrF4fQbp6Y4OZtnb51amMyBmhdcjRYhog7j+13z8dX93hkoZ7G8jLq8ovwWD1YU31hWJ/91S+H8//p58NjvaOL0bKWLwT/2OJIj8iNGCPCSDmp5bGeZanj/cJfZzkIHRQnfVPrw080DCdsJ168PggP5kYYikNrfWmLhOkA1OvuYzVD+w3gxdD8Abu2pAqGHW8fMWKEa9W5kxWNkSS8onaqjjI9is7qmLKLj+3RYo0zuYgAvswN0ANjSzGJpQCTIyTiED2Gg1kmjenCiYkqcx2RgkXgmW3yAp7t3Zkjg/6JNGVbJniyMOtAUH9MkHDXxCBjJtnsfTF6RgnjwFljzViVTr5s+KqwR7fuusEhT2ytD/ly3txQFFaBxo9A6m6uqy4w4jd3BQ8/8lOwOe4YN8YKtL6uoWhxZ0Bx8vCbuKJfwmYJSJLUBjRcpdEzYUS84ZGHLVwWt58lr6t3+/jf/2S4+8nFYYeeO+HFG0HsUeYlFs6e8k47ZrjluFEwtH2gHVf3ruoUFeWfSaW96oU9OSUcvr/7SD2w9zNnPfokjSta/1X9r2sTBsNr9HA7hEbsyQvPmAyj+aSJOwGMxTcBHV4no4+dfSZEHdPRBEyvuMugFUTioXr9IErHTRDwMhd8GiOj2FakS/XAa2HFZS7IoBKmRMUcBXGkRlCzd/pzWIlBR0wY+oeX/w3SBXA8FMMm0kEwsnpJ8SAGJ8LI4cKrg09ua+pfRuzN4+DpRyLXiYNIQF7Q5/nXTrVEBfAiBJ9z5PhPeorgEShIq57fDKAROWIsA9+BxrIIQ05LTJmRunANFpm3lrpIEzJVootJjcqFY+0CaSXuKh7Auzx1jB2Mui2EDtn8VD4k8UOwIgYTTVDFFZ0431CFTyO8rE9wXtCX/NZYx9WNlzo7+oN3/MV66hq+DIXpbZkF5kUDelBP0qkON9UzHtaWWiaV9vMc/P7n0cOqzTzWBp5N3bT3aRMQsth99Yg3icRzDz0pN3nqWfHQOtRklMZXFHhGfnT9rm8GjzWZxg2FbbyRUdEtKbworSiPSaYbrjCqYGhg8e+2xnPzqpswOk5+lJVuRDkLLaYhOXzCK1pDyS7lIhMSbBbJJCIwKTTqIXgrzaznhkyvKyQ6R24LxocaI9Rd/pnuwnc1/Nmvgo8Ch13KA1+olqYAtF62EqD4QMNwj0kXFwS8y0EMIn65PizYJJp83ZOTxs3BPRBsCnNr4xuxEFgxws4FATvKo+5DAZmmgw+1obrg99yChuvqlBFnRagnnYSJjI6s04PxW6FEGIxIGCVdev/McPG//tKfJuHzI/s1e3taxrtPz6A0ZPOS3kdeOzms790zfPof/0brq1qi0neGfMNV4TzSxCR7AHa8pOUkzUbzvjivlfr1U6nBCwtPtQWXYTpzIDzX7lB4n55/WZJif/NYgFKM8tbIjW/38lx9+bMr7tV36+Zw4jtvePukT32pel5e2NK6M3AafOG34hLMhiB/u06y3OFqJEL50f7bEDoaXmoD7xlTZK2UJ+XKmBwijsL163gZpJtHGFHgeVigyuB5fDJ8NnKwYSnozmeXPUM57oBBX342+QyHnmx3s/zKCGgCYcSwhazUI+o4M+HWTX6mm33iOyxUKofKv6VdOhxCz35ZDhGgUN14LTPz1sspnshLV6wrbkVKUIczpm8VopK2Sv+K0joZ6G+Zbhxz/olYjQfDVpjntysfn5Px/kJbZA8MT/Xl+uO/843hrT/+LfV8+21U3BDDiLWzSktIGPUxvcjC/mWc248q6SmbLHzTeKZlG81Gv6JhtG7SOM97aD2Y52B0vMfwWR3HTi3vMJO8qqxch6qD/XpZf+PYgeHUH357ePsff089PevNZu1LF5zVmJKVT/7CqZQUrLqusUqlTpnFDTkJR0/EalHOt43XtmIDVoKNRz5yxNWMCTiUPebIamVI7JSGmuGqkOfW4IygEHIltBQzqeKxPkYaOumirWlreuZ5rDvojbOamYQGSwuCRV+qu6fNZ6ZUR149qwFBi8450wkrz8aMduhRFLHWfPPCteHiX/9KX6b7eDj7V+/qpYmLvnP7zRjhjkMhU8OhCYt8Jc8Ej6lZ/olvtURZvpl0EVdTco5wl9gkfjWBsUH2/NA8ZbrxKNx8kkZ9fOPTMPSWyu6CjHddQ1R2UJ38g2/5JXZKmrXfahdIcf2bzfPhwMkj6mHHiSrKlAPgbOjSAboD2grpIbbkshHjoU7c4BB2nn8faCjOZzp3Sy7HJNHTutyb+gS4eWviKofRb//Zj4ZTX3/VN53WW1dlVT5NpUvnR0TtTfxauVlOCeuQxSdwdFVyYnQBc3MTirZP+5cS+mfcmoXUtGqcYbbaFf6IASR+xTPSLJSUlEVF+Q9Q2iH68NyL1lEh3KeCj8EyYmYZb7z7iYfSHDYXOYUGVzw52E7nZWnxn2eWupsGinjSCwg3HL5+gDzsm8ERXCgUsn48a908f1WHBvy9ZzJ3aemEXuGyDqA/+5P39Cqbjv7RjQP9TJ70E3kRadfCU/srcS2NwLJqiArv0JAjt3WdBc5yjplWDFLoMtnGzAQ3JJdhEUQ5pTolMMpOPS+bMs7phscM81OdLHrkB28Pp7/zpo0Jo+EznXCKH21AYTGj7Hlm5agjzzQXZ27SbkPCVb3vP6ZnWx2zxIz1S1qaQgYjJCazGKbz5LZPdUY9+kuBKJrPorBEXmRHNwCNsnZrjRnjH5eFoo6MA74IWl2YGAajIweRHonGhyYDPQmgcJRhhVOeoq2s1WDqJkfWOycqCgsIF3PpOCUmed6OS5MSahhim7V2Sx250ICRyy887oKKS7TzmRFAnJpw4afv+WSEOK3PipqOQmEYzmTXo2t3ZWAcfgff4AozD9MFCkkOLAmDL0fLEWduJPBgMf+mjuu58Fe/8t2d9475Lg7PW6w7c8Deub98dzj3tx8Nmzdj3yxszCVYWBXf0EonEGaukxr6typogaCYRVcD4bi1W8rKJJnSvBmmWc9goptAFCHPPKteUNl4HVaw3dp3/LKOj8GQvNWQdtEcrSfLTj43Xh5b1rTGHzdhwVSf8enNwOUGwMaMfa8e17NuvCoIu4e6abAZw0atmWWM3I7GlSJjclVx/ZcjuT3vdqp1KMmmo4Ood4pCGmbcp2UYz8EV8UpOnjQbt59UXEVWXWBgOE9ITHDSTbwUNYUJSIG2P8L+jWiV5jvJzIiNhVwUlOE4mHGm8vdoQoFZQXrK55p4OKs1Q87vZchKxXJH4kQGeN/QcNbGCn1m1Px14a46wlIAicbt/IJlZnnGpec9T8+r4bwPQmNHl+RxuJkbmGZNd6iXuP7XHw0Xf/GplkPyORxeS1xVRgmn7Oeu1JrDV8XhMfJZwnAV4ReFpxDXJRnpHcWC6PzZ0NT73tCxwLd17jZvAD2993A49aOv6/SUdQ9Xqb/RRf1XvFKQxRIOzm1Ja8jssvPcQ+rD5OUBGTDGSkGsaVnqgSY/72jYjtvQs28cA6u6mciE46Jz/hbBASnFFIu2H+AFPuimn/8omI5uFesJEgwbUxFHwzGpx3mhpBqikSSmkEtQxc1H/ZHiDQROHyFcdBYBMkIdCUgTAG4mNB4jHilU7BPdTTf07MMU/hm9oM/Rryyun/mLnw1HNbFxSFvXOEaHYQ7Porf1iQzeJCEjwV0NQvzpfaPX7tQBARWRn6qMGgSMGwRfbrjA0E8G6o36DPdoS0nHTDS9MRMoJ/7xt4cT33jNNxYqdjlj4L3rhc/TgoOhkyRFqmyLvC/bnv2qMPyKdgUODc8mlbjE7dJrZKrLuGlPEzAwnkMv//zXmnE+4OWgQ999QysKh+M5dNYGGPM0J91CftSR9x9XovK6oSEu8yHPnjBxpWdo9fLMRjP5xOkaDNUfXNEmDIxVN382aKxpdxXD4hKLOBdbJ7ZEfCG/6lqNLUtsRh4lRxmNRR5CF0UDKSzognbCUCh6kJw5c9IFPz341LAF7GgzIJAQHnC7kllx4VRB1X11iSpiJUJ+8OscNLYTTThw0PrNb76qtb5zUUHqia/+9NfDjb2feecOhv5Yr4nxbqgNp+NFnEmNjd353qhkWdUSqcol7sajNNeF4mtasrip2ebzmnTh5EsaAs9aRoa/4r7J6PmKzfGnf++b1pOG5jKzkC5DLUiCSiJ17FRNjCB0PgwZK72Vn4m4jEIW+QS7KVaKWOkl9guJlHfqbAuH/twAr5+9NDy6esf1pC5zOOKD01l+kyFBT6OSm3DrIshh0smH+mOMFJx8jsOxCopTD+zs4ll5v5aObuhIJW4Yz59q6ShHad6gAQH08vFcnuR14jrh80Y5wYNQfBJGR+EIIgqWvnNnIBKz/bW0wm4ABQTjH1UqGb/CCsR4BBoQnUimRoUAuhHBpPIELjTlTKiISyMZVdiMG6JxUL1YVQocez1dK0YSnGGv7qw0BJ6ZNrQf9glHnSjOlwwHDW8faomAEyo5kAyRzoFLUxKoKC1LcGgZmzgwrLHhSQj/ltVpIwPkAHn22178mw/ihXEmTMgXuPJfyuHc4xv3hn2vHx/e+NPva83yhHuBmCABcf4rGZMStM6VMvV7+jEF6EqXrQhVpxW1kmKaMFOtJQpO2fnHBmKYY0wrnRqYRiYPHzwcrmuDxZqM7YkmlfaqrBhNuTe1rGgP5rQsu8Khvjh5hednRjvcRNe0NsxwONqnCIXjxy/5B7S5wxOT0nGH3kqrr3nsOaxzr3wD7vS2DmRimfAe3mdURI0OeMSZdTa8tf+MtgZWdEXc6VHsyYd1KYB4FL9EN7XwbMCRBuM01tRnJO9DgQeuasA0pTD3FYcn6IIZ3qWZVsUlULQ10lI2aeC7LHXx3VZRVdrTp0+8kP7aH3/PdCzqVz7XNFSih2XJyaTiAimnYzIrzHBqn56j/fK2ZSAFTDlENieY0nmW0sPZcEV3cbZk+iYCnUlEyQynhstMlpz4/W/oHN9v+SvsNTTzM12yb6wzQGXELwCwLVgoMxJS7y3mWzEx/aqIkmfDIW5+CakEwV7kVqGgm2eIxYs1XF488BZKGEJUMhxX3ni8kGNiCrw7ejXvsXpfbnjP1eOyQcL1oJsyhkkezaPnYw6wTyCTk5rtf6wbAHXBdsrdWqflTSQmx8xHNJJO9Xmdd0PbIbnxs4uPx5tTf/DtPJaJ5SPxRXeQ7ZYIz5TRA2eKZ+pikYiUl3kTN/9A4Fq/RLUXqQGZck+sJAqvsMNXiWaqcC0YGoGcnMOaAAA0tOUhYyml82YJFOpWLu43M9UhqZ9rWGLlM+Q6qGWAN/WytOO6I7sxqaK442I4XiOGRvqDAyP8Q5rcwPeffbKidOOAxy+dYKwn2hDVeFrepRM3E3oShsyv/9MfDKf0vEtPwx7eOLggWMKWZTKzT7aUMbgsY1g3+Elnlp2YhCPL6Bt+6tOplWzSIyESIyQq6siCp5gRC66L4WW4iaUyRd+aO3h0/0FsSZQxAWcWOHq64hH6+P1v5QvjuqO9zi9p9xM3QmbsfYhcFkpfNnBAw/7nGN2M7vT3b2knleSyPIhB8t43NxPKlLKEzr7ino3WmvCDDy4Mh771+vD1f/OPhlPffM24QstSq/JwKwC8DRc0RRkEivm/fEFB4FeOevEPQCS0ZPdi0S5dd0lDeuHYNlUXIyCQ2jMwCPUrLBP3XJLx1ANBldY87plj3LiZNqVbjEUxRgOYpoqBwZFJdukc1BLEO//yd4fPtf66eebqsKaJLYwHUeDWvmbu+g/1DHtUvSTfuqmexGiq9DBoxWT/DEhCB7ITjQJeNifko4YaLbt/9r99enhZE2i8usizWTUi+M5d6QQOjwEYwc1z1+LtKBq1Rg67tdNov16X28MXJqgo5dEZQQEE47pggSKhEoVCnkbgJET7mRuMEWA/I0JXJp/Ql3VUNq7c1RIaR9H4rSORHPnWaybEKP3Mr5jbECUmnvFu70MfMkcemRleV4+5mz3OkwxQb5lHpZQuzm7qwQ66ezrm1TdU9fCs9R7SMNmPQ0VQPvmU0XNY+/7/7Z8Nx3TgIUlPWRWQHEroGedpp0jKhKDtCPlypFk+YUPqAlSuECLWrm436jieiVmcM05S0hir55ZCgHfgHtskJEtelG2HKhobMAkwKKRSPM1B5MWyk5Kc6aT7jAN2JhpNIMKbxvVCl7q4UEMtk7hhityDAsGpUN7bfOef/vZwWSdBXH/3M21eV2+sOzJGVqX/+PqD4ZAM7fS33xJMOcI4Ug3nGxhxMmF4JMYVmNKr4tWgaUDPNXTmDl/GS9m9KG/Iooe9q6Wv8z95X5vk78lwtdFE/GgMd/SBtmsyhIOa3Dn61st+Vq/91QtlJnmLTnysdNyUKMYv4yDj1AmWzZ5otMPLBld/9ZlHHOgb2/iiHK/+7CP3qC9pKcdlaVpdVKC+jahz5ksGvFzPbDDlxkfbWTqyflSydcaoVjtWD/iKwj3tS2avMy8pnPz9b7dNFq3sOyY8Ix/QLDeDJ0YB/EqIdZ0VEDz4oEEohh/6wHJycwmwrilMefVowwQB6404SyKpxNR8O0VJURSIy74CwI1rqMMx92Cg4viaB6h8kCk3bgGZxKJBkwa/0fXcE2r+voTAJKhM9AyQ0Qp7ZLoYSjET2VQ2ruNBA2f4/Mp33xyOvH5iuKUe4p42UzzWjLAzp/3TB373hDfD0/BYlMf3R5fNLPI3lUNe5PCg0cQYb8BwY2CW+6VnGu6ql7z14eeSedIvdzPUrnxSZkGMH45805Pdv3N3OPfjX+nZ+YlfTGcyxbJ9B+RLAs+HG39/ZritL02c+u2vDwf1jFdGTEOgTJc6wF0motF0uF3aUvoEVv2wWeaeXgL4/G8+HO7rA29MFLIsxxJZe11POBij8151IpHeBgs/19fz4aHeAOKQfRsI5SDjpSxcRs731srxOIRenCzKfMMOHSjH+8DHdAKp9U3dW/7FzqMv2IruGWv0lFvqU+hj6XTyKyi6WPpINZNopCku2/DNc1pzVZOtTs1YiJSHe5OQBB5jhlLLIzN0k+PKTz0wQwmhKoE0fikTPCM50C6kQhrONAoizJRjUiIEOCJcEy+1KuVauhj65Ht6UYaRZbgNYQzEzUAvlauBcPbRHj3rPNUnRp/oKw3kh4aCgfNsytDZwy+Jr0ZBRpE//UXxgsvQeENDtVf/4Ds+pvTcX/ztsEOvpr20phlRvQVz++I1T6q5zJta0wJgng89+RzlVZ1R/eTuQx8K7k0eRUMhynGlh3nKRhW9Ynf69781HNWNCSMmP03RqYhG67J0ZriAVIgVN+rSi41BevJcy2H457Rsxuw+R+Qwy75z38awV8+cuzXrSyPh7OWHWl9lHqCJgbOVyDyrXh6p93UdCk7PHmckw6J064gao2ASdbjDZzPf+OWnWjrU631abXj1z37bLy4wCit5+EHVX0sfwTxrHnIt2+IDFw1wYVAOWFczBEW4Vfy91obZ6JQuPPJX7TV6ZY3YICgxPbHZ5s0FMsXtKmBcImH8FqM8YMToH3mgB8bE9RbO2D0HQXATl7nQxhiMTARNskp20IZoCsVomUgeARg+cnABgUf640vadK47tYeYGLFpYBC3CeK9XWMg7qmAy/DWdfoGJAyj3GMwTPXwyCx0gVPpBc80Wpe2YjCXInze6VUZEedoseOLBsTMM70xb7Tc0vEvPGet83zH0HzmrIO485kPFeBZdQAAQABJREFUPld5T8+9LE1NcUe62iAC/7W1PXpZ4j3n00tTen6kZtrSC8UxkpIbO3yXzfSukqnLPRoD5YbxMmQ+/5/1lpA2QtC78rLB0e+/NRzVMz8vwDNpRPlw8uRFPbbc1NtYjEhqVEMjJn++aekG+ERLSPAu/Rh1MDvtLa3ob2VTr15npQUPPpHzccw9aMJy/9dfGY6+qWNaGfVAnpcoipLiJF2qgMKX2IAVuNDSL1Wknfk2fCWQ5nwl7pQFchMCkZEFSusNPoEy19DsRFJZR7I52WKdGhcIMV51ROaXTGnWAvJTAo0QahL576MZB390nTrG1WXmaHR2s6R2F0l8FGcXzQENG1/+V7/jCnqkN0nY3M5Q1kblYg2Z1g2Z+XNVquDIC3z8zCPZPA9HdUgQpKVyC5OaGE4TQ9/QtPykGwEHytMjrmsDCM+nz1iHlD48I/KC+R2dCkF8np/Kc4hTj6VnuCfaPsgSyGjAKC9MNXCehZHjGV0ajOJ8vuPif/9Qz826oen5GVzkkuY7sIV0eXI8MhZyEwEZq5zSwMV4Od/KxquvG/DlR3R981/8zvC6hvPsbgLHz5O6qXICxsvff3vYrZ1NHtrqJhUyKUsMWExVOd5/TJiflvP4eLoNQXkAx0nol3oUKgBGUFf0qHL3kwu+mVOXr+i1Q24iHlGJbMHN8jqNSp8GQNLUVVKlWD/qIrSUspUSekNdNFjgGCYl6IA1OODO2TYKoXzSLSZklUTzkPKehKVcMyM7ouGpwQNsf3BJsekBmbvAD0yHzUM3gvrTXYShhLgHZCIjsQomTbmJ8MLAqW+/Mbz9L39vOKztdk+Y9VTDrw0DZCgKdK5NxoWAsdvgq8ALFiUTBQQj2YRRCMNVldD+gKEbNzU1NhAP6n1Q9kGzKYRi2SGjvqljYDA85FWhwk2kERctN5T7Pkg8+CgFDNCiUesVOta017UJhUb6RM+NPG/yLMos+qVffhLvtAqdD5hDuiZDpgQXXIlA/yVuShF1gBw+DHZeL9fT87JUw6PDOxqqHuH1PGWGPOJXufJqHWdDHdIIhMkpZ9jyQoLxFHeZpC7cEDjsnN7bb551yhgl8aBhnfi6vjx5SW948aIII4FX/kTvC2vi8qlGI332OjaTHFMHpVcfniD1jCYJY4Q2Ej8Cgvc0Fl4ajEZsFF0sl5pS4EV/SASnuV6O05ROLwyv/LVZ6DY0MzVsgnrCsHFeFgA/sCMbaC8QYIISiHE0WLIwhfGicTzXsyLP5HvUgF7TB8sOvXFyOK+lIu+kSXIhhMGYWTJa5mVZIMNy0AXXlZH1S5jYtmgLNRqes/dqx9UJzRhf1K6ive4VeAOJj2txrEvNdMInXOhJY/fEmowT3ZtjkkyGu0svtZ/63tvelMBzHTPVV3VEKo19/bDectI5xjdlYEdVFpf+7qPhhnY0sdfaH9fKCi2evgHR2npHtEDOZESoE3r0TR0ix1tU7GLjxRE+7PXWn/5AQ+Z4lQ5jZPLPjyFmFfTAmY3HMBk52Ggre+ggGm5IBkkWj0TcnO7pJsSSnsZKY7tQzKrphrem3pw97ef+y9/5PfAnOtbm1J9+T/MBp+KMKnOsDIlwiSs1nBQKpB6BDPUEp3igtxVZRCCJgqTcKE+PkIsOH4aBBJbiJmiCMmYKt8eiMQQ0lSGMl7jSdRwpB2SHe14pZKXsF3WRKE5wOz+Et6GECHoas1iElTRwo2AiAzVxc0i7dr72P/3ucPjNk+rJctICMWbeqB0HtupvxFQIESEmwFUh9LQtSQpRGVkhGCfLQAe1GcQV7AYrZDXQm+opSI+hdDEm84HKJBuG6s+OoDdJksVJmxxb+vIPv+ZX3Bii8pnL41q3fFvbMve/dswf2GLr6E0NIzk8nY34m5pt5xCBix/IyDk+hiE8whBtlTMQKpCy1HlmXgZ7Xi8Z+BgaDU150+t19XR7NHxn04xfAaVcYKmLjVRhT9KobNA5i6jJN0BlulN6Mevs8lLcNwLpf03Pzfd1c+LxhAlFyg1D52bCs+15jTiYMGTDBj3viT/6znDqW294+Bj51M0k3SSLXYQqjYJGvFoFgC696Cc+6Q3HGZ4kjxHS9CsU0wShQU5OQ/fzafIt/nMfxkFOqAungMS3p3YXNis8hfW0h58ZTGLntWDMFSSDF/rg+ofyxSzpicpR8U5bwbOGCNVbszWR4dT+I7xKCAOzWbisunOBuJBWspML+vAc5zpRb+JkgGqZLsLEB8SnOHad0vKOhoGkc77SpjY53NP7v/5aoh4DegcNd02MlWdXmPvGLFqGzQdkrOzn9YyqCVVB+Yz5ug4v36cjYhiiPtfXBW7oRkEZ8EFqerMb730+fPb//VKf/rgvQ4rKtjEpaH+iSKQXiAaN4Vw7c3G4+4FeDtEo4OHl2zo+hkk7HVIgHUivRkpJTDkQU2bwENYSBcPBf103JPamq6EBxTh5/Y9jY8/+5S+H25rJBsZsP9skGTJ/9B/+Zrjy0w+cP17GP/XH39U3od92GYbOKddC5peUbXDKtGBdKqnpCZIT0zeRL4VKxPVntLCRPs3IyQ+vZw1dc5NIg446JaVLuNFVILgWb9+Mcr4Ktp6uNVAx7pCEXS+miELoRG4jKDWQTU+sQAluhABAoBWDh5sjWQVdBCdTGPUz3cl89w+KxavRg9FE65KxSBG8lV8miPZqCHxLPQPPtzv1DulLT9EPRWBg5u4BNtRr8L7pFU1esSZJD8xLFLe0XZDv6oThhFBsWaPBoA+Qy4ShKEaNwe/VO842FDVkD1ORxd5t6cHBai9raH3m1rt+Bt3Ulw9gU/XEcyqnJvIFgPELBCqx1mMiO11fxuRZej+U4V/5+ccDB7LzFte+t0/68zN+7heZGxTkeTcwiwy7TDKt5ZkACoo/sx7oyWdIrnEjqPxjxBp2P5Dxfvp//XjYrXJnqe+hzux+rLy47FUf5P81PYPzxUk/mohn5NtCucgl04jkFUNDU6X5n0uEjdCXw4RuGoEk2Act0VGcYj2fzPZLbviUmtqs2UnnCMiHJojcPoHzA9SlBVkRRbppzTP4hr1Gb8Z8q+lhZqWDQ4M5QMJ2f/Azz+CbMZEThw8K808gwgVb8KVj0WxpvMGpXaMIW3SUNYLGkNTAgF75wdeGV//5b+t1t/06zeOOegYVvgws1KWU40YC4X6dzcQyEktUyGKb4F29rM5nO7gZRF7BrFyqAUuG25XwXWviv1MnhuzSOqohVK7/4Sh0GRiTNXwY65jWt58zVBYs2kDk0HuLdRNhX7VdsHBDD8DyK3ly76sJuHq7h5c9jmmvMHueWWv0fnLIUUb5cPlnAwQSykoPp3Opn7Ad1OSdHh0OnDgy7NIJkC4r7ma0A/W4vFfN4Qf3dUjCpjZpSKg3t/AZFV5SePtf/cFw4p1XzMMjRAlyixnFjDJJoD3LGSeHapT+WBeRboRASkB5AOOHiAoHffFROvpXsvGWXDoEBwvF7T94wMcy7BPs4YpnPkMXXSsdVEY0+qGIbnURSXaCKQQ+v4gB2f6vCRKVwmGAhIOJH8KB68+z07pFkbTSmY1wUuHis+DDoBjZV+NSJrgDemcOsCU/g3hOUa91WK8Cvqk3nTiFEPhjbdawU8T5UIShJZNZe/kuj3ZUgehdWnrjhfOwcFEEcIgwPeK4fBR6QbdTy1RlfBhCM5I0FDzWVw9p9nsX77VKtg1LcJw4Wb7RoSeuCPHxhqdI58iHe189T9/Umi+vWPJixm590IslPFzxg51/ccmwMSIJWTXMJtPlVFc8O1PXjCJOa+nnmXp7ZtZ9JKyedWHAc++6ZpUxZEYA6HZapz++pe2xHB/8mI0aKijyMs2FwKVbn4AKVkMXhwMQ1zHJagIs1/MQrOovfOJqf/zyDwT++J87WBnMZUm66eZES+OllMqRYJaB2Uo+y0nw8kaOUJAyUbKQlS4/RDm8VMBqoPUu+cFS8s00iJIpKCElkaXkoutgRbcMz0LNMFhUXBka5fRl2hBMxLMYWy3pgY5/7TV9wPnIcP3TC2Plpfp+D1XPvQe1vML6ZAyF1cNqGHj7zBWdDnLCPLyxRJwZ/vgVPA292dH00i5pk1mih/ewmXg1UsLcrHAyfG5cfkFdw/ZrerVx5z6tt6pGeTzB+eZQ5QFr/2CywokMmbf0YsBj3XT41tAz7Vw7IANmAg15Zfzlj5xGQ3KjUgJtJxoM2cpw1hMjeUYRh1/Wu9L/8z/ScUTveicVhotjxYEbAD30UU1UHdEGjd3MhItNvJY55kOg5c7yu6SUTbty25oREm1c+zSFHRU9vtmYt+LJ04VLIgzAl983axOaOYnCwaWwihrWJZvniBbJVZ/Ci5KKAUaysj60O5TUXmhhUWIMQZjSonFIKldnBSqB/TP7bV6gsaOxWZZ0BVg5EncFQ1dLcmMnPdtmoHaRYonOC43LMgojRS/xvFOoMpPo9lBEgXhjhQ9H7xlO6yUICsqL5ySCKH2eaTZ8nyZ92Jn1UEa5Y0PDaE3OPLiks5e0RMLOqVA+8sWGhA0tzTxgWE6NUPYUgxsGZa2hMaMAYLisQEfJq/726SC26/R2LVnlKt0wRj/zGssKNnoj9xclg4tx8IofG1W4cfGqX3xxXmvQOdmGTLvSSZEWJOB2IkNjgo2RATcbi29YpiArPMMe1b5xvhp5hy2YGtn4xqQy2623yPgKAjPSkFP+ZpN5dV2nbOBOxC8XBemY0wkV4hSghNCtgQsVGhHZFpQY5BUP7IK1ckma4mkOIFmEAtbLSA0lWkPCZl5ImQL7kqwUzAE946d+w1vgAKC2uXCBVKoaXqRf1i++CBZXG2Sq5iSAiCt10SSLSUnWyUlEAhXfhS2aogI26u9YxlvCmOzGF/x8RbGeRNHoQROnjIuoBNLI2HCy/9UT+g6xvjXLhgsU0fPvLX1qk1cd6XWLjCHrLmZjQwPzcINXj88MbGQdBvxCJqFwCokRnxlh33HgRyr3XWjhFRD5xIu0fPAUpszYxbSp4SoHvdVW1XVtheSxwGUqvOLGiwnVA5iVGesifvSuGP8DzSgzKuEZX0MYhDQ+IdVE1ptv+/Jc68chMUFXip4bURgusMiDoKW9ceASnBo4MUY8IwrqP8D8JkQCWCg8wLKXvmLx3+mv9FQSNsbPAHqGJKE4AWaZ2OIBMd/So0uDolzrkJC34IIv9WH7EQ/3wGLsdeAoRanTmEfmMCRA/olHCxesfCW4Iiq+lQ8Tc8LHJWO1RjegqFGHifunBoIxkOTBQslTxJu7TRvcYG0W6TMBAs0IIw7fgJHY5BjIUIReQD/jBS4jlsYHlaXTARkqm/yZgPHEjM7i2tSGCzZGeMLJrV+lqNa+W5NRfDURXNeRLjwT+qsBWWlUE8bjyoyILQW1dmpJxmuqKEFaOdFyWLlhptEl+RUKvqjs4I1+vGXlTRYywg1NyPHooJxafvHqxRhWTMCTwdL7bjIbr7VdO6dnTxyQpqsbvPJOfllf5gbJSIAw9QH/1ohLTvniRbB+sO6SiGZc0EqY+8YqzMTDc51X3ICGOQ+08qiA0BFoz8gK03wS7jIzHBi8K1J+MGr5LjA+uIkPVol0knjR7mkKsZUSaDrkmFKByFxErUBxtTJChAO/ebyHVVr68AwDiowjrt0oYFfiBI2/zAf04svduwwrjDP4McytTPVw42Ng9Wv6SFKVtrNQfCUmkxoqStoRkLYqzafPdKSLGv4+vaHjF9zV+7qURXtLRozcmMkVssgYkrMlkJ1OIGLU0D1mbzUQX5ykCJZfPyUosRm2UsJh6AqRVulEA+RAUxugIu71pZdf8RPItIr7aFb0hwBcOwUqbL8iSiRJ+t/Tlw7u84KGhsL0xlZIPByGR5HIty7oUPrap8xmBm/ZupiACIH6EV/lgsBXKm6ZKzbyqw0ZTfiOL6MBJh2XOepkwXWio/tD+wR28g0SuXkUHGZ9uGeeLKDA3jyKke8tPKU8+fbPjIpT+T33RGzSVHk2vc4vZg2n+ARtDN0ZcommuldoOgMNZYInheCC6HAiXVDB4Pf8+cgv4n0vWnjhY6T1g6WfWUI1ImRWzgmdL0jh4CuFnVlMTvHSPwNO3sy59+nl4QFLSlrPpRK5efAyxB691cROJxw9GEOvB/p6HunEY/0yG4Url7YDDyLRHJDpqL0OlyANLfFNA25zqmzJ4HnUr/jJAE2tDDGL7sk0MQ+orsk6HuUKKmbCR1d6zut6PZKwzyJzISpddDG8czBkoEOlE7ZTubgEKz7znVFfklEqJDRaRNCSXr+i77hCwq9DCakdjvSylMpwscGfwUYNOiQT+xJyuqQIrkjLepqijxLGEPTRaYwwQdRmaPc7wpKNUxcrEkahoOjHX9wtHQdbgcKT3bkzLr+lYZDY6IRPxDGgop+kpxG3ntpyUFi/GtqaL7zrFwb5FFxqeIlMairkKOBqm/tR34EnPg2/6ERWThWAMbCn95U//6HbyRMNTRnqMqlzW70wBY4BoiPbMPdryM0mDRusElla2tT7rWzE8JBbgmkz8SMgBigxevm8FWkkV48GkeMgE5g5g4SDzk8YPsvwoJ04RUNaD53hCIPvNXN4wo0fvz8c+vbrw17liyU1nvvpmTkD2q74uyB7nsgZ+RaahVeVgM7dwwqBWwnlCyK+TjZuCxELJ1AWn/CoTwCVKL+n78DbCwYjSr0tU3aElafQsBcqJCUulH1Hu1UQTvy8jKSGnkPoFGM5ZDQyvtwvIw4atU0b7hy34OHL7BQIY5vyXm7ENHJ+wRseI3/k6k+A+c9IyMk/suo/6PkrGgphwnMaxwL4246jIo5r+eOtf/bD4chvvZGnJu4Y7mhzwiM/Z8ZrduSdT3p4PZdhtOQz9OSsZIaiNPxepHVNBdDE2khpV7xoC7c+V+MGw8WIyzWHlkkwNlXU1ksaE3H0q0a1lIWA6MR+ZY7JOf/jvx92agnqqD4JuktrufB4qnd/2RDCjHvpj2/XMQ1IwklUkNFIhxI0RViVBaJcj9eHnTi/iJa/JO1Sg1cHEOPgtpTnLK2fZJ7w6CKWS9yiUp74JKsOU8EOqJafRJ2ONVMmkMuWfKnOogdWoFyUd89gFg6ERFeaS36GM1FgTIuinHaNpYy7zKQzHgqK1EavgHtjpRtGWv0RBq//ISLFVL7MuiKotA0XZry0Ot2IosFLNxkFs8Qvf/+d4c1//kN9m0enIWpNmE+x7LRhykh0p9qlddZDeqeYYTT62vjUI/Oigr+mqF4x8tsph/imQgSiLhXmn4p3o4ge1Tp3jQFOULnHi4Bkq3ASTs/Pc3icbgFC7yJOcaEXM9joeVYHDTzSQYGH9L3cg9rQwojiid7KYjvq1//dPxlOfl2nP6qnj4aY/GACu9ZeEo5nePiZnRE3B8wjNjUfbq5tw3GboF1EK2kEDSHYd9ExmGXXeHdlWXKNXPkZKSehpmVPZKYFwM9fg1NLlT5hl5FMk1dD6FhGYtKEtNSaysIlusPtMgEirgNUEB9e5TfiCIw00c/Z+IQ/WWJqNEow35Gqkqyu5ZRgUgwNlB7cFCrqrXwRpkywaHPBKq7VU2GFrl9dKDP0p5fl27NsjLilo2ke6vXDda1xsrf3qRq6vy5x5LxfnnimIfROGf49GfuNV6/E1kHhwNMGR8GUcyEp3p5dR52iHKIsU6Giki+arkjQ3bPPsBZPnn8f62AC3nTiMyXjaZiRjlj02amXJ3iP94w+qXpPN5wNvch/8rfe9KMBM9iv/y9/KsN9VVtJdeSr8opDFmJ8SR2cL+vkFLAqI4IWDKJ0CC+XyR3EtNCZVulhtEFQsCL/SnzJQCVUgX+W+oR1wI0wwjMfre2MKS8OkeGSa8GSkO2BmZPHT1i/q5VnEla5lhSBuHbF2QWdQ/iANP81/mQ1E7PXpFHFryFlQMzpOIwOTrE1oBIEzK638QGxfqAlfoNVWu8jErzRkTV6TH7lIkg8eHJ9QuMV72MaVr+it4miMStFhsfzJ3ufj6vn8vnG6nGZSVvXOVhXf/6R3wNuB89bzzQAsi48XvmDD43eWiBQStgoHQTuFOPo4saGetYVXz0uO8CqjHkOh+9NfXcZmM/YlizfxMXKE1xa5+ZEkU/+899qgu6Sn59P6VRItl4+1mPCCb1w8LIOYUAPZtbROrSUvNIBZSYuMDyaIB92RTWPd/Cst+qBogWJATwyDWy3q8a3+E39qL8pzLFMgM8kDrwBlYJYZaAX0+I9cKUg8ejSetYhmPQWciA6ueElvlKh7D7aoWfTk7t4D3N4vhkPqmilWBZGFcrWvngXvrMTPBqs0sqnh+9+cdfMSSo1nqCTT9h4CSMLjqc8NzTQKUT+FPYV/KJZzI/xodnmD664Up8w5RrxSAOGq/rgJX6OnWFojTHY+DVcZrvmYW0AOaDD93hdjskkE4nhOfVud7XBgvO3PCtMbsSe/dIP1EM2o3elhqnaePuG1So8jMiallJixq4wXkc0Y/hLN17kv/Xe2eGato4ilxEDNxImpR7rNb/L758d/kd73wIl51Gd+XfP9Dw0o7dkPfxSjC2CFYMTOGbZw4JYZ3M2JBs2GI2NsWRjFptzcuxwWLClGVlqGSOMefiAA7E0ku1ANruR9iRnD7t4nZysnZDNiR2yMRtLPBb8xJKMLI1e8+qe7t7vu7duVf1/97RGloRGUv8z/VfVvbdu3Xrcv95Vzz/xD9jkcUSOyFmAgxYuwIIMfpwsfGmCIz8sKKaFpAxfPokoU6TcDi7iQ26khODpN/VYwtPEI2/G035ioRsA/KQMOFrS1z3NcEbsIsIg5HFu7zSLCMMQ8WfK7OJlJGYyrU7omZx8pAP5iMxb1PaB91yNwy4mVs6c0TUDJoKulVE0iNU8jkNMCUaR8TCQFJzACOBWPREiP9DXp19gEvkkI30k4o0wzh+N6BHKFCzliCinYqXfyD+sTnV84bWCQ26SSZCXiqAfFlCz2SsstEblIXfcRngE+4hlQImZgZqRfWMZvUaTtAPTUXpbA+59Qh9133PPy6kk7LPKA4byYYDfOajt7aYHhkt7GbzY/+6GspZR8zO3KAJxwxgtH9t3SDZTMDPkNgn4O/YSpr/QTObHZwTb+4bQBeCNgodxLjSb+hPYhD/vbZclF119heYl/TJiSPB4k0UqpxStMsfpGBPBrk59U077hcISUQjSUaRGqk15XXBTMDRfQng+XPp1SA+j235EN+DvaQ3nA9C8N7CYhnNAxlBjCYtjHnQF/ms56Ga+1tvT3TU8WsIwb/6zQvZI8dbLsKB9U2eh7SZm+uh4uQxGKFXyUXTsY+5RYgZssIVQRaLjUIs/VQrHAlJJQrhIOFfgT5vH+Sg3xEsTLY0RVyxiPVp5Mn11btZRwK3BqiW2S0QF4KB1dvJQRaZisyY89vqR5OUnn5W1yGy6kkcVG/c5ktuNHUjdWOTPDwLXLZe4ugtrl1mgRTrAuSiESzovfc9bsREBtSoefhw68AEYwe6fDuTlPFwiNowpHoZJv+0Y+R7Ccs+f/a9nsTRT/ZChtASA5y328kB+NlOpuDwhtAxZ51/z5uTCt14uSssmvXyYlLrurSmoYLE3AVA0xj37iMwxECQ6+ktL8GJ0TBlp+oOh8qTner4xS6Eg8WRkgRHC1rz1zB0u9uooNAijNxNQj49gWXnqUTm2OyszOnFVJjhAP/8MBeOevv4tu3PFYjGPH9qbSbJt4Ob3YP3zAz3dne9EbZygc8xVB/zku88+bF5atXgnUP7xQG/RAuQJYCHKxyZGEOwQMGgLERJXlti5Q1gpAmMVocUauVP0LoIaJr96ik3J4OQS6cwOk3WcfGddmBKThnbQgi9rQ54t/TP0LdnXzEEZ+bD1z/uPZUUT6HJoUvMnXQqEIiJBIM4355GnsQK340PAY25HOCiFJjsVeAQ1KkfxKR0Vlcs+X/ib76MWHpLD2aVbQqbgKTuFWFz4sMnPOV24l+CYnQVcx0wU3DLtBauPHunxiE/n3bsFE70ivPpwcTI4TAdxnhiKIdWq+aIwKrD8EUgQ3RG5MqkDKNi96+izAHqHGJ6L4c1McSOtSxkz1btSCcrhM/4icvpALZurtrXl2rvRrTkyMvocYJ++fmDwCXqj7rKCyu3csSq/atXOKjyLfNvX3fwx1NT3zejqXDzG9brYfoPJauY/q4k4FmmnuGI8ARplyRAfew8mQXgycWKA8sBgxAKatuDyDCarbklA8uOFL4xQOF0qWt44pzIBHw1ZLWIPL8XBzaBif8EugSgSAVCJuUOH86oTqP3yqPF8v5iK5HjLYBg1G4wkLWmyBkaNSgVmv5VhsGYvQNmpwJ1QwLkYER9hDeyUTvq8WJPN2v9F9GspaRvvTPYCIkzQytww+PdeviRZjDO7uJOIMjBNLH28Fxel2LC0i2FiZ8KkHgICkP6sRhUyCYTAQKbUDkYwPMkf04sPUVMXQP3Qm/PuAbElQnqyCOY9x4kS2SUbjV8EN5CYICId+EMXcxV0TwozkK/HRseHAN7UNzD4VaPfsWNVm+isAWgS2Ne3U+YAvl5c1dtR6t4AhnfO6OroRLXNRBnHiyXFqTp9aXR8pAjikwJoAqfgKbxg0i8fY6/GWsZcJDWq5sUTK6CZIpNi0rCpvCRQfkamLrz1X/EKdPrlKZxXyOzw5GF2cqZDUIKAKCgEVOIxbLF7bdcLyTGceCm7gNBsFUWGFzmjGX1fnr9FBRS5wEQUGHPLl+IAvLQCF5JRLOXsgJ95osAlqWRN8VjY5MOBu4/34u7jEm+wt8KPZjevkulaNC+Zj2mh2bhUPY+bKLhbyEWJkWBMtF3mEokQZxWUvLIAcWeAKSUgD4dHOqnNuaWNqKw9HBYpWeTBf+MV24M0GRuIGjzGogGKAXiwt4nFuzw+zvSQbkCnCkOanFFGlw2HrXHssyMZHisxVwYr5dz6G4tbXyd1sbiyvVh8Stfjwp3iTQI+O4qrOvqKO8koeXjdR65sz+XvRd/quk4UtJExzmVI2uoGThJJMoolvFJxsmyJgLRGzuAxY/MSuoIPd5wGQb3pzxMrk2aK3CDseB7a0MqRgcbcI7cQBNmMUMDwpLKa0gGKQiDU6JRIrai5JjUnV6uxSX0Ig0djqCErTGoIwpv45i2/JBnCBWjjGKWW5jRiaAq8jAqMDOfDxRYdbEJjhDvUwDh3muGmEg79YeQnT7UcRlglDJSx7d6O2rhr9kw5srYdvLghn9Jrk1ljJQHxRacllAGz7hQ8RkZ2ZxUFlCA0HAHzVac4orYaNvCSujSNLrZb+JOaDCD9GJs01LkiZMqnweM0hpdUimVwxp9g8MIAVVJDq7eD54iPT1T+J2443HDDukE2k5LvfO2Ozvff+ZBbo2o+M/wDWGvj4d09hY8WH5NRjcF1q9+PArAR/eNr0DfmcSejCBRtL/SPnfCpCJFZCuAKcQwkPkUTe0pFPSWpKADQcXoodezH2ZspcRRczMtEinkGPKD672TKKC94Kq0pLwPRaLJ5y00OPOlj8ZXLxL9XYigvFYw0nOPjgXNlLE0kEc9/Zo3506eelaNnePoHRyVqOEmDl44te7cqMOUlHRV4GDX6pApM+fFjgWd4XB4p+cC0AqKGa/qkuYyBKhll5ggImbviqH7pnuSxBIzRKRgdEcDJoiCGn/Ho3AZGA1+9A6AwtcQKTEyaT8wzazfOAX5cvxFBvW9LqcDPFYoIYElKRrmxAu7S6Uar68jI2C5A7kU/dweJv3bHHZ1XzZ9feV+x6GvdmAlyrvHjmtIVMjg4f37548Xid3asWvXE4ctzt+HW+42ze2YsOoJChtCxMj4ntXGm0aMSRrFjGWD9Y8nuyoN3qiSGN4904zEnrSxoNn0AtBSoiMj5EIjQCSBioBh9p4hDMAp2yJjG7GLGeLVTFkZcTRcQHBxH5HQNa7rXv7tLFkwsfssy1IzsV2oNR2XmFA4HkrpxSgV/Gu+abHiQAuqCFM5IBwnHYDDT4brwLfGMzouli0uqFZxVxczweGVkTXjzrnhVMAmH2SC8MmlrfAwspjkMabKBB+KdIvEo86MApXFtaY+Cxdu9xxO0mEyBEeMX6Wg9v4gg9m127yGVIR4qFhRhmbKd3Tuj+/CxsSMTlfHPYY/qQ9d/6kHcCJckjxZv6fpo8SE3LZD2ay4dlDJXA/PxZ56prFy5MvfBq67quPXRR8vf/tvvf++3rl3xWGmsUsDc37vQVm8rl3UpF0oAvtWZKHintyAU2p07BvvwIzxgTFYli4i9FZaQ7qkC7EnoWxIyQHxQ5O1qHgnEBaaUjp7exYNaxO4yRg2HVURKBjoUCx5QzCHcOFDCDYWje3BELGrL3gv0IDlRYtLiRzsvAZPVRmhO8WEhP/TiPpk6Ep5gylFqTvHMxdnSnIbC90F2NXEqiU3jdow4yzywHVOjwoIbwxG2sGJlFjwyXPlFdkfh5VeLeTSsmVEmGMhIaca/KMPkowSvSmoeIl7OKipuYDMtnElNEhrPSYkihAmpIKaRT6eIylszBHUhTe6ZA8YV6A6nhXKjY+VtlVr5+usHtj++84m/n2Cl+dFLL01u+safsLva9KkLsxk1O9BXXrmwZgNd2/pX/woEeABy/Cb7WCW2rZFmYMrjaqkW4Ykc7nvrcA5BI6KJPcZgFTgS21tRAOnJ3DAjKxDxtyXm6GoxUMdfXPXr3p6RuSOsWGOFcHKILGpnIeUCDJ5A8TKuMOGlaDyRkvc+zb36TckiLK2kEukxPoGXJAmbsVDI8ZGx5IW/+idqMpIJNKDnEkjuP9YmNAa98MfmcAEfBmlCYwvjXE4jYQAy9IEtDhRQH1Fg+PWPi5OloMfQ4nFGbWlppsFhNgClEhl4UWDxoqGoF+eReMGpxUHpyQcSK3bgxbCBCWSefuqWtOeT4+VDxdI19DsLbejpYDxptPRdfDQ/86H+rU+TgoPIC3evyE3WXPZcIsukTeiIxlvd6FcOTWmpufs2fwvzUsn7BwfWfAAaez9Gq3+ZOlziyWhoH0BW6VxJUmj+SI4IBlmjSeQQpu7pdAN7UiuQb7OpL7yNHv5plb2ZMPkYioKguANgYSne3kLniUErZI6380IOfMwpZng5VhozJTRKh6LCoW87gekdi08bBqcOYg00N9gvwQonngpJJY4LImvefCEnfWLOybLPayPGpJO1zeAtkkmN4EVxlsYGC2RcQTD1vPRMCxHfWwITSyePNxQBQWlSaEUJ3qhpSo4JTqhDfjFwCCh4JQy4SJM8PmaasjeQP4Vv5lCZKCUfppXYLP7NvNbjqLjVQlseY42F5Ojo+Cv4pvajn/vHJC1iPvfKXbtyqBhRSHeeUAgmZX2QU4B4Rd6pU0/b+tfcDW93YaBr3iiuDcGo6hhizeFROUDes/QiZrPAIWh4GvOlAA+mxUnvC56RAu5hnkYzQTxFsRYlEHcAegUGSKASluLlDQI1GSDsipIAzEpgsEt5xI2CbbikbH/yKu7fbcP5WdbHLEOBeYnZIixRnIkmNZdDssaU1U5gwmWKr2C65zBOwKACU6l5zxLXRnfhmpdl/+JKNKF5sJ4OgvkaGLX+XOzZlXlgr7FeKi83/VFYxbi3GHyp25I27UTCZNCiXz6TnC/v9pboI5VhAC9aKkBLcmf48COA0AWWEU/nj/PmWQEDoxO0hYCib8hxeEiij2MgsKsHU3PHxsaHc9X8V49NlD7LwWFgczt3rspbi/Y4zBqi61OvIVlz4Nfu+M3OOx96XIa4B+/6yEW5QtsGpPPHocjJ8ChXEeAaOhmxziisS5M01AM1A1NBK84npVlcLNSIogSrV6MsTUTGIIISWpaLZ5f9SixvR6iGgysi4uFDdcyCm31VbhrYi6s8uYmAzVfWfWwOc0P8bNzCMOcSnI+MkWfWrty7O4SdQq/9n5/Iai3KynLJa0cnMNI887LFycU4OB3tbBkxloUcaELLSizw9k1oKr3V1GSCR5y0QH5RYtpDihEoEMqnGEGLPf2yjHBQOAWSAkcOwZtbeatPlgQHN7TQWmhpnNAaHUjilgvZ6L7nmL/xORkzBCi24PRMmWyQhYO7uV4MLXMxFD7I/xnN1uIH+wd/TMLJpoU8kylaTlnsWBsPrwjTTo8M3PQv0Xvb2N1R+A1+hzB9zNqYawXbfCZRSJ8AKagiDGcm6Z0HD/IWQWphFGsUNVi9CjmwuGMSV1i5+VfBoDC8s3g4+YvDQcwOUyHEuxAdLsCpa3m5yGsvR6NxNQqPpZVaFUTcMMAtfp2oiXnN58ToWDLKS8Q53uEeUWAc3cO7hOZd/UvJUkxJcc02R7lTCsyVWDh3mTUw55i1pvWSBAWmuF6bGQelkaQNiRDiZoKImc0AAB0oYIKNXoKiBVnoyZeAiDzUdmmmWdrAU4RyMoAq4uUwp9AIzGljbGCy2i91FbDqHPl6dGT87wAt9g1s+0sGzJHll5IXJ+LFGIS/0SdOwTfKI+WPtfHB+aMVExD94+vztdxnZ/Z0XXEMhREFCYt82az2WaD+XVqkoHHqh7QCvTo8yFsiURAzjVwURYF5BPDBrlaljcps4KEop9RwIEwBmXI7vFdcipJSYtKTiB6hbBiYOoxFG3v/brdcXNbWi6Yx+r9yBQvM6ii+2hzcxyoobTbDp0sPr8C4w2kJ7s1dgEu2qaCyEwnKzya0rYWesgIzHhYHSUZzGFzdBrU8EFK+GuWBgIkISI0C3eTEH3Pc4QMZ4MB4dz1e/Hg8aSOHeNaXwoPUhJ6uBzKVufxxNg5GODQ8uqday228YWDrNobHfu418w4UGi3GOBl5OEV/Sh9tSq+scjUXGX/8c9/808OjI287PDyyHoVsHE0KLMVkjun9fz5wl8Ys5D65pVB5RFTACIvpPJdgQQjMUy0ezFxxqFsRwU5fQk8682cwgSjQ4YQxRHDUJAiFDbwVrkCx84WfYugRfQqM883GcTSXXvurSfdibIxHbUrFlg0MMNlHbkczmrWwRoQtA/xxcJC1JaeQcB5zF46q9eExWfgwfnzMra7mbycjidRqXGNTU1MpHLvIX6MA6kUwfhqST60ILNnj3d7i2Xs/HnLmLMwyhM6j7au93V0Fyn54ePSBQqm8wpTXdOFUKy9jXZ++pzAt2KzevWJ/zmrjRwY+ejEWLtxfaG+7kZc/o1mN5gbqE+xa00FrF7jLs1RGWaEkicMrdUSVgjteZriYqoG3WNxHwDsd1uFIoxAwMTs/KuoELLI7SgWBr/dI4hCOeAYt0ZScc7bcDL//p68mB/7v8wCiJuWySPjR2kMjpdFXWA4DVhWs6OrCsTaXvJMDWPodJi82z5G+2E44lnRwGgmDYyNj1oSmLOGbTRliOdnEltAi2Z3kIFTJvaVZWhspuHlvgPGKWH0U6nMu4hVncyqjHU0jP+T5C6+BmVT4DkMsZFe7dEBQnr89kcvfdWP/1h9SJk4L0TyZQSr6b/bE6duM7qRwbD4kyVPYtqiLsLltESnO+eN3crQVWxex24llp1aI8tLln88ylcFyOEPond7SRGTEOi6YKbsr0WoIoSuEoLKpLqNhELBLIvLFr5A4IjhpSKH/4goe4ER82PTliPSxg4eT/T96Wc6VFl+oYUU54VejTeYoOZgbLuMkywv/9a8mc3G6h1weDsUlHypwOxR5BPPGXVDgOU0V2PWLVSqJi1lVRk1MjaGLgIAox/GeTEbAaTlppnBwZJatgWvkP2U1D4GStqDAxDPBBOrgU5GX9FN+5NygjnasJkd6D4+NP4dO0dq+ga3/gxyKWC+RJCurKPf2xZoy4xMlPOUxayZADYq8dc+ettu3bpUVJtvXrf449ris753Reck4lhDibC4OreOqsGjayeeXszCAOLc9WC3y9rAm0iAQp3qS33V2lzI2OhsU2tUqkylx4CoK4RPYFN1ECgiFIE7cE8xzs47i5sCDODhuFGYV03Ey2sRDUsCDV7pwPnjBr3EByDLRMxZeKi6b1qrAeSgwpphiBQaNBolvqcVNS7nwpRAWVxNRTvNzDplfd3H2eG/xkXGQ+gwwBYtySZQszkrPzuQiIGLlFT+CCUnMhHbKKTTwIbisfCGkqdqEJWb2wLaEFW5dWPOAAarR/Qjr/r7+wa+QDxU3Xug0Vd4nQ3fyMXsDocfTTo9+8pY5lRnVtRDkzt4ZXd1Hh8dY0rBtMWHnL+SfZYgPDwCBAWBmTE86D/ee0hYEGiuudxncpY4VbC2/CvQ7l4QWbIEUjHspFYMD3Dtg0f8gR4RjYSMtm8JctcU7jIZfPyQXiPFsKo5Uc6sfrzbl6ZacH2ZtTPlYg3MUmjU2uyejUPJOUeAe1BCyFVTlEwF8oJCDYZrbZI0SjijndDGUuIYIxLbInwuNWMZLc9LCAR3/Y3JhEwEiq/AwIdQh1Payj4O4yZTxEf+nRoFdEnCatA1HT7UfHcU9k7VkC2be77tuYOtehnuqpoUkDifwshQ9AS+nhpTN6kuTFztst9PWu29ekWurbcCWxT4pgGMlJhhXioVpJ5+psWI7oMswSufJ6hwEZB6kgCaCt8CtdjPpwwq5lnXDO17mlYokxPoSu5AAHhxSwGKnIxFDCja/85gCYpMYw8uypU9WaAHJ0WvZ5ocRahmNdoykGY5AeAMEPwCjUPhOTDXNwTQS9pWKsigp3ilhYgWuQ6lMLgwXO4XxLXC+Uike8LQBxUEOfUCbIVUlzgIduTOi3G7gP+sXbsZPwCevwGCDUzGSEqZzu1gGcBbVdzBrv6lv/fZnKB6nhXp2DZf73GKmtOSn38XUP6NPEaPV701WVN/ntkttX3/zb6CZuBnTTm/naq6JSpWlj33jIKtkDvPIWWhGVnMYSCKYcmSiDM7K3FvgVruZ9PGGlFgZQyTjF4WNAmFoDyUAsnJsgA021TX1SxpOF/FibOUHOOlY85IXTF57wt8Ya2A0yedgR9OwHsYQxTEONSgXw7I4+vQ0wZyXBhIbhSVicFPeeODK8sBMR+nzcTK4cczi4abMdTWwT9WTU2CwL6O5XEAXLzlybPSHlVxt4Ib+bX9GcWSACpdT2L55E/EXbcY5+YsO24fHfNhUXFUoukMEiNg+sPoTKKT39czonI+vHpuPXCSMKWWXOz4zffZrYaZnwXkCQurKowAN4QsnAXB4t9olSIOpRqUUS1ACDwqnsMBP3BQJdI4VkeIWQxzhpVHAGwrKprP8uSjRv7MKnjx5xaj2ganE2PxABcYJHnOdAlfAA/qNhy/8xE4unhORwkcsjV7ih16dpRGNg6nEdDj+/IClgxJK0vnHSGMYkRGJOSkBkxw74bTrgMgxnfQx+cBdqnhzO3RTgx5y/KqxuZwcGxnDyprcpoPzkwdvv13HbjgttGrjjjI+dhZgU46nE3kiMTudcghvNquvvFIWdcuxPmiezJkoVe+FkHdw+pg1MjKTHbr2tCLHxQBpaskqpjlU/LQrHSVNDJckYriiCvvUlZi0CMUU1fFhSCxw8kxSGxNHEhXbSUoFhlViyGIlBK5R6kjINyiwjkaX0Gz2Csxlmhj8UgV2oZgslliOF7HSdKel0eP9KTKrzKmcUMFBmPEESEzng7Eom0xERHLRSk7S2oDlCKbKnsZxu5dfdEFy2UULkxLiqS0IC49pZwwMRqYNH3x9Ey77xQFyhVyJi2mqlT/K1/LrrJ/LWnf37hUYiz39o8sNJWwAPG6sGvg57SAkOWrklW027TTYv+atyJgvYDfHv5X543F8dmU8VjZKuEyOiwQ4WL6JaY7jiZ5JDjh9ATW7I7GmpiqlILWYOi01JWaInsbbnRx1iqx8BOsKntW+jA9BOExBFZpRIkx4sr9MxdN+cw7rokv42GGrttbAdQosniQYYaY2/2bcLH4eGFtcGsSgrF0Uh8Jpqgg6ziFPLzTe5S1B8Rhv7afT5MdlBK2LZ3/8crJgzsxkPloY+zHY95ZlS+TQfGVgAk5NgSECj7PJydpHMMB87t/WctW11/dv/9/k92Sx2L5yY7GCZJlEWg31TLwtpmci7OOGKTVysqvd+hnbB26+Dp424gt5Fa8wwf5jTjtxIyxOeyO7TBFhibfH4c2ZNidJBgdO1b4skAY3ZRW3whUV2RWgXsQeAM4GUfxnIi0WXF6BUfvqTmAWSiKUlAZ9c32GKjCb02hCl3G2dKzAaF4yvBAm/ZvLMSPIPabAZho8ZcJ7JsUVDXaidC7EyWhSvBo4yMOUlpIW0Kd/FevC9x86io9TQfr6C3Fo34u4yvVXcNMFxkscF1JrnOg/xNOhCQEJkoQeSrjloAuLMbhu+adw34fTHx+DKWfDJbuSypkaoKIMx3sY02n/yFI0l5C0Hy11/z6y5e5ZPV3z2YxCJnGjBKadMgVK8lAzUiKZdQuwSRJEqJQSO8WldyvgCoIH/SfG/sUUWr74CF95SUGKgIpSgLw5TcQyKD+UN/a6QjRUNUSBIYD0gWFSkfFxS7pxaID0gVkDZxWYTHw8hGMUKlEqH4Gx3YhSShlIReGc7tCnkQezPqiAi2y6tpsfI7RrMeL+Q5xGMge7t7izh3Ow/O3DVS+/hOm0g7gkfdF8HHsrfWALUwOaTIERFGc5uG45j6WPw6hcv9LRXv3iB+5+5CjFOFPTQgz7RB6L7Yn4OSO0KMC5xzbd0mnTTlyWWalV+7GI7RNdOFYGgw3oG7PEoH9sEnoLAXTgl4IZ4STJEIFFgUkOmIAbFHAFqSePdhbvdkEGd4beFXpCRVSnwDIqDUhQYNZOoMGPtNwfLH1DuHj3LxV4BlZyUYFHnAK7oMP6DC9Ew0RJKa4pcUpxjWFkqsIYQOPWOM2NJpjmlyZXk1FxWau+xjuZ8Ic1AvLNuQBnVPO4IJyXnFyKK01xwGJg4tLPMrpOgbGNGomG42w6O3jlDBYQ/adcrfLZvnse+RGZ6G6hZaXp1M+NIldndSlcB5+2gC233Sb76mw117aBNdcgbzdj7/G1LLSl0kQZ+0Axf+xLJ+Jixc4V1AblVROiQXJEoMmUWENyhDCMzkvgLEIR8WMix349PRHsH4uJASs09CQG1FYFuvYfaATEASrWwBiJBp41MI8pEwWe5RTY/II+I0IDgIYSlJZufDxSAiqNvJ1YpoACI62JG5E2ssb+THmPYinoy9itxZFgsrnswgXJ/8Ol6ew6zcYxQmw688ADe0hj6W4BB74SY5JMYO2jnIqBD/7TaM+su35g65PkwX7uzCV7cu9wI82EnQ1PXV6eDUJDxhwUuf22LVsnUE6YMcn2/pv7UMi/gN1Oy3B2Nb/eE8hA9Ax5GBYeoRJb2kF4lApqjQD04pyhgChMwK5Qq+EJnRe49T/y4Nl5i2PhA/JuygbFEwX286mEuWY1mUu8qFyIKDvCsHBAizVXUOAJVDvyFRB6kGYeMPGBZlAZ4pQSS9hKH5TF/Gc8GtiZ/J4wSPojG36AaCd/nov8Ixz+dwUO63sd/V0OWs2f3ZsMHRlOlqHJzNaIl8P5J1vNnyCUyiRTQjV81HDNUyeOsxnjPar9ff3btjtRki1bbivcdlsoSwY/G0wt3GeDpGkZa1YD246Pj23+ox2V17uW4wSQIjJuFMsycYINVjRg2gl5HD7VwidTuJjn7gda5xDC1MvqcQOKF/VAPQML8Sy81CbAgFMiC0rDZGgkFg9qETJaWcAlsOgNpGMTe1SY8yhKoV7Ed8Qia43wwQNtjIv8kWf0KG/AIrAqSkREwSd5zJtOoaqLF+rxLDXWrrw2c9+Bw8lcbKWchQUUrIFfwcDVQSgvm8tU3KC8DIRqq3+xUJpKSQmS4LaajjYofQVnLj94tK1yuSkvyw5kz3F+l9+PSUSe1uDJU3pai10vHJtAtprrD9fesqw9V90M/f0wTkZgXwkLgipUZB5En36QApII2ewzuGLVj0stFhf/xDCzozTYE6wKS7mNnsSxPXKL/uAlAzSQEcv4nLKSCAD+gyn7xuQtPygE5317cPugDGJxO6Gsu1QvEXta8cCzvNUUJgIJL1Eahw7QRjYXkQyKHwMXjNSgtO/HpeEXzMPdTWgx/QCbNxjGv8K5YD9+eZ8o7ALUurOx35lKrCu6EHs0RxrLEoSDUvJWkTzWDrSzJVKeqH47X6mt+9CGwV0Ui90wqwAyYp51zsapfdZFQwVGOc89dOcdHXc+pFdQbOu/+Vp86YuYcng3FWBkbHwMBQBnXOS4xjp6QuanlJMUVAqhdEkVpZin9ShYzC6mOTxYGfLtUIIJZJ7Qo6m8+OEfCiCvejsC1T/g6ZGbHEArCow+MJdSyiAYcSGqJipAyhfY8IgATorIj3iK3fDha0Tx7fw4TnHtTDsHp/ZggwbtPHIGRy6hhj0oTeMf4qywiy+Ym3RjhJmjzuznLl3ozs0mP4Sb5u6AMJieYIlNBrUy1tOz+ZUMj4z/E8CbVq3f9t9IyZHlZw7OL58tA1SU+XhPfXocz8dZgOdU09Ceub6ZjW2LH0MOr5/Z073sKG6TQFNtDNv2cA0gI+PVEFZXMsUAPE4d2NXpgN7wFkkZT2PgmAlgHq9BOzfFiDDOrzBEqRTlo0zeji+VOFWxaY+ViHbOqPT2oAZuosCquJTJxVsCzL5iYbK44NbwA22suKSC6BJFzt/+5GfohuKxkeQFc3qThfg9h0MNqNSLMMo8B01o9oUrqHE5BhA4i1e80jIjLmPIsa5ZOM4G00I/B3rzwvKFX2erjE3lfd9d3G4fduNwLpj16XIuxEqzN/dYMUw7fWPtjXM78oX/CCW9e2Z3V/vhoyMoH2hn4j4vLR2myCxpykCTopEiR8nmrObbSpq4Y7IpKTI8eH4MnQqqSkoNkD+Z61TJREkAVy98q42j0KbA3MzAJip0wb4Rwkc5hHdKidO6ETwG8gY2J3gDDEEa/VzyKq5SpQJfcfEFIhf7vbz5cg5GlvGBlVqX/WHOaTN+Oq4eM80Kxx3SepyNxrP2EDL087b88WybFopjOhV781SfCodpTlPEJusle5bnrM+zdd2a5Zgm/Rzmjj/kmtUT1Ykq25zU1KweRrEjOuWEujiAhzuId1Ol4IjdMROPcgSx2/yIAqsiixKLG3LAlBaDK8/xhntV4FrSiz6w7kZCHxjFnEFn7ssIESI/PBZsQDhbLHc9sg4SA0QRMTS+Dzcr4vAV6c9z4IoKt2TBnGQvBq1YC3OkmX1diiLRi5mI3cmoug22tSpqbOyuRHN5rPREvlJFP3c7rq/Qfu7ypUtrrIHr2JxDgEnz6xyKo0SFihwfczLYf9O/wbTLF3Gd49u4umd8vIQKWaop6DcelzLZBIqbqkE308RZxVYs3hEz1Yfgz9Mw6IhOC7MWXJ5zTGXgT0p4EJMSg73jAgb8OPXiYDzuB+YaF2mGC5UQmg18zOotsZiGVFPYR8IJNO2maPyAMA6Ugedz7UWfF/1RzE1XkzfjBM2X9h6QpjGOpJEalwtxtKmscbN4hMCDbIBxo0sNHwCc2yqXX/8E13Debdv80L/NvxciQHGFLvA4N23p1D834xjHitfC5HevCDtKtvavuQNzafdgIchCDHLxUrASaqs2KGqbleRGiVSvyI7KE0fF0KNg8XgVK+aTUmqTmgpLLeO/U14zSZJHv51Kw0dCZBAcxELHURW4Vzb0s0ktQTvarByRJjteYjR+xV+YiBHlksMYsJGC8TrEg+cxgoypvWQI9jHAOSjFJZA0OUjFxTdO8gZhqbCUGzZ+vXBmXA430HTwXqGjCOT+XaWl93NQCkHndvbhloOdvJ6E5OfHkylO50ekGct4KuEP1q2Zj4XURXS4PtHb1dl+GFed4EzmMWwkkFMYrIzWJRYKaQxLKaBDpChiWOSxsT9KCSJTWri05lWTtbGyCIVcqj36AkNugujhIBaapcN2sDtZZn8tCY0AAA+PSURBVB8vR32Z96isH7pFaCeB+4KwtmWt+8yuFxKsU5fFGVRUbgPlmnUeALcPh/H92psvlZqZSyVT6ePDqZNlHHEv4CObZ7MbQXyzWptY/+H1j75CL1yIYXt1PYvzxNI0j86DNMhhkMOvrx5ce/Pb8221IvpVv82VQRixHscQCRe76LUILrWyida0FvV+vEWSVV14OzCBMR9P5BRYa2BCtcalMkNNVakBRatVlYplnwNAKOXsA89F33I4PlYW6IaPjcA3QEYiRljKzsEyTg1hDzLs7OMyDi/ufV229x3AJgNu/2MNzM0Hl+EETbmJFjKyyVyvvEFxwYbfLq6mm0ATu4u0GOx6EnP7xevWbvkbCnKuD1BFiT2ptXHeTEp+biJYG89dOpSzbYuD61Z/EKWzOKu36you4xsfx7bFSgW3kaFYuRTLJlxW+VgAwUMTzBN772mUEvvETfl1CixFW+xKJs1qKKk9qeBiBZYTObiQwwdpXjJmcwIfBRcn+YBAUM7rsoY9cHhYVlNdsmhu8jy29y1eMJv7arFv95Xk6jdfnMzFggybDjK/QYAQD4MhfmNtuXwXVtQlaBH9FMFuwumP3yI+m1/m53w0Q76cj7HPxJlfdNvtxEuWu3oP/x5qlg2zejpnY9qphikPbIBK2kXBXMplEzClyEBGKus1yMMizwKL3BTNnNBb1rV8+RpXINBKFn3Sabh0wR4rsBxqx0Es0hlHIcu81G9TkoiDfMvA7meYFuKxNscwSIX5V9mXuxc1MXcKvQN3NrGPy8EqxkE6qplQJVJpmKxhx3xuHs1uLIWsbcY2v6/YNj/m0S0bHxtHHjiB057PN1ezHD3f0kLiy9skhn59bt76VI9+5pbF1UJtU3t7/jY2FVFQq9UJzMlwowTbjXiyiZhSYuKVTPgH4kidHAM18I4ZsuTjySqwKLXDES8KRZMOUWAMYkkTmqdSsga2+WISxAHQzSfSh0Zo54co8uIiiw5ssP/HH7wse3IXL5glq6dwSL8cccPdRPOwiIQPafmk0iEKj8qI2hkC1mpd3LWPB9v8/gu6Af1992x7gW6pdX99qHo6bzlgOGfb0zCrzrZInA55qcjka6cx4JC9d2Cq+MsYAX0PB1/GRku6EATLMqmf2YRMF1YwEhpHFRF7NU7BSO8AUBbqqSmw2CJdY3OUj4UH3RW/Mgo9qQKLD76iJ2JqUGoW7JFoMsrMXUEc6HsTzqFiE/lNOJMKl7one35+SM6m4rQQ++Ac0JpCc5k1Li5odLfWj5f+Ec7P2DY/HECV3xmdk2aitUxNgThvWmnSIAU4rxhfC7N97U0fqeXb7sVWvcvG0ccbH8O0U62KuhiK3MC/KZagQKA0jtIbzkIiDzPH8RU4DkM+JlQ8KE/vDGzolyZ0tgYWaUJg5oxNaC4/GjwcgN8IjjC/hhHkAzh/ag76s5wuWoxTML73g5dkVRU/OFycIXO6E27DQcxPPgUKYBTBkvO0E+DT2YnllRjo2otw7r1+/eDDpOLyx1U4QC43jQ6Qo1zT7YlKznQTbXrJw91Of43WI+cc2Q+rjFfWoa/5SUxtzDqK2ojrq1HSOzEHizRlvRWeWMG0JibOJb3PAV8Xe5RQiSKpMilbVejAPdiovOKZEkCBZx5XgR19YFFno+x7DxwSBWZf98evvJZciKmhuTN7ktFSCdNF3bIhAQdcoKnMkxzRElZBHK90WhCIGncMBi5W7OI5VOMQ9xvt5fK9v1t87BDx5/O0EON/Io8vPifi6XymjQe6tq296XKMGG1A/3g1dsDw8G8sAqmi/OZ40B4ep32wpQs13cS75I9ywauxwbT9nPkkNFZizxN+vQJzLTTmgXkXiLFkyPWP1rSUmbJS7Th/xgUY3J9L/xxJ5sgytwG+Hfcy4VQLbEKYKaPP7Be7IQHHOq24lA0DgBOQvILVb53c5ocBrj/HfPumGzY88n16kgGqIgaoJOEcm5bRNAWa52lTr+cvkrXxPx94uk3vQkaN0b/mfWhp3otFIO9mAceKI0w7sTZGseX8qivLWSWmRtUpLJI1BYNi4B8P+YgHsSuM8PBkFbi3W5vQVGDrKwfqtI1BUAH5x3MQuMWPA1GsYVlTcgMCm8hvWbZU4DzOlTJwXreZ4mooCL2GS8Ha2zpnoKY+cgzb/PK1Dav6B/878dw9dtmSubWz7TgbjduZfbcU+CTSn5e03fHQ4zz1QVRsa//qW7D+8j7MXV54BPf3olnNa1NxaS+0go9QQUXiVIc9pbAg827nKSgwAeIBpim2EDmwYwyDGiMKLNsJVYFT4TpvWeMl3IhIpeUBci/s2Z9csnieLMDYP3RM5OZWP8rDgTw+4aMkkcuyo5iodZN23lqPaaYhaPuGheNLH7ZNBu70R27An4RBPcsWJKSAy/EAaNlOLAU4yLUkujL168VVvZ2lGf3gcjcGuvLsH6NZzUPBqcbaNgUyFHw6+B+UjxJ4NxUVbqtBdcGU0srOIlfsVTkVTjubtLECa9+U4ZJ7+iFvrpjiSqojI6OcwsE65VlYnHFM5nGvWXGZmKxpeTwtn8Cnkd6JtJwYyqO5nJOrY6vVb1TKuY03Fre+Tv8yLTSEaaEzdCkYZTgXngbZeS5E6xcfBypyfC3Mw5+58YpCofAApjX/PRMZ9/VCp3C/U67G00Ak3YOSKqShG8plKmI2r8TCxbAhK/lx4La8lAKDj1GY8tHN+4R/8srP5YPCfjybxk9jLTPPn7pw4VzZq8vaU9Ytm0cvERjUP2XIme9ExBkfKO9fwf1pHJb+LEk5ujzdriepj8LZA7E8PXsknuaSUk+23n5bu+0/xrLM90OhPofbJK7mKC76x7ipjRVsrZBSWMYLuZGCMXdMP8UaHLL/1/mh4R/Hwyswl1JmFnKwfuS00MtoLnONMg+Me3X/oWQZlJbHt/IQOd7Ix5FmnkF1vAEw6jVYcltRBdO5OImK+3PLP8Ko1ca+9dv+lLKxxt27dGmFo/he1pblpFOARaT1nIYU4P7j9yYrE+vrbetf8/tQzrt6ujuWcvQWp06McuERZp14QCPKP9UXL32rRLQTI484vD4LmZ0dLQ4QOZMfASppb3c7jqbhmVjpeWBV4HYsgzyIvbqHZSXV86/uT+ZB2ZfjKFduNGBAYpKtr3lVkgbvUcC6OdiF5Y9D8PHlpDz0Ra4tZ407NBRWtjXw2wKdRApY1p8Ei5bXZikQTzt9Hcsyuzpqd0OB7sT51flDR4c5usR5p45YMzVTLGsiBaZV288hSBuZ9spLGigwF3JQgRvUwPRMpaSC/sXf70quwZrlWTjShs1kzGvLmdL8CDTTW+LwjeBNkTUM2nXw0AAsFN9eyLXd97vrHn6RYTyJ+fL3FR/jnG/rOU0pYKXkNLFvsWUKsDaeN++qtjvv1NMyH+2/5epqrvpZLMv8bZ4JhR1PJSgU+sZYXy1KCgWTpONbFVh112WXGAoXSgemFyoe/2UpJaaRJlNgoQUdm85cs8zakwsxjCvxkz/SYCihGY5FVHJs71NtSdv66/ofltv8dhSLHQsxjmatj8n5tDAnmwJR1p8sq5b/46VAEfOdSbJiwvqB29fd/DtQti+gWf3LbFajBtRpJ6+H1ERwdbWuV+Io12gVpYNFwVpzctS5WQ1ssnJJJEes5ZoSVKtcR9bkYVAYUc+1owXB5vLLCHVd38DWP6EfsMnt3LSqYNsym/BpoU5RCjTPrlMUSItNSAGOVr8Xg79WO9F9UfmFT6H0b8Aih5nDo2Ns2nJACKrFxVDIIqnwjIfLMss5qJTVukIBOFFegRv0gY1TMzPTfObAE3/tHPQaHi3hPt3c/bXXhz7f9+BO9n/lbqG/Bo19nAhrPac/BawYnP6QWiGkUkBqq504w6lvp6yIGOz/8KJcUtiM2u3WTuyo4yFw0FwuEsFpIFCnSIlFYckNSFaJmol46z8xUqNyGqlZE1oIj/NCyFxkwVvr87jhgINv/xVV9l22zU82HazaiX78FFvfxwmvhT6xFNC8PzE/LepTnAJsWhcxYku229eteVctn9vc2d62kqPFYzguE3Uf9DpX8PPATmXTRqS94HMyNTBrXwRdJhtcfN3JUyYxSPUMGgTr+wa2/CXl/B7OoXr77bgQTL8hBLWeM5ACLQU+A4neKEjWZMnupM36j9sGVq/G2uf1uJhrOY+swRzyKBSLdzvJQBcUWtnQYHUubnFIhS0K3MVppBl100iNwod3fh84vUxzDH3jbvTNufzxFeyw+nxf/9Y/pD/uFFq+99w/b7lRGk1HWEuBp1muxNNO2++6dWbSPvFJrEm8a1Y3Dvg5Nop+aBW1Xh6DYe7xegxLlJsnrMBgB+ZlrPfMzezpbMcAFfrhtQcx2/XAv/u0Ln9sTQtZok8fM8ry6SPU+S4JTwMZXtFTsPO5Hll762WVfHkjlieu4Sgxpp04iMQTQ2ybhOqu1cpAnKACc4BqAv3cDtbkOLr1z/NtyT0fWqu3+emlYP+MVVRPcXCt9UyjFGgp8DTKjKwo2QX/2wfWvBut5S9hscU7x3E+Mq4pmUCFiZFqzv4gK6PcpAL3oAnNe3azK7GicKi4VWwfbOc2P2yufw4t6LtWDQw+ThqOkC9ZsqfNzgeL/LWs0yQFoiyfJhK1xEilAGeJdu6Q0WoqGwedEyzLvBXGfVC6JewfY7PTRJ6XBOMWeuL51NXAUGhfQWMRFnu6GJwSxcUJklj+iGNbBwa/Kp7x4uKTjRuf5JyvhGnwljm9UoBf79YzjVMAX9iaTTXJQBdk/Q+bv/nIeMfo8pFS6UvQrvFe3LaINdVU3nEMaEGV+V3WMWvVPlVegKnmoEnaUIu3g7R2dHR8y0Q5t9yUV++QwqHYaC63lHcaFwwnWqsGnv55VCchT7Cw0erB9avfkqvm7sORtx/kLiD0X8tUVNTAHRiLklHoEezvxT5e9JuTGpZvdnDVFU6R/ItKLll/w7rBf2AAMc+6AFuAaZsCLQWetlnTXDAOdO1bHC6t3tZ/82+h4Vzs6ep8B+/XxbbFUSzk6MQ0Ug59YNxykOvmpWA4Jmc31njd27dui2zzo+IuTFa01i03T+5pi20p8LTNmqkJxhskDs6fX+YSRjZ/Ly5dfDuazffM7O5chKXVNShwtYAbdA8eGTmCka7No0Njf7DmS98aJvd4ympqobWoplsKtBR4uuXIG5CHo8XzDhwo3PmQ7nb6ZnH1BSMjlbvn9HZ96oJ5M5ODx0a2Y8R6k93mx2mhY9/dN9E6zuYNJHbLSysFTlcKsAZ2g1ASxI7Nt77r21/+vWstPDa7eaKmuVvm2Z8C/x/Fnr6bHLEqJAAAAABJRU5ErkJggg==\" alt=\"The pkgdown logo\" width=\"240\"></p>\n\n\n\n<!-- code folding -->\n\n\n<!-- dynamically load mathjax for compatibility with self-contained -->\n<script>\n  (function () {\n    var script = document.createElement(\"script\");\n    script.type = \"text/javascript\";\n    script.src  = \"https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n  })();\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/testthat/assets/articles-images/.gitignore",
    "content": "inst/doc\n"
  },
  {
    "path": "tests/testthat/assets/articles-images/DESCRIPTION",
    "content": "Package: kittens\nVersion: 1.0.0\nTitle: A test package\nDescription: A longer statement about the package.\nAuthors@R: c(\n    person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")),\n    person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n    )\nRoxygenNote: 6.0.1\nSuggests: \n    knitr,\n    rmarkdown\nVignetteBuilder: knitr\n"
  },
  {
    "path": "tests/testthat/assets/articles-images/README.md",
    "content": "# This is a kitten\n\n<img src=\"man/figures/kitten.jpg\" />\n"
  },
  {
    "path": "tests/testthat/assets/articles-images/_pkgdown.yml",
    "content": "template:\n  bootstrap: 5\n\nfigures:\n  dev: \"jpeg\"\n  fig.ext: \"jpg\"\n  fig.width: 3\n  fig.asp: 1\n"
  },
  {
    "path": "tests/testthat/assets/articles-images/man/kitten.Rd",
    "content": "\\name{kitten}\n\\alias{kitten}\n\\title{A picture of a kitten}\n\\description{\n\\figure{kitten.jpg}\n}\n"
  },
  {
    "path": "tests/testthat/assets/articles-images/man-figures.Rproj",
    "content": "Version: 1.0\n\nRestoreWorkspace: Default\nSaveWorkspace: Default\nAlwaysSaveHistory: Default\n\nEnableCodeIndexing: Yes\nUseSpacesForTab: Yes\nNumSpacesForTab: 2\nEncoding: UTF-8\n\nRnwWeave: knitr\nLaTeX: XeLaTeX\n\nAutoAppendNewline: Yes\nStripTrailingWhitespace: Yes\n\nBuildType: Package\nPackageUseDevtools: Yes\nPackageInstallArgs: --no-multiarch --with-keep.source\n"
  },
  {
    "path": "tests/testthat/assets/articles-images/vignettes/.gitignore",
    "content": "*.html\n*.R\n"
  },
  {
    "path": "tests/testthat/assets/articles-images/vignettes/kitten.Rmd",
    "content": "---\ntitle: \"kitten\"\noutput: rmarkdown::html_vignette\nvignette: >\n  %\\VignetteIndexEntry{kitten}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n```{r, include = FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\"\n)\n```\n\n## `knitr::include_graphics()`\n\n``` {r}\nknitr::include_graphics(\"../man/figures/kitten.jpg\")\n```\n\n``` {r}\nknitr::include_graphics(\"another-kitten.jpg\")\n```\n\n## rmarkdown\n\n![](../man/figures/kitten.jpg)\n\n![](another-kitten.jpg)\n\n## External package\n\n```{r magick}\nmagick::image_read(\"another-kitten.jpg\")\n```\n\n## Plot\n\n```{r plot}\nplot(1:3)\n```"
  },
  {
    "path": "tests/testthat/assets/figure/DESCRIPTION",
    "content": "Package: testpackage\nVersion: 1.0.0\nTitle: A test package\nDescription: A longer statement about the package.\nAuthors@R: c(\n    person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")),\n    person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n    )\nRoxygenNote: 6.0.1\n"
  },
  {
    "path": "tests/testthat/assets/figure/_pkgdown.yml",
    "content": "template:\n  bootstrap: 5\n\nfigures:\n  dev: \"jpeg\"\n  fig.ext: \"jpg\"\n  fig.width: 3\n  fig.asp: 1\n"
  },
  {
    "path": "tests/testthat/assets/figure/man/figure.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/bacon.R\n\\name{Figure}\n\\alias{Figure}\n\\title{Figure}\n\\description{\nPulled pork is delicious\n}\n\\examples{\nplot(1:5)\nhist(1:3)\n}\n\\keyword{internal}\n"
  },
  {
    "path": "tests/testthat/assets/figure/vignettes/figures.Rmd",
    "content": "---\ntitle: \"Test: Figures\"\n---\n\n```{r}\n#| fig-alt: A scatterplot of the numbers 1-10.\nplot(1:10)\n```\n"
  },
  {
    "path": "tests/testthat/assets/llm.html",
    "content": "<!DOCTYPE html>\n<html>\n  <body>\n    <main id=\"main\" class=\"col-md-9\">\n      <div class=\"page-header\">\n        <img src=\"../logo.png\" class=\"logo\" alt=\"\" />\n        <h1>Page title</h1>\n        <small class=\"dont-index\">Source:\n          <a\n            href=\"https://github.com/r-lib/pkgdown/blob/main/R/autolink_html.R\"\n            class=\"external-link\"\n            ><code>R/autolink_html.R</code></a\n          ></small>\n        <div class=\"d-none name\"><code>autolink_html.Rd</code></div>\n      </div>\n\n      <h2>Heading</h2>\n\n      <p>Some text</p>\n    </main>\n  </body>\n</html>\n"
  },
  {
    "path": "tests/testthat/assets/reference/DESCRIPTION",
    "content": "Package: testpackage\nVersion: 1.0.0\nTitle: A test package\nDescription: A test package\nAuthors@R: person(\"Hadley Wickham\")\nRoxygenNote: 7.3.1\n"
  },
  {
    "path": "tests/testthat/assets/reference/NAMESPACE",
    "content": "# Generated by roxygen2: do not edit by hand\n\nexport(\"?\")\nexport(a)\nexport(b)\nexport(c)\n"
  },
  {
    "path": "tests/testthat/assets/reference/R/funs.R",
    "content": "#' A\n#' @export\n#' @keywords foo\n#' @param a a letter\n#' @param b a a number\n#' @param c a logical\na <- function(a, b, c) {}\n\n#' B\n#' @export\n#' @concept graphics\nb <- function() {}\n\n#' C\n#' @export\nc <- function() {}\n\n#' D\n#' @usage\n#' \\special{?topic}\n#' @export\n`?` <- function() {}\n\n#' E\n#' @name e\nNULL\n\n#' F\n#' @keywords internal\n#' @examples\n#' testpackage:::f()\nf <- function() {\n  runif(5L)\n}\n\n\n#' g <-> h\n#' @keywords internal\ng <- function() 1\n"
  },
  {
    "path": "tests/testthat/assets/reference/_pkgdown.yml",
    "content": "url: http://test.org\n\ntemplate:\n  bootstrap: 5\n"
  },
  {
    "path": "tests/testthat/assets/reference/man/a.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/funs.R\n\\name{a}\n\\alias{a}\n\\title{A}\n\\usage{\na(a, b, c)\n}\n\\arguments{\n\\item{a}{a letter}\n\n\\item{b}{a a number}\n\n\\item{c}{a logical}\n}\n\\description{\nA\n}\n\\keyword{foo}\n"
  },
  {
    "path": "tests/testthat/assets/reference/man/b.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/funs.R\n\\name{b}\n\\alias{b}\n\\title{B}\n\\usage{\nb()\n}\n\\description{\nB\n}\n\\concept{graphics}\n"
  },
  {
    "path": "tests/testthat/assets/reference/man/c.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/funs.R\n\\name{c}\n\\alias{c}\n\\title{C}\n\\usage{\nc()\n}\n\\description{\nC\n}\n"
  },
  {
    "path": "tests/testthat/assets/reference/man/e.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/funs.R\n\\name{e}\n\\alias{e}\n\\title{E}\n\\description{\nE\n}\n"
  },
  {
    "path": "tests/testthat/assets/reference/man/f.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/funs.R\n\\name{f}\n\\alias{f}\n\\title{F}\n\\usage{\nf()\n}\n\\description{\nF\n}\n\\examples{\ntestpackage:::f()\n}\n\\keyword{internal}\n"
  },
  {
    "path": "tests/testthat/assets/reference/man/g.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/funs.R\n\\name{g}\n\\alias{g}\n\\title{g <-> h}\n\\usage{\ng()\n}\n\\description{\ng <-> h\n}\n\\keyword{internal}\n"
  },
  {
    "path": "tests/testthat/assets/reference/man/help.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/funs.R\n\\name{?}\n\\alias{?}\n\\title{D}\n\\usage{\n\\special{?topic}\n}\n\\description{\nD\n}\n"
  },
  {
    "path": "tests/testthat/assets/reference-fail/DESCRIPTION",
    "content": "Package: testpackage\nVersion: 1.0.0\nTitle: A test package\nDescription: A longer statement about the package.\nAuthors@R: c(\n    person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")),\n    person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n    )\nRoxygenNote: 6.1.1\nEncoding: UTF-8\n"
  },
  {
    "path": "tests/testthat/assets/reference-fail/NAMESPACE",
    "content": "# Generated by roxygen2: do not edit by hand\n\nexport(f)\n"
  },
  {
    "path": "tests/testthat/assets/reference-fail/R/f.R",
    "content": "#' Title\n#'\n#' \\url{}\n#' @export\nf <- function() {}\n"
  },
  {
    "path": "tests/testthat/assets/reference-fail/man/f.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/f.R\n\\name{f}\n\\alias{f}\n\\title{Title}\n\\usage{\nf()\n}\n\\description{\nTitle\n\n\\url{}\n}\n"
  },
  {
    "path": "tests/testthat/assets/reference-html-dep/DESCRIPTION",
    "content": "Package: testpackage\nVersion: 1.0.0\nTitle: A test package\nDescription: A test package\nAuthors@R: person(\"Hadley Wickham\")\nRoxygenNote: 7.1.2\n"
  },
  {
    "path": "tests/testthat/assets/reference-html-dep/NAMESPACE",
    "content": "# Generated by roxygen2: do not edit by hand\n\nexport(a)\n"
  },
  {
    "path": "tests/testthat/assets/reference-html-dep/R/funs.R",
    "content": "#' Example with HTML dependency\n#'\n#' @examples\n#' a()\n#' @export\na <- function() {\n  x <- htmltools::tagList(\n    htmltools::p(\"hello\"),\n    rmarkdown::html_dependency_jquery(),\n    rmarkdown::html_dependency_bootstrap(\"flatly\")\n  )\n  htmltools::browsable(x)\n}\n"
  },
  {
    "path": "tests/testthat/assets/reference-html-dep/_pkgdown.yml",
    "content": "url: http://test.org\n\ntemplate:\n  bootstrap: 5\n"
  },
  {
    "path": "tests/testthat/assets/reference-html-dep/man/a.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/funs.R\n\\name{a}\n\\alias{a}\n\\title{Example with HTML dependency}\n\\usage{\na()\n}\n\\description{\nExample with HTML dependency\n}\n\\examples{\na()\n}\n"
  },
  {
    "path": "tests/testthat/assets/reference-language/one/DESCRIPTION",
    "content": "Package: testpackage\nVersion: 1.0.0\nTitle: A test package\nDescription: A test package\nAuthors@R: person(\"Hadley Wickham\")\nRoxygenNote: 7.3.1\nLanguage: fr\n"
  },
  {
    "path": "tests/testthat/assets/reference-language/two/DESCRIPTION",
    "content": "Package: testpackage\nVersion: 1.0.0\nTitle: A test package\nDescription: A test package\nAuthors@R: person(\"Hadley Wickham\")\nRoxygenNote: 7.3.1\nLanguage: en-US, fr\n"
  },
  {
    "path": "tests/testthat/assets/reference-pre-post/DESCRIPTION",
    "content": "Package: testpackage\nVersion: 1.0.0\nTitle: A test package\nDescription: A longer statement about the package.\nAuthors@R: c(\n    person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")),\n    person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n    )\nRoxygenNote: 6.1.1\nEncoding: UTF-8\n"
  },
  {
    "path": "tests/testthat/assets/reference-pre-post/pkgdown/post-reference.R",
    "content": "a <- a + 1\n"
  },
  {
    "path": "tests/testthat/assets/reference-pre-post/pkgdown/pre-reference.R",
    "content": "a <- 1\n"
  },
  {
    "path": "tests/testthat/assets/reference-selector/DESCRIPTION",
    "content": "Package: testpackage\nVersion: 1.0.0\nTitle: A test package\nDescription: A test package\nAuthors@R: person(\"Hadley Wickham\")\nRoxygenNote: 7.3.1\n"
  },
  {
    "path": "tests/testthat/assets/reference-selector/NAMESPACE",
    "content": "# Generated by roxygen2: do not edit by hand\n\nexport(A)\nexport(matches)\n"
  },
  {
    "path": "tests/testthat/assets/reference-selector/NEWS.md",
    "content": "# mypackage\n\n## mypackage foo\n\n## mypackage bar\n\n"
  },
  {
    "path": "tests/testthat/assets/reference-selector/R/funs.R",
    "content": "#' matches\n#' @export\nmatches <- function() {}\n\n#' A\n#' @export\nA <- function() {}\n"
  },
  {
    "path": "tests/testthat/assets/reference-selector/_pkgdown.yml",
    "content": "url: http://test.org\n\ntemplate:\n  bootstrap: 5\n"
  },
  {
    "path": "tests/testthat/assets/reference-selector/man/A.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/funs.R\n\\name{A}\n\\alias{A}\n\\title{A}\n\\usage{\nA()\n}\n\\description{\nA\n}\n"
  },
  {
    "path": "tests/testthat/assets/reference-selector/man/matches.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/funs.R\n\\name{matches}\n\\alias{matches}\n\\title{matches}\n\\usage{\nmatches()\n}\n\\description{\nmatches\n}\n"
  },
  {
    "path": "tests/testthat/assets/sitemaps-schema-0.9.xsd",
    "content": "<?xml version=\"1.0\"?>\n<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\" targetNamespace=\"http://www.sitemaps.org/schemas/sitemap/0.9\" elementFormDefault=\"qualified\">\n  <xsd:annotation>\n    <xsd:documentation>\nXML Schema for Sitemap files. Last Modified 2008-03-26\n</xsd:documentation>\n  </xsd:annotation>\n  <xsd:element name=\"urlset\">\n    <xsd:annotation>\n      <xsd:documentation>\nContainer for a set of up to 50,000 document elements. This is the root element of the XML file.\n</xsd:documentation>\n    </xsd:annotation>\n    <xsd:complexType>\n      <xsd:sequence>\n        <xsd:any namespace=\"##other\" minOccurs=\"0\" maxOccurs=\"unbounded\" processContents=\"strict\"/>\n        <xsd:element name=\"url\" type=\"tUrl\" maxOccurs=\"unbounded\"/>\n      </xsd:sequence>\n    </xsd:complexType>\n  </xsd:element>\n  <xsd:complexType name=\"tUrl\">\n    <xsd:annotation>\n      <xsd:documentation>\nContainer for the data needed to describe a document to crawl.\n</xsd:documentation>\n    </xsd:annotation>\n    <xsd:sequence>\n      <xsd:element name=\"loc\" type=\"tLoc\"/>\n      <xsd:element name=\"lastmod\" type=\"tLastmod\" minOccurs=\"0\"/>\n      <xsd:element name=\"changefreq\" type=\"tChangeFreq\" minOccurs=\"0\"/>\n      <xsd:element name=\"priority\" type=\"tPriority\" minOccurs=\"0\"/>\n      <xsd:any namespace=\"##other\" minOccurs=\"0\" maxOccurs=\"unbounded\" processContents=\"strict\"/>\n    </xsd:sequence>\n  </xsd:complexType>\n  <xsd:simpleType name=\"tLoc\">\n    <xsd:annotation>\n      <xsd:documentation>\nREQUIRED: The location URI of a document. The URI must conform to RFC 2396 (http://www.ietf.org/rfc/rfc2396.txt).\n</xsd:documentation>\n    </xsd:annotation>\n    <xsd:restriction base=\"xsd:anyURI\">\n      <xsd:minLength value=\"12\"/>\n      <xsd:maxLength value=\"2048\"/>\n    </xsd:restriction>\n  </xsd:simpleType>\n  <xsd:simpleType name=\"tLastmod\">\n    <xsd:annotation>\n      <xsd:documentation>\nOPTIONAL: The date the document was last modified. The date must conform to the W3C DATETIME format (http://www.w3.org/TR/NOTE-datetime). Example: 2005-05-10 Lastmod may also contain a timestamp. Example: 2005-05-10T17:33:30+08:00\n</xsd:documentation>\n    </xsd:annotation>\n    <xsd:union>\n      <xsd:simpleType>\n        <xsd:restriction base=\"xsd:date\"/>\n      </xsd:simpleType>\n      <xsd:simpleType>\n        <xsd:restriction base=\"xsd:dateTime\"/>\n      </xsd:simpleType>\n    </xsd:union>\n  </xsd:simpleType>\n  <xsd:simpleType name=\"tChangeFreq\">\n    <xsd:annotation>\n      <xsd:documentation>\nOPTIONAL: Indicates how frequently the content at a particular URL is likely to change. The value \"always\" should be used to describe documents that change each time they are accessed. The value \"never\" should be used to describe archived URLs. Please note that web crawlers may not necessarily crawl pages marked \"always\" more often. Consider this element as a friendly suggestion and not a command.\n</xsd:documentation>\n    </xsd:annotation>\n    <xsd:restriction base=\"xsd:string\">\n      <xsd:enumeration value=\"always\"/>\n      <xsd:enumeration value=\"hourly\"/>\n      <xsd:enumeration value=\"daily\"/>\n      <xsd:enumeration value=\"weekly\"/>\n      <xsd:enumeration value=\"monthly\"/>\n      <xsd:enumeration value=\"yearly\"/>\n      <xsd:enumeration value=\"never\"/>\n    </xsd:restriction>\n  </xsd:simpleType>\n  <xsd:simpleType name=\"tPriority\">\n    <xsd:annotation>\n      <xsd:documentation>\nOPTIONAL: The priority of a particular URL relative to other pages on the same site. The value for this element is a number between 0.0 and 1.0 where 0.0 identifies the lowest priority page(s). The default priority of a page is 0.5. Priority is used to select between pages on your site. Setting a priority of 1.0 for all URLs will not help you, as the relative priority of pages on your site is what will be considered.\n</xsd:documentation>\n    </xsd:annotation>\n    <xsd:restriction base=\"xsd:decimal\">\n      <xsd:minInclusive value=\"0.0\"/>\n      <xsd:maxInclusive value=\"1.0\"/>\n    </xsd:restriction>\n  </xsd:simpleType>\n</xsd:schema>\n"
  },
  {
    "path": "tests/testthat/assets/templates-local/DESCRIPTION",
    "content": "Package: testpackage\nVersion: 1.0.0\nTitle: A test package\nDescription: A longer statement about the package.\nAuthors@R: c(\n    person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")),\n    person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n    )\nRoxygenNote: 6.0.1\n"
  },
  {
    "path": "tests/testthat/assets/templates-local/pkgdown/templates/content-article.html",
    "content": "CONTENT ARTICLE BODY\n"
  },
  {
    "path": "tests/testthat/assets/templates-local/pkgdown/templates/footer-article.html",
    "content": "CONTENT ARTICLE FOOTER\n"
  },
  {
    "path": "tests/testthat/helper.R",
    "content": "skip_if_no_pandoc <- function(version = \"1.12.3\") {\n  skip_if_not(rmarkdown::pandoc_available(version), \"pandoc not available\")\n}\nskip_if_no_quarto <- function() {\n  skip_on_os(\"windows\") # quarto set up currently broken?\n  skip_if(is.null(quarto::quarto_path()), \"quarto not available\")\n  skip_if_not(quarto::quarto_version() >= \"1.5\", \"quarto 1.5 not available\")\n}\n\n# Simulate a package --------------------------------------------------------\n\nlocal_pkgdown_site <- function(\n  path = NULL,\n  meta = list(),\n  desc = list(),\n  env = caller_env()\n) {\n  check_string(path, allow_null = TRUE)\n\n  dst_path <- path_real(\n    withr::local_tempdir(.local_envir = env, pattern = \"pkgdown-dst\")\n  )\n  # Simulate init_site() so we only have to run it if we care about <head>\n  file_create(path(dst_path, \"pkgdown.yml\"))\n  dir_create(path(dst_path, \"deps\"))\n  file_create(path(dst_path, \"deps\", \"data-deps.txt\"))\n\n  meta <- modify_list(meta, list(destination = dst_path))\n\n  if (is.null(path)) {\n    path <- path_real(\n      withr::local_tempdir(.local_envir = env, pattern = \"pkgdown-src\")\n    )\n\n    description <- desc::desc(\"!new\")\n    description$set(\"Package\", \"testpackage\")\n    description$set(\"Title\", \"A test package\")\n    if (length(desc) > 0) {\n      inject(description$set(!!!desc))\n    }\n    description$write(file = path(path, \"DESCRIPTION\"))\n\n    # Default to BS5 only if template not specified\n    meta$template <- meta$template %||% list(bootstrap = 5)\n\n    # Record meta in case we re-run as_pkgdown()\n    yaml::write_yaml(meta, path(path, \"_pkgdown.yml\"))\n\n    # Make it a bit easier to create other files\n    dir_create(path(path, \"R\"))\n    dir_create(path(path, \"vignettes\"))\n  }\n\n  as_pkgdown(path, meta)\n}\n\npkg_add_file <- function(pkg, path, lines = NULL) {\n  full_path <- path(pkg$src_path, path)\n  dir_create(path_dir(full_path))\n\n  if (is.null(lines)) {\n    file_create(full_path)\n  } else {\n    write_lines(lines, full_path)\n  }\n\n  if (path_has_parent(path, \"vignettes\")) {\n    pkg <- as_pkgdown(pkg$src_path)\n  }\n  pkg\n}\n\npkg_add_kitten <- function(pkg, path) {\n  full_path <- path(pkg$src_path, path)\n  dir_create(full_path)\n\n  file_copy(test_path(\"assets/kitten.jpg\"), full_path)\n  pkg\n}\n\npkg_vignette <- function(..., title = \"title\") {\n  dots <- list2(title = title, ...)\n  meta <- dots[have_name(dots)]\n  contents <- unlist(dots[!have_name(dots)])\n\n  meta$vignette <- paste0(\"\\n\", \"  %\\\\VignetteIndexEntry{\", title, \"}\")\n  yaml <- yaml::as.yaml(\n    meta,\n    handlers = list(logical = yaml::verbatim_logical)\n  )\n\n  c(\"---\", yaml, \"---\", contents)\n}\n\nr_code_block <- function(...) c(\"```{r}\", ..., \"```\")\n\n# Simulate a template package ------------------------------------------------\n\nlocal_pkgdown_template_pkg <- function(\n  path = NULL,\n  meta = NULL,\n  env = parent.frame()\n) {\n  if (is.null(path)) {\n    path <- withr::local_tempdir(.local_envir = env)\n    desc <- desc::desc(\"!new\")\n    desc$set(\"Package\", \"templatepackage\")\n    desc$set(\"Title\", \"A test template package\")\n    desc$write(file = path(path, \"DESCRIPTION\"))\n  }\n\n  if (!is.null(meta)) {\n    path_pkgdown_yml <- path(path, \"inst\", \"pkgdown\", \"_pkgdown.yml\")\n    dir_create(path_dir(path_pkgdown_yml))\n    yaml::write_yaml(meta, path_pkgdown_yml)\n  }\n\n  pkgload::load_all(path, quiet = TRUE)\n  withr::defer(pkgload::unload(\"templatepackage\"), envir = env)\n\n  path\n}\n\nin_rcmd_check <- function() {\n  !is.na(Sys.getenv(\"_R_CHECK_PACKAGE_NAME_\", NA)) ||\n    tolower(Sys.getenv(\"_R_CHECK_LICENSE_\")) == \"true\"\n}\n"
  },
  {
    "path": "tests/testthat/test-build-article.R",
    "content": "test_that(\"can build article that uses html_vignette\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/test.Rmd\",\n    pkg_vignette(\n      output = \"rmarkdown::html_vignette\",\n      pkgdown = list(as_is = TRUE)\n    )\n  )\n\n  # theme is not set since html_vignette doesn't support it\n  suppressMessages(expect_no_error(build_article(\"test\", pkg)))\n})\n\ntest_that(\"can override html_document() options\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/test.Rmd\",\n    pkg_vignette(\n      output = list(html_document = list(number_sections = TRUE)),\n      pkgdown = list(as_is = TRUE),\n      \"# Heading 1\",\n      \"# Heading 2\"\n    )\n  )\n  suppressMessages(path <- build_article(\"test\", pkg))\n\n  # Check that number_sections is respected\n  html <- xml2::read_html(path)\n  expect_equal(xpath_text(html, \".//h2//span\"), c(\"1\", \"2\"))\n\n  # But title isn't affected\n  expect_equal(xpath_text(html, \".//h1\"), \"title\")\n\n  # And no links or scripts are inlined\n  expect_equal(xpath_length(html, \".//body//link\"), 0)\n  expect_equal(xpath_length(html, \".//body//script\"), 0)\n})\n\ntest_that(\"can set width\", {\n  pkg <- local_pkgdown_site(meta = list(code = list(width = 50)))\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/test.Rmd\",\n    pkg_vignette(\n      r_code_block(\"getOption('width')\")\n    )\n  )\n\n  suppressMessages(path <- build_article(\"test\", pkg))\n  html <- xml2::read_html(path)\n  expect_equal(xpath_text(html, \".//pre\")[[2]], \"## [1] 50\")\n})\n\ntest_that(\"bad width gives nice error\", {\n  pkg <- local_pkgdown_site(meta = list(code = list(width = \"abc\")))\n  expect_snapshot(rmarkdown_setup_pkgdown(pkg), error = TRUE)\n})\n\ntest_that(\"BS5 article laid out correctly with and without TOC\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/toc-true.Rmd\",\n    pkg_vignette(\n      \"## Heading 1\",\n      \"## Heading 2\"\n    )\n  )\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/toc-false.Rmd\",\n    pkg_vignette(\n      toc = FALSE,\n      \"## Heading 1\",\n      \"## Heading 2\"\n    )\n  )\n\n  suppressMessages(toc_true_path <- build_article(\"toc-true\", pkg))\n  suppressMessages(toc_false_path <- build_article(\"toc-false\", pkg))\n\n  toc_true <- xml2::read_html(toc_true_path)\n  toc_false <- xml2::read_html(toc_false_path)\n\n  # Always has class col-md-9\n  expect_equal(xpath_attr(toc_true, \".//main\", \"class\"), \"col-md-9\")\n  expect_equal(xpath_attr(toc_false, \".//main\", \"class\"), \"col-md-9\")\n\n  # The no sidebar without toc\n  expect_equal(xpath_length(toc_true, \".//aside\"), 1)\n  expect_equal(xpath_length(toc_false, \".//aside\"), 0)\n})\n\ntest_that(\"BS5 article gets correctly activated navbar\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"vignettes/article.Rmd\", pkg_vignette())\n  suppressMessages(article_path <- build_article(\"article\", pkg))\n\n  html <- xml2::read_html(article_path)\n  navbar <- xml2::xml_find_first(html, \".//div[contains(@class, 'navbar')]\")\n\n  expect_equal(\n    xpath_text(navbar, \".//li[contains(@class, 'active')]//button\"),\n    \"Articles\"\n  )\n})\n\ntest_that(\"titles are escaped when needed\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/test.Rmd\",\n    pkg_vignette(title = \"a <-> b\")\n  )\n  suppressMessages(path <- build_article(\"test\", pkg))\n\n  html <- xml2::read_html(path)\n  expect_equal(\n    xpath_text(html, \"//title\", trim = TRUE),\n    \"a <-> b • testpackage\"\n  )\n  expect_equal(xpath_text(html, \"//h1\", trim = TRUE), \"a <-> b\")\n})\n\ntest_that(\"output is reproducible by default, i.e. 'seed' is respected\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/test.Rmd\",\n    pkg_vignette(\n      r_code_block(\"runif(5L)\")\n    )\n  )\n  suppressMessages(path <- build_article(\"test\", pkg))\n\n  html <- xml2::read_html(path)\n  output <- xpath_text(html, \"//main//pre\")[[2]]\n  expect_snapshot(cat(output))\n})\n\ntest_that(\"reports on bad open graph meta-data\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/test.Rmd\",\n    pkg_vignette(\n      opengraph = list(twitter = 1)\n    )\n  )\n  expect_snapshot(build_article(\"test\", pkg), error = TRUE)\n})\n\ntest_that(\"can control math mode\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"vignettes/math.Rmd\", \"$1 + 1$\")\n\n  pkg$meta$template$`math-rendering` <- \"mathml\"\n  suppressMessages(init_site(pkg))\n  suppressMessages(path <- build_article(\"math\", pkg))\n  html <- xml2::read_html(path)\n  expect_equal(xpath_length(html, \".//math\"), 1)\n\n  pkg$meta$template$`math-rendering` <- \"mathjax\"\n  suppressMessages(init_site(pkg))\n  suppressMessages(path <- build_article(\"math\", pkg))\n  html <- xml2::read_html(path)\n  expect_equal(xpath_length(html, \".//span[contains(@class, 'math')]\"), 1)\n\n  pkg$meta$template$`math-rendering` <- \"katex\"\n  suppressMessages(init_site(pkg))\n  suppressMessages(path <- build_article(\"math\", pkg))\n  html <- xml2::read_html(path)\n  expect_equal(xpath_length(html, \".//span[contains(@class, 'math')]\"), 1)\n  expect_contains(\n    path_file(xpath_attr(html, \".//script\", \"src\")),\n    c(\"katex-auto.js\", \"auto-render.min.js\", \"katex.min.js\")\n  )\n})\n\ntest_that(\"rmarkdown_template cleans up after itself\", {\n  pkg <- local_pkgdown_site()\n  path <- NULL\n\n  local({\n    path <<- rmarkdown_template(pkg)\n    expect_true(file_exists(path))\n  })\n  expect_false(file_exists(path))\n})\n\ntest_that(\"build_article styles ANSI escapes\", {\n  skip_if_no_pandoc()\n\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/test.Rmd\",\n    pkg_vignette(\n      r_code_block(\"cat(cli::col_red('X'), '\\n')\")\n    )\n  )\n\n  suppressMessages(path <- build_article(\"test\", pkg))\n  html <- xml2::read_html(path)\n  expect_snapshot_output(xpath_xml(html, \".//code//span[@class='co']\"))\n})\n\n# Errors -----------------------------------------------------------------------\n\ntest_that(\"build_article yields useful error if pandoc fails\", {\n  skip_on_cran() # fragile due to pandoc dependency\n  skip_if_no_pandoc(\"2.18\")\n\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/test.Rmd\",\n    c(\n      \"Some text.\",\n      \"\",\n      \"[^1]: Unreferenced footnote.\",\n      \"\"\n    )\n  )\n\n  expect_error(\n    build_article(\"test\", pkg, pandoc_args = \"--fail-if-warnings\"),\n    \"Note with key .+ defined at .+ but not used\"\n  )\n})\n\ntest_that(\"build_article yields useful error if R fails\", {\n  skip_if_no_pandoc()\n  # R 4.1.3 does not have UTF-8 support on Windows which breaks snapshot\n  skip_if(\n    R.version$minor < 4.2 &&\n      identical(tolower(Sys.info()[['sysname']]), \"windows\"),\n    \"R on Windows before 4.2 does not have UTF-8 support.\"\n  )\n\n  # workaround an as-yet unreleassed knitr version\n  # https://github.com/yihui/knitr/issues/2399#issuecomment-2803554647\n  skip_if(packageVersion('knitr') < '1.50.3')\n\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/test.Rmd\",\n    c(\n      \"---\",\n      \"title: title\",\n      \"---\",\n      \"```{r}\",\n      \"options(cli.num_colors = 1L)\",\n      \"f <- function() g()\",\n      \"g <- function() h()\",\n      \"h <- function() rlang::abort('Error!')\",\n      \"f()\",\n      \"```\"\n    )\n  )\n  # For following snapshot we opted-out color setting option in the Rmd file\n  # check that error looks good\n  expect_snapshot(\n    build_article(\"test\", pkg),\n    error = TRUE,\n    variant = if (in_rcmd_check()) \"rcmdcheck\" else \"not-in-rcmcheck\"\n  )\n  # check that traceback looks good - need extra work because rlang\n  # avoids tracebacks in snapshots\n  expect_snapshot(\n    summary(expect_error(build_article(\"test\", pkg))),\n    variant = if (in_rcmd_check()) \"rcmdcheck\" else \"not-in-rcmcheck\"\n  )\n})\n\n# Images -----------------------------------------------------------------------\n\ntest_that(\"build_article copies image files in subdirectories\", {\n  skip_if_no_pandoc()\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/test.Rmd\",\n    c(\n      \"```{r}\",\n      \"#| fig-alt: alt-text\",\n      \"knitr::include_graphics('test/kitten.jpg')\",\n      \"```\"\n    )\n  )\n  pkg <- pkg_add_kitten(pkg, \"vignettes/test\")\n\n  expect_snapshot(build_article(\"test\", pkg))\n  expect_equal(\n    path_file(dir_ls(path(pkg$dst_path, \"articles\", \"test\"))),\n    \"kitten.jpg\"\n  )\n})\n\ntest_that(\"finds external resources referenced by R code\", {\n  # weird path differences that I don't have the energy to dig into\n  skip_on_cran()\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/test.Rmd\",\n    c(\n      \"![external dependency](`r 'kitten.jpg'`)\"\n    )\n  )\n  pkg <- pkg_add_kitten(pkg, \"vignettes\")\n  suppressMessages(path <- build_article(\"test\", pkg))\n\n  # ensure that we the HTML references `<img src=\"external.png\" />` directly\n  html <- xml2::read_html(path)\n  expect_equal(xpath_attr(html, \".//img\", \"src\"), \"kitten.jpg\")\n\n  # expect that `external.png` was copied to the rendered article directory\n  expect_true(file_exists(path(path_dir(path), \"kitten.jpg\")))\n})\n\ntest_that(\"image links relative to output\", {\n  pkg <- local_pkgdown_site(test_path(\"assets/articles-images\"))\n\n  suppressMessages(init_site(pkg))\n  suppressMessages(copy_figures(pkg))\n  suppressMessages(build_article(\"kitten\", pkg))\n\n  html <- xml2::read_html(path(pkg$dst_path, \"articles\", \"kitten.html\"))\n  src <- xpath_attr(html, \"//main//img\", \"src\")\n\n  expect_equal(\n    src,\n    c(\n      # knitr::include_graphics()\n      \"../reference/figures/kitten.jpg\",\n      \"another-kitten.jpg\",\n      # rmarkdown image\n      \"../reference/figures/kitten.jpg\",\n      \"another-kitten.jpg\",\n      # magick::image_read()\n      \"kitten_files/figure-html/magick-1.png\",\n      # figure\n      \"kitten_files/figure-html/plot-1.jpg\"\n    )\n  )\n\n  # And files aren't copied\n  expect_false(dir_exists(path(pkg$dst_path, \"man\")))\n})\n\ntest_that(\"warns about missing images\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"vignettes/kitten.Rmd\", \"![foo](kitten.jpg)\")\n\n  expect_snapshot(build_article(\"kitten\", pkg))\n})\n\ntest_that(\"spaces in sorce paths do work\", {\n  # create simulated package\n  pkg0 <- local_pkgdown_site()\n  pkg0 <- pkg_add_file(pkg0, \"vignettes/kitten.Rmd\", \"![Kitten](kitten.jpg)\")\n  pkg0 <- pkg_add_kitten(pkg0, \"vignettes\")\n\n  # copy simulated pkg to path that contains spaces\n  pkg1 <- fs::dir_copy(\n    pkg0$src_path,\n    fs::file_temp(pattern = \"beware of spaces-\")\n  )\n\n  # check that pkgdown site builds anyways\n  expect_no_error(suppressMessages(\n    build_article(\"kitten\", as_pkgdown(pkg1))\n  ))\n})\n\ntest_that(\"warns about missing alt-text\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"vignettes/kitten.Rmd\", \"![](kitten.jpg)\")\n  pkg <- pkg_add_kitten(pkg, \"vignettes\")\n  expect_snapshot(build_article(\"kitten\", pkg))\n})\n\n# External dependencies --------------------------------------------------------\n\ntest_that(\"pkgdown deps are included only once in articles\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/test.Rmd\",\n    pkg_vignette(\n      # Some code that adds jquery/bootstrap\n      r_code_block(\n        'htmltools::tagList(\n        htmltools::p(\"hello\"),\n        rmarkdown::html_dependency_jquery(),\n        rmarkdown::html_dependency_bootstrap(\"flatly\")\n      )'\n      )\n    )\n  )\n\n  # Rely on default init_site() from local_pkgdown_site() setting all\n  # the default includes to empty\n  suppressMessages(path <- build_article(\"test\", pkg))\n  html <- xml2::read_html(path)\n  expect_equal(path_file(xpath_attr(html, \".//script\", \"src\")), \"pkgdown.js\")\n  expect_equal(path_file(xpath_attr(html, \".//link\", \"href\")), character())\n})\n\ntest_that(\"html widgets get needed css/js\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/test.Rmd\",\n    pkg_vignette(\n      r_code_block(\n        '\n      path1 <- tempfile()\n      writeLines(letters, path1)\n      path2 <- tempfile()\n      writeLines(letters[-(10:11)], path2)\n\n      diffviewer::visual_diff(path1, path2)\n    '\n      )\n    )\n  )\n\n  suppressMessages(path <- build_article(\"test\", pkg))\n\n  html <- xml2::read_html(path)\n  css <- xpath_attr(html, \".//body//link\", \"href\")\n  js <- xpath_attr(html, \".//body//script\", \"src\")\n\n  expect_true(\"diffviewer.css\" %in% path_file(css))\n  expect_true(\"diffviewer.js\" %in% path_file(js))\n})\n"
  },
  {
    "path": "tests/testthat/test-build-articles.R",
    "content": "test_that(\"can recognise intro variants\", {\n  expect_true(article_is_intro(\"package\", \"package\"))\n  expect_true(article_is_intro(\"articles/package\", \"package\"))\n  expect_true(article_is_intro(\"pack-age\", \"pack.age\"))\n  expect_true(article_is_intro(\"articles/pack-age\", \"pack.age\"))\n})\n\ntest_that(\"validates articles yaml\", {\n  data_articles_index_ <- function(x) {\n    pkg <- local_pkgdown_site(meta = list(articles = x))\n    data_articles_index(pkg)\n  }\n\n  expect_snapshot(error = TRUE, {\n    data_articles_index_(1)\n    data_articles_index_(list(1))\n    data_articles_index_(list(list()))\n    data_articles_index_(list(list(title = 1, contents = 1)))\n    data_articles_index_(list(list(title = \"a\\n\\nb\", contents = 1)))\n    data_articles_index_(list(list(title = \"a\", contents = 1)))\n  })\n})\n\ntest_that(\"validates external-articles\", {\n  data_articles_ <- function(x) {\n    pkg <- local_pkgdown_site(meta = list(`external-articles` = x))\n    data_articles(pkg)\n  }\n  expect_snapshot(error = TRUE, {\n    data_articles_(1)\n    data_articles_(list(1))\n    data_articles_(list(list(name = \"x\")))\n    data_articles_(list(list(\n      name = 1,\n      title = \"x\",\n      href = \"x\",\n      description = \"x\"\n    )))\n    data_articles_(list(list(\n      name = \"x\",\n      title = 1,\n      href = \"x\",\n      description = \"x\"\n    )))\n    data_articles_(list(list(\n      name = \"x\",\n      title = \"x\",\n      href = 1,\n      description = \"x\"\n    )))\n    data_articles_(list(list(\n      name = \"x\",\n      title = \"x\",\n      href = \"x\",\n      description = 1\n    )))\n  })\n})\n\ntest_that(\"data_articles includes external articles\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      `external-articles` = list(\n        list(name = \"c\", title = \"c\", href = \"c\", description = \"*c*\")\n      )\n    )\n  )\n  pkg <- pkg_add_file(pkg, \"vignettes/a.Rmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/b.Rmd\")\n\n  articles <- data_articles(pkg)\n  expect_equal(articles$name, c(\"a\", \"b\", \"c\"))\n  expect_equal(articles$internal, rep(FALSE, 3))\n  expect_equal(articles$description, list(NULL, NULL, \"<p><em>c</em></p>\"))\n})\n\ntest_that(\"articles in vignettes/articles/ are unnested into articles/\", {\n  # weird path differences that I don't have the energy to dig into\n  skip_on_cran()\n\n  pkg <- local_pkgdown_site(meta = list(url = \"https://example.com\"))\n  pkg <- pkg_add_file(pkg, \"vignettes/articles/nested.Rmd\")\n\n  nested <- pkg$vignettes[pkg$vignettes$name == \"articles/nested\", ]\n  expect_equal(nested$file_out, \"articles/nested.html\")\n\n  # Check automatic redirect from articles/articles/foo.html -> articles/foo.html\n  expect_snapshot(build_redirects(pkg))\n})\n\ntest_that(\"warns about articles missing from index\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      articles = list(\n        list(title = \"External\", contents = c(\"a\", \"b\"))\n      )\n    )\n  )\n  pkg <- pkg_add_file(pkg, \"vignettes/a.Rmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/b.Rmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/c.Rmd\")\n\n  expect_snapshot(. <- data_articles_index(pkg), error = TRUE)\n})\n\ntest_that(\"internal articles aren't included and don't trigger warning\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      articles = list(\n        list(title = \"External\", contents = c(\"a\", \"b\")),\n        list(title = \"internal\", contents = \"c\")\n      )\n    )\n  )\n  pkg <- pkg_add_file(pkg, \"vignettes/a.Rmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/b.Rmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/c.Rmd\")\n\n  expect_no_error(index <- data_articles_index(pkg))\n  expect_length(index$sections, 1)\n  expect_length(index$sections[[1]]$contents, 2)\n})\n\ntest_that(\"default template includes all articles\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"vignettes/a.Rmd\")\n\n  expect_equal(default_articles_index(pkg)[[1]]$contents, \"a\")\n})\n\ntest_that(\"check doesn't include getting started vignette\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      articles = list(list(title = \"Vignettes\", contents = \"a\"))\n    )\n  )\n  pkg <- pkg_add_file(pkg, \"vignettes/a.Rmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/testpackage.Rmd\")\n\n  expect_no_error(data_articles_index(pkg))\n})\n"
  },
  {
    "path": "tests/testthat/test-build-favicons.R",
    "content": "test_that(\"missing logo generates message\", {\n  pkg <- local_pkgdown_site()\n\n  expect_snapshot(\n    error = TRUE,\n    expect_output(build_favicons(pkg), \"Building favicons\")\n  )\n})\n\ntest_that(\"existing logo generates message\", {\n  pkg <- local_pkgdown_site()\n  dir_create(path(pkg$src_path, \"pkgdown\", \"favicon\"))\n  file_create(path(pkg$src_path, \"pkgdown\", \"favicon\", \"favicon.ico\"))\n  file_create(path(pkg$src_path, \"logo.png\"))\n\n  expect_true(has_favicons(pkg))\n  expect_snapshot(build_favicons(pkg))\n})\n"
  },
  {
    "path": "tests/testthat/test-build-footer.R",
    "content": "test_that(\"works by default\", {\n  pkg <- structure(\n    list(\n      desc = desc::desc(\n        text = \"Authors@R: person('First', 'Last', role = 'cre')\"\n      ),\n      src_path = tempdir()\n    ),\n    class = \"pkgdown\"\n  )\n  footer <- data_footer(pkg)\n  footer$right <- gsub(\n    packageVersion(\"pkgdown\"),\n    \"{version}\",\n    footer$right,\n    fixed = TRUE\n  )\n\n  expect_snapshot_output(footer)\n})\n\ntest_that(\"includes package component\", {\n  pkg <- structure(\n    list(\n      package = \"noodlr\",\n      desc = desc::desc(\n        text = \"Authors@R: person('First', 'Last', role = 'cre')\"\n      ),\n      src_path = tempdir(),\n      meta = list(\n        footer = list(\n          structure = list(left = \"package\")\n        )\n      )\n    ),\n    class = \"pkgdown\"\n  )\n  expect_equal(data_footer(pkg)$left, \"<p>noodlr</p>\")\n})\n\ntest_that(\"can use custom components\", {\n  pkg <- structure(\n    list(\n      desc = desc::desc(text = \"Authors@R: person('a', 'b', roles = 'cre')\"),\n      src_path = tempdir(),\n      meta = list(\n        footer = list(\n          structure = list(left = \"test\"),\n          components = list(test = \"_test_\")\n        )\n      )\n    ),\n    class = \"pkgdown\"\n  )\n  expect_equal(data_footer(pkg)$left, \"<p><em>test</em></p>\")\n})\n\ntest_that(\"multiple components are pasted together\", {\n  pkg <- structure(\n    list(\n      desc = desc::desc(text = \"Authors@R: person('a', 'b', roles = 'cre')\"),\n      src_path = tempdir(),\n      meta = list(\n        footer = list(\n          structure = list(left = c(\"a\", \"b\")),\n          components = list(a = \"a\", b = \"b\")\n        )\n      )\n    ),\n    class = \"pkgdown\"\n  )\n  expect_equal(data_footer(pkg)$left, \"<p>a b</p>\")\n})\n\ntest_that(\"validates meta components\", {\n  data_footer_ <- function(...) {\n    pkg <- local_pkgdown_site(meta = list(...))\n    data_footer(pkg)\n  }\n\n  expect_snapshot(error = TRUE, {\n    data_footer_(footer = 1)\n    data_footer_(footer = list(structure = 1))\n    data_footer_(footer = list(components = 1))\n    data_footer_(authors = list(footer = list(roles = 1)))\n    data_footer_(authors = list(footer = list(text = 1)))\n  })\n})\n"
  },
  {
    "path": "tests/testthat/test-build-github.R",
    "content": "test_that(\"a CNAME record is built if a url exists in metadata\", {\n  pkg <- local_pkgdown_site(meta = list(url = \"https://testpackage.r-lib.org\"))\n\n  dir_create(path(pkg$dst_path, \"docs\"))\n  expect_snapshot(build_github_pages(pkg))\n  expect_equal(read_lines(path(pkg$dst_path, \"CNAME\")), \"testpackage.r-lib.org\")\n})\n\ntest_that(\"CNAME URLs are valid\", {\n  expect_equal(cname_url(\"http://google.com/\"), \"google.com\")\n  expect_equal(cname_url(\"https://google.com/\"), \"google.com\")\n\n  # this is not a valid URL because it has a trailing path\n  expect_null(cname_url(\"http://google.com/path/\"))\n})\n"
  },
  {
    "path": "tests/testthat/test-build-home-authors.R",
    "content": "test_that(\"authors page includes inst/AUTHORS\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"inst/AUTHORS\", \"Hello\")\n  suppressMessages(build_citation_authors(pkg))\n\n  lines <- read_lines(path(pkg$dst_path, \"authors.html\"))\n  expect_match(lines, \"<pre>Hello</pre>\", all = FALSE)\n})\n\ntest_that(\"authors page includes multiline inst/AUTHORS\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"inst/AUTHORS\", c(\"Hello\", \"------\", \"bla bla\"))\n  suppressMessages(build_citation_authors(pkg))\n\n  lines <- read_lines(path(pkg$dst_path, \"authors.html\"))\n  content <- paste(lines, collapse = \" \")\n  expect_match(content, \"<pre>Hello ------ bla bla</pre>\")\n})\n\ntest_that(\"data_authors validates yaml inputs\", {\n  data_authors_ <- function(...) {\n    pkg <- local_pkgdown_site(meta = list(...))\n    data_authors(pkg)\n  }\n\n  expect_snapshot(error = TRUE, {\n    data_authors_(authors = 1)\n    data_authors_(authors = list(before = 1))\n    data_authors_(authors = list(after = 1))\n  })\n})\n\ntest_that(\"data_home_sidebar_authors validates yaml inputs\", {\n  data_home_sidebar_authors_ <- function(...) {\n    pkg <- local_pkgdown_site(meta = list(...))\n    data_home_sidebar_authors(pkg)\n  }\n\n  expect_snapshot(error = TRUE, {\n    data_home_sidebar_authors_(authors = list(sidebar = list(roles = 1)))\n    data_home_sidebar_authors_(authors = list(sidebar = list(before = 1)))\n    data_home_sidebar_authors_(\n      authors = list(sidebar = list(before = \"x\\n\\ny\"))\n    )\n  })\n})\n\n# authors --------------------------------------------------------------------\n\ntest_that(\"ORCID can be identified & removed from all comment styles\", {\n  desc <- desc::desc(\n    text = c(\n      'Authors@R: c(',\n      '    person(\"no comment\"),',\n      '    person(\"bare comment\", comment = \"comment\"),',\n      '    person(\"orcid only\",   comment = c(ORCID = \"0000-0000-0000-0001\")),',\n      '    person(\"both\",         comment = c(\"comment\", ORCID = \"0000-0003-4757-117X\"))',\n      '  )'\n    )\n  )\n  authors <- purrr::map(desc$get_authors(), author_list, list())\n  expect_equal(\n    purrr::map(authors, \"orcid\"),\n    list(\n      NULL,\n      NULL,\n      orcid_link(\"0000-0000-0000-0001\"),\n      orcid_link(\"0000-0003-4757-117X\")\n    )\n  )\n\n  expect_equal(\n    purrr::map(authors, \"comment\"),\n    list(character(), \"comment\", character(), \"comment\")\n  )\n})\n\ntest_that(\"ROR can be identified & removed from all comment styles\", {\n  desc <- desc::desc(\n    text = c(\n      'Authors@R: c(',\n      '    person(\"no comment\"),',\n      '    person(\"bare comment\", comment = \"comment\"),',\n      '    person(\"ror only\",   comment = c(ROR = \"123456789\")),',\n      '    person(\"both\",         comment = c(\"comment\", ROR = \"987653421\"))',\n      '  )'\n    )\n  )\n  authors <- purrr::map(desc$get_authors(), author_list, list())\n  expect_equal(\n    purrr::map(authors, \"ror\"),\n    list(NULL, NULL, ror_link(\"123456789\"), ror_link(\"987653421\"))\n  )\n\n  expect_equal(\n    purrr::map(authors, \"comment\"),\n    list(character(), \"comment\", character(), \"comment\")\n  )\n})\n\ntest_that(\"author comments linkified with escaped angle brackets (#2127)\", {\n  p <- list(name = \"Jane Doe\", roles = \"rev\", comment = \"<https://x.org/>\")\n  expect_match(\n    author_desc(p),\n    \"&lt;<a href='https://x.org/'>https://x.org/</a>&gt;\",\n    fixed = TRUE\n  )\n})\n\ntest_that(\"authors data can be filtered with different roles\", {\n  pkg <- local_pkgdown_site(\n    desc = list(\n      `Authors@R` = '\n    c(\n    person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")),\n    person(\"RStudio\", role = c(\"cph\", \"fnd\"))\n    )'\n    )\n  )\n  expect_length(data_authors(pkg)$main, 2)\n  expect_length(data_authors(pkg, roles = \"cre\")$main, 1)\n})\n\ntest_that(\"authors data includes inst/AUTHORS\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"inst/AUTHORS\", \"Hello\")\n\n  expect_equal(data_authors(pkg)$inst, \"Hello\")\n})\n\ntest_that(\"sidebar can accept additional before and after text\", {\n  pkg <- local_pkgdown_site()\n  pkg$meta$authors$sidebar$before <- \"BEFORE\"\n  pkg$meta$authors$sidebar$after <- \"AFTER\"\n  expect_snapshot(cat(data_home_sidebar_authors(pkg)))\n})\n\ntest_that(\"role has multiple fallbacks\", {\n  expect_equal(role_lookup(\"cre\"), \"maintainer\")\n  expect_equal(role_lookup(\"res\"), \"researcher\")\n  expect_snapshot(role_lookup(\"unknown\"))\n})\n\n# citations -------------------------------------------------------------------\n\ntest_that(\"can handle UTF-8 encoding (#416, #493)\", {\n  # Work around bug in utils::citation()\n  local_options(warnPartialMatchDollar = FALSE)\n\n  pkg <- local_pkgdown_site(\n    desc = list(\n      Title = \"A søphîstiçated påckagé\",\n      Date = \"2018-02-02\"\n    )\n  )\n\n  meta <- create_citation_meta(pkg$src_path)\n  expect_type(meta, \"list\")\n  expect_equal(meta$Title, \"A søphîstiçated påckagé\")\n\n  pkg <- pkg_add_file(\n    pkg,\n    \"inst/CITATION\",\n    c(\n      'citEntry(',\n      '  entry = \"Article\",',\n      '  title=\"Title: é\",',\n      '  author=\"Author: é\",',\n      '  journal=\"Journal é\",',\n      '  year=\"2017\",',\n      '  textVersion = \"é\"',\n      ')'\n    )\n  )\n  cit <- read_citation(pkg$src_path)\n  expect_s3_class(cit, \"citation\")\n\n  pkg <- pkg_add_file(pkg, \"inst/CITATION\", \"citation(auto = meta)\")\n  cit <- read_citation(pkg$src_path)\n  expect_s3_class(cit, \"citation\")\n})\n\ntest_that(\"can handle latin1 encoding (#689)\", {\n  pkg <- local_pkgdown_site(\n    desc = list(\n      Title = \"A søphîstiçated påckagé\",\n      Date = \"2018-02-02\",\n      Encoding = \"latin1\"\n    )\n  )\n  meta <- create_citation_meta(pkg$src_path)\n  expect_equal(meta$Title, \"A søphîstiçated påckagé\")\n  expect_equal(Encoding(meta$Title), \"UTF-8\")\n\n  pkg <- pkg_add_file(\n    pkg,\n    \"inst/CITATION\",\n    c(\n      'citEntry(',\n      '  entry = \"Article\",',\n      '  title=\"Title: é\",',\n      '  author=\"Author: é\",',\n      '  journal=\"Journal é\",',\n      '  year=\"2017\",',\n      '  textVersion = \"é\"',\n      ')'\n    )\n  )\n  cit_path <- path(pkg$src_path, \"inst/CITATION\")\n  citation <- readLines(cit_path) # nolint\n  con <- file(cit_path, open = \"w+\", encoding = \"native.enc\")\n  withr::defer(close(con))\n  base::writeLines(iconv(citation, to = \"latin1\"), con, useBytes = TRUE) # nolint\n\n  cit <- read_citation(pkg$src_path)\n  expect_s3_class(cit, \"citation\")\n\n  pkg <- pkg_add_file(pkg, \"inst/CITATION\", \"citation(auto = meta)\")\n  cit <- read_citation(pkg$src_path)\n  expect_s3_class(cit, \"citation\")\n})\n\ntest_that(\"source link is added to citation page\", {\n  # Work around bug in utils::citation()\n  local_options(warnPartialMatchDollar = FALSE)\n\n  pkg <- local_pkgdown_site(\n    meta = list(\n      repo = list(url = list(source = \"http://github.com/test/test\"))\n    )\n  )\n  pkg <- pkg_add_file(\n    pkg,\n    \"inst/CITATION\",\n    c(\n      'citEntry(',\n      '  entry = \"Article\",',\n      '  title=\"Title\",',\n      '  author=\"Author\",',\n      '  journal=\"Journal\",',\n      '  year=\"2020\",',\n      '  textVersion = \"\"',\n      ')'\n    )\n  )\n  suppressMessages(build_citation_authors(pkg))\n\n  lines <- read_lines(path(pkg$dst_path, \"authors.html\"))\n  expect_match(\n    lines,\n    \"<code>inst/CITATION</code></a>\",\n    all = FALSE,\n    fixed = TRUE\n  )\n})\n\ntest_that(\"multiple citations all have HTML and BibTeX formats\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"inst/CITATION\",\n    c(\n      'bibentry(\"misc\", title=\"Proof of b < a > c\", author=c(\"A\", \"B\"), year=\"2021\",\n         textVersion=\"A & B (2021): Proof of b < a > c.\")',\n      'bibentry(\"misc\", title=\"Title Two\", author=\"Author Two\", year=\"2022\")'\n    )\n  )\n\n  citations <- data_citations(pkg$src_path)\n  expect_snapshot_output(citations)\n})\n\ntest_that(\"bibtex is escaped\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"inst/CITATION\",\n    c(\n      'citEntry(',\n      '  entry = \"Article\",',\n      '  title=\"test special HTML characters: <&>\",',\n      '  author=\"x\",',\n      '  journal=\"x\",',\n      '  year=\"2017\",',\n      '  textVersion = \"\"',\n      ')'\n    )\n  )\n\n  suppressMessages(build_citation_authors(pkg))\n  html <- xml2::read_html(path(pkg$dst_path, \"authors.html\"))\n\n  expect_match(xpath_text(html, \"//pre\"), \"<&>\", fixed = TRUE)\n})\n"
  },
  {
    "path": "tests/testthat/test-build-home-community.R",
    "content": "test_that(\"handles CoC and SUPPORT if present\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \".github/SUPPORT.md\")\n  pkg <- pkg_add_file(pkg, \".github/CODE_OF_CONDUCT.md\")\n\n  expect_true(has_coc(pkg$src_path))\n  expect_true(has_support(pkg$src_path))\n\n  # And added to sidebar\n  text <- data_home_sidebar_community(pkg)\n  expect_snapshot_output(cat(text))\n})\n\ntest_that(\"empty site doesn't have community asserts\", {\n  pkg <- local_pkgdown_site()\n\n  expect_false(has_contributing(pkg$src_path))\n  expect_false(has_coc(pkg$src_path))\n  expect_equal(data_home_sidebar_community(pkg$src_path), \"\")\n})\n"
  },
  {
    "path": "tests/testthat/test-build-home-index.R",
    "content": "test_that(\"messages about reading and writing\", {\n  pkg <- local_pkgdown_site()\n\n  expect_snapshot({\n    build_home_index(pkg)\n    build_home_index(pkg)\n  })\n})\n\ntest_that(\"title and description come from DESCRIPTION by default\", {\n  pkg <- local_pkgdown_site(\n    desc = list(\n      Title = \"A test title\",\n      Description = \"A test description.\"\n    )\n  )\n  expect_equal(data_home(pkg)$pagetitle, \"A test title\")\n  expect_equal(data_home(pkg)$opengraph$description, \"A test description.\")\n\n  # but overridden by home\n  pkg$meta <- list(home = list(title = \"X\", description = \"Y\"))\n  expect_equal(data_home(pkg)$pagetitle, \"X\")\n  expect_equal(data_home(pkg)$opengraph$description, \"Y\")\n})\n\ntest_that(\"math is handled\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"README.md\", \"$1 + 1$\")\n  suppressMessages(build_home_index(pkg))\n\n  html <- xml2::read_html(path(pkg$dst_path, \"index.html\"))\n  expect_equal(xpath_length(html, \".//math\"), 1)\n})\n\ntest_that(\"data_home() validates yaml metadata\", {\n  data_home_ <- function(...) {\n    pkg <- local_pkgdown_site(meta = list(...))\n    data_home(pkg)\n  }\n\n  expect_snapshot(error = TRUE, {\n    data_home_(home = 1)\n    data_home_(home = list(title = 1))\n    data_home_(home = list(description = 1))\n    data_home_(template = list(trailing_slash_redirect = 1))\n  })\n})\n\ntest_that(\"version formatting in preserved\", {\n  pkg <- local_pkgdown_site(desc = list(Version = \"1.0.0-9000\"))\n  expect_equal(pkg$version, \"1.0.0-9000\")\n\n  suppressMessages(build_home_index(pkg))\n  index <- read_lines(path(pkg$dst_path, \"index.html\"))\n  expect_match(index, \"1.0.0-9000\", fixed = TRUE, all = FALSE)\n})\n\ntest_that(\"data_home_sidebar() works by default\", {\n  pkg <- local_pkgdown_site()\n  expect_snapshot(cat(data_home_sidebar(pkg)))\n\n  # comments are not included\n  pkg <- local_pkgdown_site(\n    desc = list(\n      `Authors@R` = 'c(\n    person(\"Hadley\", \"Wickham\", , \"hadley@rstudio.com\", role = c(\"aut\", \"cre\")),\n    person(\"RStudio\", role = c(\"cph\", \"fnd\"), comment = c(\"Thank you!\"))\n    )'\n    )\n  )\n  html <- xml2::read_html(data_home_sidebar(pkg))\n  expect_snapshot_output(xpath_xml(html, \".//div[@class='developers']\"))\n})\n\ntest_that(\"data_home_sidebar() can be removed\", {\n  pkg <- local_pkgdown_site(meta = list(home = list(sidebar = FALSE)))\n  # not built by data_home_sidebar()\n  expect_false(data_home_sidebar(pkg))\n\n  # nor later -- so probably not to be tested here?!\n  suppressMessages(build_home_index(pkg))\n  html <- xml2::read_html(path(pkg$dst_path, \"index.html\"))\n  expect_equal(xpath_length(html, \".//aside/*\"), 0)\n})\n\ntest_that(\"data_home_sidebar() can be defined by a HTML file\", {\n  pkg <- local_pkgdown_site(\n    meta = list(home = list(sidebar = list(html = \"sidebar.html\")))\n  )\n  expect_snapshot(data_home_sidebar(pkg), error = TRUE)\n\n  pkg <- pkg_add_file(pkg, \"sidebar.html\", \"Hello, world!\")\n  expect_equal(data_home_sidebar(pkg), \"Hello, world!\\n\")\n})\n\ntest_that(\"data_home_sidebar() can get a custom markdown formatted component\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      home = list(\n        sidebar = list(\n          structure = \"fancy\",\n          components = list(\n            fancy = list(\n              title = \"Fancy section\",\n              text = \"How *cool* is pkgdown?!\"\n            )\n          )\n        )\n      )\n    )\n  )\n  html <- xml2::read_html(data_home_sidebar(pkg))\n  expect_snapshot_output(xpath_xml(html, \".//div[@class='fancy-section']\"))\n})\n\ntest_that(\"data_home_sidebar() can add a TOC\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      home = list(sidebar = list(structure = \"toc\"))\n    )\n  )\n\n  html <- xml2::read_html(data_home_sidebar(pkg))\n  expect_snapshot_output(xpath_xml(html, \".//div[@class='table-of-contents']\"))\n})\n\ntest_that(\"data_home_sidebar() outputs informative error messages\", {\n  data_home_sidebar_ <- function(...) {\n    pkg <- local_pkgdown_site(meta = list(home = list(sidebar = list(...))))\n    data_home_sidebar(pkg)\n  }\n\n  expect_snapshot(error = TRUE, {\n    data_home_sidebar_(html = 1)\n    data_home_sidebar_(structure = 1)\n    data_home_sidebar_(structure = \"fancy\")\n    data_home_sidebar_(structure = c(\"fancy\", \"cool\"))\n    data_home_sidebar_(\n      structure = \"fancy\",\n      components = list(fancy = list(text = \"bla\"))\n    )\n    data_home_sidebar_(structure = \"fancy\", components = list(fancy = list()))\n  })\n})\n\ntest_that(\"package repo verification\", {\n  skip_on_cran() # requires internet connection\n\n  expect_null(cran_link(\"notarealpkg\"))\n  expect_equal(\n    cran_link(\"dplyr\"),\n    list(repo = \"CRAN\", url = \"https://cloud.r-project.org/package=dplyr\")\n  )\n  expect_equal(\n    cran_link(\"Biobase\"),\n    list(\n      repo = \"Bioconductor\",\n      url = \"https://www.bioconductor.org/packages/Biobase\"\n    )\n  )\n})\n\n\ntest_that(\"cran_unquote works\", {\n  expect_equal(\n    cran_unquote(\"'Quoting' is CRAN's thing.\"),\n    \"Quoting is CRAN's thing.\"\n  )\n})\n\ntest_that(\"allow email in BugReports\", {\n  # currently desc throws a warning if BugReports is an email\n  pkg <- suppressWarnings(local_pkgdown_site(\n    desc = list(BugReports = \"me@tidyverse.com\")\n  ))\n  html <- xml2::read_html(data_home_sidebar(pkg))\n  expect_snapshot(xpath_xml(html, \".//li/a\"))\n})\n\ntest_that(\"ANSI are handled\", {\n  withr::local_options(cli.num_colors = 256)\n  pkg <- local_pkgdown_site()\n\n  pkg <- pkg_add_file(pkg, \"index.md\", sprintf(\"prefer %s\", cli::col_blue(\"a\")))\n  suppressMessages(build_home_index(pkg))\n\n  html <- xml2::read_html(path(pkg$dst_path, \"index.html\"))\n  readme_p <- xml2::xml_find_first(html, \".//main[@id='main']/p\")\n  expect_equal(xml2::xml_text(readme_p), \"prefer \\u2029[34ma\\u2029[39m\")\n})\n"
  },
  {
    "path": "tests/testthat/test-build-home-license.R",
    "content": "test_that(\"link_license matchs exactly\", {\n  # Shouldn't match first GPL-2\n  expect_equal(\n    autolink_license(\"LGPL-2\"),\n    \"<a href='https://www.r-project.org/Licenses/LGPL-2'>LGPL-2</a>\"\n  )\n\n  expect_equal(\n    autolink_license(\"MPL-2.0\"),\n    \"<a href='https://www.mozilla.org/en-US/MPL/2.0/'>MPL-2.0</a>\"\n  )\n})\n\ntest_that(\"link_license matches LICENSE\", {\n  expect_equal(\n    autolink_license(\"LICENSE\"),\n    \"<a href='LICENSE-text.html'>LICENSE</a>\"\n  )\n  expect_equal(\n    autolink_license(\"LICENCE\"),\n    \"<a href='LICENSE-text.html'>LICENCE</a>\"\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-build-home-md.R",
    "content": "test_that(\"can find files in root and .github\", {\n  dir <- withr::local_tempdir()\n  dir_create(path(dir, \".github\"))\n  file_create(path(dir, \"a.md\"))\n  file_create(path(dir, \".github\", \"b.md\"))\n\n  mds <- withr::with_dir(dir, package_mds(\".\"))\n  expect_equal(mds, c(\"a.md\", \"./.github/b.md\"))\n})\n\ntest_that(\"drops files handled elsewhere\", {\n  dir <- withr::local_tempdir()\n  dir_create(path(dir, \".github\"))\n  file_create(path(dir, c(\"README.md\", \"LICENSE.md\", \"NEWS.md\")))\n\n  expect_equal(withr::with_dir(dir, package_mds(\".\")), character())\n})\n\ntest_that(\"drops files that don't need to be rendered\", {\n  dir <- withr::local_tempdir()\n  dir_create(path(dir, \".github\"))\n  file_create(path(dir, c(\"cran-comments.md\", \"issue_template.md\")))\n\n  expect_equal(withr::with_dir(dir, package_mds(\".\")), character())\n})\n"
  },
  {
    "path": "tests/testthat/test-build-home.R",
    "content": "# index -------------------------------------------------------------------\n\ntest_that(\"can build site even if no Authors@R present\", {\n  skip_if_no_pandoc()\n\n  pkg <- local_pkgdown_site(\n    desc = list(\n      Author = \"Hadley Wickham\",\n      Maintainer = \"Hadley Wickham <hadley@rstudio.com>\",\n      `Authors@R` = NA\n    )\n  )\n\n  expect_no_error(suppressMessages(build_home_index(pkg)))\n})\n\ntest_that(\"can build package without any index/readme\", {\n  pkg <- local_pkgdown_site()\n  expect_no_error(suppressMessages(build_home_index(pkg)))\n})\n\n# .github files -----------------------------------------------------------\n\ntest_that(\".github files are copied and linked\", {\n  skip_if_no_pandoc()\n\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \".github/404.md\")\n  pkg <- pkg_add_file(pkg, \".github/CODE_OF_CONDUCT.md\")\n\n  suppressMessages(build_home(pkg))\n\n  lines <- read_lines(path(pkg$dst_path, \"index.html\"))\n  expect_match(lines, 'href=\"CODE_OF_CONDUCT.html\"', fixed = TRUE, all = FALSE)\n  expect_true(file_exists(path(pkg$dst_path, \"404.html\")))\n})\n"
  },
  {
    "path": "tests/testthat/test-build-llm-dl.R",
    "content": "test_that(\"single dt/dd pair converts to simple li\", {\n  html <- xml2::read_html(\"<dl></dl>\")\n  simplify_dls(html)\n\n  expect_equal(xpath_length(html, \".//dl\"), 0)\n  expect_equal(xpath_length(html, \".//ul\"), 1)\n})\n\ntest_that(\"single dt/dd pair converts to simple li\", {\n  html <- xml2::read_html(\n    \"<dl>\n        <dt>a</dt>\n        <dd>b</dd>\n      </dl>\"\n  )\n  simplify_dls(html)\n\n  expect_equal(xpath_length(html, \".//dl\"), 0)\n  expect_equal(xpath_text(html, \".//li\"), \"a: b\")\n})\n\ntest_that(\"dd with block elements simplifies correctly\", {\n  html <- xml2::read_html(\n    \"<dl>\n        <dt>a</dt>\n        <dd>\n          <p>b</p>\n          <p>c</p>\n        </dd>\n      </dl>\"\n  )\n  simplify_dls(html)\n\n  expect_equal(xpath_length(html, \".//dl\"), 0)\n  expect_equal(xpath_length(html, \".//ul\"), 1)\n  expect_snapshot(xpath_xml(html, \".//li\"))\n})\n\ntest_that(\"warns if not applied\", {\n  html <- xml2::read_html(\n    \"\n      <dl>\n        <dt>a</dt>\n      </dl>\n  \"\n  )\n  expect_snapshot(. <- simplify_dls(html))\n})\n\ntest_that(\"correctly detects simple dls\", {\n  expect_false(is_simple_dl(\"dt\"))\n  expect_false(is_simple_dl(c(\"dd\", \"dt\")))\n  expect_false(is_simple_dl(c(\"dt\", \"dd\", \"dt\")))\n  expect_false(is_simple_dl(c(\"dd\", \"dt\", \"dd\", \"dt\")))\n\n  expect_true(is_simple_dl(c()))\n  expect_true(is_simple_dl(c(\"dt\", \"dd\")))\n  expect_true(is_simple_dl(c(\"dt\", \"dd\", \"dt\", \"dd\")))\n})\n"
  },
  {
    "path": "tests/testthat/test-build-llm.R",
    "content": "test_that(\"integration test for convert_md()\", {\n  skip_if_no_pandoc()\n\n  path <- withr::local_tempfile(pattern = \"pkgdown-llm\")\n  convert_md(test_path(\"assets\", \"llm.html\"), path)\n  expect_snapshot(write_lines(read_lines(path), stdout()))\n})\n\ntest_that(\"simplifies page header\", {\n  html <- xml2::read_html(\n    r\"(\n      <main><div class=\"page-header\">\n        <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Package index</h1>\n      </div></main>)\"\n  )\n  simplify_page_header(xml2::xml_find_first(html, \".//main\"))\n  expect_equal(xpath_contents(html, \".//main\"), \"<h1>Package index</h1>\")\n})\n\ntest_that(\"replaces lifecycle badges with strong text\", {\n  html <- xml2::read_html(\n    r\"(\n      <span class=\"badge lifecycle lifecycle-deprecated\">deprecated</span>\n      <a href=\"https://lifecycle.r-lib.org/articles/stages.html#experimental\" class=\"external-link\"><img src=\"figures/lifecycle-experimental.svg\" alt=\"[Experimental]\"></a>  \n      )\"\n  )\n  simplify_lifecycle_badges(html)\n  expect_equal(\n    xpath_text(html, \".//strong\"),\n    c(\"[deprecated]\", \"[experimental]\")\n  )\n})\n\ntest_that(\"converts internal urls to absolute with .md ending\", {\n  html <- xml2::read_html(\n    r\"(\n      <a href=\"llm.html\">link</a>\n      <a href=\"#fragment\">link</a>\n      <a href=\"https://example.org\">link</a>\n    )\"\n  )\n  create_absolute_links(html, \"https://pkgdown.r-lib.org\")\n  expect_equal(\n    xpath_attr(html, \".//a\", \"href\"),\n    c(\n      \"https://pkgdown.r-lib.org/llm.md\",\n      \"#fragment\",\n      \"https://example.org\"\n    )\n  )\n})\n\ntest_that(\"adjusts extension even without url\", {\n  html <- xml2::read_html(r\"(<a href=\"llm.html\">link</a>)\")\n  create_absolute_links(html)\n  expect_equal(xpath_attr(html, \".//a\", \"href\"), \"llm.md\")\n})\n\ntest_that(\"strip extra classes from pre\", {\n  html <- xml2::read_html(r\"(<pre class=\"downlit sourceCode r\">1+1</pre>)\")\n  simplify_code(html)\n  expect_equal(xpath_attr(html, \".//pre\", \"class\"), \"r\")\n})\n"
  },
  {
    "path": "tests/testthat/test-build-logo.R",
    "content": "test_that(\"can handle logo in subdir\", {\n  src <- withr::local_tempdir()\n  dst <- withr::local_tempdir()\n\n  dir_create(path(src, \"man\", \"figures\"))\n  file_create(path(src, \"man\", \"figures\", \"logo.svg\"))\n  pkg <- structure(list(src_path = src, dst_path = dst), class = \"pkgdown\")\n  expect_true(has_logo(pkg))\n\n  suppressMessages(copy_logo(pkg))\n  expect_true(file_exists(path(dst, \"logo.svg\")))\n\n  expect_equal(logo_path(pkg, 0), \"logo.svg\")\n  expect_equal(logo_path(pkg, 1), \"../logo.svg\")\n})\n"
  },
  {
    "path": "tests/testthat/test-build-news.R",
    "content": "test_that(\"data_news works as expected for h1 & h2\", {\n  skip_if_no_pandoc()\n\n  # fmt: skip\n  lines_h1 <- c(\n    \"# testpackage 1.0.0.9000\", \"\",\n    \"* bullet (#222 @someone)\", \"\",\n    \"# testpackage 1.0.0\", \"\",\n    \"## sub-heading\", \"\",\n    \"* first thing (#111 @githubuser)\", \"\",\n    \"* second thing\", \"\"\n  )\n  lines_h2 <- gsub(\"^#\", \"##\", lines_h1)\n\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"NEWS.md\", lines_h1)\n  expect_snapshot_output(data_news(pkg)[c(\"version\", \"page\", \"anchor\")])\n\n  pkg <- pkg_add_file(pkg, \"NEWS.md\", lines_h2)\n  expect_snapshot_output(data_news(pkg)[c(\"version\", \"page\", \"anchor\")])\n})\n\ntest_that(\"news is syntax highlighted once\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"NEWS.md\",\n    c(\n      \"# testpackage 1.0.0.9000\",\n      \"```r\",\n      \"x <- 1\",\n      \"```\"\n    )\n  )\n  suppressMessages(build_news(pkg, preview = FALSE))\n  html <- xml2::read_html(path(pkg$dst_path, \"news\", \"index.html\"))\n  expect_equal(xpath_text(html, \"//code\"), \"x <- 1\")\n})\n\ntest_that(\"multi-page news are rendered\", {\n  skip_if_no_pandoc()\n\n  pkg <- local_pkgdown_site(meta = list(news = list(one_page = FALSE)))\n  # fmt: skip\n  pkg <- pkg_add_file(pkg, \"NEWS.md\", c(\n    \"# testpackage 2.0\", \"\",\n    \"* bullet (#222 @someone)\", \"\",\n    \"# testpackage 1.1\", \"\",\n    \"* bullet (#222 @someone)\", \"\",\n    \"# testpackage 1.0.1\", \"\",\n    \"* bullet (#222 @someone)\", \"\",\n    \"# testpackage 1.0.0\", \"\",\n    \"## sub-heading\", \"\",\n    \"* first thing (#111 @githubuser)\", \"\",\n    \"* second thing\"\n  ))\n\n  expect_snapshot(data_news(pkg)[c(\"version\", \"page\", \"anchor\")])\n  expect_snapshot(build_news(pkg))\n\n  # test that index links are correct\n  lines <- xml2::read_html(path(pkg$dst_path, \"news\", \"index.html\"))\n  expect_equal(\n    xpath_attr(lines, \"//main//a\", \"href\"),\n    c(\"news-2.0.html\", \"news-1.1.html\", \"news-1.0.html\")\n  )\n  expect_equal(\n    xpath_text(lines, \"//main//a\"),\n    c(\"Version 2.0\", \"Version 1.1\", \"Version 1.0\")\n  )\n\n  # test single page structure\n  lines <- xml2::read_html(path(pkg$dst_path, \"news\", \"news-1.0.html\"))\n  expect_equal(xpath_text(lines, \".//h1\"), \"Version 1.0\")\n  expect_equal(\n    xpath_text(lines, \".//main//h2\"),\n    c(\"testpackage 1.0.0\", \"testpackage 1.0.1\")\n  )\n})\n\ntest_that(\"github links are added to news items\", {\n  skip_if_no_pandoc()\n\n  pkg <- local_pkgdown_site(\n    meta = list(\n      repo = list(\n        url = list(\n          home = \"https://github.com/r-lib/pkgdown\",\n          user = \"https://github.com/\",\n          issue = \"https://github.com/r-lib/pkgdown/issues/\"\n        )\n      )\n    )\n  )\n\n  # fmt: skip\n  pkg <- pkg_add_file(pkg, \"NEWS.md\", c(\n    \"# testpackage 0.1.0\", \"\",\n    \"## Major changes\", \"\",\n    \"- Bug fixes (@hadley, #100)\", \"\",\n    \"- Merges (@josue-rodriguez)\"\n  ))\n  news_tbl <- data_news(pkg)\n  html <- xml2::read_xml(news_tbl$html)\n\n  expect_equal(\n    xpath_attr(html, \".//a\", \"href\"),\n    c(\n      \"https://github.com/hadley\",\n      \"https://github.com/r-lib/pkgdown/issues/100\",\n      \"https://github.com/josue-rodriguez\"\n    )\n  )\n})\n\ntest_that(\"pkg_timeline fails cleanly for unknown package\", {\n  skip_on_cran()\n  expect_null(pkg_timeline(\"__XYZ__\"))\n})\n\ntest_that(\"pkg_timeline works for package that have been archived\", {\n  skip_on_cran()\n  expect_no_error(pkg_timeline(\"PF\"))\n})\n\ntest_that(\"correct timeline for first ggplot2 releases\", {\n  skip_on_cran()\n\n  timeline <- pkg_timeline(\"ggplot2\")[1:3, ]\n  expected <- data.frame(\n    version = c(\"0.5\", \"0.5.1\", \"0.5.2\"),\n    date = as.Date(c(\"2007-06-01\", \"2007-06-09\", \"2007-06-18\"))\n  )\n\n  expect_equal(timeline, expected)\n})\n\n# news_title and version_page -----------------------------------------------\n\ntest_that(\"can recognise common forms of title\", {\n  # Variants in beginning\n  version <- news_version(\n    c(\n      \"foo 1.3.0\",\n      \"foo v1.3.0\",\n      \"foo 1.3.0\",\n      \"VERSION 1.3.0\",\n      \"changes in 1.3.0\",\n      \"changes in foo version 1.3.0\"\n    ),\n    \"foo\"\n  )\n  expect_equal(version, rep(\"1.3.0\", length(version)))\n\n  # Variants in version spec\n  expect_equal(\n    news_version(c(\"foo 1-2\", \"foo 1-2-3\", \"foo 1-2-3-4\"), \"foo\"),\n    c(\"1-2\", \"1-2-3\", \"1-2-3-4\")\n  )\n\n  expect_equal(\n    news_version(\"foo (development version)\", \"foo\"),\n    \"development version\"\n  )\n})\n\ntest_that(\"correctly collapses version to page for common cases\", {\n  versions <- c(\"1.0.0\", \"1.0.0.0\", \"1.0.0.9000\", \"development version\")\n  pages <- purrr::map_chr(versions, version_page)\n  expect_equal(pages, c(\"1.0\", \"1.0\", \"dev\", \"dev\"))\n})\n\n# Tweaks ------------------------------------------------------------------\n\ntest_that(\"sections tweaked down a level\", {\n  html <- xml2::read_xml(\n    \"<body>\n    <div class='section level1'><h1></h1></div>\n    <div class='section level2'><h2></h2></div>\n    <div class='section level3'><h3></h3></div>\n    <div class='section level4'><h4></h4></div>\n    <div class='section level5'><h5></h5></div>\n  </body>\"\n  )\n  tweak_section_levels(html)\n  expect_equal(xml2::xml_name(xpath_xml(html, \"//div/*\")), paste0(\"h\", 2:6))\n  expect_equal(xpath_attr(html, \"//div\", \"class\"), paste0(\"section level\", 2:6))\n})\n\ntest_that(\"anchors de-duplicated with version\", {\n  html <- xml2::read_xml(\n    \"<body>\n    <div class='section' id='x-1'>Heading</div>\n  </body>\"\n  )\n  tweak_news_anchor(html, \"1.0\")\n\n  expect_equal(xpath_attr(html, \".//div\", \"id\"), \"x-1-0\")\n})\n\ntest_that(\"news headings get class and release date\", {\n  timeline <- tibble::tibble(version = \"1.0\", date = \"2020-01-01\")\n\n  html <- xml2::read_xml(\"<div><h2></h2></div>\")\n  tweak_news_heading(html, version = \"1.0\", timeline = timeline, bs_version = 3)\n  expect_snapshot_output(xpath_xml(html, \"//div\"))\n\n  html <- xml2::read_xml(\"<div><h2></h2></div>\")\n  tweak_news_heading(html, version = \"1.0\", timeline = timeline, bs_version = 4)\n  expect_snapshot_output(xpath_xml(html, \"//div\"))\n})\n\n# Header checks ----------------------------------------------------------\ntest_that(\"clear error for bad hierarchy - bad nesting\", {\n  pkg <- local_pkgdown_site()\n  # fmt: skip\n  pkg <- pkg_add_file(pkg, \"NEWS.md\", c(\n    \"### testpackage 1.0.0.9000\", \"\",\n    \"* bullet (#222 @someone)\", \"\",\n    \"# testpackage 1.0.0\", \"\",\n    \"## sub-heading\", \"\",\n    \"* first thing (#111 @githubuser)\", \"\",\n    \"* second thing\", \"\"\n  ))\n\n  expect_snapshot(data_news(pkg), error = TRUE)\n})\n\ntest_that(\"clear error for bad hierarchy - h3\", {\n  pkg <- local_pkgdown_site()\n  # fmt: skip\n  pkg <- pkg_add_file(pkg, \"NEWS.md\", c(\n    \"### testpackage 1.0.0.9000\", \"\",\n    \"* bullet (#222 @someone)\", \"\",\n    \"### testpackage 1.0.0\", \"\",\n    \"#### sub-heading\", \"\",\n    \"* first thing (#111 @githubuser)\", \"\",\n    \"* second thing\", \"\"\n  ))\n\n  expect_snapshot(data_news(pkg), error = TRUE)\n})\n\ntest_that(\"news can contain footnotes\", {\n  pkg <- local_pkgdown_site()\n  # fmt: skip\n  pkg <- pkg_add_file(pkg, \"NEWS.md\", c(\n    \"## testpackage 1.0.0.9000\",\n    \"\",\n    \"* bullet\",\n    \"\",\n    \"* inline footnote^[used to fail] \",\n    \"\"\n  ))\n\n  expect_snapshot(x <- data_news(pkg))\n})\n\ntest_that(\"data_news warns if no headings found\", {\n  skip_if_no_pandoc()\n\n  pkg <- local_pkgdown_site()\n  # fmt: skip\n  pkg <- pkg_add_file(\n    pkg,\n    \"NEWS.md\",\n    c(\n      \"# mypackage\",\n      \"\",\n      \"## mypackage foo\",\n      \"\",\n      \"## mypackage bar\",\n      \"\"\n    )\n  )\n  expect_snapshot(. <- data_news(pkg))\n})\n"
  },
  {
    "path": "tests/testthat/test-build-quarto-articles.R",
    "content": "test_that(\"can build all quarto article\", {\n  skip_if_no_quarto()\n\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"vignettes/vig1.qmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/vig2.qmd\")\n\n  suppressMessages(build_articles(pkg))\n\n  expect_true(file_exists(path(pkg$dst_path, \"articles/vig1.html\")))\n  expect_true(file_exists(path(pkg$dst_path, \"articles/vig2.html\")))\n})\n\ntest_that(\"can build a single quarto article\", {\n  skip_if_no_quarto()\n\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"vignettes/vig1.qmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/vig2.qmd\")\n\n  suppressMessages(build_article(\"vig1\", pkg))\n\n  expect_true(file_exists(path(pkg$dst_path, \"articles/vig1.html\")))\n  expect_false(file_exists(path(pkg$dst_path, \"articles/vig2.html\")))\n})\n\ntest_that(\"doesn't do anything if no quarto articles\", {\n  pkg <- local_pkgdown_site()\n  expect_no_error(suppressMessages(build_quarto_articles(pkg)))\n})\n\ntest_that(\"can render a pdf qmd\", {\n  skip_if_no_quarto()\n\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/vig1.qmd\",\n    pkg_vignette(\n      format = list(pdf = list(toc = TRUE))\n    )\n  )\n\n  expect_equal(pkg$vignettes$type, \"qmd\")\n  expect_equal(pkg$vignettes$file_out, \"articles/vig1.pdf\")\n\n  suppressMessages(build_article(\"vig1\", pkg))\n  expect_true(file_exists(path(pkg$dst_path, \"articles/vig1.pdf\")))\n})\n\ntest_that(\"auto-adjusts heading levels\", {\n  skip_if_no_quarto()\n\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/vig1.qmd\",\n    pkg_vignette(\n      \"# Heading 1\",\n      \"# Heading 2\"\n    )\n  )\n\n  suppressMessages(build_article(\"vig1\", pkg))\n\n  html <- xml2::read_html(path(pkg$dst_path, \"articles/vig1.html\"))\n  expect_equal(xpath_text(html, \"//h1\"), \"title\")\n  expect_equal(xpath_text(html, \"//h2\"), c(\"Heading 1\\n\", \"Heading 2\\n\"))\n})\n\ntest_that(\"we find out if quarto styles change\", {\n  skip_if_no_quarto()\n\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"vignettes/vig1.qmd\")\n\n  output_dir <- quarto_render(pkg, path(pkg$src_path, \"vignettes\", \"vig1.qmd\"))\n\n  data <- data_quarto_article(pkg, path(output_dir, \"vig1.html\"), \"vig1.qmd\")\n  expect_snapshot(cat(data$includes$style))\n})\n\ntest_that(\"quarto articles are included in the index\", {\n  skip_if_no_quarto()\n\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/vig1.qmd\",\n    pkg_vignette(\n      \"## Heading 1\",\n      \"Some text\"\n    )\n  )\n\n  suppressMessages(build_article(\"vig1\", pkg))\n  index <- build_search_index(pkg)\n\n  expect_equal(index[[1]]$path, \"/articles/vig1.html\")\n  expect_equal(index[[1]]$what, \"Heading 1\")\n  expect_equal(index[[1]]$text, \"text\") # some is a stop word\n})\n\ntest_that(\"quarto headings get anchors\", {\n  skip_if_no_quarto()\n\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"vignettes/vig1.qmd\",\n    pkg_vignette(\n      \"## Heading 1\",\n      \"### Heading 2\"\n    )\n  )\n\n  suppressMessages(build_article(\"vig1\", pkg))\n  html <- xml2::read_html(path(pkg$dst_path, \"articles/vig1.html\"))\n  headings <- xpath_xml(html, \"//h2|//h3\")\n  expect_equal(\n    xpath_attr(headings, \"./a\", \"href\"),\n    c(\"#heading-1\", \"#heading-2\")\n  )\n})\n\ntest_that(\"can build quarto articles in articles folder\", {\n  skip_if_no_quarto()\n\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"vignettes/articles/vig1.qmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/vig2.qmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/articles/vig3.rmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/vig4.rmd\")\n\n  suppressMessages(build_articles(pkg))\n\n  expect_true(file_exists(path(pkg$dst_path, \"articles/vig1.html\")))\n  expect_true(file_exists(path(pkg$dst_path, \"articles/vig2.html\")))\n  expect_true(file_exists(path(pkg$dst_path, \"articles/vig3.html\")))\n  expect_true(file_exists(path(pkg$dst_path, \"articles/vig4.html\")))\n})\n"
  },
  {
    "path": "tests/testthat/test-build-redirects.R",
    "content": "test_that(\"build_redirect() works\", {\n  pkg <- list(\n    src_path = withr::local_tempdir(),\n    dst_path = withr::local_tempdir(),\n    meta = list(url = \"https://example.com\"),\n    prefix = \"\",\n    bs_version = 5\n  )\n  pkg <- structure(pkg, class = \"pkgdown\")\n  expect_snapshot(\n    build_redirect(c(\"old.html\", \"new.html#section\"), 1, pkg = pkg)\n  )\n\n  html <- xml2::read_html(path(pkg$dst_path, \"old.html\"))\n  expect_equal(\n    xpath_attr(html, \"//link\", \"href\"),\n    \"https://example.com/new.html#section\"\n  )\n})\n\ntest_that(\"build_redirect() errors if one entry is not right.\", {\n  data_redirects_ <- function(...) {\n    pkg <- local_pkgdown_site(meta = list(...))\n    data_redirects(pkg)\n  }\n\n  expect_snapshot(error = TRUE, {\n    data_redirects_(redirects = \"old.html\")\n    data_redirects_(redirects = list(\"old.html\"))\n  })\n})\n\ntest_that(\"article_redirects() creates redirects for vignettes in vignettes/articles\", {\n  dir <- withr::local_tempdir()\n  dir_create(path(dir, \"vignettes\", \"articles\"))\n  file_create(path(dir, \"vignettes\", \"articles\", \"test.Rmd\"))\n\n  pkg <- list(\n    meta = list(url = \"http://foo.com\"),\n    vignettes = package_vignettes(dir)\n  )\n\n  expect_equal(\n    article_redirects(pkg),\n    list(c(\"articles/articles/test.html\", \"articles/test.html\"))\n  )\n})\n\n# reference_redirects ----------------------------------------------------------\n\ntest_that(\"generates redirects only for non-name aliases\", {\n  pkg <- list(\n    meta = list(url = \"http://foo.com\"),\n    topics = list(\n      alias = list(\"foo\", c(\"bar\", \"baz\")),\n      name = c(\"foo\", \"bar\"),\n      file_out = c(\"foo.html\", \"bar.html\")\n    )\n  )\n  expect_equal(\n    reference_redirects(pkg),\n    list(c(\"reference/baz.html\", \"reference/bar.html\"))\n  )\n})\n\ntest_that(\"doesn't generates redirect for aliases that can't be file names\", {\n  pkg <- list(\n    meta = list(url = \"http://foo.com\"),\n    topics = list(\n      name = \"bar\",\n      alias = list(c(\"bar\", \"baz\", \"[<-.baz\")),\n      file_out = \"bar.html\"\n    )\n  )\n  expect_equal(\n    reference_redirects(pkg),\n    list(c(\"reference/baz.html\", \"reference/bar.html\"))\n  )\n})\n\ntest_that(\"never redirects away from existing topic\", {\n  pkg <- list(\n    meta = list(url = \"http://foo.com\"),\n    topics = list(\n      alias = list(\"foo\", c(\"bar\", \"foo\")),\n      name = c(\"foo\", \"bar\"),\n      file_out = c(\"foo.html\", \"bar.html\")\n    )\n  )\n  expect_equal(\n    reference_redirects(pkg),\n    list()\n  )\n})\n\ntest_that(\"no redirects if no aliases\", {\n  pkg <- list(\n    meta = list(url = \"http://foo.com\"),\n    topics = list(\n      alias = list(c(\"foo\", \"bar\")),\n      name = c(\"foo\", \"bar\"),\n      file_out = c(\"foo.html\", \"bar.html\")\n    )\n  )\n  expect_equal(reference_redirects(pkg), list())\n})\n"
  },
  {
    "path": "tests/testthat/test-build-reference-index.R",
    "content": "test_that(\"can generate three types of row\", {\n  ref <- list(\n    list(title = \"A\"),\n    list(subtitle = \"B\"),\n    list(contents = c(\"a\", \"b\", \"c\", \"e\", \"?\"))\n  )\n  meta <- list(reference = ref)\n  pkg <- as_pkgdown(test_path(\"assets/reference\"), override = meta)\n\n  expect_snapshot(data_reference_index(pkg))\n})\n\ntest_that(\"can use markdown in title and subtitle\", {\n  ref <- list(\n    list(title = \"*A*\"),\n    list(subtitle = \"*B*\"),\n    list(contents = c(\"a\", \"b\", \"c\", \"e\", \"?\"))\n  )\n  meta <- list(reference = ref)\n  pkg <- as_pkgdown(test_path(\"assets/reference\"), override = meta)\n\n  data <- data_reference_index(pkg)\n  expect_equal(data$rows[[1]]$title, \"<em>A</em>\")\n  expect_equal(data$rows[[2]]$subtitle, \"<em>B</em>\")\n})\n\ntest_that(\"rows with title internal are dropped\", {\n  ref <- list(\n    list(title = \"internal\", contents = c(\"a\", \"b\")),\n    list(contents = c(\"c\", \"e\", \"?\")),\n    list(title = \"internal\")\n  )\n  meta <- list(reference = ref)\n  pkg <- as_pkgdown(test_path(\"assets/reference\"), override = meta)\n\n  expect_warning(index <- data_reference_index(pkg), NA)\n  expect_equal(length(index$rows), 1)\n})\n\ntest_that(\"duplicate entries within a group is dropped\", {\n  ref <- list(\n    list(contents = c(\"a\", \"b\", \"a\", \"a\")),\n    list(contents = c(\"b\", \"c\", \"?\", \"e\"))\n  )\n  meta <- list(reference = ref)\n  pkg <- as_pkgdown(test_path(\"assets/reference\"), override = meta)\n\n  index <- data_reference_index(pkg)\n  expect_equal(length(index$rows[[1]]$topics), 2)\n  expect_equal(length(index$rows[[2]]$topics), 4)\n})\n\ntest_that(\"warns if missing topics\", {\n  ref <- list(\n    list(contents = c(\"a\", \"b\"))\n  )\n  meta <- list(reference = ref)\n  pkg <- as_pkgdown(test_path(\"assets/reference\"), override = meta)\n\n  expect_snapshot(data_reference_index(pkg), error = TRUE)\n})\n\ntest_that(\"default reference includes all functions, only escaping non-syntactic\", {\n  ref <- default_reference_index(test_path(\"assets/reference\"))\n  expect_equal(ref[[1]]$contents, c(\"a\", \"b\", \"c\", \"e\", \"`?`\"))\n})\n\ntest_that(\"gives informative errors\", {\n  data_reference_index_ <- function(x) {\n    pkg <- local_pkgdown_site(meta = list(reference = x))\n    data_reference_index(pkg)\n  }\n\n  expect_snapshot(error = TRUE, {\n    data_reference_index_(1)\n    data_reference_index_(list(1))\n    data_reference_index_(list(list(title = 1)))\n    data_reference_index_(list(list(title = \"a\\n\\nb\")))\n    data_reference_index_(list(list(subtitle = 1)))\n    data_reference_index_(list(list(subtitle = \"a\\n\\nb\")))\n    data_reference_index_(list(list(title = \"bla\", contents = 1)))\n    data_reference_index_(list(list(title = \"bla\", contents = NULL)))\n    data_reference_index_(list(list(title = \"bla\", contents = list(\"a\", NULL))))\n    data_reference_index_(list(list(title = \"bla\", contents = list())))\n    data_reference_index_(list(list(\n      title = \"bla\",\n      contents = \"notapackage::lala\"\n    )))\n    data_reference_index_(list(list(title = \"bla\", contents = \"rlang::lala\")))\n  })\n})\n\ntest_that(\"can exclude topics\", {\n  pkg <- local_pkgdown_site(\n    test_path(\"assets/reference\"),\n    list(\n      reference = list(\n        list(title = \"Exclude\", contents = c(\"a\", \"b\", \"-a\")),\n        list(\n          title = \"Exclude multiple\",\n          contents = c(\"a\", \"b\", \"c\", \"-matches('a|b')\")\n        ),\n        list(title = \"Everything else\", contents = c(\"a\", \"c\", \"e\", \"?\"))\n      )\n    )\n  )\n\n  ref <- data_reference_index(pkg)\n  # row 1 is the title row\n  expect_equal(length(ref$rows[[2]]$topics), 1)\n  expect_equal(ref$rows[[2]]$topics[[1]]$aliases, \"b()\")\n  expect_equal(length(ref$rows[[4]]$topics), 1)\n  expect_equal(ref$rows[[4]]$topics[[1]]$aliases, \"c()\")\n})\n\ntest_that(\"can use a topic from another package\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      reference = list(\n        list(\n          title = \"bla\",\n          contents = c(\"rlang::is_installed()\", \"bslib::bs_add_rules\")\n        )\n      )\n    )\n  )\n\n  expect_snapshot(data_reference_index(pkg))\n})\n\ntest_that(\"can use a selector name as a topic name\", {\n  pkg <- local_pkgdown_site(\n    test_path(\"assets/reference-selector\"),\n    list(\n      reference = list(\n        list(title = \"bla\", contents = c(\"matches\", \"matches('A')\"))\n      )\n    )\n  )\n\n  expect_snapshot(data_reference_index(pkg))\n})\n"
  },
  {
    "path": "tests/testthat/test-build-reference.R",
    "content": "test_that(\"parse failures include file name\", {\n  pkg <- local_pkgdown_site(test_path(\"assets/reference-fail\"))\n  expect_snapshot(build_reference(pkg), error = TRUE)\n})\n\ntest_that(\"examples_env runs pre and post code\", {\n  dst_path <- withr::local_tempdir()\n  dir_create(path(dst_path, \"reference\"))\n\n  pkg <- list(\n    package = \"test\",\n    src_path = test_path(\"assets/reference-pre-post\"),\n    dst_path = dst_path\n  )\n\n  env <- local(examples_env(pkg))\n  expect_equal(env$a, 2)\n})\n\ntest_that(\"examples_env sets width\", {\n  pkg <- local_pkgdown_site(\n    test_path(\"assets/reference\"),\n    list(code = list(width = 50))\n  )\n  dir_create(path(pkg$dst_path, \"reference\"))\n\n  examples_env(pkg)\n  expect_equal(getOption(\"width\"), 50)\n})\n\ntest_that(\"test usage ok on rendered page\", {\n  pkg <- local_pkgdown_site(\n    test_path(\"assets/reference\"),\n    list(template = list(bootstrap = 3))\n  )\n  suppressMessages(init_site(pkg))\n  suppressMessages(build_reference(pkg, topics = \"c\"))\n\n  html <- xml2::read_html(path(pkg$dst_path, \"reference\", \"c.html\"))\n  expect_equal(xpath_text(html, \"//div[@id='ref-usage']\", trim = TRUE), \"c()\")\n  clean_site(pkg, quiet = TRUE)\n\n  pkg <- local_pkgdown_site(test_path(\"assets/reference\"))\n  suppressMessages(init_site(pkg))\n  suppressMessages(build_reference(pkg, topics = \"c\"))\n  html <- xml2::read_html(path(pkg$dst_path, \"reference\", \"c.html\"))\n  # tweak_anchors() moves id into <h2>\n  expect_equal(\n    xpath_text(html, \"//div[h2[@id='ref-usage']]/div\", trim = TRUE),\n    \"c()\"\n  )\n})\n\ntest_that(\".Rd without usage doesn't get Usage section\", {\n  pkg <- local_pkgdown_site(\n    test_path(\"assets/reference\"),\n    list(template = list(bootstrap = 3))\n  )\n  suppressMessages(init_site(pkg))\n  suppressMessages(build_reference(pkg, topics = \"e\"))\n\n  html <- xml2::read_html(path(pkg$dst_path, \"reference\", \"e.html\"))\n  expect_equal(xpath_length(html, \"//div[@id='ref-usage']\"), 0)\n  clean_site(pkg, quiet = TRUE)\n\n  pkg <- local_pkgdown_site(test_path(\"assets/reference\"))\n  suppressMessages(init_site(pkg))\n  suppressMessages(build_reference(pkg, topics = \"e\"))\n  html <- xml2::read_html(path(pkg$dst_path, \"reference\", \"e.html\"))\n  # tweak_anchors() moves id into <h2>\n  expect_equal(xpath_length(html, \"//div[h2[@id='ref-usage']]\"), 0)\n})\n\ntest_that(\"pkgdown html dependencies are suppressed from examples in references\", {\n  pkg <- local_pkgdown_site(test_path(\"assets/reference-html-dep\"))\n  suppressMessages(init_site(pkg))\n  suppressMessages(build_reference(pkg, topics = \"a\"))\n  html <- xml2::read_html(path(pkg$dst_path, \"reference\", \"a.html\"))\n\n  # jquery is only loaded once, even though it's included by an example\n  expect_equal(\n    xpath_length(html, \".//script[(@src and contains(@src, '/jquery'))]\"),\n    1\n  )\n\n  # same for bootstrap js and css\n  str_subset_bootstrap <- function(x) {\n    bs_rgx <- \"bootstrap-[\\\\d.]+\" # ex: bootstrap-5.1.0 not bootstrap-toc,\n    grep(bs_rgx, x, value = TRUE, perl = TRUE)\n  }\n  bs_js_src <- str_subset_bootstrap(\n    xpath_attr(\n      html,\n      \".//script[(@src and contains(@src, '/bootstrap'))]\",\n      \"src\"\n    )\n  )\n  expect_length(bs_js_src, 1)\n\n  bs_css_href <- str_subset_bootstrap(\n    xpath_attr(\n      html,\n      \".//link[(@href and contains(@href, '/bootstrap'))]\",\n      \"href\"\n    )\n  )\n  expect_length(bs_css_href, 1)\n})\n\ntest_that(\"examples are reproducible by default, i.e. 'seed' is respected\", {\n  pkg <- local_pkgdown_site(test_path(\"assets/reference\"))\n  suppressMessages(init_site(pkg))\n  suppressMessages(build_reference(pkg, topics = \"f\"))\n\n  html <- xml2::read_html(path(pkg$dst_path, \"reference\", \"f.html\"))\n  examples <- xpath_text(html, \".//code//*[contains(@class, 'r-out')]\")\n\n  expect_snapshot(cat(examples))\n})\n\ntest_that(\"arguments get individual ids\", {\n  pkg <- local_pkgdown_site(test_path(\"assets/reference\"))\n  suppressMessages(init_site(pkg))\n  suppressMessages(build_reference(pkg, topics = \"a\"))\n\n  html <- xml2::read_html(path(pkg$dst_path, \"reference\", \"a.html\"))\n  expect_equal(xpath_attr(html, \"//dt\", \"id\"), c(\"arg-a\", \"arg-b\", \"arg-c\"))\n})\n\ntest_that(\"title and page title escapes html\", {\n  pkg <- local_pkgdown_site(test_path(\"assets/reference\"))\n  suppressMessages(init_site(pkg))\n  suppressMessages(build_reference(pkg, topics = \"g\"))\n\n  html <- xml2::read_html(path(pkg$dst_path, \"reference\", \"g.html\"))\n  expect_equal(\n    xpath_text(html, \"//title\", trim = TRUE),\n    \"g <-> h — g • testpackage\"\n  )\n  expect_equal(xpath_text(html, \"//h1\", trim = TRUE), \"g <-> h\")\n})\n\ntest_that(\"get_rdname handles edge cases\", {\n  expect_equal(get_rdname(list(file_in = \"foo..Rd\")), \"foo.\")\n  expect_equal(get_rdname(list(file_in = \"foo.rd\")), \"foo\")\n})\n"
  },
  {
    "path": "tests/testthat/test-build-search-docs.R",
    "content": "test_that(\"docsearch.json and sitemap.xml are valid for BS 3 site\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      url = \"https://example.com\",\n      template = list(\n        bootstrap = 3,\n        params = list(\n          docsearch = list(\n            api_key = \"test-api-key\",\n            index_name = \"test-index-name\"\n          )\n        )\n      )\n    )\n  )\n  suppressMessages(build_docsearch_json(pkg))\n  json <- path(pkg$dst_path, \"docsearch.json\")\n  expect_true(jsonlite::validate(read_lines(json)))\n\n  suppressMessages(build_sitemap(pkg))\n  xml <- path(pkg$dst_path, \"sitemap.xml\")\n  schema <- xml2::read_xml(test_path(\"assets/sitemaps-schema-0.9.xsd\"))\n  expect_true(xml2::xml_validate(xml2::read_xml(xml), schema))\n})\n\ntest_that(\"build_search_index() has expected structure\", {\n  pkg <- local_pkgdown_site(\n    desc = list(Version = \"1.0.0\"),\n    meta = list(url = \"https://example.com\")\n  )\n  pkg <- pkg_add_file(\n    pkg,\n    \"README.md\",\n    c(\n      \"# My Package\",\n      \"What the pakage does\"\n    )\n  )\n\n  suppressMessages(init_site(pkg))\n  suppressMessages(build_home_index(pkg))\n\n  expect_snapshot(str(build_search_index(pkg)))\n})\n\ntest_that(\"build sitemap only messages when it updates\", {\n  pkg <- local_pkgdown_site(meta = list(url = \"https://example.com\"))\n\n  suppressMessages(init_site(pkg))\n  suppressMessages(build_home(pkg))\n  expect_snapshot({\n    build_sitemap(pkg)\n    build_sitemap(pkg)\n  })\n})\n\ntest_that(\"build_search() builds the expected search.json with no URL\", {\n  pkg <- local_pkgdown_site(desc = list(Version = \"1.0.0\"))\n  pkg <- pkg_add_file(\n    pkg,\n    \"README.md\",\n    c(\n      \"# My Package\",\n      \"What the pakage does\"\n    )\n  )\n\n  suppressMessages(build_home(pkg))\n\n  index <- build_search_index(pkg)\n  paths <- purrr::map_chr(index, \"path\")\n  expect_equal(paths, c(\"/authors.html\", \"/authors.html\", \"/index.html\"))\n})\n\ntest_that(\"sitemap excludes redirects\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      url = \"https://example.com\",\n      redirects = list(c(\"a.html\", \"b.html\"))\n    )\n  )\n  suppressMessages(build_redirects(pkg))\n  expect_equal(get_site_paths(pkg), character())\n})\n"
  },
  {
    "path": "tests/testthat/test-build-tutorials.R",
    "content": "test_that(\"can autodetect tutorials\", {\n  pkg <- local_pkgdown_site()\n  base_path <- \"vignettes/tutorials/test-1\"\n  pkg <- pkg_add_file(\n    pkg,\n    path(base_path, \"test-1.Rmd\"),\n    c(\n      '---',\n      'title: \"Tutorial\"',\n      'output: learnr::tutorial',\n      'runtime: shiny_prerendered',\n      '---'\n    )\n  )\n  path <- path(\n    base_path,\n    \"rsconnect/documents/test-1.Rmd/shinyapps.io/hadley/tutorial-test-1.dcf\"\n  )\n  pkg <- pkg_add_file(\n    pkg,\n    path,\n    c(\n      \"name: tutorial-test-1\",\n      \"title: tutorial-test-1\",\n      \"hostUrl: https://api.shinyapps.io/v1\",\n      \"when: 1521734722.72611\",\n      \"url: https://hadley.shinyapps.io/tutorial-test-1/\"\n    )\n  )\n\n  out <- package_tutorials(pkg$src_path)\n  expect_equal(out$name, \"test-1\")\n  expect_equal(out$file_out, \"tutorials/test-1.html\")\n  expect_equal(out$url, \"https://hadley.shinyapps.io/tutorial-test-1/\")\n\n  # and aren't included in vignettes\n  out <- package_vignettes(pkg$src_path)\n  expect_equal(nrow(out), 0)\n})\n\ntest_that(\"can manually supply tutorials\", {\n  meta <- list(\n    tutorials = list(\n      list(name = \"1-name\", title = \"1-title\", url = \"1-url\"),\n      list(name = \"2-name\", title = \"2-title\", url = \"2-url\")\n    )\n  )\n\n  pkg <- local_pkgdown_site()\n  out <- package_tutorials(pkg, meta)\n  expect_equal(out$name, c(\"1-name\", \"2-name\"))\n  expect_equal(\n    out$file_out,\n    c(\"tutorials/1-name.html\", \"tutorials/2-name.html\")\n  )\n  expect_equal(out$url, c(\"1-url\", \"2-url\"))\n})\n"
  },
  {
    "path": "tests/testthat/test-build.R",
    "content": "test_that(\"both versions of build_site have same arguments\", {\n  expect_equal(formals(build_site_local), formals(build_site_external))\n})\n\ntest_that(\"build_site can be made unquiet\", {\n  skip_if_no_pandoc()\n\n  # `quiet = FALSE` from build_site() should get passed to\n  # build_articles(), which will include some rmarkdown build out in the\n  # messages, including \"pandoc\", which won't be there normally\n  pkg <- local_pkgdown_site(test_path(\"assets/figure\"))\n  output_unquiet <- suppressMessages(\n    capture.output(\n      build_site(\n        pkg,\n        quiet = FALSE,\n        preview = FALSE\n      )\n    )\n  )\n  expect_match(paste(output_unquiet, collapse = \"\"), \"pandoc\")\n\n  output_quiet <- suppressMessages(\n    capture.output(\n      build_site(\n        pkg,\n        preview = FALSE\n      )\n    )\n  )\n\n  expect_no_match(paste(output_quiet, collapse = \"\"), \"pandoc\")\n})\n"
  },
  {
    "path": "tests/testthat/test-check-built.R",
    "content": "test_that(\"check images in readme\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"README.md\", \"![foo](vignettes/kitten.jpg)\")\n  suppressMessages(build_home_index(pkg))\n\n  # no image, so should warn\n  expect_snapshot(check_built_site(pkg))\n\n  # create and build vignette that uses image, so no warning\n  pkg <- pkg_add_file(pkg, \"vignettes/kitten.Rmd\", \"![foo](kitten.jpg)\")\n  pkg <- pkg_add_kitten(pkg, \"vignettes\")\n\n  suppressMessages(build_article(\"kitten\", pkg))\n  suppressMessages(expect_no_warning(check_built_site(pkg)))\n})\n"
  },
  {
    "path": "tests/testthat/test-check.R",
    "content": "test_that(\"sitrep complains about BS3\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      template = list(bootstrap = 3),\n      url = \"https://example.com\"\n    ),\n    desc = list(URL = \"https://example.com\")\n  )\n  expect_snapshot(pkgdown_sitrep(pkg))\n})\n\ntest_that(\"sitrep reports all problems\", {\n  pkg <- local_pkgdown_site(\n    test_path(\"assets/reference\"),\n    list(\n      reference = list(\n        list(title = \"Title\", contents = c(\"a\", \"b\", \"c\", \"e\"))\n      )\n    )\n  )\n\n  expect_snapshot(pkgdown_sitrep(pkg))\n})\n\ntest_that(\"checks fails on first problem\", {\n  pkg <- local_pkgdown_site(\n    test_path(\"assets/reference\"),\n    list(\n      reference = list(\n        list(title = \"Title\", contents = c(\"a\", \"b\", \"c\", \"e\"))\n      )\n    )\n  )\n\n  expect_snapshot(check_pkgdown(pkg), error = TRUE)\n})\n\ntest_that(\"both inform if everything is ok\", {\n  pkg <- local_pkgdown_site(\n    meta = list(url = \"https://example.com\"),\n    desc = list(URL = \"https://example.com\")\n  )\n\n  expect_snapshot({\n    pkgdown_sitrep(pkg)\n    check_pkgdown(pkg)\n  })\n})\n\n# check urls ------------------------------------------------------------------\n\ntest_that(\"check_urls reports problems\", {\n  # URL not in the pkgdown config\n  pkg <- local_pkgdown_site()\n  expect_snapshot(check_urls(pkg), error = TRUE)\n\n  # URL only in the pkgdown config\n  pkg <- local_pkgdown_site(meta = list(url = \"https://testpackage.r-lib.org\"))\n  expect_snapshot(check_urls(pkg), error = TRUE)\n})\n\n# check favicons --------------------------------------------------------------\n\ntest_that(\"check_favicons reports problems\", {\n  pkg <- local_pkgdown_site()\n\n  # no logo no problems\n  expect_no_error(check_favicons(pkg))\n\n  # logo but no favicons\n  file_touch(path(pkg$src_path, \"logo.svg\"))\n  expect_snapshot(check_favicons(pkg), error = TRUE)\n\n  # logo and old favicons\n  dir_create(path_favicons(pkg))\n  file_touch(path(path_favicons(pkg), \"favicon.ico\"), Sys.time() - 86400)\n  expect_snapshot(check_favicons(pkg), error = TRUE)\n\n  # logo and new favicons\n  file_touch(path(path_favicons(pkg), \"favicon.ico\"), Sys.time() + 86400)\n  expect_no_error(check_favicons(pkg))\n})\n"
  },
  {
    "path": "tests/testthat/test-config.R",
    "content": "test_that(\"config_pluck_character coerces empty values to character\", {\n  pkg <- local_pkgdown_site(meta = list(x = NULL, y = list()))\n  expect_equal(config_pluck_character(pkg, \"x\"), character())\n  expect_equal(config_pluck_character(pkg, \"y\"), character())\n  expect_equal(config_pluck_character(pkg, \"z\"), character())\n})\n\ntest_that(\"config_pluck_character generates informative error\", {\n  pkg <- local_pkgdown_site(meta = list(x = 1))\n  expect_snapshot(config_pluck_character(pkg, \"x\"), error = TRUE)\n})\n\ntest_that(\"config_pluck_string generates informative error\", {\n  pkg <- local_pkgdown_site(meta = list(x = 1))\n  expect_snapshot(config_pluck_string(pkg, \"x\"), error = TRUE)\n})\n\n# checkers --------------------------------------------------------------------\n\ntest_that(\"config_check_list() returns list if ok\", {\n  x <- list(x = 1, y = 2)\n  expect_equal(config_check_list(x), x)\n  expect_equal(config_check_list(x, has_names = \"x\"), x)\n  expect_equal(config_check_list(x, has_names = c(\"x\", \"y\")), x)\n})\n\ntest_that(\"config_check_list gives informative errors\", {\n  # Avoid showing unneeded call details in snapshot\n  pkg <- local_pkgdown_site()\n  config_check_list_ <- function(...) {\n    config_check_list(..., error_pkg = pkg, error_path = \"path\")\n  }\n\n  expect_snapshot(error = TRUE, {\n    config_check_list_(1, has_names = \"x\")\n    config_check_list_(list(x = 1, y = 1), has_names = c(\"y\", \"z\"))\n  })\n})\n"
  },
  {
    "path": "tests/testthat/test-deploy-site.R",
    "content": "# ci_commit_sha() ------------------------------------------------------------\n\ntest_that(\"commit sha can be retrieved from travis or GitHub action env vars\", {\n  sha <- \"XYZ\"\n\n  withr::with_envvar(\n    c(\"TRAVIS_COMMIT\" = sha, \"GITHUB_SHA\" = \"\"),\n    expect_equal(ci_commit_sha(), sha)\n  )\n  withr::with_envvar(\n    c(\"TRAVIS_COMMIT\" = \"\", \"GITHUB_SHA\" = sha),\n    expect_equal(ci_commit_sha(), sha)\n  )\n  withr::with_envvar(\n    c(\"TRAVIS_COMMIT\" = \"\", \"GITHUB_SHA\" = \"\"),\n    expect_equal(ci_commit_sha(), \"\")\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-development.R",
    "content": "test_that(\"empty yaml gets correct defaults\", {\n  pkg <- local_pkgdown_site()\n  expect_equal(pkg$development$mode, \"default\")\n  expect_equal(pkg$development$in_dev, FALSE)\n  expect_equal(pkg$development$version_label, \"muted\")\n})\n\ntest_that(\"mode = auto uses version\", {\n  pkg <- local_pkgdown_site(\n    desc = list(Version = \"0.0.9000\"),\n    meta = list(development = list(mode = \"auto\"))\n  )\n  expect_equal(pkg$development$mode, \"devel\")\n  expect_equal(pkg$development$in_dev, TRUE)\n  expect_equal(pkg$development$version_label, \"danger\")\n})\n\ntest_that(\"mode overrides version\", {\n  pkg <- local_pkgdown_site(\n    desc = list(Version = \"0.0.9000\"),\n    meta = list(development = list(mode = \"release\"))\n  )\n\n  expect_equal(pkg$development$mode, \"release\")\n})\n\ntest_that(\"env var overrides mode\", {\n  withr::local_envvar(\"PKGDOWN_DEV_MODE\" = \"devel\")\n  pkg <- local_pkgdown_site(\n    meta = list(development = list(mode = \"release\"))\n  )\n  expect_equal(pkg$development$mode, \"devel\")\n})\n\ntest_that(\"dev_mode recognises basic version structure\", {\n  expect_equal(dev_mode_auto(\"0.0.0.9000\"), \"unreleased\")\n\n  expect_equal(dev_mode_auto(\"0.0.1\"), \"release\")\n\n  expect_equal(dev_mode_auto(\"0.1\"), \"release\")\n  expect_equal(dev_mode_auto(\"0.1.0\"), \"release\")\n  expect_equal(dev_mode_auto(\"0.1.9000\"), \"devel\")\n\n  expect_equal(dev_mode_auto(\"1.0\"), \"release\")\n  expect_equal(dev_mode_auto(\"1.0.0\"), \"release\")\n  expect_equal(dev_mode_auto(\"1.0.0.9000\"), \"devel\")\n})\n\ntest_that(\"validates yaml\", {\n  data_development_ <- function(...) {\n    local_pkgdown_site(meta = list(...))\n  }\n\n  expect_snapshot(error = TRUE, {\n    data_development_(development = 1)\n    data_development_(development = list(mode = 1))\n    data_development_(development = list(mode = \"foo\"))\n    data_development_(development = list(destination = 1))\n    data_development_(development = list(version_label = 1))\n  })\n})\n"
  },
  {
    "path": "tests/testthat/test-external-deps.R",
    "content": "test_that(\"check integrity validates integrity\", {\n  temp <- withr::local_tempfile(lines = letters)\n\n  expect_snapshot(error = TRUE, {\n    check_integrity(temp, \"sha123-abc\")\n    check_integrity(temp, \"sha256-abc\")\n  })\n\n  integrity <- paste0(\"sha256-\", compute_hash(temp, 256L))\n  expect_no_error(check_integrity(temp, integrity))\n})\n\ntest_that(\"can parse integrity\", {\n  expect_equal(parse_integrity(\"sha256-abc\"), list(size = 256L, hash = \"abc\"))\n})\n"
  },
  {
    "path": "tests/testthat/test-figure.R",
    "content": "test_that(\"can override defaults in _pkgdown.yml\", {\n  skip_if_no_pandoc()\n  skip_if_no_quarto()\n  withr::local_temp_libpaths()\n\n  pkg <- local_pkgdown_site(test_path(\"assets/figure\"))\n  suppressMessages(init_site(pkg))\n\n  callr::rcmd(\"INSTALL\", pkg$src_path, show = FALSE, fail_on_status = TRUE)\n\n  suppressMessages(build_reference(pkg, devel = FALSE))\n  img <- path_file(dir_ls(path(pkg$dst_path, \"reference\"), glob = \"*.jpg\"))\n  expect_setequal(img, c(\"figure-1.jpg\", \"figure-2.jpg\"))\n\n  suppressMessages(build_articles(pkg))\n  img <- path_file(dir_ls(\n    path(pkg$dst_path, \"articles\"),\n    glob = \"*.jpg\",\n    recurse = TRUE\n  ))\n  expect_equal(img, \"unnamed-chunk-1-1.jpg\")\n})\n"
  },
  {
    "path": "tests/testthat/test-highlight.R",
    "content": "test_that(\"highlight_examples captures dependencies\", {\n  withr::defer(try(file_delete(test_path(\"Rplot001.png\")), TRUE))\n\n  dummy_dep <- htmltools::htmlDependency(\"dummy\", \"1.0.0\", \"dummy.js\")\n  widget <- htmlwidgets::createWidget(\"test\", list(), dependencies = dummy_dep)\n  out <- highlight_examples(\"widget\", env = environment())\n\n  # htmlwidgets always get dependency on htmlwidgets.js\n  expect_equal(attr(out, \"dependencies\")[-1], list(dummy_dep))\n})\n\ntest_that(\"highlight_examples runs and hides DONTSHOW calls()\", {\n  out <- highlight_examples(\"DONTSHOW(x <- 1)\\nx\")\n  expect_snapshot(cat(strip_html_tags(out)))\n})\n\ntest_that(\"highlight_text & highlight_examples include sourceCode div\", {\n  withr::defer(try(file_delete(test_path(\"Rplot001.png\")), TRUE))\n\n  html <- xml2::read_html(highlight_examples(\"a + a\", \"x\"))\n  expect_equal(xpath_attr(html, \"./body/div\", \"class\"), \"sourceCode\")\n\n  html <- xml2::read_html(highlight_text(\"a + a\"))\n  expect_equal(xpath_attr(html, \"./body/div\", \"class\"), \"sourceCode\")\n})\n\ntest_that(\"pre() can produce needed range of outputs\", {\n  expect_snapshot({\n    cat(pre(\"x\"))\n    cat(pre(\"x\", r_code = TRUE))\n  })\n})\n\ntest_that(\"tweak_highlight_other() renders generic code blocks for roxygen2 >= 7.2.0\", {\n  html <- xml2::read_html(\n    '<div class=\"sourceCode\"><pre><code>1+1\\n</code></pre></div>'\n  )\n  div <- xml2::xml_find_first(html, \"//div\")\n\n  tweak_highlight_other(div)\n  expect_equal(xpath_text(div, \"pre/code\"), \"1+1\")\n})\n\ntest_that(\"tweak_highlight_other() renders nested code blocks for roxygen2 >= 7.2.0\", {\n  html <- xml2::read_html(dedent(\n    \"\n    <div class='sourceCode markdown'><pre><code>\n    blablabla\n\n    ```{r results='asis'}\n    lalala\n    ```\n\n    </code></pre></div>\n  \"\n  ))\n  div <- xml2::xml_find_first(html, \"//div\")\n\n  tweak_highlight_other(div)\n  expect_snapshot(cat(xpath_text(div, \"pre/code\")))\n})\n"
  },
  {
    "path": "tests/testthat/test-html-build.R",
    "content": "test_that(\"Stripping HTML tags\", {\n  expect_identical(\n    strip_html_tags(\"<p>some text about <code>data</code>\"),\n    \"some text about data\"\n  )\n})\n\n# links and references in the package description -------------------------\n\ntest_that(\"references in angle brackets are converted to HTML\", {\n  ## URL\n  expect_identical(\n    linkify(\"see <https://CRAN.R-project.org/view=SpatioTemporal>.\"),\n    \"see &lt;<a href='https://CRAN.R-project.org/view=SpatioTemporal'>https://CRAN.R-project.org/view=SpatioTemporal</a>&gt;.\"\n  )\n  ## DOI\n  expect_identical(\n    linkify(\"M & H (2017) <doi:10.1093/biostatistics/kxw051>\"),\n    \"M &amp; H (2017) &lt;<a href='https://doi.org/10.1093/biostatistics/kxw051'>doi:10.1093/biostatistics/kxw051</a>&gt;\"\n  )\n  ## arXiv\n  expect_identical(\n    linkify(\"see <arXiv:1802.03967>.\"),\n    \"see &lt;<a href='https://arxiv.org/abs/1802.03967'>arXiv:1802.03967</a>&gt;.\"\n  )\n  ## unsupported formats are left alone (just escaping special characters)\n  unsupported <- c(\n    \"<doi:10.1002/(SICI)1097-0258(19980930)17:18<2045::AID-SIM943>3.0.CO;2-P>\",\n    \"<https://scholar.google.com/citations?view_op=top_venues&hl=de&vq=phy_probabilitystatistics>\"\n  )\n  expect_identical(linkify(unsupported), escape_html(unsupported))\n})\n"
  },
  {
    "path": "tests/testthat/test-init.R",
    "content": "test_that(\"informative print method\", {\n  pkg <- local_pkgdown_site()\n  expect_snapshot(init_site(pkg))\n})\n\ntest_that(\"extra.css and extra.js copied and linked\", {\n  pkg <- local_pkgdown_site()\n  dir_create(path(pkg$src_path, \"pkgdown\"))\n  file_create(path(pkg$src_path, \"pkgdown\", \"extra.css\"))\n  file_create(path(pkg$src_path, \"pkgdown\", \"extra.js\"))\n\n  suppressMessages(init_site(pkg))\n  expect_true(file_exists(path(pkg$dst_path, \"extra.css\")))\n  expect_true(file_exists(path(pkg$dst_path, \"extra.js\")))\n\n  skip_if_no_pandoc()\n  # Now check they actually get used .\n  suppressMessages(build_home(pkg))\n\n  html <- xml2::read_html(path(pkg$dst_path, \"index.html\"))\n  paths <- xpath_attr(html, \".//link\", \"href\")\n\n  expect_true(\"extra.css\" %in% paths)\n})\n\ntest_that(\"single extra.css correctly copied\", {\n  pkg <- local_pkgdown_site()\n  dir_create(path(pkg$src_path, \"pkgdown\"))\n  file_create(path(pkg$src_path, \"pkgdown\", \"extra.css\"))\n  suppressMessages(init_site(pkg))\n\n  expect_true(file_exists(path(pkg$dst_path, \"extra.css\")))\n})\n\ntest_that(\"asset subdirectories are copied\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"pkgdown/assets/subdir1/file1.txt\")\n  pkg <- pkg_add_file(pkg, \"pkgdown/assets/subdir1/subdir2/file2.txt\")\n  suppressMessages(init_site(pkg))\n\n  expect_true(file_exists(path(pkg$dst_path, \"subdir1\", \"file1.txt\")))\n  expect_true(file_exists(path(\n    pkg$dst_path,\n    \"subdir1\",\n    \"subdir2\",\n    \"file2.txt\"\n  )))\n})\n\ntest_that(\"site meta doesn't break unexpectedly\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"vignettes/a.Rmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/b.Rmd\")\n\n  # null out components that will vary\n  yaml <- site_meta(pkg)\n  yaml$pkgdown <- \"{version}\"\n  yaml$pkgdown_sha <- \"{sha}\"\n  yaml$pandoc <- \"{version}\"\n  yaml$last_built <- timestamp(as.POSIXct(\"2020-01-01\", tz = \"UTC\"))\n\n  expect_snapshot(yaml)\n})\n\ntest_that(\"site meta includes vignette subdirectories\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"vignettes/a/a.Rmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/a/b.Rmd\")\n\n  meta <- site_meta(pkg)\n  expect_equal(meta$articles, list(\"a/a\" = \"a/a.html\", \"a/b\" = \"a/b.html\"))\n})\n"
  },
  {
    "path": "tests/testthat/test-markdown.R",
    "content": "test_that(\"handles empty inputs (returns NULL)\", {\n  pkg <- local_pkgdown_site()\n  expect_null(markdown_text_inline(pkg, \"\"))\n  expect_null(markdown_text_inline(pkg, NULL))\n  expect_null(markdown_text_block(pkg, NULL))\n  expect_null(markdown_text_block(pkg, \"\"))\n\n  path <- withr::local_tempfile()\n  file_create(path)\n  expect_null(markdown_body(pkg, path))\n})\n\ntest_that(\"header attributes are parsed\", {\n  pkg <- local_pkgdown_site()\n  text <- markdown_text_block(pkg, \"# Header {.class #id}\")\n  expect_match(text, \"id=\\\"id\\\"\")\n  expect_match(text, \"class=\\\".*? class\\\"\")\n})\n\ntest_that(\"markdown_text_inline() works with inline markdown\", {\n  pkg <- local_pkgdown_site()\n  expect_equal(markdown_text_inline(pkg, \"**lala**\"), \"<strong>lala</strong>\")\n\n  expect_snapshot(error = TRUE, {\n    markdown_text_inline(pkg, \"x\\n\\ny\", error_path = \"title\")\n  })\n})\n\ntest_that(\"markdown_text_block() works with inline and block markdown\", {\n  skip_if_no_pandoc(\"2.17.1\")\n\n  pkg <- local_pkgdown_site()\n  expect_equal(markdown_text_block(pkg, \"**x**\"), \"<p><strong>x</strong></p>\")\n  expect_equal(markdown_text_block(pkg, \"x\\n\\ny\"), \"<p>x</p><p>y</p>\")\n})\n\ntest_that(\"markdown_body() captures title\", {\n  pkg <- local_pkgdown_site()\n  temp <- withr::local_tempfile(lines = \"# Title\\n\\nSome text\")\n\n  html <- markdown_body(pkg, temp)\n  expect_equal(attr(html, \"title\"), \"Title\")\n\n  # And can optionally strip it\n  html <- markdown_body(pkg, temp, strip_header = TRUE)\n  expect_equal(attr(html, \"title\"), \"Title\")\n  expect_no_match(html, \"Title\")\n})\n\ntest_that(\"markdown_text_*() handles UTF-8 correctly\", {\n  pkg <- local_pkgdown_site()\n  expect_equal(markdown_text_block(pkg, \"\\u00f8\"), \"<p>\\u00f8</p>\")\n  expect_equal(markdown_text_inline(pkg, \"\\u00f8\"), \"\\u00f8\")\n})\n\ntest_that(\"validates math yaml\", {\n  config_math_rendering_ <- function(...) {\n    pkg <- local_pkgdown_site(meta = list(template = list(...)))\n    config_math_rendering(pkg)\n  }\n  expect_snapshot(error = TRUE, {\n    config_math_rendering_(`math-rendering` = 1)\n    config_math_rendering_(`math-rendering` = \"math\")\n  })\n})\n\ntest_that(\"preserves ANSI characters\", {\n  withr::local_options(cli.num_colors = 256)\n  pkg <- local_pkgdown_site()\n  expect_snapshot(\n    markdown_text(pkg, sprintf(\"prefer %s\", cli::col_blue(\"a\")))\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-navbar-menu.R",
    "content": "test_that(\"can construct menu with children\", {\n  menu <- menu_submenu(\n    \"Title\",\n    list(\n      menu_heading(\"Heading\"),\n      menu_separator(),\n      menu_link(\"Link\", \"https://example.com\")\n    )\n  )\n  expect_snapshot(cat(navbar_html(menu)))\n})\n\ntest_that(\"bad inputs give clear error\", {\n  submenu <- menu_submenu(\n    \"Title\",\n    list(\n      menu_submenu(\"Heading\", list(menu_heading(\"Hi\")))\n    )\n  )\n  expect_snapshot(error = TRUE, {\n    navbar_html(1)\n    navbar_html(list(foo = 1))\n    navbar_html(submenu)\n  })\n})\n\ntest_that(\"can construct bullets\", {\n  expect_snapshot({\n    cat(navbar_html(menu_icon(\"fa-question\", \"https://example.com\", \"label\")))\n    cat(navbar_html(menu_heading(\"Hi\")))\n    cat(navbar_html(menu_link(\"Hi\", \"https://example.com\")))\n  })\n})\n\ntest_that(\"bullet class varies based on depth\", {\n  expect_equal(\n    navbar_html(menu_separator(), menu_depth = 0),\n    '<li class=\"nav-item\"><hr class=\"dropdown-divider\"></li>'\n  )\n\n  expect_equal(\n    navbar_html(menu_separator(), menu_depth = 1),\n    '<li><hr class=\"dropdown-divider\"></li>'\n  )\n})\n\ntest_that(\"icons warn if no aria-label\", {\n  reset_message_verbosity(\"icon-aria-label\")\n\n  expect_snapshot({\n    . <- navbar_html(menu_icon(\"fa-question\", \"https://example.com\", NULL))\n  })\n})\n\ntest_that(\"icons extract base iconset class automatically\", {\n  expect_match(\n    navbar_html(menu_icon(\"fa-question\", \"https://example.com\", \"label\")),\n    'class=\"fa fa-question\"',\n    fixed = TRUE\n  )\n\n  expect_match(\n    navbar_html(menu_icon(\"fab fab-github\", \"https://example.com\", \"label\")),\n    'class=\"fab fab-github\"',\n    fixed = TRUE\n  )\n})\n\ntest_that(\"can specify link target\", {\n  expect_match(\n    navbar_html(menu_link(\"a\", \"b\", target = \"_blank\")),\n    'target=\"_blank\"',\n    fixed = TRUE\n  )\n})\n\ntest_that(\"can specify class, id, and title\", {\n  expect_equal(\n    navbar_html(menu_link(\"a\", \"#\", class = \"class\")),\n    '<li class=\"nav-item\"><a class=\"nav-link class\" href=\"#\">a</a></li>'\n  )\n  expect_equal(\n    navbar_html(menu_link(\"a\", \"#\", id = \"id\")),\n    '<li class=\"nav-item\"><a class=\"nav-link\" id=\"id\" href=\"#\">a</a></li>'\n  )\n  expect_equal(\n    navbar_html(menu_link(\"a\", \"#\", title = \"title\")),\n    '<li class=\"nav-item\"><a class=\"nav-link\" href=\"#\" title=\"title\">a</a></li>'\n  )\n})\n\ntest_that(\"can construct theme menu\", {\n  pkg <- local_pkgdown_site(\n    meta = list(template = list(bootstrap = 5, `light-switch` = TRUE))\n  )\n  lightswitch <- navbar_components(pkg)$lightswitch\n  expect_snapshot(cat(navbar_html(lightswitch)))\n})\n\ntest_that(\"simple components don't change without warning\", {\n  expect_snapshot({\n    cat(navbar_html(menu_heading(\"a\")))\n    cat(navbar_html(menu_link(\"a\", \"b\")))\n    cat(navbar_html(menu_separator()))\n    cat(navbar_html(menu_search()))\n  })\n})\n\n# Building blocks -----------------------------------------------------------\n\ntest_that(\"navbar_html_text() combines icons and text\", {\n  expect_equal(navbar_html_text(list(text = \"a\")), 'a')\n  expect_equal(\n    navbar_html_text(list(icon = \"fas-github\", `aria-label` = \"github\")),\n    '<span class=\"fas fas-github\"></span>'\n  )\n  expect_equal(\n    navbar_html_text(list(\n      text = \"a\",\n      icon = \"fas-github\",\n      `aria-label` = \"github\"\n    )),\n    '<span class=\"fas fas-github\"></span> a'\n  )\n})\n\ntest_that(\"navbar_html_text() escapes text\", {\n  expect_equal(navbar_html_text(list(text = \"<>\")), '&lt;&gt;')\n})\n\ntest_that(\"named arguments become attributes\", {\n  expect_equal(html_tag(\"a\"), '<a></a>')\n  expect_equal(html_tag(\"a\", x = NULL), '<a></a>')\n  expect_equal(html_tag(\"a\", x = NA), '<a x></a>')\n  expect_equal(html_tag(\"a\", x = 1), '<a x=\"1\"></a>')\n})\n\ntest_that(\"unnamed arguments become children\", {\n  expect_equal(html_tag(\"a\", \"b\"), '<a>b</a>')\n  expect_equal(html_tag(\"a\", \"b\", NULL), '<a>b</a>')\n})\n\ntest_that(\"class components are pasted together\", {\n  expect_equal(html_tag(\"a\", class = NULL), '<a></a>')\n  expect_equal(html_tag(\"a\", class = \"a\"), '<a class=\"a\"></a>')\n  expect_equal(html_tag(\"a\", class = c(\"a\", \"b\")), '<a class=\"a b\"></a>')\n})\n"
  },
  {
    "path": "tests/testthat/test-navbar.R",
    "content": "test_that(\"adds github/gitlab/codeberg link when available\", {\n  pkg <- pkg_navbar()\n  expect_snapshot_output(navbar_components(pkg))\n\n  pkg <- pkg_navbar(github_url = \"https://github.com/r-lib/pkgdown\")\n  expect_snapshot_output(navbar_components(pkg))\n\n  pkg <- pkg_navbar(github_url = \"https://gitlab.com/r-lib/pkgdown\")\n  expect_snapshot_output(navbar_components(pkg))\n})\n\ntest_that(\"vignette with package name turns into getting started\", {\n  vig <- pkg_navbar_vignettes(\"test\")\n  pkg <- pkg_navbar(vignettes = vig)\n  expect_snapshot_output(navbar_components(pkg))\n})\n\ntest_that(\"can control articles navbar through articles meta\", {\n  pkg <- function(...) {\n    vig <- pkg_navbar_vignettes(c(\"a\", \"b\"))\n    pkg_navbar(vignettes = vig, meta = list(...))\n  }\n\n  \"Default: show all alphabetically\"\n  expect_snapshot(navbar_articles(pkg()))\n\n  \"No navbar sections: link to index\"\n  expect_snapshot(\n    navbar_articles(\n      pkg(\n        articles = list(list(name = \"all\", contents = c(\"a\", \"b\")))\n      )\n    )\n  )\n\n  \"navbar without text\"\n  expect_snapshot(\n    navbar_articles(\n      pkg(\n        articles = list(list(\n          name = \"all\",\n          contents = c(\"a\", \"b\"),\n          navbar = NULL\n        ))\n      )\n    )\n  )\n\n  \"navbar with label\"\n  expect_snapshot(\n    navbar_articles(\n      pkg(\n        articles = list(list(\n          name = \"all\",\n          contents = c(\"a\", \"b\"),\n          navbar = \"Label\"\n        ))\n      )\n    )\n  )\n\n  \"navbar with only some articles\"\n  expect_snapshot(\n    navbar_articles(\n      pkg(\n        articles = list(\n          list(name = \"a\", contents = \"a\", navbar = NULL),\n          list(name = \"b\", contents = \"b\")\n        )\n      )\n    )\n  )\n})\n\ntest_that(\"can control articles navbar through navbar meta\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      navbar = list(\n        components = list(\n          articles = menu_submenu(\"Hi!\", list(menu_heading(\"Hi\")))\n        )\n      )\n    )\n  )\n  pkg <- pkg_add_file(pkg, \"vignettes/a.Rmd\", pkg_vignette())\n  pkg <- pkg_add_file(pkg, \"vignettes/b.Rmd\", pkg_vignette())\n\n  navbar <- navbar_link_components(pkg)\n  expect_equal(navbar$left$articles$text, \"Hi!\")\n})\n\ntest_that(\"data_navbar() works by default\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      repo = list(url = list(home = \"https://github.com/r-lib/pkgdown/\"))\n    )\n  )\n  file_touch(path(pkg$src_path, \"NEWS.md\"))\n\n  expect_snapshot(data_navbar(pkg))\n})\n\ntest_that(\"data_navbar() can re-order default elements\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      repo = list(url = list(home = \"https://github.com/r-lib/pkgdown/\")),\n      navbar = list(\n        structure = list(\n          left = c(\"github\", \"search\"),\n          right = \"news\"\n        )\n      )\n    )\n  )\n  file_create(path(pkg$src_path, \"NEWS.md\"))\n\n  expect_snapshot(data_navbar(pkg)[c(\"left\", \"right\")])\n})\n\ntest_that(\"data_navbar() can remove elements\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      navbar = list(\n        structure = list(\n          left = c(\"github\", \"search\"),\n          right = list()\n        )\n      )\n    )\n  )\n\n  expect_equal(data_navbar(pkg)$right, \"\")\n})\n\ntest_that(\"data_navbar() works with empty side\", {\n  pkg <- local_pkgdown_site(\n    meta = list(navbar = list(structure = list(left = list(), right = list())))\n  )\n\n  expect_snapshot(data_navbar(pkg))\n})\n\ntest_that(\"data_navbar_() errors with bad yaml specifications\", {\n  data_navbar_ <- function(...) {\n    pkg <- local_pkgdown_site(meta = list(...))\n    data_navbar(pkg)\n  }\n\n  expect_snapshot(error = TRUE, {\n    data_navbar_(navbar = list(structure = list(left = 1)))\n    data_navbar_(navbar = list(right = \"github\"))\n  })\n})\n\ntest_that(\"for bs4, default bg and type come from bootswatch\", {\n  style <- navbar_style(bs_version = 5)\n  expect_equal(style, list(bg = \"light\", type = \"light\"))\n\n  style <- navbar_style(theme = \"cyborg\", bs_version = 5)\n  expect_equal(style, list(bg = \"dark\", type = \"dark\"))\n\n  # but can override\n  style <- navbar_style(list(bg = \"primary\"), bs_version = 5)\n  expect_equal(style, list(bg = \"primary\", type = \"dark\"))\n\n  style <- navbar_style(list(bg = \"primary\", type = \"light\"), bs_version = 5)\n  expect_equal(style, list(bg = \"primary\", type = \"light\"))\n})\n\ntest_that(\"render_navbar_links BS3 & BS4 default\", {\n  x <- list(\n    intro = menu_link(\"Get started\", \"articles/pkgdown.html\"),\n    reference = menu_link(\"Reference\", \"reference/index.html\"),\n    articles = menu_submenu(\n      \"Articles\",\n      list(\n        menu_link(\"Auto-linking\", \"articles/linking.html\"),\n        menu_link(\"Search\", \"articles/search.html\"),\n        menu_link(\"Metadata\", \"articles/metadata.html\"),\n        menu_link(\n          \"Customize your pkgdown website\",\n          \"articles/customization.html\"\n        ),\n        menu_separator(),\n        menu_link(\"More...\", \"articles/index.html\")\n      )\n    ),\n    news = menu_link(\"News\", \"news/index.html\")\n  )\n\n  expect_snapshot(cat(render_navbar_links(x, pkg = list(bs_version = 3))))\n  expect_snapshot(cat(render_navbar_links(x, pkg = list(bs_version = 4))))\n})\n\ntest_that(\"dropdowns on right are right-aligned\", {\n  x <- list(\n    articles = menu_submenu(\n      \"Articles\",\n      list(menu_heading(\"A\"), menu_heading(\"B\"))\n    )\n  )\n  pkg <- list(bs_version = 5)\n\n  right <- xml2::read_html(render_navbar_links(x, pkg = pkg, side = \"right\"))\n  left <- xml2::read_html(render_navbar_links(x, pkg = pkg, side = \"left\"))\n\n  expect_equal(\n    xpath_attr(right, \".//ul\", \"class\"),\n    \"dropdown-menu dropdown-menu-end\"\n  )\n  expect_equal(xpath_attr(left, \".//ul\", \"class\"), \"dropdown-menu\")\n})\n"
  },
  {
    "path": "tests/testthat/test-package.R",
    "content": "test_that(\"is_pkgdown checks its inputs\", {\n  expect_snapshot(error = TRUE, {\n    as_pkgdown(1)\n    as_pkgdown(override = 1)\n  })\n})\n\ntest_that(\"package_vignettes() doesn't trip over directories\", {\n  dir <- withr::local_tempdir()\n  dir_create(path(dir, \"vignettes\", \"test.Rmd\"))\n  file_create(path(dir, \"vignettes\", \"test2.Rmd\"))\n\n  expect_equal(\n    as.character(package_vignettes(dir)$file_in),\n    \"vignettes/test2.Rmd\"\n  )\n})\n\ntest_that(\"check_bootstrap_version() allows 3, 4 (with warning), and 5\", {\n  pkg <- local_pkgdown_site()\n\n  expect_equal(check_bootstrap_version(3, pkg), 3)\n  expect_snapshot(expect_equal(check_bootstrap_version(4, pkg), 5))\n  expect_equal(check_bootstrap_version(5, pkg), 5)\n})\n\ntest_that(\"check_bootstrap_version() gives informative error otherwise\", {\n  pkg <- local_pkgdown_site()\n  expect_snapshot(check_bootstrap_version(1, pkg), error = TRUE)\n})\n\ntest_that(\"package_vignettes() moves vignettes/articles up one level\", {\n  dir <- withr::local_tempdir()\n  dir_create(path(dir, \"vignettes\", \"articles\"))\n  file_create(path(dir, \"vignettes\", \"articles\", \"test.Rmd\"))\n\n  pkg_vig <- package_vignettes(dir)\n  expect_equal(as.character(pkg_vig$file_out), \"articles/test.html\")\n  expect_equal(pkg_vig$depth, 1L)\n})\n\ntest_that(\"package_vignettes() detects conflicts in final article paths\", {\n  dir <- withr::local_tempdir()\n  dir_create(path(dir, \"vignettes\", \"articles\"))\n  file_create(path(dir, \"vignettes\", \"test.Rmd\"))\n  file_create(path(dir, \"vignettes\", \"articles\", \"test.Rmd\"))\n\n  expect_snapshot(package_vignettes(dir), error = TRUE)\n})\n\ntest_that(\"package_vignettes() sorts articles alphabetically by file name\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(pkg, \"vignettes/a.Rmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/b.Rmd\")\n  pkg <- pkg_add_file(pkg, \"vignettes/c.Rmd\")\n\n  expect_equal(\n    path_file(pkg$vignettes$file_out),\n    c(\"a.html\", \"b.html\", \"c.html\")\n  )\n})\n\ntest_that(\"override works correctly for as_pkgdown\", {\n  pkg1 <- local_pkgdown_site(meta = list(figures = list(dev = \"jpeg\")))\n  pkg2 <- as_pkgdown(pkg1, override = list(figures = list(dev = \"png\")))\n  expect_equal(pkg2$meta$figures$dev, \"png\")\n})\n# titles ------------------------------------------------------------------\n\ntest_that(\"multiline titles are collapsed\", {\n  rd <- rd_text(\n    \"\\\\title{\n    x\n  }\",\n    fragment = FALSE\n  )\n\n  expect_equal(extract_title(rd), \"x\")\n})\n\ntest_that(\"titles can contain other markup\", {\n  rd <- rd_text(\"\\\\title{\\\\strong{x}}\", fragment = FALSE)\n  expect_equal(extract_title(rd), \"<strong>x</strong>\")\n})\n\ntest_that(\"titles don't get autolinked code\", {\n  rd <- rd_text(\"\\\\title{\\\\code{foo()}}\", fragment = FALSE)\n  expect_equal(extract_title(rd), \"<code>foo()</code>\")\n})\n\ntest_that(\"read_meta() errors gracefully if _pkgdown.yml failed to parse\", {\n  pkg <- local_pkgdown_site()\n  pkg <- pkg_add_file(\n    pkg,\n    \"_pkgdown.yml\",\n    c(\n      \"url: https://pkgdown.r-lib.org\",\n      \"  title: Build websites for R packages\"\n    )\n  )\n  expect_snapshot(\n    as_pkgdown(pkg$src_path),\n    error = TRUE,\n    transform = function(x) gsub(pkg$src_path, \"<src>\", x, fixed = TRUE)\n  )\n})\n\n# lifecycle ---------------------------------------------------------------\n\ntest_that(\"can extract lifecycle badges from description\", {\n  rd_desc <- rd_text(\n    paste0(\"\\\\description{\", lifecycle::badge(\"deprecated\"), \"}\"),\n    fragment = FALSE\n  )\n  rd_param <- rd_text(\n    paste0(\"\\\\arguments{\\\\item{pkg}{\", lifecycle::badge(\"deprecated\"), \"}}\"),\n    fragment = FALSE\n  )\n\n  expect_equal(extract_lifecycle(rd_desc), \"deprecated\")\n  expect_equal(extract_lifecycle(rd_param), NULL)\n})\n\ntest_that(\"malformed figures fail gracefully\", {\n  rd_lifecycle <- function(x) extract_lifecycle(rd_text(x))\n\n  expect_null(rd_lifecycle(\"{\\\\figure{deprecated.svg}}\"))\n  expect_null(rd_lifecycle(\"{\\\\figure{}}\"))\n})\n\n# language ---------------------------------------------------------------------\n\ntest_that(\"as_pkgdown sets language\", {\n  # Default\n  pkg <- as_pkgdown(test_path(\"assets/reference\"))\n  expect_equal(\n    pkg$lang,\n    \"en\"\n  )\n  # Single language specified in DESCRIPTION\n  pkg <- as_pkgdown(test_path(\"assets/reference-language/one\"))\n  expect_equal(\n    pkg$lang,\n    \"fr\"\n  )\n  # Two languages specified in DESCRIPTION\n  pkg <- as_pkgdown(test_path(\"assets/reference-language/two\"))\n  expect_equal(\n    pkg$lang,\n    \"en-US\"\n  )\n  # Language specified in _pkgdown.yml or override.\n  pkg <- as_pkgdown(\n    test_path(\"assets/reference-language/two\"),\n    override = list(lang = \"en-GB\")\n  )\n  expect_equal(\n    pkg$lang,\n    \"en-GB\"\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-pkgdown_print.R",
    "content": "test_that(\"widgets and browseable html are kept as is\", {\n  widget <- htmlwidgets::createWidget(\"test\", list())\n  expect_s3_class(pkgdown_print(widget), \"htmlwidget\")\n\n  html <- htmltools::browsable(htmltools::div(\"foo\"))\n  expect_s3_class(pkgdown_print(html), \"shiny.tag\")\n})\n\ntest_that(\"htmlwidgets get sized\", {\n  local_context_eval(list(fig.width = 7, dpi = 100, fig.asp = 1))\n\n  widget <- htmlwidgets::createWidget(\"test\", list())\n  value <- pkgdown_print(widget)\n\n  expect_equal(value$width, 700)\n  expect_equal(value$height, 700)\n})\n\ntest_that(\"respect htmlwidgets width\", {\n  local_context_eval(list(fig.width = 7, dpi = 100, fig.asp = 1))\n\n  widget <- htmlwidgets::createWidget(\"test\", list(), width = \"100px\")\n  value <- pkgdown_print(widget)\n\n  expect_equal(value$width, \"100px\")\n})\n"
  },
  {
    "path": "tests/testthat/test-preview.R",
    "content": "local_preview_clean <- function(env = caller_env()) {\n  the$server <- NULL\n  withr::defer(the$server <- NULL, envir = env)\n}\n\ntest_that(\"checks its inputs\", {\n  pkg <- local_pkgdown_site()\n\n  expect_snapshot(error = TRUE, {\n    preview_site(pkg, path = 1)\n    preview_site(pkg, path = \"foo\")\n    preview_site(pkg, preview = 1)\n  })\n})\n\ntest_that(\"local_path adds index.html if needed\", {\n  pkg <- local_pkgdown_site()\n  file_create(path(pkg$dst_path, \"test.html\"))\n  expect_equal(\n    local_path(pkg, \"test.html\"),\n    path(pkg$dst_path, \"test.html\")\n  )\n\n  dir_create(path(pkg$dst_path, \"reference\"))\n  expect_equal(\n    local_path(pkg, \"reference\"),\n    path(pkg$dst_path, \"reference\")\n  )\n})\n\ntest_that(\"preview starts new server when none exists\", {\n  pkg <- local_pkgdown_site()\n  local_preview_clean()\n  urls <- character()\n  withr::local_options(browser = function(url) urls <<- c(urls, url))\n\n  preview_site(pkg, preview = TRUE)\n\n  expect_false(is.null(the$server))\n  expect_equal(the$server_root, pkg$dst_path)\n  expect_length(urls, 1)\n  expect_equal(urls[[1]], paste0(the$server$url, \"/\"))\n})\n\ntest_that(\"preview reuses server for same root\", {\n  pkg <- local_pkgdown_site()\n  local_preview_clean()\n  urls <- character()\n  withr::local_options(browser = function(url) urls <<- c(urls, url))\n\n  preview_site(pkg, preview = TRUE)\n  server1 <- the$server\n\n  file_create(path(pkg$dst_path, \"test.html\"))\n  preview_site(pkg, path = \"test.html\", preview = TRUE)\n\n  expect_identical(the$server, server1)\n  expect_length(urls, 2)\n  expect_equal(urls[[2]], paste0(server1$url, \"/test.html\"))\n})\n\ntest_that(\"preview starts new server for different root\", {\n  pkg1 <- local_pkgdown_site()\n  pkg2 <- local_pkgdown_site()\n  local_preview_clean()\n  urls <- character()\n  withr::local_options(browser = function(url) urls <<- c(urls, url))\n\n  preview_site(pkg1, preview = TRUE)\n  server1 <- the$server\n\n  preview_site(pkg2, preview = TRUE)\n\n  expect_false(identical(the$server, server1))\n  expect_equal(the$server_root, pkg2$dst_path)\n})\n\ntest_that(\"stop_preview stops server\", {\n  pkg <- local_pkgdown_site()\n  local_preview_clean()\n  withr::local_options(browser = function(url) {})\n\n  preview_site(pkg, preview = TRUE)\n  expect_false(is.null(the$server))\n\n  stop_preview()\n  expect_null(the$server)\n  expect_null(the$server_root)\n})\n\ntest_that(\"preview constructs correct URLs for sub-paths\", {\n  pkg <- local_pkgdown_site()\n  local_preview_clean()\n  urls <- character()\n  withr::local_options(browser = function(url) urls <<- c(urls, url))\n\n  dir_create(path(pkg$dst_path, \"reference\"))\n  file_create(path(pkg$dst_path, \"reference\", \"foo.html\"))\n\n  preview_site(pkg, preview = TRUE)\n  base_url <- the$server$url\n\n  preview_site(pkg, path = \"reference\", preview = TRUE)\n  expect_equal(urls[[2]], paste0(base_url, \"/reference\"))\n\n  preview_site(pkg, path = \"reference/foo.html\", preview = TRUE)\n  expect_equal(urls[[3]], paste0(base_url, \"/reference/foo.html\"))\n})\n"
  },
  {
    "path": "tests/testthat/test-rd-data.R",
    "content": "# Value blocks ------------------------------------------------------------\n\ntest_that(\"leading text parsed as paragraph\", {\n  # fmt: skip\n  expected <- c(\n    \"<p>text</p>\",\n    \"<dl>\", \"<dt>x</dt>\", \"<dd><p>y</p></dd>\", \"</dl>\"\n  )\n  expect_equal(value2html(\"\\ntext\\n\\\\item{x}{y}\"), expected)\n  expect_equal(value2html(\"text\\\\item{x}{y}\"), expected)\n})\n\ntest_that(\"leading text is optional\", {\n  expect_equal(\n    value2html(\"\\\\item{x}{y}\"),\n    c(\"<dl>\", \"<dt>x</dt>\", \"<dd><p>y</p></dd>\", \"</dl>\")\n  )\n})\n\ntest_that(\"can process empty string\", {\n  expect_equal(value2html(\"\"), character())\n})\n\ntest_that(\"leading text is optional\", {\n  expect_equal(value2html(\"text\"), \"<p>text</p>\")\n})\n\ntest_that(\"items are optional\", {\n  value <- rd_text(\"\\\\value{text}\", fragment = FALSE)\n  expect_equal(as_data(value[[1]])$contents, \"<p>text</p>\")\n})\n\n\ntest_that(\"whitespace between items doesn't affect grouping\", {\n  expect_equal(\n    value2html(\"\\\\item{a}{b}\\n\\n\\\\item{c}{d}\\n\\n\\\\item{e}{f}\"),\n    # fmt: skip\n    c(\n      \"<dl>\",\n        \"<dt>a</dt>\", \"<dd><p>b</p></dd>\", \"\", \"\",\n        \"<dt>c</dt>\", \"<dd><p>d</p></dd>\", \"\", \"\",\n        \"<dt>e</dt>\", \"<dd><p>f</p></dd>\",\n      \"</dl>\"\n    )\n  )\n})\n\ntest_that(\"leading whitespace doesn't break items\", {\n  expect_equal(\n    value2html(\"\\n\\\\item{a}{b}\\n\\n\\\\item{c}{d}\\n\\n\\\\item{e}{f}\"),\n    # fmt: skip\n    c(\n      \"<dl>\",\n        \"<dt>a</dt>\", \"<dd><p>b</p></dd>\", \"\", \"\",\n        \"<dt>c</dt>\", \"<dd><p>d</p></dd>\", \"\", \"\",\n        \"<dt>e</dt>\", \"<dd><p>f</p></dd>\",\n      \"</dl>\"\n    )\n  )\n})\n\ntest_that(\"whitespace between text is not preserved\", {\n  expect_equal(\n    value2html(\"a\\n\\nb\\n\\nc\"),\n    c(\"<p>a</p>\", \"<p>b</p>\", \"<p>c</p>\")\n  )\n})\n\ntest_that(\"can have multiple interleaved blocks\", {\n  expect_equal(\n    value2html(\"text1\\\\item{a}{b}\\\\item{c}{d}text2\\\\item{e}{f}\"),\n    # fmt: skip\n    c(\n      \"<p>text1</p>\",\n      \"<dl>\",\n        \"<dt>a</dt>\", \"<dd><p>b</p></dd>\",\n        \"<dt>c</dt>\", \"<dd><p>d</p></dd>\",\n      \"</dl>\",\n      \"<p>text2</p>\",\n      \"<dl>\", \"<dt>e</dt>\", \"<dd><p>f</p></dd>\", \"</dl>\"\n    )\n  )\n})\n\ntest_that(\"other tags don't affect breaking (#2371)\", {\n  expect_equal(\n    value2html(\"1\\\\code{xxx}\\n2\\n3\"),\n    c(\"<p>1<code>xxx</code>\", \"2\", \"3</p>\")\n  )\n  # additionally teading whitespace\n  expect_equal(\n    value2html(\"1\\\\code{xxx}\\n  2\\n  3\"),\n    c(\"<p>1<code>xxx</code>\", \"2\", \"3</p>\")\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-rd-example.R",
    "content": "# run_examples() -----------------------------------------------------------\n\ntest_that(\"warns if unparseable\", {\n  expect_warning(\n    run_examples(\"1 + \\\\dontrun{2 + }\"),\n    \"Failed to parse\"\n  )\n})\n\n# as_example() ------------------------------------------------------------\n\ntest_that(\"dontrun{} wrapped in if(FALSE)\", {\n  expect_equal(rd2ex(\"\\\\dontrun{1}\"), \"if (FALSE) 1 # \\\\dontrun{}\")\n  expect_equal(\n    rd2ex(\"\\\\dontrun{\\n  1\\n}\"),\n    c(\"if (FALSE) { # \\\\dontrun{\", \"  1\", \"} # }\")\n  )\n\n  # unless run_dont_run is true\n  expect_equal(rd2ex(\"\\\\dontrun{1}\", run_dont_run = TRUE), \"1\")\n  expect_equal(\n    rd2ex(\"\\\\dontrun{\\n  1\\n}\", run_dont_run = TRUE),\n    c(\"# \\\\dontrun{\", \"  1\", \"# }\")\n  )\n})\n\ntest_that(\"block donttest{} gets a comment to preserve spacing\", {\n  expect_equal(rd2ex(\"\\\\donttest{1}\"), \"1\")\n  expect_equal(\n    rd2ex(\"\\\\donttest{\\n  1\\n}\"),\n    c(\"# \\\\donttest{\", \"  1\", \"# }\")\n  )\n})\n\ntest_that(\"dontshow{} becomes DONTSHOW\", {\n  expect_equal(rd2ex(\"\\\\dontshow{1}\"), \"DONTSHOW({1})\")\n  expect_equal(rd2ex(\"\\\\dontshow{\\n  1\\n}\"), c(\"DONTSHOW({\", \"  1\", \"})\"))\n})\n\ntest_that(\"testonly{} becomes TESTONLY\", {\n  expect_equal(rd2ex(\"\\\\testonly{1}\"), \"TESTONLY({1})\")\n  expect_equal(rd2ex(\"\\\\testonly{\\n  1\\n}\"), c(\"TESTONLY({\", \"  1\", \"})\"))\n})\n\ntest_that(\"handles nested tags\", {\n  expect_equal(\n    rd2ex(\"if(TRUE {\\n  \\\\dontrun{\\n    1 + 2\\n  }\\n}\"),\n    c(\n      \"if(TRUE {\",\n      \"  if (FALSE) { # \\\\dontrun{\",\n      \"    1 + 2\",\n      \"  } # }\",\n      \"}\"\n    )\n  )\n})\n\ntest_that(\"translate dots and ldots to ...\", {\n  expect_equal(rd2ex(\"\\\\ldots\"), \"...\")\n  expect_equal(rd2ex(\"\\\\dots\"), \"...\")\n})\n\ntest_that(\"ignores out\", {\n  expect_equal(rd2ex(\"\\\\out{1 + 2}\"), \"1 + 2\")\n})\n\ntest_that(\"extracts conditions from if\", {\n  expect_equal(rd2ex(\"\\\\if{html}{1 + 2}\"), \"1 + 2\")\n  expect_equal(rd2ex(\"\\\\if{latex}{1 + 2}\"), \"\")\n  expect_equal(rd2ex(\"\\\\ifelse{html}{1 + 2}{3 + 4}\"), \"1 + 2\")\n  expect_equal(rd2ex(\"\\\\ifelse{latex}{1 + 2}{3 + 4}\"), \"3 + 4\")\n})\n\ntest_that(\"@examplesIf\", {\n  rd <- paste0(\n    \"\\\\dontshow{if (1 == 0) (if (getRversion() >= \\\"3.4\\\") withAutoprint else force)(\\\\{ # examplesIf}\\n\",\n    \"answer <- 43\\n\",\n    \"\\\\dontshow{\\\\}) # examplesIf}\"\n  )\n  exp <- c(\n    \"if (FALSE) { # 1 == 0\",\n    \"answer <- 43\",\n    \"}\"\n  )\n  expect_warning(\n    expect_equal(rd2ex(rd), exp),\n    \"@examplesIf condition\"\n  )\n\n  rd2 <- paste0(\n    \"\\\\dontshow{if (TRUE) (if (getRversion() >= \\\"3.4\\\") withAutoprint else force)(\\\\{ # examplesIf}\\n\",\n    \"answer <- 43\\n\",\n    \"\\\\dontshow{\\\\}) # examplesIf}\"\n  )\n  exp2 <- c(\n    \"answer <- 43\"\n  )\n  expect_equal(rd2ex(rd2), exp2)\n\n  cnd <- paste0(strrep(\"TRUE && \", 100), \"FALSE\")\n  rd3 <- paste0(\n    \"\\\\dontshow{if (\",\n    cnd,\n    \") (if (getRversion() >= \\\"3.4\\\") withAutoprint else force)(\\\\{ # examplesIf}\\n\",\n    \"answer <- 43\\n\",\n    \"\\\\dontshow{\\\\}) # examplesIf}\"\n  )\n  exp3 <- c(\n    paste0(\"if (FALSE) { # \", cnd),\n    \"answer <- 43\",\n    \"}\"\n  )\n  expect_snapshot(\n    expect_equal(strtrim(rd2ex(rd3), 40), strtrim(exp3, 40))\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-rd-html.R",
    "content": "test_that(\"special characters are escaped\", {\n  out <- rd2html(\"a & b\")\n  expect_equal(out, \"a &amp; b\")\n})\n\ntest_that(\"converts Rd unicode shortcuts\", {\n  expect_snapshot(rd2html(\"``a -- b --- c''\"))\n})\n\ntest_that(\"simple tags translated to known good values\", {\n  # Simple insertions\n  expect_equal(rd2html(\"\\\\ldots\"), \"...\")\n  expect_equal(rd2html(\"\\\\dots\"), \"...\")\n  expect_equal(rd2html(\"\\\\R\"), \"<span style=\\\"R\\\">R</span>\")\n  expect_equal(rd2html(\"\\\\cr\"), \"<br>\")\n\n  \"Macros\"\n  expect_equal(rd2html(\"\\\\newcommand{\\\\f}{'f'} \\\\f{}\"), \"'f'\")\n  expect_equal(rd2html(\"\\\\renewcommand{\\\\f}{'f'} \\\\f{}\"), \"'f'\")\n})\n\ntest_that(\"comments converted to html\", {\n  expect_equal(rd2html(\"a\\n%b\\nc\"), c(\"a\", \"<!-- %b -->\", \"c\"))\n})\n\ntest_that(\"simple wrappers work as expected\", {\n  expect_equal(rd2html(\"\\\\strong{x}\"), \"<strong>x</strong>\")\n  expect_equal(rd2html(\"\\\\strong{\\\\emph{x}}\"), \"<strong><em>x</em></strong>\")\n})\n\ntest_that(\"subsection generates h3\", {\n  expect_snapshot(cli::cat_line(rd2html(\"\\\\subsection{A}{B}\")))\n})\n\ntest_that(\"subsection generates h3\", {\n  expect_snapshot(cli::cat_line(rd2html(\n    \"\\\\subsection{A}{\n    p1\n\n    p2\n  }\"\n  )))\n})\n\ntest_that(\"subsection generates generated anchor\", {\n  text <- c(\"<body>\", rd2html(\"\\\\subsection{A}{B}\"), \"</body>\")\n  html <- xml2::read_xml(paste0(text, collapse = \"\\n\"))\n  tweak_anchors(html)\n\n  expect_equal(xpath_attr(html, \".//h3\", \"id\"), \"a\")\n  expect_equal(xpath_attr(html, \".//a\", \"href\"), \"#a\")\n})\n\ntest_that(\"nested subsection generates h4\", {\n  expect_snapshot(cli::cat_line(rd2html(\n    \"\\\\subsection{H3}{\\\\subsection{H4}{}}\"\n  )))\n})\n\ntest_that(\"if generates html\", {\n  expect_equal(rd2html(\"\\\\if{html}{\\\\bold{a}}\"), \"<b>a</b>\")\n  expect_equal(rd2html(\"\\\\if{latex}{\\\\bold{a}}\"), character())\n})\n\ntest_that(\"ifelse generates html\", {\n  expect_equal(rd2html(\"\\\\ifelse{html}{\\\\bold{a}}{x}\"), \"<b>a</b>\")\n  expect_equal(rd2html(\"\\\\ifelse{latex}{x}{\\\\bold{a}}\"), \"<b>a</b>\")\n})\n\ntest_that(\"out is for raw html\", {\n  expect_equal(rd2html(\"\\\\out{<hr />}\"), \"<hr />\")\n})\n\ntest_that(\"support platform specific code\", {\n  os_specific <- function(command, os, output) {\n    rd2html(paste0(\n      \"#\",\n      command,\n      \" \",\n      os,\n      \"\\n\",\n      output,\n      \"\\n\",\n      \"#endif\"\n    ))\n  }\n\n  expect_equal(os_specific(\"ifdef\", \"windows\", \"X\"), character())\n  expect_equal(os_specific(\"ifdef\", \"unix\", \"X\"), \"X\")\n  expect_equal(os_specific(\"ifndef\", \"windows\", \"X\"), \"X\")\n  expect_equal(os_specific(\"ifndef\", \"unix\", \"X\"), character())\n})\n\n\n# tables ------------------------------------------------------------------\n\ntest_that(\"tabular generates complete table html\", {\n  table <- \"\\\\tabular{ll}{a \\\\tab b \\\\cr}\"\n  expectation <- c(\n    \"<table class='table'>\",\n    \"<tr><td>a</td><td>b</td></tr>\",\n    \"</table>\"\n  )\n  expect_equal(rd2html(table), expectation)\n})\n\ntest_that(\"internal \\\\crs are stripped\", {\n  table <- \"\\\\tabular{l}{a \\\\cr b \\\\cr c \\\\cr}\"\n  expectation <- c(\n    \"<table class='table'>\",\n    \"<tr><td>a</td></tr>\",\n    \"<tr><td>b</td></tr>\",\n    \"<tr><td>c</td></tr>\",\n    \"</table>\"\n  )\n  expect_equal(rd2html(table), expectation)\n})\n\ntest_that(\"can convert single row\", {\n  expect_equal(\n    rd2html(\"\\\\tabular{lll}{A \\\\tab B \\\\tab C \\\\cr}\")[[2]],\n    \"<tr><td>A</td><td>B</td><td>C</td></tr>\"\n  )\n})\n\n\ntest_that(\"don't need internal whitespace\", {\n  expect_equal(\n    rd2html(\"\\\\tabular{lll}{\\\\tab\\\\tab C\\\\cr}\")[[2]],\n    \"<tr><td></td><td></td><td>C</td></tr>\"\n  )\n  expect_equal(\n    rd2html(\"\\\\tabular{lll}{\\\\tab B \\\\tab\\\\cr}\")[[2]],\n    \"<tr><td></td><td>B</td><td></td></tr>\"\n  )\n  expect_equal(\n    rd2html(\"\\\\tabular{lll}{A\\\\tab\\\\tab\\\\cr}\")[[2]],\n    \"<tr><td>A</td><td></td><td></td></tr>\"\n  )\n\n  expect_equal(\n    rd2html(\"\\\\tabular{lll}{\\\\tab\\\\tab\\\\cr}\")[[2]],\n    \"<tr><td></td><td></td><td></td></tr>\"\n  )\n})\n\ntest_that(\"can skip trailing \\\\cr\", {\n  expect_equal(\n    rd2html(\"\\\\tabular{lll}{A \\\\tab B \\\\tab C}\")[[2]],\n    \"<tr><td>A</td><td>B</td><td>C</td></tr>\"\n  )\n})\n\ntest_that(\"code blocks in tables render (#978)\", {\n  expect_equal(\n    rd2html('\\\\tabular{ll}{a \\\\tab \\\\code{b} \\\\cr foo \\\\tab bar}')[[2]],\n    \"<tr><td>a</td><td><code>b</code></td></tr>\"\n  )\n})\n\ntest_that(\"tables with tailing \\n (#978)\", {\n  expect_equal(\n    rd2html(\n      '\n      \\\\tabular{ll}{\n        a   \\\\tab     \\\\cr\n        foo \\\\tab bar\n      }\n    '\n    )[[2]],\n    \"<tr><td>a</td><td></td></tr>\"\n  )\n})\n\n# sexpr  ------------------------------------------------------------------\n\ntest_that(\"code inside Sexpr is evaluated\", {\n  local_context_eval()\n  expect_equal(rd2html(\"\\\\Sexpr{1 + 2}\"), \"3\")\n})\n\ntest_that(\"can control \\\\Sexpr output\", {\n  local_context_eval()\n  expect_equal(rd2html(\"\\\\Sexpr[results=hide]{1}\"), character())\n  expect_equal(rd2html(\"\\\\Sexpr[results=text]{1}\"), \"1\")\n  expect_equal(rd2html(\"\\\\Sexpr[results=rd]{\\\"\\\\\\\\\\\\emph{x}\\\"}\"), \"<em>x</em>\")\n  expect_equal(\n    rd2html(\"\\\\Sexpr[results=verbatim]{1 + 2}\"),\n    c(\"<pre>\", \"[1] 3\", \"</pre>\")\n  )\n  expect_equal(\n    rd2html(\"\\\\Sexpr[results=verbatim]{cat(42)}\"),\n    c(\"<pre>\", \"42\", \"</pre>\")\n  )\n  expect_equal(\n    rd2html(\"\\\\Sexpr[results=verbatim]{cat('42!\\n'); 3}\"),\n    c(\"<pre>\", \"42!\", \"[1] 3\", \"</pre>\")\n  )\n})\n\ntest_that(\"Sexpr can contain multiple expressions\", {\n  local_context_eval()\n  expect_equal(rd2html(\"\\\\Sexpr{a <- 1; a}\"), \"1\")\n})\n\ntest_that(\"Sexprs with multiple args are parsed\", {\n  local_context_eval()\n  expect_equal(rd2html(\"\\\\Sexpr[results=hide,stage=build]{1}\"), character())\n})\n\ntest_that(\"Sexprs in file share environment\", {\n  local_context_eval()\n  expect_equal(rd2html(\"\\\\Sexpr{x <- 1}\\\\Sexpr{x}\"), c(\"1\", \"1\"))\n\n  local_context_eval()\n  expect_snapshot(rd2html(\"\\\\Sexpr{x}\"), error = TRUE)\n})\n\ntest_that(\"Sexprs run from package root\", {\n  local_context_eval(src_path = test_path(\"assets/reference\"))\n\n  # \\packageTitle is built in macro that uses DESCRIPTION\n  expect_equal(\n    rd2html(\"\\\\packageTitle{testpackage}\"),\n    \"A test package\"\n  )\n})\n\n# links -------------------------------------------------------------------\n\ntest_that(\"simple links generate <a>\", {\n  expect_equal(\n    rd2html(\"\\\\href{http://bar.com}{BAR}\"),\n    \"<a href='http://bar.com'>BAR</a>\"\n  )\n  expect_equal(\n    rd2html(\"\\\\email{foo@bar.com}\"),\n    \"<a href='mailto:foo@bar.com'>foo@bar.com</a>\"\n  )\n  expect_equal(\n    rd2html(\"\\\\url{http://bar.com}\"),\n    \"<a href='http://bar.com'>http://bar.com</a>\"\n  )\n})\n\ntest_that(\"can convert cross links to online documentation url\", {\n  expect_equal(\n    rd2html(\"\\\\link[base]{library}\"),\n    a(\"library\", href = \"https://rdrr.io/r/base/library.html\")\n  )\n})\n\ntest_that(\"can convert cross links to the same package (#242)\", {\n  withr::local_options(list(\n    \"downlit.package\" = \"test\",\n    \"downlit.topic_index\" = c(x = \"y\", z = \"z\"),\n    \"downlit.rdname\" = \"z\"\n  ))\n\n  expect_equal(rd2html(\"\\\\link{x}\"), \"<a href='y.html'>x</a>\")\n  expect_equal(rd2html(\"\\\\link[test]{x}\"), \"<a href='y.html'>x</a>\")\n  # but no self links\n  expect_equal(rd2html(\"\\\\link[test]{z}\"), \"z\")\n})\n\ntest_that(\"can parse local links with topic!=label\", {\n  withr::local_options(list(\n    \"downlit.topic_index\" = c(x = \"y\")\n  ))\n  expect_equal(rd2html(\"\\\\link[=x]{z}\"), \"<a href='y.html'>z</a>\")\n})\n\ntest_that(\"functions in other packages generates link to rdrr.io\", {\n  withr::local_options(list(\n    \"downlit.package\" = \"test\",\n    \"downlit.topic_index\" = c(x = \"y\", z = \"z\")\n  ))\n\n  expect_equal(\n    rd2html(\"\\\\link[stats:acf]{xyz}\"),\n    a(\"xyz\", downlit::href_topic(\"acf\", \"stats\"))\n  )\n\n  # Unless it's the current package\n  expect_equal(rd2html(\"\\\\link[test:x]{xyz}\"), \"<a href='y.html'>xyz</a>\")\n})\n\ntest_that(\"link to non-existing functions return label\", {\n  expect_equal(rd2html(\"\\\\link[xyzxyz:xyzxyz]{abc}\"), \"abc\")\n  expect_equal(rd2html(\"\\\\link[base:xyzxyz]{abc}\"), \"abc\")\n})\n\ntest_that(\"code blocks autolinked to vignettes\", {\n  withr::local_options(list(\n    \"downlit.package\" = \"test\",\n    \"downlit.article_index\" = c(\"abc\" = \"abc.html\")\n  ))\n\n  expect_equal(\n    rd2html(\"\\\\code{vignette('abc')}\"),\n    \"<code><a href='abc.html'>vignette('abc')</a></code>\"\n  )\n})\n\ntest_that(\"link to non-existing functions return label\", {\n  withr::local_options(list(\n    \"downlit.package\" = \"test\",\n    \"downlit.topic_index\" = c(\"TEST-class\" = \"test\")\n  ))\n  expect_equal(rd2html(\"\\\\linkS4class{TEST}\"), \"<a href='test.html'>TEST</a>\")\n})\n\ntest_that(\"bad specs throw errors\", {\n  expect_snapshot(error = TRUE, {\n    rd2html(\"\\\\url{}\")\n    rd2html(\"\\\\url{a\\nb}\")\n    rd2html(\"\\\\email{}\")\n    rd2html(\"\\\\linkS4class{}\")\n  })\n})\n\ntest_that(\"no autolink in href\", {\n  expect_equal(\n    rd2html(\"\\\\href{https://example.com}{\\\\code{download.file()}}\"),\n    \"<a href='https://example.com'><code>download.file()</code></a>\"\n  )\n})\n\n# Paragraphs --------------------------------------------------------------\n\ntest_that(\"empty input gives empty output\", {\n  expect_equal(flatten_para(character()), character())\n})\n\ntest_that(\"empty lines break paragraphs\", {\n  expect_equal(\n    flatten_para(rd_text(\"a\\nb\\n\\nc\")),\n    \"<p>a\\nb</p>\\n<p>c</p>\"\n  )\n})\n\ntest_that(\"indented empty lines break paragraphs\", {\n  expect_equal(\n    flatten_para(rd_text(\"a\\nb\\n  \\nc\")),\n    \"<p>a\\nb</p>  \\n<p>c</p>\"\n  )\n})\n\ntest_that(\"block tags break paragraphs\", {\n  out <- flatten_para(rd_text(\"a\\n\\\\itemize{\\\\item b}\\nc\"))\n  expect_equal(out, \"<p>a</p><ul>\\n<li><p>b</p></li>\\n</ul><p>c</p>\")\n})\n\ntest_that(\"inline tags + empty line breaks\", {\n  out <- flatten_para(rd_text(\"a\\n\\n\\\\code{b}\"))\n  expect_equal(out, \"<p>a</p>\\n<p><code>b</code></p>\")\n})\n\ntest_that(\"single item can have multiple paragraphs\", {\n  out <- flatten_para(rd_text(\"\\\\itemize{\\\\item a\\n\\nb}\"))\n  expect_equal(out, \"<ul>\\n<li><p>a</p>\\n<p>b</p></li>\\n</ul>\\n\")\n})\n\ntest_that(\"nl after tag doesn't trigger paragraphs\", {\n  out <- flatten_para(rd_text(\"One \\\\code{}\\nTwo\"))\n  expect_equal(out, \"<p>One <code></code>\\nTwo</p>\")\n})\n\ntest_that(\"cr generates line break\", {\n  out <- flatten_para(rd_text(\"a \\\\cr b\"))\n  expect_equal(out, \"<p>a <br> b</p>\")\n})\n\n\n# lists -------------------------------------------------------------------\n\ntest_that(\"simple lists work\", {\n  expect_equal(\n    rd2html(\"\\\\itemize{\\\\item a}\"),\n    c(\"<ul>\", \"<li><p>a</p></li>\", \"</ul>\")\n  )\n  expect_equal(\n    rd2html(\"\\\\enumerate{\\\\item a}\"),\n    c(\"<ol>\", \"<li><p>a</p></li>\", \"</ol>\")\n  )\n})\n\ntest_that(\"\\\\describe items can contain multiple paragraphs\", {\n  out <- rd2html(\n    \"\\\\describe{\n    \\\\item{Label 1}{Contents 1}\n    \\\\item{Label 2}{Contents 2}\n  }\"\n  )\n  expect_snapshot_output(cat(out, sep = \"\\n\"))\n})\n\ntest_that(\"can add ids to descriptions\", {\n  out <- rd2html(\n    \"\\\\describe{\n    \\\\item{abc}{Contents 1}\n    \\\\item{xyz}{Contents 2}\n  }\",\n    id_prefix = \"foo\"\n  )\n  expect_snapshot_output(cat(out, sep = \"\\n\"))\n})\n\ntest_that(\"\\\\describe items can contain multiple paragraphs\", {\n  out <- rd2html(\n    \"\\\\describe{\n    \\\\item{Label}{\n      Paragraph 1\n\n      Paragraph 2\n    }\n  }\"\n  )\n  expect_snapshot_output(cat(out, sep = \"\\n\"))\n})\n\ntest_that(\"nested item with whitespace parsed correctly\", {\n  out <- rd2html(\n    \"\n    \\\\describe{\n    \\\\item{Label}{\n\n      This text is indented in a way pkgdown doesn't like.\n  }}\"\n  )\n  expect_snapshot_output(cat(out, sep = \"\\n\"))\n})\n\n# Verbatim ----------------------------------------------------------------\n\ntest_that(\"preformatted blocks aren't double escaped\", {\n  out <- flatten_para(rd_text(\"\\\\preformatted{\\\\%>\\\\%}\"))\n  expect_equal(out, \"<pre><code>%&gt;%</code></pre>\\n\")\n})\n\ntest_that(\"newlines are preserved in preformatted blocks\", {\n  out <- flatten_para(rd_text(\"\\\\preformatted{^\\n\\nb\\n\\nc}\"))\n  expect_equal(out, \"<pre><code>^\\n\\nb\\n\\nc</code></pre>\\n\")\n})\n\ntest_that(\"spaces are preserved in preformatted blocks\", {\n  out <- flatten_para(rd_text(\"\\\\preformatted{^\\n\\n  b\\n\\n  c}\"))\n  expect_equal(out, \"<pre><code>^\\n\\n  b\\n\\n  c</code></pre>\\n\")\n})\n\n# Other -------------------------------------------------------------------\n\ntest_that(\"eqn\", {\n  out <- rd2html(\" \\\\eqn{\\\\alpha}{alpha}\")\n  expect_equal(out, \"\\\\(\\\\alpha\\\\)\")\n  out <- rd2html(\" \\\\eqn{x}\")\n  expect_equal(out, \"\\\\(x\\\\)\")\n})\n\ntest_that(\"deqn\", {\n  out <- rd2html(\" \\\\deqn{\\\\alpha}{alpha}\")\n  expect_equal(out, \"$$\\\\alpha$$\")\n  out <- rd2html(\" \\\\deqn{x}\")\n  expect_equal(out, \"$$x$$\")\n})\n\ntest_that(\"special\", {\n  out <- rd2html(\"\\\\special{( \\\\dots )}\")\n  expect_equal(out, \"( ... )\")\n})\n\n# figures -----------------------------------------------------------------\n\ntest_that(\"figures are converted to img\", {\n  expect_equal(rd2html(\"\\\\figure{a}\"), \"<img src='figures/a' alt='' />\")\n  expect_equal(rd2html(\"\\\\figure{a}{b}\"), \"<img src='figures/a' alt='b' />\")\n  expect_equal(\n    rd2html(\"\\\\figure{a}{options: height=1}\"),\n    \"<img src='figures/a' height=1 />\"\n  )\n})\n\ntest_that(\"figures with multilines alternative text can be parsed\", {\n  expect_equal(\n    rd2html(\n      \"\\\\figure{a}{blabla\n    blop}\"\n    ),\n    \"<img src='figures/a' alt='blabla blop' />\"\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-render.R",
    "content": "test_that(\"capture data_template()\", {\n  pkg <- local_pkgdown_site()\n  data <- data_template(pkg)\n  data$year <- \"<year>\"\n  data$footer$right <- gsub(\n    packageVersion(\"pkgdown\"),\n    \"{version}\",\n    data$footer$right,\n    fixed = TRUE\n  )\n  expect_snapshot_output(data)\n})\n\ntest_that(\"can include text in header, before body, and after body\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      template = list(\n        includes = list(\n          in_header = \"<test>in header</test>\",\n          before_body = \"<test>before body</test>\",\n          after_body = \"<test>after body</test>\"\n        )\n      )\n    )\n  )\n\n  expect_named(\n    data_template(pkg)$includes,\n    c(\"in_header\", \"before_body\", \"after_body\")\n  )\n\n  pkg$bs_version <- 3\n  html <- render_page_html(pkg, \"title-body\")\n  expect_equal(\n    xpath_text(html, \".//test\"),\n    c(\"in header\", \"before body\", \"after body\")\n  )\n\n  pkg$bs_version <- 5\n  suppressMessages(init_site(pkg))\n  html <- render_page_html(pkg, \"title-body\")\n  expect_equal(\n    xpath_text(html, \".//test\"),\n    c(\"in header\", \"before body\", \"after body\")\n  )\n})\n\ntest_that(\"check_opengraph validates inputs\", {\n  data_open_graph_ <- function(x) {\n    pkg <- local_pkgdown_site(meta = list(template = list(opengraph = x)))\n    data_open_graph(pkg)\n    invisible()\n  }\n\n  expect_snapshot(error = TRUE, {\n    data_open_graph_(list(foo = list()))\n    data_open_graph_(list(foo = list(), bar = list()))\n    data_open_graph_(list(twitter = 1))\n    data_open_graph_(list(twitter = list()))\n    data_open_graph_(list(image = 1))\n  })\n})\n"
  },
  {
    "path": "tests/testthat/test-repo.R",
    "content": "#  repo_auto_link ---------------------------------------------------------\n\ntest_that(\"authors are automatically linked\", {\n  pkg <- list(repo = repo_meta(user = \"TEST/\"))\n\n  # email addresses shouldn't get linked\n  expect_equal(repo_auto_link(pkg, \"x@y.com\"), \"x@y.com\")\n\n  # must have leading whitespace or open parens\n  expect_equal(repo_auto_link(pkg, \"@y\"), \"<a href='TEST/y'>@y</a>\")\n  expect_equal(repo_auto_link(pkg, \" @y\"), \" <a href='TEST/y'>@y</a>\")\n  expect_equal(repo_auto_link(pkg, \"(@y)\"), \"(<a href='TEST/y'>@y</a>)\")\n\n  expect_equal(\n    repo_auto_link(pkg, \"<p>@y some other text.</p>\"),\n    \"<p><a href='TEST/y'>@y</a> some other text.</p>\"\n  )\n})\n\ntest_that(\"issues are automatically linked\", {\n  pkg <- list(repo = repo_meta(issue = \"TEST/\"))\n  expect_equal(repo_auto_link(pkg, \"(#123\"), \"(<a href='TEST/123'>#123</a>\")\n  expect_equal(repo_auto_link(pkg, \"in #123\"), \"in <a href='TEST/123'>#123</a>\")\n  expect_equal(\n    repo_auto_link(pkg, \"<p>#123 some other text.</p>\"),\n    \"<p><a href='TEST/123'>#123</a> some other text.</p>\"\n  )\n  expect_equal(\n    repo_auto_link(pkg, \"<p><a href='TEST/123/'>#123</a></p>\"),\n    \"<p><a href='TEST/123/'>#123</a></p>\"\n  )\n})\n\ntest_that(\"already linked issues aren't re-linked\", {\n  pkg <- list(repo = repo_meta(issue = \"TEST/\"))\n  expect_equal(\n    repo_auto_link(pkg, \"<p><a href='NOT/ABC/'>#123</a></p>\"),\n    \"<p><a href='NOT/ABC/'>#123</a></p>\"\n  )\n})\n\ntest_that(\"URLs with hash (#) are preserved\", {\n  pkg <- list(repo = repo_meta(issue = \"TEST/\"))\n  expect_equal(\n    repo_auto_link(pkg, \"[example 5.4](https:/my.site#5-4-ad)\"),\n    \"[example 5.4](https:/my.site#5-4-ad)\"\n  )\n})\n\ntest_that(\"Jira issues are automatically linked\", {\n  pkg <- list(repo = repo_meta(issue = \"TEST/\"))\n  pkg$repo$jira_projects <- c(\"JIRA\", \"OTHER\")\n  expect_equal(\n    repo_auto_link(pkg, \"JIRA-123\"),\n    \"<a href='TEST/JIRA-123'>JIRA-123</a>\"\n  )\n  expect_equal(\n    repo_auto_link(pkg, \"OTHER-4321\"),\n    \"<a href='TEST/OTHER-4321'>OTHER-4321</a>\"\n  )\n  # but only the jira projects specified are caught\n  expect_equal(repo_auto_link(pkg, \"NOPE-123\"), \"NOPE-123\")\n})\n\n# repo_source -------------------------------------------------------------\n\ntest_that(\"repo_source() truncates automatically\", {\n  withr::local_envvar(GITHUB_HEAD_REF = \"HEAD\")\n  pkg <- list(repo = repo_meta_gh_like(\"https://github.com/r-lib/pkgdown\"))\n\n  expect_snapshot({\n    cat(repo_source(pkg, character()))\n    cat(repo_source(pkg, \"a\"))\n    cat(repo_source(pkg, letters[1:10]))\n  })\n})\n\ntest_that(\"repo_source() is robust to trailing slash\", {\n  pkg <- list(repo = repo_meta_gh_like(\"https://github.com/r-lib/pkgdown\"))\n\n  meta <- function(x) {\n    list(repo = list(url = list(source = x)))\n  }\n  source <- \"Source: <a href='http://example.com/a'><code>a</code></a>\"\n  expect_equal(repo_source(meta(\"http://example.com\"), \"a\"), source)\n  expect_equal(repo_source(meta(\"http://example.com/\"), \"a\"), source)\n})\n\ntest_that(\"repo_source() uses the branch setting in meta\", {\n  pkg <- local_pkgdown_site(\n    meta = list(repo = list(branch = \"main\")),\n    desc = list(URL = \"https://github.com/r-lib/pkgdown\")\n  )\n  expect_match(\n    repo_source(pkg, \"a\"),\n    \"https://github.com/r-lib/pkgdown/blob/main/a\"\n  )\n})\n\n# package_repo ------------------------------------------------------------\n\ntest_that(\"can find github from BugReports or URL\", {\n  withr::local_envvar(GITHUB_HEAD_REF = \"HEAD\")\n  expected <- repo_meta_gh_like(\"https://github.com/r-lib/pkgdown\")\n\n  pkg <- local_pkgdown_site(\n    desc = list(\n      URL = \"https://github.com/r-lib/pkgdown\"\n    )\n  )\n  expect_equal(package_repo(pkg), expected)\n\n  # BugReports beats URL\n  pkg <- local_pkgdown_site(\n    desc = list(\n      URL = \"https://github.com/r-lib/BLAHBLAH\",\n      BugReports = \"https://github.com/r-lib/pkgdown/issues\"\n    )\n  )\n  expect_equal(package_repo(pkg), expected)\n\n  # URL can be in any position\n  pkg <- local_pkgdown_site(\n    desc = list(\n      URL = \"https://pkgdown.r-lib.org, https://github.com/r-lib/pkgdown\"\n    )\n  )\n  expect_equal(package_repo(pkg), expected)\n})\n\ntest_that(\"can find gitlab url\", {\n  withr::local_envvar(GITHUB_HEAD_REF = \"HEAD\")\n  url <- \"https://gitlab.com/msberends/AMR\"\n  pkg <- local_pkgdown_site(desc = list(URL = url))\n  expect_equal(package_repo(pkg), repo_meta_gh_like(url))\n})\n\ntest_that(\"can find codeberg url\", {\n  withr::local_envvar(GITHUB_HEAD_REF = \"HEAD\")\n  url <- \"https://codeberg.org/msberends/AMR\"\n  pkg <- local_pkgdown_site(desc = list(URL = url))\n  expect_equal(package_repo(pkg), repo_meta_gh_like(url))\n})\n\ntest_that(\"uses GITHUB env vars if set\", {\n  withr::local_envvar(GITHUB_HEAD_REF = NA, GITHUB_REF_NAME = \"abc\")\n  expect_equal(\n    repo_meta_gh_like(\"https://github.com/r-lib/pkgdown\")$url$source,\n    \"https://github.com/r-lib/pkgdown/blob/abc/\"\n  )\n\n  withr::local_envvar(GITHUB_HEAD_REF = \"xyz\")\n  expect_equal(\n    repo_meta_gh_like(\"https://github.com/r-lib/pkgdown\")$url$source,\n    \"https://github.com/r-lib/pkgdown/blob/xyz/\"\n  )\n})\n\ntest_that(\"GitLab subgroups are properly parsed\", {\n  issue_url <- function(...) {\n    pkg <- local_pkgdown_site(desc = list(...))\n    pkg$repo$url$issue\n  }\n\n  base <- \"https://gitlab.com/salim_b/r/pkgs/pal\"\n  expected <- paste0(base, \"/-/issues/\")\n\n  expect_identical(issue_url(URL = base), expected)\n  expect_identical(issue_url(URL = paste0(base, \"/\")), expected)\n  expect_identical(issue_url(BugReports = paste0(base, \"/issues\")), expected)\n  expect_identical(issue_url(BugReports = paste0(base, \"/issues/\")), expected)\n  expect_identical(issue_url(BugReports = paste0(base, \"/-/issues\")), expected)\n  expect_identical(issue_url(BugReports = paste0(base, \"/-/issues/\")), expected)\n})\n\ntest_that(\"can find github enterprise url\", {\n  withr::local_envvar(GITHUB_HEAD_REF = \"HEAD\")\n\n  url <- \"https://github.acme.com/roadrunner/speed\"\n  pkg <- local_pkgdown_site(desc = list(BugReports = url))\n  expect_equal(package_repo(pkg), repo_meta_gh_like(url))\n})\n\ntest_that(\"meta overrides autodetection\", {\n  pkg <- local_pkgdown_site(\n    meta = list(repo = list(url = list(home = \"http://one.com\"))),\n    desc = list(URL = \"http://two.com\")\n  )\n\n  expect_equal(package_repo(pkg)$url$home, \"http://one.com\")\n})\n\ntest_that(\"returns NULL if no urls found\", {\n  pkg <- local_pkgdown_site(desc = list(URL = \"https://pkgdown.r-lib.org\"))\n  expect_null(package_repo(pkg))\n})\n\ntest_that(\"repo_type detects repo type\", {\n  repo_type2 <- function(url) {\n    repo_type(list(repo = list(url = list(home = url))))\n  }\n\n  expect_equal(repo_type2(\"https://github.com/r-lib/pkgdown\"), \"github\")\n  expect_equal(repo_type2(\"https://github.r-lib.com/pkgdown\"), \"github\")\n  expect_equal(repo_type2(\"https://gitlab.com/r-lib/pkgdown\"), \"gitlab\")\n  expect_equal(repo_type2(\"https://gitlab.r-lib.com/pkgdown\"), \"gitlab\")\n  expect_equal(repo_type2(\"https://codeberg.org/r-lib/pkgdown\"), \"codeberg\")\n  expect_equal(repo_type2(NULL), \"other\")\n})\n"
  },
  {
    "path": "tests/testthat/test-templates.R",
    "content": "test_that(\"template_candidates look for specific first\", {\n  expect_equal(\n    path_file(template_candidates(\"content\", \"article\")),\n    c(\"content-article.html\", \"content.html\")\n  )\n})\n\ntest_that(\"template_candidates look in template dir then pkgdown\", {\n  pkg_dir <- withr::local_tempdir()\n  template_dir <- withr::local_tempdir()\n\n  pkg <- list(\n    src_path = pkg_dir,\n    meta = list(template = list(path = template_dir)),\n    bs_version = 3\n  )\n\n  # ensure that templates_dir(pkg) returns the specific template path\n  expect_equal(templates_dir(pkg), path(template_dir))\n\n  paths <- template_candidates(\"content\", \"article\", pkg = pkg)\n  dirs <- unique(path_dir(paths))\n  expect_equal(\n    dirs,\n    c(\n      # search for candidates...\n      path(pkg_dir, \"pkgdown\", \"templates\"), # first in local templates\n      path(template_dir), # second in global template path\n      path_pkgdown(\"BS3\", \"templates\") # finally in pkgdown templates\n    )\n  )\n})\n\n\ntest_that(\"look for templates_dir in right places\", {\n  dir <- withr::local_tempdir()\n  pkg <- list(src_path = dir, meta = list(template = list()))\n\n  # Look in site templates\n  expect_equal(templates_dir(pkg), path(dir, \"pkgdown\", \"templates\"))\n\n  # Look in specified directory\n  pkg$meta$template$path <- path(withr::local_tempdir())\n  expect_equal(templates_dir(pkg), pkg$meta$template$path)\n})\n\ntest_that(\"find templates in local pkgdown first\", {\n  pkg <- test_path(\"assets\", \"templates-local\")\n\n  # local template used over default pkgdown template\n  expect_equal(\n    find_template(\"content\", \"article\", pkg = pkg),\n    path_abs(path(pkg, \"pkgdown\", \"templates\", \"content-article.html\"))\n  )\n\n  expect_equal(\n    find_template(\"footer\", \"article\", pkg = pkg),\n    path_abs(path(pkg, \"pkgdown\", \"templates\", \"footer-article.html\"))\n  )\n\n  # pkgdown template used (no local template)\n  expect_equal(\n    find_template(\"content\", \"tutorial\", pkg = pkg),\n    path_pkgdown(\"BS3\", \"templates\", \"content-tutorial.html\")\n  )\n\n  expect_equal(\n    find_template(\"footer\", \"ignored\", pkg = pkg),\n    path_pkgdown(\"BS3\", \"templates\", \"footer.html\")\n  )\n})\n\n\n# Expected contents -------------------------------------------------------\n\ntest_that(\"BS5 templates have main + aside\", {\n  names <- dir_ls(path_pkgdown(\"BS5\", \"templates\"), regexp = \"content-\")\n  names <- path_ext_remove(path_file(names))\n  names <- gsub(\"content-\", \"\", names)\n\n  templates <- lapply(\n    names,\n    read_template_html,\n    type = \"content\",\n    pkg = list(bs_version = 5)\n  )\n  for (i in seq_along(templates)) {\n    template <- templates[[i]]\n    name <- names[[i]]\n\n    expect_equal(xpath_length(template, \".//div/main\"), 1, info = name)\n    expect_equal(xpath_attr(template, \".//div/main\", \"id\"), \"main\", info = name)\n    expect_equal(xpath_length(template, \".//div/aside\"), 1, info = name)\n    expect_equal(\n      xpath_attr(template, \".//div/aside\", \"class\"),\n      \"col-md-3\",\n      info = name\n    )\n  }\n})\n\n# Bootstrap version resolution --------------------------------------------\ntest_that(\"Bootstrap version in template package under `template.bootstrap`\", {\n  path_template_package <- local_pkgdown_template_pkg(\n    meta = list(template = list(bootstrap = 5))\n  )\n\n  pkg <- local_pkgdown_site(\n    meta = list(template = list(package = \"templatepackage\"))\n  )\n\n  expect_equal(pkg$bs_version, 5)\n})\n\ntest_that(\"Bootstrap version in template package under `template.bslib.version`\", {\n  path_template_package <- local_pkgdown_template_pkg(\n    meta = list(template = list(bslib = list(version = 5)))\n  )\n\n  pkg <- local_pkgdown_site(\n    meta = list(template = list(package = \"templatepackage\"))\n  )\n\n  expect_equal(pkg$bs_version, 5)\n})\n\ntest_that(\"Invalid bootstrap version spec in template package\", {\n  path_template_package <- local_pkgdown_template_pkg(\n    meta = list(template = list(bootstrap = 4, bslib = list(version = 5)))\n  )\n\n  expect_snapshot(\n    error = TRUE,\n    local_pkgdown_site(\n      meta = list(template = list(package = \"templatepackage\"))\n    )\n  )\n})\n\ntest_that(\"Invalid bootstrap version spec in _pkgdown.yml\", {\n  expect_snapshot(\n    error = TRUE,\n    local_pkgdown_site(\n      meta = list(\n        template = list(\n          bootstrap = 4,\n          bslib = list(version = 5)\n        )\n      )\n    )\n  )\n})\n\ntest_that(\"Valid local Bootstrap version masks invalid template package\", {\n  path_template_package <- local_pkgdown_template_pkg(\n    meta = list(template = list(bootstrap = 4, bslib = list(version = 5)))\n  )\n\n  expect_no_error(\n    local_pkgdown_site(\n      meta = list(\n        template = list(\n          package = \"templatepackage\",\n          bootstrap = 5\n        )\n      )\n    )\n  )\n})\n\n# Bootstrap theme resolution ----------------------------------------------\ntest_that(\"Finds Bootstrap theme in all the places\", {\n  pkg_sketchy <- local_pkgdown_site(\n    meta = list(template = list(bslib = list(preset = \"sketchy\", version = 5)))\n  )\n  pkg_cosmo <- local_pkgdown_site(\n    meta = list(template = list(bootstrap = 5, bootswatch = \"cosmo\"))\n  )\n  pkg_yeti <- local_pkgdown_site(\n    meta = list(\n      template = list(bootstrap = 5, params = list(bootswatch = \"yeti\"))\n    )\n  )\n\n  expect_equal(get_bslib_theme(pkg_sketchy), \"sketchy\")\n  expect_equal(get_bslib_theme(pkg_cosmo), \"cosmo\")\n  expect_equal(get_bslib_theme(pkg_yeti), \"yeti\")\n})\n\ntest_that(\"Warns when Bootstrap theme is specified in multiple locations\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      template = list(\n        bootstrap = 5,\n        bootswatch = \"cerulean\",\n        bslib = list(preset = \"flatly\", bootswatch = \"lux\"),\n        params = list(bootswatch = \"darkly\")\n      )\n    )\n  )\n  expect_snapshot(get_bslib_theme(pkg))\n})\n\ntest_that(\"Doesn't warn when the same Bootstrap theme is specified in multiple locations\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      template = list(\n        bootstrap = 5,\n        bootswatch = \"cerulean\",\n        bslib = list(preset = \"cerulean\")\n      )\n    )\n  )\n\n  expect_equal(expect_silent(get_bslib_theme(pkg)), \"cerulean\")\n})\n"
  },
  {
    "path": "tests/testthat/test-theme.R",
    "content": "test_that(\"check_bslib_theme() works\", {\n  pkg <- local_pkgdown_site()\n  expect_equal(check_bslib_theme(\"default\", pkg, bs_version = 4), \"default\")\n  expect_equal(check_bslib_theme(\"lux\", pkg, bs_version = 4), \"lux\")\n  expect_snapshot(error = TRUE, {\n    check_bslib_theme(\"paper\", pkg, bs_version = 4)\n  })\n})\n\ntest_that(\"get_bslib_theme() works with template.bslib.preset\", {\n  pkg <- local_pkgdown_site(\n    meta = list(\n      template = list(bslib = list(preset = \"shiny\"), bootstrap = 5)\n    )\n  )\n  expect_equal(get_bslib_theme(pkg), \"shiny\")\n  expect_no_error(bs_theme(pkg))\n\n  pkg <- local_pkgdown_site(\n    meta = list(\n      template = list(bslib = list(preset = \"lux\"), bootstrap = 5)\n    )\n  )\n  expect_equal(get_bslib_theme(pkg), \"lux\")\n  expect_no_error(bs_theme(pkg))\n})\n\ntest_that(\"validations yaml specification\", {\n  build_bslib_ <- function(...) {\n    pkg <- local_pkgdown_site(\n      meta = list(template = list(..., bootstrap = 5, `light-switch` = TRUE))\n    )\n    build_bslib(pkg)\n  }\n\n  expect_snapshot(error = TRUE, {\n    build_bslib_(theme = 1)\n    build_bslib_(theme = \"fruit\")\n    build_bslib_(`theme-dark` = \"fruit\")\n  })\n})\n"
  },
  {
    "path": "tests/testthat/test-topics-external.R",
    "content": "test_that(\"can get info about external function\", {\n  expect_snapshot(str(ext_topics(\"base::mean\")))\n\n  # and column names match\n  pkg <- as_pkgdown(test_path(\"assets/reference\"))\n  expect_equal(names(ext_topics(\"base::mean\")), names(pkg$topics))\n})\n\ntest_that(\"fails if documentation not available\", {\n  expect_snapshot(ext_topics(\"base::doesntexist\"), error = TRUE)\n})\n"
  },
  {
    "path": "tests/testthat/test-topics.R",
    "content": "select_topics_ <- function(topic, topics, check = TRUE) {\n  pkg <- local_pkgdown_site()\n  select_topics(\n    topic,\n    topics,\n    check = check,\n    error_path = \"reference[1].contents\",\n    error_pkg = pkg\n  )\n}\n\ntest_that(\"bad inputs give informative warnings\", {\n  topics <- tibble::tribble(\n    ~name , ~alias       , ~internal , ~concepts   ,\n    \"x\"   , c(\"x\", \"x1\") , FALSE     , character() ,\n  )\n\n  expect_snapshot(error = TRUE, {\n    select_topics_(\"x + \", topics)\n    select_topics_(\"y\", topics)\n    select_topics_(\"paste(1)\", topics)\n    select_topics_(\"starts_with\", topics)\n    select_topics_(\"1\", topics)\n\n    select_topics_(\"starts_with('y')\", topics)\n  })\n})\n\ntest_that(\"selector functions validate their inputs\", {\n  topics <- tibble::tribble(\n    ~name , ~alias       , ~internal , ~concepts   ,\n    \"x\"   , c(\"x\", \"x1\") , FALSE     , character() ,\n  )\n\n  expect_snapshot(error = TRUE, {\n    select_topics_(\"starts_with('x', 'y')\", topics)\n    select_topics_(\"starts_with(c('x', 'y'))\", topics)\n  })\n})\n\n\ntest_that(\"empty input returns empty vector\", {\n  topics <- tibble::tribble(\n    ~name , ~alias       , ~internal , ~concepts   ,\n    \"x\"   , c(\"x\", \"x1\") , FALSE     , character() ,\n  )\n\n  expect_equal(select_topics(character(), topics), integer())\n})\n\ntest_that(\"can select by name or alias\", {\n  topics <- tibble::tribble(\n    ~name  , ~alias        ,\n    \"x\"    , c(\"a1\", \"a2\") ,\n    \"a\"    , c(\"a3\")       ,\n    \"a-b\"  , \"b-a\"         ,\n    \"c::d\" , \"d\"           ,\n  )\n\n  expect_equal(select_topics_(\"x\", topics), 1)\n  expect_equal(select_topics_(\"'x'\", topics), 1)\n  expect_equal(select_topics_(\"a1\", topics), 1)\n  expect_equal(select_topics_(\"a2\", topics), 1)\n  expect_equal(select_topics_(\"c::d\", topics), 4)\n\n  # Even if name is non-syntactic\n  expect_equal(select_topics_(\"a-b\", topics), 3)\n  expect_equal(select_topics_(\"b-a\", topics), 3)\n\n  # Or missing\n  expect_snapshot(error = TRUE, {\n    select_topics_(\"a4\", topics)\n    select_topics_(\"c::a\", topics)\n  })\n})\n\ntest_that(\"selection preserves original order\", {\n  topics <- tibble::tribble(\n    ~name , ~alias        ,\n    \"x\"   , c(\"a1\", \"a2\") ,\n    \"a\"   , c(\"a3\")       ,\n    \"b\"   , \"b1\"\n  )\n\n  expect_equal(select_topics_(c(\"a\", \"b1\", \"x\"), topics), c(2, 3, 1))\n})\n\ntest_that(\"can select by name\", {\n  topics <- tibble::tribble(\n    ~name , ~alias , ~internal ,\n    \"a\"   , \"a\"    , FALSE     ,\n    \"b1\"  , \"b1\"   , FALSE     ,\n    \"b2\"  , \"b2\"   , FALSE     ,\n    \"b3\"  , \"b3\"   , TRUE      ,\n  )\n  topics$alias <- as.list(topics$alias)\n\n  expect_equal(select_topics_(\"starts_with('a')\", topics), 1)\n  expect_equal(select_topics_(\"ends_with('a')\", topics), 1)\n  expect_equal(select_topics_(\"contains('a')\", topics), 1)\n  expect_equal(select_topics_(\"matches('[a]')\", topics), 1)\n\n  # Match internal when requested\n  expect_equal(select_topics_(\"starts_with('b')\", topics), c(2, 3))\n  expect_equal(select_topics_(\"starts_with('b', internal = TRUE)\", topics), 2:4)\n})\n\ntest_that(\"can select by presense or absence of concept\", {\n  topics <- tibble::tribble(\n    ~name , ~alias , ~internal , ~concepts   ,\n    \"b1\"  , \"b1\"   , FALSE     , \"a\"         ,\n    \"b2\"  , \"b2\"   , FALSE     , c(\"a\", \"b\") ,\n    \"b3\"  , \"b3\"   , FALSE     , character()\n  )\n  topics$alias <- as.list(topics$alias)\n\n  expect_equal(select_topics_(\"has_concept('a')\", topics), c(1, 2))\n  expect_equal(select_topics_(\"lacks_concept('b')\", topics), c(1, 3))\n  expect_equal(select_topics_(\"lacks_concepts(c('a', 'b'))\", topics), 3)\n})\n\ntest_that(\"can select by keyword\", {\n  topics <- tibble::tribble(\n    ~name , ~alias , ~internal , ~keywords   ,\n    \"b1\"  , \"b1\"   , FALSE     , \"a\"         ,\n    \"b2\"  , \"b2\"   , FALSE     , c(\"a\", \"b\") ,\n  )\n  topics$alias <- as.list(topics$alias)\n  expect_equal(select_topics_(\"has_keyword('a')\", topics), c(1, 2))\n  expect_equal(select_topics_(\"has_keyword('b')\", topics), c(2))\n  expect_equal(\n    select_topics_(\"has_keyword('c')\", topics, check = FALSE),\n    integer()\n  )\n})\n\ntest_that(\"can select by lifecycle\", {\n  topics <- tibble::tribble(\n    ~name , ~alias , ~internal , ~keywords   , ~lifecycle     ,\n    \"b1\"  , \"b1\"   , FALSE     , \"a\"         , list(\"stable\") ,\n    \"b2\"  , \"b2\"   , FALSE     , c(\"a\", \"b\") , NULL\n  )\n  expect_equal(select_topics_(\"has_lifecycle('stable')\", topics), 1)\n  expect_equal(\n    select_topics_(\"has_lifecycle('deprecated')\", topics, check = FALSE),\n    integer()\n  )\n})\n\ntest_that(\"can combine positive and negative selections\", {\n  topics <- tibble::tribble(\n    ~name , ~alias        , ~internal ,\n    \"x\"   , c(\"a1\", \"a2\") , FALSE     ,\n    \"a\"   , c(\"a3\")       , FALSE     ,\n    \"b\"   , \"b1\"          , FALSE     ,\n    \"d\"   , \"d\"           , TRUE      ,\n  )\n  expect_equal(select_topics_(\"-x\", topics), c(2, 3))\n  expect_equal(select_topics_(c(\"-x\", \"-a\"), topics), 3)\n  expect_equal(select_topics_(c(\"-x\", \"x\"), topics), c(2, 3, 1))\n  expect_equal(select_topics_(c(\"a\", \"x\", \"-a\"), topics), 1)\n\n  expect_snapshot(select_topics_(\"c(a, -x)\", topics), error = TRUE)\n})\n\ntest_that(\"an unmatched selection generates a warning\", {\n  topics <- tibble::tribble(\n    ~name , ~alias        , ~internal ,\n    \"x\"   , c(\"a1\", \"a2\") , FALSE     ,\n    \"a\"   , c(\"a3\")       , FALSE     ,\n    \"b\"   , \"b1\"          , FALSE     ,\n    \"d\"   , \"d\"           , TRUE      ,\n  )\n\n  expect_snapshot(\n    error = TRUE,\n    select_topics_(c(\"a\", \"starts_with('unmatched')\"), topics),\n  )\n})\n\ntest_that(\"uses funs or aliases\", {\n  pkg <- local_pkgdown_site()\n  pkg$topics <- tibble::tribble(\n    ~name , ~funs         , ~alias        , ~file_out , ~title , ~lifecycle ,\n    \"x\"   , character()   , c(\"x1\", \"x2\") , \"x.html\"  , \"X\"    , NULL       ,\n    \"y\"   , c(\"y1\", \"y2\") , \"y3\"          , \"y.html\"  , \"Y\"    , NULL\n  )\n\n  out <- section_topics(pkg, c(\"x\", \"y\"), error_path = \"reference[1].contents\")\n  expect_equal(out$aliases, list(c(\"x1\", \"x2\"), c(\"y1\", \"y2\")))\n})\n\ntest_that(\"full topic selection process works\", {\n  pkg <- local_pkgdown_site(test_path(\"assets/reference\"))\n\n  # can mix local and remote\n  out <- section_topics(\n    pkg,\n    c(\"a\", \"base::mean\"),\n    error_path = \"reference[1].contents\"\n  )\n  expect_equal(unname(out$name), c(\"a\", \"base::mean\"))\n\n  # concepts and keywords work\n  out <- section_topics(\n    pkg,\n    c(\"has_concept('graphics')\", \"has_keyword('foo')\"),\n    error_path = \"reference[1].contents\"\n  )\n  expect_equal(unname(out$name), c(\"b\", \"a\"))\n})\n\ntest_that(\"an unmatched selection with a matched selection does not select everything\", {\n  topics <- tibble::tribble(\n    ~name , ~alias        , ~internal ,\n    \"x\"   , c(\"a1\", \"a2\") , FALSE     ,\n    \"a\"   , c(\"a3\")       , FALSE     ,\n    \"b\"   , \"b1\"          , FALSE     ,\n    \"d\"   , \"d\"           , TRUE      ,\n  )\n\n  expect_equal(\n    select_topics_(c(\"a\", \"starts_with('unmatched')\"), topics, check = FALSE),\n    2\n  )\n\n  expect_equal(\n    select_topics_(c(\"starts_with('unmatched')\", \"a\"), topics, check = FALSE),\n    2\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-tweak-homepage.R",
    "content": "test_that(\"first header is wrapped in page-header div\", {\n  html <- xml2::read_html(\n    '\n    <h1>First</h1>\n    <h1>Second</h1>\n  '\n  )\n\n  tweak_homepage_html(html)\n  expect_equal(xpath_attr(html, \".//div\", \"class\"), \"page-header\")\n})\n\ntest_that(\"removes dummy page-header\", {\n  html <- xml2::read_html(\n    '\n    <div class=\"page-header\"><h1>Page header</h1></div>\n    <h1>Header</h1>\n  '\n  )\n\n  tweak_homepage_html(html)\n  expect_equal(xpath_text(html, \".//h1\"), \"Header\")\n})\n\n\ntest_that(\"can remove first header\", {\n  html <- xml2::read_html(\n    '\n    <h1>First</h1>\n    <h1>Second</h1>\n  '\n  )\n\n  tweak_homepage_html(html, strip_header = TRUE)\n  expect_equal(xpath_length(html, \".//div\"), 0)\n})\n\ntest_that(\"can remove logo\", {\n  # Without link\n  html <- xml2::read_html(\n    '\n    <h1>First <img src=\"logo.png\" /></h1>\n  '\n  )\n  tweak_homepage_html(html, bs_version = 5, logo = \"mylogo.png\")\n  expect_snapshot(xpath_xml(html, \".//div\"))\n\n  # With link\n  html <- xml2::read_html(\n    '\n    <h1>First <a><img src=\"logo.png\" /></a></h1>\n  '\n  )\n  tweak_homepage_html(html, bs_version = 5, logo = \"mylogo.png\")\n  expect_snapshot(xpath_xml(html, \".//div\"))\n})\n\n# badges -------------------------------------------------------------------\n\ntest_that(\"can move badges to sidebar\", {\n  html <- xml2::read_html(\n    '\n    <h1>Title</h1>\n    <div id=\"badges\">\n      <p><a href=\"x\"><img src=\"y\"></a></p>\n    </div>\n    <div class=\"dev-status\"></div>\n  '\n  )\n  tweak_sidebar_html(html)\n  expect_snapshot(xpath_xml(html, \".//div\"))\n})\n\n\ntest_that(\"remove badges even if no dev-status div\", {\n  html <- xml2::read_html(\n    '\n    <h1>Title</h1>\n    <div id=\"badges\">\n      <p><a href=\"x\"><img src=\"y\"></a></p>\n    </div>\n  '\n  )\n  tweak_sidebar_html(html)\n  expect_snapshot(html)\n})\n\ntest_that(\"remove dev-status & badges if badges suppress\", {\n  html <- xml2::read_html(\n    '\n    <h1>Title</h1>\n    <div id=\"badges\">\n      <p><a href=\"x\"><img src=\"y\"></a></p>\n    </div>\n    <div class=\"dev-status\"></div>\n  '\n  )\n  tweak_sidebar_html(html, show_badges = FALSE)\n  expect_equal(xpath_length(html, \"//div\"), 0)\n})\n\ntest_that(\"doesn't find badges when they don't exist\", {\n  expect_equal(badges_extract_text(\"<h1></h1>\"), character())\n  expect_equal(badges_extract_text(\"<p></p>\"), character())\n\n  # first paragraph contains non-image components\n  expect_equal(\n    badges_extract_text(\n      '<p><a href=\"url\"><img src=\"img\" alt=\"alt\" /></a>Hi!</p>'\n    ),\n    character()\n  )\n})\n\ntest_that(\"finds single badge\", {\n  expect_equal(\n    badges_extract_text('<main><p><a href=\"x\"><img src=\"y\"></a></p></main>'),\n    '<a href=\"x\"><img src=\"y\"></a>'\n  )\n})\n\ntest_that(\"finds badges in #badges div\", {\n  expect_equal(\n    badges_extract_text(\n      '<p></p><div id=\"badges\"><a href=\"x\"><img src=\"y\"></a></div>'\n    ),\n    '<a href=\"x\"><img src=\"y\"></a>'\n  )\n\n  # even if there's extra text\n  expect_equal(\n    badges_extract_text(\n      '<p></p><p><div id=\"badges\"><a href=\"x\"><img src=\"y\"></a>Hi!</div></p>'\n    ),\n    '<a href=\"x\"><img src=\"y\"></a>'\n  )\n})\n\ntest_that(\"can find badges in comments\", {\n  html <- '\n    <h1>blop</h1>\n    <p>I am the first paragraph!</p>\n    <!-- badges: start -->\n    <p><a href=\"x\"><img src=\"y\"></a></p>\n    <!-- badges: end -->\n  '\n  expect_equal(badges_extract_text(html), '<a href=\"x\"><img src=\"y\"></a>')\n\n  # produced by usethis\n  html <- '\n    <h1>blop</h1>\n    <p>I am the first paragraph!</p>\n    <!-- badges: start -->\n    <p><a href=\"x\"><img src=\"y\"></a>\n    <!-- badges: end -->\n    </p>\n  '\n  expect_equal(badges_extract_text(html), '<a href=\"x\"><img src=\"y\"></a>')\n})\n\ntest_that(\"ignores extraneous content\", {\n  html <- '\n    <h1>blop</h1>\n    <p>I am the first paragraph!</p>\n    <!-- badges: start -->\n    <p><a href=\"x\"><img src=\"y\"></a></p>\n    <p>a</p>\n    <p><a href=\"b.html\">B</a></p>\n    <!-- badges: end -->\n  '\n  expect_equal(badges_extract_text(html), '<a href=\"x\"><img src=\"y\"></a>')\n})\n"
  },
  {
    "path": "tests/testthat/test-tweak-navbar.R",
    "content": "test_that(\"navbar_links_haystack()\", {\n  html <- xml2::read_html(\n    '\n    <div class=\"navbar-collapse\">\n    <ul>\n      <li class=\"nav-item\"><a href=\"articles/pkgdown.html\">Get started</a></li>\n      <li class=\"nav-item\"><a href=\"reference/index.html\">Reference</a></li>\n      <li class=\"nav-item dropdown\">\n        <a href=\"#\" class=\"nav-link dropdown-toggle\">Articles</a>\n        <div class=\"dropdown-menu\" aria-labelledby=\"navbarDropdown\">\n          <a class=\"dropdown-item\" href=\"articles/linking.html\">Auto-linking</a>\n          <a class=\"dropdown-item\" href=\"articles/index.html\">More</a>\n        </div>\n      </li>\n    </ul>\n    </div>\n  '\n  )\n\n  best_match <- function(path) {\n    navbar_links_haystack(html, pkg = list(), path)[1, c(\"links\", \"similar\")]\n  }\n\n  # Link to exact path if present\n  expect_equal(\n    best_match(\"articles/pkgdown.html\"),\n    tibble::tibble(links = \"articles/pkgdown.html\", similar = 2)\n  )\n  # even if in sub-menu\n  expect_equal(\n    best_match(\"articles/linking.html\"),\n    tibble::tibble(links = \"articles/linking.html\", similar = 2)\n  )\n\n  # ignores index.html\n  expect_equal(\n    best_match(\"articles/index.html\"),\n    tibble::tibble(links = \"articles\", similar = 1)\n  )\n\n  # If not present, guess at top-level home\n  expect_equal(\n    best_match(\"articles/bla.html\"),\n    tibble::tibble(links = \"articles\", similar = 1)\n  )\n})\n\ntest_that(\"activation sets class of best match\", {\n  html <- xml2::read_html(\n    '\n    <div class=\"navbar-collapse\">\n    <ul>\n      <li class=\"nav-item\"><a href=\"articles/pkgdown.html\">Get started</a></li>\n      <li class=\"nav-item\"><a href=\"reference/index.html\">Reference</a></li>\n      <li class=\"nav-item dropdown\">\n        <a href=\"#\" class=\"nav-link dropdown-toggle\">Articles</a>\n        <div class=\"dropdown-menu\" aria-labelledby=\"navbarDropdown\">\n          <a class=\"dropdown-item\" href=\"articles/linking.html\">Auto-linking</a>\n          <a class=\"dropdown-item\" href=\"articles/index.html\">More</a>\n        </div>\n      </li>\n    </ul>\n    </div>\n  '\n  )\n\n  activate_navbar(html, \"articles/linking.html\")\n  expect_equal(\n    xpath_attr(html, \"//li\", \"class\"),\n    c(\"nav-item\", \"nav-item\", \"active nav-item dropdown\")\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-tweak-page.R",
    "content": "test_that(\"links to vignettes & figures tweaked\", {\n  html <- xml2::read_html(\n    '<body>\n    <img src=\"vignettes/x.png\" />\n    <img src=\"../vignettes/x.png\" />\n    <img src=\"man/figures/x.png\" />\n    <img src=\"../man/figures/x.png\" />\n  </body>'\n  )\n\n  tweak_page(\n    html,\n    \"article\",\n    list(bs_version = 3, desc = desc::desc(text = \"\"))\n  )\n  expect_equal(\n    xpath_attr(html, \".//img\", \"src\"),\n    c(\n      \"articles/x.png\",\n      \"../articles/x.png\",\n      \"reference/figures/x.png\",\n      \"../reference/figures/x.png\"\n    )\n  )\n})\n\n\ntest_that(\"reference index table is not altered\", {\n  html <- xml2::read_html(\n    \"<body>\n    <div class='template-reference-index'>\n      <table></table>\n    </div>\n  </body>\"\n  )\n  pkg <- list(bs_version = 3, desc = desc::desc(text = \"\"))\n  tweak_page(html, \"reference-index\", pkg)\n  expect_equal(xpath_attr(html, \".//table\", \"class\"), NA_character_)\n})\n\n\ntest_that(\"articles get rescue highlighting for non-collapsed output\", {\n  html <- xml2::read_xml(\n    \"<body>\n    <pre><code>1</code></pre>\n    <pre class='downlit'><code>1</code></pre>\n    <div class='sourceCode'><pre><code>1</code></pre></div>\n  </body>\"\n  )\n  pkg <- list(bs_version = 3, desc = desc::desc(text = \"\"))\n  tweak_page(html, \"article\", pkg)\n\n  pre <- xml2::xml_find_all(html, \".//pre\")\n  expect_equal(xml2::xml_find_num(pre, \"count(.//span[@class])\"), c(1, 0, 0))\n})\n\ntest_that(\"toc removed if one or fewer headings\", {\n  html <- xml2::read_html(\n    \"<body>\n    <main><h2></h2><h2></h2></main>\n    <nav id='toc'></nav>\n  </body>\"\n  )\n  tweak_useless_toc(html)\n  expect_equal(xpath_length(html, \".//nav\"), 1)\n\n  html <- xml2::read_html(\n    \"<body>\n    <main><h2></h2></main>\n    <nav id='toc'></nav>\n  </body>\"\n  )\n  tweak_useless_toc(html)\n  expect_equal(xpath_length(html, \".//nav\"), 0)\n\n  html <- xml2::read_html(\n    \"<body>\n    <main></main>\n    <nav id='toc'></nav>\n  </body>\"\n  )\n  tweak_useless_toc(html)\n  expect_equal(xpath_length(html, \".//nav\"), 0)\n})\n\ntest_that(\"toc removed if one or fewer headings\", {\n  html <- xml2::read_html(\n    \"<body>\n    <main><h2></h2><h2></h2></main>\n    <aside><nav id='toc'></nav></aside>\n  </body>\"\n  )\n  tweak_useless_toc(html)\n  expect_equal(xpath_length(html, \".//nav\"), 1)\n\n  html <- xml2::read_html(\n    \"<body>\n    <main><h2></h2></main>\n    <aside><nav id='toc'></nav></aside>\n  </body>\"\n  )\n  tweak_useless_toc(html)\n  expect_equal(xpath_length(html, \".//nav\"), 0)\n\n  html <- xml2::read_html(\n    \"<body>\n    <main></main>\n    <aside><nav id='toc'></nav></aside>\n  </body>\"\n  )\n  tweak_useless_toc(html)\n  expect_equal(xpath_length(html, \".//nav\"), 0)\n})\n\n\ntest_that(\"sidebar removed if empty\", {\n  html <- xml2::read_html(\n    \"<body>\n    <main></main>\n    <aside><nav id='toc'></nav></aside>\n  </body>\"\n  )\n  tweak_useless_toc(html)\n  expect_equal(xpath_length(html, \".//div\"), 0)\n})\n\n\ntest_that(\"sidebar removed if empty\", {\n  html <- xml2::read_html(\n    \"<body>\n    <main></main>\n    <aside><nav id='toc'></nav></aside>\n  </body>\"\n  )\n  tweak_useless_toc(html)\n  expect_equal(xpath_length(html, \".//aside\"), 0)\n})\n\n\n# rmarkdown ---------------------------------------------------------------\n\ntest_that(\"h1 section headings adjusted to h2 (and so on)\", {\n  html <- xml2::read_html(\n    \"\n    <div class='page-header'>\n      <h1>Title</h1>\n      <h4>Author</h4>\n    </div>\n    <div class='section level1'>\n      <h1>1</h1>\n      <div class='section level2'>\n      <h2>1.1</h2>\n      </div>\n    </div>\n    <div class='section level1'>\n      <h1>2</h1>\n    </div>\n  \"\n  )\n  tweak_rmarkdown_html(html)\n  expect_equal(xpath_text(html, \".//h1\"), \"Title\")\n  expect_equal(xpath_text(html, \".//h2\"), c(\"1\", \"2\"))\n  expect_equal(xpath_text(html, \".//h3\"), \"1.1\")\n  expect_equal(xpath_text(html, \".//h4\"), \"Author\")\n  expect_equal(\n    xpath_attr(html, \".//div\", \"class\"),\n    c(\"page-header\", \"section level2\", \"section level3\", \"section level2\")\n  )\n})\n\ntest_that(\"slashes not URL encoded during relative path conversion\", {\n  # Since the URL conversion process in tweak_markdown_html() makes calls to\n  # fs::path_real() (which requires paths to exist), we create a\n  # temporary pkgdown site directory and populate it with an image file, which\n  # we can then reference in our test HTML file.\n\n  # Create a site\n  pkg <- local_pkgdown_site()\n\n  # Add the referenced image in a subdirectory of vignettes.\n  pkg <- pkg_add_kitten(pkg, \"vignettes/img/\")\n\n  # Get the full path to the image.\n  sim_path <- path_real(path(pkg$src_path, \"vignettes/img/kitten.jpg\"))\n\n  # Simulate an output HTML file referencing the absolute path.\n  html <- xml2::read_html(\n    sprintf(\n      '\n    <body>\n      <img src=\"%s\" />\n    </body>\n    ',\n      sim_path\n    )\n  )\n\n  # Function should update the absolute path to a relative path.\n  tweak_rmarkdown_html(html, path(pkg$src_path, \"vignettes\"))\n\n  # Check that the relative path has a non-encoded slash.\n  expect_equal(xpath_attr(html, \".//img\", \"src\"), \"img/kitten.jpg\")\n})\n"
  },
  {
    "path": "tests/testthat/test-tweak-reference.R",
    "content": "test_that(\"highlights <pre> wrapped in <div> with language info\", {\n  skip_if_no_pandoc(\"2.16\")\n\n  withr::local_options(downlit.topic_index = c(foo = \"foo\"))\n  html <- xml2::read_html(\n    '\n    <div id=\"ref-section\">\n      <div class=\"sourceCode r\">\n      <pre><code>foo(x)</code></pre>\n      </div>\n    </div>\n  '\n  )\n  tweak_reference_highlighting(html)\n  expect_equal(xpath_attr(html, \".//code//a\", \"href\"), \"foo.html\")\n\n  # Or upper case R\n  html <- xml2::read_html(\n    '\n    <div id=\"ref-section\">\n      <div class=\"sourceCode R\">\n      <pre><code>foo(x)</code></pre>\n      </div>\n    </div>\n  '\n  )\n  tweak_reference_highlighting(html)\n  expect_equal(xpath_attr(html, \".//code//a\", \"href\"), \"foo.html\")\n\n  html <- xml2::read_html(\n    '\n    <div id=\"ref-section\">\n      <div class=\"sourceCode yaml\">\n        <pre><code>field: value</code></pre>\n      </div>\n    </div>\n  '\n  )\n  tweak_reference_highlighting(html)\n  # Select all leaf <span> to work around variations in pandoc styling\n  expect_equal(xpath_attr(html, \"//code//span[not(span)]\", \"class\")[[1]], \"fu\")\n  expect_equal(xpath_text(html, \"//code//span[not(span)]\")[[1]], \"field\")\n\n  # But don't touch examples or usage\n  html <- xml2::read_html(\n    '\n    <div id=\"ref-examples\">\n      <div class=\"sourceCode R\">\n        <pre><code>foo(x)</code></pre>\n      <div>\n    </div>\n  '\n  )\n  tweak_reference_highlighting(html)\n  expect_equal(xpath_length(html, \"//code//span\"), 0)\n\n  html <- xml2::read_html(\n    '\n    <div id=\"ref-usage\">\n      <div class=\"sourceCode R\">\n        <pre><code>foo(x)</code></pre>\n      <div>\n    </div>\n  '\n  )\n  tweak_reference_highlighting(html)\n  expect_equal(xpath_length(html, \"//code//span\"), 0)\n})\n\ntest_that(\"highlight unwrapped <pre>\", {\n  withr::local_options(downlit.topic_index = c(foo = \"foo\"))\n\n  # If parseable, assume R\n  html <- xml2::read_html(\n    '\n    <div id=\"ref-sections\">\n      <pre><code>foo(x)</code></pre>\n    </div>\n  '\n  )\n  tweak_reference_highlighting(html)\n  expect_equal(xpath_attr(html, \".//code//a\", \"href\"), \"foo.html\")\n  expect_equal(xpath_attr(html, \".//div/div\", \"class\"), \"sourceCode\")\n\n  # If not parseable, leave as is\n  html <- xml2::read_html(\n    '\n    <div id=\"ref-sections\">\n      <pre><code>foo(</code></pre>\n    </div>\n  '\n  )\n  tweak_reference_highlighting(html)\n  expect_equal(xpath_length(html, \"//code//span\"), 0)\n  expect_equal(xpath_attr(html, \".//div/div\", \"class\"), \"sourceCode\")\n})\n\n# highlighting ------------------------------------------------------------\n\ntest_that(\"can highlight R code\", {\n  html <- xml2::read_xml('<div><pre><code>1 + 2</code></pre></div>')\n  tweak_highlight_r(html)\n\n  expect_equal(\n    xpath_attr(html, \"//code//span[@class]\", \"class\"),\n    c(\"fl\", \"op\", \"fl\")\n  )\n  expect_equal(xpath_text(html, \"//code//span[@class]\"), c(\"1\", \"+\", \"2\"))\n})\n\ntest_that(\"fails cleanly\", {\n  html <- xml2::read_xml('<div><pre><code>1 + </code></pre></div>')\n  expect_equal(tweak_highlight_r(html), FALSE)\n\n  html <- xml2::read_xml('<div><pre><code></code></pre></div>')\n  expect_equal(tweak_highlight_r(html), FALSE)\n\n  html <- xml2::read_xml('<div><pre></pre></div>')\n  expect_equal(tweak_highlight_r(html), FALSE)\n})\n\ntest_that(\"can highlight other languages\", {\n  skip_if_no_pandoc(\"2.16\")\n  html <- xml2::read_xml(\n    '<div class=\"yaml\"><pre><code>field: value</code></pre></div>'\n  )\n  tweak_highlight_other(html)\n\n  # Select all leaf <span> to work around variations in pandoc styling\n  expect_equal(xpath_attr(html, \"//code//span[not(span)]\", \"class\")[[1]], \"fu\")\n  expect_equal(xpath_text(html, \"//code//span[not(span)]\")[[1]], \"field\")\n})\n\ntest_that(\"can highlight 'rmd'\", {\n  skip_if_no_pandoc(\"2.16\")\n  html <- xml2::read_xml(\n    '<div class=\"rmd\"><pre><code>field: value</code></pre></div>'\n  )\n  tweak_highlight_other(html)\n\n  expect_equal(xpath_attr(html, \"//code//span[not(span)]\", \"class\")[[1]], \"an\")\n})\n\ntest_that(\"fails cleanly\", {\n  html <- xml2::read_xml('<div><pre><code></code></pre></div>')\n  tweak_highlight_other(html)\n  expect_equal(xpath_text(html, \"//code\"), \"\")\n\n  html <- xml2::read_xml('<div><pre></pre></div>')\n  expect_equal(tweak_highlight_other(html), FALSE)\n})\n\n\n# logo --------------------------------------------------------------------\n\ntest_that(\"can strip extra logo from description\", {\n  html <- xml2::read_html(\n    '\n    <div class=\"ref-description\">\n    <p>Hi</p>\n    <img src=\"logo.png\" />\n    <p>Bye</p>\n    </div>\n  '\n  )\n  tweak_extra_logo(html)\n  expect_equal(xpath_length(html, \"//img\"), 0)\n})\n"
  },
  {
    "path": "tests/testthat/test-tweak-tabset.R",
    "content": "test_that(\"sections with class .tabset are converted to tabsets\", {\n  skip_on_os(\"windows\") # some line ending problem\n  pkg <- local_pkgdown_site()\n  html <- markdown_to_html(\n    pkg,\n    \"\n    # Tabset {.tabset .tabset-pills}\n\n    ## Tab 1\n\n    Contents 1\n\n    ## Tab 2\n\n    Contents 2\n  \"\n  )\n\n  tweak_tabsets(html)\n\n  # strip class for older pandoc compat on GHA\n  headings <- xml2::xml_find_all(html, \".//h1\")\n  xml2::xml_set_attr(headings, \"class\", NULL)\n\n  expect_snapshot_output(xpath_xml(html, \".//body/div\"))\n})\n\ntest_that(\"can adjust active tab\", {\n  skip_on_os(\"windows\") # some line ending problem\n  pkg <- local_pkgdown_site()\n  html <- markdown_to_html(\n    pkg,\n    \"\n    ## Tabset {.tabset .tabset-pills}\n\n    ### Tab 1\n\n    Contents 1\n\n    ### Tab 2 {.active}\n\n    Contents 2\n  \"\n  )\n  tweak_tabsets(html)\n\n  expect_equal(\n    xpath_attr(html, \"//div/div/div\", \"class\"),\n    c(\"tab-pane\", \"active tab-pane\")\n  )\n})\n\ntest_that(\"can fade\", {\n  pkg <- local_pkgdown_site()\n  html <- markdown_to_html(\n    pkg,\n    \"\n    ## Tabset {.tabset .tabset-fade}\n\n    ### Tab 1\n\n    Contents 1\n\n    ### Tab 2 {.active}\n\n    Contents 2\n  \"\n  )\n\n  tweak_tabsets(html)\n  expect_equal(\n    xpath_attr(html, \"//div/div/div\", \"class\"),\n    c(\"fade tab-pane\", \"show active fade tab-pane\")\n  )\n})\n\ntest_that(\"can accept html\", {\n  pkg <- local_pkgdown_site()\n  html <- markdown_to_html(\n    pkg,\n    \"\n    ## Tabset {.tabset}\n\n    ### Tab 1 `with_code` {#toc-1}\n\n    Contents 1\n\n    ### <i class=\\\"fa fab-github\\\"></i> Tab 2 {#toc-2}\n\n    Contents 2\n\n    ### Normal Tab {#toc-normal}\n\n    Contents of normal tab\n  \"\n  )\n\n  tweak_tabsets(html)\n\n  expect_match(\n    as.character(xpath_xml(html, \".//*[@id = 'toc-1-tab']\")),\n    \"Tab 1 <code>with_code</code>\",\n    fixed = TRUE\n  )\n\n  expect_match(\n    as.character(xpath_xml(html, \".//*[@id = 'toc-2-tab']\")),\n    \"<i class=\\\"fa fab-github\\\"></i> Tab 2\",\n    fixed = TRUE\n  )\n\n  expect_match(\n    as.character(xpath_xml(html, \".//*[@id = 'toc-normal-tab']\")),\n    \">Normal Tab</button>\",\n    fixed = TRUE\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-tweak-tags.R",
    "content": "# tables -------------------------------------------------------------\n\ntest_that(\"tables get additional table class\", {\n  html <- xml2::read_html(\n    \"\n    <body>\n      <table></table>\n      <table class='a'></table>\n      <table class='b'></table>\n      </body>\n  \"\n  )\n  tweak_tables(html)\n\n  expect_equal(\n    xpath_attr(html, \".//table\", \"class\"),\n    c(\"table\", \"table a\", \"table b\")\n  )\n})\n\ntest_that(\"except in the argument list\", {\n  html <- xml2::read_html(\n    \"<body>\n    <div class='template-reference-index'>\n      <table class='ref-arguments'></table>\n    </div>\n  </body>\"\n  )\n  tweak_tables(html)\n  expect_equal(xpath_attr(html, \".//table\", \"class\"), \"ref-arguments\")\n})\n\n\n# anchors -------------------------------------------------------------\n\ntest_that(\"ids move from div to headings\", {\n  html <- xml2::read_xml(\n    '<body>\n    <div id=\"1\" class=\"section\"><h1>abc</h1></div>\n    <div id=\"2\" class=\"section\"><h2>abc</h2></div>\n    <div id=\"3\" class=\"section\"><h3>abc</h3></div>\n    <div id=\"4\" class=\"section\"><h4>abc</h4></div>\n    <div id=\"5\" class=\"section\"><h5>abc</h5></div>\n    <div id=\"6\" class=\"section\"><h6>abc</h6></div>\n  </body>'\n  )\n  tweak_anchors(html)\n  expect_equal(\n    xpath_attr(html, \".//h1|//h2|//h3|//h4|//h5|//h6\", \"id\"),\n    as.character(1:6)\n  )\n  expect_equal(xpath_attr(html, \".//div\", \"id\"), rep(NA_character_, 6))\n})\n\ntest_that(\"must be in div with section an class and id\", {\n  html <- xml2::read_xml(\n    '<body>\n    <h1>abc</h1>\n    <div id=\"1\"><h1>abc</h1></div>\n    <div class=\"section\"><h1>abc</h1></div>\n  </body>'\n  )\n  tweak_anchors(html)\n  expect_equal(xpath_attr(html, \".//h1\", \"id\"), rep(NA_character_, 3))\n})\n\ntest_that(\"anchor html added to headings\", {\n  html <- xml2::read_xml(\n    '<body>\n    <div id=\"x\" class=\"section\"><h1>abc</h1></div>\n  </body>'\n  )\n  tweak_anchors(html)\n  expect_snapshot_output(xpath_xml(html, \".//h1\"))\n})\n\ntest_that(\"deduplicates ids\", {\n  html <- xml2::read_xml(\n    '<body>\n    <div id=\"x\" class=\"section\"><h1>abc</h1></div>\n    <div id=\"x\" class=\"section\"><h1>abc</h1></div>\n    <div id=\"x\" class=\"section\"><h1>abc</h1></div>\n  </body>'\n  )\n  tweak_anchors(html)\n  expect_equal(xpath_attr(html, \".//h1\", \"id\"), c(\"x\", \"x-1\", \"x-2\"))\n})\n\ntest_that(\"can process multiple header levels\", {\n  html <- xml2::read_xml(\n    '<body>\n      <div id=\"1\" class=\"section\"><h1>abc</h1></div>\n      <div id=\"2\" class=\"section\"><h2>abc</h2></div>\n      <div id=\"3\" class=\"section\"><h3>abc</h3></div>\n      <div id=\"4\" class=\"section\"><h4>abc</h4></div>\n  </body>'\n  )\n  tweak_anchors(html)\n  expect_equal(xpath_attr(html, \".//a\", \"href\"), c(\"#1\", \"#2\", \"#3\", \"#4\"))\n})\n\ntest_that(\"can handle multiple header\", {\n  html <- xml2::read_xml(\n    '<body>\n    <div id=\"x\" class=\"section\"><h1>one</h1><h1>two</h1></div>\n  </body>'\n  )\n  tweak_anchors(html)\n  expect_equal(xpath_attr(html, \".//div\", \"id\"), NA_character_)\n  expect_equal(xpath_attr(html, \".//h1\", \"id\"), c(\"x\", \"x-1\"))\n  expect_equal(xpath_attr(html, \".//h1/a\", \"href\"), c(\"#x\", \"#x-1\"))\n})\n\ntest_that(\"anchors don't get additional newline\", {\n  html <- xml2::read_xml(\n    '<div id=\"x\" class=\"section\">\n    <h1>abc</h1>\n  </div>'\n  )\n  tweak_anchors(html)\n  expect_equal(xpath_text(html, \".//h1\"), \"abc\")\n})\n\ntest_that(\"empty headings are skipped\", {\n  html <- xml2::read_xml(\n    '<div id=\"x\" class=\"section\">\n    <h1></h1>\n  </div>'\n  )\n  tweak_anchors(html)\n  expect_equal(xpath_length(html, \".//h1/a\"), 0)\n})\n\ntest_that(\"docs with no headings are left unchanged\", {\n  html <- xml2::read_xml('<div>Nothing</div>')\n  tweak_anchors(html)\n  expect_equal(as.character(xpath_xml(html, \".\")), '<div>Nothing</div>')\n})\n\n# links -----------------------------------------------------------------\n\ntest_that(\"local md links are replaced with html\", {\n  html <- xml2::read_html(\n    '\n    <a href=\"local.md\"></a>\n    <a href=\"local.md#fragment\"></a>\n    <a href=\"http://remote.com/remote.md\"></a>\n  '\n  )\n  tweak_link_md(html)\n\n  expect_equal(\n    xpath_attr(html, \"//a\", \"href\"),\n    c(\"local.html\", \"local.html#fragment\", \"http://remote.com/remote.md\")\n  )\n})\n\n\ntest_that(\"tweak_link_external() add the external-link class if needed\", {\n  html <- xml2::read_html(\n    '\n    <a href=\"#anchor\"></a>\n    <a href=\"http://remote.com/remote.md\"></a>\n    <a href=\"http://remote.com/remote.md\" class=\"external-link\"></a>\n    <a href=\"http://remote.com/remote.md\" class=\"thumbnail\" ></a>\n    <a href=\"http://example.com/remote.md\"></a>\n  '\n  )\n\n  pkg <- list(meta = list(url = \"http://example.com\"))\n  tweak_link_external(html, pkg = pkg)\n\n  expect_equal(\n    xpath_attr(html, \"//a\", \"class\"),\n    c(NA, \"external-link\", \"external-link\", \"external-link thumbnail\", NA)\n  )\n})\n\ntest_that(\"tweak_link_absolute() fixes relative paths in common locations\", {\n  html <- xml2::read_html(\n    '\n    <a href=\"a\"></a>\n    <link href=\"link\"></link>\n    <script src=\"script\"></script>\n    <img src=\"img\">\n  '\n  )\n  pkg <- list(meta = list(url = \"https://example.com\"))\n  tweak_link_absolute(html, pkg)\n\n  expect_equal(xpath_attr(html, \"//a\", \"href\"), \"https://example.com/a\")\n  expect_equal(xpath_attr(html, \"//link\", \"href\"), \"https://example.com/link\")\n  expect_equal(xpath_attr(html, \"//img\", \"src\"), \"https://example.com/img\")\n})\n\ntest_that(\"tweak_link_absolute() leaves absolute paths alone\", {\n  html <- xml2::read_html('<a href=\"https://a.com\"></a>')\n  pkg <- list(list(url = \"https://example.com\"))\n  tweak_link_absolute(html, pkg)\n\n  expect_equal(xpath_attr(html, \"//a\", \"href\"), \"https://a.com\")\n})\n\n\ntest_that(\"tweak_link_r6() correctly modifies link to inherited R6 classes\", {\n  skip_on_cran() # in case downlit url changes\n  html <- xml2::read_html(\n    \"\n    <span class=\\\"pkg-link\\\" data-pkg=\\\"pkgdown\\\" data-topic=\\\"Animal\\\" data-id=\\\"x\\\">\n      <a href='replace-me.html'>text</a>\n    </span>\n    <span>\n      <a href='leave-me.html'>text</a>\n    </span>\n    <span class=\\\"pkg-link\\\" data-pkg=\\\"downlit\\\" data-topic=\\\"autolink_url\\\" data-id=\\\"x\\\">\n      <a href='replace_me.html'>text</a>\n    </span>\n  \"\n  )\n\n  tweak_link_R6(html, \"pkgdown\")\n  expect_equal(\n    xpath_attr(html, \"//a\", \"href\"),\n    c(\n      \"Animal.html#method-x\",\n      \"leave-me.html\",\n      \"https://downlit.r-lib.org/reference/autolink.html#method-x\"\n    )\n  )\n})\n\n\ntest_that(\"tweak_img_src() updates img and source tags\", {\n  html <- xml2::read_html(\n    '<body>\n    <source srcset=\"man/figures/foo.png\" />\n    <img src=\"man/figures/bar.png\" />\n  </body>'\n  )\n\n  tweak_img_src(html)\n  expect_equal(xpath_attr(html, \".//img\", \"src\"), \"reference/figures/bar.png\")\n  expect_equal(\n    xpath_attr(html, \".//source\", \"srcset\"),\n    \"reference/figures/foo.png\"\n  )\n})\n\ntest_that(\"tweak_img_src() doesn't modify absolute links\", {\n  html <- xml2::read_html(\n    '<body>\n    <img src=\"https://raw.githubusercontent.com/OWNER/REPO/main/vignettes/foo\" />\n    <img src=\"https://github.com/OWNER/REPO/raw/main/man/figures/foo\" />\n  </body>'\n  )\n  urls_before <- xpath_attr(html, \".//img\", \"src\")\n\n  tweak_img_src(html)\n  expect_equal(\n    xpath_attr(html, \".//img\", \"src\"),\n    urls_before\n  )\n})\n\ntest_that(\"trailing () moved inside links\", {\n  skip_if_no_pandoc(\"2.16\")\n  html <- xml2::read_html('<code><a>build_site</a>()</code>')\n  tweak_link_seealso(html)\n\n  expect_equal(xpath_contents(html, \".//code\"), \"<a>build_site()</a>\")\n})\n\n# stripped divs etc -------------------------------------------------------\n\ntest_that(\"selectively remove hide- divs\", {\n  html <- xml2::read_xml(\n    \"<body>\n    <div class='pkgdown-devel'>devel</div>\n    <div class='pkgdown-release'>release</div>\n    <div class='pkgdown-hide'>all</div>\n  </body>\"\n  )\n  tweak_strip(html, in_dev = TRUE)\n  expect_equal(xpath_text(html, \".//div\"), \"devel\")\n\n  html <- xml2::read_xml(\n    \"<body>\n    <div class='pkgdown-devel'>devel</div>\n    <div class='pkgdown-release'>release</div>\n    <div class='pkgdown-hide'>all</div>\n  </body>\"\n  )\n  tweak_strip(html, in_dev = FALSE)\n  expect_equal(xpath_text(html, \".//div\"), \"release\")\n})\n\n\n# footnotes ---------------------------------------------------------------\n\ntest_that(\"can process footnote with code\", {\n  skip_if_no_pandoc(\"2.17.1\")\n  pkg <- local_pkgdown_site()\n  html <- markdown_to_html(\n    pkg,\n    \"\nHooray[^1]\n\n[^1]: Including code:\n```\n1 +\n2 +\n```\nAnd more text\n  \"\n  )\n  tweak_footnotes(html)\n\n  expect_equal(xpath_length(html, \"//a[@class='footnote-back']\"), 0)\n  expect_equal(xpath_attr(html, \".//a\", \"class\"), \"footnote-ref\")\n  expect_equal(xpath_attr(html, \".//a\", \"tabindex\"), \"0\")\n  expect_snapshot(xpath_attr(html, \".//a\", \"data-bs-content\"))\n})\n"
  },
  {
    "path": "tests/testthat/test-usage.R",
    "content": "# Reference --------------------------------------------------------------------\n\ntest_that(\"usage escapes special characters\", {\n  # parseable\n  expect_equal(usage2text(\"# <\"), \"# &lt;\")\n  #unparseable\n  expect_equal(usage2text(\"<\"), \"&lt;\")\n})\n\ntest_that(\"usage re-renders non-syntactic calls\", {\n  expect_equal(usage2text(\"`<`(x, y)\"), \"x &lt; y\")\n  expect_equal(usage2text(\"`[`(x, y)\"), \"x[y]\")\n})\n\ntest_that(\"usage doesn't re-renders syntactic calls\", {\n  expect_equal(usage2text(\"foo(x , y) # hi\"), \"foo(x , y) # hi\")\n\n  multi_line <- \"foo(\\n  x # x,\\n  y = 1 # y,\\n)\"\n  expect_equal(usage2text(multi_line), multi_line)\n})\n\ntest_that(\"usage generates user facing code for S3/S4 infix/replacement methods\", {\n  expect_snapshot({\n    cat(usage2text(\"\\\\S3method{$}{indexed_frame}(x, name)\"))\n    cat(usage2text(\"\\\\method{[[}{indexed_frame}(x, i) <- value\"))\n    cat(usage2text(\"\\\\S4method{>=}{MyType,numeric}(e1, e2)\"))\n  })\n})\n\ntest_that(\"S4 methods gets comment\", {\n  out <- rd2html(\"\\\\S4method{fun}{class}(x, y)\")\n  expect_equal(out[1], \"# S4 method for class 'class'\")\n  expect_equal(out[2], \"fun(x, y)\")\n})\n\ntest_that(\"S3 methods gets comment\", {\n  out <- rd2html(\"\\\\S3method{fun}{class}(x, y)\")\n  expect_equal(out[1], \"# S3 method for class 'class'\")\n  expect_equal(out[2], \"fun(x, y)\")\n\n  out <- rd2html(\"\\\\method{fun}{class}(x, y)\")\n  expect_equal(out[1], \"# S3 method for class 'class'\")\n  expect_equal(out[2], \"fun(x, y)\")\n})\n\ntest_that(\"Methods for class function work\", {\n  out <- rd2html(\"\\\\S3method{fun}{function}(x, y)\")\n  expect_equal(out[1], \"# S3 method for class 'function'\")\n  expect_equal(out[2], \"fun(x, y)\")\n\n  out <- rd2html(\"\\\\method{fun}{function}(x, y)\")\n  expect_equal(out[1], \"# S3 method for class 'function'\")\n  expect_equal(out[2], \"fun(x, y)\")\n\n  out <- rd2html(\"\\\\S4method{fun}{function,function}(x, y)\")\n  expect_equal(out[1], \"# S4 method for class 'function,function'\")\n  expect_equal(out[2], \"fun(x, y)\")\n})\n\ntest_that(\"default methods get custom text\", {\n  out <- rd2html(\"\\\\S3method{fun}{default}(x, y)\")\n  expect_equal(out[1], \"# Default S3 method\")\n\n  out <- rd2html(\"\\\\S4method{fun}{default}(x, y)\")\n  expect_equal(out[1], \"# Default S4 method\")\n})\n\ntest_that(\"non-syntactic functions get backquoted, not escaped\", {\n  out <- rd2html(\"\\\\S3method{<}{foo}(x, y)\")\n  expect_equal(out[[2]], \"`<`(x, y)\")\n\n  out <- rd2html(\"\\\\S4method{bar<-}{foo}(x, y)\")\n  expect_equal(out[[2]], \"`bar<-`(x, y)\")\n})\n\n# Reference index --------------------------------------------------------------\n\ntest_that(\"can parse data\", {\n  usage <- parse_usage(\"f\")[[1]]\n  expect_equal(usage, list(type = \"data\", name = \"f\"))\n\n  usage <- parse_usage(\"data(f)\")[[1]]\n  expect_equal(usage, list(type = \"data\", name = \"f\"))\n})\n\ntest_that(\"can parse function/methods\", {\n  usage <- parse_usage(\"f(x)\")[[1]]\n  expect_equal(usage$type, \"fun\")\n  expect_equal(usage$name, \"f\")\n\n  usage <- parse_usage(\"\\\\method{f}{bar}(x)\")[[1]]\n  expect_equal(usage$type, \"s3\")\n  expect_equal(usage$name, \"f\")\n  expect_equal(usage$signature, \"bar\")\n\n  usage <- parse_usage(\"\\\\S3method{f}{bar}(x)\")[[1]]\n  expect_equal(usage$type, \"s3\")\n  expect_equal(usage$name, \"f\")\n  expect_equal(usage$signature, \"bar\")\n\n  usage <- parse_usage(\"\\\\S3method{f}{`foo bar`}(x)\")[[1]]\n  expect_equal(usage$type, \"s3\")\n  expect_equal(usage$name, \"f\")\n  expect_equal(usage$signature, \"foo bar\")\n\n  usage <- parse_usage(\"\\\\S4method{f}{bar,baz}(x)\")[[1]]\n  expect_equal(usage$type, \"s4\")\n  expect_equal(usage$name, \"f\")\n  expect_equal(usage$signature, c(\"bar\", \"baz\"))\n\n  usage <- parse_usage(\"\\\\S4method{f}{NULL}(x)\")[[1]]\n  expect_equal(usage$type, \"s4\")\n  expect_equal(usage$name, \"f\")\n  expect_equal(usage$signature, c(\"NULL\"))\n\n  usage <- parse_usage(\"\\\\S4method{f}{function,function}(x, y)\")[[1]]\n  expect_equal(usage$type, \"s4\")\n  expect_equal(usage$name, \"f\")\n  expect_equal(usage$signature, c(\"function\", \"function\"))\n\n  usage <- parse_usage(\"\\\\S4method{f}{function,foo bar}(x, y)\")[[1]]\n  expect_equal(usage$type, \"s4\")\n  expect_equal(usage$name, \"f\")\n  expect_equal(usage$signature, c(\"function\", \"foo bar\"))\n\n  usage <- parse_usage(\"pkg::func()\")[[1]]\n  expect_equal(usage$type, \"fun\")\n  expect_equal(usage$name, \"func\")\n\n  usage <- parse_usage(\"pkg:::func()\")[[1]]\n  expect_equal(usage$type, \"fun\")\n  expect_equal(usage$name, \"func\")\n})\n\ntest_that(\"can parse replacement functions\", {\n  usage <- parse_usage(\"f() <- value\")[[1]]\n  expect_true(usage$replacement)\n  expect_equal(usage$name, \"f<-\")\n\n  usage <- parse_usage(\"\\\\S3method{f}{bar}(x) <- value\")[[1]]\n  expect_true(usage$replacement)\n  expect_equal(usage$name, \"f<-\")\n\n  usage <- parse_usage(\"\\\\S4method{f}{bar,baz}(x) <- value\")[[1]]\n  expect_true(usage$replacement)\n  expect_equal(usage$name, \"f<-\")\n})\n\ntest_that(\"can parse infix functions\", {\n  usage <- parse_usage(\"x \\\\%f\\\\% y\")[[1]]\n  expect_true(usage$infix)\n  expect_equal(usage$name, \"%f%\")\n\n  usage <- parse_usage(\"\\\\S3method{[}{bar}(x)\")[[1]]\n  expect_true(usage$infix)\n  expect_equal(usage$name, \"[\")\n\n  usage <- parse_usage(\"\\\\S4method{[}{bar,baz}(x)\")[[1]]\n  expect_true(usage$infix)\n  expect_equal(usage$name, \"[\")\n})\n\ntest_that(\"can parse infix replacement functions\", {\n  usage <- parse_usage(\"\\\\S3method{[}{bar}(x) <- value\")[[1]]\n  expect_true(usage$infix)\n  expect_true(usage$replacement)\n  expect_equal(usage$name, \"[<-\")\n\n  usage <- parse_usage(\"\\\\S4method{[}{bar,baz}(x) <- value\")[[1]]\n  expect_true(usage$infix)\n  expect_true(usage$replacement)\n  expect_equal(usage$name, \"[<-\")\n})\n\ntest_that(\"can parse multistatement usages\", {\n  usage <- parse_usage(\"f()\\n%This is a comment\\ng(\\n\\n)\")\n  expect_length(usage, 2)\n\n  expect_equal(usage[[1]]$name, \"f\")\n  expect_equal(usage[[2]]$name, \"g\")\n})\n\ntest_that(\"can parse dots\", {\n  usage <- parse_usage(\"f(\\\\dots)\")[[1]]\n  expect_equal(usage$name, \"f\")\n})\n\ntest_that(\"usage2text can parse symbols (#2727)\", {\n  expect_no_error(usage2text(\"viridisLite::viridis(21)\"))\n})\n\n# short_name --------------------------------------------------------------\n\ntest_that(\"infix functions left as\", {\n  expect_equal(short_name(\"%||%\", \"fun\"), \"`%||%`\")\n})\n\ntest_that(\"function name and signature is escaped\", {\n  expect_equal(short_name(\"%<%\", \"fun\"), \"`%&lt;%`\")\n  expect_equal(short_name(\"f\", \"S3\", \"<\"), \"f(<i>&lt;&lt;&gt;</i>)\")\n})\n"
  },
  {
    "path": "tests/testthat/test-utils-fs.R",
    "content": "test_that(\"missing template package yields custom error\", {\n  expect_snapshot(path_package_pkgdown(\"x\", \"missing\", 3), error = TRUE)\n})\n\n\ntest_that(\"out_of_date works as expected\", {\n  temp1 <- file_create(withr::local_tempfile())\n  expect_true(out_of_date(temp1, \"doesntexist\"))\n  expect_snapshot(out_of_date(\"doesntexist\", temp1), error = TRUE)\n\n  temp2 <- file_create(withr::local_tempfile())\n  file_touch(temp2, Sys.time() + 10)\n\n  expect_true(out_of_date(temp2, temp1))\n  expect_false(out_of_date(temp1, temp2))\n  expect_false(out_of_date(temp1, temp1))\n})\n"
  },
  {
    "path": "tests/testthat/test-utils.R",
    "content": "test_that(\"is_internal_link() works\", {\n  pkg = list(meta = list(url = \"https://pkgdown.r-lib.org\"))\n  expect_false(is_internal_link(\"https://github.com\", pkg = pkg))\n  expect_false(is_internal_link(\"http://github.com\", pkg = pkg))\n  expect_true(is_internal_link(\"https://pkgdown.r-lib.org/articles\", pkg = pkg))\n  expect_true(is_internal_link(\"reference/index.html\", pkg = pkg))\n  expect_true(\n    all.equal(\n      is_internal_link(\n        c(\"reference/index.html\", \"https://github.com\"),\n        pkg = pkg\n      ),\n      c(TRUE, FALSE)\n    )\n  )\n})\n"
  },
  {
    "path": "tests/testthat.R",
    "content": "# This file is part of the standard setup for testthat.\n# It is recommended that you do not modify it.\n#\n# Where should you do additional test configuration?\n# Learn more about the roles of various files in:\n# * https://r-pkgs.org/testing-design.html#sec-tests-files-overview\n# * https://testthat.r-lib.org/articles/special-files.html\n\nlibrary(testthat)\nlibrary(pkgdown)\n\ntest_check(\"pkgdown\")\n"
  },
  {
    "path": "tools/syntax-highlight.R",
    "content": "library(jsonlite)\nlibrary(purrr)\nlibrary(dplyr)\nlibrary(fs)\n\n# Pandoc styles are based on KDE default styles:\n# https://docs.kde.org/stable5/en/kate/katepart/highlight.html#kate-highlight-default-styles\n# But in HTML use two letter abbreviations:\n# https://github.com/jgm/skylighting/blob/a1d02a0db6260c73aaf04aae2e6e18b569caacdc/skylighting-core/src/Skylighting/Format/HTML.hs#L117-L147\n# Summary at\n# https://docs.google.com/spreadsheets/d/1JhBtQSCtQ2eu2RepLTJONFdLEnhM3asUyMMLYE3tdYk/edit#gid=0\n\n# fmt: skip\nclass <- c(\n  \"Keyword\"        = \"span.kw\",\n  \"DataType\"       = \"span.dt\",\n  \"DecVal\"         = \"span.dv\",\n  \"BaseN\"          = \"span.bn\",\n  \"Float\"          = \"span.fl\",\n  \"Char\"           = \"span.ch\",\n  \"String\"         = \"span.st\",\n  \"Comment\"        = \"span.co\",\n  \"Other\"          = \"span.ot\",\n  \"Others\"         = \"span.ot\", # both spellings used in themes\n  \"Alert\"          = \"span.al\",\n  \"Function\"       = \"span.fu\",\n  \"RegionMarker\"   = \"span.re\",\n  \"Error\"          = \"span.er\",\n  \"Constant\"       = \"span.cn\",\n  \"SpecialChar\"    = \"span.sc\",\n  \"VerbatimString\" = \"span.vs\",\n  \"SpecialString\"  = \"span.ss\",\n  \"Import\"         = \"span.im\",\n  \"Documentation\"  = \"span.do\",\n  \"Annotation\"     = \"span.an\",\n  \"CommentVar\"     = \"span.cv\",\n  \"Variable\"       = \"span.va\",\n  \"ControlFlow\"    = \"span.cf\",\n  \"Operator\"       = \"span.op\",\n  \"BuiltIn\"        = \"span.bu\",\n  \"Extension\"      = \"span.ex\",\n  \"Preprocessor\"   = \"span.pp\",\n  \"Attribute\"      = \"span.at\",\n  \"Information\"    = \"span.in\",\n  \"Warning\"        = \"span.wa\",\n  \"Normal\"         = \"\"\n)\n\nread_theme <- function(name) {\n  jsonlite::read_json(paste0(\n    \"https://raw.githubusercontent.com/quarto-dev/quarto-cli/\",\n    \"main/src/resources/pandoc/highlight-styles/\",\n    name\n  ))\n}\n\ntheme_df <- function(theme) {\n  bg <- pluck(theme, \"background-color\") %||%\n    pluck(theme, \"editor-colors\", \"BackgroundColor\")\n  fg <- pluck(theme, \"text-color\")\n\n  df <- purrr::map_df(theme$`text-styles`, compact, .id = \"name\")\n  df |>\n    rename(\n      color = any_of(\"text-color\"),\n      background = any_of(\"background-color\")\n    ) |>\n    mutate(class = class[name], name = name, `selected-text-color` = NULL) |>\n    arrange(class) |>\n    structure(bg = bg, fg = fg)\n}\n\nstyle_to_css <- function(\n  name,\n  class,\n  color = NA,\n  background = NA,\n  bold = FALSE,\n  italic = FALSE,\n  underline = FALSE,\n  ...\n) {\n  attr <- c(\n    if (!is.na(color)) paste0(\"color:\", color),\n    if (!is.na(background)) paste0(\"background-color:\", background),\n    if (!is.na(bold) && bold) \"font-weight: bold\",\n    if (!is.na(italic) && italic) \"font-style: italic\",\n    if (!is.na(underline) && underline) \"text-decoration: underline\"\n  )\n\n  paste0(\n    \"pre code \",\n    class,\n    \" /* \",\n    name,\n    \" */ {\",\n    paste0(attr, collapse = \"; \"),\n    \"}\"\n  )\n}\n\n\nsafe_format <- function(x) {\n  ifelse(is.na(x), NA, format(x))\n}\n\ntheme_as_css <- function(df, path = stdout()) {\n  css <- df |>\n    filter(!is.na(class)) |>\n    mutate(name = safe_format(name), class = safe_format(class)) |>\n    pmap_chr(style_to_css)\n\n  attrs <- attributes(df)\n  if (any(c(\"bg\", \"fg\") %in% names(attrs))) {\n    pre <- paste0(\n      \"pre {\",\n      paste(\n        c(\n          paste0(\"background-color: \", attrs$bg, \";\", recycle0 = TRUE),\n          paste0(\"color: \", attrs$fg, \";\", recycle0 = TRUE)\n        ),\n        collapse = \" \"\n      ),\n      \"}\"\n    )\n    css <- c(pre, css)\n  }\n\n  base::writeLines(css, path)\n}\n\nsave_theme <- function(theme, name) {\n  cat(name, \"\\n\", sep = \"\")\n  df <- theme_df(theme)\n  theme_as_css(df, path(\"inst\", \"highlight-styles\", path_ext_set(name, \"scss\")))\n}\n\njson <- gh::gh(\n  \"/repos/{owner}/{repo}/contents/{path}\",\n  owner = \"quarto-dev\",\n  repo = \"quarto-cli\",\n  path = \"src/resources/pandoc/highlight-styles\"\n)\n\ntheme_names <- json |> map_chr(\"name\")\nif (!exists(\"theme_json\")) {\n  theme_json <- map(theme_names, read_theme)\n  names(theme_json) <- theme_names\n}\niwalk(theme_json, save_theme)\n\n# themes <- theme_names |> set_names() |> map_df(theme_df, .id = \"theme\")\n# themes |> count(name, sort = T)\n# themes |> count(theme, is.na(color)) |> print(n = Inf)\n# themes |> filter(is.na(class)) |> print(n = Inf)\n"
  },
  {
    "path": "vignettes/.gitignore",
    "content": "*.html\n*.R\n*.log\n*_files\n\n/.quarto/\n\n**/*.quarto_ipynb\n"
  },
  {
    "path": "vignettes/accessibility.Rmd",
    "content": "---\ntitle: \"Accessibility\"\noutput: rmarkdown::html_vignette\nvignette: >\n  %\\VignetteIndexEntry{Accessibility}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n```{r}\n#| include: false\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\"\n)\n```\n\npkgdown automates as many accessibility details as possible, so that your package website is readable by as many people as possible. This vignette describes the additional details that can't be automated away and you need to be aware of.\n\n```{r}\n#| label: setup\nlibrary(pkgdown)\n```\n\n## Theming\n\n* If you adjust any colours from the default theme (including the syntax highlighting theme), you should double check that the contrast between the background and foreground doesn't make any text difficult to read. A good place to start is running a representative page of your site through <https://wave.webaim.org>.\n\n* The default colour of the development version label makes a slightly too low contrast against the pale grey background of the navbar. This colour comes from the bootstrap \"danger\" colour, so you can fix it by overriding that variable in your `_pkgdown.yml`:\n\n    ```yaml\n    template:\n      bootstrap: 5\n      bslib:\n        danger: \"#A6081A\"\n    ```\n\n* If you use custom navbar entries that only display an icon, make sure to also use the `aria-label` field to provide an accessible label that describes the icon.\n\n    ```yaml\n    cran:\n      icon: fab fa-r-project\n      href: https://cloud.r-project.org/package=pkgdown\n      aria-label: View on CRAN\n    ```\n\n## Images\n\nTo make your site fully accessible, the place where you are likely to need to do the most work is adding alternative text to any images that you create. Unfortunately, there's currently no way to do this for plots you generate in examples, but you can and should add alternative text to plots in vignettes using the `fig.alt` chunk option:\n\n````{verbatim}\n```{r}\n#| fig.alt: >\n#|   Histogram of time between eruptions for Old Faithful. \n#|   It is a bimodal distribution with peaks at 50-55 and \n#|   80-90 minutes.\nhist(faithful$waiting)\n```\n````\n\nIf you forget to add alt text to your vignettes, pkgdown will automatically remind you.\n"
  },
  {
    "path": "vignettes/articles/.gitignore",
    "content": "*.html\n*.R\n*_files\n"
  },
  {
    "path": "vignettes/articles/test-quarto-article.qmd",
    "content": "---\ntitle: \"Test Quarto article\"\nformat: html\n---\n\nThis article should appear on the pkgdown site but not in the built package.\n"
  },
  {
    "path": "vignettes/articles/test-rmarkdown-article.Rmd",
    "content": "---\ntitle: \"Test Rmarkdown article\"\noutput: html_document\n---\n\nThis article should appear on the pkgdown site but not in the built package.\n"
  },
  {
    "path": "vignettes/customise.Rmd",
    "content": "---\ntitle: \"Customise your site\"\noutput: rmarkdown::html_vignette\ndescription: >\n  Learn how to change the look and feel of your pkgdown site.\nvignette: >\n  %\\VignetteIndexEntry{Customise your site}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n```{r}\n#| include: false\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\"\n)\n```\n\nThis vignette teaches you how to customise the style/design of your pkgdown site.\nWe'll start by discussing two techniques that only require tweaks to your `_pkgdown.yml`: theming (colours and fonts) and layout (content of the navbar, sidebar, footer, ...).\nWe'll then discuss how to add additional HTML and other files.\nNext, we'll discuss how to give multiple sites the same style using a package, then finish up with some workflow advice.\n\nIn terms of your `_pkgdown.yml`, this vignette focusses on the most important fields nested under `template` and `navbar`. To learn more about customising other aspects of the site, see the documentation for the indiviudal functions like `build_reference()`, `build_articles()`,  `build_home()`, `build_redirects()`, and `init_site()`. To learn about less important fields nested under `template`, see `build_site()`.\n\n```{r}\n#| label: setup\nlibrary(pkgdown)\n```\n\n## Getting started\n\nMost theming features work only with Bootstrap 5, so first update your site by adding the following lines to your `_pkgdown.yml`:\n\n``` yaml\ntemplate:\n  bootstrap: 5\n```\n\nOverall, the site should look pretty similar, but you will notice a number of small improvements.\nMost importantly, the default font is much bigger, making it considerably easier to read.\nUpgrading to Bootstrap 5 has a low chance of breaking your site unless you were using your [own pkgdown templates](#template-packages) or custom CSS.\n\n## Theming\n\nThere are two ways to change the visual style of your site from `_pkgdown.yml`: using a pre-packaged bootswatch theme or customising theme variables with [bslib](https://rstudio.github.io/bslib/).\nThe following sections show you how.\n\nPlease note that pkgdown's default theme has been carefully optimised to be accessible, so if you make changes, make sure to also read `vignette(\"accessibility\")` to learn about potential accessibility pitfalls.\n\n### Light switch {#light-switch}\n\nYou can provide a \"light switch\" to allow your users to switch between dark and light themes by setting the `light-switch` template option to true:\n\n```yaml\ntemplate:\n  light-switch: true\n```\n\nThis will add a `lightswitch` component to the navbar, which by default appears at the far right. This allows the user to select light mode, dark mode, or auto mode (which follows the system setting). The modes are applied using Bootstrap 5.3's [colours modes](https://getbootstrap.com/docs/5.3/customize/color-modes/) so are not separate themes, but a thin layer of colour customisation applied via CSS.\n\n### Bootswatch themes\n\nThe easiest way to change the entire appearance of your website is to use a [Bootswatch theme](https://bootswatch.com):\n\n``` yaml\ntemplate:\n  bootstrap: 5\n  bootswatch: materia\n```\n\n(Themes are unlikely to work with the light switch, but you can try it and see.)\n\nChanging the bootswatch theme affects both the HTML (via the navbar, more on that below) and the CSS, so you'll need to re-build your complete site with `build_site()` to fully appreciate the changes.\nWhile you're experimenting, you can speed things up by just rebuilding the home page and the CSS by running `build_home_index()`; `init_site()` (and then refreshing the browser).\n\nBootswatch templates with tall navbars (e.g. lux, pulse) also require that you set the `pkgdown-nav-height` bslib variable.\nBecause Bootswatch themes are provided by the [bslib](https://rstudio.github.io/bslib/) R package, you can also nest the `bootswatch` field under the `bslib` field.\n\n``` yaml\ntemplate:\n  bootstrap: 5\n  bslib:\n    bootswatch: lux\n    pkgdown-nav-height: 100px\n```\n\nYou can find the correct height by running `$(\".navbar\").outerHeight()` in the [javascript console](https://firefox-source-docs.mozilla.org/devtools-user/web_console/index.html).\n\n### bslib variables\n\nInstead of picking a complete theme, you can tweak fonts and colours individually using bslib variables.\n[bslib](https://rstudio.github.io/bslib/) is an R package that wraps sass, the tool that Boostrap uses to produce CSS from a special language called [scss](https://sass-lang.com).\nThe primary advantage of scss over CSS is that it's more programmable, so you can have a few key bslib variables that affect appearance of many HTML elements.\n\nThere are three key variables that affect the colour:\n\n-   `bg` (background) determines the page background.\n-   `fg` (foreground) determines the text colour. `bg` and `fg` are mixed to yield `gray-100`, `gray-200`, ..., `grey-900`, which are used to style other elements to match the overall colour scheme.\n-   `primary` sets the link colour and the (translucent) hover colour in the navbar and sidebar.\n\n``` yaml\ntemplate:\n  bootstrap: 5\n  bslib:\n    bg: \"#202123\"\n    fg: \"#B8BCC2\"\n    primary: \"#306cc9\"\n```\n\nYou can customise other components by setting more specific bslib variables, taking advantage of inheritance where possible.\nFor example, `table-border-color` defaults to `border-color` which defaults to `gray-300`.\nIf you want to change the colour of all borders, you can set `border-color` and if you just want to change the colour of table borders, you can set `table-border-color`.\nYou can find a full list of variables in the [bslib docs](https://rstudio.github.io/bslib/articles/bs5-variables/index.html).\n\nIf you're using the light switch, [many colours](https://getbootstrap.com/docs/5.3/customize/color-modes/#sass-variables) are available for customisation specifically for the dark theme.\n\nTheming with bslib is powered by `bslib::bs_theme()` and the `bslib` field is a direct translation of the arguments to that function.\nAs a result, you can fully specify a bslib theme using the `template.bslib` field, making it easy to share YAML with the `output.html_document.theme` field [of an R Markdown document](https://rstudio.github.io/bslib/articles/theming/index.html).\n\n``` yaml\ntemplate:\n  bslib:\n    version: 5\n    bg: \"#202123\"\n    fg: \"#B8BCC2\"\n    primary: \"#306cc9\"\n```\n\nWhile iterating on colours and other variables you only need to rerun `init_site()` and refresh your browser to see the changes.\n\n### Fonts\n\nYou can also override the default fonts used for the majority of the text (`base_font`), for headings (`heading_font`) and for code (`code_font`).\nThe easiest way is to supply the name of a [Google font](https://fonts.google.com) with the following syntax:\n\n``` yaml\ntemplate:\n  bootstrap: 5\n  bslib:\n    base_font: {google: \"Roboto\"}\n    heading_font: {google: \"Roboto Slab\"}\n    code_font: {google: \"JetBrains Mono\"}\n```\n\nIf you want to use a non-Google font, you'll need to do a bit more work. There are two steps: you need to first configure the font with CSS and then use it in your `_pkgdown.yml`. There are two ways you might get the CSS:\n\n* As a block of CSS which you should put in `pkgdown/extra.scss` or `pkgdown/extra.css`. The CSS will look something like this:\n\n    ```css\n    @font-face {\n      font-family: \"proxima-nova\";\n      src: \n        local(\"Proxima Nova Regular\"), \n        local(\"ProximaNova-Regular\"),\n        url(\"https://example.com/ProximaNova-Regular.eot?#iefix\") format(\"embedded-opentype\"),\n        url(\"https://example.com/fonts/proxima/ProximaNova-Regular.woff2\") format(\"woff2\"),\n        url(\"https://example.com/fonts/proxima/ProximaNova-Regular.woff\") format(\"woff\"),\n        url(\"https://example.com/fonts/proxima/ProximaNova-Regular.ttf\") format(\"truetype\");\n      font-weight: normal;\n      font-style: normal;\n      font-display: fallback;\n    }\n    ```\n\n* As a link to a style file, which you'll need to add to the `<head>` using this syntax:\n\n    ```yaml\n    template:\n    includes:\n      in_header: <link rel=\"stylesheet\" type=\"text/css\" href=\"https://...\" />\n    ```\n\nThen in `_pkgdown.yml` you can use the name of the font you just specified:\n\n```yaml\ntemplate:\n  bslib:\n    base_font: proxima-nova\n```\n\nDepending on where the font is from (and if you purchased it), you may need to take additional steps to ensure that it can only be used from your site, and/or make sure that it can still be used when you're previewing locally. If you're having problems getting a custom font to work, looking for errors in the [browser developer console](https://developer.mozilla.org/en-US/docs/Glossary/Developer_Tools) is a good place to start.\n\nWhen iterating on fonts, you'll need to run `build_home_index(); init_site()` then refresh your browser to see the update.\n\n\n### Syntax highlighting\n\nThe colours used for syntax highlighting in code blocks are controlled by the `theme` setting:\n\n``` yaml\ntemplate:\n  bootstrap: 5\n  theme: breeze-light\n```\n\nYou can choose from any of the following options: `r paste0(pkgdown:::highlight_styles(), collapse = \", \")`.\n\nBootswatch themes with a dark background (e.g. cyborg, darkly, solar) will need a dark syntax highlighting `theme`, e.g. `arrow-dark`:\n\n``` yaml\ntemplate:\n  bootstrap: 5\n  bootswatch: cyborg\n  theme: arrow-dark\n```\n\nIf you're using the light switch, you will want to provide a `theme` and a `theme-dark`:\n\n```yaml\ntemplate:\n  light-switch: true\n  theme: gruvbox-light\n  theme-dark: gruvbox-dark\n```\n\nThe foreground and background colours used for inline code are controlled by `code-color` and `code-bg` bslib variables.\nIf you want inline code to match code blocks, you'll need to override the variables yourself, e.g.:\n\n``` yaml\ntemplate: \n  bootstrap: 5\n  theme: arrow-dark  \n  bslib:\n    code-bg: \"#2b2b2b\"\n```\n\n### Math rendering\n\nBy default, pkgdown will render math using [mathml](https://w3c.github.io/mathml/). mathml is the official standard for rendering math on the web, and requires no additional javascript or css dependencies. However, browser support for complex math is not always that good, so if you are including complex equations in your documentation, you may want to switch to either [`katex`](https://katex.org), which we recommend for display of complex math expressions, or [`mathjax`](https://www.mathjax.org) by using the `template.math-rendering` field:\n\n```yaml\ntemplate:\n  math-rendering: katex\n```\n\nOn Linux the default symbol font is _Standard Symbols PS_. Unfortunately, this font does not render plotmath expressions correctly under pkgdown's default graphics device `ragg::png`. There are several simple solutions to this:\n\n* Before building your site, use the systemfonts package to change the symbol font to one which does render plotmath expressions correctly under ragg such as _Liberation Sans_, e.g.: \n  \n  ```r\n  systemfonts::register_variant(\"symbol\", \"Liberation Sans\")\n  ```\n\n* Configure pkgdown to use R's `grDevices::png` device by specifying the following in `_pkgdown.yml`:\n\n  ```yaml\n  figures:\n    dev: grDevices::png\n  ```\n\n### Navbar style\n\nWhen [light-switch](#light-switch) is disabled, the primary navbar colours are determined by HTML classes, not CSS, and can be customized using the `navbar` fields `bg` and `type` which control the background and foreground colours respectively.\nTypically `bg` will be one of `light`, `dark`, or `primary`:\n\n``` yaml\nnavbar:\n  bg: primary\n```\n\nYou generally don't need to set `bg` if you use a bootswatch theme, as pkgdown will pick the `bg` used on the [Bootswatch preview](https://bootswatch.com/).\nSimilarly, you don't usually need to set `type` because bootstrap will guess it for you.\nIf the guess is wrong, you can override with `type: light` or `type: dark` depending on whether the background colour is light (so you need dark text) or `type: dark` if the background is dark (so you need light text).\nUnfortunately, these are defined relative to the page background, so if you have a dark site you'll need to flip `light` and `dark` (a little experimentation should quickly determine what looks best).\n\nWhen [light-switch](#light-switch) is enabled, navbar background colours can be customized via Sass variables provided to `template.bslib`.\nUse `$navbar-bg` to set a constant navbar colour in both light and dark mode, or `$navbar-light-bg` and `$navbar-dark-bg` to choose separate colours.\n\n```yaml\ntemplate:\n  bslib:\n    # navbar-bg: \"#306CC9\"\n    navbar-light-bg: \"#9CBAE7\"\n    navbar-dark-bg: \"#183663\"\n```\n\nBecause the navbar is styled with HTML, you'll need to `build_home_index(); init_site()` to see the effect of changing this parameter.\n\n## Layout {#layout}\n\nYou can customise the contents of the navbar, footer, using the `navbar` and `footer` fields.\nSee `?build_home` for how to customise the sidebar on the homepage.\nThey all use a similar structure that separately defines the overall `structure` and the individual `components`.\n\n### Navbar {#navbar-heading}\n\nYou can customise the navigation bar that appears at the top of the page with the `navbar` field.\nIt's made up of two pieces: `structure`, which defines the overall layout, and `components`, which defines what each piece looks like.\nThis organisation makes it easy to mix and match pkgdown defaults with your own customisations.\n\nThis is the default structure:\n\n``` yaml\nnavbar:\n  structure:\n    left:  [intro, reference, articles, tutorials, news]\n    right: [search, github, lightswitch]\n```\n\nIt makes use of the the following built-in components:\n\n-   `intro`: \"Get Started\", which links to a vignette or article with the same name as the package[^dots].\n-   `reference`: if there are any `.Rd` files.\n-   `articles`: if there are any vignettes or articles.\n-   `tutorials`: if there any tutorials.\n-   `news`: if `NEWS.md` exists.\n-   `search`: the search box (see `?build_search` for more details).\n-   `github`: a link to the source repository (with an icon), if it can be automatically determined from the `DESCRIPTION`.\n-   `lightswitch`; a [\"light switch\"](#light-switch) to select light mode, dark mode, or auto mode.\n\nNote that customising `navbar` like this comes with a downside: if pkgdown later changes the defaults, you'll have to update your `_pkgdown.yml`.\n\n[^dots]: Note that dots (`.`) in the package name need to be replaced by hyphens (`-`) in the vignette filename to be recognized as the intro. That means for a\n    package `foo.bar` the intro needs to be named `foo-bar.Rmd`.\n\nYou can use the `structure` field to reorganise the navbar without changing the default contents:\n\n``` yaml\nnavbar:\n  structure:\n    left:  [search]\n    right: [reference, articles]\n```\n\nYou can use `components` to override the default content.\nFor example, this yaml provides a custom articles menu:\n\n``` yaml\nnavbar:\n components:\n   articles:\n    text: Articles\n    menu:\n    - text: Category A\n    - text: Title A1\n      href: articles/a1.html\n    - text: Title A2\n      href: articles/a2.html\n    - text: -------\n    - text: \"Category B\"\n    - text: Article B1\n      href: articles/b1.html\n```\n\nComponents uses the same syntax as [RMarkdown menus](https://bookdown.org/yihui/rmarkdown/rmarkdown-site.html#site-navigation).\nThe elements of `menu` can be:\n\n-   Linked text (`text`, `href`, and optional `target`, `class`, and `id`.). \n\n-   A linked icon (`icon`, `aria-label`, `href`, and an optional `target`). \n    You can find a list of available icons at [fontawesome](https://fontawesome.com/icons?d=gallery). Provide a text description of the icon in the `aria-label` field\n    for screenreader users.\n\n-   A heading (just `text`).\n\n-   A separator (`text: ——–`).\n\nTo add a new component to the navbar, you need to modify both `structure` and `components`.\nFor example, the following yaml adds a new \"twitter\" component that appears to the left of the github icon.\n\n``` yaml\nnavbar:\n  structure:\n    right: [search, twitter, github, lightswitch]\n  components:\n    twitter:\n      icon: fa-twitter\n      href: http://twitter.com/hadleywickham\n      aria-label: Twitter\n```\n\nFinally, you can add arbitrary HTML to three locations in the navbar:\n\n```yaml\ntemplate:\n  includes:\n    before_title: <!-- inserted before the package title in the header ->\n    before_navbar: <!-- inserted before the navbar links -->\n    after_navbar: <!-- inserted after the navbar links -->\n```\n\nThese inclusions will appear on all screen sizes, and will not be collapsed into the the navbar drop down.\n\nYou can also customise the colour scheme of the navbar by using the `type` and `bg` parameters. See above for details.\n\n### Footer\n\nYou can customise the footer with the `footer` field.\nIt's made up of two pieces: `structure`, which defines the overall layout, and `components`, which defines what each piece looks like.\nThis organisation makes it easy to mix and match the pkgdown defaults with your own customisations.\n\nThis is the default structure:\n\n``` yaml\nfooter:\n  structure: \n    left: developed_by\n    right: built_with\n```\n\nWhich uses two of the three built-in components:\n\n-   `developed_by`: a sentence describing the main authors of the package. (See `?build_home` if you want to tweak *which* authors appear in the footer.)\n-   `built_with`: a sentence advertising pkgdown.\n-   `package`: the name of the package.\n\nYou can override these defaults with the `footer` field.\nThe example below puts the author's information on the right along with a legal disclaimer, and puts the pkgdown link on the left.\n\n``` yaml\nfooter:\n  structure: \n    left: pkgdown\n    right: [developed_by, legal]\n  components:\n    legal: Provided without **any warranty**.\n```\n\nEach side is pasted into a single string (separated by `\" \"`) and then converted from markdown to HTML.\n\n## Additional HTML and files\n\nIf you need to include additional HTML, you can add it in the following locations:\n\n``` yaml\ntemplate:\n  includes:\n    in_header: <!-- inserted at the end of the head -->\n    before_body: <!-- inserted at the beginning of the body -->\n    after_body: <!-- inserted at the end of the body -->\n    before_title: <!-- inserted before the package title in the header ->\n    before_navbar: <!-- inserted before the navbar links -->\n    after_navbar: <!-- inserted after the navbar links -->\n```\n\nYou can include additional files by putting them in the right place:\n\n-   `pkgdown/extra.css` and `pkgdown/extra.js` will be copied to the rendered site and linked from `<head>` (after the pkgdown defaults).\n\n-   `pkgdown/extra.scss` will be added to the scss ruleset used to generate the site CSS.\n\n-   Any files in `pkgdown/assets` will be copied to the website root directory.\n\n-   For expert users: template files in `pkgdown/templates` will override layout templates provided by pkgdown or [template packages](#template-packages).\n\nUse `init_site()` to update your rendered website after making changes to these files.\n\n## Template packages {#template-packages}\n\nTo share a pkgdown style across several packages, the best workflow is to create... a package!\nIt can contain any of the following:\n\n-   A configuration file in `inst/pkgdown/_pkgdown.yml`. This can be used to set (e.g.) author definitions, Bootstrap version and variables, the sidebar, footer, navbar, etc.\n-   Templates in `inst/pkgdown/templates/` will override the default templates.\n-   Assets in `inst/pkgdown/assets/` will be copied in to the destination directory.\n    (Note these files are only copied; you'll need to reference them in your stylesheet or elsewhere in order for them to be actually used.)\n-   `inst/pkgdown/extra.scss` will be added to the bslib ruleset.\n    (Note that `extra.css` is not supported in templates.)\n\nThe pkgdown defaults will be overriden by these template files, which are in turn overridden by package specific settings.\n\nOnce you have created your template package `theverybest`, you need to set it as your site's theme:\n\n``` yaml\ntemplate:\n  package: theverybest\n```\n\nYou then also need to make sure it's available when your site is built. Typically, you won't want to publish this package to CRAN, but you will want to publish to GitHub. Once you've done that, and assuming you're using the [usethis workflow](https://usethis.r-lib.org/reference/use_pkgdown.html), add the following line to your `DESCRIPTION`:\n\n```yaml\nConfig/Needs/website: myorg/theverybest\n```\n\nThis will ensure that the GitHub action will automatically install it from GitHub when building your pkgdown site.\n\nTo get some sense of how a theming package works, you can look at:\n\n-   [tidytemplate](https://tidytemplate.tidyverse.org/) used for tidyverse and tidymodels packages;\n-   [quillt](https://pkgs.rstudio.com/quillt) used for R Markdown packages;\n-   [rotemplate](https://github.com/ropensci-org/rotemplate) used for rOpenSci packages.\n\nBut please note that these templates aren't suitable for use with your own package as they're all designed to give a common visual identity to a specific family of packages.\n\n### Porting a template package\n\nIf you are updating a template package that works with pkgdown 1.0.0, create directories `inst/pkgdown/BS5/templates` and `inst/pkgdown/BS5/assets` (if you don't have any templates/assets make sure to a add dummy file to ensure that git tracks them).\nThe `templates` and `assets` directories directly under `inst/pkgdown` will be used by pkgdown 1.0.0 and by pkgdown 2.0.0 if `boostrap: 3`.\nThe directories under `inst/pkgdown/BS5/` will be used for pkgdown 2.0.0 with `boostrap: 5`.\nThis lets your package support both versions of Bootstrap and pkgdown.\n\n## PR previews\n\nLastly, it might be useful for you to get a preview of the website in internal pull requests.\nFor that, you could use Netlify and GitHub Actions (or apply a similar logic to your toolset):\n\n-   Create a new Netlify website (either from scratch by dragging and dropping a simple index.html, or by creating a site from a GitHub repository and then unlinking that repository); from the site settings get its ID to be saved as `NETLIFY_SITE_ID` in your repo secrets; from your account developer settings get a token to be saved as `NETLIFY_AUTH_TOKEN` in your repo secrets.\n-   Starting from the standard pkgdown workflow `usethis::use_github_action(\"pkgdown\")`, add some logic to build the site and deploy it to Netlify for pull requests from inside the repository, not pull requests from forks. [Example workflow](https://github.com/r-lib/pkgdown/blob/master/.github/workflows/pkgdown.yaml).\n\n## Conclusion\n\nIn this vignette we explained how to change the theming and layout of pkgdown websites.\nFurther work to improve user experience will involve:\n\n-   Working on the article (`?build_articles`) and reference indexes (`?build_reference`).\n-   Writing a compelling README that explains why your package is so cool/useful/fun.\n-   Improving the contents of the individual articles and reference topics 😉.\n"
  },
  {
    "path": "vignettes/how-to-update-released-site.Rmd",
    "content": "---\ntitle: \"How to update a released site\"\noutput: rmarkdown::html_vignette\ndescription: >\n  A guide to updating the \"released\" version of your pkgdown site without\n  having to release a new version of your package.\nvignette: >\n  %\\VignetteIndexEntry{How to update a released site}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n```{r}\n#| include: false\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  eval = FALSE,\n  purl = FALSE\n)\n```\n\nThis vignette shows you how to update the released version of your site to match the dev version of the site, so the first step is to ensure that the dev site looks the way that you want it.\n\nThis site assumes that you're using a recent version of our recommended [pkgdown action](https://github.com/r-lib/actions/blob/HEAD/examples/pkgdown.yaml). If your workflow does not contain `workflow_dispatch`, you will need to update `.github/actions/pkgdown.yaml` by running `use_github_action(\"pkgdown\")`.\n\n## Process\n\nIf you're up to speed with the basic idea and just want some code to follow, here it is.\nOtherwise, read more below.\n\n### Setup\n\nFirst, make sure you're in the `main` branch, and you have the latest version:\n\n```{r}\ngert::git_branch_checkout(\"main\")\ngert::git_pull()\n```\n\nNext figure out the released version that you're updating:\n\n```{r}\nver <- desc::desc_get_version()[1, 1:3]\n```\n\nYou will use this to create and checkout the branch that you'll work in:\n\n```{r}\ngert::git_branch_create(\n  branch = paste0(\"pkgdown-v\", ver),\n  ref = paste0(\"v\", ver)\n)\n```\n\nThis assumes that the `ver` version of your package, e.g. version X.Y.Z, has been marked with the the git tag 'vX.Y.Z'.\nThis happens automatically if you use `usethis::use_github_release()`.\n\n### Backport changes\n\nNow you need to backport changes from the dev site into this branch.\nRun this R code to generate the git code to pull changes for the most common locations:\n\n```{r}\nfiles <- c(\n  # overall site config\n  \"_pkgdown.yml\",\n  # the workflow that builds the site\n  \".github/workflows/pkgdown.yaml\",\n  # readme and vignettes\n  \"README.md\", \"vignettes\",\n  # logo and favicon\n  \"man/figures/\", \"pkgdown/\",\n  # Author metadata and Config/Needs/Website\n  \"DESCRIPTION\"\n)\n\nglue::glue(\"git checkout main -- {files}\")\n```\n\nIf you backport `DESCRIPTION`, you'll also need undo the change to the `Version`:\n\n```{r}\ndesc::desc_set_version(ver)\n```\n\nNow build the site locally and check that it looks as expected:\n\n```{r}\npkgdown::build_site()\n```\n\nMake sure to commit these changes.\n\n### Publish\n\nNow you need to publish the site.\nFirst push your branch to GitHub:\n\n```{r}\nusethis:::git_push_first()\n```\n\nThen trigger the pkgdown workflow:\n\n1.  Go to your package's GHA page, e.g. with `usethis::browse_github_actions()`.\n2.  Select the pkgdown workflow.\n3.  Click *Run workflow* and select the branch you just pushed.\n\nIf there's no dropdown menu for this, that means your pkgdown workflow config is not current.\n\n## Context\n\nNow that we've sketched **how** to update a released site, we discuss **why** you might need to do this.\nWhat is a released site?\nWhat other kind of pkgdown site could you have?\nWhy does updating a released site take special effort?\n\n### Automatic development mode\n\nEvery pkgdown site has a so-called [*development mode*](https://pkgdown.r-lib.org/reference/build_site.html#development-mode), which can be specified via the `development` field in `_pkgdown.yml`.\nIf unspecified, the default is `mode: release`, which results in a single pkgdown site.\nDespite the name, this single site reflects \"the current package state\", which could be either a released state or a development state.\n\nFor packages with a substantial user base, it is recommended instead to specify `mode: auto` like so:\n\n``` yaml\ndevelopment:\n  mode: auto\n```\n\nThis directs pkgdown to \"generate different sites for the development and released versions of your package.\"\n\nThe readr package demonstrates what happens in automatic development mode:\n\n[readr.tidyverse.org](https://readr.tidyverse.org) documents the released version, i.e. what `install.packages()` will deliver.\\\n[readr.tidyverse.org/dev/](https://readr.tidyverse.org/dev/) documents the dev version, i.e. what you'd get by installing from GitHub.\n\nIn this mode, `pkgdown::build_site()`, consults DESCRIPTION to learn the package's version number.\nFor a development version number, the rendered site is written to `docs/dev/`.\nFor a released version number, the site is written to `docs/`.\n(There are also other signals to alert users that they are reading documentation for a dev version vs. a released version.)\n\nAutomatic development mode is recommended for packages with a broad user base because it maximizes the chance that a user will read web-based documentation which reflects the package version that is locally installed.\n\n### Publishing\n\nNow that we've established the meaning of a released (vs dev) site, we have to consider how the site is built (i.e. how the HTML is generated) and deployed (i.e. how the HTML is published to a website so people can see it.).\n\nWe recommend `usethis::use_pkgdown_github_pages()` to do basic pkgdown setup and configure a GitHub Actions (GHA) workflow to automatically render and publish the site to GitHub Pages. This function is basically a shortcut for calling the following functions individually:\n\n* `use_pkgdown()`\n* `use_github_pages()`\n* `use_github_action(\"pkgdown\")`\n\nIt then adds the pkgdown site's URL to `_pkgdown.yml`, the `URL` field of DESCRIPTION, and the GitHub repo.\n\nAs a result, the publishing cadence of many pkgdown sites is governed by the workflow maintained at [`r-lib/actions/examples/pkgdown.yaml`](https://github.com/r-lib/actions/blob/v2/examples/pkgdown.yaml).\n(Do not confuse `_pkgdown.yml`, which gives instructions to the pkgdown package, with `.github/workflows/pkgdown.yaml`, which gives instructions to GHA.)\n\nHere are some of the most important bits of the GHA workflow config:\n\n``` yaml\non:\n  push:\n    branches: [main, master]\n  pull_request:\n    branches: [main, master]\n  release:\n    types: [published]\n  workflow_dispatch:\n\n<snip, snip>\n\n      - name: Build site\n        run: Rscript -e 'pkgdown::build_site_github_pages(...)'\n\n      - name: Deploy to GitHub pages 🚀\n        if: github.event_name != 'pull_request'\n        uses: JamesIves/github-pages-deploy-action@4.1.4\n\n        <snip, snip>\n```\n\nAltogether this means that we:\n\n* Build and deploy for pushes to `main`.\n\n* Build, but don't deploy, for pull requests against `main`.\n  This reveals any pkgdown errors, but ensures the live site isn't\n  updated until the pull request is merged (because the code is\n  pushed to `main`).\n\n* Build and deploy when we publish a GitHub release.\n  By convention, we assume that a GitHub release coincides with a CRAN release.\n  So this is the **primary mechanism for building the released pkgdown site**.\n\n`pkgdown::build_site_github_pages()` consults the version in DESCRIPTION to detect whether it's building from a released version or a dev version.\nThat determines the `dest_dir`, e.g. `docs/` for released and `docs/dev/` for dev.\nFor a package in automatic development mode, this means that almost all of your pushes trigger an update to the dev site.\nThe released site is only updated when you push a state with a non-development version number or when you publish a GitHub release.\n\nSo how do you tweak things about the released site *in between* releases?\n\nThat brings us to `workflow_dispatch:`.\n(Yes that dangling colon is correct.)\n\nThe inclusion of `workflow_dispatch` as a trigger means the pkgdown workflow can be [run on demand](https://docs.github.com/en/actions/using-workflows/manually-running-a-workflow), most importantly from the browser.\n\n## Construct a branch for the update\n\nThe overall goal is to create a branch that combines some features of the released website (e.g. the released version) and the development version (e.g. improvements to your `_pkgdown.yml`). The easiest way is to start your branch using the latest release tag, then bring in selected changes or files from the development version.\n\nFor example, if readr's latest release is 2.1.1:\n\n```\ngit checkout -b update-pkgdown-2-1-1 v2.1.1\n```\n\nAnd here is the general pattern:\n\n```\ngit checkout -b NEW-BRANCH-NAME NAME-OF-RELEASE-TAG\n```\n\nNow you should port innovations from the development site that you want to apply to your released site.\n\nFiles you must update:\n\n-   `.github/workflows/pkgdown.yaml`\n-   `_pkgdown.yml`\n-   `Config/Needs/website` field of DESCRIPTION (And, probably, only this field! In particular, do not mess with the version number.)\n\nOther likely candidates:\n\n-   `README.Rmd` + `README.md`, e.g., if you've updated badges.\n-   Any documentation fixes that **apply to the released version**. This is the only reason to touch anything below `R/` and even then it should only affect roxygen comments. Don't forget to `document()` if you do this!\n-   Any new vignettes or articles that apply to the released version.\n\nHere are some tips on backporting specific changes into this branch.\nIf you are lucky, there are specific commits in your default branch that contain all the necessary changes.\nIn that case, we can cherry pick such a commit by its SHA:\n\n```\ngit cherry-pick SHA\n```\n\nIf that doesn't cover everything for each file you want to update, identify a Git reference (meaning: a SHA, tag, or branch) where the file is in the desired state.\nCheckout that specific file path from that specific ref:\n\n```\ngit checkout main -- path/to/the/file\n```\n\nFor example, readr recently gained a new vignette that applies to the released version of readr, i.e. it does not document any dev-only features or functions.\nWe can bring that into the current branch with:\n\n```\ngit checkout main -- vignettes/column-types.Rmd\n```\n\nCommit and push this new branch to GitHub.\n`usethis::pr_push()` can be handy for this.\nJust don't bother opening a pull request (the branch will still be pushed).\n\nNow we will use the `workflow_dispatch` GHA trigger:\n\n1. Go to the Actions page of your repo, maybe via `usethis::browse_github_actions()`.\n1. Click on the `pkgdown` workflow.\n1. Click the \"Run workflow\".\n1. In the \"Use workflow from\" dropdown menu, select the branch you've just made and pushed, then click \"Run workflow\".\n\nThis should kick off a pkgdown build-and-deploy and, specifically, it should cause updates to the **released** site.\n\nYou can keep this branch around for a while, in case you didn't get everything right the first time or if more things crop up that you'd like backport to the released site, before your next CRAN release.\n\n## Problem-solving\n\nAnother great problem solving technique is to get a bunch of other people's `_pkgdown.yml` files in front of your eyeballs. There are two ways to do this: [GitHub search](https://github.com/search?q=path%3A%22_pkgdown.yml%22+AND+%28org%3Atidyverse+OR+org%3Ar-lib%29&type=code) or [Michael Chirico's `r-ci-samples` repo](https://github.com/MichaelChirico/r-ci-samples/tree/master/pkgdown). For any given `_pkgdown.yml` file, remember that its History and Blame can be helpful for seeing how it has evolved over time.\n"
  },
  {
    "path": "vignettes/linking.Rmd",
    "content": "---\ntitle: \"Auto-linking\"\noutput: rmarkdown::html_vignette\ndescription: >\n  Learn how pkgdown's automatic linking works, and how you can \n  customise it.\nvignette: >\n  %\\VignetteIndexEntry{Auto-linking}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n```{r}\n#| include: false\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\"\n)\n```\n\n## Within a package\n\npkgdown will automatically link to documentation and articles wherever it's possible to do unambiguously. This includes:\n\n* Bare function calls, like `build_site()`.\n* Calls to `?`, like `?build_site` or `package?pkgdown`.\n* Calls to `help()`, like `help(\"pkgdown\")`.\n* Calls to `vignette()`, like `vignette(\"pkgdown\")`.\n\n## Across packages\n\nLinking to documentation in another package is straightforward. Just adapt the call in the usual way:\n\n* `purrr::map()`, `MASS::addterm()`.\n* `?purrr::map`, `?MASS::addterm`.\n* `vignette(\"other-langs\", package = \"purrr\")`, `vignette(\"longintro\", package = \"rpart\")`\n* `{purrr}`\n\nIf pkgdown can find a pkgdown site for the remote package, it will link to it; otherwise, it will link to <https://rdrr.io/> for documentation and CRAN for vignettes. In order for a pkgdown site to be findable, it needs to be listed in two places:\n\n*   In the `URL` field in the `DESCRIPTION`, as in\n    [dplyr](https://github.com/tidyverse/dplyr/blob/85faf79c1fd74f4b4f95319e5be6a124a8075502/DESCRIPTION#L15):\n  \n    ```\n    URL: https://dplyr.tidyverse.org, https://github.com/tidyverse/dplyr\n    ```\n\n*   In the `url` field in `_pkgdown.yml`, as in \n    [dplyr](https://github.com/tidyverse/dplyr/blob/master/_pkgdown.yml#L1)\n    \n    ```yaml\n    url: https://dplyr.tidyverse.org\n    ```\n    \n    When this field is defined, pkgdown generates a public facing\n    [`pkgdown.yml` file](https://dplyr.tidyverse.org/pkgdown.yml) that provides\n    metadata about the site:\n    \n    ```yaml\n    pandoc: '2.2'\n    pkgdown: 1.3.0\n    pkgdown_sha: ~\n    articles:\n      compatibility: compatibility.html\n      dplyr: dplyr.html\n      dplyr_0.8.0: future/dplyr_0.8.0.html\n      dplyr_0.8.0_new_hybrid: future/dplyr_0.8.0_new_hybrid.html\n      programming: programming.html\n      two-table: two-table.html\n      window-functions: window-functions.html\n    urls:\n      reference: https://dplyr.tidyverse.org/reference\n      article: https://dplyr.tidyverse.org/articles\n    ```\n\nNow, when you build a pkgdown site for a package that links to the dplyr documentation (e.g., `dplyr::mutate()`), pkgdown looks first in dplyr's `DESCRIPTION` to find its website, then it looks for `pkgdown.yml`, and uses the metadata to generate the correct links.\n\nTo allow your package to be linked by other locally installed packages, even if your website is not reachable at build time, the following option needs to be set in `_pkgdown.yml`:\n\n```yaml\ndeploy:\n  install_metadata: true\n```\n\nThis allows locally installed packages to access package index metadata from the locally installed copy, which may be useful\nif your website require auth, or you build behind a firewall.\n"
  },
  {
    "path": "vignettes/metadata.Rmd",
    "content": "---\ntitle: \"Metadata\"\ndescription: >\n  Customise metadata and social media cards for pkgdown websites.\noutput: rmarkdown::html_vignette\nvignette: >\n  %\\VignetteIndexEntry{Metadata}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n```{r}\n#| include: false\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\"\n)\n```\n\nPackage authors can customize the metadata used by Twitter and the [Open Graph protocol][ogp] for rich social media cards. In addition to specifying an alternate description for the package and any individual articles, you may also choose the preview image shown and the style of the card used on Twitter.\n\nYou can preview and validate the appearance of the social media cards with online tools:\n\n* [Google Rich Results Test][ogp-validator]\n* Drafting a tweet to yourself\n* Sending yourself a Slack message\n\n## Necessary configuration\n\nMetadata can only be produced correctly if your pkgdown website URL is indicated in its configuration file.\n\n```yaml\nurl: https://example.com\n```\n\n## Site-wide customization\n\nMetadata for the entire pkgdown website can be specified in the site's `_pkgdown.yml` configuration file in the `home` and `template: opengraph` sections:\n\n```yaml\nhome:\n  title: An R package for pool-noodle discovery\n  description: Discover and add pool-noodles to your growing collection.\n\ntemplate:\n  opengraph:\n    image:\n      src: man/figures/card.png\n      alt: \"Pool noodles configured to form the word poolnoodlr\"\n    twitter:\n      creator: \"@hadleywickham\"\n      site: \"@rstudio\"\n      card: summary_large_image\n```\n\nThe `home: title` and `home: description` fields override the `Title` and `Description` fields in the package `DESCRIPTION`. It's good practice to set these fields to make your package documentation easier to find via search, rather than sticking with the title and description needed by CRAN.\n\nThe `template: opengraph` section allows you to further customize the social media card.\n\n*   `image`: By default, pkgdown uses the package's logo for the card image\n    (if one exists). Use `image` to specify an alternative image for the social\n    media cards of pages in your pkgdown site.\n\n    * `src`: A fully qualified URL to a media card image e.g. `src: https://avatars.githubusercontent.com/u/22618716?v=4`;\n      or a relative path to an image in the rendered website e.g. `src: articles/test/image.jpg`;\n      or a relative path to an image stored in `man/figures` in the package e.g. `src: man/figures/cards.png`.\n      The `src` field is required if `image` is specified.\n\n    * `alt`: Alternative text describing the image for screen readers and\n      other situations where your social media card image cannot be displayed.\n\n*  `twitter`: You can specify the Twitter accounts associated with your package\n    and the [style of social media card][twitter-card] that Twitter will\n    display.\n\n    * `creator`: Typically, the Twitter handle of the author of the package or\n      article.\n\n    * `site`: The Twitter handle of the organization affiliated with the\n      package author or sponsoring the package development.\n\n    * If only one of either `creator` or `site` is included, the provided value will\n      be used for both fields.\n\n    * `card`: The [style of social media card][twitter-card] that Twitter will\n      display. For pkgdown sites, the most relevant options are\n      `summary_large_image`, featuring a large image over the page title and\n      description, or `summary`, featuring a small square image inline and to\n      the left of the page title and description.\n\n## Article metadata\n\nArticles and vignettes rendered as articles by pkgdown can have individually customized metadata and social media cards.\n\n```yaml\ntitle: \"Introduction to poolnoodlr\"\ndescription: \"A brief introduction to pool noodles in R.\"\nauthor: \"Mara Averick\"\nopengraph:\n  image:\n    src: \"https://example.com/pkg/batpig.png\"\n  twitter:\n    card: summary\n    creator: \"@dataandme\"\noutput: rmarkdown::html_vignette\nvignette: >\n  %\\VignetteIndexEntry{Introduction to poolnoodlr}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n```\n\nUse the `title`, `description`, and `author` fields to specify the title, description, and (optional) author of the vignette or article.\n\n* The `title` field is used as the title of your article in your pkgdown site\n  and should always be included.\n\n* Both `title` and `description` are used by pkgdown for the page's social\n  media card. If `description` is not included in the article's YAML front\n  matter, then the name of the package is used instead. The `description`\n  is also displayed on the articles index.\n\n- The `author` field is only used in the text of the vignette or article.\n  How the author name is displayed depends on the `output` format.\n\nIn articles, the `opengraph` section works in the same way as the site-wide `template: opengraph` settings, but is only applied to the article or vignette. This allows you to specify social media card preview images for individual articles, or to associate an article with a particular Twitter account. If not specified, the `opengraph` settings from the site-wide configuration are used.\n\n[ogp]: https://ogp.me/\n[ogp-validator]: https://search.google.com/test/rich-results\n[twitter-card]: https://developer.x.com/en/docs/x-for-websites/cards/overview/abouts-cards\n"
  },
  {
    "path": "vignettes/pkgdown.Rmd",
    "content": "---\ntitle: \"Introduction to pkgdown\"\ndescription: >\n  Learn how to get started with the basics of pkgdown.\noutput: rmarkdown::html_vignette\nvignette: >\n  %\\VignetteIndexEntry{Introduction to pkgdown}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\nThe goal of pkgdown is to make it easy to make an elegant and useful package website with a minimum of work.\nYou can get a basic website up and running in just a couple of minutes. If you're using GitHub, we recommend setting up pkgdown and GitHub actions to automatically build and publish your site:\n\n```{r}\n#| eval: false\n# Run this once to publish your site regularly\nusethis::use_pkgdown_github_pages()\n```\n\nIf you are not using GitHub, you will have to run `pkgdown::build_site()` manually everytime you want to update the site.\n\n```{r}\n#| eval: false\n# Run once\n# Remove docs/ from gitignore to ensure it is checked into git.\nusethis::use_pkgdown()\n# Run everytime you want to update your site\npkgdown::build_site()\n```\n\n\nWhile you'll get a decent website without any additional work, if you want a website that really pops, you'll need to read the rest of this vignette.\nIt starts by showing you how to configure pkgdown with a `_pkgdown.yml`.\nYou'll learn about the main components of the site (the home page, reference, articles, and news), and then how to publish and promote your site.\n\n## Metadata\n\nYou can override pkgdown's defaults with a YAML file called `_pkgdown.yml`[^1].\nThe most important field is `url`, which gives the final location of the site:\n\n[^1]: You can also put it in `pkgdown/_pkgdown.yml` if you want to keep the package root clutter-free, or in `inst/_pkgdown.yml` if you want to make it available when your package is installed. You can also use `.yaml` as the extension if desired.\n\n``` yaml\nurl: https://pkgdown.r-lib.org\n```\n\n`url` is used throughout the site to generate absolute urls where they are needed.\n`url` is also part of what enables auto-links to your help topics or vignettes from sites external to your package, such as from other pkgdown sites or from Quarto websites.\nSee `vignette(\"linking\")` for more.\n\nAnother important option is `template`, which allows you to control the overall appearance of your site:\n\n``` yaml\ntemplate:\n  bootstrap: 5\n  bootswatch: cerulean\n```\n\nYou can learn more about controlling the appearance of your site in `vignette(\"customise\")`.\n\n## Accessibility\n\npkgdown's defaults work to ensure that your site is accessible to as many people as possible. But there are some accessibilty issues that only a human can solve, so make sure to also read `vignette(\"accessibility\")` to learn about them.\n\n## Home page\n\nThe contents of the home page are automatically generated from `index.md` or `README.md`.\npkgdown tries to put them in order, so it's possible to have a different display on GitHub and pkgdown by providing both files.\nThe homepage also includes a sidebar full of useful links (see `?build_home` for how these are generated and how you can customise them).\n\n## Reference\n\npkgdown creates a function reference in `reference/` that includes one page for each `.Rd` help topic in `man/`.\nThe translation of individual help topics from Rd to HTML is generally straightforward, but there are a couple of things you should bear in mind:\n\n-   pkgdown does its best to autolink all references to help topics and articles described in `vignette(\"linking\")`.\n\n-   pkgdown executes all examples, inserting the rendered results in the generated HTML files.\n\nBy default, pkgdown generates a reference index that is just an alphabetically-ordered list of functions.\nThe index is much more useful with human curation because functions can be grouped and described in categories.\nTo override the default, provide a `reference` field in `_pkgdown.yml`.\n\nEach entry in `reference` can take one of three forms:\n\n-   A title, defined by `title` and optional `desc` (description) fields.\n-   A subtitle, defined by `subtitle` and optional `desc` (description) fields.\n-   A list of topics defined by a `contents` field.\n\n``` yaml\nreference:\n- title: \"Connecting to Spark\"\n  desc: >\n    Functions for installing Spark components and managing\n    connections to Spark\n  contents: \n  - spark_config\n  - spark_connect\n  - spark_disconnect\n  - spark_install\n  - spark_log\n- title: \"Reading and Writing Data\"\n  desc: \"Functions for reading and writing Spark DataFrames.\"\n  contents:\n  - starts_with(\"spark_read\")\n  - starts_with(\"spark_write\")\n  - matches(\"saveload\")\n```\n\nNote the use of `starts_with()` to select all functions with a common prefix.\nYou can also use `ends_with()` and `matches()`.\nSee complete details in `?build_reference`, including other topic matching helper functions.\n\nWhile iterating on the reference index you might want to run `pkgdown::build_reference_index()`.\nIt just re-builds the index page, making it faster to quickly change `_pkgdown.yml` and see how it affects your site.\n\n## Articles\n\npkgdown will automatically build all vignettes found in `vignettes/`, translating them to HTML files in `articles/`.\nIt is recommended to name your intro article with your package name to generate a \"Get Started\" page automatically.\n\nDue to the way that pkgdown has to integrate R Markdown generated HTML with its own HTML, relatively little control is available over the output format.\nYou can see the details in `?build_articles`.\n\nIf you want to include an [article](https://r-pkgs.org/website.html#non-vignette-articles) on the website but not in the package (e.g., because it's large), you can use `usethis::use_article()` to set it up.\n\n## News\n\nIf `NEWS.md` is present, it will be rendered into a single-page changelog based on markdown level headings.\npkgdown assumes your `NEWS.md` is formatted using level one headings (`#`) to specify package name and version number, and level two headings (`##`) to provide topical organization for each release.\n\n``` markdown\n# pkgdown 1.1.0\n\n## Bug Fixes\n\n* Lots of them\n\n# pkgdown 1.0.0\n\n* This is the first release of pkgdown.\n```\n\nSee more suggestions for writing news bullets in the [tidyverse style guide](https://style.tidyverse.org/news.html).\n\nSee `?build_news` for more customisation options including how to:\n\n-   Create one page for each major version and related minor versions.\n-   Add release announcements to the news navbar drop-down.\n\n## Publishing\n\nIf you use GitHub, the easiest way to build and publish your site is via GitHub actions.\nUsing GitHub actions automatically builds and publishes the site every time you make a change.\nThe easiest way to set this up is to run `usethis::use_pkgdown_github_pages()`, and if you need to customize the action, see [README.md r-lib/actions](https://github.com/r-lib/actions/tree/v2-branch/examples#build-pkgdown-site).\n\n## Promoting\n\nOnce your finalized site is built and published on the web, you should publicize its URL in a few places:\n\n1.  The `URL` field of your package `DESCRIPTION`, alongside a link to its source:\n\n        URL: https://pkgdown.r-lib.org, https://github.com/r-lib/pkgdown\n\n    (`usethis::use_pkgdown_github_pages()` does this for you.)\n\n2.  Your repository description on GitHub.\n\n    (`usethis::use_pkgdown_github_pages()` does this for you.)\n\n3.  On social media (make sure to include `#rstats`).\n"
  },
  {
    "path": "vignettes/quarto.qmd",
    "content": "---\ntitle: quarto vignettes\ndescription: > \n  Learn how quarto vignettes work with pkgdown, including currently supported\n  features and known limitations.\nvignette: >\n  %\\VignetteIndexEntry{quarto vignettes}\n  %\\VignetteEngine{quarto::html}\n  %\\VignetteEncoding{UTF-8}\nknitr:\n  opts_chunk: \n    collapse: true\n    comment: '#>'\n---\n\npkgdown effectively uses quarto only to generate HTML and then supplies its own CSS and JS. This means that when quarto introduces new features, pkgdown may lag behind in their support. If you're trying out something that doesn't work (and isn't mentioned explicitly below), please [file an issue](https://github.com/r-lib/pkgdown/issues) so we can look into it.\n\n## Operation\n\npkgdown turns your articles directory into a quarto project by temporarily adding a `_quarto.yml` to your articles. You can also add your own if you want to control options for all quarto articles. If you do so, and you have a mix of `.qmd` and `.Rmd` files, you'll need to include the following yaml so that RMarkdown can continue to handle the .Rmd files:\n\n```yaml\nproject:\n  render: ['*.qmd']\n```\n\n### GitHub Actions\n\nThe `setup-r-dependencies` action will [automatically](https://github.com/r-lib/actions/tree/v2-branch/setup-r-dependencies#usage) install Quarto in your GitHub Actions if a .qmd file is present in your repository (see the `install-quarto` parameter for more details). \n\n\n## Limitations\n\n* Callouts are not currently supported (<https://github.com/quarto-dev/quarto-cli/issues/9963>).\n\n* pkgdown assumes that you're using [quarto vignette style](https://quarto-dev.github.io/quarto-r/articles/hello.html), or more generally an html format with [`minimal: true`](https://quarto.org/docs/output-formats/html-basics.html#minimal-html). Specifically, only HTML vignettes are currently supported.\n\n* You can't customise mermaid styles with quarto mermaid themes. If you want to change the colours, you'll need to provide your own custom CSS as shown in [the quarto docs](https://quarto.org/docs/authoring/diagrams.html#customizing-mermaid).\n\n* pkgdown will pass the `lang` setting on to quarto, but the set of available languages is not perfectly matched. Learn more in <https://quarto.org/docs/authoring/language.html>, including how to supply your own translations.\n\n## Supported features\n\nThe following sections demonstrate a bunch of useful quarto features so that we can make sure that they work. \n\n### Inline formatting\n\n* [Small caps]{.smallcaps}\n\n* Here is a footnote reference[^1]\n\n[^1]: And here is the footnote.\n\n### Code\n\n```{r}\n#| fig.alt: A plot of the numbers 1, 2, and 3\n1 + 1\n2 + 2\n\nplot(1:3)\n```\n\n### Figures\n\n::: {#fig-puppies layout-ncol=2}\n![A sketch of a pitbull puppy](pitbull.jpg){#fig-pitbull}\n\n![A sketch of a sharpei puppy](shar-pei.jpg){#fig-shar-pei}\n\nCute puppies\n:::\n\n### Equations\n$$\n\\frac{\\partial \\mathrm C}{ \\partial \\mathrm t } + \\frac{1}{2}\\sigma^{2} \\mathrm S^{2}\n\\frac{\\partial^{2} \\mathrm C}{\\partial \\mathrm C^2}\n  + \\mathrm r \\mathrm S \\frac{\\partial \\mathrm C}{\\partial \\mathrm S}\\ =\n  \\mathrm r \\mathrm C \n$$ {#eq-black-scholes}\n\n\n### Cross references\n\nSee @fig-puppies for two cute puppies.\n\nBlack-Scholes (@eq-black-scholes) is a mathematical model that seeks to explain the behavior of financial derivatives, most commonly options.\n\n## To do\n\n* [ ] Code annotations\n* [ ] Tabsets\n* [x] Citations\n* [x] Task/to do lists\n* [x] Figures\n* [x] Equations\n* [x] Cross-references\n* [x] Footnotes\n* [x] Callouts\n"
  },
  {
    "path": "vignettes/test/jss.Rmd",
    "content": "---\nauthor:\n  - name: FirstName LastName\n    affiliation: University/Company\n    address: >\n      First line\n      Second line\n    email: \\email{name@company.com}\n    url: https://rstudio.com\n  - name: Second Author\n    affiliation: Affiliation\ntitle:\n  plain:     \"JSS article\"\n  formatted: \"JSS article\"\n  short:     \"JSS article\"\npagetitle:   \"JSS article\"\nabstract: >\n  The abstract of the article.\nkeywords:\n  plain:     [keywords, not capitalized, Java]\n  formatted: [keywords, not capitalized, \"\\\\proglang{Java}\"]\noutput: rticles::jss_article\ndocumentclass: jss\nclassoption: nojss\nbibliography: jss.bib\npkgdown:\n  as_is: true\n  extension: pdf\n---\n\n# Introduction\n\nSome text and a reference [@JSSv059i10].\n\n```{r}\n1 +\n  2\n```\n\n"
  },
  {
    "path": "vignettes/test/jss.bib",
    "content": "@article{JSSv059i10,\n   author = {Hadley  Wickham},\n   title = {Tidy Data},\n   journal = {Journal of Statistical Software, Articles},\n   volume = {59},\n   number = {10},\n   year = {2014},\n   issn = {1548-7660},\n   pages = {1--23},\n   doi = {10.18637/jss.v059.i10}\n}\n"
  },
  {
    "path": "vignettes/test/jss.bst",
    "content": "%%\n%% This is file `jss.bst',\n%% generated with the docstrip utility.\n%%\n%% The original source files were:\n%%\n%% merlin.mbs  (with options: `ay,nat,nm-rvx,keyxyr,dt-beg,yr-par,note-yr,tit-qq,atit-u,trnum-it,vol-bf,volp-com,num-xser,pre-edn,isbn,issn,edpar,pp,ed,xedn,xand,etal-it,revdata,eprint,url,url-blk,doi,nfss')\n%% \n%% ** BibTeX style file for JSS publications (http://www.jstatsoft.org/)\n%% \n%% Copyright 1994-2011 Patrick W Daly\n%% License: GPL-2 | GPL-3\n % ===============================================================\n % IMPORTANT NOTICE:\n % This bibliographic style (bst) file has been generated from one or\n % more master bibliographic style (mbs) files, listed above, provided\n % with kind permission of Patrick W Daly.\n %\n % This generated file can be redistributed and/or modified under the terms\n % of the General Public License (Version 2 or 3).\n % ===============================================================\n % Name and version information of the main mbs file:\n % \\ProvidesFile{merlin.mbs}[2011/11/18 4.33 (PWD, AO, DPC)]\n %   For use with BibTeX version 0.99a or later\n %-------------------------------------------------------------------\n % This bibliography style file is intended for texts in ENGLISH\n % This is an author-year citation style bibliography. As such, it is\n % non-standard LaTeX, and requires a special package file to function properly.\n % Such a package is    natbib.sty   by Patrick W. Daly\n % The form of the \\bibitem entries is\n %   \\bibitem[Jones et al.(1990)]{key}...\n %   \\bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}...\n % The essential feature is that the label (the part in brackets) consists\n % of the author names, as they should appear in the citation, with the year\n % in parentheses following. There must be no space before the opening\n % parenthesis!\n % With natbib v5.3, a full list of authors may also follow the year.\n % In natbib.sty, it is possible to define the type of enclosures that is\n % really wanted (brackets or parentheses), but in either case, there must\n % be parentheses in the label.\n % The \\cite command functions as follows:\n %   \\citet{key} ==>>                Jones et al. (1990)\n %   \\citet*{key} ==>>               Jones, Baker, and Smith (1990)\n %   \\citep{key} ==>>                (Jones et al., 1990)\n %   \\citep*{key} ==>>               (Jones, Baker, and Smith, 1990)\n %   \\citep[chap. 2]{key} ==>>       (Jones et al., 1990, chap. 2)\n %   \\citep[e.g.][]{key} ==>>        (e.g. Jones et al., 1990)\n %   \\citep[e.g.][p. 32]{key} ==>>   (e.g. Jones et al., 1990, p. 32)\n %   \\citeauthor{key} ==>>           Jones et al.\n %   \\citeauthor*{key} ==>>          Jones, Baker, and Smith\n %   \\citeyear{key} ==>>             1990\n %---------------------------------------------------------------------\n\nENTRY\n  { address\n    archive\n    author\n    booktitle\n    chapter\n    collaboration\n    doi\n    edition\n    editor\n    eid\n    eprint\n    howpublished\n    institution\n    isbn\n    issn\n    journal\n    key\n    month\n    note\n    number\n    numpages\n    organization\n    pages\n    publisher\n    school\n    series\n    title\n    type\n    url\n    volume\n    year\n  }\n  {}\n  { label extra.label sort.label short.list }\nINTEGERS { output.state before.all mid.sentence after.sentence after.block }\nFUNCTION {init.state.consts}\n{ #0 'before.all :=\n  #1 'mid.sentence :=\n  #2 'after.sentence :=\n  #3 'after.block :=\n}\nSTRINGS { s t}\nFUNCTION {output.nonnull}\n{ 's :=\n  output.state mid.sentence =\n    { \", \" * write$ }\n    { output.state after.block =\n        { add.period$ write$\n          newline$\n          \"\\newblock \" write$\n        }\n        { output.state before.all =\n            'write$\n            { add.period$ \" \" * write$ }\n          if$\n        }\n      if$\n      mid.sentence 'output.state :=\n    }\n  if$\n  s\n}\nFUNCTION {output}\n{ duplicate$ empty$\n    'pop$\n    'output.nonnull\n  if$\n}\nFUNCTION {output.check}\n{ 't :=\n  duplicate$ empty$\n    { pop$ \"empty \" t * \" in \" * cite$ * warning$ }\n    'output.nonnull\n  if$\n}\nFUNCTION {fin.entry}\n{ add.period$\n  write$\n  newline$\n}\n\nFUNCTION {new.block}\n{ output.state before.all =\n    'skip$\n    { after.block 'output.state := }\n  if$\n}\nFUNCTION {new.sentence}\n{ output.state after.block =\n    'skip$\n    { output.state before.all =\n        'skip$\n        { after.sentence 'output.state := }\n      if$\n    }\n  if$\n}\nFUNCTION {add.blank}\n{  \" \" * before.all 'output.state :=\n}\n\nFUNCTION {date.block}\n{\n  new.block\n}\n\nFUNCTION {not}\n{   { #0 }\n    { #1 }\n  if$\n}\nFUNCTION {and}\n{   'skip$\n    { pop$ #0 }\n  if$\n}\nFUNCTION {or}\n{   { pop$ #1 }\n    'skip$\n  if$\n}\nFUNCTION {non.stop}\n{ duplicate$\n   \"}\" * add.period$\n   #-1 #1 substring$ \".\" =\n}\n\nSTRINGS {z}\n\nFUNCTION {remove.dots}\n{ 'z :=\n   \"\"\n   { z empty$ not }\n   { z #1 #2 substring$\n     duplicate$ \"\\.\" =\n       { z #3 global.max$ substring$ 'z :=  * }\n       { pop$\n         z #1 #1 substring$\n         z #2 global.max$ substring$ 'z :=\n         duplicate$ \".\" = 'pop$\n           { * }\n         if$\n       }\n     if$\n   }\n   while$\n}\nFUNCTION {new.block.checkb}\n{ empty$\n  swap$ empty$\n  and\n    'skip$\n    'new.block\n  if$\n}\nFUNCTION {field.or.null}\n{ duplicate$ empty$\n    { pop$ \"\" }\n    'skip$\n  if$\n}\nFUNCTION {emphasize}\n{ duplicate$ empty$\n    { pop$ \"\" }\n    { \"\\emph{\" swap$ * \"}\" * }\n  if$\n}\nFUNCTION {bolden}\n{ duplicate$ empty$\n    { pop$ \"\" }\n    { \"\\textbf{\" swap$ * \"}\" * }\n  if$\n}\nFUNCTION {tie.or.space.prefix}\n{ duplicate$ text.length$ #3 <\n    { \"~\" }\n    { \" \" }\n  if$\n  swap$\n}\n\nFUNCTION {capitalize}\n{ \"u\" change.case$ \"t\" change.case$ }\n\nFUNCTION {space.word}\n{ \" \" swap$ * \" \" * }\n % Here are the language-specific definitions for explicit words.\n % Each function has a name bbl.xxx where xxx is the English word.\n % The language selected here is ENGLISH\nFUNCTION {bbl.and}\n{ \"and\"}\n\nFUNCTION {bbl.etal}\n{ \"et~al.\" }\n\nFUNCTION {bbl.editors}\n{ \"eds.\" }\n\nFUNCTION {bbl.editor}\n{ \"ed.\" }\n\nFUNCTION {bbl.edby}\n{ \"edited by\" }\n\nFUNCTION {bbl.edition}\n{ \"edition\" }\n\nFUNCTION {bbl.volume}\n{ \"volume\" }\n\nFUNCTION {bbl.of}\n{ \"of\" }\n\nFUNCTION {bbl.number}\n{ \"number\" }\n\nFUNCTION {bbl.nr}\n{ \"no.\" }\n\nFUNCTION {bbl.in}\n{ \"in\" }\n\nFUNCTION {bbl.pages}\n{ \"pp.\" }\n\nFUNCTION {bbl.page}\n{ \"p.\" }\n\nFUNCTION {bbl.eidpp}\n{ \"pages\" }\n\nFUNCTION {bbl.chapter}\n{ \"chapter\" }\n\nFUNCTION {bbl.techrep}\n{ \"Technical Report\" }\n\nFUNCTION {bbl.mthesis}\n{ \"Master's thesis\" }\n\nFUNCTION {bbl.phdthesis}\n{ \"Ph.D. thesis\" }\n\nMACRO {jan} {\"January\"}\n\nMACRO {feb} {\"February\"}\n\nMACRO {mar} {\"March\"}\n\nMACRO {apr} {\"April\"}\n\nMACRO {may} {\"May\"}\n\nMACRO {jun} {\"June\"}\n\nMACRO {jul} {\"July\"}\n\nMACRO {aug} {\"August\"}\n\nMACRO {sep} {\"September\"}\n\nMACRO {oct} {\"October\"}\n\nMACRO {nov} {\"November\"}\n\nMACRO {dec} {\"December\"}\n\nMACRO {acmcs} {\"ACM Computing Surveys\"}\n\nMACRO {acta} {\"Acta Informatica\"}\n\nMACRO {cacm} {\"Communications of the ACM\"}\n\nMACRO {ibmjrd} {\"IBM Journal of Research and Development\"}\n\nMACRO {ibmsj} {\"IBM Systems Journal\"}\n\nMACRO {ieeese} {\"IEEE Transactions on Software Engineering\"}\n\nMACRO {ieeetc} {\"IEEE Transactions on Computers\"}\n\nMACRO {ieeetcad}\n {\"IEEE Transactions on Computer-Aided Design of Integrated Circuits\"}\n\nMACRO {ipl} {\"Information Processing Letters\"}\n\nMACRO {jacm} {\"Journal of the ACM\"}\n\nMACRO {jcss} {\"Journal of Computer and System Sciences\"}\n\nMACRO {scp} {\"Science of Computer Programming\"}\n\nMACRO {sicomp} {\"SIAM Journal on Computing\"}\n\nMACRO {tocs} {\"ACM Transactions on Computer Systems\"}\n\nMACRO {tods} {\"ACM Transactions on Database Systems\"}\n\nMACRO {tog} {\"ACM Transactions on Graphics\"}\n\nMACRO {toms} {\"ACM Transactions on Mathematical Software\"}\n\nMACRO {toois} {\"ACM Transactions on Office Information Systems\"}\n\nMACRO {toplas} {\"ACM Transactions on Programming Languages and Systems\"}\n\nMACRO {tcs} {\"Theoretical Computer Science\"}\nFUNCTION {bibinfo.check}\n{ swap$\n  duplicate$ missing$\n    {\n      pop$ pop$\n      \"\"\n    }\n    { duplicate$ empty$\n        {\n          swap$ pop$\n        }\n        { swap$\n          pop$\n        }\n      if$\n    }\n  if$\n}\nFUNCTION {bibinfo.warn}\n{ swap$\n  duplicate$ missing$\n    {\n      swap$ \"missing \" swap$ * \" in \" * cite$ * warning$ pop$\n      \"\"\n    }\n    { duplicate$ empty$\n        {\n          swap$ \"empty \" swap$ * \" in \" * cite$ * warning$\n        }\n        { swap$\n          pop$\n        }\n      if$\n    }\n  if$\n}\nFUNCTION {format.eprint}\n{ eprint duplicate$ empty$\n    'skip$\n    { \"\\eprint\"\n      archive empty$\n        'skip$\n        { \"[\" * archive * \"]\" * }\n      if$\n      \"{\" * swap$ * \"}\" *\n    }\n  if$\n}\nFUNCTION {format.url}\n{\n  url\n  duplicate$ empty$\n    { pop$ \"\" }\n    { \"\\urlprefix\\url{\" swap$ * \"}\" * }\n  if$\n}\n\nINTEGERS { nameptr namesleft numnames }\n\n\nSTRINGS  { bibinfo}\n\nFUNCTION {format.names}\n{ 'bibinfo :=\n  duplicate$ empty$ 'skip$ {\n  's :=\n  \"\" 't :=\n  #1 'nameptr :=\n  s num.names$ 'numnames :=\n  numnames 'namesleft :=\n    { namesleft #0 > }\n    { s nameptr\n      \"{vv~}{ll}{ jj}{ f{}}\"\n      format.name$\n      remove.dots\n      bibinfo bibinfo.check\n      't :=\n      nameptr #1 >\n        {\n          namesleft #1 >\n            { \", \" * t * }\n            {\n              s nameptr \"{ll}\" format.name$ duplicate$ \"others\" =\n                { 't := }\n                { pop$ }\n              if$\n              \",\" *\n              t \"others\" =\n                {\n                  \" \" * bbl.etal emphasize *\n                }\n                { \" \" * t * }\n              if$\n            }\n          if$\n        }\n        't\n      if$\n      nameptr #1 + 'nameptr :=\n      namesleft #1 - 'namesleft :=\n    }\n  while$\n  } if$\n}\nFUNCTION {format.names.ed}\n{\n  'bibinfo :=\n  duplicate$ empty$ 'skip$ {\n  's :=\n  \"\" 't :=\n  #1 'nameptr :=\n  s num.names$ 'numnames :=\n  numnames 'namesleft :=\n    { namesleft #0 > }\n    { s nameptr\n      \"{f{}~}{vv~}{ll}{ jj}\"\n      format.name$\n      remove.dots\n      bibinfo bibinfo.check\n      't :=\n      nameptr #1 >\n        {\n          namesleft #1 >\n            { \", \" * t * }\n            {\n              s nameptr \"{ll}\" format.name$ duplicate$ \"others\" =\n                { 't := }\n                { pop$ }\n              if$\n              \",\" *\n              t \"others\" =\n                {\n\n                  \" \" * bbl.etal emphasize *\n                }\n                { \" \" * t * }\n              if$\n            }\n          if$\n        }\n        't\n      if$\n      nameptr #1 + 'nameptr :=\n      namesleft #1 - 'namesleft :=\n    }\n  while$\n  } if$\n}\nFUNCTION {format.key}\n{ empty$\n    { key field.or.null }\n    { \"\" }\n  if$\n}\n\nFUNCTION {format.authors}\n{ author \"author\" format.names\n    duplicate$ empty$ 'skip$\n    { collaboration \"collaboration\" bibinfo.check\n      duplicate$ empty$ 'skip$\n        { \" (\" swap$ * \")\" * }\n      if$\n      *\n    }\n  if$\n}\nFUNCTION {get.bbl.editor}\n{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ }\n\nFUNCTION {format.editors}\n{ editor \"editor\" format.names duplicate$ empty$ 'skip$\n    {\n      \" \" *\n      get.bbl.editor\n   \"(\" swap$ * \")\" *\n      *\n    }\n  if$\n}\nFUNCTION {format.isbn}\n{ isbn \"isbn\" bibinfo.check\n  duplicate$ empty$ 'skip$\n    {\n      new.block\n      \"ISBN \" swap$ *\n    }\n  if$\n}\n\nFUNCTION {format.issn}\n{ issn \"issn\" bibinfo.check\n  duplicate$ empty$ 'skip$\n    {\n      new.block\n      \"ISSN \" swap$ *\n    }\n  if$\n}\n\nFUNCTION {format.doi}\n{ doi empty$\n    { \"\" }\n    {\n      new.block\n      \"\\doi{\" doi * \"}\" *\n    }\n  if$\n}\nFUNCTION {format.note}\n{\n note empty$\n    { \"\" }\n    { note #1 #1 substring$\n      duplicate$ \"{\" =\n        'skip$\n        { output.state mid.sentence =\n          { \"l\" }\n          { \"u\" }\n        if$\n        change.case$\n        }\n      if$\n      note #2 global.max$ substring$ * \"note\" bibinfo.check\n    }\n  if$\n}\n\nFUNCTION {format.title}\n{ title\n  \"title\" bibinfo.check\n  duplicate$ empty$ 'skip$\n    {\n      \"\\enquote{\" swap$ *\n      add.period$ \"}\" *\n    }\n  if$\n}\nFUNCTION {format.full.names}\n{'s :=\n \"\" 't :=\n  #1 'nameptr :=\n  s num.names$ 'numnames :=\n  numnames 'namesleft :=\n    { namesleft #0 > }\n    { s nameptr\n      \"{vv~}{ll}\" format.name$\n      't :=\n      nameptr #1 >\n        {\n          namesleft #1 >\n            { \", \" * t * }\n            {\n              s nameptr \"{ll}\" format.name$ duplicate$ \"others\" =\n                { 't := }\n                { pop$ }\n              if$\n              t \"others\" =\n                {\n                  \" \" * bbl.etal emphasize *\n                }\n                {\n                  numnames #2 >\n                    { \",\" * }\n                    'skip$\n                  if$\n                  bbl.and\n                  space.word * t *\n                }\n              if$\n            }\n          if$\n        }\n        't\n      if$\n      nameptr #1 + 'nameptr :=\n      namesleft #1 - 'namesleft :=\n    }\n  while$\n}\n\nFUNCTION {author.editor.key.full}\n{ author empty$\n    { editor empty$\n        { key empty$\n            { cite$ #1 #3 substring$ }\n            'key\n          if$\n        }\n        { editor format.full.names }\n      if$\n    }\n    { author format.full.names }\n  if$\n}\n\nFUNCTION {author.key.full}\n{ author empty$\n    { key empty$\n         { cite$ #1 #3 substring$ }\n          'key\n      if$\n    }\n    { author format.full.names }\n  if$\n}\n\nFUNCTION {editor.key.full}\n{ editor empty$\n    { key empty$\n         { cite$ #1 #3 substring$ }\n          'key\n      if$\n    }\n    { editor format.full.names }\n  if$\n}\n\nFUNCTION {make.full.names}\n{ type$ \"book\" =\n  type$ \"inbook\" =\n  or\n    'author.editor.key.full\n    { type$ \"proceedings\" =\n        'editor.key.full\n        'author.key.full\n      if$\n    }\n  if$\n}\n\nFUNCTION {output.bibitem}\n{ newline$\n  \"\\bibitem[{\" write$\n  label write$\n  \")\" make.full.names duplicate$ short.list =\n     { pop$ }\n     { * }\n   if$\n  \"}]{\" * write$\n  cite$ write$\n  \"}\" write$\n  newline$\n  \"\"\n  before.all 'output.state :=\n}\n\nFUNCTION {n.dashify}\n{\n  't :=\n  \"\"\n    { t empty$ not }\n    { t #1 #1 substring$ \"-\" =\n        { t #1 #2 substring$ \"--\" = not\n            { \"--\" *\n              t #2 global.max$ substring$ 't :=\n            }\n            {   { t #1 #1 substring$ \"-\" = }\n                { \"-\" *\n                  t #2 global.max$ substring$ 't :=\n                }\n              while$\n            }\n          if$\n        }\n        { t #1 #1 substring$ *\n          t #2 global.max$ substring$ 't :=\n        }\n      if$\n    }\n  while$\n}\n\nFUNCTION {word.in}\n{ bbl.in capitalize\n  \" \" * }\n\nFUNCTION {format.date}\n{ year \"year\" bibinfo.check duplicate$ empty$\n    {\n      \"empty year in \" cite$ * \"; set to ????\" * warning$\n       pop$ \"????\"\n    }\n    'skip$\n  if$\n  extra.label *\n  before.all 'output.state :=\n  \" (\" swap$ * \")\" *\n}\nFUNCTION {format.btitle}\n{ title \"title\" bibinfo.check\n  duplicate$ empty$ 'skip$\n    {\n      emphasize\n    }\n  if$\n}\nFUNCTION {either.or.check}\n{ empty$\n    'pop$\n    { \"can't use both \" swap$ * \" fields in \" * cite$ * warning$ }\n  if$\n}\nFUNCTION {format.bvolume}\n{ volume empty$\n    { \"\" }\n    { bbl.volume volume tie.or.space.prefix\n      \"volume\" bibinfo.check * *\n      series \"series\" bibinfo.check\n      duplicate$ empty$ 'pop$\n        { swap$ bbl.of space.word * swap$\n          emphasize * }\n      if$\n      \"volume and number\" number either.or.check\n    }\n  if$\n}\nFUNCTION {format.number.series}\n{ volume empty$\n    { number empty$\n        { series field.or.null }\n        { series empty$\n            { number \"number\" bibinfo.check }\n            { output.state mid.sentence =\n                { bbl.number }\n                { bbl.number capitalize }\n              if$\n              number tie.or.space.prefix \"number\" bibinfo.check * *\n              bbl.in space.word *\n              series \"series\" bibinfo.check *\n            }\n          if$\n        }\n      if$\n    }\n    { \"\" }\n  if$\n}\n\nFUNCTION {format.edition}\n{ edition duplicate$ empty$ 'skip$\n    {\n      output.state mid.sentence =\n        { \"l\" }\n        { \"t\" }\n      if$ change.case$\n      \"edition\" bibinfo.check\n      \" \" * bbl.edition *\n    }\n  if$\n}\nINTEGERS { multiresult }\nFUNCTION {multi.page.check}\n{ 't :=\n  #0 'multiresult :=\n    { multiresult not\n      t empty$ not\n      and\n    }\n    { t #1 #1 substring$\n      duplicate$ \"-\" =\n      swap$ duplicate$ \",\" =\n      swap$ \"+\" =\n      or or\n        { #1 'multiresult := }\n        { t #2 global.max$ substring$ 't := }\n      if$\n    }\n  while$\n  multiresult\n}\nFUNCTION {format.pages}\n{ pages duplicate$ empty$ 'skip$\n    { duplicate$ multi.page.check\n        {\n          bbl.pages swap$\n          n.dashify\n        }\n        {\n          bbl.page swap$\n        }\n      if$\n      tie.or.space.prefix\n      \"pages\" bibinfo.check\n      * *\n    }\n  if$\n}\nFUNCTION {format.journal.pages}\n{ pages duplicate$ empty$ 'pop$\n    { swap$ duplicate$ empty$\n        { pop$ pop$ format.pages }\n        {\n          \", \" *\n          swap$\n          n.dashify\n          \"pages\" bibinfo.check\n          *\n        }\n      if$\n    }\n  if$\n}\nFUNCTION {format.journal.eid}\n{ eid \"eid\" bibinfo.check\n  duplicate$ empty$ 'pop$\n    { swap$ duplicate$ empty$ 'skip$\n      {\n          \", \" *\n      }\n      if$\n      swap$ *\n      numpages empty$ 'skip$\n        { bbl.eidpp numpages tie.or.space.prefix\n          \"numpages\" bibinfo.check * *\n          \" (\" swap$ * \")\" * *\n        }\n      if$\n    }\n  if$\n}\nFUNCTION {format.vol.num.pages}\n{ volume field.or.null\n  duplicate$ empty$ 'skip$\n    {\n      \"volume\" bibinfo.check\n    }\n  if$\n  bolden\n  number \"number\" bibinfo.check duplicate$ empty$ 'skip$\n    {\n      swap$ duplicate$ empty$\n        { \"there's a number but no volume in \" cite$ * warning$ }\n        'skip$\n      if$\n      swap$\n      \"(\" swap$ * \")\" *\n    }\n  if$ *\n  eid empty$\n    { format.journal.pages }\n    { format.journal.eid }\n  if$\n}\n\nFUNCTION {format.chapter.pages}\n{ chapter empty$\n    'format.pages\n    { type empty$\n        { bbl.chapter }\n        { type \"l\" change.case$\n          \"type\" bibinfo.check\n        }\n      if$\n      chapter tie.or.space.prefix\n      \"chapter\" bibinfo.check\n      * *\n      pages empty$\n        'skip$\n        { \", \" * format.pages * }\n      if$\n    }\n  if$\n}\n\nFUNCTION {format.booktitle}\n{\n  booktitle \"booktitle\" bibinfo.check\n  emphasize\n}\nFUNCTION {format.in.ed.booktitle}\n{ format.booktitle duplicate$ empty$ 'skip$\n    {\n      editor \"editor\" format.names.ed duplicate$ empty$ 'pop$\n        {\n          \" \" *\n          get.bbl.editor\n          \"(\" swap$ * \"), \" *\n          * swap$\n          * }\n      if$\n      word.in swap$ *\n    }\n  if$\n}\nFUNCTION {format.thesis.type}\n{ type duplicate$ empty$\n    'pop$\n    { swap$ pop$\n      \"t\" change.case$ \"type\" bibinfo.check\n    }\n  if$\n}\nFUNCTION {format.tr.number}\n{ number \"number\" bibinfo.check\n  type duplicate$ empty$\n    { pop$ bbl.techrep }\n    'skip$\n  if$\n  \"type\" bibinfo.check\n  swap$ duplicate$ empty$\n    { pop$ \"t\" change.case$ }\n    { tie.or.space.prefix * * }\n  if$\n}\nFUNCTION {format.article.crossref}\n{\n  word.in\n  \" \\cite{\" * crossref * \"}\" *\n}\nFUNCTION {format.book.crossref}\n{ volume duplicate$ empty$\n    { \"empty volume in \" cite$ * \"'s crossref of \" * crossref * warning$\n      pop$ word.in\n    }\n    { bbl.volume\n      capitalize\n      swap$ tie.or.space.prefix \"volume\" bibinfo.check * * bbl.of space.word *\n    }\n  if$\n  \" \\cite{\" * crossref * \"}\" *\n}\nFUNCTION {format.incoll.inproc.crossref}\n{\n  word.in\n  \" \\cite{\" * crossref * \"}\" *\n}\nFUNCTION {format.org.or.pub}\n{ 't :=\n  \"\"\n  address empty$ t empty$ and\n    'skip$\n    {\n      t empty$\n        { address \"address\" bibinfo.check *\n        }\n        { t *\n          address empty$\n            'skip$\n            { \", \" * address \"address\" bibinfo.check * }\n          if$\n        }\n      if$\n    }\n  if$\n}\nFUNCTION {format.publisher.address}\n{ publisher \"publisher\" bibinfo.warn format.org.or.pub\n}\n\nFUNCTION {format.organization.address}\n{ organization \"organization\" bibinfo.check format.org.or.pub\n}\n\nFUNCTION {article}\n{ output.bibitem\n  format.authors \"author\" output.check\n  author format.key output\n  format.date \"year\" output.check\n  date.block\n  format.title \"title\" output.check\n  new.block\n  crossref missing$\n    {\n      journal\n      \"journal\" bibinfo.check\n      emphasize\n      \"journal\" output.check\n      format.vol.num.pages output\n    }\n    { format.article.crossref output.nonnull\n      format.pages output\n    }\n  if$\n  format.issn output\n  format.doi output\n  new.block\n  format.note output\n  format.eprint output\n  format.url output\n  fin.entry\n}\nFUNCTION {book}\n{ output.bibitem\n  author empty$\n    { format.editors \"author and editor\" output.check\n      editor format.key output\n    }\n    { format.authors output.nonnull\n      crossref missing$\n        { \"author and editor\" editor either.or.check }\n        'skip$\n      if$\n    }\n  if$\n  format.date \"year\" output.check\n  date.block\n  format.btitle \"title\" output.check\n  crossref missing$\n    { format.bvolume output\n      new.block\n      format.number.series output\n      format.edition output\n      new.sentence\n      format.publisher.address output\n    }\n    {\n      new.block\n      format.book.crossref output.nonnull\n    }\n  if$\n  format.isbn output\n  format.doi output\n  new.block\n  format.note output\n  format.eprint output\n  format.url output\n  fin.entry\n}\nFUNCTION {booklet}\n{ output.bibitem\n  format.authors output\n  author format.key output\n  format.date \"year\" output.check\n  date.block\n  format.title \"title\" output.check\n  new.block\n  howpublished \"howpublished\" bibinfo.check output\n  address \"address\" bibinfo.check output\n  format.isbn output\n  format.doi output\n  new.block\n  format.note output\n  format.eprint output\n  format.url output\n  fin.entry\n}\n\nFUNCTION {inbook}\n{ output.bibitem\n  author empty$\n    { format.editors \"author and editor\" output.check\n      editor format.key output\n    }\n    { format.authors output.nonnull\n      crossref missing$\n        { \"author and editor\" editor either.or.check }\n        'skip$\n      if$\n    }\n  if$\n  format.date \"year\" output.check\n  date.block\n  format.btitle \"title\" output.check\n  crossref missing$\n    {\n      format.bvolume output\n      format.chapter.pages \"chapter and pages\" output.check\n      new.block\n      format.number.series output\n      format.edition output\n      new.sentence\n      format.publisher.address output\n    }\n    {\n      format.chapter.pages \"chapter and pages\" output.check\n      new.block\n      format.book.crossref output.nonnull\n    }\n  if$\n  crossref missing$\n    { format.isbn output }\n    'skip$\n  if$\n  format.doi output\n  new.block\n  format.note output\n  format.eprint output\n  format.url output\n  fin.entry\n}\n\nFUNCTION {incollection}\n{ output.bibitem\n  format.authors \"author\" output.check\n  author format.key output\n  format.date \"year\" output.check\n  date.block\n  format.title \"title\" output.check\n  new.block\n  crossref missing$\n    { format.in.ed.booktitle \"booktitle\" output.check\n      format.bvolume output\n      format.number.series output\n      format.edition output\n      format.chapter.pages output\n      new.sentence\n      format.publisher.address output\n      format.isbn output\n    }\n    { format.incoll.inproc.crossref output.nonnull\n      format.chapter.pages output\n    }\n  if$\n  format.doi output\n  new.block\n  format.note output\n  format.eprint output\n  format.url output\n  fin.entry\n}\nFUNCTION {inproceedings}\n{ output.bibitem\n  format.authors \"author\" output.check\n  author format.key output\n  format.date \"year\" output.check\n  date.block\n  format.title \"title\" output.check\n  new.block\n  crossref missing$\n    { format.in.ed.booktitle \"booktitle\" output.check\n      format.bvolume output\n      format.number.series output\n      format.pages output\n      new.sentence\n      publisher empty$\n        { format.organization.address output }\n        { organization \"organization\" bibinfo.check output\n          format.publisher.address output\n        }\n      if$\n      format.isbn output\n      format.issn output\n    }\n    { format.incoll.inproc.crossref output.nonnull\n      format.pages output\n    }\n  if$\n  format.doi output\n  new.block\n  format.note output\n  format.eprint output\n  format.url output\n  fin.entry\n}\nFUNCTION {conference} { inproceedings }\nFUNCTION {manual}\n{ output.bibitem\n  format.authors output\n  author format.key output\n  format.date \"year\" output.check\n  date.block\n  format.btitle \"title\" output.check\n  organization address new.block.checkb\n  organization \"organization\" bibinfo.check output\n  address \"address\" bibinfo.check output\n  format.edition output\n  format.doi output\n  new.block\n  format.note output\n  format.eprint output\n  format.url output\n  fin.entry\n}\n\nFUNCTION {mastersthesis}\n{ output.bibitem\n  format.authors \"author\" output.check\n  author format.key output\n  format.date \"year\" output.check\n  date.block\n  format.btitle\n  \"title\" output.check\n  new.block\n  bbl.mthesis format.thesis.type output.nonnull\n  school \"school\" bibinfo.warn output\n  address \"address\" bibinfo.check output\n  format.doi output\n  new.block\n  format.note output\n  format.eprint output\n  format.url output\n  fin.entry\n}\n\nFUNCTION {misc}\n{ output.bibitem\n  format.authors output\n  author format.key output\n  format.date \"year\" output.check\n  date.block\n  format.title output\n  new.block\n  howpublished \"howpublished\" bibinfo.check output\n  format.doi output\n  new.block\n  format.note output\n  format.eprint output\n  format.url output\n  fin.entry\n}\nFUNCTION {phdthesis}\n{ output.bibitem\n  format.authors \"author\" output.check\n  author format.key output\n  format.date \"year\" output.check\n  date.block\n  format.btitle\n  \"title\" output.check\n  new.block\n  bbl.phdthesis format.thesis.type output.nonnull\n  school \"school\" bibinfo.warn output\n  address \"address\" bibinfo.check output\n  format.doi output\n  new.block\n  format.note output\n  format.eprint output\n  format.url output\n  fin.entry\n}\n\nFUNCTION {proceedings}\n{ output.bibitem\n  format.editors output\n  editor format.key output\n  format.date \"year\" output.check\n  date.block\n  format.btitle \"title\" output.check\n  format.bvolume output\n  format.number.series output\n  new.sentence\n  publisher empty$\n    { format.organization.address output }\n    { organization \"organization\" bibinfo.check output\n      format.publisher.address output\n    }\n  if$\n  format.isbn output\n  format.issn output\n  format.doi output\n  new.block\n  format.note output\n  format.eprint output\n  format.url output\n  fin.entry\n}\n\nFUNCTION {techreport}\n{ output.bibitem\n  format.authors \"author\" output.check\n  author format.key output\n  format.date \"year\" output.check\n  date.block\n  format.title\n  \"title\" output.check\n  new.block\n  format.tr.number emphasize output.nonnull\n  institution \"institution\" bibinfo.warn output\n  address \"address\" bibinfo.check output\n  format.doi output\n  new.block\n  format.note output\n  format.eprint output\n  format.url output\n  fin.entry\n}\n\nFUNCTION {unpublished}\n{ output.bibitem\n  format.authors \"author\" output.check\n  author format.key output\n  format.date \"year\" output.check\n  date.block\n  format.title \"title\" output.check\n  format.doi output\n  new.block\n  format.note \"note\" output.check\n  format.eprint output\n  format.url output\n  fin.entry\n}\n\nFUNCTION {default.type} { misc }\nREAD\nFUNCTION {sortify}\n{ purify$\n  \"l\" change.case$\n}\nINTEGERS { len }\nFUNCTION {chop.word}\n{ 's :=\n  'len :=\n  s #1 len substring$ =\n    { s len #1 + global.max$ substring$ }\n    's\n  if$\n}\nFUNCTION {format.lab.names}\n{ 's :=\n  \"\" 't :=\n  s #1 \"{vv~}{ll}\" format.name$\n  s num.names$ duplicate$\n  #2 >\n    { pop$\n      \" \" * bbl.etal emphasize *\n    }\n    { #2 <\n        'skip$\n        { s #2 \"{ff }{vv }{ll}{ jj}\" format.name$ \"others\" =\n            {\n              \" \" * bbl.etal emphasize *\n            }\n            { bbl.and space.word * s #2 \"{vv~}{ll}\" format.name$\n              * }\n          if$\n        }\n      if$\n    }\n  if$\n}\n\nFUNCTION {author.key.label}\n{ author empty$\n    { key empty$\n        { cite$ #1 #3 substring$ }\n        'key\n      if$\n    }\n    { author format.lab.names }\n  if$\n}\n\nFUNCTION {author.editor.key.label}\n{ author empty$\n    { editor empty$\n        { key empty$\n            { cite$ #1 #3 substring$ }\n            'key\n          if$\n        }\n        { editor format.lab.names }\n      if$\n    }\n    { author format.lab.names }\n  if$\n}\n\nFUNCTION {editor.key.label}\n{ editor empty$\n    { key empty$\n        { cite$ #1 #3 substring$ }\n        'key\n      if$\n    }\n    { editor format.lab.names }\n  if$\n}\n\nFUNCTION {calc.short.authors}\n{ type$ \"book\" =\n  type$ \"inbook\" =\n  or\n    'author.editor.key.label\n    { type$ \"proceedings\" =\n        'editor.key.label\n        'author.key.label\n      if$\n    }\n  if$\n  'short.list :=\n}\n\nFUNCTION {calc.label}\n{ calc.short.authors\n  short.list\n  \"(\"\n  *\n  year duplicate$ empty$\n  short.list key field.or.null = or\n     { pop$ \"\" }\n     'skip$\n  if$\n  *\n  'label :=\n}\n\nFUNCTION {sort.format.names}\n{ 's :=\n  #1 'nameptr :=\n  \"\"\n  s num.names$ 'numnames :=\n  numnames 'namesleft :=\n    { namesleft #0 > }\n    { s nameptr\n      \"{vv{ } }{ll{ }}{  f{ }}{  jj{ }}\"\n      format.name$ 't :=\n      nameptr #1 >\n        {\n          \"   \"  *\n          namesleft #1 = t \"others\" = and\n            { \"zzzzz\" 't := }\n            'skip$\n          if$\n          t sortify *\n        }\n        { t sortify * }\n      if$\n      nameptr #1 + 'nameptr :=\n      namesleft #1 - 'namesleft :=\n    }\n  while$\n}\n\nFUNCTION {sort.format.title}\n{ 't :=\n  \"A \" #2\n    \"An \" #3\n      \"The \" #4 t chop.word\n    chop.word\n  chop.word\n  sortify\n  #1 global.max$ substring$\n}\nFUNCTION {author.sort}\n{ author empty$\n    { key empty$\n        { \"to sort, need author or key in \" cite$ * warning$\n          \"\"\n        }\n        { key sortify }\n      if$\n    }\n    { author sort.format.names }\n  if$\n}\nFUNCTION {author.editor.sort}\n{ author empty$\n    { editor empty$\n        { key empty$\n            { \"to sort, need author, editor, or key in \" cite$ * warning$\n              \"\"\n            }\n            { key sortify }\n          if$\n        }\n        { editor sort.format.names }\n      if$\n    }\n    { author sort.format.names }\n  if$\n}\nFUNCTION {editor.sort}\n{ editor empty$\n    { key empty$\n        { \"to sort, need editor or key in \" cite$ * warning$\n          \"\"\n        }\n        { key sortify }\n      if$\n    }\n    { editor sort.format.names }\n  if$\n}\nFUNCTION {presort}\n{ calc.label\n  label sortify\n  \"    \"\n  *\n  type$ \"book\" =\n  type$ \"inbook\" =\n  or\n    'author.editor.sort\n    { type$ \"proceedings\" =\n        'editor.sort\n        'author.sort\n      if$\n    }\n  if$\n  #1 entry.max$ substring$\n  'sort.label :=\n  sort.label\n  *\n  \"    \"\n  *\n  title field.or.null\n  sort.format.title\n  *\n  #1 entry.max$ substring$\n  'sort.key$ :=\n}\n\nITERATE {presort}\nSORT\nSTRINGS { last.label next.extra }\nINTEGERS { last.extra.num last.extra.num.extended last.extra.num.blank number.label }\nFUNCTION {initialize.extra.label.stuff}\n{ #0 int.to.chr$ 'last.label :=\n  \"\" 'next.extra :=\n  #0 'last.extra.num :=\n  \"a\" chr.to.int$ #1 - 'last.extra.num.blank :=\n  last.extra.num.blank 'last.extra.num.extended :=\n  #0 'number.label :=\n}\nFUNCTION {forward.pass}\n{ last.label label =\n    { last.extra.num #1 + 'last.extra.num :=\n      last.extra.num \"z\" chr.to.int$ >\n       { \"a\" chr.to.int$ 'last.extra.num :=\n         last.extra.num.extended #1 + 'last.extra.num.extended :=\n       }\n       'skip$\n      if$\n      last.extra.num.extended last.extra.num.blank >\n        { last.extra.num.extended int.to.chr$\n          last.extra.num int.to.chr$\n          * 'extra.label := }\n        { last.extra.num int.to.chr$ 'extra.label := }\n      if$\n    }\n    { \"a\" chr.to.int$ 'last.extra.num :=\n      \"\" 'extra.label :=\n      label 'last.label :=\n    }\n  if$\n  number.label #1 + 'number.label :=\n}\nFUNCTION {reverse.pass}\n{ next.extra \"b\" =\n    { \"a\" 'extra.label := }\n    'skip$\n  if$\n  extra.label 'next.extra :=\n  extra.label\n  duplicate$ empty$\n    'skip$\n    { \"{\\natexlab{\" swap$ * \"}}\" * }\n  if$\n  'extra.label :=\n  label extra.label * 'label :=\n}\nEXECUTE {initialize.extra.label.stuff}\nITERATE {forward.pass}\nREVERSE {reverse.pass}\nFUNCTION {bib.sort.order}\n{ sort.label\n  \"    \"\n  *\n  year field.or.null sortify\n  *\n  \"    \"\n  *\n  title field.or.null\n  sort.format.title\n  *\n  #1 entry.max$ substring$\n  'sort.key$ :=\n}\nITERATE {bib.sort.order}\nSORT\nFUNCTION {begin.bib}\n{ preamble$ empty$\n    'skip$\n    { preamble$ write$ newline$ }\n  if$\n  \"\\begin{thebibliography}{\" number.label int.to.str$ * \"}\" *\n  write$ newline$\n  \"\\newcommand{\\enquote}[1]{``#1''}\"\n  write$ newline$\n  \"\\providecommand{\\natexlab}[1]{#1}\"\n  write$ newline$\n  \"\\providecommand{\\url}[1]{\\texttt{#1}}\"\n  write$ newline$\n  \"\\providecommand{\\urlprefix}{URL }\"\n  write$ newline$\n  \"\\expandafter\\ifx\\csname urlstyle\\endcsname\\relax\"\n  write$ newline$\n  \"  \\providecommand{\\doi}[1]{doi:\\discretionary{}{}{}#1}\\else\"\n  write$ newline$\n  \"  \\providecommand{\\doi}{doi:\\discretionary{}{}{}\\begingroup \\urlstyle{rm}\\Url}\\fi\"\n  write$ newline$\n  \"\\providecommand{\\eprint}[2][]{\\url{#2}}\"\n  write$ newline$\n}\nEXECUTE {begin.bib}\nEXECUTE {init.state.consts}\nITERATE {call.type$}\nFUNCTION {end.bib}\n{ newline$\n  \"\\end{thebibliography}\" write$ newline$\n}\nEXECUTE {end.bib}\n%% End of customized bst file\n%%\n%% End of file `jss.bst'.\n"
  },
  {
    "path": "vignettes/test/jss.cls",
    "content": "%%\n%% This is file `jss.cls',\n%% generated with the docstrip utility.\n%%\n%% The original source files were:\n%%\n%% jss.dtx  (with options: `class')\n%% \n%% IMPORTANT NOTICE:\n%% \n%% For the copyright see the source file.\n%% \n%% Any modified versions of this file must be renamed\n%% with new filenames distinct from jss.cls.\n%% \n%% For distribution of the original source see the terms\n%% for copying and modification in the file jss.dtx.\n%% \n%% This generated file may be distributed as long as the\n%% original source files, as listed above, are part of the\n%% same distribution. (The sources need not necessarily be\n%% in the same archive or directory.)\n\\def\\fileversion{3.0}\n\\def\\filename{jss}\n\\def\\filedate{2015/09/01}\n%%\n%% Package `jss' to use with LaTeX2e for JSS publications (http://www.jstatsoft.org/)\n%% License: GPL-2 | GPL-3\n%% Copyright: (C) Achim Zeileis\n%% Please report errors to Achim.Zeileis@R-project.org\n%%\n\\NeedsTeXFormat{LaTeX2e}\n\\ProvidesClass{jss}[\\filedate\\space\\fileversion\\space jss class by Achim Zeileis]\n%% options\n\\newif\\if@article\n\\newif\\if@codesnippet\n\\newif\\if@bookreview\n\\newif\\if@softwarereview\n\\newif\\if@review\n\\newif\\if@shortnames\n\\newif\\if@nojss\n\\newif\\if@notitle\n\\newif\\if@noheadings\n\\newif\\if@nofooter\n\n\\@articletrue\n\\@codesnippetfalse\n\\@bookreviewfalse\n\\@softwarereviewfalse\n\\@reviewfalse\n\\@shortnamesfalse\n\\@nojssfalse\n\\@notitlefalse\n\\@noheadingsfalse\n\\@nofooterfalse\n\n\\DeclareOption{article}{\\@articletrue%\n  \\@codesnippetfalse \\@bookreviewfalse \\@softwarereviewfalse}\n\\DeclareOption{codesnippet}{\\@articlefalse%\n  \\@codesnippettrue \\@bookreviewfalse \\@softwarereviewfalse}\n\\DeclareOption{bookreview}{\\@articlefalse%\n  \\@codesnippetfalse \\@bookreviewtrue \\@softwarereviewfalse}\n\\DeclareOption{softwarereview}{\\@articlefalse%\n  \\@codesnippetfalse \\@bookreviewfalse \\@softwarereviewtrue}\n\\DeclareOption{shortnames}{\\@shortnamestrue}\n\\DeclareOption{nojss}{\\@nojsstrue}\n\\DeclareOption{notitle}{\\@notitletrue}\n\\DeclareOption{noheadings}{\\@noheadingstrue}\n\\DeclareOption{nofooter}{\\@nofootertrue}\n\n\\ProcessOptions\n\\LoadClass[11pt,a4paper,twoside]{article}\n%% required packages\n\\RequirePackage{graphicx,color,ae,fancyvrb}\n\\RequirePackage[T1]{fontenc}\n\\IfFileExists{upquote.sty}{\\RequirePackage{upquote}}{}\n%% bibliography\n\\if@shortnames\n  \\usepackage[authoryear,round]{natbib}\n\\else\n  \\usepackage[authoryear,round,longnamesfirst]{natbib}\n\\fi\n\\bibpunct{(}{)}{;}{a}{}{,}\n\\bibliographystyle{jss}\n%% page layout\n\\topmargin 0pt\n\\textheight 46\\baselineskip\n\\advance\\textheight by \\topskip\n\\oddsidemargin 0.1in\n\\evensidemargin 0.15in\n\\marginparwidth 1in\n\\oddsidemargin 0.125in\n\\evensidemargin 0.125in\n\\marginparwidth 0.75in\n\\textwidth 6.125in\n%% paragraphs\n\\setlength{\\parskip}{0.7ex plus0.1ex minus0.1ex}\n\\setlength{\\parindent}{0em}\n%% for all publications\n\\newcommand{\\Address}[1]{\\def\\@Address{#1}}\n\\newcommand{\\Plaintitle}[1]{\\def\\@Plaintitle{#1}}\n\\newcommand{\\Shorttitle}[1]{\\def\\@Shorttitle{#1}}\n\\newcommand{\\Plainauthor}[1]{\\def\\@Plainauthor{#1}}\n\\newcommand{\\Volume}[1]{\\def\\@Volume{#1}}\n\\newcommand{\\Year}[1]{\\def\\@Year{#1}}\n\\newcommand{\\Month}[1]{\\def\\@Month{#1}}\n\\newcommand{\\Issue}[1]{\\def\\@Issue{#1}}\n\\newcommand{\\Submitdate}[1]{\\def\\@Submitdate{#1}}\n%% for articles and code snippets\n\\newcommand{\\Acceptdate}[1]{\\def\\@Acceptdate{#1}}\n\\newcommand{\\Abstract}[1]{\\def\\@Abstract{#1}}\n\\newcommand{\\Keywords}[1]{\\def\\@Keywords{#1}}\n\\newcommand{\\Plainkeywords}[1]{\\def\\@Plainkeywords{#1}}\n%% for book and software reviews\n\\newcommand{\\Reviewer}[1]{\\def\\@Reviewer{#1}}\n\\newcommand{\\Booktitle}[1]{\\def\\@Booktitle{#1}}\n\\newcommand{\\Bookauthor}[1]{\\def\\@Bookauthor{#1}}\n\\newcommand{\\Publisher}[1]{\\def\\@Publisher{#1}}\n\\newcommand{\\Pubaddress}[1]{\\def\\@Pubaddress{#1}}\n\\newcommand{\\Pubyear}[1]{\\def\\@Pubyear{#1}}\n\\newcommand{\\ISBN}[1]{\\def\\@ISBN{#1}}\n\\newcommand{\\Pages}[1]{\\def\\@Pages{#1}}\n\\newcommand{\\Price}[1]{\\def\\@Price{#1}}\n\\newcommand{\\Plainreviewer}[1]{\\def\\@Plainreviewer{#1}}\n\\newcommand{\\Softwaretitle}[1]{\\def\\@Softwaretitle{#1}}\n\\newcommand{\\URL}[1]{\\def\\@URL{#1}}\n\\newcommand{\\DOI}[1]{\\def\\@DOI{#1}}\n%% for internal use\n\\newcommand{\\Seriesname}[1]{\\def\\@Seriesname{#1}}\n\\newcommand{\\Hypersubject}[1]{\\def\\@Hypersubject{#1}}\n\\newcommand{\\Hyperauthor}[1]{\\def\\@Hyperauthor{#1}}\n\\newcommand{\\Footername}[1]{\\def\\@Footername{#1}}\n\\newcommand{\\Firstdate}[1]{\\def\\@Firstdate{#1}}\n\\newcommand{\\Seconddate}[1]{\\def\\@Seconddate{#1}}\n\\newcommand{\\Reviewauthor}[1]{\\def\\@Reviewauthor{#1}}\n%% defaults\n\\author{Firstname Lastname\\\\Affiliation}\n\\title{Title}\n\\Abstract{---!!!---an abstract is required---!!!---}\n\\Plainauthor{\\@author}\n\\Volume{VV}\n\\Year{YYYY}\n\\Month{MMMMMM}\n\\Issue{II}\n\\Submitdate{yyyy-mm-dd}\n\\Acceptdate{yyyy-mm-dd}\n\\Address{\n  Firstname Lastname\\\\\n  Affiliation\\\\\n  Address, Country\\\\\n  E-mail: \\email{name@address}\\\\\n  URL: \\url{http://link/to/webpage/}\n}\n\n\\Reviewer{Firstname Lastname\\\\Affiliation}\n\\Plainreviewer{Firstname Lastname}\n\\Booktitle{Book Title}\n\\Bookauthor{Book Author}\n\\Publisher{Publisher}\n\\Pubaddress{Publisher's Address}\n\\Pubyear{YYY}\n\\ISBN{x-xxxxx-xxx-x}\n\\Pages{xv + 123}\n\\Price{USD 69.95 (P)}\n\\URL{http://link/to/webpage/}\n\\DOI{10.18637/jss.v000.i00}\n\\if@article\n  \\Seriesname{Issue}\n  \\Hypersubject{Journal of Statistical Software}\n  \\Plaintitle{\\@title}\n  \\Shorttitle{\\@title}\n  \\Plainkeywords{\\@Keywords}\n\\fi\n\n\\if@codesnippet\n  \\Seriesname{Code Snippet}\n  \\Hypersubject{Journal of Statistical Software -- Code Snippets}\n  \\Plaintitle{\\@title}\n  \\Shorttitle{\\@title}\n  \\Plainkeywords{\\@Keywords}\n\\fi\n\n\\if@bookreview\n  \\Seriesname{Book Review}\n  \\Hypersubject{Journal of Statistical Software -- Book Reviews}\n  \\Plaintitle{\\@Booktitle}\n  \\Shorttitle{\\@Booktitle}\n  \\Reviewauthor{\\@Bookauthor\\\\\n                \\@Publisher, \\@Pubaddress, \\@Pubyear.\\\\\n                ISBN~\\@ISBN. \\@Pages~pp. \\@Price.\\\\\n                \\url{\\@URL}}\n  \\Plainkeywords{}\n  \\@reviewtrue\n\\fi\n\n\\if@softwarereview\n  \\Seriesname{Software Review}\n  \\Hypersubject{Journal of Statistical Software -- Software Reviews}\n  \\Plaintitle{\\@Softwaretitle}\n  \\Shorttitle{\\@Softwaretitle}\n  \\Booktitle{\\@Softwaretitle}\n  \\Reviewauthor{\\@Publisher, \\@Pubaddress. \\@Price.\\\\\n                \\url{\\@URL}}\n  \\Plainkeywords{}\n  \\@reviewtrue\n\\fi\n\n\\if@review\n  \\Hyperauthor{\\@Plainreviewer}\n  \\Keywords{}\n  \\Footername{Reviewer}\n  \\Firstdate{\\textit{Published:} \\@Submitdate}\n  \\Seconddate{}\n\\else\n  \\Hyperauthor{\\@Plainauthor}\n  \\Keywords{---!!!---at least one keyword is required---!!!---}\n  \\Footername{Affiliation}\n  \\Firstdate{\\textit{Submitted:} \\@Submitdate}\n  \\Seconddate{\\textit{Accepted:} \\@Acceptdate}\n\\fi\n%% Sweave(-like)\n\\DefineVerbatimEnvironment{Sinput}{Verbatim}{fontshape=sl}\n\\DefineVerbatimEnvironment{Soutput}{Verbatim}{}\n\\DefineVerbatimEnvironment{Scode}{Verbatim}{fontshape=sl}\n\\newenvironment{Schunk}{}{}\n\\DefineVerbatimEnvironment{Code}{Verbatim}{}\n\\DefineVerbatimEnvironment{CodeInput}{Verbatim}{fontshape=sl}\n\\DefineVerbatimEnvironment{CodeOutput}{Verbatim}{}\n\\newenvironment{CodeChunk}{}{}\n\\setkeys{Gin}{width=0.8\\textwidth}\n%% footer\n\\newlength{\\footerskip}\n\\setlength{\\footerskip}{2.5\\baselineskip plus 2ex minus 0.5ex}\n\n\\newcommand{\\makefooter}{%\n  \\vspace{\\footerskip}\n\n  \\if@nojss\n    \\begin{samepage}\n    \\textbf{\\large \\@Footername: \\nopagebreak}\\\\[.3\\baselineskip] \\nopagebreak\n    \\@Address \\nopagebreak\n    \\end{samepage}\n  \\else\n    \\begin{samepage}\n    \\textbf{\\large \\@Footername: \\nopagebreak}\\\\[.3\\baselineskip] \\nopagebreak\n    \\@Address \\nopagebreak\n    \\vfill\n    \\hrule \\nopagebreak\n    \\vspace{.1\\baselineskip}\n    {\\fontfamily{pzc} \\fontsize{13}{15} \\selectfont Journal of Statistical Software}\n    \\hfill\n    \\url{http://www.jstatsoft.org/}\\\\ \\nopagebreak\n    published by the Foundation for Open Access Statistics\n    \\hfill\n    \\url{http://www.foastat.org/}\\\\[.3\\baselineskip] \\nopagebreak\n    {\\@Month{} \\@Year, Volume~\\@Volume, \\@Seriesname~\\@Issue}\n    \\hfill\n    \\@Firstdate\\\\ \\nopagebreak\n    {\\href{https://doi.org/\\@DOI}{\\tt doi:\\@DOI}}\n    \\hfill\n    \\@Seconddate  \\nopagebreak\n    \\vspace{.3\\baselineskip}\n    \\hrule\n    \\end{samepage}\n  \\fi\n}\n\\if@nofooter\n  %% \\AtEndDocument{\\makefooter}\n\\else\n  \\AtEndDocument{\\makefooter}\n\\fi\n%% required packages\n\\RequirePackage{hyperref}\n%% new \\maketitle\n\\def\\@myoddhead{\n  {\\color{white} JSS}\\\\[-1.42cm]\n  \\hspace{-2em} \\includegraphics[height=23mm,keepaspectratio]{jsslogo} \\hfill\n  \\parbox[b][23mm]{118mm}{\\hrule height 3pt\n   \\center{\n   {\\fontfamily{pzc} \\fontsize{28}{32} \\selectfont Journal of Statistical Software}\n   \\vfill\n   {\\it \\small \\@Month{} \\@Year, Volume~\\@Volume, \\@Seriesname~\\@Issue.%\n            \\hfill \\href{https://doi.org/\\@DOI}{doi:\\,\\@DOI}}}\\\\[0.1cm]\n     \\hrule height 3pt}}\n\\if@review\n  \\renewcommand{\\maketitle}{\n  \\if@nojss\n    %% \\@oddhead{\\@myoddhead}\\\\[3\\baselineskip]\n  \\else\n    \\@oddhead{\\@myoddhead}\\\\[3\\baselineskip]\n  \\fi\n    {\\large\n    \\noindent\n    Reviewer: \\@Reviewer\n    \\vspace{\\baselineskip}\n    \\hrule\n    \\vspace{\\baselineskip}\n    \\textbf{\\@Booktitle}\n    \\begin{quotation} \\noindent\n    \\@Reviewauthor\n    \\end{quotation}\n    \\vspace{0.7\\baselineskip}\n    \\hrule\n    \\vspace{1.3\\baselineskip}\n    }\n\n    \\thispagestyle{empty}\n    \\if@nojss\n      \\markboth{\\centerline{\\@Shorttitle}}{\\centerline{\\@Hyperauthor}}\n    \\else\n      \\markboth{\\centerline{\\@Shorttitle}}{\\centerline{\\@Hypersubject}}\n    \\fi\n    \\pagestyle{myheadings}\n  }\n\\else\n  \\def\\maketitle{\n  \\if@nojss\n    %% \\@oddhead{\\@myoddhead} \\par\n  \\else\n    \\@oddhead{\\@myoddhead} \\par\n  \\fi\n   \\begingroup\n     \\def\\thefootnote{\\fnsymbol{footnote}}\n     \\def\\@makefnmark{\\hbox to 0pt{$^{\\@thefnmark}$\\hss}}\n     \\long\\def\\@makefntext##1{\\parindent 1em\\noindent\n                              \\hbox to1.8em{\\hss $\\m@th ^{\\@thefnmark}$}##1}\n     \\@maketitle \\@thanks\n   \\endgroup\n   \\setcounter{footnote}{0}\n\n   \\if@noheadings\n    %% \\markboth{\\centerline{\\@Shorttitle}}{\\centerline{\\@Hypersubject}}\n    \\else\n     \\thispagestyle{empty}\n      \\if@nojss\n        \\markboth{\\centerline{\\@Shorttitle}}{\\centerline{\\@Hyperauthor}}\n      \\else\n        \\markboth{\\centerline{\\@Shorttitle}}{\\centerline{\\@Hypersubject}}\n      \\fi\n     \\pagestyle{myheadings}\n   \\fi\n\n   \\let\\maketitle\\relax \\let\\@maketitle\\relax\n   \\gdef\\@thanks{}\\gdef\\@author{}\\gdef\\@title{}\\let\\thanks\\relax\n  }\n\n  \\def\\@maketitle{\\vbox{\\hsize\\textwidth \\linewidth\\hsize\n  \\if@nojss\n    %% \\vskip 1in\n  \\else\n    \\vskip 1in\n  \\fi\n   {\\centering\n   {\\LARGE\\bf \\@title\\par}\n   \\vskip 0.2in plus 1fil minus 0.1in\n   {\n       \\def\\and{\\unskip\\enspace{\\rm and}\\enspace}%\n       \\def\\And{\\end{tabular}\\hss \\egroup \\hskip 1in plus 2fil\n          \\hbox to 0pt\\bgroup\\hss \\begin{tabular}[t]{c}\\large\\bf\\rule{\\z@}{24pt}\\ignorespaces}%\n       \\def\\AND{\\end{tabular}\\hss\\egroup \\hfil\\hfil\\egroup\n          \\vskip 0.1in plus 1fil minus 0.05in\n          \\hbox to \\linewidth\\bgroup\\rule{\\z@}{10pt} \\hfil\\hfil\n          \\hbox to 0pt\\bgroup\\hss \\begin{tabular}[t]{c}\\large\\bf\\rule{\\z@}{24pt}\\ignorespaces}\n       \\hbox to \\linewidth\\bgroup\\rule{\\z@}{10pt} \\hfil\\hfil\n       \\hbox to 0pt\\bgroup\\hss \\begin{tabular}[t]{c}\\large\\bf\\rule{\\z@}{24pt}\\@author\n       \\end{tabular}\\hss\\egroup\n   \\hfil\\hfil\\egroup}\n   \\vskip 0.3in minus 0.1in\n   \\hrule\n   \\begin{abstract}\n   \\@Abstract\n   \\end{abstract}}\n   \\textit{Keywords}:~\\@Keywords.\n   \\vskip 0.1in minus 0.05in\n   \\hrule\n   \\vskip 0.2in minus 0.1in\n  }}\n\\fi\n%% sections, subsections, and subsubsections\n\\newlength{\\preXLskip}\n\\newlength{\\preLskip}\n\\newlength{\\preMskip}\n\\newlength{\\preSskip}\n\\newlength{\\postMskip}\n\\newlength{\\postSskip}\n\\setlength{\\preXLskip}{1.8\\baselineskip plus 0.5ex minus 0ex}\n\\setlength{\\preLskip}{1.5\\baselineskip plus 0.3ex minus 0ex}\n\\setlength{\\preMskip}{1\\baselineskip plus 0.2ex minus 0ex}\n\\setlength{\\preSskip}{.8\\baselineskip plus 0.2ex minus 0ex}\n\\setlength{\\postMskip}{.5\\baselineskip plus 0ex minus 0.1ex}\n\\setlength{\\postSskip}{.3\\baselineskip plus 0ex minus 0.1ex}\n\n\\newcommand{\\jsssec}[2][default]{\\vskip \\preXLskip%\n  \\pdfbookmark[1]{#1}{Section.\\thesection.#1}%\n  \\refstepcounter{section}%\n  \\centerline{\\textbf{\\Large \\thesection. #2}} \\nopagebreak\n  \\vskip \\postMskip \\nopagebreak}\n\\newcommand{\\jsssecnn}[1]{\\vskip \\preXLskip%\n  \\centerline{\\textbf{\\Large #1}} \\nopagebreak\n  \\vskip \\postMskip \\nopagebreak}\n\n\\newcommand{\\jsssubsec}[2][default]{\\vskip \\preMskip%\n  \\pdfbookmark[2]{#1}{Subsection.\\thesubsection.#1}%\n  \\refstepcounter{subsection}%\n  \\textbf{\\large \\thesubsection. #2} \\nopagebreak\n  \\vskip \\postSskip \\nopagebreak}\n\\newcommand{\\jsssubsecnn}[1]{\\vskip \\preMskip%\n  \\textbf{\\large #1} \\nopagebreak\n  \\vskip \\postSskip \\nopagebreak}\n\n\\newcommand{\\jsssubsubsec}[2][default]{\\vskip \\preSskip%\n  \\pdfbookmark[3]{#1}{Subsubsection.\\thesubsubsection.#1}%\n  \\refstepcounter{subsubsection}%\n  {\\large \\textit{#2}} \\nopagebreak\n  \\vskip \\postSskip \\nopagebreak}\n\\newcommand{\\jsssubsubsecnn}[1]{\\vskip \\preSskip%\n  {\\textit{\\large #1}} \\nopagebreak\n  \\vskip \\postSskip \\nopagebreak}\n\n\\newcommand{\\jsssimplesec}[2][default]{\\vskip \\preLskip%\n%%  \\pdfbookmark[1]{#1}{Section.\\thesection.#1}%\n  \\refstepcounter{section}%\n  \\textbf{\\large #1} \\nopagebreak\n  \\vskip \\postSskip \\nopagebreak}\n\\newcommand{\\jsssimplesecnn}[1]{\\vskip \\preLskip%\n  \\textbf{\\large #1} \\nopagebreak\n  \\vskip \\postSskip \\nopagebreak}\n\n\\if@review\n  \\renewcommand{\\section}{\\secdef \\jsssimplesec \\jsssimplesecnn}\n  \\renewcommand{\\subsection}{\\secdef \\jsssimplesec \\jsssimplesecnn}\n  \\renewcommand{\\subsubsection}{\\secdef \\jsssimplesec \\jsssimplesecnn}\n\\else\n  \\renewcommand{\\section}{\\secdef \\jsssec \\jsssecnn}\n  \\renewcommand{\\subsection}{\\secdef \\jsssubsec \\jsssubsecnn}\n  \\renewcommand{\\subsubsection}{\\secdef \\jsssubsubsec \\jsssubsubsecnn}\n\\fi\n%% colors\n\\definecolor{Red}{rgb}{0.5,0,0}\n\\definecolor{Blue}{rgb}{0,0,0.5}\n\\if@review\n  \\hypersetup{%\n    hyperindex = {true},\n    colorlinks = {true},\n    linktocpage = {true},\n    plainpages = {false},\n    linkcolor = {Blue},\n    citecolor = {Blue},\n    urlcolor = {Red},\n    pdfstartview = {Fit},\n    pdfpagemode = {None},\n    pdfview = {XYZ null null null}\n  }\n\\else\n  \\hypersetup{%\n    hyperindex = {true},\n    colorlinks = {true},\n    linktocpage = {true},\n    plainpages = {false},\n    linkcolor = {Blue},\n    citecolor = {Blue},\n    urlcolor = {Red},\n    pdfstartview = {Fit},\n    pdfpagemode = {UseOutlines},\n    pdfview = {XYZ null null null}\n  }\n\\fi\n\\if@nojss\n  \\AtBeginDocument{\n    \\hypersetup{%\n      pdfauthor = {\\@Hyperauthor},\n      pdftitle = {\\@Plaintitle},\n      pdfkeywords = {\\@Plainkeywords}\n    }\n  }\n\\else\n  \\AtBeginDocument{\n    \\hypersetup{%\n      pdfauthor = {\\@Hyperauthor},\n      pdftitle = {\\@Plaintitle},\n      pdfsubject = {\\@Hypersubject},\n      pdfkeywords = {\\@Plainkeywords}\n    }\n  }\n\\fi\n\\if@notitle\n  %% \\AtBeginDocument{\\maketitle}\n\\else\n  \\AtBeginDocument{\\maketitle}\n\\fi\n%% commands\n\\newcommand\\code{\\bgroup\\@makeother\\_\\@makeother\\~\\@makeother\\$\\@codex}\n\\def\\@codex#1{{\\normalfont\\ttfamily\\hyphenchar\\font=-1 #1}\\egroup}\n%%\\let\\code=\\texttt\n\\let\\proglang=\\textsf\n\\newcommand{\\pkg}[1]{{\\fontseries{b}\\selectfont #1}}\n\\newcommand{\\email}[1]{\\href{mailto:#1}{\\normalfont\\texttt{#1}}}\n\\ifx\\csname urlstyle\\endcsname\\relax\n  \\newcommand\\@doi[1]{doi:\\discretionary{}{}{}#1}\\else\n  \\newcommand\\@doi{doi:\\discretionary{}{}{}\\begingroup\n\\urlstyle{tt}\\Url}\\fi\n\\newcommand{\\doi}[1]{\\href{https://doi.org/#1}{\\normalfont\\texttt{\\@doi{#1}}}}\n\\newcommand{\\E}{\\mathsf{E}}\n\\newcommand{\\VAR}{\\mathsf{VAR}}\n\\newcommand{\\COV}{\\mathsf{COV}}\n\\newcommand{\\Prob}{\\mathsf{P}}\n\\endinput\n%%\n%% End of file `jss.cls'.\n"
  },
  {
    "path": "vignettes/test/long-toc.Rmd",
    "content": "---\ntitle: \"Long TOC\"\n---\n\n```{r include = FALSE}\nknitr::opts_chunk$set(collapse = TRUE, comment = \"#>\")\n```\n\nThis vignette tests has a very long TOC. You should be able to navigate to a heading near the bottom of the doc without having to scroll all the way down.\n\n```{r, echo = FALSE}\nh2 <- paste0(\"## Heading \", t(outer(letters, 1:9, paste0)))\nknitr::asis_output(paste(h2, collapse = \"\\n\\n\"))\n```\n\n"
  },
  {
    "path": "vignettes/test/pdf.Rmd",
    "content": "---\ntitle: \"PDF\"\noutput: pdf_document\npkgdown:\n  as_is: true\n  extension: pdf\n---\n\n# Heading\n\nSome text\n\n"
  },
  {
    "path": "vignettes/test/quarto-features.qmd",
    "content": "---\ntitle: quarto features\nknitr:\n  opts_chunk: \n    collapse: true\n    comment: '#>'\nbibliography: jss.bib\n---\n\n## Citations\n\n* Citation: @JSSv059i10\n\n## Code annotations\n\n```r\nlibrary(tidyverse)\nlibrary(palmerpenguins)\npenguins |>                                      # <1>\n  mutate(                                        # <2>\n    bill_ratio = bill_depth_mm / bill_length_mm, # <2>\n    bill_area  = bill_depth_mm * bill_length_mm  # <2>\n  )                                              # <2>\n```\n1. Take `penguins`, and then,\n2. add new columns for the bill ratio and bill area.\n\n## Diagrams\n\n```{mermaid}\nflowchart LR\n  A[Hard edge] --> B(Round edge)\n  B --> C{Decision}\n  C --> D[Result one]\n  C --> E[Result two]\n```\n\n## HTML widgets\n\n```{r, echo=FALSE}\ndir <- tempdir()\npath1 <- file.path(dir, \"a.txt\")\nwriteLines(letters, path1)\npath2 <- file.path(dir, \"b.txt\")\nwriteLines(letters[-(10:11)], path2)\n\ndiffviewer::visual_diff(path1, path2)\n```\n\n## Keyboard\n\n* Keyboard shortcut: {{< kbd Shift-Ctrl-P >}}\n\n## References\n"
  },
  {
    "path": "vignettes/test/rendering.Rmd",
    "content": "---\ntitle: \"Output Rendering\"\nsubtitle: \"Subtitle is skipped from the TOC\"\nauthor: \"Author is skipped from the TOC\"\ndate: \"Date is skipped from the TOC\"\n---\n\n```{r}\n#| include: FALSE\nknitr::opts_chunk$set(collapse = TRUE, comment = \"#>\")\n```\n\nThis vignette tests pkgdown output rendering for several use cases.\n\n## Footnotes\n\nYay[^footnote]\n\n[^footnote]: Including **footnotes**! 😁\n\n## Figures\n\n```{r}\n#| fig.alt: Test plot\nplot(1:10)\n```\n\n## External files\n\n```{r}\nx <- readLines(\"test.txt\")\nx\n```\n\n![bacon](bacon.jpg)\n\n## Details tag\n\n<details>\nThis should only be shown when required\n</details>\n\n<details>\n<summary>Multiple paragraphs</summary>\nFirst paragraph\n\nSecond paragraph\n</details>\n\n<details>\n<summary>Some R code</summary>\n  \n```{r}\n1 + 2\n```\n</details>\n\n## Tables\n\n| col 1 | col 2 | col 3 | col 4 |\n|:---------------|:-----------|:-------:|:---------:|\n| Brightness     | Total brightness, total reflectance, spectral intensity | $$y = x^2$$ | test |\n\n## Math\n\n$$f(x) = \\dfrac{1}{\\sqrt{2\\pi\\sigma^2}} e^{-\\frac{(x-\\mu^2)}{2\\sigma^2}}$$\n\nInline equations: $y=x^2$\n\n## Code\n\n### Line width\n\n```{r}\npkgdown:::ruler()\n\ncat(rep(\"x \", 100), sep = \"\")\ncat(rep(\"xy\", 100), sep = \"\")\n```\n\n### Should be highlighted\n\nValid R code in `\\preformatted{}`:\n\n```\nmean(a + 1)\n```\n\nR code in `R` block:\n\n```R\nmean(a + 1)\n```\n\nR code in `r` block:\n\n```R\nmean(a + 1)\n```\n\nYaml\n\n```yaml\nyaml: [a, 1]\n```\n\n### Shouldn't be highlighted\n\nNon-R code in `\\preformatted{}`\n\n```\nyaml: [a, b, c]\n```\n\n### Crayon\n\n```{r}\ncat(cli::col_red(\"This is red\"), \"\\n\")\ncat(cli::col_blue(\"This is blue\\n\"), \"\\n\")\n\nmessage(cli::col_green(\"This is green\"))\n\nwarning(cli::style_bold(\"This is bold\"))\n```\nSome text\n\n```{r}\n#| error: TRUE\nstop(cli::style_italic(\"This is italic\"))\n```\n\nSome more text\n\n## Quoted text\n\n> Single-line quote about something miscellaneous.\n\n| Flush\n|  1 space indent\n|   2 space indent\n|    3 space indent\n\n## This section is unnumbered {-}\n\nThere should however be no bug here!\n\n## Tabsets\n\n### Tabset with pills {.tabset .tabset-pills}\n\n#### Tab 1\n\nblablablabla\n\n```r\n1 + 1\n```\n\nShould be \"cool\" heading below\n\n##### cool\n\nStuff\n\n#### Tab 2\n\nblop\n\n### Tabset without pills {.tabset}\n\n#### Tab 1\n\nsomething nice\n\n```{r}\n#| fig.alt: Another test plot\nplot(1:42)\n```\n\n#### Tab 2 {.active}\n\nThis tab should be active\n\n### Fading tabset {.tabset .tabset-fade}\n\n#### English\n\nHello!\n\n#### French\n\nBonjour!\n\n#### German\n\nGuten tag.\n\n## Deep headings\n\n### Heading 3\n\n#### Heading 4\n\n##### Heading 5\n\n## Very long words\n\nThis word should be broken across multiple lines on mobile, rather than making the page scroll horizontally:\n\nCcccccccccccaaaaaaaaaaaaaaatttttttttttttttttssssssssssssssss \n"
  },
  {
    "path": "vignettes/test/short.Rmd",
    "content": "---\ntitle: \"A short page\"\n---\n\nThe footer should hug the bottom of the viewport.\n"
  },
  {
    "path": "vignettes/test/test.txt",
    "content": "a\nb\nc\nd\n"
  },
  {
    "path": "vignettes/test/widgets.Rmd",
    "content": "---\ntitle: \"HTML widgets\"\n---\n\n```{r, include = FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\"\n)\n```\n\n## Widgets\n\nTest spacing above widget.\n\n```{r, echo=FALSE}\npath1 <- tempfile()\nwriteLines(letters, path1)\npath2 <- tempfile()\nwriteLines(letters[-(10:11)], path2)\n\ndiffviewer::visual_diff(path1, path2)\n```\n\nTest spacing below widget.\n"
  },
  {
    "path": "vignettes/translations.Rmd",
    "content": "---\ntitle: \"Translations\"\noutput: rmarkdown::html_vignette\ndescription: >\n  If your documentation is written in a language other than English, you can\n  automatically translate the text generated by pkgdown by setting the `lang`\n  field. If your language isn't currently supported, we'll show you how you can\n  provide translations.\nvignette: >\n  %\\VignetteIndexEntry{Translations}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n```{r}\n#| include: false\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\"\n)\n```\n\nIf your documentation (`.Rd` and `.Rmd`) is written in a language other than English, declare it by setting setting `lang` to the [language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your language:\n\n``` yaml\nlang: es\n```\n\nThis will be used to set the language of the web page and to translate the English words that pkgdown generates on your site.\nCurrent available translations are:\n\n-   `ca`: Catalan\n-   `de`: German\n-   `dk`: Danish\n-   `es`: Spanish\n-   `fr`: French\n-   `ja`: Japanese\n-   `ko`: Korean\n-   `pt`: Portuguese\n-   `tr`: Turkish\n-   `zh_CN`: Chinese (simplified)\n\nAs you can see, most language codes are two letters, but if a language has multiple variants, it gets a longer form which can be used to disambiguate the options. For example, Chinese can use one of two forms: simplified (used in China and Singapore) or traditional (used in Taiwan and Hong Kong). Another example would be providing specific French Canadian translations by using code `fr_CN`.\n\nIf you deploy your site on Github Actions, you will need to update the locale and set the `env` during `pkgdown::build_site()` to the same language code you set in `_pkgdown.yml`, including the country code. For example, for `lang: es`, you would use `es_ES.UTF-8`:\n\n``` yaml\n      - name: Set locale to Spanish\n        run: |\n          sudo locale-gen es_ES.UTF-8\n          sudo update-locale LANG=es_ES.UTF-8\n        shell: bash\n\n      - name: Build site\n        run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE)\n        shell: Rscript {0}\n        env:\n          LANG: es_ES.UTF-8\n```\n## Translations\n\nTranslations are contributed by community members so if your language is not currently available, you could be the one to add it!\n\nTo get started, first check the [pkgdown issues](https://github.com/r-lib/pkgdown/issues) to see if anyone has filed an existing issue. If so, the person who filed the issue might make for a great collaborator 😀.\n\nNext, install [potools](https://michaelchirico.github.io/potools/) and [usethis](https://usethis.r-lib.org):\n\n```{r}\n#| eval: false\ninstall.packages(c(\"potools\", \"usethis\"))\n```\n\nYou'll then need to familiarise yourself with the basics of [translations with potools](https://michaelchirico.github.io/potools/articles/translators.html) and [creating pull requests](https://usethis.r-lib.org/articles/pr-functions.html) with usethis.\n\nIf you don't already know it, you'll need to look up the ISO 639-1 abbreviation for [your language](https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes). In the examples below, I'll pretend I'm providing translations for Zulu, which has code `zu`.\n\nStart by initialising a pull request:\n\n```{r}\n#| eval: false\nusethis::pr_init(\"translation-zu\")\n```\n\nThen create the translation file by running `potools::po_create(\"zu\")`, open `po/R-zu.po`, and starting filling in the translations.\n\nIf you have access to Claude or similar, you can try prepopulating the translations, with a prompt like this:\n\n```\nYou are an experienced translator. Create new a new translation for Hindi in po/R-hi.po. These are GNU gettext translations for pkgdown, a tool used to generate websites for R packages.\n\nTranslation advice:\n\n- For languages that use genedered nouns, do your best to generate inclusive translations, e.g. \"Beitragende:r\" or \"auteur·rice\".\n- If you need to change the order of substititions (e.g. %s) from English version, use %1$s to identify the first substituion %2$s, etc. Only use this form when the translated word order is different.\n- You should choose to be succinct and contextually-correct even when there is not a precise translation.\n- Use the \"Last-Translator\" field to document the tool (e.g. \"Positron Assistant\") and language model used for the translation (e.g. \"Claude Sonnet 4.5\")\n```\n\n> You are an R developer who is fluent in English and Zulu. You love to do careful, high quality translations in your spare time. Complete the following po file for the R pkgdown package (which creates websites for R packages) by supplying translations for Zulu. Use inclusive gender forms where possible.\n\nThen copy and paste the complete contents of the `.po` file .\n\nYou can check your work by adding `lang: zu` to your `_pkgdown.yml` then running:\n\n```{r}\n#| eval: false\npotools::po_compile()\ndevtools::load_all()\nbuild_site(\"~/path/to/your/site\")\n```\n\nOnce you're happy with your work, make sure to compile the changes:\n\n```{r}\n#| eval: false\npotools::po_compile()\n```\n\nThen commit your changes to Git and submit your pull request for review:\n\n```{r}\n#| eval: false\nusethis::pr_push()\n```\n"
  }
]