[
  {
    "path": ".Rbuildignore",
    "content": "^.*\\.Rproj$\n^\\.Rproj\\.user$\n^LICENSE\\.md$\n^TODO\\.md$\n^README\\.Rmd$\n^AGENTS\\.md$\n^index\\.Rmd$\n^advantages\\.Rmd$\n^release-process\\.R$\n^\\.travis\\.yml$\n^appveyor\\.yml$\n^_pkgdown\\.yml$\n^docs$\n^pkgdown$\n^codecov\\.yml$\nwebsite-articles\ntutorials\nrevdep\n^doc$\n^Meta$\n^cran-comments\\.md$\n^CRAN-RELEASE$\n^\\.github$\n^CRAN-SUBMISSION$\n^\\.positai$\n^\\.claude$\n"
  },
  {
    "path": ".github/.gitignore",
    "content": "*.html\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\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          - {os: windows-latest, r: 'release'}\n          - {os: ubuntu-latest,   r: 'devel', http-user-agent: 'release'}\n          - {os: ubuntu-latest,   r: 'release'}\n          - {os: ubuntu-latest,   r: 'oldrel-1'}\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-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        with:\n          upload-snapshots: true\n          build_args: 'c(\"--no-manual\",\"--compact-vignettes=gs+qpdf\")'\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-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      - 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\n.Ruserdata\ninst/doc\ndoc\nMeta\n.DS_Store\nrevdep/**\n.positai\n"
  },
  {
    "path": "AGENTS.md",
    "content": "# AGENTS.md\n\nThis file provides guidance to agents when working with code in this repository.\n\n## Project Overview\n\nsantoku is an R package that provides `chop()`, a versatile replacement for \n`base::cut()` for cutting data into intervals. The package handles numeric \nvectors, dates, times, and other comparable objects, with support for singleton \nintervals and flexible labeling.\n\n## Common Commands\n\n### Testing\n```r\n# Run all tests\ndevtools::test()\n\n# Run tests from command line\nR CMD check .\n\n# Run specific test file\ntestthat::test_file(\"tests/testthat/test-chop.R\")\n```\n\n### Development workflow\n```r\n# Build package\ndevtools::build()\n\n# Install package locally\ndevtools::install()\n\n# Check package\ndevtools::check()\n\n# Load package for interactive development\ndevtools::load_all()\n```\n\n### Documentation\n```r\n# Update documentation\ndevtools::document()\n\n# Build website\npkgdown::build_site()\n```\n\n## Architecture\n\n### Core Components\n\n- **Main cutting function**: `chop()` in `R/chop.R` - the primary interface that calls other functions\n- **Break creation**: `R/breaks*.R` files contain functions to create break points (`brk_*` functions)\n- **Labeling system**: `R/labels*.R` files contain labeling functions (`lbl_*` functions)  \n- **Convenience functions**: `R/chop-*.R` files contain `chop_*` wrapper functions for common use cases\n- **C++ backend**: `src/categorize.cpp` provides fast interval categorization via Rcpp\n- **Tabulation**: `R/tab.R` provides `tab_*` functions that chop and tabulate in one step\n\n### Key Design Patterns\n\n1. **Function factories**: Many functions return other functions (e.g., `brk_*` functions return break-creation functions)\n2. **Method dispatch**: Uses S3 methods and vctrs for handling different data types (numbers, dates, etc.)\n3. **Extensible labeling**: Label functions can be combined and customized using the `lbl_*` family\n4. **Performance**: Core categorization logic is implemented in C++ for speed\n\n### File Organization\n\n- `R/chop.R` - Main `chop()` function and documentation\n- `R/breaks*.R` - Break point creation (`brk_default`, `brk_width`, etc.)\n- `R/labels*.R` - Label generation (`lbl_intervals`, `lbl_dash`, etc.)\n- `R/chop-*.R` - Convenience functions (`chop_quantiles`, `chop_width`, etc.)\n- `R/tab.R` - Tabulation functions\n- `R/utils.R` - Utility functions like `exactly()` and `percent()`\n- `src/categorize.cpp` - Fast C++ categorization implementation\n- `tests/testthat/` - Comprehensive test suite\n\n## Development Notes\n\n- The package uses Rcpp for performance-critical categorization\n- Tests are extensive and include systematic testing in `test-zzz-systematic.R`\n- The package supports non-standard data types (dates, times, units) via the vctrs package\n- Documentation follows roxygen2 conventions with extensive examples\n- Uses lifecycle package for function lifecycle management"
  },
  {
    "path": "DESCRIPTION",
    "content": "Package: santoku\nType: Package\nTitle: A Versatile Cutting Tool\nVersion: 1.2.1\nAuthors@R:\n    c(\n    person(given = \"David\",\n           family = \"Hugh-Jones\",\n           role = c(\"aut\", \"cre\"),\n           email = \"davidhughjones@gmail.com\"),\n    person(given = \"Daniel\",\n           family = \"Possenriede\",\n           role = c(\"ctb\"),\n           email = \"possenriede@gmail.com\")\n    )\nMaintainer: David Hugh-Jones <davidhughjones@gmail.com>\nDescription: A tool for cutting data into intervals. Allows singleton intervals.\n  Always includes the whole range of data by default. Flexible labelling. \n  Convenience functions for cutting by quantiles etc. Handles dates, times, units\n  and other vectors.\nLicense: MIT + file LICENSE\nEncoding: UTF-8\nRoxygen: list(markdown = TRUE)\nRoxygenNote: 7.3.3\nSuggests: \n    bench,\n    bit64,\n    covr,\n    haven,\n    Hmisc,\n    hms,\n    knitr,\n    lubridate,\n    purrr,\n    rmarkdown,\n    scales,\n    stringi,\n    testthat (>= 3.2.0),\n    units,\n    withr,\n    xts,\n    zoo\nConfig/testthat/edition: 3\nLinkingTo: \n    Rcpp\nDepends:\n    R (>= 3.5.0)\nImports: \n    Rcpp,\n    assertthat,\n    glue,\n    lifecycle,\n    rlang,\n    vctrs\nURL: https://github.com/hughjonesd/santoku, https://hughjonesd.github.io/santoku/\nBugReports: https://github.com/hughjonesd/santoku/issues\nVignetteBuilder: knitr\nRdMacros: lifecycle\n"
  },
  {
    "path": "LICENSE",
    "content": "YEAR: 2020\nCOPYRIGHT HOLDER: David Hugh-Jones\n"
  },
  {
    "path": "LICENSE.md",
    "content": "# MIT License\n\nCopyright (c) 2019 David Hugh-Jones\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(apply_format,\"function\")\nS3method(apply_format,character)\nS3method(apply_format,list)\nS3method(apply_format.character,character)\nS3method(apply_format.character,default)\nS3method(apply_format.character,numeric)\nS3method(apply_format.list,default)\nS3method(as.double,breaks)\nS3method(brk_width,Duration)\nS3method(brk_width,default)\nS3method(class_bounds,Date)\nS3method(class_bounds,POSIXct)\nS3method(class_bounds,default)\nS3method(class_bounds,difftime)\nS3method(class_bounds,integer64)\nS3method(class_bounds,numeric)\nS3method(class_bounds,units)\nS3method(class_bounds,zoo)\nS3method(endpoint_labels,Date)\nS3method(endpoint_labels,POSIXt)\nS3method(endpoint_labels,default)\nS3method(endpoint_labels,double)\nS3method(endpoint_labels,integer)\nS3method(endpoint_labels,numeric)\nS3method(endpoint_labels,quantileBreaks)\nS3method(endpoint_labels,sdBreaks)\nS3method(format,breaks)\nS3method(print,breaks)\nS3method(santoku_cast_common,Date)\nS3method(santoku_cast_common,Date.Date)\nS3method(santoku_cast_common,Date.POSIXct)\nS3method(santoku_cast_common,POSIXct)\nS3method(santoku_cast_common,POSIXct.Date)\nS3method(santoku_cast_common,POSIXct.POSIXct)\nS3method(santoku_cast_common,default)\nS3method(santoku_cast_common,default.default)\nS3method(santoku_cast_common,default.hexmode)\nS3method(santoku_cast_common,default.integer64)\nS3method(santoku_cast_common,default.octmode)\nS3method(santoku_cast_common,default.ts)\nS3method(santoku_cast_common,default.zoo)\nS3method(santoku_cast_common,double)\nS3method(santoku_cast_common,double.default)\nS3method(santoku_cast_common,double.integer64)\nS3method(santoku_cast_common,hexmode)\nS3method(santoku_cast_common,hexmode.default)\nS3method(santoku_cast_common,hexmode.hexmode)\nS3method(santoku_cast_common,integer64)\nS3method(santoku_cast_common,integer64.default)\nS3method(santoku_cast_common,integer64.double)\nS3method(santoku_cast_common,integer64.integer64)\nS3method(santoku_cast_common,octmode)\nS3method(santoku_cast_common,octmode.default)\nS3method(santoku_cast_common,octmode.octmode)\nS3method(santoku_cast_common,ts)\nS3method(santoku_cast_common,ts.default)\nS3method(santoku_cast_common,zoo)\nS3method(santoku_cast_common,zoo.default)\nS3method(scaled_endpoints,breaks)\nS3method(scaled_endpoints,default)\nS3method(sequence_width,Period)\nS3method(sequence_width,default)\nexport(brk_default)\nexport(brk_equally)\nexport(brk_evenly)\nexport(brk_fn)\nexport(brk_manual)\nexport(brk_mean_sd)\nexport(brk_n)\nexport(brk_pretty)\nexport(brk_proportions)\nexport(brk_quantiles)\nexport(brk_spikes)\nexport(brk_width)\nexport(chop)\nexport(chop_deciles)\nexport(chop_equally)\nexport(chop_evenly)\nexport(chop_fn)\nexport(chop_mean_sd)\nexport(chop_n)\nexport(chop_pretty)\nexport(chop_proportions)\nexport(chop_quantiles)\nexport(chop_spikes)\nexport(chop_width)\nexport(dissect)\nexport(exactly)\nexport(fillet)\nexport(is.breaks)\nexport(kiru)\nexport(lbl_dash)\nexport(lbl_date)\nexport(lbl_datetime)\nexport(lbl_discrete)\nexport(lbl_endpoint)\nexport(lbl_endpoints)\nexport(lbl_glue)\nexport(lbl_intervals)\nexport(lbl_manual)\nexport(lbl_midpoints)\nexport(lbl_seq)\nexport(percent)\nexport(santoku_cast_common.Date)\nexport(santoku_cast_common.POSIXct)\nexport(santoku_cast_common.default)\nexport(santoku_cast_common.double)\nexport(santoku_cast_common.hexmode)\nexport(santoku_cast_common.integer64)\nexport(santoku_cast_common.octmode)\nexport(santoku_cast_common.ts)\nexport(santoku_cast_common.zoo)\nexport(tab)\nexport(tab_deciles)\nexport(tab_dissect)\nexport(tab_equally)\nexport(tab_evenly)\nexport(tab_fn)\nexport(tab_mean_sd)\nexport(tab_n)\nexport(tab_pretty)\nexport(tab_proportions)\nexport(tab_quantiles)\nexport(tab_spikes)\nexport(tab_width)\nimport(assertthat)\nimportFrom(Rcpp,sourceCpp)\nimportFrom(lifecycle,deprecated)\nuseDynLib(santoku, .registration = TRUE)\n"
  },
  {
    "path": "NEWS.md",
    "content": "# santoku 1.2.1\n\n* Fixed a test bug.\n\n\n# santoku 1.2.0\n\n* New experimental `lbl_date()` and `lbl_datetime()` functions for pretty \n  formatting of dates and date-times.\n* Bugfix: extended breaks were failing on `haven::labelled` objects.\n* The `raw` argument to `lbl_*` functions, deprecated since 0.9.0, now throws\n  an error.\n\n\n# santoku 1.1.0\n\n* Core logic has been speeded up using raw pointers. This was vibe-coded by me\n  and Claude Code. If it breaks, please file a bug report.\n* The experimental `chop_spikes()` and `dissect()` functions give \n  common values of `x` their own singleton intervals.\n* On Unicode platforms, infinity will be represented as ∞ in breaks. Set\n  `options(santoku.infinity = \"Inf\")` to use the old behaviour.\n* Singleton breaks are not labelled specially by default in \n  `chop_quantiles(..., raw = FALSE)`. This means that e.g. if the 10th and 20th\n  percentiles are both the same number, the label will still be `[10%, 20%]`.\n* When multiple quantiles are the same, santoku warns and returns the leftmost\n  quantile interval. Before it would merge the intervals, creating labels that\n  might be different to what the user asked for.\n* `chop_quantiles()` gains a `recalc_probs` argument. `recalc_probs = TRUE`\n  recalculates probabilities using `ecdf(x)`, which may give more accurate \n  interval labels.\n* `single = NULL` has been documented explicitly in `lbl_*` functions.\n* Bugfix: `brk_manual()` no longer warns if `close_end = TRUE` (the default).\n\n\n# santoku 1.0.0\n\n* santoku is now considered stable.\n* `chop_quantiles()` and `brk_quantiles()` gain a new `weights` argument, \n  letting you chop by weighted quantiles using `Hmisc::wtd.quantile()`.\n* `brk_quantiles()` may now return singleton breaks, producing more\n  accurate results when `x` has duplicate elements.\n* Some deprecated functions have been removed, and the `raw` argument to \n  `lbl_*` functions now always gives a deprecation warning.\n  \n  \n# santoku 0.10.0\n\n* List arguments to `fmt` in `lbl_*` functions will be taken as arguments to\n  `base::format`. This gives more flexibility in formatting, e.g., `units`\n  breaks.\n* `chop_n()` gains a `tail` argument, to deal with a last interval containing\n  less than `n` elements. Set `tail = \"merge\"` to merge it with\n  the previous interval. This guarantees that all intervals contain at least\n  `n` elements.\n* `chop_equally()` may return fewer than `groups` groups when there are \n  duplicate elements. We now warn when this happens.\n* Bugfix: `chop_n()` could return intervals with fewer than `n` elements \n  when there were duplicate elements. The new algorithm avoids this, but\n  may be slower in this case.\n\n# santoku 0.9.1\n\n* `endpoint_labels()` methods gain an unused `...` argument to satisfy R CMD CHECK.\n\n# santoku 0.9.0\n\n## Breaking changes\n\nThere are important changes to `close_end`.\n\n* `close_end` is now `TRUE` by default in `chop()` and `fillet()`. \n  In previous versions:\n\n  ```r\n  chop(1:2, 1:2)\n  ## [1] [1, 2) {2}   \n  ## Levels: [1, 2) {2}  \n  ```\n  \n  Whereas now:\n  \n  ```r\n  chop(1:2, 1:2)\n  ## [1] [1, 2] [1, 2]\n  ## Levels: [1, 2]\n  ```\n  \n  \n* `close_end` is now always applied after `extend`. For example, in previous\n  versions:\n  \n  ```r\n  chop(1:4, 2:3, close_end = TRUE)\n  ## [1] [1, 2) [2, 3] [2, 3] (3, 4]\n  ## Levels: [1, 2) [2, 3] (3, 4]\n  ```\n  \n  Whereas now:\n  \n  ```r\n  chop(1:4, 2:3, close_end = TRUE)\n  ## [1] [1, 2) [2, 3) [3, 4] [3, 4]\n  ## Levels: [1, 2) [2, 3) [3, 4]\n  ```\n\nWe changed this behaviour to be more in line with user expectations. \n\n* If `breaks` has names, they will be used as labels:\n  \n  ```r\n  chop(1:5, c(Low = 1, Mid = 2, High = 4))\n  ## [1] Low  Mid  Mid  High High\n  ## Levels: Low Mid High  \n  ```\n  Names can also be used for labels in `probs` in `chop_quantiles()` and\n  `proportions` in `chop_proportions()`.\n\n* There is a new `raw` parameter to `chop()`. This replaces the parameter\n  `raw` in `lbl_*` functions, which is now soft-deprecated.\n  \n* `lbl_manual()` is deprecated. Just use a vector argument to `labels` instead.\n\n* A `labels` argument to `chop_quantiles()` now needs to be explicitly named.\n\nI expect these to be the last important breaking changes before we release \nversion 1.0 and mark the package as \"stable\". If they cause problems for you,\nplease file an issue.\n\n\n## Other changes\n* New `chop_fn()`, `brk_fn()` and `tab_fn()` chop using an arbitrary function.\n* Added section on non-standard objects to vignette.\n\n\n# santoku 0.8.0\n\n## Breaking changes\n\n* `lbl_endpoint()` has been renamed to `lbl_endpoints()`. The old version will\n  trigger a deprecation warning. `lbl_endpoints()` gains `first`, `last` and\n  `single` arguments like other labelling functions.\n  \n## Other changes\n\n* New `chop_pretty()`, `brk_pretty()` and `tab_pretty()` functions use \n  `base::pretty()` to calculate attractive breakpoints. Thanks @davidhodge931.\n* New `chop_proportions()`, `brk_proportions()` and `tab_proportions()`\n  functions chop `x` into proportions of its range.\n* `chop_equally()` now uses `lbl_intervals(raw = TRUE)` by default, bringing it\n  into line with `chop_evenly()`, `chop_width()` and `chop_n()`.\n* New `lbl_midpoints()` function labels breaks by their midpoints.\n* `lbl_discrete()` gains a `single` argument.\n* You can now chop `ts`, `xts::xts` and `zoo::zoo` objects.\n* `chop()` is more forgiving when mixing different types, e.g.:\n  - `Date` objects with `POSIXct` breaks, and vice versa\n  - `bit64::integer64` and `double`s\n* Bugfix: `lbl_discrete()` sometimes had ugly label formatting. \n\n\n# santoku 0.7.0\n\n## Breaking changes\n\n* In labelling functions, `first` and `last` arguments are now passed to \n  `glue::glue()`. Variables `l` and `r` represent the left and right endpoints \n  of the intervals. \n* `chop_mean_sd()` now takes a vector `sds` of standard deviations, rather than\n  a single maximum number `sd` of standard deviations. Write e.g. \n  `chop_mean_sd(sds = 1:3)` rather than `chop_mean_sd(sd = 3)`. The `sd` argument\n  is deprecated.\n* The `groups` argument to `chop_evenly()`,  deprecated in 0.4.0, has \n  been removed.\n* `brk_left()` and `brk_right()`, deprecated in 0.4.0, have been removed.\n* `knife()`, deprecated in 0.4.0, has been removed.\n* `lbl_format()`, questioning since 0.4.0, has been removed.\n* Arguments of `lbl_dash()` and `lbl_intervals()` have been reordered for\n  consistency with other labelling functions.\n\n## Other changes\n\n* You can now chop many more types, including `units` from the `units` package,\n  `difftime` objects, `package_version` objects, etc. \n  - Character vectors will be chopped by lexicographic order, with an optional warning.\n  - If you have problems chopping a vector type, file a bug report.\n* The `{glue}` package has become a hard dependency. It is used in many places to \n  format labels. \n* There is a new `lbl_glue()` function using the `{glue}` package. Thanks to @dpprdan.\n* You can now set `labels = NULL` to return integer codes.\n* Arguments `first`, `last` and `single` can be used in `lbl_intervals()` \n  and `lbl_dash()`, to override the first and last interval labels, or to \n  label singleton intervals.\n* `lbl_dash()` and `lbl_discrete()` use unicode em-dash where possible.\n* `brk_default()` throws an error if breaks are not sorted.\n\n  \n## Bugfixes\n\n* Bugfix: `tab()` and friends no longer display an `x` as the variable name.\n* Bugfix: `lbl_endpoint()` was erroring for some types of breaks.\n\n\n\n# santoku 0.6.0\n\n* New arguments `first` and `last` in `lbl_dash()` and `lbl_discrete()` allow you \n  to override the first and last interval labels.\n\n* Fixes for CRAN.\n\n# santoku 0.5.0\n\n* Negative numbers can be used in `chop_width()`.\n  - This sets `left = FALSE` by default.\n  - Also works for negative time intervals.\n  \n# santoku 0.4.1\n\n* Bugfix: `chop(1:4, 1)` was erroring. \n\n# santoku 0.4.0\n\n## Interface changes\n\nThe new version has some interface changes. These are based on user experience,\nand are designed to make using `chop()` more intuitive and predictable.\n\n* `chop()` has two new arguments, `left` and `close_end`.\n  - Using `left = FALSE` is simpler and more intuitive than wrapping \n    breaks in `brk_right()`. \n  - `brk_left()` and `brk_right()` have been kept for now, but cannot be used to \n    wrap other break functions.\n  - Using `close_end` is simpler than passing `close_end` into\n    `brk_left()` or `brk_right()` (which no longer accept this argument directly).\n  - `left = TRUE` by default, except for non-numeric objects in \n    `chop_quantiles()` and `chop_equally()`, where `left = FALSE` works better.\n    \n* `close_end` is now `FALSE` by default. \n  - This prevents user surprises when e.g. `chop(3, 1:3)` puts `3` into a \n    different category than `chop(3, 1:4)`.\n  - `close_end` is `TRUE` by default for `chop_quantiles()`, `chop_n()` and \n    similar functions. This ensures that e.g. \n    `chop_quantiles(x, c(0, 1/3, 2/3, 1))` does what you would expect.\n\n* The `groups` argument to `chop_evenly()` has been renamed from `groups` to\n  `intervals`. This should make it easier to remember the difference between\n  `chop_evenly()` and `chop_equally()`. (Chop evenly into `n` equal-width\n  *intervals*, or chop equally into `n` equal-sized *groups*.)\n\n* `knife()` has been deprecated to keep the interface slim and\n  focused. Use `purrr::partial()` instead.\n\n\n\n## Other changes\n\n* Date and datetime (`POSIXct`) objects can now be chopped. \n  - `chop_width()` accepts `difftime`, `lubridate::period` or `lubridate::duration`\n    objects\n  - all other `chop_` functions work as well.\n  \n* Many labelling functions have a new `fmt` argument. This can be a string\n  interpreted by `sprintf()` or `format()`, or a 1-argument formatting function\n  for break endpoints, e.g. `scales::label_percent()`.\n  \n* Experimental: `lbl_discrete()` for discrete data such as integers or (most)\n  dates.\n  \n* There is a new `lbl_endpoint()` function for labelling intervals solely by\n  their left or right endpoint.\n\n* `brk_mean_sd()` now accepts non-integer positive numbers.\n\n* Add `brk_equally()` for symmetry with `chop_equally()`.\n\n* Minor tweaks to `chop_deciles()`.\n\n* Bugfix: `lbl_format()` wasn't accepting numeric formats, even when \n  `raw = TRUE`. Thanks to Sharla Gelfand.\n\n# santoku 0.3.0\n\n* First CRAN release.\n\n* Changed `kut()` to `kiru()`. `kiru()` is an alternative spelling for `chop()`, \n  for use when the tidyr package is loaded.\n  \n* `lbl_sequence()` has become `lbl_manual()`.\n\n* `lbl_letters()` and friends have been replaced by `lbl_seq()`:\n  - to replace `lbl_letters()` use `lbl_seq()`\n  - to replace `lbl_LETTERS()` use `lbl_seq(\"A\")`\n  - to replace `lbl_roman()` use `lbl_seq(\"i\")`\n  - to replace `lbl_ROMAN()` use `lbl_seq(\"I\")`\n  - to replace `lbl_numerals()` use `lbl_seq(\"1\")`\n  - for more complex formatting use e.g. `lbl_seq(\"A:\")`, `lbl_seq(\"(i)\")`\n\n# santoku 0.2.0\n\n* Added a `NEWS.md` file to track changes to the package.\n\n* Default labels when `extend = NULL` have changed, from\n  `[-Inf, ...` and `..., Inf]` to `[min(x), ...` and `..., max(x)]`.\n"
  },
  {
    "path": "R/RcppExports.R",
    "content": "# Generated by using Rcpp::compileAttributes() -> do not edit by hand\n# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393\n\ncategorize_impl <- function(x, breaks, left) {\n    .Call(`_santoku_categorize_impl`, x, breaks, left)\n}\n\n"
  },
  {
    "path": "R/breaks-by-group-size.R",
    "content": "\n#' @rdname chop_quantiles\n#'\n#' @export\n#' @order 2\nbrk_quantiles <- function (probs, ..., weights = NULL, recalc_probs = FALSE) {\n  assert_that(\n          is.numeric(probs),\n          noNA(probs),\n          all(probs >= 0),\n          all(probs <= 1),\n          is.null(weights) || is.numeric(weights),\n          is.flag(recalc_probs)\n        )\n  probs <- sort(probs)\n\n  function (x, extend, left, close_end) {\n    dots <- list(...)\n    dots$x <- x\n    if (! is.numeric(x) && ! \"type\" %in% names(dots)) dots$type <- 1\n    dots$probs <- probs\n    dots$na.rm <- TRUE\n\n    qs <- if (is.null(weights)) {\n      do.call(stats::quantile, dots)\n    } else {\n      rlang::check_installed(\"Hmisc\",\n                             reason = \"to use `weights` in brk_quantiles()\")\n      dots$weights <- weights\n      do.call(Hmisc::wtd.quantile, dots)\n    }\n\n    if (anyNA(qs)) return(empty_breaks()) # data was all NA\n\n    if (anyDuplicated(qs) > 0L) {\n      if (! recalc_probs) {\n        warning(\"`x` has duplicate quantiles: break labels may be misleading\")\n      }\n      # We use the left-most probabilities, so e.g. if 0%, 20% and 40% quantiles\n      # are all the same number, we'll use the category [0%, 20%).\n      # This means we always return intervals that the user asked for, though\n      # they may be more misleading than e.g. [0%, 40%).\n      illegal_dupes <- find_illegal_duplicates(qs)\n      qs <- qs[! illegal_dupes]\n      probs <- probs[! illegal_dupes]\n    }\n\n    breaks <- create_lr_breaks(qs, left)\n\n    needs <- needs_extend(breaks, x, extend, left, close_end)\n    if ((needs & LEFT) > 0)  probs <- c(0, probs)\n    if ((needs & RIGHT) > 0) probs <- c(probs, 1)\n    breaks <- extend_and_close(breaks, x, extend, left, close_end)\n\n    class(breaks) <- c(\"quantileBreaks\", class(breaks))\n\n    if (recalc_probs) {\n      probs <- calculate_ecdf_probs(x, breaks, weights)\n    }\n\n    attr(breaks, \"scaled_endpoints\") <- probs\n    names(breaks) <- names(probs)\n\n    breaks\n  }\n}\n\n\n#' Calculate the proportions of `x` that is strictly/weakly less than\n#' each break\n#'\n#' @param x A numeric vector\n#' @param breaks A breaks object\n#' @param weights A vector of weights. Non-NULL weights are unimplemented\n#'\n#' @return A vector of proportions of `x` that are strictly less than\n#' left-closed breaks, and weakly less than right-closed breaks.\n#'\n#' @noRd\ncalculate_ecdf_probs <- function (x, breaks, weights) {\n  if (! is.numeric(x)) {\n    stop(\"`recalc_probs = TRUE` can only be used with numeric `x`\")\n  }\n  if (! is.null(weights)) {\n    stop(\"`recalc_probs = TRUE` cannot be used with non-null `weights`\")\n  }\n\n  brk_vec <- unclass_breaks(breaks)\n  left_vec <- attr(breaks, \"left\")\n\n  # proportion of x that is weakly less than x\n  prop_lte_brk <- stats::ecdf(x)(brk_vec)\n  # proportion of x that is strictly less than x\n  prop_lt_brk <- 1 - stats::ecdf(-x)(-brk_vec)\n  probs <- ifelse(left_vec, prop_lt_brk, prop_lte_brk)\n\n  # Suppose your breaks are [a, b].\n  # You want to expand this?\n  probs\n}\n\n\n#' @rdname chop_equally\n#'\n#' @export\n#' @order 2\nbrk_equally <- function (groups) {\n  assert_that(is.count(groups))\n\n  brq <- brk_quantiles(seq(0L, groups)/groups)\n\n  function (x, extend, left, close_end) {\n    breaks <- brq(x = x, extend = extend, left = left, close_end = close_end)\n\n    if (length(breaks) < groups + 1) {\n      warning(\"Fewer than \", groups, \" intervals created\")\n    }\n\n    breaks\n  }\n}\n\n\n#' @rdname chop_n\n#' @export\n#' @order 2\nbrk_n <- function (n, tail = \"split\") {\n  assert_that(is.count(n), tail == \"split\" || tail == \"merge\")\n\n  function (x, extend, left, close_end) {\n    xs <- sort(x, decreasing = ! left, na.last = NA) # remove NAs\n    if (length(xs) < 1L) return(empty_breaks())\n\n    dupes <- duplicated(xs)\n    breaks <- xs[0] # ensures breaks has type of xs\n    last_x <- xs[length(xs)]\n\n    maybe_merge_tail <- function (breaks, tail) {\n      if (tail == \"merge\" && length(breaks) > 1) {\n        breaks <- breaks[-length(breaks)]\n      }\n      breaks\n    }\n\n    # Idea of the algorithm:\n    # Loop:\n    # if there are no dupes, just take a sequence of each nth element\n    #   starting at 1, and exit\n    # if there are remaining dupes, then take the first element\n    # set m to the (n+1)th element which would normally be next\n    # if element m is a dupe:\n    #   - we need to go up, otherwise elements to the left will be in the next\n    #     interval, and this interval will be too small\n    #   - so set m to the next non-dupe (i.e. strictly larger) element\n    # now delete the first m-1 elements\n    # And repeat\n    while (TRUE) {\n      if (! any(dupes)) {\n        breaks <- c(breaks, xs[seq(1L, length(xs), n)])\n        if (length(xs) %% n > 0) {\n          breaks <- maybe_merge_tail(breaks, tail)\n        }\n        break\n      }\n      breaks <- c(breaks, xs[1])\n      m <- n + 1\n      if (length(xs) <= n || all(dupes[-seq_len(m - 1)])) {\n        if (length(xs) < n) {\n          breaks <- maybe_merge_tail(breaks, tail)\n        }\n        break\n      }\n      if (dupes[m]) {\n        # the first non-dupe will be the next element that is different\n        # we know there is one, because we checked above\n        m <- m + match(FALSE, dupes[-(1:m)])\n      }\n      discard <- seq_len(m - 1)\n      xs <- xs[-discard]\n      dupes <- dupes[-discard]\n    }\n\n    breaks <- c(breaks, last_x)\n    if (! left) breaks <- rev(breaks)\n    breaks <- create_extended_breaks(breaks, x, extend, left, close_end)\n\n    breaks\n  }\n}\n"
  },
  {
    "path": "R/breaks-by-width.R",
    "content": "\n#' Equal-width intervals for dates or datetimes\n#'\n#' `brk_width()` can be used with time interval classes from base R or the\n#' `lubridate` package.\n#'\n#' @param width A scalar [difftime], [Period][lubridate::Period-class] or\n#'   [Duration][lubridate::Duration-class] object.\n#'\n#' @param start A scalar of class [Date][base::Dates] or [POSIXct][DateTimeClasses].\n#'   Can be omitted.\n#'\n#' @details\n#' If `width` is a Period, [`lubridate::add_with_rollback()`][`lubridate::m+`]\n#' is used to calculate the widths. This can be useful for e.g. calendar months.\n#'\n#' @examples\n#'\n#' if (requireNamespace(\"lubridate\")) {\n#'   year2001 <- as.Date(\"2001-01-01\") + 0:364\n#'   tab_width(year2001, months(1),\n#'         labels = lbl_discrete(\" to \", fmt = \"%e %b %y\"))\n#' }\n#'\n#' @name brk_width-for-datetime\nNULL\n\n\n#' @rdname chop_width\n#' @export\n#' @order 2\nbrk_width <- function (width, start) UseMethod(\"brk_width\")\n\n\n#' @rdname brk_width-for-datetime\n#' @export\nbrk_width.Duration <- function (width, start) {\n  loadNamespace(\"lubridate\")\n  width <- lubridate::make_difftime(as.numeric(width))\n  NextMethod()\n}\n\n\n#' @rdname chop_width\n#' @export\n#' @order 2\nbrk_width.default <- function (width, start) {\n  assert_that(is.scalar(width))\n\n  sm <- missing(start)\n  if (! sm) assert_that(is.scalar(start))\n\n  function (x, extend, left, close_end) {\n    # finite if x has any non-NA finite elements:\n    min_x <- quiet_min(x[is.finite(x)])\n    max_x    <- quiet_max(x[is.finite(x)])\n\n    if (sm) {\n      start <- if (sign(width) > 0) min_x else max_x\n    }\n    until <- if (sign(width) > 0) max_x else min_x\n\n    if (is.finite(start) && is.finite(until)) {\n      breaks <- sequence_width(width, start, until)\n    } else {\n      return(empty_breaks())\n    }\n\n    if (sign(width) <= 0) breaks <- rev(breaks)\n\n    breaks <- create_extended_breaks(breaks, x, extend, left, close_end)\n\n    breaks\n  }\n}\n\n\n#' @rdname chop_evenly\n#' @export\n#' @order 2\nbrk_evenly <- function(intervals) {\n  assert_that(is.count(intervals))\n\n  function (x, extend, left, close_end) {\n    min_x <- quiet_min(x[is.finite(x)])\n    max_x <- quiet_max(x[is.finite(x)])\n    if (sign(max_x - min_x) <= 0) return(empty_breaks())\n\n    breaks <- seq(min_x, max_x, length.out = intervals + 1L)\n    breaks <- create_extended_breaks(breaks, x, extend, left, close_end)\n\n    breaks\n  }\n}\n\n\n#' @rdname chop_proportions\n#' @export\n#' @order 2\nbrk_proportions <- function(proportions) {\n  assert_that(is.numeric(proportions), noNA(proportions),\n                all(proportions >= 0), all(proportions <= 1))\n  proportions <- sort(proportions)\n\n  function (x, extend, left, close_end) {\n    min_x <- quiet_min(x[is.finite(x)])\n    max_x <- quiet_max(x[is.finite(x)])\n    range_x <- max_x - min_x\n    if (sign(range_x) <= 0) return(empty_breaks())\n\n    breaks <- min_x + range_x * proportions\n    breaks <- create_lr_breaks(breaks, left)\n\n    scaled_endpoints <- proportions\n    needs <- needs_extend(breaks, x, extend, left, close_end)\n    if ((needs & LEFT) > 0) scaled_endpoints <- c(0, scaled_endpoints)\n    if ((needs & RIGHT) > 0) scaled_endpoints <- c(scaled_endpoints, 1)\n    breaks <- extend_and_close(breaks, x, extend, left, close_end)\n\n    attr(breaks, \"scaled_endpoints\") <- scaled_endpoints\n    names(breaks) <- names(scaled_endpoints)\n\n    breaks\n  }\n}"
  },
  {
    "path": "R/breaks-impl.R",
    "content": "\n\n#' Create a breaks object\n#'\n#' @param obj A sorted vector or a `breaks` object.\n#' @param left A logical vector, same length as `obj`.\n#'\n#' @return A breaks object\n#'\n#' @noRd\n#'\ncreate_breaks <- function (obj, left) {\n  if (anyNA(obj)) stop(\"breaks contained NAs\")\n  stopifnot(all(obj == sort(obj)))\n  stopifnot(is.logical(left))\n  stopifnot(length(left) == length(obj))\n\n  if (any(find_illegal_duplicates(obj))) {\n    stop(\"breaks contained more than two consecutive equal values\")\n  }\n\n  singletons <- singletons(obj)\n  l_singletons <- c(singletons, FALSE)\n  r_singletons <- c(FALSE, singletons)\n  stopifnot(all(left[l_singletons]))\n  stopifnot(all(! left[r_singletons]))\n\n  break_classes <- class(obj)\n  if (! inherits(obj, \"breaks\")) break_classes <- c(\"breaks\", break_classes)\n\n  structure(obj, left = left, class = break_classes)\n}\n\n\ncreate_extended_breaks <- function (obj, x, extend, left, close_end) {\n  brks <- create_lr_breaks(obj = obj, left = left)\n  extend_and_close(breaks = brks, x = x, extend = extend, left = left,\n                     close_end = close_end)\n}\n\n\ncreate_lr_breaks <- function (obj, left) {\n  assert_that(is.flag(left))\n  left_vec <- rep(left, length(obj))\n\n  st <- singletons(obj)\n  left_vec[which(st)]     <- TRUE\n  left_vec[which(st) + 1] <- FALSE\n\n  create_breaks(obj, left_vec)\n}\n\n\nempty_breaks <- function () {\n  create_breaks(c(-Inf, Inf), c(TRUE, FALSE))\n}\n\n\n#' Extend `breaks` to the left or right according to `extend` parameter,\n#' and close end according to `close_end` parameter\n#'\n#' @param breaks,x,extend,left,close_end All passed in from `chop()` via\n#' a `brk_` inner function\n#'\n#' @return A `breaks` object.\n#' @noRd\nextend_and_close <- function (breaks, x, extend, left, close_end) {\n  extend_flags <- needs_extend(breaks, x, extend, left, close_end)\n\n  if ((extend_flags & LEFT) > 0) {\n    breaks <- extend_endpoint_left(breaks, x, extend)\n  }\n  if ((extend_flags & RIGHT) > 0) {\n    breaks <- extend_endpoint_right(breaks, x, extend)\n  }\n\n  breaks <- maybe_close_end(breaks, left = left, close_end = close_end)\n\n  return(breaks)\n}\n\n\n\nNEITHER <- as.raw(0)\nLEFT    <- as.raw(1)\nRIGHT   <- as.raw(2)\nBOTH <- LEFT | RIGHT\n\n\n#' Reports if `breaks` will/should be extended.\n#'\n#' @param breaks A breaks object\n#' @param x Data\n#' @param extend,left,close_end Parameters passed into `chop`\n#'\n#' @return Returns LEFT or RIGHT or BOTH only if `breaks` *will*/*must* be\n#' extended i.e. gain an extra break, on the respective sides.\n#'\n#' @details\n#' If `extend` is `FALSE`, always returns `NEITHER`. If `breaks` is length\n#' zero, always returns `BOTH`.\n#'\n#' If extend is `NULL` then `left` and `close_end` are taken into account.\n#'\n#' To test whether `breaks` will be extended on either side, use\n#' `(needs & LEFT) > 0` or `(needs & RIGHT) > 0`.\n#'\n#' @noRd\nneeds_extend <- function (breaks, x, extend, left, close_end) {\n  if (! is.null(extend) && ! extend) return(NEITHER)\n  if (length(breaks) < 1L) return(BOTH)\n\n  needs <- NEITHER\n\n  # temporarily close the breaks, to see if unextended closed breaks need\n  # extension\n  breaks <- maybe_close_end(breaks, left = left, close_end = close_end)\n  left_vec <- attr(breaks, \"left\")\n\n  res <- santoku_cast_common(x, unclass_breaks(breaks))\n  x <- res[[1]]\n  breaks <- res[[2]]\n\n  min_x <- quiet_min(x)\n  max_x <- quiet_max(x)\n\n  if (\n          isTRUE(extend)      ||\n          min_x < min(breaks) ||\n          (! left_vec[1] && min_x == min(breaks))\n        ) {\n    # \"... and if ...\" the first break is finite, or will be left-open\n    if (is_gt_minus_inf(breaks[1]) || ! left_vec[1]) {\n      needs <- needs | LEFT\n    }\n  }\n\n  if (\n          isTRUE(extend)      ||\n          max_x > max(breaks) ||\n          (left_vec[length(left_vec)] && max_x == max(breaks))\n        ) {\n    # \"... and if ...\" the last break is finite, or will be left-closed (right-open)\n    if (is_lt_inf(breaks[length(breaks)]) || left_vec[length(left_vec)]) {\n      needs <- needs | RIGHT\n    }\n  }\n\n  return(needs)\n}\n\n\n#' Close end of breaks if close_end is TRUE\n#'\n#' This never adds a break, it just changes the breaks' `left` attribute.\n#' It leaves everything unchanged if `close_end` is `FALSE`.\n#'\n#' @param breaks,left,close_end Passed in from a `brk_` function\n#'\n#' @return New breaks object, with the end perhaps closed\n#' @noRd\nmaybe_close_end <- function (breaks, left, close_end) {\n  if (! close_end) return(breaks)\n\n  left_vec <- attr(breaks, \"left\")\n  if (left) {\n    left_vec[length(left_vec)] <- FALSE\n  } else {\n    left_vec[1] <- TRUE\n  }\n  attr(breaks, \"left\") <- left_vec\n\n  return(breaks)\n}\n\n\n#' Extend the left endpoint of a breaks object according to user parameters\n#'\n#' This always adds a new break, which is `-Inf` if `extend` is `TRUE`\n#' and equal to the minimum of `x` if `extend` is `NULL`.\n#'\n#' It fixes the `left` attribute if a new singleton break is going to be\n#' created.\n#'\n#' @param breaks,x,extend Passed in from a `brk_` inner function\n#'\n#' @return A new breaks object\n#' @noRd\nextend_endpoint_left <- function (breaks, x, extend) {\n  left <- attr(breaks, \"left\")\n  q <- quiet_min(x)\n  # non-finite q could be Inf if x is empty. Not appropriate for a left endpoint!\n  extra_break <- if (is.null(extend) && is_gt_minus_inf(q)) q else class_bounds(x)[1]\n  res <- santoku_cast_common(extra_break, unclass_breaks(breaks))\n  breaks <- vctrs::vec_c(res[[1]], res[[2]])\n  # Ensure that a new \"singleton\" break has the right TRUE,FALSE left-closed\n  # pattern\n  if (length(breaks) > 1 && breaks[1] == breaks[2]) {\n    left[1] <- FALSE\n  }\n  breaks <- create_breaks(breaks, c(TRUE, left))\n\n  breaks\n}\n\n\n#' Extend the right endpoint of a breaks object according to user parameters\n#'\n#' This always adds a new break, which is `Inf` if `extend` is `TRUE`\n#' and equal to the maximum of `x` if `extend` is `NULL`.\n#'\n#' It fixes the `left` attribute if a new singleton break is going to be\n#' created.\n#'\n#' @param breaks,x,extend Passed in from a `brk_` inner function\n#'\n#' @return A new breaks object\n#' @noRd\nextend_endpoint_right <- function (breaks, x, extend) {\n  left <- attr(breaks, \"left\")\n  q <- quiet_max(x)\n  extra_break <- if (is.null(extend) && is_lt_inf(q)) q else class_bounds(x)[2]\n  # necessary because min() and max() may unclass things\n  res <- santoku_cast_common(unclass_breaks(breaks), extra_break)\n  breaks <- vctrs::vec_c(res[[1]], res[[2]])\n  lb <- length(breaks)\n  # Ensure that a new \"singleton\" break has the right TRUE,FALSE left-closed\n  # pattern\n  if (lb > 1 && breaks[lb] == breaks[lb - 1]) {\n    left[length(left)] <- TRUE\n  }\n  breaks <- create_breaks(breaks, c(left, FALSE))\n\n  breaks\n}\n\n\nis_lt_inf <- function (x) {\n  x <- tryCatch(strict_as_numeric(x),\n                  error = function (...) return(TRUE)\n                )\n  x < Inf\n}\n\n\nis_gt_minus_inf <- function (x) {\n  x <- tryCatch(strict_as_numeric(x),\n                  error = function (...) return(TRUE)\n                )\n  x > -Inf\n}\n\n\n#' Return the infimum and supremum of a class\n#'\n#' The default tries to cast `c(-Inf, Inf)` to the\n#' class. If this fails, it returns `c(min(x), max(x))`\n#' and emits a warning.\n#'\n#' @param x Only used for its class\n#'\n#' @return A length-two object\n#' @noRd\nclass_bounds <- function (x) {\n  UseMethod(\"class_bounds\")\n}\n\n\n#' @export\nclass_bounds.numeric <- function (x) c(-Inf, Inf)\n\n\n#' @export\nclass_bounds.POSIXct <- function (x) {\n  as.POSIXct(c(-Inf, Inf), origin = \"1970-01-01\")\n}\n\n\n#' @export\nclass_bounds.Date <- function (x) {\n  as.Date(c(-Inf, Inf), origin = \"1970-01-01\")\n}\n\n\n#' @export\nclass_bounds.difftime <- function (x) {\n  as.difftime(c(-Inf, Inf), units = units(x))\n}\n\n\n#' @export\nclass_bounds.units <- function (x) {\n  loadNamespace(\"units\")\n  # note: the units() call is from namespace base, not units\n  units::set_units(c(-Inf, Inf), units(x), mode = \"standard\")\n}\n\n\n#' @export\nclass_bounds.integer64 <- function (x) {\n  loadNamespace(\"bit64\")\n  bit64::lim.integer64()\n}\n\n\n#' @export\nclass_bounds.zoo <- function (x) {\n  loadNamespace(\"zoo\")\n  zoo::zoo(c(-Inf, Inf))\n}\n\n\n#' @export\nclass_bounds.default <- function (x) {\n  tryCatch(\n    vctrs::vec_cast(c(-Inf, Inf), x),\n    error = function(...) {\n      warning(\"Class '\", paste(class(x), collapse = \"', '\"),\n              \"' has no natural endpoints corresponding to +/-Inf for `extend = TRUE`;\")\n      c(quiet_min(x), quiet_max(x))\n    }\n  )\n}\n\n\n#' Removes the \"breaks\" class, and all subclasses, from a break object\n#'\n#' @param breaks A breaks object\n#'\n#' @return The object, with any remaining (super)classes\n#' @noRd\nunclass_breaks <- function (breaks) {\n  assert_that(is.breaks(breaks))\n\n  class_pos <- inherits(breaks, \"breaks\", which = TRUE)\n  superclasses <- class(breaks)[-seq_len(class_pos)]\n\n  class(breaks) <- if (length(superclasses) == 0 ) {\n                     NULL\n                   } else {\n                     superclasses\n                   }\n\n  # this helps vec_cast_common deal with unusual types of breaks\n  attr(breaks, \"left\") <- NULL\n\n  breaks\n}\n\n\n#' @export\nas.double.breaks <- function (x, ...) {\n  as.double(unclass_breaks(x), ...)\n}\n\n\n#' Return a sequence of width `width`\n#'\n#' @param width An object representing a width\n#' @param start Element to start from\n#' @param until Result must be just long enough to cover this element\n#'\n#' @return A sequence of breaks\n#' @noRd\nsequence_width <- function(width, start, until) {\n  UseMethod(\"sequence_width\")\n}\n\n\n#' @export\nsequence_width.default <- function (width, start, until) {\n  breaks <- seq(start, until, width)\n\n  too_short <- if (sign(width) > 0) {\n    breaks[length(breaks)] < until\n  } else {\n    breaks[length(breaks)] > until\n  }\n\n  # length(breaks) == 1L captures when start == max_x\n  if (too_short || length(breaks) == 1L) {\n    breaks <- c(breaks, breaks[length(breaks)] + width)\n  }\n\n  breaks\n}\n\n\n#' @export\nsequence_width.Period <- function(width, start, until) {\n  loadNamespace(\"lubridate\")\n\n  if (as.numeric(until - start) %% as.numeric(width) != 0 || until == start) {\n    # extend to cover all data / ensure at least one interval\n    until <- lubridate::add_with_rollback(until, width)\n  }\n  # alternative to seq, using Period arithmetic\n  # We find the number n of widths that gets beyond seq_end\n  # and add (width * 0:n) to start\n  # normally this would be ceiling((seq_end - start)/width)\n  # we calculate it roughly using a Duration\n  n_intervals <- ceiling((until - start)/lubridate::as.duration(width))\n  breaks <- lubridate::add_with_rollback(start, (seq(0, n_intervals) * width))\n\n  last_break <- breaks[length(breaks)]\n  too_short <- if (width > 0) {\n    last_break < until\n  } else {\n    last_break > until\n  }\n  if (too_short) {\n    breaks <- c(breaks, lubridate::add_with_rollback(last_break, width))\n  }\n\n  breaks\n}\n"
  },
  {
    "path": "R/breaks-misc.R",
    "content": "\n#' Create a `breaks` object manually\n#'\n#' @param breaks A vector, which must be sorted.\n#' @param left_vec A logical vector, the same length as `breaks`.\n#'   Specifies whether each break is left-closed or right-closed.\n#'\n#' @inherit breaks-doc return\n#'\n#' @details\n#'\n#' All breaks must be closed on exactly one side, like `..., x) [x, ...`\n#' (left-closed) or `..., x) [x, ...` (right-closed).\n#'\n#' For example, if `breaks = 1:3` and `left = c(TRUE, FALSE, TRUE)`, then the\n#' resulting intervals are \\preformatted{\n#' T        F       T\n#' [ 1,  2 ] ( 2, 3 )\n#' }\n#'\n#' Singleton breaks are created by repeating a number in `breaks`. Singletons\n#' must be closed on both sides, so if there is a repeated number\n#' at indices `i`, `i+1`, `left[i]` *must* be `TRUE` and `left[i+1]` must be\n#' `FALSE`.\n#'\n#' `brk_manual()` ignores `left` and `close_end` arguments passed in\n#' from [chop()], since `left_vec` sets these manually.\n#' `extend` and `drop` arguments are respected as usual.\n#'\n#' @export\n#'\n#' @examples\n#' lbrks <- brk_manual(1:3, rep(TRUE, 3))\n#' chop(1:3, lbrks, extend = FALSE)\n#'\n#' rbrks <- brk_manual(1:3, rep(FALSE, 3))\n#' chop(1:3, rbrks, extend = FALSE)\n#'\n#' brks_singleton <- brk_manual(\n#'       c(1,    2,    2,     3),\n#'       c(TRUE, TRUE, FALSE, TRUE))\n#'\n#' chop(1:3, brks_singleton, extend = FALSE)\n#'\nbrk_manual <- function (breaks, left_vec) {\n  assert_that(\n          is.numeric(breaks),\n          noNA(breaks),\n          is.logical(left_vec),\n          noNA(left_vec),\n          length(left_vec) == length(breaks)\n        )\n\n  function (x, extend, left, close_end) {\n    if (! left) warning(\"Ignoring `left` with `brk_manual()`\")\n    if (! close_end) warning(\"Ignoring `close_end` with `brk_manual()`\")\n    breaks <- create_breaks(breaks, left_vec)\n    breaks <- extend_and_close(breaks, x, extend, left = TRUE, close_end = FALSE)\n\n    breaks\n  }\n}\n\n\n#' @rdname chop_fn\n#' @export\n#' @order 2\nbrk_fn <- function (fn, ...) {\n  assert_that(is.function(fn))\n\n  function (x, extend, left, close_end) {\n    breaks <- fn(x, ...)\n    # some functions (e.g. quantile()) return a named vector\n    # which might create surprise labels:\n    breaks <- unname(breaks)\n    assert_that(is.numeric(breaks))\n    if (length(breaks) == 0) {\n      return(empty_breaks())\n    }\n\n    breaks <- create_extended_breaks(breaks, x, extend, left, close_end)\n\n    breaks\n  }\n}\n\n\n#' @rdname chop_pretty\n#'\n#' @export\n#' @order 2\nbrk_pretty <- function (n = 5, ...) {\n  assert_that(is.count(n))\n\n  function (x, extend, left, close_end) {\n    breaks <- base::pretty(x, n = n, ...)\n    if (length(breaks) == 0 || is.null(breaks)) {\n      return(empty_breaks())\n    }\n\n    breaks <- create_extended_breaks(breaks, x, extend, left, close_end)\n\n    breaks\n  }\n}\n\n\n#' @rdname chop_mean_sd\n#' @export\n#' @order 2\n#' @importFrom lifecycle deprecated\nbrk_mean_sd <- function (sds = 1:3, sd = deprecated()) {\n  if (lifecycle::is_present(sd)) {\n    lifecycle::deprecate_warn(\n            when = \"0.7.0\",\n            what = \"brk_mean_sd(sd)\",\n            with = \"brk_mean_sd(sds = 'vector of sds')\"\n          )\n    assert_that(is.number(sd), sd > 0)\n    # we start from 0 but remove the 0\n    # this works for e.g. sd = 0.5, whereas seq(1L, sd, 1L) would not:\n    sds <- seq(0L, sd, 1L)[-1]\n    if (! sd %in% sds) sds <- c(sds, sd)\n  }\n\n  assert_that(is.numeric(sds), all(sds > 0))\n\n  function (x, extend, left, close_end) {\n    x_mean <- mean(x, na.rm = TRUE)\n    x_sd <- stats::sd(x, na.rm = TRUE)\n\n    if (is.na(x_mean) || is.na(x_sd) || x_sd == 0) {\n      return(empty_breaks())\n    }\n\n    # add negative sds, then scale them by mean and sd\n    sds <- sort(sds)\n    sds <- c(-rev(sds), 0, sds)\n    breaks <- sds * x_sd + x_mean\n    breaks <- create_lr_breaks(breaks, left)\n\n    needs <- needs_extend(breaks, x, extend, left, close_end)\n    if ((needs & LEFT) > 0) sds <- c(-Inf, sds)\n    if ((needs & RIGHT) > 0) sds <- c(sds, Inf)\n    breaks <- extend_and_close(breaks, x, extend, left, close_end)\n\n    class(breaks) <- c(\"sdBreaks\", class(breaks))\n    attr(breaks, \"scaled_endpoints\") <- sds\n\n    breaks\n  }\n}\n"
  },
  {
    "path": "R/breaks.R",
    "content": "\n#' @param breaks A numeric vector.\n#' @name breaks-doc\n#' @return A function which returns an object of class `breaks`.\nNULL\n\n\n#' Create a standard set of breaks\n#'\n#' @inherit breaks-doc params return\n#' @export\n#'\n#' @examples\n#'\n#' chop(1:10, c(2, 5, 8))\n#' chop(1:10, brk_default(c(2, 5, 8)))\n#'\nbrk_default <- function (breaks) {\n  assert_that(noNA(breaks))\n\n  function (x, extend, left, close_end) {\n    create_extended_breaks(breaks, x, extend, left, close_end)\n  }\n}\n\n\n#' @rdname chop_spikes\n#' @export\n#' @order 2\nbrk_spikes <- function (breaks, n = NULL, prop = NULL) {\n  assert_that(\n    is.number(n) || is.number(prop),\n    is.null(n) || is.null(prop),\n    msg = \"exactly one of `n` and `prop` must be a scalar numeric\"\n  )\n  assert_that(\n    # it's ok for one of these to be null\n    n >= 0 || prop >= 0\n  )\n\n  if (! is.function(breaks)) breaks <- brk_default(breaks)\n\n  function (x, extend, left, close_end) {\n    breaks <- breaks(x, extend, left, close_end)\n    break_elements <- unclass_breaks(breaks)\n    left_vec <- attr(breaks, \"left\")\n\n    spikes <- find_spikes(x, n, prop)\n    # We sort spikes in decreasing order so that when we add elements,\n    # earlier elements remain in place.\n    spikes <- sort(spikes, decreasing = TRUE)\n\n    for (spike in spikes) {\n      # We could use match() here to go faster, or even put it outside the loop.\n      match_location <- which(spike == break_elements)\n      n_matches <- length(match_location)\n      # If two break elements match the spike, it's already a singleton:\n      # we don't need to do anything.\n      if (n_matches >= 2L) next\n      if (n_matches == 1L) {\n        # We turn the single matching break into a singleton and make sure\n        # that left is c(TRUE, FALSE)\n        break_elements <- append(break_elements, spike, after = match_location)\n        left_vec <- append(left_vec, FALSE, after = match_location)\n        left_vec[match_location] <- TRUE\n      } else {\n        # We add a singleton break at `spike`\n        insert_location <- quiet_max(which(spike > break_elements))\n        if (insert_location <= 0) insert_location <- 0\n        break_elements <- append(break_elements, rep(spike, 2),\n                                 after = insert_location)\n        left_vec <- append(left_vec, c(TRUE, FALSE), after = insert_location)\n      }\n    }\n\n    create_breaks(break_elements, left = left_vec)\n  }\n}\n\n\n#' Class representing a set of intervals\n#'\n#' @param x A breaks object\n#' @param ... Unused\n#'\n#' @name breaks-class\nNULL\n\n\n#' @rdname breaks-class\n#' @export\nformat.breaks <- function (x, ...) {\n  if (length(x) < 2) return(\"Breaks object: no complete intervals\")\n  paste0(\"Breaks object: \", paste(lbl_intervals()(x), collapse = \" \"))\n}\n\n\n#' @rdname breaks-class\n#' @export\nprint.breaks <- function (x, ...) cat(format(x, ...))\n\n\n#' @rdname breaks-class\n#' @export\nis.breaks <- function (x, ...) inherits(x, \"breaks\")\n\n\non_failure(is.breaks) <- function (call, env) {\n  paste0(deparse(call$x), \" is not an object of class `breaks`\")\n}\n"
  },
  {
    "path": "R/categorize.R",
    "content": "\n#' Categorize `x` according to breaks\n#'\n#' @param x A vector of data\n#' @param breaks A breaks object\n#'\n#' @return A set of vector codes\n#' @noRd\ncategorize <- function (x, breaks) {\n  # we first cast to the most informative common type. Then to numeric.\n\n  left <- attr(breaks, \"left\")\n  res <- santoku_cast_common(x, unclass_breaks(breaks))\n  # vec_cast won't accept e.g. characters but it also won't convert e.g. Dates\n  # as.numeric accepts both\n  # We want to convert things to numeric objects, but NB, not all\n  # numeric objects will work OK in categorize_impl\n  x <- tryCatch(strict_as_numeric(res[[1]]),\n                  error   = function (...) res[[1]]\n                )\n  breaks <- tryCatch(strict_as_numeric(res[[2]]),\n                       error   = function (...) res[[2]]\n                     )\n\n  # we use is_bare_numeric here because e.g. large integer64 vectors will\n  # fail in categorize_impl()\n  codes <- if (rlang::is_bare_numeric(x) && rlang::is_bare_numeric(breaks)) {\n    categorize_impl(x, breaks, left)\n  } else {\n    categorize_non_numeric(x, breaks, left)\n  }\n\n  codes\n}\n\n\ncategorize_non_numeric <- function (x, breaks, left) {\n\n  if (is.character(x) || is.character(breaks)) {\n    if (getOption(\"santoku.warn_character\", TRUE)) {\n      warning_statement <- paste(\n        \"`x` or `breaks` is of type character, using lexical sorting.\",\n        \"To turn off this warning, run:\",\n        \"  options(santoku.warn_character = FALSE)\",\n        collapse = \"\\n\")\n      warning(warning_statement)\n    }\n  }\n\n  codes <- rep(NA_integer_, length(x))\n\n  for (j in seq_len(length(breaks) - 1)) {\n    more_than_j <- x > breaks[j]\n    less_than_j_plus_one <- x < breaks[j+1]\n    equals_j <- x == breaks[j]\n    equals_j_plus_one <- x == breaks[j+1]\n\n    codes[more_than_j & less_than_j_plus_one] <- j\n    if (left[j]) codes[equals_j] <- j\n    if (! left[j+1]) codes[equals_j_plus_one] <- j\n  }\n\n  codes\n}"
  },
  {
    "path": "R/chop-by-group-size.R",
    "content": "\n#' Chop by quantiles\n#'\n#' `chop_quantiles()` chops data by quantiles.\n#' `chop_deciles()` is a convenience function which chops into deciles.\n#'\n#' @param probs A vector of probabilities for the quantiles. If `probs` has\n#'   names, these will be used for labels.\n#' @param ... For `chop_quantiles`, passed to [chop()]. For `brk_quantiles()`,\n#'   passed to [stats::quantile()] or [Hmisc::wtd.quantile()].\n#' @param weights `NULL` or numeric vector of same length as `x`. If not\n#'   `NULL`, [Hmisc::wtd.quantile()] is used to calculate weighted quantiles.\n#' @param recalc_probs Logical. Recalculate probabilities of quantiles using\n#'   [`ecdf(x)`][stats::ecdf()]? See below.\n#'\n#' @inheritParams chop\n#' @inherit chop-doc params return\n#'\n#' @details\n#' For non-numeric `x`, `left` is set to `FALSE` by default. This works better\n#' for calculating \"type 1\" quantiles, since they round down. See\n#' [stats::quantile()].\n#'\n#' By default, `chop_quantiles()` shows the requested probabilities in the\n#' labels. To show the numeric quantiles themselves, set `raw = TRUE`.\n#'\n#' When `x` contains duplicates, consecutive quantiles may be the same number. If\n#' so, interval labels may be misleading, and if `recalc_probs = FALSE` a warning is\n#' emitted. Set `recalc_probs = TRUE` to recalculate the probabilities of the quantiles\n#' using the [empirical cumulative distribution function][stats::ecdf()] of `x`.\n#' Doing so may give you different labels from what you expect, and will\n#' remove any names from `probs`, but it never changes the actual\n#' quantiles used for breaks. At present, `recalc_probs = TRUE` is incompatible \n#' with non-null `weights`. See the example below.\n#'\n#' @family chopping functions\n#'\n#' @export\n#' @order 1\n#'\n#' @examples\n#' chop_quantiles(1:10, 1:3/4)\n#'\n#' chop_quantiles(1:10, c(Q1 = 0, Q2 = 0.25, Q3 = 0.5, Q4 = 0.75))\n#'\n#' chop(1:10, brk_quantiles(1:3/4))\n#'\n#' chop_deciles(1:10)\n#'\n#' # to label by the quantiles themselves:\n#' chop_quantiles(1:10, 1:3/4, raw = TRUE)\n#'\n#' # duplicate quantiles:\n#' x <- c(1, 1, 1, 2, 3)\n#' quantile(x, 1:5/5)\n#' tab_quantiles(x, 1:5/5)\n#' tab_quantiles(x, 1:5/5, recalc_probs = TRUE)\nchop_quantiles <- function(\n                    x,\n                    probs,\n                    ...,\n                    labels    = if (raw) lbl_intervals() else\n                                         lbl_intervals(single = NULL),\n                    left      = is.numeric(x),\n                    raw       = FALSE,\n                    weights   = NULL,\n                    recalc_probs  = FALSE\n                  ) {\n  chop(x, brk_quantiles(probs, weights = weights, recalc_probs = recalc_probs),\n       labels = labels, ..., left = left, raw = raw)\n}\n\n\n#' @rdname chop_quantiles\n#' @export\n#' @order 1\nchop_deciles <- function(x, ...) {\n  chop_quantiles(x, 0:10/10, ...)\n}\n\n\n#' Chop equal-sized groups\n#'\n#' `chop_equally()` chops `x` into groups with an equal number of elements.\n#'\n#' @param groups Number of groups.\n#' @inheritParams chop\n#' @inherit chop-doc params return\n#'\n#' @details\n#' `chop_equally()` uses [brk_quantiles()] under the hood. If `x` has duplicate\n#' elements, you may get fewer `groups` than requested. If so, a warning will\n#' be emitted. See the examples.\n#'\n#' @family chopping functions\n#'\n#' @export\n#' @order 1\n#' @examples\n#' chop_equally(1:10, 5)\n#'\n#' # You can't always guarantee equal-sized groups:\n#' dupes <- c(1, 1, 1, 2, 3, 4, 4, 4)\n#' quantile(dupes, 0:4/4)\n#' chop_equally(dupes, 4)\n#' # Or as many groups as you ask for:\n#' chop_equally(c(1, 1, 2, 2), 3)\nchop_equally <- function (\n                  x,\n                  groups,\n                  ...,\n                  labels    = lbl_intervals(),\n                  left      = is.numeric(x),\n                  raw       = TRUE\n                ) {\n  chop(x, brk_equally(groups), ..., labels = labels, left = left, raw = raw)\n}\n\n\n#' Chop into fixed-sized groups\n#'\n#' `chop_n()` creates intervals containing a fixed number of elements.\n#'\n#' @param n Integer. Number of elements in each interval.\n#' @inheritParams chop\n#' @param tail String. What to do if the final interval has fewer than `n` elements?\n#'   `\"split\"` to keep it separate. `\"merge\"` to merge it with the neighbouring\n#'   interval.\n#' @inherit chop-doc params return\n#'\n#'\n#' @details\n#'\n#' The algorithm guarantees that intervals contain no more than `n` elements, so\n#' long as there are no duplicates in `x` and `tail = \"split\"`. It also\n#' guarantees that intervals contain no fewer than `n` elements, except possibly\n#' the last interval (or first interval if `left` is `FALSE`).\n#'\n#' To ensure that all intervals contain at least `n` elements (so long as there\n#' are at least `n` elements in `x`!) set `tail = \"merge\"`.\n#'\n#' If `tail = \"split\"` and there are intervals containing duplicates with more\n#' than `n` elements, a warning is given.\n#'\n#' @export\n#' @order 1\n#' @family chopping functions\n#' @examples\n#' chop_n(1:10, 5)\n#'\n#' chop_n(1:5, 2)\n#' chop_n(1:5, 2, tail = \"merge\")\n#'\n#' # too many duplicates\n#' x <- rep(1:2, each = 3)\n#' chop_n(x, 2)\n#'\nchop_n <- function (\n            x,\n            n,\n            ...,\n            tail = \"split\"\n          ) {\n  res <- chop(x, brk_n(n, tail = tail), ...)\n  if (tail == \"split\" && max(tabulate(res)) > n) {\n    warning(\"Some intervals contain more than \", n, \" elements\")\n  }\n\n  res\n}\n\n"
  },
  {
    "path": "R/chop-by-width.R",
    "content": "\n#' Chop into fixed-width intervals\n#'\n#' `chop_width()` chops `x` into intervals of fixed `width`.\n#'\n#' @param width Width of intervals.\n#' @param start Starting point for intervals. By default the smallest\n#'   finite `x` (largest if `width` is negative).\n#' @inheritParams chop\n#' @inherit chop-doc params return\n#'\n#' @details\n#' If `width` is negative, `chop_width()` sets `left = FALSE` and intervals will\n#' go downwards from `start`.\n#'\n#' @family chopping functions\n#' @seealso [brk_width-for-datetime]\n#'\n#' @export\n#' @order 1\n#'\n#' @examples\n#' chop_width(1:10, 2)\n#'\n#' chop_width(1:10, 2, start = 0)\n#'\n#' chop_width(1:9, -2)\n#'\n#' chop(1:10, brk_width(2, 0))\n#'\nchop_width <- function (\n                x,\n                width,\n                start,\n                ...,\n                left = sign(width) > 0\n              ) {\n  chop(x, brk_width(width, start), ..., left = left)\n}\n\n\n#' Chop into equal-width intervals\n#'\n#' `chop_evenly()` chops `x` into `intervals` intervals of equal width.\n#'\n#' @param intervals Integer: number of intervals to create.\n#' @inheritParams chop\n#' @inherit chop-doc params return\n#'\n#' @family chopping functions\n#'\n#' @export\n#' @order 1\n#' @examples\n#' chop_evenly(0:10, 5)\n#'\nchop_evenly <- function (\n                 x,\n                 intervals,\n                 ...\n               ) {\n  chop(x, brk_evenly(intervals), ...)\n}\n\n\n#' Chop into proportions of the range of x\n#'\n#' `chop_proportions()` chops `x` into `proportions` of its range, excluding\n#' infinite values.\n#'\n#' By default, labels show the raw numeric endpoints. To label intervals by\n#' the proportions, use `raw = FALSE`.\n#'\n#' @param proportions Numeric vector between 0 and 1: proportions of x's range.\n#'   If `proportions` has names, these will be used for labels.\n#' @inheritParams chop\n#' @inherit chop-doc params return\n#'\n#' @export\n#' @order 1\n#' @family chopping functions\n#' @examples\n#' chop_proportions(0:10, c(0.2, 0.8))\n#' chop_proportions(0:10, c(Low = 0, Mid = 0.2, High = 0.8))\n#'\nchop_proportions <- function (\n                      x,\n                      proportions,\n                      ...,\n                      raw    = TRUE\n                    ) {\n  chop(x, brk_proportions(proportions), ..., raw = raw)\n}"
  },
  {
    "path": "R/chop-isolates.R",
    "content": "\n#' Chop common values into singleton intervals\n#'\n#' `chop_spikes()` lets you chop common values of `x` into their own\n#' singleton intervals. This can help make unusual values visible.\n#'\n#' This function is `r lifecycle::badge(\"experimental\")`.\n#'\n#' @param breaks A numeric vector of cut-points or a call to a `brk_*` function.\n#'   The resulting [`breaks`][breaks-class] object will be modified to add\n#'   singleton breaks.\n#' @param n,prop Scalar. Provide either `n`, a number of values, or `prop`,\n#'   a proportion of `length(x)`. Values of `x` which occur at least this\n#'   often will get their own singleton break.\n#' @inheritParams chop\n#' @inherit chop-doc params return\n#'\n#' @export\n#' @order 1\n#' @family chopping functions\n#' @seealso [dissect()] for a different approach.\n#' @examples\n#' x <- c(1:4, rep(5, 5), 6:10)\n#' chop_spikes(x, c(2, 7), n = 5)\n#' chop_spikes(x, c(2, 7), prop = 0.25)\n#' chop_spikes(x, brk_width(5), n = 5)\n#'\n#' set.seed(42)\n#' x <- runif(40, 0, 10)\n#' x <- sample(x, 200, replace = TRUE)\n#' tab_spikes(x, brk_width(2, 0), prop = 0.05)\nchop_spikes <- function (\n    x,\n    breaks,\n    ...,\n    n = NULL,\n    prop = NULL\n) {\n  chop(x, brk_spikes(breaks, n = n, prop = prop), ...)\n}\n\n\n#' Cut data into intervals, separating out common values\n#'\n#' Sometimes it's useful to separate out common elements of `x`.\n#' `dissect()` chops `x`, but puts common elements of `x` (\"spikes\")\n#' into separate categories.\n#'\n#' Unlike [chop_spikes()], `dissect()` doesn't break up\n#' intervals which contain a spike. As a result, unlike `chop_*` functions,\n#' `dissect()` does not chop `x` into disjoint intervals. See the examples.\n#'\n#' If breaks are data-dependent, their labels may be misleading after common\n#' elements have been removed. See the example below. To get round this,\n#' set `exclude_spikes` to `TRUE`. Then breaks will be calculated after\n#' removing spikes from the data.\n#'\n#' Levels of the result are ordered by the minimum element in each level. As\n#' a result, if `drop = FALSE`, empty levels will be placed last.\n#'\n#' This function is `r lifecycle::badge(\"experimental\")`.\n#'\n#' @param x,breaks,... Passed to [chop()].\n#' @inheritParams chop_spikes\n#' @param spike_labels [Glue][glue::glue()] string for spike labels. Use `\"{l}\"`\n#' for the spike value.\n#' @param exclude_spikes Logical. Exclude spikes before chopping `x`? This\n#'   can affect the location of data-dependent breaks.\n#'\n#' @return\n#' `dissect()` returns the result of [chop()], but with common values put into\n#' separate factor levels.\n#'\n#' `tab_dissect()` returns a contingency [table()][base::table].\n#'\n#' @seealso [chop_spikes()] for a different approach.\n#' @export\n#' @order 1\n#'\n#' @examples\n#' x <- c(2, 3, 3, 3, 4)\n#' dissect(x, c(2, 4), n = 3)\n#' dissect(x, brk_width(2), prop = 0.5)\n#'\n#' set.seed(42)\n#' x <- runif(40, 0, 10)\n#' x <- sample(x, 200, replace = TRUE)\n#' # Compare:\n#' table(dissect(x, brk_width(2, 0), prop = 0.05))\n#' # Versus:\n#' tab_spikes(x, brk_width(2, 0), prop = 0.05)\n#'\n#' # Potentially confusing data-dependent breaks:\n#' set.seed(42)\n#' x <- rnorm(99)\n#' x[1:9] <- x[1]\n#' tab_quantiles(x, 1:2/3)\n#' tab_dissect(x, brk_quantiles(1:2/3), n = 9)\n#' # Calculate quantiles excluding spikes:\n#' tab_dissect(x, brk_quantiles(1:2/3), n = 9, exclude_spikes = TRUE)\ndissect <- function (x,\n                     breaks,\n                     ...,\n                     n = NULL,\n                     prop = NULL,\n                     spike_labels = \"{{{l}}}\",\n                     exclude_spikes = FALSE) {\n  assert_that(\n    is.number(n) || is.number(prop),\n    is.null(n) || is.null(prop),\n    is.string(spike_labels),\n    is.flag(exclude_spikes),\n    msg = \"exactly one of `n` and `prop` must be a scalar numeric\"\n  )\n  assert_that(\n    # it's ok for one of these to be null\n    n >= 0 || prop >= 0\n  )\n\n  spikes <- find_spikes(x, n, prop)\n  x_spikes <- match(x, spikes)\n  is_spike <- ! is.na(x_spikes)\n  x_spikes <- x_spikes[is_spike]\n\n  if (exclude_spikes) {\n    x_not_spikes <- x[! is_spike]\n    chopped_not_spikes <- chop(x_not_spikes, breaks, ...)\n    chopped <- factor(rep(NA_integer_, length(x)),\n                      levels = levels(chopped_not_spikes))\n    chopped[! is_spike] <- chopped_not_spikes\n  } else {\n    chopped <- chop(x, breaks, ...)\n  }\n\n  elabels <- endpoint_labels(spikes, raw = TRUE)\n  glue_env <- new.env()\n  assign(\"l\", elabels, envir = glue_env)\n  spike_labels <- glue::glue(spike_labels, .envir = glue_env)\n\n  new_levels <- c(levels(chopped), spike_labels)\n  levels(chopped) <- new_levels\n\n  chopped[is_spike] <- spike_labels[x_spikes]\n\n  # We reorder the levels of chopped in order of their smallest elements.\n  # Note that if `drop = FALSE`, empty intervals will be at the end.\n  # The alternative would be to call `breaks` again and get the left endpoints\n  # but this is complex.\n  chopped <- stats::reorder(chopped, x, FUN = quiet_min)\n  attr(chopped, \"scores\") <- NULL # remove leftover from reorder()\n\n  chopped\n}\n\n\n#' Find common elements in `x`\n#'\n#' @param x A vector\n#' @param n Number of elements that counts as common. Specify exactly one of `n`\n#'   and `prop`.\n#' @param prop Proportion of `length(x)` that counts as common\n#'\n#' @return The common elements, not necessarily in order. NA values are never\n#' considered as common.\n#' @noRd\nfind_spikes <- function (x, n, prop) {\n  n <- n %||% (length(x) * prop)\n  unique_x <- unique(x)\n  x_counts <- tabulate(match(x, unique_x))\n  spikes <- unique_x[x_counts >= n]\n  spikes <- spikes[! is.na(spikes)]\n\n  spikes\n}\n"
  },
  {
    "path": "R/chop-misc.R",
    "content": "\n\n#' Chop by standard deviations\n#'\n#' Intervals are measured in standard deviations on either side of the\n#' mean.\n#'\n#' In version 0.7.0, these functions changed to specifying `sds` as a vector.\n#' To chop 1, 2 and 3 standard deviations around the mean, write\n#' `chop_mean_sd(x, sds = 1:3)` instead of `chop_mean_sd(x, sd = 3)`.\n#'\n#' @param sds Positive numeric vector of standard deviations.\n#' @param sd  `r lifecycle::badge(\"deprecated\")`\n#'\n#' @inheritParams chop\n#' @inherit chop-doc params return\n#'\n#' @family chopping functions\n#'\n#' @export\n#' @order 1\n#'\n#' @examples\n#' chop_mean_sd(1:10)\n#'\n#' chop(1:10, brk_mean_sd())\n#'\n#' @importFrom lifecycle deprecated\nchop_mean_sd <- function (\n                  x,\n                  sds = 1:3,\n                  ...,\n                  raw = FALSE,\n                  sd  = deprecated()\n                ) {\n  chop(x, brk_mean_sd(sds = sds, sd = sd), ..., raw = raw)\n}\n\n\n#' Chop using pretty breakpoints\n#'\n#' `chop_pretty()` uses [base::pretty()] to calculate breakpoints\n#' which are 1, 2 or 5 times a power of 10. These look nice in graphs.\n#'\n#' [base::pretty()] tries to return `n+1` breakpoints, i.e. `n` intervals, but\n#' note that this is not guaranteed. There are methods for Date and POSIXct\n#' objects.\n#'\n#' For fine-grained control over [base::pretty()] parameters, use\n#' `chop(x, brk_pretty(...))`.\n#'\n#' @inheritParams chop\n#' @inherit chop-doc params return\n#' @param n Positive integer passed to [base::pretty()]. How many intervals to chop into?\n#' @param ... Passed to [chop()] by `chop_pretty()` and `tab_pretty()`; passed\n#'   to [base::pretty()] by `brk_pretty()`.\n#'\n#' @export\n#' @order 1\n#'\n#' @examples\n#' chop_pretty(1:10)\n#'\n#' chop(1:10, brk_pretty(n = 5, high.u.bias = 0))\n#'\nchop_pretty <- function (x, n = 5, ...) {\n  chop(x, brk_pretty(n = n), ...)\n}\n\n\n#' Chop using an existing function\n#'\n#' `chop_fn()` is a convenience wrapper: `chop_fn(x, foo, ...)`\n#' is the same as `chop(x, foo(x, ...))`.\n#'\n#' @param fn A function which returns a numeric vector of breaks.\n#' @param ... Further arguments to `fn`\n#' @inheritParams chop\n#' @inherit chop-doc params return\n#'\n#' @export\n#' @order 1\n#' @family chopping functions\n#' @examples\n#'\n#' if (requireNamespace(\"scales\")) {\n#'   chop_fn(rlnorm(10), scales::breaks_log(5))\n#'   # same as\n#'   # x <- rlnorm(10)\n#'   # chop(x, scales::breaks_log(5)(x))\n#' }\n#'\nchop_fn <- function (\n             x,\n             fn,\n             ...,\n             extend = NULL,\n             left = TRUE,\n             close_end = TRUE,\n             raw = NULL,\n             drop = TRUE\n) {\n  chop(x, brk_fn(fn, ...), extend = extend, left = left, close_end = close_end,\n         raw = raw, drop = drop)\n}\n\n"
  },
  {
    "path": "R/chop.R",
    "content": "\n\n#' @name chop-doc\n#' @param ... Passed to [chop()].\n#' @return\n#' `chop_*` functions return a [`factor`][base::factor] of the same length as `x`.\n#'\n#' `brk_*` functions return a [`function`] to create `breaks`.\n#'\n#' `tab_*` functions return a contingency [`table`][base::table].\nNULL\n\n\n#' Cut data into intervals\n#'\n#' `chop()` cuts `x` into intervals. It returns a [`factor`][base::factor] of\n#' the same length as `x`, representing which interval contains each element of `x`.\n#' `kiru()` is an alias for `chop`.\n#' `tab()` calls `chop()` and returns a contingency [`table`][base::table] from\n#' the result.\n#'\n#' @param x A vector.\n#' @param breaks A numeric vector of cut-points, or a function to create\n#'   cut-points from `x`.\n#' @param labels A character vector of labels or a function to create labels.\n#' @param extend Logical. If `TRUE`, always extend breaks to `+/-Inf`. If `NULL`,\n#'   extend breaks to `min(x)` and/or `max(x)` only if necessary. If `FALSE`, never\n#'   extend.\n#' @param left Logical. Left-closed or right-closed breaks?\n#' @param close_end Logical. Close last break at right? (If `left` is `FALSE`,\n#'   close first break at left?)\n#' @param raw Logical. Use raw values in labels?\n#' @param drop Logical. Drop unused levels from the result?\n#'\n#' @details\n#'\n#' `x` may be a numeric vector, or more generally, any vector which can be\n#' compared with `<` and `==` (see [Ops][groupGeneric]). In particular\n#' [Date][base::Dates] and [date-time][DateTimeClasses] objects are supported.\n#' Character vectors are supported with a warning.\n#'\n#' ## Breaks\n#'\n#' `breaks` may be a vector or a function.\n#'\n#' If it is a vector, `breaks` gives the interval endpoints. Repeating a value\n#' creates a \"singleton\" interval, which contains only that value.\n#' For example `breaks = c(1, 3, 3, 5)` creates 3 intervals:\n#' \\code{[1, 3)}, \\code{{3}} and \\code{(3, 5]}.\n#'\n#' If `breaks` is a function, it is called with the `x`, `extend`, `left` and\n#' `close_end` arguments, and should return an object of class `breaks`.\n#' Use `brk_*` functions to create a variety of data-dependent breaks.\n#'\n#' Names of `breaks` may be used for labels. See \"Labels\" below.\n#'\n#' ## Options for breaks\n#'\n#' By default, left-closed intervals are created. If `left` is `FALSE`,\n#' right-closed intervals are created.\n#'\n#' If `close_end` is `TRUE` the final break (or first break if `left` is `FALSE`)\n#' will be closed at both ends. This guarantees that all values `x` with\n#' `min(breaks) <= x <= max(breaks)` are included in the intervals.\n#'\n#' Before version 0.9.0, `close_end` was `FALSE` by default, and also behaved\n#' differently with respect to extended breaks: see \"Extending intervals\" below.\n#'\n#' Using [mathematical set notation][lbl_intervals()]:\n#'\n#' * If `left` is `TRUE` and `close_end` is `TRUE`, breaks will look like\n#'   \\code{[b1, b2), [b2, b3) ... [b_(n-1), b_n]}.\n#' * If `left` is `FALSE` and `close_end` is `TRUE`, breaks will look like\n#'    \\code{[b1, b2], (b2, b3] ... (b_(n-1), b_n]}.\n#' * If `left` is `TRUE` and `close_end` is `FALSE`, all breaks will look like\n#'   \\code{... [b1, b2) ...}.\n#' * If `left` is `FALSE` and `close_end` is `FALSE`, all breaks will look like\n#'   \\code{... (b1, b2] ...}.\n#'\n#' ## Extending intervals\n#'\n#' If `extend` is `TRUE`, intervals will be extended to \\code{[-Inf,\n#' min(breaks))} and \\code{(max(breaks), Inf]}.\n#'\n#' If `extend` is `NULL` (the default), intervals will be extended to\n#' \\code{[min(x), min(breaks))} and \\code{(max(breaks), max(x)]}, only if\n#' necessary, i.e. only if elements of `x` would be outside the unextended\n#' breaks.\n#'\n#' If `extend` is `FALSE`, intervals are never extended.\n#'\n#' Note that even when `extend = TRUE`, extended intervals will be\n#' dropped from the factor levels if they contain no elements and `drop = TRUE`.\n#'\n#' `close_end` is only relevant if intervals are not extended;\n#' extended intervals are always closed on the outside. This is a change from\n#' previous behaviour. Up to version 0.8.0, `close_end` was applied to the\n#' last user-specified interval, before any extended intervals were created.\n#'\n#' Since 1.1.0, infinity is represented as \\eqn{\\infty}{the infinity symbol}\n#' in breaks on unicode platforms. Set  `options(santoku.infinity = \"Inf\")`\n#' to get the old behaviour.\n#'\n#' ## Labels\n#'\n#' `labels` may be a character vector. It should have the same length as the\n#' (possibly extended) number of intervals. Alternatively, `labels` may be a\n#' `lbl_*` function such as [lbl_dash()].\n#'\n#' If `breaks` is a named vector, then names of `breaks` will be\n#' used as labels for the interval starting at the corresponding element. This\n#' overrides the `labels` argument (but unnamed breaks will still use `labels`).\n#' This feature is `r lifecycle::badge(\"experimental\")`.\n#'\n#' If `labels` is `NULL`, then integer codes will be returned instead of a\n#' factor.\n#'\n#' If `raw` is `TRUE`, labels will show the actual interval endpoints, usually\n#' numbers. If `raw` is `FALSE` then labels may show other objects, such\n#' as quantiles for [chop_quantiles()] and friends, proportions of the range for\n#' [chop_proportions()], or standard deviations for [chop_mean_sd()].\n#'\n#'  If `raw` is `NULL` then `lbl_*` functions will use their default (usually\n#'  `FALSE`). Otherwise, the `raw` argument to `chop()` overrides `raw` arguments\n#'  passed into `lbl_*` functions directly.\n#'\n#'\n#' ## Miscellaneous\n#'\n#' `NA` values in `x`, and values which are outside the extended endpoints,\n#' return `NA`.\n#'\n#' `kiru()` is a synonym for `chop()`. If you load `{tidyr}`, you can use it to\n#' avoid confusion with `tidyr::chop()`.\n#'\n#' Note that `chop()`, like all of R, uses binary arithmetic. Thus, numbers may\n#' not be exactly equal to what you think they should be. There is an example\n#' below.\n#'\n#' @return\n#' `chop()` returns a [`factor`][base::factor] of the same length as `x`,\n#' representing the intervals containing the value of `x`.\n#'\n#' `tab()` returns a contingency [`table`][base::table].\n#'\n#' @export\n#'\n#' @family chopping functions\n#'\n#' @seealso [base::cut()], [`non-standard-types`] for chopping objects that\n#'   aren't numbers.\n#'\n#' @examples\n#'\n#' chop(1:7, c(2, 4, 6))\n#'\n#' chop(1:7, c(2, 4, 6), extend = FALSE)\n#'\n#' # Repeat a number for a singleton break:\n#' chop(1:7, c(2, 4, 4, 6))\n#'\n#' chop(1:7, c(2, 4, 6), left = FALSE)\n#'\n#' chop(1:7, c(2, 4, 6), close_end = FALSE)\n#'\n#' chop(1:7, brk_quantiles(c(0.25, 0.75)))\n#'\n#' # A single break is fine if `extend` is not `FALSE`:\n#' chop(1:7, 4)\n#'\n#' # Floating point inaccuracy:\n#' chop(0.3/3, c(0, 0.1, 0.1, 1), labels = c(\"< 0.1\", \"0.1\", \"> 0.1\"))\n#'\n#' # -- Labels --\n#'\n#' chop(1:7, c(Lowest = 1, Low = 2, Mid = 4, High = 6))\n#'\n#' chop(1:7, c(2, 4, 6), labels = c(\"Lowest\", \"Low\", \"Mid\", \"High\"))\n#'\n#' chop(1:7, c(2, 4, 6), labels = lbl_dash())\n#'\n#' # Mixing names and other labels:\n#' chop(1:7, c(\"<2\" = 1, 2, 4, \">=6\" = 6), labels = lbl_dash())\n#'\n#' # -- Non-standard types --\n#'\n#' chop(as.Date(\"2001-01-01\") + 1:7, as.Date(\"2001-01-04\"))\n#'\n#' suppressWarnings(chop(LETTERS[1:7], \"D\"))\n#'\n#'\nchop <- function (x, breaks,\n          labels    = lbl_intervals(),\n          extend    = NULL,\n          left      = TRUE,\n          close_end = TRUE,\n          raw       = NULL,\n          drop      = TRUE\n        ) {\n  assert_that(\n          is.flag(extend) || is.null(extend),\n          is.flag(left),\n          is.flag(close_end),\n          is.flag(drop),\n          is.flag(raw) || is.null(raw)\n        )\n\n  if (! is.function(breaks)) breaks <- brk_default(breaks)\n  breaks <- breaks(x, extend, left, close_end)\n  assert_that(is.breaks(breaks), length(breaks) >= 2L)\n\n  codes <- categorize(x, breaks)\n\n  if (is.null(labels)) return(codes)\n\n  lbls <- if (is.function(labels)) {\n    if (is.null(raw)) labels(breaks) else labels(breaks, raw = raw)\n  } else {\n    labels\n  }\n  lbls <- add_break_names(lbls, breaks)\n  stopifnot(length(lbls) == length(breaks) - 1)\n\n  real_codes <- if (drop) unique(codes[! is.na(codes)]) else TRUE\n  if (anyDuplicated(lbls[real_codes])) {\n    stop(\"Duplicate labels found: \", paste(lbls, collapse = \", \"))\n  }\n\n  result <- factor(codes, levels = seq.int(length(breaks) - 1L),\n        labels = lbls)\n  if (drop) result <- droplevels(result)\n\n  return(result)\n}\n\n\n#' @rdname chop\n#' @export\nkiru <- chop\n\n\n#' Chop data precisely (for programmers)\n#'\n#' `fillet()` calls [chop()] with `extend = FALSE` and `drop = FALSE`. This\n#' ensures that you get only the `breaks` and `labels` you ask for. When\n#' programming, consider using `fillet()` instead of `chop()`.\n#'\n#' @inheritParams chop\n#'\n#' @return `fillet()` returns a [`factor`][base::factor] of the same length as\n#' `x`, representing the intervals containing the value of `x`.\n#'\n#' @family chopping functions\n#'\n#' @export\n#'\n#' @examples\n#' fillet(1:10, c(2, 5, 8))\nfillet <- function (\n            x,\n            breaks,\n            labels    = lbl_intervals(),\n            left      = TRUE,\n            close_end = TRUE,\n            raw       = NULL\n          ) {\n  chop(x, breaks, labels, left = left, close_end = close_end, extend = FALSE,\n      raw = raw, drop = FALSE)\n}\n"
  },
  {
    "path": "R/labels-datetime.R",
    "content": "#' Parse a `strftime` format string\n#'\n#' Splits a format string into literal and directive tokens.\n#'\n#' @param fmt A `strftime` format string.\n#'\n#' @return A data frame with columns `type` (`\"literal\"` or `\"directive\"`)\n#'   and `token`.\n#' @noRd\nparse_strftime <- function(fmt) {\n  assert_that(is.string(fmt))\n\n  chars <- strsplit(fmt, \"\", fixed = TRUE)[[1]]\n  n <- length(chars)\n  i <- 1L\n  types <- character(0)\n  tokens <- character(0)\n\n  while (i <= n) {\n    if (chars[i] != \"%\") {\n      start <- i\n      while (i <= n && chars[i] != \"%\") i <- i + 1L\n      types <- c(types, \"literal\")\n      tokens <- c(tokens, paste0(chars[start:(i - 1L)], collapse = \"\"))\n      next\n    }\n\n    if (i < n && chars[i + 1L] == \"%\") {\n      types <- c(types, \"literal\")\n      tokens <- c(tokens, \"%\")\n      i <- i + 2L\n      next\n    }\n\n    start <- i\n    i <- i + 1L\n\n    if (i <= n && chars[i] %in% c(\"E\", \"O\")) i <- i + 1L\n    while (i <= n && grepl(\"[0-9]\", chars[i])) i <- i + 1L\n    if (i <= n) i <- i + 1L\n\n    types <- c(types, \"directive\")\n    tokens <- c(tokens, paste0(chars[start:(i - 1L)], collapse = \"\"))\n  }\n\n  data.frame(type = types, token = tokens, stringsAsFactors = FALSE)\n}\n\n#' Return relative component rank for a strftime directive\n#'\n#' Lower values are \"greater\" components, e.g. year before month before day.\n#'\n#' @param token A single strftime directive token (e.g. \"%Y\").\n#'\n#' @return Numeric rank, or `NA_real_` if unknown.\n#' @noRd\nstrftime_rank <- function(token) {\n  code <- gsub(\"^%[EO]?([0-9]*)\", \"\", token)\n\n  if (code %in% c(\"Y\", \"y\", \"C\", \"G\", \"g\")) return(1)\n  if (code %in% c(\"m\", \"b\", \"B\", \"h\")) return(2)\n  if (code %in% c(\"d\", \"e\", \"j\", \"a\", \"A\", \"u\", \"w\", \"p\", \"P\")) return(3)\n  if (code %in% c(\"H\", \"I\", \"k\", \"l\", \"M\", \"S\", \"OS\")) return(4)\n\n  NA_real_\n}\n\n\n#' Format date/time endpoints into token matrix\n#'\n#' @param x Date/time-like vector.\n#' @param fmt A `strftime` format string.\n#' @param spec Parsed strftime spec.\n#'\n#' @return A character matrix: rows are endpoints, columns are format tokens.\n#' @noRd\nformat_strftime_tokens <- function(x, fmt = NULL, spec = parse_strftime(fmt)) {\n  n <- length(x)\n\n  tokens <- lapply(seq_len(nrow(spec)), function(i) {\n    if (identical(spec$type[[i]], \"literal\")) {\n      rep(spec$token[[i]], n)\n    } else {\n      format(x, spec$token[[i]])\n    }\n  })\n\n  do.call(cbind, tokens)\n}\n\n\n#' Collapse two formatted date/time labels\n#'\n#' @param l_tokens Left endpoint tokens.\n#' @param r_tokens Right endpoint tokens.\n#' @param symbol Separator for full ranges.\n#'\n#' @return A single collapsed range label.\n#' @noRd\ncollapse_datetime_label <- function(\n    l_tokens,\n    r_tokens,\n    spec,\n    symbol = \"-\"\n) {\n  spaced_symbol <- paste0(\" \", symbol, \" \")\n  full <- paste0(paste0(l_tokens, collapse = \"\"), spaced_symbol,\n                 paste0(r_tokens, collapse = \"\"))\n\n  ranks <- vapply(spec$token, strftime_rank, FUN.VALUE = numeric(1))\n  is_directive <- spec$type == \"directive\"\n  comparable <- is_directive & !is.na(ranks)\n  differs <- comparable & (l_tokens != r_tokens)\n\n  if (!any(differs)) return(full)\n\n  diff_rank <- min(ranks[differs])\n  collapse_rank <- diff_rank\n\n  # If both day and time differ, keep month with both endpoints so that\n  # day labels remain anchored to a month (issue #58).\n  if (diff_rank == 3 && any(differs & ranks > diff_rank)) {\n    collapse_rank <- 2\n  }\n\n  higher_differs <- comparable & (ranks < diff_rank) & (l_tokens != r_tokens)\n  active_components <- which(comparable & (ranks >= collapse_rank))\n\n  if (any(higher_differs) || length(active_components) == 0 || diff_rank == 1) {\n    return(full)\n  }\n\n  left_end <- max(active_components)\n  right_start <- min(active_components)\n  left_part <- paste0(l_tokens[seq_len(left_end)], collapse = \"\")\n  right_part <- paste0(r_tokens[right_start:length(r_tokens)], collapse = \"\")\n\n  if (!nzchar(left_part) || !nzchar(right_part)) return(full)\n\n  # joiner <- if (diff_rank %in% 3:4) symbol else spaced_symbol\n  joiner <- if (ranks[right_start] == ranks[left_end]) symbol else spaced_symbol\n  paste0(left_part, joiner, right_part)\n}\n\n\n#' @rdname lbl_datetime\n#' @export\nlbl_date <- function(\n    fmt = \"%e %b %Y\",\n    symbol = \"-\",\n    unit = as.difftime(1, units = \"days\"),\n    single = \"{l}\",\n    first = NULL,\n    last = NULL\n) {\n  lbl_datetime(\n    fmt = fmt,\n    symbol = symbol,\n    unit = unit,\n    single = single,\n    first = first,\n    last = last\n  )\n}\n\n\n#' Label dates and datetimes\n#'\n#' @description\n#' `r lifecycle::badge(\"experimental\")`\n#'\n#' `lbl_date()` and `lbl_datetime()` produce nice labels for dates\n#' and datetimes. Where possible ranges are simplified, like\n#' like \"13-14 Jul 2026\" or \"11:15-12:15 1 Dec 2025\".\n#'\n#' @inherit label-doc\n#' @inherit first-last-doc\n#' @param symbol String: separator to use for full ranges.\n#' @param unit Optional interval unit for non-overlapping labels. If not `NULL`,\n#'.  endpoints are adjusted in the style of [lbl_discrete()].\n#'\n#' @family labelling functions\n#'\n#' @export\n#'\n#' @examples\n#' winter <- as.Date(\"2025-12-01\") + 0:89\n#' tab(winter, as.Date(c(\"2025-12-25\", \"2026-01-06\")),\n#'     labels = lbl_date())\n#' new_year <- as.POSIXct(\"2025-12-31 23:00\") + 0:120 * 60\n#' round_midnight <- as.POSIXct(c(\"2025-12-31 23:59\", \"2026-01-01 00:05\"))\n#' tab(new_year, round_midnight,\n#'     labels = lbl_datetime())\n#' tab(new_year, round_midnight,\n#'     labels = lbl_datetime(unit = as.difftime(1, units = \"mins\")))\nlbl_datetime <- function(\n    fmt = \"%H:%M:%S %b %e %Y\",\n    symbol = \"-\",\n    unit = NULL,\n    single = \"{l}\",\n    first = NULL,\n    last = NULL\n) {\n  assert_that(\n    is.string(fmt),\n    is.string(symbol),\n    length(unit) <= 1L,\n    is.string(single) || is.null(single),\n    is.string(first) || is.null(first),\n    is.string(last) || is.null(last)\n  )\n\n  function(breaks, raw = FALSE) {\n    assert_that(is.breaks(breaks))\n\n    len_breaks <- length(breaks)\n    endpoints <- scaled_endpoints(breaks, raw = raw)\n    pieces <- discrete_interval_endpoints(\n      breaks = breaks,\n      unit = unit,\n      endpoints = endpoints\n    )\n    l <- pieces$l\n    r <- pieces$r\n    is_singleton <- pieces$singletons\n    too_small <- pieces$too_small\n    l_closed <- pieces$l_closed\n    r_closed <- pieces$r_closed\n\n    if (any(too_small)) {\n      warning(\"Intervals smaller than `unit` are labelled as \\\"--\\\"\")\n    }\n\n    spec <- parse_strftime(fmt)\n    l_tokens <- format_strftime_tokens(l, spec = spec)\n    r_tokens <- format_strftime_tokens(r, spec = spec)\n\n    labels <- vapply(seq_len(len_breaks - 1L), function(i) {\n      collapse_datetime_label(\n        l_tokens = l_tokens[i, ],\n        r_tokens = r_tokens[i, ],\n        spec = spec,\n        symbol = symbol\n      )\n    }, FUN.VALUE = character(1))\n\n    l <- apply(l_tokens, 1, paste0, collapse = \"\")\n    r <- apply(r_tokens, 1, paste0, collapse = \"\")\n\n    labels[too_small] <- \"--\"\n\n    if (!is.null(single)) {\n      labels[is_singleton] <- glue::glue(single,\n        l = l[is_singleton],\n        r = r[is_singleton],\n        l_closed = l_closed[is_singleton],\n        r_closed = r_closed[is_singleton]\n      )\n    }\n\n    if (!is.null(first)) {\n      labels[1] <- glue::glue(first, l = l[1], r = r[1],\n        l_closed = l_closed[1], r_closed = r_closed[1]\n      )\n    }\n\n    if (!is.null(last)) {\n      ll <- len_breaks - 1L\n      labels[ll] <- glue::glue(last, l = l[ll], r = r[ll],\n        l_closed = l_closed[ll], r_closed = r_closed[ll]\n      )\n    }\n\n    labels\n  }\n}\n"
  },
  {
    "path": "R/labels-glue.R",
    "content": "\n#' Label chopped intervals using the `glue` package\n#'\n#' Use `\"{l}\"` and `\"{r}\"` to show the left and right endpoints of the intervals.\n#'\n#' @inherit label-doc\n#' @inherit first-last-doc params\n#' @param label A glue string passed to [glue::glue()].\n#' @param ... Further arguments passed to [glue::glue()].\n#'\n#' @details\n#'\n#' The following variables are available in the glue string:\n#'\n#' * `l` is a character vector of left endpoints of intervals.\n#' * `r` is a character vector of right endpoints of intervals.\n#' * `l_closed` is a logical vector. Elements are `TRUE` when the left\n#'   endpoint is closed.\n#' * `r_closed` is a logical vector, `TRUE` when the right endpoint is closed.\n#'\n#' Endpoints will be formatted by `fmt` before being passed to `glue()`.\n#'\n#' @family labelling functions\n#'\n#' @export\n#'\n#' @examples\n#' tab(1:10, c(1, 3, 3, 7),\n#'     labels = lbl_glue(\"{l} to {r}\", single = \"Exactly {l}\"))\n#'\n#' tab(1:10 * 1000, c(1, 3, 5, 7) * 1000,\n#'     labels = lbl_glue(\"{l}-{r}\",\n#'                       fmt = function(x) prettyNum(x, big.mark=',')))\n#'\n#' # reproducing lbl_intervals():\n#' interval_left <- \"{ifelse(l_closed, '[', '(')}\"\n#' interval_right <- \"{ifelse(r_closed, ']', ')')}\"\n#' glue_string <- paste0(interval_left, \"{l}\", \", \", \"{r}\", interval_right)\n#' tab(1:10, c(1, 3, 3, 7), labels = lbl_glue(glue_string, single = \"{{{l}}}\"))\n#'\nlbl_glue <- function (\n              label,\n              fmt    = NULL,\n              single = NULL,\n              first  = NULL,\n              last   = NULL,\n              raw    = deprecated(),\n              ...\n            ) {\n  assert_that(\n    is.string(label),\n    is.null(fmt) || is_format(fmt),\n    is.string(first) || is.null(first),\n    is.string(last) || is.null(last)\n  )\n\n  if (lifecycle::is_present(raw)) {\n    lifecycle::deprecate_stop(\"0.9.0\", \"lbl_glue(raw)\", \"chop(raw)\")\n  }\n\n  function (breaks, raw = FALSE) {\n    assert_that(is.breaks(breaks))\n\n    len_breaks <- length(breaks)\n\n    labels <- character(len_breaks - 1)\n\n    elabels <- endpoint_labels(breaks, raw = raw, fmt = fmt)\n\n    l <- elabels[-len_breaks]\n    r <- elabels[-1]\n\n    left <- attr(breaks, \"left\")\n    # Breaks like [1, 2) [2, 3] have\n    # left TRUE, TRUE, FALSE for breaks 1,2,3\n    # The first two TRUEs say that the left brackets are closed\n    # The last two TRUE & FALSE say that the right brackets are open\n    # and closed respectively. So:\n    l_closed <- left[-len_breaks]\n    r_closed <- ! left[-1]\n\n    # check ... for anything not in glue::glue args\n    # effectively, we move any user-supplied arguments into\n    # an environment specifically for glue\n    # this is mostly to make the lbl_midpoints() hack\n    # of passing in `m` work\n    dots <- rlang::enexprs(...)\n    glue_env <- new.env()\n    not_glue_args <- setdiff(names(dots), names(formals(glue::glue)))\n    for (nm in not_glue_args) {\n      assign(deparse(dots[[nm]]),\n               eval(dots[[nm]], parent.frame()),\n               glue_env\n             )\n    }\n    labels <- glue::glue(label, l = l, r = r, l_closed = l_closed,\n                         r_closed = r_closed, ..., .envir = glue_env)\n\n    if (! is.null(single)) {\n      # which breaks are singletons?\n      singletons <- singletons(breaks)\n\n      labels[singletons] <- glue::glue(single,\n                                         l = l[singletons],\n                                         r = r[singletons],\n                                         l_closed = l_closed[singletons],\n                                         r_closed = r_closed[singletons],\n                                         ...,\n                                         .envir = glue_env\n                                       )\n    }\n\n    if (! is.null(first)) {\n      labels[1] <- glue::glue(first, l = l[1], r = r[1],\n                                l_closed = l_closed[1],\n                                r_closed = r_closed[1],\n                                ...,\n                                .envir = glue_env\n                              )\n    }\n\n    if (! is.null(last)) {\n      ll <- len_breaks - 1\n      labels[ll] <- glue::glue(last, l = l[ll], r = r[ll],\n                                 l_closed = l_closed[ll],\n                                 r_closed = r_closed[ll],\n                                 ...,\n                                 .envir = glue_env\n                               )\n    }\n\n    return(labels)\n  }\n}"
  },
  {
    "path": "R/labels-impl.R",
    "content": "\n\n#' Replaces labels with names from the breaks vector\n#'\n#' Only non-zero-char names are used.\n#'\n#' @param labels Passed in from chop, possibly via a `lbl_*` function\n#' @param breaks Breaks object created via a `brk_*` function. Some of\n#'   these preserve names of a given argument (`brk_default()`,\n#'   `brk_proportions()`, `brk_quantiles()`)\n#'\n#' @return The altered labels\n#' @noRd\n#'\nadd_break_names <- function(labels, breaks) {\n  if (is.null(names(breaks))) return(labels)\n\n  is_named <- nzchar(names(breaks))\n  # These are possibly-extended breaks; last break is the rightmost endpoint\n  # and any name is ignored:\n  is_named[length(is_named)] <- FALSE\n  break_names_for_labels <- names(breaks)[is_named]\n\n  # length(labels) == length(breaks) - 1\n  is_named <- is_named[-length(is_named)]\n  labels[is_named] <- break_names_for_labels\n\n  return(labels)\n}\n\n\n#' Return formatted strings for endpoints\n#'\n#' Methods will pick up a `scaled_endpoints`\n#' attribute if one exists. This provides the numbers\n#' for when `raw = FALSE`.\n#'\n#' Different breaks subclasses may have different default formats.\n#'\n#' A `.numeric` method exists so that formatted labels can be created\n#' from e.g. midpoints or other things that aren't breaks\n#' themselves.\n#'\n#' @param breaks Either a breaks object, or a numeric vector\n#' @param raw Report raw numbers instead of e.g. quantiles?\n#' @param fmt Format string or function\n#' @param ... Not used\n#'\n#' @return A character vector of break endpoints.\n#' @noRd\n#'\nendpoint_labels <- function (breaks, raw, fmt = NULL, ...) {\n  UseMethod(\"endpoint_labels\")\n}\n\n\n#' @export\nendpoint_labels.numeric <- function (breaks, raw, fmt = NULL, ...) {\n  endpoints <- scaled_endpoints(breaks, raw = raw)\n\n  elabels <- if (! is.null(fmt)) {\n    apply_format(fmt, endpoints)\n  } else {\n    unique_truncation(endpoints)\n  }\n\n  elabels[is.infinite(endpoints)] <- sub(\"Inf ?\", symbol_infinity(),\n                                         elabels[is.infinite(endpoints)])\n\n  return(elabels)\n}\n\n\n#' @export\nendpoint_labels.integer <- endpoint_labels.numeric\n\n#' @export\nendpoint_labels.double <- endpoint_labels.numeric\n\n\n#' @export\nendpoint_labels.default <- function (breaks, raw, fmt = NULL, ...) {\n  endpoints <- scaled_endpoints(breaks, raw = raw)\n\n  elabels <- if (! is.null(fmt)) {\n    apply_format(fmt, endpoints)\n  } else {\n    base::format(endpoints)\n  }\n\n  return(elabels)\n}\n\n\n#' @export\nendpoint_labels.Date <- function (breaks, raw, fmt = NULL, ...) {\n  elabels <- scaled_endpoints(breaks, raw = raw)\n  # this could be a number. If so, a `fmt` for `sprintf`\n  # will work fine:\n  if (! inherits(elabels, \"Date\")) return(NextMethod())\n\n  # set default format\n  fmt <- fmt %||% \"%F\"\n\n  elabels_chr <- apply_format(fmt, elabels)\n  minus_inf <- is.infinite(elabels) & elabels < as.Date(\"1970-01-01\")\n  plus_inf  <- is.infinite(elabels) & elabels > as.Date(\"1970-01-01\")\n  elabels_chr[minus_inf] <- symbol_infinity(minus = TRUE)\n  elabels_chr[plus_inf]  <- symbol_infinity()\n\n  elabels_chr\n}\n\n\n#' @export\nendpoint_labels.POSIXt <- function (breaks, raw, fmt = NULL, ...) {\n  elabels <- scaled_endpoints(breaks, raw = raw)\n  # same comment as endpoint_labels.Date above:\n  if (! inherits(elabels, \"POSIXt\")) return(NextMethod())\n\n  # set default format\n  fmt <- fmt %||% \"%F %H:%M:%S\"\n\n  elabels_chr <- apply_format(fmt, elabels)\n  minus_inf <- is.infinite(elabels) & elabels < as.POSIXct(\"1970-01-01\")\n  plus_inf  <- is.infinite(elabels) & elabels > as.POSIXct(\"1970-01-01\")\n  elabels_chr[minus_inf] <- symbol_infinity(minus = TRUE)\n  elabels_chr[plus_inf]  <- symbol_infinity()\n\n  elabels_chr\n}\n\n\n#' @export\nendpoint_labels.quantileBreaks <- function (breaks, raw, fmt = NULL, ...) {\n  if (raw) return(NextMethod())\n\n  # set default format\n  fmt <- fmt %||% percent\n\n  elabels <- scaled_endpoints(breaks, raw = FALSE)\n  elabels <- apply_format(fmt, elabels)\n\n  return(elabels)\n}\n\n\n#' @export\nendpoint_labels.sdBreaks <- function (breaks, raw, fmt = NULL, ...) {\n  if (raw) return(NextMethod())\n\n  # set default format\n  fmt <- fmt %||% \"%.3g sd\"\n\n  elabels <- scaled_endpoints(breaks, raw = FALSE)\n  elabels <- apply_format(fmt, elabels)\n\n  return(elabels)\n}\n\n\n#' Return numeric (or whatever) endpoints of breaks, possibly scaled\n#'\n#' @param breaks Breaks or numeric object\n#' @param raw Logical. If `FALSE`, return endpoints scaled as e.g. sds or\n#'   quantiles\n#'\n#' @return Numbers, dates, etc. with no `breaks` class.\n#' @noRd\nscaled_endpoints <- function (breaks, raw) {\n  UseMethod(\"scaled_endpoints\")\n}\n\n\n#' @export\nscaled_endpoints.breaks <- function (breaks, raw) {\n  if (raw) {\n    unclass_breaks(breaks)\n  } else {\n    attr(breaks, \"scaled_endpoints\") %||% unclass_breaks(breaks)\n  }\n}\n\n\n#' @export\nscaled_endpoints.default <- function (breaks, raw) {\n  if (raw) {\n    breaks\n  } else {\n    attr(breaks, \"scaled_endpoints\") %||% breaks\n  }\n}\n\n\n#' Apply `fmt` to an object\n#'\n#' @param fmt A one-argument function, or a character string.\n#' @param endpoint Endpoints of a break. Various classes.\n#'\n#' @return A character vector.\n#' @noRd\napply_format <- function (fmt, endpoint, ...) {\n  UseMethod(\"apply_format\")\n}\n\n\n#' @export\napply_format.function <- function (fmt, endpoint, ...) {\n  fmt(endpoint, ...)\n}\n\n\n#' @export\n#' @method apply_format character\napply_format.character <- function (fmt, endpoint, ...) {\n  UseMethod(\"apply_format.character\", endpoint)\n}\n\n\n#' @export\n#' @method apply_format.character default\napply_format.character.default <- function (fmt, endpoint, ...) {\n  base::format(endpoint, fmt, ...)\n}\n\n\n#' @export\n#' @method apply_format.character numeric\napply_format.character.numeric <- function (fmt, endpoint, ...) {\n  sprintf(fmt, endpoint, ...)\n}\n\n\n#' @export\n#' @method apply_format.character character\napply_format.character.character <- function (fmt, endpoint, ...) {\n  sprintf(fmt, endpoint, ...)\n}\n\n\n#' @export\n#' @method apply_format list\napply_format.list <- function (fmt, endpoint, ...) {\n  UseMethod(\"apply_format.list\", endpoint)\n}\n\n\n#' @export\n#' @method apply_format.list default\napply_format.list.default <- function (fmt, endpoint, ...) {\n  do.call(base::format, c(list(x = endpoint), fmt))\n}\n\n\nis_format <- function (fmt) is.string(fmt) || is.function(fmt) || is.list(fmt)\n\non_failure(is_format) <- function(call, env) {\n  paste0(deparse(call$fmt), \" is not a valid format (a string, list or function)\")\n}\n\n\n#' Build interval endpoints for discrete-style labels\n#'\n#' Shared implementation for labelers that make open intervals non-overlapping\n#' by shifting open endpoints inward by `unit`.\n#'\n#' @param breaks A breaks object.\n#' @param unit Optional scalar unit. If `NULL`, no endpoint adjustment is made.\n#' @param endpoints Optional endpoints vector. Defaults to `unclass_breaks(breaks)`.\n#' @param singleton_mask Logical mask of singleton intervals.\n#'\n#' @return A list with `l`, `r`, `singletons`, `too_small`, `l_closed`,\n#'   and `r_closed`.\n#' @noRd\ndiscrete_interval_endpoints <- function(\n    breaks,\n    unit = NULL,\n    endpoints = NULL,\n    singleton_mask = singletons(breaks)\n) {\n  assert_that(is.breaks(breaks))\n\n  len_breaks <- length(breaks)\n  endpoints <- endpoints %||% unclass_breaks(breaks)\n  left <- attr(breaks, \"left\")\n\n  l <- endpoints[-len_breaks]\n  r <- endpoints[-1]\n\n  left_l <- left[-len_breaks]\n  left_r <- left[-1]\n\n  if (!is.null(unit)) {\n    l[!left_l] <- l[!left_l] + unit\n    r[left_r] <- r[left_r] - unit\n    singleton_mask <- singleton_mask | (r == l)\n    too_small <- r < l\n  } else {\n    too_small <- rep(FALSE, len_breaks - 1L)\n  }\n\n  list(\n    l = l,\n    r = r,\n    singletons = singleton_mask,\n    too_small = too_small,\n    l_closed = left_l,\n    r_closed = !left_r\n  )\n}\n\n\n#' Truncates `num` to look nice, while preserving uniqueness\n#'\n#' @param num A numeric vector.\n#'\n#' @return A character vector\n#' @noRd\nunique_truncation <- function (num) {\n  want_unique <- ! duplicated(num) # \"real\" duplicates are allowed!\n                                   # we keep the first of each duplicate set.\n\n  for (digits in seq(4L, 22L)) {\n    res <- formatC(num, digits = digits, width = -1L)\n    if (anyDuplicated(res[want_unique]) == 0L) return(res)\n  }\n\n  stop(\"Could not format breaks to avoid duplicates\")\n}\n\n\nem_dash <- function () {\n  if (l10n_info()[[\"UTF-8\"]]) \"\\u2014\" else \"-\"\n}\n\n\nsymbol_infinity <- function (minus = FALSE) {\n  infty <- if (l10n_info()[[\"UTF-8\"]]) \"\\u221e\" else \"Inf\"\n  infty <- getOption(\"santoku.infinity\", infty)\n  if (minus) paste0(\"-\", infty) else infty\n}\n"
  },
  {
    "path": "R/labels-single.R",
    "content": "\n#' Label chopped intervals by their midpoints\n#'\n#' This uses the midpoint of each interval for\n#' its label.\n#'\n#' @inherit label-doc\n#' @inherit first-last-doc\n#'\n#' @family labelling functions\n#'\n#' @export\n#'\n#' @examples\n#' chop(1:10, c(2, 5, 8), lbl_midpoints())\nlbl_midpoints <- function (\n                   fmt    = NULL,\n                   single = NULL,\n                   first  = NULL,\n                   last   = NULL,\n                   raw    = deprecated()\n                 ) {\n  if (lifecycle::is_present(raw)) {\n    lifecycle::deprecate_stop(\"0.9.0\", \"lbl_midpoints(raw)\", \"chop(raw)\")\n  }\n\n  function (breaks, raw = FALSE) {\n    assert_that(is.breaks(breaks))\n\n    break_nums <- scaled_endpoints(breaks, raw = raw)\n    l_nums <- break_nums[-length(break_nums)]\n    r_nums <- break_nums[-1]\n    # doing this, rather than (l_nums + r_nums)/2, works for e.g. Date objects:\n    midpoints <- l_nums + (r_nums - l_nums)/2\n\n    # we've applied raw already (anyway, midpoints is just a numeric)\n    midpoints <- endpoint_labels(midpoints, raw = TRUE, fmt = fmt)\n\n    gluer <- lbl_glue(label = \"{m}\", fmt = fmt, single = single, first = first,\n                        last = last, m = midpoints)\n    labels <- gluer(breaks, raw = raw)\n\n    labels\n  }\n}\n\n\n#' Label chopped intervals by their left or right endpoints\n#'\n#' This is useful when the left endpoint unambiguously indicates the\n#' interval. In other cases it may give errors due to duplicate labels.\n#'\n#' `lbl_endpoint()` is `r lifecycle::badge(\"defunct\")` and gives an\n#' error since santoku 1.0.0.\n#'\n#' @inherit label-doc\n#' @inherit first-last-doc\n#' @param left Flag. Use left endpoint or right endpoint?\n#'\n#' @family labelling functions\n#'\n#' @export\n#'\n#' @examples\n#' chop(1:10, c(2, 5, 8), lbl_endpoints(left = TRUE))\n#' chop(1:10, c(2, 5, 8), lbl_endpoints(left = FALSE))\n#' if (requireNamespace(\"lubridate\")) {\n#'   tab_width(\n#'           as.Date(\"2000-01-01\") + 0:365,\n#'          months(1),\n#'          labels = lbl_endpoints(fmt = \"%b\")\n#'        )\n#' }\n#'\n#' \\dontrun{\n#'   # This gives breaks `[1, 2) [2, 3) {3}` which lead to\n#'   # duplicate labels `\"2\", \"3\", \"3\"`:\n#'   chop(1:3, 1:3, lbl_endpoints(left = FALSE))\n#' }\nlbl_endpoints <- function (\n                   left   = TRUE,\n                   fmt    = NULL,\n                   single = NULL,\n                   first  = NULL,\n                   last   = NULL,\n                   raw    = deprecated()\n                 ) {\n  assert_that(is.flag(left))\n\n  if (lifecycle::is_present(raw)) {\n    lifecycle::deprecate_stop(\"0.9.0\", \"lbl_endpoints(raw)\", \"chop(raw)\")\n  }\n\n  label <- if (left) \"{l}\" else \"{r}\"\n  lbl_glue(label, fmt = fmt, single = single, first = first, last = last)\n}\n\n\n#' @rdname lbl_endpoints\n#' @export\nlbl_endpoint <- function (\n                  fmt  = NULL,\n                  raw  = FALSE,\n                  left = TRUE\n                ) {\n  lifecycle::deprecate_stop(when = \"0.8.0\", what = \"lbl_endpoint()\",\n                              with = \"lbl_endpoints()\")\n}\n\n\n#' Label chopped intervals in sequence\n#'\n#' `lbl_seq()` labels intervals sequentially, using numbers or letters.\n#'\n#' @param start String. A template for the sequence. See below.\n#'\n#' @details\n#'`start` shows the first element of the sequence. It must contain exactly *one*\n#' character out of the set \"a\", \"A\", \"i\", \"I\" or \"1\". For later elements:\n#'\n#' * \"a\" will be replaced by \"a\", \"b\", \"c\", ...\n#' * \"A\" will be replaced by \"A\", \"B\", \"C\", ...\n#' * \"i\" will be replaced by lower-case Roman numerals \"i\", \"ii\", \"iii\", ...\n#' * \"I\" will be replaced by upper-case Roman numerals \"I\", \"II\", \"III\", ...\n#' * \"1\" will be replaced by numbers \"1\", \"2\", \"3\", ...\n#'\n#' Other characters will be retained as-is.\n#'\n#' @family labelling functions\n#' @inherit label-doc return\n#'\n#' @export\n#'\n#' @examples\n#' chop(1:10, c(2, 5, 8), lbl_seq())\n#'\n#' chop(1:10, c(2, 5, 8), lbl_seq(\"i.\"))\n#'\n#' chop(1:10, c(2, 5, 8), lbl_seq(\"(A)\"))\nlbl_seq <- function(start = \"a\") {\n  assert_that(is.string(start))\n  # check like contains just one of a, A, i, I, 1\n  match <- gregexpr(\"(a|A|i|I|1)\", start)[[1]]\n  if (length(match) > 1) stop(\"More than one a/A/i/I/1 found in `start`: \", start)\n  if (match == -1) stop(\"No a/A/i/I/1 found in `start`: \", start)\n  # replace that with the format-string and call lbl_manual appropriately\n  key <- substr(start, match, match)\n  fmt <- sub(\"(a|A|i|I|1)\", \"%s\", start)\n\n  res <- switch(key,\n    \"a\" = function (breaks, raw = NULL) {\n            if (length(breaks) > 27L) {\n              stop(\"Can't use more than 26 intervals with lbl_seq(\\\"a\\\")\")\n            }\n            sprintf(fmt, letters[seq_len(length(breaks) - 1L)])\n          },\n    \"A\" = function (breaks, raw = NULL) {\n            if (length(breaks) > 27L) {\n              stop(\"Can't use more than 26 intervals with lbl_seq(\\\"A\\\")\")\n            }\n            sprintf(fmt, LETTERS[seq_len(length(breaks) - 1L)])\n          },\n    \"i\" = function (breaks, raw = NULL) {\n           sprintf(fmt, tolower(utils::as.roman(seq_len(length(breaks) - 1L))))\n         },\n    \"I\" = function (breaks, raw = NULL) {\n           sprintf(fmt, utils::as.roman(seq_len(length(breaks) - 1L)))\n         },\n    \"1\" = function (breaks, raw = NULL) {\n            sprintf(fmt, seq_len(length(breaks) - 1L))\n          }\n    )\n\n  return(res)\n}\n\n\n#' Defunct: label chopped intervals in a user-defined sequence\n#'\n#' `r lifecycle::badge(\"defunct\")`\n#'\n#' `lbl_manual()` is defunct since santoku 1.0.0. It is little used and is not\n#' closely related to the rest of the package. It also risks mislabelling\n#' intervals, e.g. if intervals are extended. Use of `lbl_manual()` will give\n#' an error.\n#'\n#' @param sequence A character vector of labels.\n#' @inherit label-doc\n#'\n#' @family labelling functions\n#'\n#' @export\n#'\n#' @keywords internal\n#'\n#' @examples\n#' \\dontrun{\n#' chop(1:10, c(2, 5, 8), lbl_manual(c(\"w\", \"x\", \"y\", \"z\")))\n#' # ->\n#' chop(1:10, c(2, 5, 8), labels = c(\"w\", \"x\", \"y\", \"z\"))\n#' }\nlbl_manual <- function (sequence, fmt = \"%s\") {\n  lifecycle::deprecate_stop(\"0.9.0\", \"lbl_manual()\",\n                            details = \"Just specify `labels = sequence` instead.\")\n}"
  },
  {
    "path": "R/labels.R",
    "content": "\n#' @name label-doc\n#' @param fmt String, list or function. A format for break endpoints.\n#' @param raw `r lifecycle::badge(\"deprecated\")`. Throws an error.\n#'   Use the `raw` argument to [chop()] instead.\n#' @param symbol String: symbol to use for the dash.\n#' @param ... Arguments passed to format methods.\n#'\n#' @section Formatting endpoints:\n#'\n#' If `fmt` is not `NULL` then it is used to format the endpoints.\n#'\n#' * If `fmt` is a string, then numeric endpoints will be formatted by\n#'   `sprintf(fmt, breaks)`; other endpoints, e.g. [Date][base::Dates] objects,\n#'   will be formatted by `format(breaks, fmt)`.\n#'\n#' * If `fmt` is a list, then it will be used as arguments to [format].\n#'\n#' * If `fmt` is a function, it should take a vector of numbers (or other objects\n#'   that can be used as breaks) and return a character vector. It may be helpful\n#'   to use functions from the `{scales}` package, e.g. [scales::label_comma()].\n#'\n#' @return A function that creates a vector of labels.\nNULL\n\n\n#' @name first-last-doc\n#' @param single Glue string: label for singleton intervals. See [lbl_glue()]\n#'   for details. If `NULL`, singleton intervals will be labelled the same way\n#'   as other intervals.\n#' @param first Glue string: override label for the first category. Write e.g.\n#'   `first = \"<{r}\"` to create a label like `\"<18\"`. See [lbl_glue()]\n#'   for details.\n#' @param last String: override label for the last category. Write e.g.\n#'   `last = \">{l}\"` to create a label like `\">65\"`. See [lbl_glue()]\n#'   for details.\nNULL\n\n\n#' Label chopped intervals using set notation\n#'\n#' These labels are the most exact, since they show you whether\n#' intervals are \"closed\" or \"open\", i.e. whether they include their endpoints.\n#'\n#' Mathematical set notation looks like this:\n#'\n#' * \\code{[a, b]}: all numbers `x` where `a <= x <= b`;\n#' * \\code{(a, b)}: all numbers where `a < x < b`;\n#' * \\code{[a, b)}: all numbers where `a <= x < b`;\n#' * \\code{(a, b]}: all numbers where `a < x <= b`;\n#' * \\code{{a}}: just the number `a` exactly.\n#'\n#' @inherit label-doc\n#' @inherit first-last-doc\n#'\n#' @family labelling functions\n#'\n#' @export\n#'\n#' @examples\n#'\n#' tab(-10:10, c(-3, 0, 0, 3),\n#'       labels = lbl_intervals())\n#'\n#' tab(-10:10, c(-3, 0, 0, 3),\n#'       labels = lbl_intervals(fmt = list(nsmall = 1)))\n#'\n#' tab_evenly(runif(20), 10,\n#'       labels = lbl_intervals(fmt = percent))\n#'\nlbl_intervals <- function (\n                   fmt    = NULL,\n                   single = \"{{{l}}}\",\n                   first  = NULL,\n                   last   = NULL,\n                   raw    = deprecated()\n                 ) {\n  if (lifecycle::is_present(raw)) {\n    lifecycle::deprecate_stop(\"0.9.0\", \"lbl_intervals(raw)\", \"chop(raw)\")\n  }\n  interval_glue <- \"{ifelse(l_closed, '[', '(')}{l}, {r}{ifelse(r_closed, ']', ')')}\"\n  lbl_glue(label = interval_glue, single = single, fmt = fmt, first = first,\n             last = last)\n}\n\n\n#' Label discrete data\n#'\n#' `lbl_discrete()` creates labels for discrete data, such as integers.\n#' For example, breaks\n#' `c(1, 3, 4, 6, 7)` are labelled: `\"1-2\", \"3\", \"4-5\", \"6-7\"`.\n#'\n#' @inherit label-doc\n#' @param unit Minimum difference between distinct values of data.\n#'   For integers, 1.\n#' @inherit first-last-doc\n#'\n#' @details\n#' No check is done that the data are discrete-valued. If they are not, then\n#' these labels may be misleading. Here, discrete-valued means that if\n#' `x < y`, then `x <= y - unit`.\n#'\n#' Be aware that Date objects may have non-integer values. See\n#' [Date][base::Dates].\n#'\n#' @family labelling functions\n#'\n#' @export\n#'\n#' @examples\n#' tab(1:7, c(1, 3, 5), lbl_discrete())\n#'\n#' tab(1:7, c(3, 5), lbl_discrete(first = \"<= {r}\"))\n#'\n#' tab(1:7 * 1000, c(1, 3, 5) * 1000, lbl_discrete(unit = 1000))\n#'\n#' # Misleading labels for non-integer data\n#' chop(2.5, c(1, 3, 5), lbl_discrete())\n#'\nlbl_discrete <- function (\n                  symbol = em_dash(),\n                  unit = 1L,\n                  fmt = NULL,\n                  single = NULL,\n                  first = NULL,\n                  last = NULL\n                ) {\n  assert_that(\n          is.string(symbol),\n          is.scalar(unit),\n          is.null(fmt) || is_format(fmt),\n          is.string(single) || is.null(single),\n          is.string(first) || is.null(first),\n          is.string(last) || is.null(last)\n        )\n\n  function (breaks, raw = NULL) {\n    assert_that(all(ceiling(as.numeric(breaks)) == floor(as.numeric(breaks))),\n          msg = \"Non-integer breaks\")\n    len_breaks <- length(breaks)\n\n    pieces <- discrete_interval_endpoints(\n      breaks = breaks,\n      unit = unit,\n      endpoints = unclass_breaks(breaks)\n    )\n\n    l <- pieces$l\n    r <- pieces$r\n    singletons <- pieces$singletons\n    too_small <- pieces$too_small\n    l_closed <- pieces$l_closed\n    r_closed <- pieces$r_closed\n\n    if (any(too_small)) {\n      warning(\"Intervals smaller than `unit` are labelled as \\\"--\\\"\")\n    }\n\n    labels_l <- endpoint_labels(l, raw = FALSE, fmt = fmt)\n    labels_r <- endpoint_labels(r, raw = FALSE, fmt = fmt)\n\n    labels <- paste0(labels_l, symbol, labels_r)\n    labels[singletons] <- labels_l[singletons]\n    labels[too_small] <- \"--\"\n\n    if (! is.null(single)) {\n      labels[singletons] <- glue::glue(single, l = labels_l[singletons],\n                                         r = labels_r[singletons],\n                                         l_closed = l_closed[singletons],\n                                         r_closed = r_closed[singletons])\n    }\n\n    if (! is.null(first)) {\n      labels[1] <- glue::glue(first, l = labels_l[1], r = labels_r[1],\n                              l_closed = l_closed[1], r_closed = r_closed[1])\n    }\n\n    if (! is.null(last)) {\n      ll <- len_breaks - 1\n      labels[ll] <- glue::glue(last, l = labels_l[ll], r = labels_r[ll],\n                               l_closed = l_closed[ll], r_closed = r_closed[ll])\n    }\n\n    return(labels)\n  }\n}\n\n\n#' Label chopped intervals like 1-4, 4-5, ...\n#'\n#' This label style is user-friendly, but doesn't distinguish between\n#' left- and right-closed intervals. It's good for continuous data\n#' where you don't expect points to be exactly on the breaks.\n#'\n#' If you don't want unicode output, use `lbl_dash(\"-\")`.\n#'\n#' @inherit label-doc\n#' @inherit first-last-doc\n#'\n#' @family labelling functions\n#'\n#' @export\n#'\n#' @examples\n#' chop(1:10, c(2, 5, 8), lbl_dash())\n#'\n#' chop(1:10, c(2, 5, 8), lbl_dash(\" to \", fmt = \"%.1f\"))\n#'\n#' chop(1:10, c(2, 5, 8), lbl_dash(first = \"<{r}\"))\n#'\n#' pretty <- function (x) prettyNum(x, big.mark = \",\", digits = 1)\n#' chop(runif(10) * 10000, c(3000, 7000), lbl_dash(\" to \", fmt = pretty))\nlbl_dash <- function (\n              symbol = em_dash(),\n              fmt    = NULL,\n              single = \"{l}\",\n              first  = NULL,\n              last   = NULL,\n              raw    = deprecated()\n            ) {\n  if (lifecycle::is_present(raw)) {\n    lifecycle::deprecate_stop(\"0.9.0\", \"lbl_dash(raw)\", \"chop(raw)\")\n  }\n\n  label_glue <- paste0(\"{l}\", symbol, \"{r}\")\n  lbl_glue(label = label_glue, fmt = fmt, single = single, first = first,\n           last = last, raw = raw)\n}\n"
  },
  {
    "path": "R/non-standard-types-doc.R",
    "content": "\n#' Tips for chopping non-standard types\n#'\n#' Santoku can handle many non-standard types.\n#'\n#' * If objects can be compared using `<`, `==` etc. then they should\n#'   be choppable.\n#' * Objects which can't be converted to numeric are handled within R code,\n#'   which may be slower.\n#' * Character `x` and `breaks` are chopped with a warning.\n#' * If `x` and `breaks` are not the same type, they should be able to\n#'   be cast to the same type, usually using [vctrs::vec_cast_common()].\n#' * Not all chopping operations make sense, for example, [chop_mean_sd()]\n#'   on a character vector.\n#' * For indexed objects such as [stats::ts()] objects, indices will be dropped\n#'   from the result.\n#' * If you get errors, try setting `extend = FALSE` (but also file a bug report).\n#' * To request support for a type, open an issue on Github.\n#'\n#' @name non-standard-types\n#' @seealso brk-width-for-Datetime\nNULL"
  },
  {
    "path": "R/santoku-cast.R",
    "content": "\n\n#' Hacked version of [vctrs::vec_cast_common()]\n#'\n#' @param x,y Vectors to cast\n#'\n#' @return A list of two vectors of the same class; or\n#' errors, if that isn't possible.\n#'\n#' This almost always defers to `vctrs::vec_cast_common()`.\n#'\n#' Often, we are more relaxed than `vctrs` because\n#' we have a more specific use case (comparing numeric\n#' values). So e.g. we're fine with comparing a `ts`\n#' object to a number, whereas other binary\n#' operations might not make sense.\n#'\n#' @noRd\n#'\nsantoku_cast_common <- function (x, y) {\n  UseMethod(\"santoku_cast_common\")\n}\n\n\n#' Internal functions\n#'\n#' @name santoku-cast\n#' @param x,y Vectors to cast.\n#'\n#' @return A list.\n#' @keywords internal\n#'\n#' These are internal functions. Do not use.\nNULL\n\n\n# The rawNamespace below means NAMESPACE gets both the S3method() and the\n# export() tag.\n\n#' @export\n#' @rdname santoku-cast\n#' @method santoku_cast_common default\n#' @rawNamespace export(santoku_cast_common.default)\nsantoku_cast_common.default <- function (x, y) {\n  UseMethod(\"santoku_cast_common.default\", object = y)\n}\n\n\n#' @export\nsantoku_cast_common.default.default <- function (x, y) {\n  vctrs::vec_cast_common(x, y)\n}\n\n# Specific default.x methods are in their sections below.\n\n\n# ==== double ====\n\n# We have specific double methods just to catch bit64 objects\n\n#' @export\n#' @rdname santoku-cast\n#' @method santoku_cast_common double\n#' @rawNamespace export(santoku_cast_common.double)\nsantoku_cast_common.double <- function (x, y) {\n  UseMethod(\"santoku_cast_common.double\", object = y)\n}\n\n\n#' @export\nsantoku_cast_common.double.default <- function (x, y) {\n  # almost always delegate to default\n  santoku_cast_common.default(x, y)\n}\n\n\n#' @export\nsantoku_cast_common.double.integer64 <- function (x, y) {\n  loadNamespace(\"bit64\")\n  # we cast the integer64 to double.\n  # See santoku_cast_common.integer64.double below for why.\n  list(x, as.double(y))\n}\n\n\n# ==== Date ====\n\n# We delegate to vctrs for Date+numeric (which gives an error)\n# Not obvious how to interpret conversion of Date to numeric\n\n\n#' @export\n#' @rdname santoku-cast\n#' @method santoku_cast_common Date\n#' @rawNamespace export(santoku_cast_common.Date)\nsantoku_cast_common.Date <- function (x, y) {\n  UseMethod(\"santoku_cast_common.Date\", object = y)\n}\n\n\n#' @export\nsantoku_cast_common.Date.Date <- function (x, y) {\n  list(x, y)\n}\n\n\n#' @export\nsantoku_cast_common.Date.POSIXct <- function (x, y) {\n  list(as.POSIXct(x), y)\n}\n\n\n# ==== POSIXct ====\n\n# We delegate to vctrs for POSIXct/numeric, see Date above\n\n#' @export\n#' @rdname santoku-cast\n#' @method santoku_cast_common POSIXct\n#' @rawNamespace export(santoku_cast_common.POSIXct)\nsantoku_cast_common.POSIXct <- function (x, y) {\n  UseMethod(\"santoku_cast_common.POSIXct\", object = y)\n}\n\n\n#' @export\nsantoku_cast_common.POSIXct.POSIXct <- function (x, y) {\n  list(x, y)\n}\n\n\n#' @export\nsantoku_cast_common.POSIXct.Date <- function (x, y) {\n  list(x, as.POSIXct(y))\n}\n\n\n# ==== ts ====\n\n#' @export\n#' @rdname santoku-cast\n#' @method santoku_cast_common ts\n#' @rawNamespace export(santoku_cast_common.ts)\nsantoku_cast_common.ts <- function (x, y) {\n  UseMethod(\"santoku_cast_common.ts\", object = y)\n}\n\n\n#' @export\nsantoku_cast_common.ts.default <- function (x, y) {\n  # We recall so that we can pick up anything\n  # unusual in y\n  santoku_cast_common(unclass(x), y)\n}\n\n\n#' @export\nsantoku_cast_common.default.ts <- function (x, y) {\n  santoku_cast_common(x, unclass(y))\n}\n\n\n# ==== zoo ====\n\n#' @export\n#' @rdname santoku-cast\n#' @method santoku_cast_common zoo\n#' @rawNamespace export(santoku_cast_common.zoo)\nsantoku_cast_common.zoo <- function (x, y) {\n  UseMethod(\"santoku_cast_common.zoo\", object = y)\n}\n\n# we don't have a zoo.zoo method because returning\n# two zoo objects would cause comparisons to only\n# work where the indices are the same. So, we always\n# work on the underlying data.\n\n#' @export\nsantoku_cast_common.zoo.default <- function (x, y) {\n  loadNamespace(\"zoo\")\n  santoku_cast_common(zoo::coredata(x), y)\n}\n\n#' @export\nsantoku_cast_common.default.zoo <- function (x, y) {\n  loadNamespace(\"zoo\")\n  santoku_cast_common(x, zoo::coredata(y))\n}\n\n\n# ==== integer64 ====\n\n#' @export\n#' @rdname santoku-cast\n#' @method santoku_cast_common integer64\n#' @rawNamespace export(santoku_cast_common.integer64)\nsantoku_cast_common.integer64 <- function (x, y) {\n  UseMethod(\"santoku_cast_common.integer64\", object = y)\n}\n\n\n#' @export\nsantoku_cast_common.integer64.integer64 <- function (x, y) {\n  list(x, y)\n}\n\n\n#' @export\nsantoku_cast_common.integer64.double <- function (x, y) {\n  loadNamespace(\"bit64\")\n  # we cast the integer64 to double.\n  # This may lose precision, but if so, it gives a warning.\n  # If we cast double to integer64, then\n  # e.g. chop(as.integer64(1:5), 2.5)\n  # silently converts 2.5 to 2 and gives a wrong answer\n  list(as.double(x), y)\n}\n\n\n#' @export\nsantoku_cast_common.integer64.default <- function (x, y) {\n  loadNamespace(\"bit64\")\n  santoku_cast_common(x, bit64::as.integer64(y))\n}\n\n\n#' @export\nsantoku_cast_common.default.integer64 <- function (x, y) {\n  loadNamespace(\"bit64\")\n  santoku_cast_common(bit64::as.integer64(x), y)\n}\n\n\n# ==== hexmode ====\n\n#' @export\n#' @rdname santoku-cast\n#' @method santoku_cast_common hexmode\n#' @rawNamespace export(santoku_cast_common.hexmode)\nsantoku_cast_common.hexmode <- function (x, y) {\n  UseMethod(\"santoku_cast_common.hexmode\", object = y)\n}\n\n\n#' @export\nsantoku_cast_common.hexmode.hexmode <- function (x, y) {\n  # if both items are hexmode, OK fine.\n  list(x, y)\n}\n\n\n#' @export\nsantoku_cast_common.hexmode.default <- function (x, y) {\n  santoku_cast_common(as.numeric(x), y)\n}\n\n\n#' @export\nsantoku_cast_common.default.hexmode <- function (x, y) {\n  santoku_cast_common(x, as.numeric(y))\n}\n\n\n# ==== octmode ====\n\n#' @export\n#' @rdname santoku-cast\n#' @method santoku_cast_common octmode\n#' @rawNamespace export(santoku_cast_common.octmode)\nsantoku_cast_common.octmode <- function (x, y) {\n  UseMethod(\"santoku_cast_common.octmode\", object = y)\n}\n\n\n#' @export\nsantoku_cast_common.octmode.octmode <- function (x, y) {\n  list(x, y)\n}\n\n\n#' @export\nsantoku_cast_common.octmode.default <- function (x, y) {\n  santoku_cast_common(as.numeric(x), y)\n}\n\n\n#' @export\nsantoku_cast_common.default.octmode <- function (x, y) {\n  santoku_cast_common(x, as.numeric(y))\n}"
  },
  {
    "path": "R/santoku-package.R",
    "content": "\n#' @import assertthat\nNULL\n\n#' A versatile cutting tool for R: package overview and options\n#'\n#' santoku is a tool for cutting data into intervals. It provides\n#' the function [chop()], which is similar to base R's [cut()] or `Hmisc::cut2()`.\n#' `chop(x, breaks)` takes a vector `x` and returns a factor of the\n#' same length, coding which interval each element of `x` falls into.\n#'\n#' Here are some advantages of santoku:\n#'\n#' * By default, `chop()` always covers the whole range of the data, so you\n#'   won't get unexpected `NA` values.\n#'\n#' * Unlike `cut()` or `cut2()`, `chop()` can handle single values as well as\n#'   intervals. For example, `chop(x, breaks = c(1, 2, 2, 3))` will create a\n#'   separate factor level for values exactly equal to 2.\n#'\n#' * Flexible and easy labelling.\n#'\n#' * Convenience functions for creating quantile intervals, evenly-spaced\n#'  intervals or equal-sized groups.\n#'\n#' * Convenience functions to quickly tabulate chopped data.\n#'\n#' * Can chop numbers, dates, date-times and other objects.\n#'\n#' These advantages make santoku especially useful for exploratory analysis,\n#' where you may not know the range of your data in advance.\n#'\n#' To get started, read the vignette:\n#'\n#' ```r\n#' vignette(\"santoku\")\n#' ```\n#' \n#' For more details, start with the documentation for [chop()].\n#'\n#' # Options\n#'\n#' Santoku has two options:\n#'\n#' * `options(\"santoku.infinity\")` sets the symbol for infinity in breaks. The default is\n#'   `NULL`, in which case the infinity symbol is used on platforms that support it, otherwise\n#'   `\"Inf\"` is used.\n#'\n#' * `options(\"santoku.warn_character\")` warns if you try to chop a character vector. Set to\n#'   `FALSE` to turn off this warning.\n\"_PACKAGE\"\n\n# The following block is used by usethis to automatically manage\n# roxygen namespace tags. Modify with care!\n## usethis namespace: start\n#' @importFrom Rcpp sourceCpp\n#' @useDynLib santoku, .registration = TRUE\n## usethis namespace: end\nNULL\n\n"
  },
  {
    "path": "R/tab.R",
    "content": "\n\n#' @rdname chop\n#' @export\n#' @examples\n#' tab(1:10, c(2, 5, 8))\n#'\ntab <- function (\n         x,\n         breaks,\n         labels    = lbl_intervals(),\n         extend    = NULL,\n         left      = TRUE,\n         close_end = TRUE,\n         raw       = NULL,\n         drop      = TRUE\n       ) {\n  default_table(\n    chop(\n      x         = x,\n      breaks    = breaks,\n      labels    = labels,\n      extend    = extend,\n      left      = left,\n      close_end = close_end,\n      raw       = raw,\n      drop      = drop\n    )\n  )\n}\n\n\n#' @rdname chop_width\n#' @export\n#' @order 3\n#' @examples\n#' tab_width(1:10, 2, start = 0)\n#'\ntab_width <- function (\n               x,\n               width,\n               start,\n               ...,\n               left = sign(width) > 0\n             ) {\n  default_table(\n    chop_width(x = x, width = width, start = start, ..., left = left)\n  )\n}\n\n\n#' @rdname chop_evenly\n#' @export\n#' @order 3\ntab_evenly <- function (\n                x,\n                intervals,\n                ...\n              ) {\n  default_table(\n    chop_evenly(x = x, intervals = intervals, ...)\n  )\n}\n\n\n#' @rdname chop_proportions\n#' @export\n#' @order 3\ntab_proportions <- function (\n                     x,\n                     proportions,\n                     ...,\n                     raw = TRUE\n                   ) {\n  default_table(\n    chop_proportions(x = x, proportions = proportions, ..., raw = raw)\n  )\n}\n\n\n#' @rdname chop_n\n#' @export\n#' @order 3\n#' @examples\n#' tab_n(1:10, 5)\n#'\n#' # fewer elements in one group\n#' tab_n(1:10, 4)\n#'\ntab_n <- function (\n           x,\n           n,\n           ...,\n           tail = \"split\"\n         ) {\n  default_table(chop_n(x = x, n = n, ..., tail = tail))\n}\n\n\n#' @rdname chop_mean_sd\n#' @export\n#' @order 3\n#' @examples\n#' tab_mean_sd(1:10)\n#'\ntab_mean_sd <- function (\n                 x,\n                 sds = 1:3,\n                 ...,\n                 raw = FALSE\n               ) {\n  default_table(chop_mean_sd(x = x, sds = sds, ..., raw = raw))\n}\n\n\n#' @rdname chop_pretty\n#' @export\n#' @order 3\n#' @examples\n#' tab_pretty(1:10)\n#'\ntab_pretty <- function (x, n = 5, ...) {\n  default_table(chop_pretty(x = x, n = n, ...))\n}\n\n\n#' @rdname chop_quantiles\n#' @export\n#' @order 3\n#' @examples\n#' set.seed(42)\n#' tab_quantiles(rnorm(100), probs = 1:3/4, raw = TRUE)\n#'\ntab_quantiles <- function (\n                   x,\n                   probs,\n                   ...,\n                   left      = is.numeric(x),\n                   raw       = FALSE\n                 ) {\n  default_table(\n    chop_quantiles(x = x, probs = probs, ..., left = left, raw = raw)\n  )\n}\n\n\n#' @rdname chop_quantiles\n#' @export\n#' @order 3\ntab_deciles <- function (x, ...) {\n  default_table(chop_deciles(x = x, ...))\n}\n\n\n#' @rdname chop_equally\n#' @export\n#' @order 3\ntab_equally <- function (\n                 x,\n                 groups,\n                 ...,\n                 left      = is.numeric(x),\n                 raw       = TRUE\n               ) {\n  default_table(\n    chop_equally(x = x, groups = groups, ..., left = left, raw = raw)\n  )\n}\n\n\n#' @rdname chop_fn\n#' @export\n#' @order 3\ntab_fn <- function (\n            x,\n            fn,\n            ...,\n            extend = NULL,\n            left = TRUE,\n            close_end = TRUE,\n            raw = NULL,\n            drop = TRUE\n          ) {\n  default_table(\n    chop_fn(x = x, fn = fn, ..., extend = extend, left = left,\n              close_end = close_end, raw = raw, drop = drop)\n  )\n}\n\n\n#' @rdname chop_spikes\n#' @export\n#' @order 3\ntab_spikes <- function (\n                x,\n                breaks,\n                ...,\n                n = NULL,\n                prop = NULL\n              ) {\n  default_table(\n    chop_spikes(x = x, breaks = breaks, ..., n = n, prop = prop)\n  )\n}\n\n#' @rdname dissect\n#' @export\n#' @order 2\ntab_dissect <- function (\n                   x,\n                   breaks,\n                   ...,\n                   n = NULL,\n                   prop = NULL\n               ) {\n  default_table(\n    dissect(x = x, breaks = breaks, ..., n = n, prop = prop)\n  )\n}\n\n\ndefault_table <- function (x) {\n  table(x, useNA = \"ifany\", dnn = NULL)\n}"
  },
  {
    "path": "R/utils.R",
    "content": "\n\n#' Define singleton intervals explicitly\n#'\n#' `exactly()` duplicates its input.\n#' It lets you define singleton intervals like this: `chop(x, c(1, exactly(2), 3))`.\n#' This is the same as `chop(x, c(1, 2, 2, 3))` but conveys your intent more\n#' clearly.\n#'\n#' @param x A numeric vector.\n#'\n#' @return The same as `rep(x, each = 2)`.\n#' @export\n#'\n#' @examples\n#' chop(1:10, c(2, exactly(5), 8))\n#'\n#' # same:\n#' chop(1:10, c(2, 5, 5, 8))\nexactly <- function (x) rep(x, each = 2)\n\n\n\n#' Simple percentage formatter\n#'\n#' `percent()` formats `x` as a percentage.\n#' For a wider range of formatters, consider the [`scales`\n#' package](https://cran.r-project.org/package=scales).\n#'\n#' @param x Numeric values.\n#'\n#' @return `x` formatted as a percent.\n#' @export\n#'\n#' @examples\n#' percent(0.5)\npercent <- function (x) {\n  paste0(unique_truncation(x * 100), \"%\")\n}\n\n\n#' Report singleton intervals\n#'\n#' @param breaks A breaks object\n#'\n#' @return\n#' A logical vector of `length(breaks) - 1`, `TRUE`\n#' if the corresponding interval is a singleton.\n#' @noRd\n#'\n#' @examples\n#' brk <- brk_res(brk_default(c(1, 1, 2, 3, 3, 4)))\n#' brk\n#' # Breaks object: {1} (1, 2) [2, 3) {3} (3, 4)\n#'\n#' singletons(brk)\n#' # TRUE FALSE FALSE TRUE FALSE\nsingletons <- function (breaks) {\n  duplicated(breaks)[-1]\n}\n\n\n#' Find duplicates that would be illegal breaks\n#'\n#' @param x A vector, which should be sorted\n#'\n#' @return A logical vector of length(x), TRUE if the corresponding element\n#'   is the second duplicate in a row.\n#' @noRd\n#'\n#' @examples\n#' find_illegal_duplicates(c(1, 2, 2, 3, 3, 3, 4))\nfind_illegal_duplicates <- function (x) {\n  if (length(x) == 0) return(logical(0))\n  dupes <- duplicated(x)\n  # If element n is duplicated, and element n+1 is duplicated, then n + 1\n  # is illegal.\n  # The first element is never a duplicated middle.\n  c(FALSE, dupes[-length(dupes)] & dupes[-1])\n}\n\n\n`%||%` <- function (x, y) if (is.null(x)) y else x\n\n\nquiet_min <- function (x) suppressWarnings(min(x, na.rm = TRUE))\n\n\nquiet_max <- function (x) suppressWarnings(max(x, na.rm = TRUE))\n\n\n\n#' Stricter `as.numeric`\n#'\n#' This converts warnings to errors, and errors if any NAs are introduced,\n#' but is less strict than `vctrs::vec_cast()`\n#'\n#' @param x A vector\n#'\n#' @return `as.numeric(x)`, with no new NAs\n#' @noRd\n#'\nstrict_as_numeric <- function (x) {\n  nas <- is.na(x)\n\n  x <- tryCatch(as.numeric(x),\n                  warning = function (w) stop(\"Warning from as.numeric(x)\")\n                )\n  if (any(is.na(x) & ! nas)) stop(\"Could not convert some elements\")\n\n  x\n}\n\n\n#' Test a break\n#'\n#' @param brk_fun A call to a `brk_` function\n#' @param x,extend,left,close_end Passed in to `brk_fun`\n#'\n#' @return A `breaks` object.\n#' @noRd\n#'\n#' @examples\n#' brk_res(brk_default(1:3))\n#'\nbrk_res <- function (\n  brk_fun,\n  x         = 1:2,\n  extend    = FALSE,\n  left      = TRUE,\n  close_end = TRUE\n) {\n  brk_fun(x, extend = extend, left = left, close_end = close_end)\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, include = FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  fig.path = \"man/figures/README-\",\n  out.width = \"100%\"\n)  \n\n```\n\n# santoku <img src=\"man/figures/logo.png\" align=\"right\" alt=\"santoku logo\" width=\"120\" />\n\n<!-- badges: start -->\n[![CRAN status](https://www.r-pkg.org/badges/version/santoku)](https://CRAN.R-project.org/package=santoku)\n[![Lifecycle: stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html#stable)\n[![CRAN Downloads Per Month](http://cranlogs.r-pkg.org/badges/santoku)](https://CRAN.R-project.org/package=santoku)\n[![R-universe](https://hughjonesd.r-universe.dev/badges/santoku)](https://hughjonesd.r-universe.dev/santoku)\n[![R-CMD-check](https://github.com/hughjonesd/santoku/workflows/R-CMD-check/badge.svg)](https://github.com/hughjonesd/santoku/actions)\n[![Codecov test coverage](https://codecov.io/gh/hughjonesd/santoku/branch/master/graph/badge.svg)](https://app.codecov.io/gh/hughjonesd/santoku?branch=master)\n<!-- badges: end -->\n\nsantoku is a versatile cutting tool for R. It provides `chop()`, a replacement \nfor `base::cut()`.\n\n## Installation\n\nInstall from [r-universe](https://r-universe.dev):\n\n``` r\ninstall.packages(\"santoku\", repos = c(\"https://hughjonesd.r-universe.dev\", \n                                      \"https://cloud.r-project.org\"))\n```\n\nOr from CRAN:\n\n``` r\ninstall.packages(\"santoku\")\n```\n\nOr get the development version from github:\n\n``` r\n# install.packages(\"remotes\")\nremotes::install_github(\"hughjonesd/santoku\")\n```\n\n\n```{r, child = 'advantages.Rmd'}\n```\n\n\n## Examples\n\n```{r}\nlibrary(santoku)\n```\n\n`chop` returns a factor:\n\n```{r}\nchop(1:5, c(2, 4))\n```\n\nInclude a number twice to match it exactly: \n\n```{r}\nchop(1:5, c(2, 2, 4))\n```\n\nUse names in breaks for labels:\n\n```{r}\nchop(1:5, c(Low = 1, Mid = 2, High = 4))\n```\n\nOr use `lbl_*` functions:\n\n```{r}\nchop(1:5, c(2, 4), labels = lbl_dash())\n```\n\n\nChop into fixed-width intervals:\n\n```{r}\nchop_width(runif(10), 0.1)\n```\n\nOr into fixed-size groups:\n\n```{r}\nchop_n(1:10, 5)\n```\n\n\nChop dates by calendar month, then tabulate:\n\n```{r}\nlibrary(lubridate)\n\ndates <- as.Date(\"2021-12-31\") + 1:90\n\ntab_width(dates, months(1), labels = lbl_discrete(fmt = \"%d %b\"))\n```\n\nFor more information, see the [vignette](https://hughjonesd.github.io/santoku/articles/santoku.html).\n"
  },
  {
    "path": "README.md",
    "content": "\n<!-- README.md is generated from README.Rmd. Please edit that file -->\n\n# santoku <img src=\"man/figures/logo.png\" align=\"right\" alt=\"santoku logo\" width=\"120\" />\n\n<!-- badges: start -->\n\n[![CRAN\nstatus](https://www.r-pkg.org/badges/version/santoku)](https://CRAN.R-project.org/package=santoku)\n[![Lifecycle:\nstable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html#stable)\n[![CRAN Downloads Per\nMonth](http://cranlogs.r-pkg.org/badges/santoku)](https://CRAN.R-project.org/package=santoku)\n[![R-universe](https://hughjonesd.r-universe.dev/badges/santoku)](https://hughjonesd.r-universe.dev/santoku)\n[![R-CMD-check](https://github.com/hughjonesd/santoku/workflows/R-CMD-check/badge.svg)](https://github.com/hughjonesd/santoku/actions)\n[![Codecov test\ncoverage](https://codecov.io/gh/hughjonesd/santoku/branch/master/graph/badge.svg)](https://app.codecov.io/gh/hughjonesd/santoku?branch=master)\n<!-- badges: end -->\n\nsantoku is a versatile cutting tool for R. It provides `chop()`, a\nreplacement for `base::cut()`.\n\n## Installation\n\nInstall from [r-universe](https://r-universe.dev):\n\n``` r\ninstall.packages(\"santoku\", repos = c(\"https://hughjonesd.r-universe.dev\", \n                                      \"https://cloud.r-project.org\"))\n```\n\nOr from CRAN:\n\n``` r\ninstall.packages(\"santoku\")\n```\n\nOr get the development version from github:\n\n``` r\n# install.packages(\"remotes\")\nremotes::install_github(\"hughjonesd/santoku\")\n```\n\n## Advantages\n\nHere are some advantages of santoku:\n\n- By default, `chop()` always covers the whole range of the data, so you\n  won’t get unexpected `NA` values.\n\n- `chop()` can handle single values as well as intervals. For example,\n  `chop(x, breaks = c(1, 2, 2, 3))` will create a separate factor level\n  for values exactly equal to 2.\n\n- `chop()` can handle many kinds of data, including numbers, dates and\n  times, and [units](https://r-quantities.github.io/units/).\n\n- `chop_*` functions create intervals in many ways, using quantiles of\n  the data, standard deviations, fixed-width intervals, equal-sized\n  groups, or pretty intervals for use in graphs.\n\n- It’s easy to label intervals: use names for your breaks vector, or use\n  a `lbl_*` function to create interval notation like `[1, 2)`, dash\n  notation like `1-2`, or arbitrary styles using `glue::glue()`.\n\n- `tab_*` functions quickly chop data, then tabulate it.\n\nThese advantages make santoku especially useful for exploratory\nanalysis, where you may not know the range of your data in advance.\n\n## Examples\n\n``` r\nlibrary(santoku)\n```\n\n`chop` returns a factor:\n\n``` r\nchop(1:5, c(2, 4))\n#> [1] [1, 2) [2, 4) [2, 4) [4, 5] [4, 5]\n#> Levels: [1, 2) [2, 4) [4, 5]\n```\n\nInclude a number twice to match it exactly:\n\n``` r\nchop(1:5, c(2, 2, 4))\n#> [1] [1, 2) {2}    (2, 4) [4, 5] [4, 5]\n#> Levels: [1, 2) {2} (2, 4) [4, 5]\n```\n\nUse names in breaks for labels:\n\n``` r\nchop(1:5, c(Low = 1, Mid = 2, High = 4))\n#> [1] Low  Mid  Mid  High High\n#> Levels: Low Mid High\n```\n\nOr use `lbl_*` functions:\n\n``` r\nchop(1:5, c(2, 4), labels = lbl_dash())\n#> [1] 1—2 2—4 2—4 4—5 4—5\n#> Levels: 1—2 2—4 4—5\n```\n\nChop into fixed-width intervals:\n\n``` r\nchop_width(runif(10), 0.1)\n#>  [1] [0.368, 0.468)   [0.268, 0.368)   [0.768, 0.868]   [0.568, 0.668)  \n#>  [5] [0.668, 0.768)   [0.768, 0.868]   [0.06801, 0.168) [0.668, 0.768)  \n#>  [9] [0.06801, 0.168) [0.468, 0.568)  \n#> 7 Levels: [0.06801, 0.168) [0.268, 0.368) [0.368, 0.468) ... [0.768, 0.868]\n```\n\nOr into fixed-size groups:\n\n``` r\nchop_n(1:10, 5)\n#>  [1] [1, 6)  [1, 6)  [1, 6)  [1, 6)  [1, 6)  [6, 10] [6, 10] [6, 10] [6, 10]\n#> [10] [6, 10]\n#> Levels: [1, 6) [6, 10]\n```\n\nChop dates by calendar month, then tabulate:\n\n``` r\nlibrary(lubridate)\n#> \n#> Attaching package: 'lubridate'\n#> The following objects are masked from 'package:base':\n#> \n#>     date, intersect, setdiff, union\n\ndates <- as.Date(\"2021-12-31\") + 1:90\n\ntab_width(dates, months(1), labels = lbl_discrete(fmt = \"%d %b\"))\n#> 01 Jan—31 Jan 01 Feb—28 Feb 01 Mar—31 Mar \n#>            31            28            31\n```\n\nFor more information, see the\n[vignette](https://hughjonesd.github.io/santoku/articles/santoku.html).\n"
  },
  {
    "path": "TODO.md",
    "content": "\n\n# TODO\n\n* Work on tests\n  - tests for `left` and `close_end` arguments\n  - tests for `brk_default`\n  - `brk_width()` needs tests which match the guarantees in the documentation\n  - ditto for `brk_evenly()` which now uses its own implementation to\n    guarantee exactly `intervals` intervals\n  - systematic tests for `brk_*` functions\n  \n\n* Implement a simple `Infinity` class that automatically casts to any other\n  class and is always > or < than any other element? Then replace the `class_bounds()`\n  complexity?\n  - The problem at the moment is that `vec_cast()` is highly unreliable and\n    you never know if a particular class will accept `Inf`.\n  - An infinity class would be fine, but how does that go into the existing\n    `breaks` object which has its own underlying class?\n  - Might be more reasonable just not to add `Inf` or `-Inf` elements. Instead,\n    record whether the breaks have left and right \"infinity\" set. Then just\n    add numeric infinity to the breaks before you call `categorize_impl` (or\n    the R version). In particular, e.g. `integer64` doesn't like `Inf` or `-Inf`\n    but it does have very large numbers in `bit64::lim.integer64` which look\n    ugly and which only exist to be lower/higher than everything else anyway...\n    - But NB this requires a new way to create the labels, and that kinda \n      sucks....\n\n\n# Thoughts on errors\n\n* On the whole, we don't want to error out if `x` is weird. `x` is data. But\n  if e.g. `breaks` are weird, we can error out.\n  - Exception: `x` is the wrong class or type.\n  \n* In some cases we want to guarantee the set of breaks.\n  - e.g. `brk_manual()` with `extend` set.\n\n* In other cases, e.g. `brk_evenly()` we don't need to make such a guarantee.\n\n\n# Questions\n\n* Is it really OK to have `left = FALSE` as the default in `chop_quantiles()`,\n  `chop_evenly()` and friends? \n  - the alternative is to do it only when `x` is non-numeric.\n  - that makes the surprise rarer, but rare surprises can be worse... and\n    it adds complexity since the functions have to be generic.\n  - another alternative: `chop` sets `left = FALSE` for non-numeric `x`. Probably\n    better.\n\n* Do we need `drop`?\n  - should `drop` have a default of `! isTRUE(extend)` i.e. be `FALSE` when\n    `extend = TRUE`?\n\n\n# Questions with a (provisional) answer\n\n* Should we have a flag to return characters?\n  - No, we have `labels = NULL` for integer codes only though.\n\n* Should we put a `percent` argument into `brk_quantiles()` so it can store \n  scaled endpoints as proportions rather than percentages (the current default)?\n  - My sense is, not unless someone asks.\n  - Oh, someone just did ask; more generally though.\n  \n* Should `close_end = TRUE` argument come before `...` in `chop_` variants?\n  - No. We don't want people to set it by position, so distinguish it from\n    the initial arguments.\n    \n* What to do about `tidyr::chop()`\n  - Current answer: fuck 'em. (NB: just kidding. I am a huge tidyverse fan.) \n  - We provide `kiru()`. So on the REPL, people can just use `kiru()` if they\n    load santoku first. If they load santoku second, they'll have to use\n    `tidyr::chop()`, but reading the documentation, I suspect this will be rare.\n  - For programming, people should probably used the fully qualified name \n    anyway.\n\n* When to extend?\n  - I think default should be \"if necessary\" (`extend = NULL`); should always\n    extend to Inf, -Inf so that these break labels are not data-dependent\n  - Tension between wanting something predictable in your new data, vs. something\n    readable in `tab_*`. E.g.\n    ```r\n    tab_size(1:9, 3, lbl_seq()) \n    ```\n    should surely return labels a, b, c. But this means we aren't always\n    extending.\n    \n* Should we allow vector `labels` to be longer than necessary?\n  + lets people do e.g. `chop(rnorm(100), -2:2, LETTERS)`\n  - but might hide errors\n  - overall I'm against\n  \n* Is the label interface right? Problem exposed by `brk_mean_sd`: if \n  we aren't sure whether data gets extended, then how do we know what\n  the labels should be?\n  - maybe label functions should have access to `x`?\n  - or should they be informed if breaks got extended?\n  - or could the breaks object know how to extend its labels?\n  - current solution: labels get `extend`\n  - I think better: `breaks` objects include suggested labels which\n    the user can override. That way they always have the info necessary.\n  - We could also divide labelling into two parts:\n    1. choosing the break numbers (these may not be the actual values, e.g\n      they could be quantiles or std errs from 0)\n    2. formatting these numbers, and with dashes, set notation etc\n  - So maybe `brk_*` functions always return break numbers;\n    then labels decide how to format them?\n  \n* Should we automatically sort breaks, or throw an error if they're unsorted?\n  - or a warning?\n  - currently an error\n\n* What if `breaks = c(1, 2, 2, 2, 3)`?\n  - throw an error\n\n* For some cases e.g. `brk_quantiles`, `brk_width`, the data may not work\n  well e.g. if it is all NA. What is an empty set of breaks?\n\n\n# Possible interfaces\n\n- `hist_xxx` functions for histograms/barplots? (how to treat singletons?)\n- `grp_xxx` for group_by? Hmmm...\n- New label interface to replace `lbl_sequence`: \n  `lbl_style(\"1.\"), lbl_style(\"(i)\"), lbl_style(\"A\")` etc.? \n- Still wonder, could we drop `extend` which adds complexity and just\n  have `only()` or `extend()` as new breaks functions?\n\n# Other ideas\n\n- Speedup categorize by only checking left intervals, add 1 if its past\n  each interval [NO: actually no fewer checks in the end...]\n- Speedup by using pointers? hmm, magic...\n\n"
  },
  {
    "path": "_pkgdown.yml",
    "content": "destination: docs\n\nurl: https://hughjonesd.github.io/santoku\ntemplate:\n  bootstrap: 5\n  bootswatch: darkly\n  theme: arrow-dark\n  bslib:\n    link-color: \"#f9ea6b\"\n    link-decoration: none\n    navbar-dark-hover-color: \"#f9ea6b\"\n    navbar-dark-active-color: \"#f9ea6b\"\n\ntutorials:\n- name: 00-visualintroduction\n  title: A visual introduction to santoku\n  url: https://hughjonesd.github.io/visual-introduction.html\n- name: 01-chopping-dates\n  title: Chopping dates with santoku\n  url: https://hughjonesd.github.io/chopping-dates-with-santoku.html\n\nreference:\n- title: Package overview\n- contents:\n  - \"`santoku-package`\"\n- title: Basic chop functions\n  desc:  Cut a vector into intervals\n- contents:\n  - chop\n  - kiru\n  - fillet\n  - tab\n- title: Chopping by width\n  desc:  Cut a vector into intervals defined by width\n- contents:\n  - matches(\"width\")\n  - ends_with(\"proportions\")\n  - ends_with(\"evenly\")\n- title: Chopping by n\n  desc:  Cut a vector into intervals defined by number of elements\n- contents:\n  - ends_with(\"_n\")\n  - ends_with(\"quantiles\")\n  - ends_with(\"equally\")\n- title: Chopping and separating\n  desc:  Cut a vector into intervals, separating out common values\n- contents:\n  - ends_with(\"spikes\")\n  - ends_with(\"dissect\")\n- title: Other chop functions\n  desc:  Miscellaneous ways to cut a vector into intervals\n- contents:\n  - ends_with(\"mean_sd\")\n  - ends_with(\"pretty\")\n  - ends_with(\"fn\")\n  - brk_default\n  - brk_manual\n- title: Label functions\n  desc: Specify how to label the chopped intervals\n- contents:\n  - starts_with(\"lbl\")\n- title: Miscellaneous\n  desc: Other helper functions\n- contents:\n  - -starts_with(\"chop|brk|lbl|santoku\")\n  - -ends_with(\"dissect\")\n  - -fillet\n"
  },
  {
    "path": "advantages.Rmd",
    "content": "\n## Advantages\n\n Here are some advantages of santoku:\n\n * By default, `chop()` always covers the whole range of the data, so you\n   won't get unexpected `NA` values.\n\n * `chop()` can handle single values as well as intervals. For example, \n   `chop(x, breaks = c(1, 2, 2, 3))` will create a separate factor level for\n   values exactly equal to 2.\n\n * `chop()` can handle many kinds of data, including numbers, dates and \n   times, and [units](https://r-quantities.github.io/units/).\n\n * `chop_*` functions create intervals in many ways, using quantiles of the data, \n   standard deviations, fixed-width intervals, equal-sized groups, or\n   pretty intervals for use in graphs.\n \n*  It's easy to label intervals: use names for your breaks vector, or\n   use a `lbl_*` function to create interval notation like `[1, 2)`, dash \n   notation like `1-2`, or arbitrary styles using `glue::glue()`.\n\n * `tab_*` functions quickly chop data, then tabulate it.\n\n These advantages make santoku especially useful for exploratory analysis,\n where you may not know the range of your data in advance.\n"
  },
  {
    "path": "codecov.yml",
    "content": "comment: false\n\ncoverage:\n  status:\n    project:\n      default:\n        target: auto\n        threshold: 1%\n    patch:\n      default:\n        target: auto\n        threshold: 1%\n"
  },
  {
    "path": "cran-comments.md",
    "content": "\nVersion 1.2.1. Fixes (I hope) a testing bug exposed on CRAN.\n\n## Test environments\n\n* local (macOS), R 4.6.0\n* github (windows, macOS, Ubuntu), devel and release\n* win-builder (windows), devel and release\n\n\n## R CMD check results\n\n* Fine on all platforms.\n\n## Reverse dependencies\n\n* None.\n"
  },
  {
    "path": "docs/404.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<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>Page not found (404) • santoku</title>\n<!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"https://hughjonesd.github.io/santoku/favicon-96x96.png\">\n<link rel=\"icon\" type=\"”image/svg+xml”\" href=\"https://hughjonesd.github.io/santoku/favicon.svg\">\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"https://hughjonesd.github.io/santoku/apple-touch-icon.png\">\n<link rel=\"icon\" sizes=\"any\" href=\"https://hughjonesd.github.io/santoku/favicon.ico\">\n<link rel=\"manifest\" href=\"https://hughjonesd.github.io/santoku/site.webmanifest\">\n<script src=\"https://hughjonesd.github.io/santoku/deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<link href=\"https://hughjonesd.github.io/santoku/deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\">\n<script src=\"https://hughjonesd.github.io/santoku/deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"https://hughjonesd.github.io/santoku/deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\">\n<link href=\"https://hughjonesd.github.io/santoku/deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\">\n<script src=\"https://hughjonesd.github.io/santoku/deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"https://hughjonesd.github.io/santoku/deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"https://hughjonesd.github.io/santoku/deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"https://hughjonesd.github.io/santoku/deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"https://hughjonesd.github.io/santoku/deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"https://hughjonesd.github.io/santoku/deps/search-1.0.0/fuse.min.js\"></script><script src=\"https://hughjonesd.github.io/santoku/deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"https://hughjonesd.github.io/santoku/pkgdown.js\"></script><link href=\"https://hughjonesd.github.io/santoku/extra.css\" rel=\"stylesheet\">\n<meta property=\"og:title\" content=\"Page not found (404)\">\n<meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\">\n</head>\n<body>\n    <a href=\"https://hughjonesd.github.io/santoku/#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"https://hughjonesd.github.io/santoku/index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\">\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"https://hughjonesd.github.io/santoku/articles/santoku.html\">Get started</a></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"https://hughjonesd.github.io/santoku/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=\"https://hughjonesd.github.io/santoku/articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"https://hughjonesd.github.io/santoku/articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul>\n</li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\">\n<li><a class=\"dropdown-item\" href=\"https://hughjonesd.github.io/santoku/tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"https://hughjonesd.github.io/santoku/tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul>\n</li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"https://hughjonesd.github.io/santoku/news/index.html\">Changelog</a></li>\n      </ul>\n<ul class=\"navbar-nav\">\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<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul>\n</div>\n\n\n  </div>\n</nav><div class=\"container template-title-body\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"https://hughjonesd.github.io/santoku/logo.png\" class=\"logo\" alt=\"\"><h1>Page not found (404)</h1>\n\n    </div>\n\nContent not found. Please use links in the navbar.\n\n  </main>\n</div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer>\n</div>\n\n\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/404.md",
    "content": "Content not found. Please use links in the navbar.\n\n# Page not found (404)\n"
  },
  {
    "path": "docs/AGENTS.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>AGENTS.md • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"favicon.ico\"><link rel=\"manifest\" href=\"site.webmanifest\"><script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"deps/search-1.0.0/fuse.min.js\"></script><script src=\"deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"pkgdown.js\"></script><link href=\"extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"AGENTS.md\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"articles/santoku.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\"><li><a class=\"dropdown-item\" href=\"articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-title-body\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"logo.png\" class=\"logo\" alt=\"\"><h1>AGENTS.md</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/AGENTS.md\" class=\"external-link\"><code>AGENTS.md</code></a></small>\n    </div>\n\n<div id=\"agentsmd\" class=\"section level1\">\n\n<p>This file provides guidance to agents when working with code in this repository.</p>\n<div class=\"section level2\">\n<h2 id=\"project-overview\">Project Overview<a class=\"anchor\" aria-label=\"anchor\" href=\"#project-overview\"></a></h2>\n<p>santoku is an R package that provides <code><a href=\"reference/chop.html\">chop()</a></code>, a versatile replacement for <code><a href=\"https://rdrr.io/r/base/cut.html\" class=\"external-link\">base::cut()</a></code> for cutting data into intervals. The package handles numeric vectors, dates, times, and other comparable objects, with support for singleton intervals and flexible labeling.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"common-commands\">Common Commands<a class=\"anchor\" aria-label=\"anchor\" href=\"#common-commands\"></a></h2>\n<div class=\"section level3\">\n<h3 id=\"testing\">Testing<a class=\"anchor\" aria-label=\"anchor\" href=\"#testing\"></a></h3>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a><span class=\"co\"># Run all tests</span></span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" tabindex=\"-1\"></a>devtools<span class=\"sc\">::</span><span class=\"fu\">test</span>()</span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" tabindex=\"-1\"></a></span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" tabindex=\"-1\"></a><span class=\"co\"># Run tests from command line</span></span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" tabindex=\"-1\"></a>R CMD check .</span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" tabindex=\"-1\"></a></span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" tabindex=\"-1\"></a><span class=\"co\"># Run specific test file</span></span>\n<span id=\"cb1-8\"><a href=\"#cb1-8\" tabindex=\"-1\"></a>testthat<span class=\"sc\">::</span><span class=\"fu\">test_file</span>(<span class=\"st\">\"tests/testthat/test-chop.R\"</span>)</span></code></pre></div>\n</div>\n<div class=\"section level3\">\n<h3 id=\"development-workflow\">Development workflow<a class=\"anchor\" aria-label=\"anchor\" href=\"#development-workflow\"></a></h3>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"co\"># Build package</span></span>\n<span><span class=\"fu\">devtools</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://devtools.r-lib.org/reference/build.html\" class=\"external-link\">build</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># Install package locally</span></span>\n<span><span class=\"fu\">devtools</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://devtools.r-lib.org/reference/install.html\" class=\"external-link\">install</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># Check package</span></span>\n<span><span class=\"fu\">devtools</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://devtools.r-lib.org/reference/check.html\" class=\"external-link\">check</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># Load package for interactive development</span></span>\n<span><span class=\"fu\">devtools</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://devtools.r-lib.org/reference/load_all.html\" class=\"external-link\">load_all</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span></code></pre></div>\n</div>\n<div class=\"section level3\">\n<h3 id=\"documentation\">Documentation<a class=\"anchor\" aria-label=\"anchor\" href=\"#documentation\"></a></h3>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"co\"># Update documentation</span></span>\n<span><span class=\"fu\">devtools</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://devtools.r-lib.org/reference/document.html\" class=\"external-link\">document</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># Build website</span></span>\n<span><span class=\"fu\">pkgdown</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://pkgdown.r-lib.org/reference/build_site.html\" class=\"external-link\">build_site</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span></code></pre></div>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"architecture\">Architecture<a class=\"anchor\" aria-label=\"anchor\" href=\"#architecture\"></a></h2>\n<div class=\"section level3\">\n<h3 id=\"core-components\">Core Components<a class=\"anchor\" aria-label=\"anchor\" href=\"#core-components\"></a></h3>\n<ul><li>\n<strong>Main cutting function</strong>: <code><a href=\"reference/chop.html\">chop()</a></code> in <code>R/chop.R</code> - the primary interface that calls other functions</li>\n<li>\n<strong>Break creation</strong>: <code>R/breaks*.R</code> files contain functions to create break points (<code>brk_*</code> functions)</li>\n<li>\n<strong>Labeling system</strong>: <code>R/labels*.R</code> files contain labeling functions (<code>lbl_*</code> functions)<br></li>\n<li>\n<strong>Convenience functions</strong>: <code>R/chop-*.R</code> files contain <code>chop_*</code> wrapper functions for common use cases</li>\n<li>\n<strong>C++ backend</strong>: <code>src/categorize.cpp</code> provides fast interval categorization via Rcpp</li>\n<li>\n<strong>Tabulation</strong>: <code>R/tab.R</code> provides <code>tab_*</code> functions that chop and tabulate in one step</li>\n</ul></div>\n<div class=\"section level3\">\n<h3 id=\"key-design-patterns\">Key Design Patterns<a class=\"anchor\" aria-label=\"anchor\" href=\"#key-design-patterns\"></a></h3>\n<ol style=\"list-style-type: decimal\"><li>\n<strong>Function factories</strong>: Many functions return other functions (e.g., <code>brk_*</code> functions return break-creation functions)</li>\n<li>\n<strong>Method dispatch</strong>: Uses S3 methods and vctrs for handling different data types (numbers, dates, etc.)</li>\n<li>\n<strong>Extensible labeling</strong>: Label functions can be combined and customized using the <code>lbl_*</code> family</li>\n<li>\n<strong>Performance</strong>: Core categorization logic is implemented in C++ for speed</li>\n</ol></div>\n<div class=\"section level3\">\n<h3 id=\"file-organization\">File Organization<a class=\"anchor\" aria-label=\"anchor\" href=\"#file-organization\"></a></h3>\n<ul><li>\n<code>R/chop.R</code> - Main <code><a href=\"reference/chop.html\">chop()</a></code> function and documentation</li>\n<li>\n<code>R/breaks*.R</code> - Break point creation (<code>brk_default</code>, <code>brk_width</code>, etc.)</li>\n<li>\n<code>R/labels*.R</code> - Label generation (<code>lbl_intervals</code>, <code>lbl_dash</code>, etc.)</li>\n<li>\n<code>R/chop-*.R</code> - Convenience functions (<code>chop_quantiles</code>, <code>chop_width</code>, etc.)</li>\n<li>\n<code>R/tab.R</code> - Tabulation functions</li>\n<li>\n<code>R/utils.R</code> - Utility functions like <code><a href=\"reference/exactly.html\">exactly()</a></code> and <code><a href=\"reference/percent.html\">percent()</a></code>\n</li>\n<li>\n<code>src/categorize.cpp</code> - Fast C++ categorization implementation</li>\n<li>\n<code>tests/testthat/</code> - Comprehensive test suite</li>\n</ul></div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"development-notes\">Development Notes<a class=\"anchor\" aria-label=\"anchor\" href=\"#development-notes\"></a></h2>\n<ul><li>The package uses Rcpp for performance-critical categorization</li>\n<li>Tests are extensive and include systematic testing in <code>test-zzz-systematic.R</code>\n</li>\n<li>The package supports non-standard data types (dates, times, units) via the vctrs package</li>\n<li>Documentation follows roxygen2 conventions with extensive examples</li>\n<li>Uses lifecycle package for function lifecycle management</li>\n</ul></div>\n</div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/AGENTS.md",
    "content": "# AGENTS.md\n\nThis file provides guidance to agents when working with code in this\nrepository.\n\n## Project Overview\n\nsantoku is an R package that provides\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md), a\nversatile replacement for\n[`base::cut()`](https://rdrr.io/r/base/cut.html) for cutting data into\nintervals. The package handles numeric vectors, dates, times, and other\ncomparable objects, with support for singleton intervals and flexible\nlabeling.\n\n## Common Commands\n\n### Testing\n\n``` r\n# Run all tests\ndevtools::test()\n\n# Run tests from command line\nR CMD check .\n\n# Run specific test file\ntestthat::test_file(\"tests/testthat/test-chop.R\")\n```\n\n### Development workflow\n\n``` r\n\n# Build package\ndevtools::build()\n\n# Install package locally\ndevtools::install()\n\n# Check package\ndevtools::check()\n\n# Load package for interactive development\ndevtools::load_all()\n```\n\n### Documentation\n\n``` r\n\n# Update documentation\ndevtools::document()\n\n# Build website\npkgdown::build_site()\n```\n\n## Architecture\n\n### Core Components\n\n- **Main cutting function**:\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md) in\n  `R/chop.R` - the primary interface that calls other functions\n- **Break creation**: `R/breaks*.R` files contain functions to create\n  break points (`brk_*` functions)\n- **Labeling system**: `R/labels*.R` files contain labeling functions\n  (`lbl_*` functions)  \n- **Convenience functions**: `R/chop-*.R` files contain `chop_*` wrapper\n  functions for common use cases\n- **C++ backend**: `src/categorize.cpp` provides fast interval\n  categorization via Rcpp\n- **Tabulation**: `R/tab.R` provides `tab_*` functions that chop and\n  tabulate in one step\n\n### Key Design Patterns\n\n1.  **Function factories**: Many functions return other functions (e.g.,\n    `brk_*` functions return break-creation functions)\n2.  **Method dispatch**: Uses S3 methods and vctrs for handling\n    different data types (numbers, dates, etc.)\n3.  **Extensible labeling**: Label functions can be combined and\n    customized using the `lbl_*` family\n4.  **Performance**: Core categorization logic is implemented in C++ for\n    speed\n\n### File Organization\n\n- `R/chop.R` - Main\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n  function and documentation\n- `R/breaks*.R` - Break point creation (`brk_default`, `brk_width`,\n  etc.)\n- `R/labels*.R` - Label generation (`lbl_intervals`, `lbl_dash`, etc.)\n- `R/chop-*.R` - Convenience functions (`chop_quantiles`, `chop_width`,\n  etc.)\n- `R/tab.R` - Tabulation functions\n- `R/utils.R` - Utility functions like\n  [`exactly()`](https://hughjonesd.github.io/santoku/reference/exactly.md)\n  and\n  [`percent()`](https://hughjonesd.github.io/santoku/reference/percent.md)\n- `src/categorize.cpp` - Fast C++ categorization implementation\n- `tests/testthat/` - Comprehensive test suite\n\n## Development Notes\n\n- The package uses Rcpp for performance-critical categorization\n- Tests are extensive and include systematic testing in\n  `test-zzz-systematic.R`\n- The package supports non-standard data types (dates, times, units) via\n  the vctrs package\n- Documentation follows roxygen2 conventions with extensive examples\n- Uses lifecycle package for function lifecycle management\n"
  },
  {
    "path": "docs/CLAUDE.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>CLAUDE.md • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"favicon.ico\"><link rel=\"manifest\" href=\"site.webmanifest\"><script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"deps/search-1.0.0/fuse.min.js\"></script><script src=\"deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"pkgdown.js\"></script><link href=\"extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"CLAUDE.md\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.1.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"articles/santoku.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\"><li><a class=\"dropdown-item\" href=\"articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-title-body\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"logo.png\" class=\"logo\" alt=\"\"><h1>CLAUDE.md</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/CLAUDE.md\" class=\"external-link\"><code>CLAUDE.md</code></a></small>\n    </div>\n\n<div id=\"claudemd\" class=\"section level1\">\n\n<p>This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.</p>\n<div class=\"section level2\">\n<h2 id=\"project-overview\">Project Overview<a class=\"anchor\" aria-label=\"anchor\" href=\"#project-overview\"></a></h2>\n<p>santoku is an R package that provides <code><a href=\"reference/chop.html\">chop()</a></code>, a versatile replacement for <code><a href=\"https://rdrr.io/r/base/cut.html\" class=\"external-link\">base::cut()</a></code> for cutting data into intervals. The package handles numeric vectors, dates, times, and other comparable objects, with support for singleton intervals and flexible labeling.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"common-commands\">Common Commands<a class=\"anchor\" aria-label=\"anchor\" href=\"#common-commands\"></a></h2>\n<div class=\"section level3\">\n<h3 id=\"testing\">Testing<a class=\"anchor\" aria-label=\"anchor\" href=\"#testing\"></a></h3>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><span id=\"cb1-1\"><a href=\"#cb1-1\" tabindex=\"-1\"></a><span class=\"co\"># Run all tests</span></span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" tabindex=\"-1\"></a>devtools<span class=\"sc\">::</span><span class=\"fu\">test</span>()</span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" tabindex=\"-1\"></a></span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" tabindex=\"-1\"></a><span class=\"co\"># Run tests from command line</span></span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" tabindex=\"-1\"></a>R CMD check .</span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" tabindex=\"-1\"></a></span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" tabindex=\"-1\"></a><span class=\"co\"># Run specific test file</span></span>\n<span id=\"cb1-8\"><a href=\"#cb1-8\" tabindex=\"-1\"></a>testthat<span class=\"sc\">::</span><span class=\"fu\">test_file</span>(<span class=\"st\">\"tests/testthat/test-chop.R\"</span>)</span></code></pre></div>\n</div>\n<div class=\"section level3\">\n<h3 id=\"development-workflow\">Development workflow<a class=\"anchor\" aria-label=\"anchor\" href=\"#development-workflow\"></a></h3>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"co\"># Build package</span></span>\n<span><span class=\"fu\">devtools</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://devtools.r-lib.org/reference/build.html\" class=\"external-link\">build</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># Install package locally</span></span>\n<span><span class=\"fu\">devtools</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://devtools.r-lib.org/reference/install.html\" class=\"external-link\">install</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># Check package</span></span>\n<span><span class=\"fu\">devtools</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://devtools.r-lib.org/reference/check.html\" class=\"external-link\">check</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># Load package for interactive development</span></span>\n<span><span class=\"fu\">devtools</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://devtools.r-lib.org/reference/load_all.html\" class=\"external-link\">load_all</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span></code></pre></div>\n</div>\n<div class=\"section level3\">\n<h3 id=\"documentation\">Documentation<a class=\"anchor\" aria-label=\"anchor\" href=\"#documentation\"></a></h3>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"co\"># Update documentation</span></span>\n<span><span class=\"fu\">devtools</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://devtools.r-lib.org/reference/document.html\" class=\"external-link\">document</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># Build website</span></span>\n<span><span class=\"fu\">pkgdown</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://pkgdown.r-lib.org/reference/build_site.html\" class=\"external-link\">build_site</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span></code></pre></div>\n</div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"architecture\">Architecture<a class=\"anchor\" aria-label=\"anchor\" href=\"#architecture\"></a></h2>\n<div class=\"section level3\">\n<h3 id=\"core-components\">Core Components<a class=\"anchor\" aria-label=\"anchor\" href=\"#core-components\"></a></h3>\n<ul><li>\n<strong>Main cutting function</strong>: <code><a href=\"reference/chop.html\">chop()</a></code> in <code>R/chop.R</code> - the primary interface that calls other functions</li>\n<li>\n<strong>Break creation</strong>: <code>R/breaks*.R</code> files contain functions to create break points (<code>brk_*</code> functions)</li>\n<li>\n<strong>Labeling system</strong>: <code>R/labels*.R</code> files contain labeling functions (<code>lbl_*</code> functions)<br></li>\n<li>\n<strong>Convenience functions</strong>: <code>R/chop-*.R</code> files contain <code>chop_*</code> wrapper functions for common use cases</li>\n<li>\n<strong>C++ backend</strong>: <code>src/categorize.cpp</code> provides fast interval categorization via Rcpp</li>\n<li>\n<strong>Tabulation</strong>: <code>R/tab.R</code> provides <code>tab_*</code> functions that chop and tabulate in one step</li>\n</ul></div>\n<div class=\"section level3\">\n<h3 id=\"key-design-patterns\">Key Design Patterns<a class=\"anchor\" aria-label=\"anchor\" href=\"#key-design-patterns\"></a></h3>\n<ol style=\"list-style-type: decimal\"><li>\n<strong>Function factories</strong>: Many functions return other functions (e.g., <code>brk_*</code> functions return break-creation functions)</li>\n<li>\n<strong>Method dispatch</strong>: Uses S3 methods and vctrs for handling different data types (numbers, dates, etc.)</li>\n<li>\n<strong>Extensible labeling</strong>: Label functions can be combined and customized using the <code>lbl_*</code> family</li>\n<li>\n<strong>Performance</strong>: Core categorization logic is implemented in C++ for speed</li>\n</ol></div>\n<div class=\"section level3\">\n<h3 id=\"file-organization\">File Organization<a class=\"anchor\" aria-label=\"anchor\" href=\"#file-organization\"></a></h3>\n<ul><li>\n<code>R/chop.R</code> - Main <code><a href=\"reference/chop.html\">chop()</a></code> function and documentation</li>\n<li>\n<code>R/breaks*.R</code> - Break point creation (<code>brk_default</code>, <code>brk_width</code>, etc.)</li>\n<li>\n<code>R/labels*.R</code> - Label generation (<code>lbl_intervals</code>, <code>lbl_dash</code>, etc.)</li>\n<li>\n<code>R/chop-*.R</code> - Convenience functions (<code>chop_quantiles</code>, <code>chop_width</code>, etc.)</li>\n<li>\n<code>R/tab.R</code> - Tabulation functions</li>\n<li>\n<code>R/utils.R</code> - Utility functions like <code><a href=\"reference/exactly.html\">exactly()</a></code> and <code><a href=\"reference/percent.html\">percent()</a></code>\n</li>\n<li>\n<code>src/categorize.cpp</code> - Fast C++ categorization implementation</li>\n<li>\n<code>tests/testthat/</code> - Comprehensive test suite</li>\n</ul></div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"development-notes\">Development Notes<a class=\"anchor\" aria-label=\"anchor\" href=\"#development-notes\"></a></h2>\n<ul><li>The package uses Rcpp for performance-critical categorization</li>\n<li>Tests are extensive and include systematic testing in <code>test-zzz-systematic.R</code>\n</li>\n<li>The package supports non-standard data types (dates, times, units) via the vctrs package</li>\n<li>Documentation follows roxygen2 conventions with extensive examples</li>\n<li>Uses lifecycle package for function lifecycle management</li>\n</ul></div>\n</div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/CLAUDE.md",
    "content": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working\nwith code in this repository.\n\n## Project Overview\n\nsantoku is an R package that provides\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md), a\nversatile replacement for\n[`base::cut()`](https://rdrr.io/r/base/cut.html) for cutting data into\nintervals. The package handles numeric vectors, dates, times, and other\ncomparable objects, with support for singleton intervals and flexible\nlabeling.\n\n## Common Commands\n\n### Testing\n\n``` r\n# Run all tests\ndevtools::test()\n\n# Run tests from command line\nR CMD check .\n\n# Run specific test file\ntestthat::test_file(\"tests/testthat/test-chop.R\")\n```\n\n### Development workflow\n\n``` r\n\n# Build package\ndevtools::build()\n\n# Install package locally\ndevtools::install()\n\n# Check package\ndevtools::check()\n\n# Load package for interactive development\ndevtools::load_all()\n```\n\n### Documentation\n\n``` r\n\n# Update documentation\ndevtools::document()\n\n# Build website\npkgdown::build_site()\n```\n\n## Architecture\n\n### Core Components\n\n- **Main cutting function**:\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md) in\n  `R/chop.R` - the primary interface that calls other functions\n- **Break creation**: `R/breaks*.R` files contain functions to create\n  break points (`brk_*` functions)\n- **Labeling system**: `R/labels*.R` files contain labeling functions\n  (`lbl_*` functions)  \n- **Convenience functions**: `R/chop-*.R` files contain `chop_*` wrapper\n  functions for common use cases\n- **C++ backend**: `src/categorize.cpp` provides fast interval\n  categorization via Rcpp\n- **Tabulation**: `R/tab.R` provides `tab_*` functions that chop and\n  tabulate in one step\n\n### Key Design Patterns\n\n1.  **Function factories**: Many functions return other functions (e.g.,\n    `brk_*` functions return break-creation functions)\n2.  **Method dispatch**: Uses S3 methods and vctrs for handling\n    different data types (numbers, dates, etc.)\n3.  **Extensible labeling**: Label functions can be combined and\n    customized using the `lbl_*` family\n4.  **Performance**: Core categorization logic is implemented in C++ for\n    speed\n\n### File Organization\n\n- `R/chop.R` - Main\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n  function and documentation\n- `R/breaks*.R` - Break point creation (`brk_default`, `brk_width`,\n  etc.)\n- `R/labels*.R` - Label generation (`lbl_intervals`, `lbl_dash`, etc.)\n- `R/chop-*.R` - Convenience functions (`chop_quantiles`, `chop_width`,\n  etc.)\n- `R/tab.R` - Tabulation functions\n- `R/utils.R` - Utility functions like\n  [`exactly()`](https://hughjonesd.github.io/santoku/reference/exactly.md)\n  and\n  [`percent()`](https://hughjonesd.github.io/santoku/reference/percent.md)\n- `src/categorize.cpp` - Fast C++ categorization implementation\n- `tests/testthat/` - Comprehensive test suite\n\n## Development Notes\n\n- The package uses Rcpp for performance-critical categorization\n- Tests are extensive and include systematic testing in\n  `test-zzz-systematic.R`\n- The package supports non-standard data types (dates, times, units) via\n  the vctrs package\n- Documentation follows roxygen2 conventions with extensive examples\n- Uses lifecycle package for function lifecycle management\n"
  },
  {
    "path": "docs/LICENSE-text.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>License • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"favicon.ico\"><link rel=\"manifest\" href=\"site.webmanifest\"><script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"deps/search-1.0.0/fuse.min.js\"></script><script src=\"deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"pkgdown.js\"></script><link href=\"extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"License\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"articles/santoku.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\"><li><a class=\"dropdown-item\" href=\"articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-title-body\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"logo.png\" class=\"logo\" alt=\"\"><h1>License</h1>\n\n    </div>\n\n<pre>YEAR: 2020\nCOPYRIGHT HOLDER: David Hugh-Jones\n</pre>\n\n  </main></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/LICENSE-text.md",
    "content": "# License\n\n    YEAR: 2020\n    COPYRIGHT HOLDER: David Hugh-Jones\n"
  },
  {
    "path": "docs/LICENSE.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>MIT License • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"favicon.ico\"><link rel=\"manifest\" href=\"site.webmanifest\"><script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"deps/search-1.0.0/fuse.min.js\"></script><script src=\"deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"pkgdown.js\"></script><link href=\"extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"MIT License\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"articles/santoku.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\"><li><a class=\"dropdown-item\" href=\"articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-title-body\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"logo.png\" class=\"logo\" alt=\"\"><h1>MIT License</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/LICENSE.md\" class=\"external-link\"><code>LICENSE.md</code></a></small>\n    </div>\n\n<div id=\"mit-license\" class=\"section level1\">\n\n<p>Copyright (c) 2019 David Hugh-Jones</p>\n<p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>\n<p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p>\n<p>THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p>\n</div>\n\n  </main></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/LICENSE.md",
    "content": "# MIT License\n\nCopyright (c) 2019 David Hugh-Jones\n\nPermission is hereby granted, free of charge, to any person obtaining a\ncopy of this software and associated documentation files (the\n“Software”), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "docs/TODO.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>TODO • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"favicon.ico\"><link rel=\"manifest\" href=\"site.webmanifest\"><script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"deps/search-1.0.0/fuse.min.js\"></script><script src=\"deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"pkgdown.js\"></script><link href=\"extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"TODO\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"articles/santoku.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\"><li><a class=\"dropdown-item\" href=\"articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-title-body\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"logo.png\" class=\"logo\" alt=\"\"><h1>TODO</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/TODO.md\" class=\"external-link\"><code>TODO.md</code></a></small>\n    </div>\n\n\n<div id=\"todo\" class=\"section level1\">\n\n<ul><li>Work on tests\n<ul><li>tests for <code>left</code> and <code>close_end</code> arguments</li>\n<li>tests for <code>brk_default</code>\n</li>\n<li>\n<code><a href=\"reference/chop_width.html\">brk_width()</a></code> needs tests which match the guarantees in the documentation</li>\n<li>ditto for <code><a href=\"reference/chop_evenly.html\">brk_evenly()</a></code> which now uses its own implementation to guarantee exactly <code>intervals</code> intervals</li>\n<li>systematic tests for <code>brk_*</code> functions</li>\n</ul></li>\n<li>Implement a simple <code>Infinity</code> class that automatically casts to any other class and is always &gt; or &lt; than any other element? Then replace the <code>class_bounds()</code> complexity?\n<ul><li>The problem at the moment is that <code>vec_cast()</code> is highly unreliable and you never know if a particular class will accept <code>Inf</code>.</li>\n<li>An infinity class would be fine, but how does that go into the existing <code>breaks</code> object which has its own underlying class?</li>\n<li>Might be more reasonable just not to add <code>Inf</code> or <code>-Inf</code> elements. Instead, record whether the breaks have left and right “infinity” set. Then just add numeric infinity to the breaks before you call <code>categorize_impl</code> (or the R version). In particular, e.g. <code>integer64</code> doesn’t like <code>Inf</code> or <code>-Inf</code> but it does have very large numbers in <code><a href=\"https://bit64.r-lib.org/reference/sum.integer64.html\" class=\"external-link\">bit64::lim.integer64</a></code> which look ugly and which only exist to be lower/higher than everything else anyway…\n<ul><li>But NB this requires a new way to create the labels, and that kinda sucks….</li>\n</ul></li>\n</ul></li>\n</ul></div>\n<div class=\"section level1\">\n<h1 id=\"thoughts-on-errors\">Thoughts on errors<a class=\"anchor\" aria-label=\"anchor\" href=\"#thoughts-on-errors\"></a></h1>\n<ul><li>On the whole, we don’t want to error out if <code>x</code> is weird. <code>x</code> is data. But if e.g. <code>breaks</code> are weird, we can error out.\n<ul><li>Exception: <code>x</code> is the wrong class or type.</li>\n</ul></li>\n<li>In some cases we want to guarantee the set of breaks.\n<ul><li>e.g. <code><a href=\"reference/brk_manual.html\">brk_manual()</a></code> with <code>extend</code> set.</li>\n</ul></li>\n<li>In other cases, e.g. <code><a href=\"reference/chop_evenly.html\">brk_evenly()</a></code> we don’t need to make such a guarantee.</li>\n</ul></div>\n<div class=\"section level1\">\n<h1 id=\"questions\">Questions<a class=\"anchor\" aria-label=\"anchor\" href=\"#questions\"></a></h1>\n<ul><li>Is it really OK to have <code>left = FALSE</code> as the default in <code><a href=\"reference/chop_quantiles.html\">chop_quantiles()</a></code>, <code><a href=\"reference/chop_evenly.html\">chop_evenly()</a></code> and friends?\n<ul><li>the alternative is to do it only when <code>x</code> is non-numeric.</li>\n<li>that makes the surprise rarer, but rare surprises can be worse… and it adds complexity since the functions have to be generic.</li>\n<li>another alternative: <code>chop</code> sets <code>left = FALSE</code> for non-numeric <code>x</code>. Probably better.</li>\n</ul></li>\n<li>Do we need <code>drop</code>?\n<ul><li>should <code>drop</code> have a default of <code>! isTRUE(extend)</code> i.e. be <code>FALSE</code> when <code>extend = TRUE</code>?</li>\n</ul></li>\n</ul></div>\n<div class=\"section level1\">\n<h1 id=\"questions-with-a-provisional-answer\">Questions with a (provisional) answer<a class=\"anchor\" aria-label=\"anchor\" href=\"#questions-with-a-provisional-answer\"></a></h1>\n<ul><li>Should we have a flag to return characters?\n<ul><li>No, we have <code>labels = NULL</code> for integer codes only though.</li>\n</ul></li>\n<li>Should we put a <code>percent</code> argument into <code><a href=\"reference/chop_quantiles.html\">brk_quantiles()</a></code> so it can store scaled endpoints as proportions rather than percentages (the current default)?\n<ul><li>My sense is, not unless someone asks.</li>\n<li>Oh, someone just did ask; more generally though.</li>\n</ul></li>\n<li>Should <code>close_end = TRUE</code> argument come before <code>...</code> in <code>chop_</code> variants?\n<ul><li>No. We don’t want people to set it by position, so distinguish it from the initial arguments.</li>\n</ul></li>\n<li>What to do about <code><a href=\"https://tidyr.tidyverse.org/reference/chop.html\" class=\"external-link\">tidyr::chop()</a></code>\n<ul><li>Current answer: fuck ’em. (NB: just kidding. I am a huge tidyverse fan.)</li>\n<li>We provide <code><a href=\"reference/chop.html\">kiru()</a></code>. So on the REPL, people can just use <code><a href=\"reference/chop.html\">kiru()</a></code> if they load santoku first. If they load santoku second, they’ll have to use <code><a href=\"https://tidyr.tidyverse.org/reference/chop.html\" class=\"external-link\">tidyr::chop()</a></code>, but reading the documentation, I suspect this will be rare.</li>\n<li>For programming, people should probably used the fully qualified name anyway.</li>\n</ul></li>\n<li>When to extend?\n<ul><li><p>I think default should be “if necessary” (<code>extend = NULL</code>); should always extend to Inf, -Inf so that these break labels are not data-dependent</p></li>\n<li>\n<p>Tension between wanting something predictable in your new data, vs. something readable in <code>tab_*</code>. E.g.</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">tab_size</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">9</span>, <span class=\"fl\">3</span>, <span class=\"fu\"><a href=\"reference/lbl_seq.html\">lbl_seq</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span> </span></code></pre></div>\n<p>should surely return labels a, b, c. But this means we aren’t always extending.</p>\n</li>\n</ul></li>\n<li>Should we allow vector <code>labels</code> to be longer than necessary?\n<ul><li>lets people do e.g. <code>chop(rnorm(100), -2:2, LETTERS)</code>\n</li>\n<li>but might hide errors</li>\n<li>overall I’m against</li>\n</ul></li>\n<li>Is the label interface right? Problem exposed by <code>brk_mean_sd</code>: if we aren’t sure whether data gets extended, then how do we know what the labels should be?\n<ul><li>maybe label functions should have access to <code>x</code>?</li>\n<li>or should they be informed if breaks got extended?</li>\n<li>or could the breaks object know how to extend its labels?</li>\n<li>current solution: labels get <code>extend</code>\n</li>\n<li>I think better: <code>breaks</code> objects include suggested labels which the user can override. That way they always have the info necessary.</li>\n<li>We could also divide labelling into two parts:\n<ol style=\"list-style-type: decimal\"><li>choosing the break numbers (these may not be the actual values, e.g they could be quantiles or std errs from 0)</li>\n<li>formatting these numbers, and with dashes, set notation etc</li>\n</ol></li>\n<li>So maybe <code>brk_*</code> functions always return break numbers; then labels decide how to format them?</li>\n</ul></li>\n<li>Should we automatically sort breaks, or throw an error if they’re unsorted?\n<ul><li>or a warning?</li>\n<li>currently an error</li>\n</ul></li>\n<li>What if <code>breaks = c(1, 2, 2, 2, 3)</code>?\n<ul><li>throw an error</li>\n</ul></li>\n<li>For some cases e.g. <code>brk_quantiles</code>, <code>brk_width</code>, the data may not work well e.g. if it is all NA. What is an empty set of breaks?</li>\n</ul></div>\n<div class=\"section level1\">\n<h1 id=\"possible-interfaces\">Possible interfaces<a class=\"anchor\" aria-label=\"anchor\" href=\"#possible-interfaces\"></a></h1>\n<ul><li>\n<code>hist_xxx</code> functions for histograms/barplots? (how to treat singletons?)</li>\n<li>\n<code>grp_xxx</code> for group_by? Hmmm…</li>\n<li>New label interface to replace <code>lbl_sequence</code>: <code>lbl_style(\"1.\"), lbl_style(\"(i)\"), lbl_style(\"A\")</code> etc.?</li>\n<li>Still wonder, could we drop <code>extend</code> which adds complexity and just have <code>only()</code> or <code>extend()</code> as new breaks functions?</li>\n</ul></div>\n<div class=\"section level1\">\n<h1 id=\"other-ideas\">Other ideas<a class=\"anchor\" aria-label=\"anchor\" href=\"#other-ideas\"></a></h1>\n<ul><li>Speedup categorize by only checking left intervals, add 1 if its past each interval [NO: actually no fewer checks in the end…]</li>\n<li>Speedup by using pointers? hmm, magic…</li>\n</ul></div>\n\n\n  </main></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/TODO.md",
    "content": "# TODO\n\n- Work on tests\n  - tests for `left` and `close_end` arguments\n  - tests for `brk_default`\n  - [`brk_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md)\n    needs tests which match the guarantees in the documentation\n  - ditto for\n    [`brk_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md)\n    which now uses its own implementation to guarantee exactly\n    `intervals` intervals\n  - systematic tests for `brk_*` functions\n- Implement a simple `Infinity` class that automatically casts to any\n  other class and is always \\> or \\< than any other element? Then\n  replace the `class_bounds()` complexity?\n  - The problem at the moment is that `vec_cast()` is highly unreliable\n    and you never know if a particular class will accept `Inf`.\n  - An infinity class would be fine, but how does that go into the\n    existing `breaks` object which has its own underlying class?\n  - Might be more reasonable just not to add `Inf` or `-Inf` elements.\n    Instead, record whether the breaks have left and right “infinity”\n    set. Then just add numeric infinity to the breaks before you call\n    `categorize_impl` (or the R version). In particular,\n    e.g. `integer64` doesn’t like `Inf` or `-Inf` but it does have very\n    large numbers in\n    [`bit64::lim.integer64`](https://bit64.r-lib.org/reference/sum.integer64.html)\n    which look ugly and which only exist to be lower/higher than\n    everything else anyway…\n    - But NB this requires a new way to create the labels, and that\n      kinda sucks….\n\n# Thoughts on errors\n\n- On the whole, we don’t want to error out if `x` is weird. `x` is data.\n  But if e.g. `breaks` are weird, we can error out.\n  - Exception: `x` is the wrong class or type.\n- In some cases we want to guarantee the set of breaks.\n  - e.g. [`brk_manual()`](https://hughjonesd.github.io/santoku/reference/brk_manual.md)\n    with `extend` set.\n- In other cases,\n  e.g. [`brk_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md)\n  we don’t need to make such a guarantee.\n\n# Questions\n\n- Is it really OK to have `left = FALSE` as the default in\n  [`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md),\n  [`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md)\n  and friends?\n  - the alternative is to do it only when `x` is non-numeric.\n  - that makes the surprise rarer, but rare surprises can be worse… and\n    it adds complexity since the functions have to be generic.\n  - another alternative: `chop` sets `left = FALSE` for non-numeric `x`.\n    Probably better.\n- Do we need `drop`?\n  - should `drop` have a default of `! isTRUE(extend)` i.e. be `FALSE`\n    when `extend = TRUE`?\n\n# Questions with a (provisional) answer\n\n- Should we have a flag to return characters?\n  - No, we have `labels = NULL` for integer codes only though.\n- Should we put a `percent` argument into\n  [`brk_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  so it can store scaled endpoints as proportions rather than\n  percentages (the current default)?\n  - My sense is, not unless someone asks.\n  - Oh, someone just did ask; more generally though.\n- Should `close_end = TRUE` argument come before `...` in `chop_`\n  variants?\n  - No. We don’t want people to set it by position, so distinguish it\n    from the initial arguments.\n- What to do about\n  [`tidyr::chop()`](https://tidyr.tidyverse.org/reference/chop.html)\n  - Current answer: fuck ’em. (NB: just kidding. I am a huge tidyverse\n    fan.)\n  - We provide\n    [`kiru()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n    So on the REPL, people can just use\n    [`kiru()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n    if they load santoku first. If they load santoku second, they’ll\n    have to use\n    [`tidyr::chop()`](https://tidyr.tidyverse.org/reference/chop.html),\n    but reading the documentation, I suspect this will be rare.\n  - For programming, people should probably used the fully qualified\n    name anyway.\n- When to extend?\n  - I think default should be “if necessary” (`extend = NULL`); should\n    always extend to Inf, -Inf so that these break labels are not\n    data-dependent\n\n  - Tension between wanting something predictable in your new data,\n    vs. something readable in `tab_*`. E.g.\n\n    ``` r\n\n    tab_size(1:9, 3, lbl_seq()) \n    ```\n\n    should surely return labels a, b, c. But this means we aren’t always\n    extending.\n- Should we allow vector `labels` to be longer than necessary?\n  - lets people do e.g. `chop(rnorm(100), -2:2, LETTERS)`\n  - but might hide errors\n  - overall I’m against\n- Is the label interface right? Problem exposed by `brk_mean_sd`: if we\n  aren’t sure whether data gets extended, then how do we know what the\n  labels should be?\n  - maybe label functions should have access to `x`?\n  - or should they be informed if breaks got extended?\n  - or could the breaks object know how to extend its labels?\n  - current solution: labels get `extend`\n  - I think better: `breaks` objects include suggested labels which the\n    user can override. That way they always have the info necessary.\n  - We could also divide labelling into two parts:\n    1.  choosing the break numbers (these may not be the actual values,\n        e.g they could be quantiles or std errs from 0)\n    2.  formatting these numbers, and with dashes, set notation etc\n  - So maybe `brk_*` functions always return break numbers; then labels\n    decide how to format them?\n- Should we automatically sort breaks, or throw an error if they’re\n  unsorted?\n  - or a warning?\n  - currently an error\n- What if `breaks = c(1, 2, 2, 2, 3)`?\n  - throw an error\n- For some cases e.g. `brk_quantiles`, `brk_width`, the data may not\n  work well e.g. if it is all NA. What is an empty set of breaks?\n\n# Possible interfaces\n\n- `hist_xxx` functions for histograms/barplots? (how to treat\n  singletons?)\n- `grp_xxx` for group_by? Hmmm…\n- New label interface to replace `lbl_sequence`:\n  `lbl_style(\"1.\"), lbl_style(\"(i)\"), lbl_style(\"A\")` etc.?\n- Still wonder, could we drop `extend` which adds complexity and just\n  have `only()` or `extend()` as new breaks functions?\n\n# Other ideas\n\n- Speedup categorize by only checking left intervals, add 1 if its past\n  each interval \\[NO: actually no fewer checks in the end…\\]\n- Speedup by using pointers? hmm, magic…\n"
  },
  {
    "path": "docs/articles/index.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Articles • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Articles\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-article-index\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Articles</h1>\n    </div>\n\n    <div class=\"section \">\n      <h3>All vignettes</h3>\n      <div class=\"section-desc\"></div>\n\n      <dl><dt><a href=\"website-articles/performance.html\">Performance</a></dt>\n        <dd>\n        </dd><dt><a href=\"santoku.html\">Introduction to santoku</a></dt>\n        <dd>\n        </dd><dt><a href=\"whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></dt>\n        <dd>\n      </dd></dl></div>\n  </main></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/articles/index.md",
    "content": "# Articles\n\n### All vignettes\n\n- [Performance](https://hughjonesd.github.io/santoku/articles/website-articles/performance.md):\n- [Introduction to\n  santoku](https://hughjonesd.github.io/santoku/articles/santoku.md):\n- [What's new in santoku\n  0.9.0](https://hughjonesd.github.io/santoku/articles/whats-new-in-0-9-0.md):\n"
  },
  {
    "path": "docs/articles/santoku.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<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>Introduction to santoku • santoku</title>\n<!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\">\n<link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\">\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\">\n<link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\">\n<link rel=\"manifest\" href=\"../site.webmanifest\">\n<script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\">\n<script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\">\n<link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\">\n<script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\">\n<meta property=\"og:title\" content=\"Introduction to santoku\">\n</head>\n<body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\">\n<li class=\"active nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.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/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul>\n</li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\">\n<li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul>\n</li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul>\n<ul class=\"navbar-nav\">\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<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul>\n</div>\n\n\n  </div>\n</nav><div class=\"container template-article\">\n\n\n\n\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Introduction to santoku</h1>\n            \n      \n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/vignettes/santoku.Rmd\" class=\"external-link\"><code>vignettes/santoku.Rmd</code></a></small>\n      <div class=\"d-none name\"><code>santoku.Rmd</code></div>\n    </div>\n\n    \n    \n<div class=\"section level3\">\n<h3 id=\"introduction\">Introduction<a class=\"anchor\" aria-label=\"anchor\" href=\"#introduction\"></a>\n</h3>\n<p>Santoku is a package for cutting data into intervals. It provides\n<code><a href=\"../reference/chop.html\">chop()</a></code>, a replacement for base R’s <code><a href=\"https://rdrr.io/r/base/cut.html\" class=\"external-link\">cut()</a></code>\nfunction, as well as several convenience functions to cut different\nkinds of intervals.</p>\n<p>To install santoku, run:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/install.packages.html\" class=\"external-link\">install.packages</a></span><span class=\"op\">(</span><span class=\"st\">\"santoku\"</span><span class=\"op\">)</span></span></code></pre></div>\n</div>\n<div class=\"section level3\">\n<h3 id=\"basic-usage\">Basic usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#basic-usage\"></a>\n</h3>\n<p>Use <code><a href=\"../reference/chop.html\">chop()</a></code> like <code><a href=\"https://rdrr.io/r/base/cut.html\" class=\"external-link\">cut()</a></code>, to cut numeric data\ninto intervals between a set of <code>breaks</code>.</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://github.com/hughjonesd/santoku\" class=\"external-link\">santoku</a></span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"fl\">10</span>, <span class=\"fl\">0</span>, <span class=\"fl\">10</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">(</span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, breaks <span class=\"op\">=</span> <span class=\"fl\">0</span><span class=\"op\">:</span><span class=\"fl\">10</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;  [1] [4, 5)  [8, 9)  [3, 4)  [4, 5)  [7, 8)  [9, 10] [6, 7)  [8, 9)  [1, 2) </span></span>\n<span><span class=\"co\">#&gt; [10] [4, 5) </span></span>\n<span><span class=\"co\">#&gt; Levels: [1, 2) [3, 4) [4, 5) [6, 7) [7, 8) [8, 9) [9, 10]</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        x chopped</span></span>\n<span><span class=\"co\">#&gt; 1  4.978  [4, 5)</span></span>\n<span><span class=\"co\">#&gt; 2  8.970  [8, 9)</span></span>\n<span><span class=\"co\">#&gt; 3  3.392  [3, 4)</span></span>\n<span><span class=\"co\">#&gt; 4  4.677  [4, 5)</span></span>\n<span><span class=\"co\">#&gt; 5  7.057  [7, 8)</span></span>\n<span><span class=\"co\">#&gt; 6  9.708 [9, 10]</span></span>\n<span><span class=\"co\">#&gt; 7  6.714  [6, 7)</span></span>\n<span><span class=\"co\">#&gt; 8  8.377  [8, 9)</span></span>\n<span><span class=\"co\">#&gt; 9  1.086  [1, 2)</span></span>\n<span><span class=\"co\">#&gt; 10 4.495  [4, 5)</span></span></code></pre></div>\n<p><code><a href=\"../reference/chop.html\">chop()</a></code> returns a factor.</p>\n<p>If data is beyond the limits of <code>breaks</code>, they will be\nextended automatically:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, breaks <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">:</span><span class=\"fl\">7</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        x    chopped</span></span>\n<span><span class=\"co\">#&gt; 1  4.978     [4, 5)</span></span>\n<span><span class=\"co\">#&gt; 2  8.970 [7, 9.708]</span></span>\n<span><span class=\"co\">#&gt; 3  3.392     [3, 4)</span></span>\n<span><span class=\"co\">#&gt; 4  4.677     [4, 5)</span></span>\n<span><span class=\"co\">#&gt; 5  7.057 [7, 9.708]</span></span>\n<span><span class=\"co\">#&gt; 6  9.708 [7, 9.708]</span></span>\n<span><span class=\"co\">#&gt; 7  6.714     [6, 7)</span></span>\n<span><span class=\"co\">#&gt; 8  8.377 [7, 9.708]</span></span>\n<span><span class=\"co\">#&gt; 9  1.086 [1.086, 3)</span></span>\n<span><span class=\"co\">#&gt; 10 4.495     [4, 5)</span></span></code></pre></div>\n<p>To chop a single number into a separate category, put the number\ntwice in <code>breaks</code>:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">x_fives</span> <span class=\"op\">&lt;-</span> <span class=\"va\">x</span></span>\n<span><span class=\"va\">x_fives</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">5</span></span>\n<span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">x_fives</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x_fives</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;    x_fives    chopped</span></span>\n<span><span class=\"co\">#&gt; 1    5.000        {5}</span></span>\n<span><span class=\"co\">#&gt; 2    5.000        {5}</span></span>\n<span><span class=\"co\">#&gt; 3    5.000        {5}</span></span>\n<span><span class=\"co\">#&gt; 4    5.000        {5}</span></span>\n<span><span class=\"co\">#&gt; 5    5.000        {5}</span></span>\n<span><span class=\"co\">#&gt; 6    9.708 [8, 9.708]</span></span>\n<span><span class=\"co\">#&gt; 7    6.714     (5, 8)</span></span>\n<span><span class=\"co\">#&gt; 8    8.377 [8, 9.708]</span></span>\n<span><span class=\"co\">#&gt; 9    1.086 [1.086, 2)</span></span>\n<span><span class=\"co\">#&gt; 10   4.495     [2, 5)</span></span></code></pre></div>\n<p>To quickly produce a table of chopped data, use\n<code><a href=\"../reference/chop.html\">tab()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/chop.html\">tab</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;  [1, 2)  [2, 5)  [5, 8) [8, 10] </span></span>\n<span><span class=\"co\">#&gt;       1       3       3       3</span></span></code></pre></div>\n</div>\n<div class=\"section level3\">\n<h3 id=\"chopping-by-width-and-number-of-elements\">Chopping by width and number of elements<a class=\"anchor\" aria-label=\"anchor\" href=\"#chopping-by-width-and-number-of-elements\"></a>\n</h3>\n<p>To chop into fixed-width intervals, starting at the minimum value,\nuse <code><a href=\"../reference/chop_width.html\">chop_width()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop_width.html\">chop_width</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        x        chopped</span></span>\n<span><span class=\"co\">#&gt; 1  4.978 [3.086, 5.086)</span></span>\n<span><span class=\"co\">#&gt; 2  8.970 [7.086, 9.086)</span></span>\n<span><span class=\"co\">#&gt; 3  3.392 [3.086, 5.086)</span></span>\n<span><span class=\"co\">#&gt; 4  4.677 [3.086, 5.086)</span></span>\n<span><span class=\"co\">#&gt; 5  7.057 [5.086, 7.086)</span></span>\n<span><span class=\"co\">#&gt; 6  9.708 [9.086, 11.09]</span></span>\n<span><span class=\"co\">#&gt; 7  6.714 [5.086, 7.086)</span></span>\n<span><span class=\"co\">#&gt; 8  8.377 [7.086, 9.086)</span></span>\n<span><span class=\"co\">#&gt; 9  1.086 [1.086, 3.086)</span></span>\n<span><span class=\"co\">#&gt; 10 4.495 [3.086, 5.086)</span></span></code></pre></div>\n<p>To chop into a fixed number of intervals, each with the same width,\nuse <code><a href=\"../reference/chop_evenly.html\">chop_evenly()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop_evenly.html\">chop_evenly</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, intervals <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        x        chopped</span></span>\n<span><span class=\"co\">#&gt; 1  4.978  [3.96, 6.834)</span></span>\n<span><span class=\"co\">#&gt; 2  8.970 [6.834, 9.708]</span></span>\n<span><span class=\"co\">#&gt; 3  3.392  [1.086, 3.96)</span></span>\n<span><span class=\"co\">#&gt; 4  4.677  [3.96, 6.834)</span></span>\n<span><span class=\"co\">#&gt; 5  7.057 [6.834, 9.708]</span></span>\n<span><span class=\"co\">#&gt; 6  9.708 [6.834, 9.708]</span></span>\n<span><span class=\"co\">#&gt; 7  6.714  [3.96, 6.834)</span></span>\n<span><span class=\"co\">#&gt; 8  8.377 [6.834, 9.708]</span></span>\n<span><span class=\"co\">#&gt; 9  1.086  [1.086, 3.96)</span></span>\n<span><span class=\"co\">#&gt; 10 4.495  [3.96, 6.834)</span></span></code></pre></div>\n<p>To chop into groups with a fixed number of elements, use\n<code><a href=\"../reference/chop_n.html\">chop_n()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop_n.html\">chop_n</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fl\">4</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></span><span class=\"op\">(</span><span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; chopped</span></span>\n<span><span class=\"co\">#&gt; [1.086, 4.978)  [4.978, 8.97)  [8.97, 9.708] </span></span>\n<span><span class=\"co\">#&gt;              4              4              2</span></span></code></pre></div>\n<p>To chop into a fixed number of groups, each with the same number of\nelements, use <code><a href=\"../reference/chop_equally.html\">chop_equally()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop_equally.html\">chop_equally</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, groups <span class=\"op\">=</span> <span class=\"fl\">5</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></span><span class=\"op\">(</span><span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; chopped</span></span>\n<span><span class=\"co\">#&gt; [1.086, 4.275) [4.275, 4.858) [4.858, 6.851) [6.851, 8.495) [8.495, 9.708] </span></span>\n<span><span class=\"co\">#&gt;              2              2              2              2              2</span></span></code></pre></div>\n<p>To chop data up by quantiles, use <code><a href=\"../reference/chop_quantiles.html\">chop_quantiles()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop_quantiles.html\">chop_quantiles</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.25</span>, <span class=\"fl\">0.5</span>, <span class=\"fl\">0.75</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        x     chopped</span></span>\n<span><span class=\"co\">#&gt; 1  4.978  [25%, 50%)</span></span>\n<span><span class=\"co\">#&gt; 2  8.970 [75%, 100%]</span></span>\n<span><span class=\"co\">#&gt; 3  3.392   [0%, 25%)</span></span>\n<span><span class=\"co\">#&gt; 4  4.677  [25%, 50%)</span></span>\n<span><span class=\"co\">#&gt; 5  7.057  [50%, 75%)</span></span>\n<span><span class=\"co\">#&gt; 6  9.708 [75%, 100%]</span></span>\n<span><span class=\"co\">#&gt; 7  6.714  [50%, 75%)</span></span>\n<span><span class=\"co\">#&gt; 8  8.377 [75%, 100%]</span></span>\n<span><span class=\"co\">#&gt; 9  1.086   [0%, 25%)</span></span>\n<span><span class=\"co\">#&gt; 10 4.495   [0%, 25%)</span></span></code></pre></div>\n<p>To chop data up by proportions of the data range, use\n<code><a href=\"../reference/chop_proportions.html\">chop_proportions()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop_proportions.html\">chop_proportions</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.25</span>, <span class=\"fl\">0.5</span>, <span class=\"fl\">0.75</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        x        chopped</span></span>\n<span><span class=\"co\">#&gt; 1  4.978 [3.242, 5.397)</span></span>\n<span><span class=\"co\">#&gt; 2  8.970 [7.552, 9.708]</span></span>\n<span><span class=\"co\">#&gt; 3  3.392 [3.242, 5.397)</span></span>\n<span><span class=\"co\">#&gt; 4  4.677 [3.242, 5.397)</span></span>\n<span><span class=\"co\">#&gt; 5  7.057 [5.397, 7.552)</span></span>\n<span><span class=\"co\">#&gt; 6  9.708 [7.552, 9.708]</span></span>\n<span><span class=\"co\">#&gt; 7  6.714 [5.397, 7.552)</span></span>\n<span><span class=\"co\">#&gt; 8  8.377 [7.552, 9.708]</span></span>\n<span><span class=\"co\">#&gt; 9  1.086 [1.086, 3.242)</span></span>\n<span><span class=\"co\">#&gt; 10 4.495 [3.242, 5.397)</span></span></code></pre></div>\n<p>You can think of these six functions as logically arranged in a\ntable.</p>\n<table class=\"table\">\n<caption>Different ways to chop by size</caption>\n<colgroup>\n<col width=\"38%\">\n<col width=\"33%\">\n<col width=\"28%\">\n</colgroup>\n<thead><tr class=\"header\">\n<th align=\"left\">To chop into…</th>\n<th align=\"left\">Sizing intervals by…</th>\n<th align=\"left\"></th>\n</tr></thead>\n<tbody>\n<tr class=\"odd\">\n<td align=\"left\"> </td>\n<td align=\"left\">number of elements:</td>\n<td align=\"left\">interval width:</td>\n</tr>\n<tr class=\"even\">\n<td align=\"left\">a specific number of equal intervals…</td>\n<td align=\"left\"><code><a href=\"../reference/chop_equally.html\">chop_equally()</a></code></td>\n<td align=\"left\"><code><a href=\"../reference/chop_evenly.html\">chop_evenly()</a></code></td>\n</tr>\n<tr class=\"odd\">\n<td align=\"left\">intervals of one specific size…</td>\n<td align=\"left\"><code><a href=\"../reference/chop_n.html\">chop_n()</a></code></td>\n<td align=\"left\"><code><a href=\"../reference/chop_width.html\">chop_width()</a></code></td>\n</tr>\n<tr class=\"even\">\n<td align=\"left\">intervals of different specific sizes…</td>\n<td align=\"left\"><code><a href=\"../reference/chop_quantiles.html\">chop_quantiles()</a></code></td>\n<td align=\"left\"><code><a href=\"../reference/chop_proportions.html\">chop_proportions()</a></code></td>\n</tr>\n</tbody>\n</table>\n</div>\n<div class=\"section level3\">\n<h3 id=\"even-more-ways-to-chop\">Even more ways to chop<a class=\"anchor\" aria-label=\"anchor\" href=\"#even-more-ways-to-chop\"></a>\n</h3>\n<p>To chop data by standard deviations around the mean, use\n<code><a href=\"../reference/chop_mean_sd.html\">chop_mean_sd()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb12\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop_mean_sd.html\">chop_mean_sd</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        x        chopped</span></span>\n<span><span class=\"co\">#&gt; 1  4.978  [-1 sd, 0 sd)</span></span>\n<span><span class=\"co\">#&gt; 2  8.970   [1 sd, 2 sd)</span></span>\n<span><span class=\"co\">#&gt; 3  3.392  [-1 sd, 0 sd)</span></span>\n<span><span class=\"co\">#&gt; 4  4.677  [-1 sd, 0 sd)</span></span>\n<span><span class=\"co\">#&gt; 5  7.057   [0 sd, 1 sd)</span></span>\n<span><span class=\"co\">#&gt; 6  9.708   [1 sd, 2 sd)</span></span>\n<span><span class=\"co\">#&gt; 7  6.714   [0 sd, 1 sd)</span></span>\n<span><span class=\"co\">#&gt; 8  8.377   [0 sd, 1 sd)</span></span>\n<span><span class=\"co\">#&gt; 9  1.086 [-2 sd, -1 sd)</span></span>\n<span><span class=\"co\">#&gt; 10 4.495  [-1 sd, 0 sd)</span></span></code></pre></div>\n<p>To chop data into attractive intervals, use\n<code><a href=\"../reference/chop_pretty.html\">chop_pretty()</a></code>. This selects intervals which are a multiple\nof 2, 5 or 10. It’s useful for producing bar plots.</p>\n<div class=\"sourceCode\" id=\"cb13\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop_pretty.html\">chop_pretty</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        x chopped</span></span>\n<span><span class=\"co\">#&gt; 1  4.978  [4, 6)</span></span>\n<span><span class=\"co\">#&gt; 2  8.970 [8, 10]</span></span>\n<span><span class=\"co\">#&gt; 3  3.392  [2, 4)</span></span>\n<span><span class=\"co\">#&gt; 4  4.677  [4, 6)</span></span>\n<span><span class=\"co\">#&gt; 5  7.057  [6, 8)</span></span>\n<span><span class=\"co\">#&gt; 6  9.708 [8, 10]</span></span>\n<span><span class=\"co\">#&gt; 7  6.714  [6, 8)</span></span>\n<span><span class=\"co\">#&gt; 8  8.377 [8, 10]</span></span>\n<span><span class=\"co\">#&gt; 9  1.086  [0, 2)</span></span>\n<span><span class=\"co\">#&gt; 10 4.495  [4, 6)</span></span></code></pre></div>\n</div>\n<div class=\"section level3\">\n<h3 id=\"isolating-common-values\">Isolating common values<a class=\"anchor\" aria-label=\"anchor\" href=\"#isolating-common-values\"></a>\n</h3>\n<p>In exploratory work, it’s sometimes useful to find common values and\ntreat them differently. You can use <code><a href=\"../reference/dissect.html\">dissect()</a></code> to do\nthis:</p>\n<div class=\"sourceCode\" id=\"cb14\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">x_spike</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">100</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">x_spike</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">50</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"va\">x_spike</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">]</span></span>\n<span></span>\n<span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/dissect.html\">dissect</a></span><span class=\"op\">(</span><span class=\"va\">x_spike</span>, <span class=\"op\">-</span><span class=\"fl\">3</span><span class=\"op\">:</span><span class=\"fl\">3</span>, prop <span class=\"op\">=</span> <span class=\"fl\">0.1</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></span><span class=\"op\">(</span><span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; chopped</span></span>\n<span><span class=\"co\">#&gt; [-3, -2) [-2, -1)  [-1, 0)   [0, 1) {0.6996}   [1, 2) </span></span>\n<span><span class=\"co\">#&gt;        2        5       15       18       50       10</span></span></code></pre></div>\n<p><code>prop = 0.2</code> will put any unique value of <code>x</code>\ninto its own separate category if it makes up at least 20% of the\ndata.</p>\n<p>Note that unlike all the other <code>chop_*</code> functions,\n<code><a href=\"../reference/dissect.html\">dissect()</a></code> doesn’t always categorize <code>x</code> into\nordered, connected intervals. To remind you of this, it is named\ndifferently. If you want to create separate intervals on the left and\nright of common elements, use <code><a href=\"../reference/chop_spikes.html\">chop_spikes()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb15\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop_spikes.html\">chop_spikes</a></span><span class=\"op\">(</span><span class=\"va\">x_spike</span>, <span class=\"op\">-</span><span class=\"fl\">3</span><span class=\"op\">:</span><span class=\"fl\">3</span>, prop <span class=\"op\">=</span> <span class=\"fl\">0.1</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></span><span class=\"op\">(</span><span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; chopped</span></span>\n<span><span class=\"co\">#&gt;    [-3, -2)    [-2, -1)     [-1, 0) [0, 0.6996)    {0.6996} (0.6996, 1) </span></span>\n<span><span class=\"co\">#&gt;           2           5          15          13          50           5 </span></span>\n<span><span class=\"co\">#&gt;      [1, 2) </span></span>\n<span><span class=\"co\">#&gt;          10</span></span></code></pre></div>\n<p>Compare this to the table before. There are two intervals on either\nside of the common value, instead of one interval surrounding it.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"quick-tables\">Quick tables<a class=\"anchor\" aria-label=\"anchor\" href=\"#quick-tables\"></a>\n</h3>\n<p><code><a href=\"../reference/chop_n.html\">tab_n()</a></code>, <code><a href=\"../reference/chop_width.html\">tab_width()</a></code>, and friends act\nsimilarly to <code><a href=\"../reference/chop.html\">tab()</a></code>, calling the related <code>chop_*</code>\nfunction and then <code><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table()</a></code> on the result.</p>\n<div class=\"sourceCode\" id=\"cb16\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/chop_n.html\">tab_n</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fl\">4</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1.086, 4.978)  [4.978, 8.97)  [8.97, 9.708] </span></span>\n<span><span class=\"co\">#&gt;              4              4              2</span></span>\n<span><span class=\"fu\"><a href=\"../reference/chop_width.html\">tab_width</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1.086, 3.086) [3.086, 5.086) [5.086, 7.086) [7.086, 9.086) [9.086, 11.09] </span></span>\n<span><span class=\"co\">#&gt;              1              4              2              2              1</span></span>\n<span><span class=\"fu\"><a href=\"../reference/chop_evenly.html\">tab_evenly</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fl\">5</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;  [1.086, 2.81)  [2.81, 4.535) [4.535, 6.259) [6.259, 7.983) [7.983, 9.708] </span></span>\n<span><span class=\"co\">#&gt;              1              2              2              2              3</span></span>\n<span><span class=\"fu\"><a href=\"../reference/chop_mean_sd.html\">tab_mean_sd</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [-2 sd, -1 sd)  [-1 sd, 0 sd)   [0 sd, 1 sd)   [1 sd, 2 sd) </span></span>\n<span><span class=\"co\">#&gt;              1              4              3              2</span></span></code></pre></div>\n</div>\n<div class=\"section level3\">\n<h3 id=\"specifying-labels\">Specifying labels<a class=\"anchor\" aria-label=\"anchor\" href=\"#specifying-labels\"></a>\n</h3>\n<p>By default, santoku labels intervals using mathematical notation:</p>\n<ul>\n<li>\n<code>[0, 1]</code> means all numbers between 0 and 1\ninclusive.</li>\n<li>\n<code>(0, 1)</code> means all numbers <em>strictly</em> between 0\nand 1, not including the endpoints.</li>\n<li>\n<code>[0, 1)</code> means all numbers between 0 and 1, including 0\nbut not 1.</li>\n<li>\n<code>(0, 1]</code> means all numbers between 0 and 1, including 1\nbut not 0.</li>\n<li>\n<code>{0}</code> means just the number 0.</li>\n</ul>\n<p>To override these labels, provide names to the <code>breaks</code>\nargument:</p>\n<div class=\"sourceCode\" id=\"cb17\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span>Lowest <span class=\"op\">=</span> <span class=\"fl\">1</span>, Low <span class=\"op\">=</span> <span class=\"fl\">2</span>, Higher <span class=\"op\">=</span> <span class=\"fl\">5</span>, Highest <span class=\"op\">=</span> <span class=\"fl\">8</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        x chopped</span></span>\n<span><span class=\"co\">#&gt; 1  4.978     Low</span></span>\n<span><span class=\"co\">#&gt; 2  8.970 Highest</span></span>\n<span><span class=\"co\">#&gt; 3  3.392     Low</span></span>\n<span><span class=\"co\">#&gt; 4  4.677     Low</span></span>\n<span><span class=\"co\">#&gt; 5  7.057  Higher</span></span>\n<span><span class=\"co\">#&gt; 6  9.708 Highest</span></span>\n<span><span class=\"co\">#&gt; 7  6.714  Higher</span></span>\n<span><span class=\"co\">#&gt; 8  8.377 Highest</span></span>\n<span><span class=\"co\">#&gt; 9  1.086  Lowest</span></span>\n<span><span class=\"co\">#&gt; 10 4.495     Low</span></span></code></pre></div>\n<p>Or, you can specify factor labels with the <code>labels</code>\nargument:</p>\n<div class=\"sourceCode\" id=\"cb18\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"Lowest\"</span>, <span class=\"st\">\"Low\"</span>, <span class=\"st\">\"Higher\"</span>, <span class=\"st\">\"Highest\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        x chopped</span></span>\n<span><span class=\"co\">#&gt; 1  4.978     Low</span></span>\n<span><span class=\"co\">#&gt; 2  8.970 Highest</span></span>\n<span><span class=\"co\">#&gt; 3  3.392     Low</span></span>\n<span><span class=\"co\">#&gt; 4  4.677     Low</span></span>\n<span><span class=\"co\">#&gt; 5  7.057  Higher</span></span>\n<span><span class=\"co\">#&gt; 6  9.708 Highest</span></span>\n<span><span class=\"co\">#&gt; 7  6.714  Higher</span></span>\n<span><span class=\"co\">#&gt; 8  8.377 Highest</span></span>\n<span><span class=\"co\">#&gt; 9  1.086  Lowest</span></span>\n<span><span class=\"co\">#&gt; 10 4.495     Low</span></span></code></pre></div>\n<p>You need as many labels as there are intervals - one fewer than\n<code>length(breaks)</code> if your data doesn’t extend beyond\n<code>breaks</code>, one more than <code>length(breaks)</code> if it\ndoes.</p>\n<p>To label intervals with a dash, use <code><a href=\"../reference/lbl_dash.html\">lbl_dash()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb19\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/lbl_dash.html\">lbl_dash</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        x chopped</span></span>\n<span><span class=\"co\">#&gt; 1  4.978     2—5</span></span>\n<span><span class=\"co\">#&gt; 2  8.970 8—9.708</span></span>\n<span><span class=\"co\">#&gt; 3  3.392     2—5</span></span>\n<span><span class=\"co\">#&gt; 4  4.677     2—5</span></span>\n<span><span class=\"co\">#&gt; 5  7.057     5—8</span></span>\n<span><span class=\"co\">#&gt; 6  9.708 8—9.708</span></span>\n<span><span class=\"co\">#&gt; 7  6.714     5—8</span></span>\n<span><span class=\"co\">#&gt; 8  8.377 8—9.708</span></span>\n<span><span class=\"co\">#&gt; 9  1.086 1.086—2</span></span>\n<span><span class=\"co\">#&gt; 10 4.495     2—5</span></span></code></pre></div>\n<p>To label integer data, use <code><a href=\"../reference/lbl_discrete.html\">lbl_discrete()</a></code>. It uses more\ninformative right endpoints:</p>\n<div class=\"sourceCode\" id=\"cb20\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span>  <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/lbl_discrete.html\">lbl_discrete</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">chopped2</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/lbl_dash.html\">lbl_dash</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span>x <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, lbl_discrete <span class=\"op\">=</span> <span class=\"va\">chopped</span>, lbl_dash <span class=\"op\">=</span> <span class=\"va\">chopped2</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;     x lbl_discrete lbl_dash</span></span>\n<span><span class=\"co\">#&gt; 1   1            1      1—2</span></span>\n<span><span class=\"co\">#&gt; 2   2          2—4      2—5</span></span>\n<span><span class=\"co\">#&gt; 3   3          2—4      2—5</span></span>\n<span><span class=\"co\">#&gt; 4   4          2—4      2—5</span></span>\n<span><span class=\"co\">#&gt; 5   5          5—7      5—8</span></span>\n<span><span class=\"co\">#&gt; 6   6          5—7      5—8</span></span>\n<span><span class=\"co\">#&gt; 7   7          5—7      5—8</span></span>\n<span><span class=\"co\">#&gt; 8   8         8—10     8—10</span></span>\n<span><span class=\"co\">#&gt; 9   9         8—10     8—10</span></span>\n<span><span class=\"co\">#&gt; 10 10         8—10     8—10</span></span></code></pre></div>\n<p>You can customize the first or last labels:</p>\n<div class=\"sourceCode\" id=\"cb21\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/lbl_dash.html\">lbl_dash</a></span><span class=\"op\">(</span>first <span class=\"op\">=</span> <span class=\"st\">\"&lt; 2\"</span>, last <span class=\"op\">=</span> <span class=\"st\">\"8+\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        x chopped</span></span>\n<span><span class=\"co\">#&gt; 1  4.978     2—5</span></span>\n<span><span class=\"co\">#&gt; 2  8.970      8+</span></span>\n<span><span class=\"co\">#&gt; 3  3.392     2—5</span></span>\n<span><span class=\"co\">#&gt; 4  4.677     2—5</span></span>\n<span><span class=\"co\">#&gt; 5  7.057     5—8</span></span>\n<span><span class=\"co\">#&gt; 6  9.708      8+</span></span>\n<span><span class=\"co\">#&gt; 7  6.714     5—8</span></span>\n<span><span class=\"co\">#&gt; 8  8.377      8+</span></span>\n<span><span class=\"co\">#&gt; 9  1.086     &lt; 2</span></span>\n<span><span class=\"co\">#&gt; 10 4.495     2—5</span></span></code></pre></div>\n<p>To label intervals in order use <code><a href=\"../reference/lbl_seq.html\">lbl_seq()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb22\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/lbl_seq.html\">lbl_seq</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        x chopped</span></span>\n<span><span class=\"co\">#&gt; 1  4.978       b</span></span>\n<span><span class=\"co\">#&gt; 2  8.970       d</span></span>\n<span><span class=\"co\">#&gt; 3  3.392       b</span></span>\n<span><span class=\"co\">#&gt; 4  4.677       b</span></span>\n<span><span class=\"co\">#&gt; 5  7.057       c</span></span>\n<span><span class=\"co\">#&gt; 6  9.708       d</span></span>\n<span><span class=\"co\">#&gt; 7  6.714       c</span></span>\n<span><span class=\"co\">#&gt; 8  8.377       d</span></span>\n<span><span class=\"co\">#&gt; 9  1.086       a</span></span>\n<span><span class=\"co\">#&gt; 10 4.495       b</span></span></code></pre></div>\n<p>You can use numerals or even roman numerals:</p>\n<div class=\"sourceCode\" id=\"cb23\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/lbl_seq.html\">lbl_seq</a></span><span class=\"op\">(</span><span class=\"st\">\"(1)\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;  [1] (2) (4) (2) (2) (3) (4) (3) (4) (1) (2)</span></span>\n<span><span class=\"co\">#&gt; Levels: (1) (2) (3) (4)</span></span>\n<span><span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/lbl_seq.html\">lbl_seq</a></span><span class=\"op\">(</span><span class=\"st\">\"i.\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;  [1] ii.  iv.  ii.  ii.  iii. iv.  iii. iv.  i.   ii. </span></span>\n<span><span class=\"co\">#&gt; Levels: i. ii. iii. iv.</span></span></code></pre></div>\n<p>Other labelling functions include:</p>\n<ul>\n<li>\n<code><a href=\"../reference/lbl_endpoints.html\">lbl_endpoints()</a></code> - use left endpoints as labels</li>\n<li>\n<code><a href=\"../reference/lbl_midpoints.html\">lbl_midpoints()</a></code> - use interval midpoints as labels</li>\n<li>\n<code><a href=\"../reference/lbl_glue.html\">lbl_glue()</a></code> - specify labels flexibly with the\n<a href=\"https://glue.tidyverse.org/\" class=\"external-link\">glue</a> package</li>\n</ul>\n</div>\n<div class=\"section level3\">\n<h3 id=\"specifying-breaks\">Specifying breaks<a class=\"anchor\" aria-label=\"anchor\" href=\"#specifying-breaks\"></a>\n</h3>\n<p>By default, <code><a href=\"../reference/chop.html\">chop()</a></code> extends <code>breaks</code> if\nnecessary. If you don’t want that, set <code>extend = FALSE</code>:</p>\n<div class=\"sourceCode\" id=\"cb24\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">3</span>, <span class=\"fl\">5</span>, <span class=\"fl\">7</span><span class=\"op\">)</span>, extend <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;        x chopped</span></span>\n<span><span class=\"co\">#&gt; 1  4.978  [3, 5)</span></span>\n<span><span class=\"co\">#&gt; 2  8.970    &lt;NA&gt;</span></span>\n<span><span class=\"co\">#&gt; 3  3.392  [3, 5)</span></span>\n<span><span class=\"co\">#&gt; 4  4.677  [3, 5)</span></span>\n<span><span class=\"co\">#&gt; 5  7.057    &lt;NA&gt;</span></span>\n<span><span class=\"co\">#&gt; 6  9.708    &lt;NA&gt;</span></span>\n<span><span class=\"co\">#&gt; 7  6.714  [5, 7]</span></span>\n<span><span class=\"co\">#&gt; 8  8.377    &lt;NA&gt;</span></span>\n<span><span class=\"co\">#&gt; 9  1.086    &lt;NA&gt;</span></span>\n<span><span class=\"co\">#&gt; 10 4.495  [3, 5)</span></span></code></pre></div>\n<p>Data outside the range of <code>breaks</code> will become\n<code>NA</code>.</p>\n<p>By default, intervals are closed on the left, i.e. they include their\nleft endpoints. If you want right-closed intervals, set\n<code>left = FALSE</code>:</p>\n<div class=\"sourceCode\" id=\"cb25\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">y</span> <span class=\"op\">&lt;-</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span></span>\n<span>        y <span class=\"op\">=</span> <span class=\"va\">y</span>, </span>\n<span>        left_closed <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">y</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">)</span>, </span>\n<span>        right_closed <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">y</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, left <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span>\n<span>      <span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;   y left_closed right_closed</span></span>\n<span><span class=\"co\">#&gt; 1 1      [1, 2)       [1, 2]</span></span>\n<span><span class=\"co\">#&gt; 2 2      [2, 3)       [1, 2]</span></span>\n<span><span class=\"co\">#&gt; 3 3      [3, 4)       (2, 3]</span></span>\n<span><span class=\"co\">#&gt; 4 4      [4, 5]       (3, 4]</span></span>\n<span><span class=\"co\">#&gt; 5 5      [4, 5]       (4, 5]</span></span></code></pre></div>\n<p>By default, the last interval is closed on both ends. If you want to\nkeep the last interval open at the end, set\n<code>close_end = FALSE</code>:</p>\n<div class=\"sourceCode\" id=\"cb26\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span></span>\n<span>  y <span class=\"op\">=</span> <span class=\"va\">y</span>,</span>\n<span>  end_closed <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">y</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">)</span>,</span>\n<span>  end_open   <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">y</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, close_end <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;   y end_closed end_open</span></span>\n<span><span class=\"co\">#&gt; 1 1     [1, 2)   [1, 2)</span></span>\n<span><span class=\"co\">#&gt; 2 2     [2, 3)   [2, 3)</span></span>\n<span><span class=\"co\">#&gt; 3 3     [3, 4)   [3, 4)</span></span>\n<span><span class=\"co\">#&gt; 4 4     [4, 5]   [4, 5)</span></span>\n<span><span class=\"co\">#&gt; 5 5     [4, 5]      {5}</span></span></code></pre></div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"chopping-dates-times-and-other-vectors\">Chopping dates, times and other vectors<a class=\"anchor\" aria-label=\"anchor\" href=\"#chopping-dates-times-and-other-vectors\"></a>\n</h2>\n<p>You can chop many kinds of vectors with santoku, including Date\nobjects…</p>\n<div class=\"sourceCode\" id=\"cb27\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">y2k</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.Date.html\" class=\"external-link\">as.Date</a></span><span class=\"op\">(</span><span class=\"st\">\"2000-01-01\"</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fl\">0</span><span class=\"op\">:</span><span class=\"fl\">10</span> <span class=\"op\">*</span> <span class=\"fl\">7</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span></span>\n<span>  y2k <span class=\"op\">=</span> <span class=\"va\">y2k</span>,</span>\n<span>  chopped <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">y2k</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.Date.html\" class=\"external-link\">as.Date</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"2000-02-01\"</span>, <span class=\"st\">\"2000-03-01\"</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;           y2k                  chopped</span></span>\n<span><span class=\"co\">#&gt; 1  2000-01-01 [2000-01-01, 2000-02-01)</span></span>\n<span><span class=\"co\">#&gt; 2  2000-01-08 [2000-01-01, 2000-02-01)</span></span>\n<span><span class=\"co\">#&gt; 3  2000-01-15 [2000-01-01, 2000-02-01)</span></span>\n<span><span class=\"co\">#&gt; 4  2000-01-22 [2000-01-01, 2000-02-01)</span></span>\n<span><span class=\"co\">#&gt; 5  2000-01-29 [2000-01-01, 2000-02-01)</span></span>\n<span><span class=\"co\">#&gt; 6  2000-02-05 [2000-02-01, 2000-03-01)</span></span>\n<span><span class=\"co\">#&gt; 7  2000-02-12 [2000-02-01, 2000-03-01)</span></span>\n<span><span class=\"co\">#&gt; 8  2000-02-19 [2000-02-01, 2000-03-01)</span></span>\n<span><span class=\"co\">#&gt; 9  2000-02-26 [2000-02-01, 2000-03-01)</span></span>\n<span><span class=\"co\">#&gt; 10 2000-03-04 [2000-03-01, 2000-03-11]</span></span>\n<span><span class=\"co\">#&gt; 11 2000-03-11 [2000-03-01, 2000-03-11]</span></span></code></pre></div>\n<p>… and POSIXct (date-time) objects:</p>\n<div class=\"sourceCode\" id=\"cb28\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"co\"># hours of the 2020 Crew Dragon flight:</span></span>\n<span><span class=\"va\">crew_dragon</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.POSIXlt.html\" class=\"external-link\">as.POSIXct</a></span><span class=\"op\">(</span><span class=\"st\">\"2020-05-30 18:00\"</span>, tz <span class=\"op\">=</span> <span class=\"st\">\"GMT\"</span><span class=\"op\">)</span>, </span>\n<span>                     length.out <span class=\"op\">=</span> <span class=\"fl\">24</span>, by <span class=\"op\">=</span> <span class=\"st\">\"hours\"</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">liftoff</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.POSIXlt.html\" class=\"external-link\">as.POSIXct</a></span><span class=\"op\">(</span><span class=\"st\">\"2020-05-30 15:22\"</span>, tz <span class=\"op\">=</span> <span class=\"st\">\"America/New_York\"</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">dock</span>    <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.POSIXlt.html\" class=\"external-link\">as.POSIXct</a></span><span class=\"op\">(</span><span class=\"st\">\"2020-05-31 10:16\"</span>, tz <span class=\"op\">=</span> <span class=\"st\">\"America/New_York\"</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span></span>\n<span>  crew_dragon <span class=\"op\">=</span> <span class=\"va\">crew_dragon</span>,</span>\n<span>  chopped <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">crew_dragon</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"va\">liftoff</span>, <span class=\"va\">dock</span><span class=\"op\">)</span>, </span>\n<span>                   labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"pre-flight\"</span>, <span class=\"st\">\"flight\"</span>, <span class=\"st\">\"docked\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent</span></span>\n<span><span class=\"co\">#&gt; Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent</span></span>\n<span><span class=\"co\">#&gt;            crew_dragon    chopped</span></span>\n<span><span class=\"co\">#&gt; 1  2020-05-30 18:00:00 pre-flight</span></span>\n<span><span class=\"co\">#&gt; 2  2020-05-30 19:00:00 pre-flight</span></span>\n<span><span class=\"co\">#&gt; 3  2020-05-30 20:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 4  2020-05-30 21:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 5  2020-05-30 22:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 6  2020-05-30 23:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 7  2020-05-31 00:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 8  2020-05-31 01:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 9  2020-05-31 02:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 10 2020-05-31 03:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 11 2020-05-31 04:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 12 2020-05-31 05:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 13 2020-05-31 06:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 14 2020-05-31 07:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 15 2020-05-31 08:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 16 2020-05-31 09:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 17 2020-05-31 10:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 18 2020-05-31 11:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 19 2020-05-31 12:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 20 2020-05-31 13:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 21 2020-05-31 14:00:00     flight</span></span>\n<span><span class=\"co\">#&gt; 22 2020-05-31 15:00:00     docked</span></span>\n<span><span class=\"co\">#&gt; 23 2020-05-31 16:00:00     docked</span></span>\n<span><span class=\"co\">#&gt; 24 2020-05-31 17:00:00     docked</span></span></code></pre></div>\n<p>Note how santoku correctly handles the different timezones.</p>\n<p>You can use <code><a href=\"../reference/chop_width.html\">chop_width()</a></code> with objects from the\n<code>lubridate</code> package, to chop by irregular periods such as\nmonths:</p>\n<div class=\"sourceCode\" id=\"cb29\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://lubridate.tidyverse.org\" class=\"external-link\">lubridate</a></span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Attaching package: 'lubridate'</span></span>\n<span><span class=\"co\">#&gt; The following objects are masked from 'package:base':</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt;     date, intersect, setdiff, union</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span></span>\n<span>  y2k <span class=\"op\">=</span> <span class=\"va\">y2k</span>,</span>\n<span>  chopped <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/chop_width.html\">chop_width</a></span><span class=\"op\">(</span><span class=\"va\">y2k</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/weekday.POSIXt.html\" class=\"external-link\">months</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;           y2k                  chopped</span></span>\n<span><span class=\"co\">#&gt; 1  2000-01-01 [2000-01-01, 2000-02-01)</span></span>\n<span><span class=\"co\">#&gt; 2  2000-01-08 [2000-01-01, 2000-02-01)</span></span>\n<span><span class=\"co\">#&gt; 3  2000-01-15 [2000-01-01, 2000-02-01)</span></span>\n<span><span class=\"co\">#&gt; 4  2000-01-22 [2000-01-01, 2000-02-01)</span></span>\n<span><span class=\"co\">#&gt; 5  2000-01-29 [2000-01-01, 2000-02-01)</span></span>\n<span><span class=\"co\">#&gt; 6  2000-02-05 [2000-02-01, 2000-03-01)</span></span>\n<span><span class=\"co\">#&gt; 7  2000-02-12 [2000-02-01, 2000-03-01)</span></span>\n<span><span class=\"co\">#&gt; 8  2000-02-19 [2000-02-01, 2000-03-01)</span></span>\n<span><span class=\"co\">#&gt; 9  2000-02-26 [2000-02-01, 2000-03-01)</span></span>\n<span><span class=\"co\">#&gt; 10 2000-03-04 [2000-03-01, 2000-04-01)</span></span>\n<span><span class=\"co\">#&gt; 11 2000-03-11 [2000-03-01, 2000-04-01)</span></span></code></pre></div>\n<p><code><a href=\"../reference/lbl_datetime.html\">lbl_date()</a></code> produces nicely formatted dates:</p>\n<div class=\"sourceCode\" id=\"cb30\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span></span>\n<span>  y2k <span class=\"op\">=</span> <span class=\"va\">y2k</span>,</span>\n<span>  chopped <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/chop_width.html\">chop_width</a></span><span class=\"op\">(</span><span class=\"va\">y2k</span>, <span class=\"fu\"><a href=\"https://lubridate.tidyverse.org/reference/period.html\" class=\"external-link\">days</a></span><span class=\"op\">(</span><span class=\"fl\">28</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/lbl_datetime.html\">lbl_date</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;           y2k              chopped</span></span>\n<span><span class=\"co\">#&gt; 1  2000-01-01        1-28 Jan 2000</span></span>\n<span><span class=\"co\">#&gt; 2  2000-01-08        1-28 Jan 2000</span></span>\n<span><span class=\"co\">#&gt; 3  2000-01-15        1-28 Jan 2000</span></span>\n<span><span class=\"co\">#&gt; 4  2000-01-22        1-28 Jan 2000</span></span>\n<span><span class=\"co\">#&gt; 5  2000-01-29 29 Jan - 25 Feb 2000</span></span>\n<span><span class=\"co\">#&gt; 6  2000-02-05 29 Jan - 25 Feb 2000</span></span>\n<span><span class=\"co\">#&gt; 7  2000-02-12 29 Jan - 25 Feb 2000</span></span>\n<span><span class=\"co\">#&gt; 8  2000-02-19 29 Jan - 25 Feb 2000</span></span>\n<span><span class=\"co\">#&gt; 9  2000-02-26 26 Feb - 24 Mar 2000</span></span>\n<span><span class=\"co\">#&gt; 10 2000-03-04 26 Feb - 24 Mar 2000</span></span>\n<span><span class=\"co\">#&gt; 11 2000-03-11 26 Feb - 24 Mar 2000</span></span></code></pre></div>\n<p>You can also chop vectors with units, using the <code>units</code>\npackage:</p>\n<div class=\"sourceCode\" id=\"cb31\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://r-quantities.github.io/units/\" class=\"external-link\">units</a></span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; udunits database from /Users/davidhugh-jones/Library/R/arm64/4.6/library/units/share/udunits/udunits2.xml</span></span>\n<span></span>\n<span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://r-quantities.github.io/units/reference/units.html\" class=\"external-link\">set_units</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span> <span class=\"op\">*</span> <span class=\"fl\">10</span>, <span class=\"va\">cm</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">br</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://r-quantities.github.io/units/reference/units.html\" class=\"external-link\">set_units</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span>, <span class=\"va\">ft</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span></span>\n<span>  x <span class=\"op\">=</span> <span class=\"va\">x</span>,</span>\n<span>  chopped <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">br</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;           x                    chopped</span></span>\n<span><span class=\"co\">#&gt; 1   10 [cm] [ 10.00 [cm],  30.48 [cm])</span></span>\n<span><span class=\"co\">#&gt; 2   20 [cm] [ 10.00 [cm],  30.48 [cm])</span></span>\n<span><span class=\"co\">#&gt; 3   30 [cm] [ 10.00 [cm],  30.48 [cm])</span></span>\n<span><span class=\"co\">#&gt; 4   40 [cm] [ 30.48 [cm],  60.96 [cm])</span></span>\n<span><span class=\"co\">#&gt; 5   50 [cm] [ 30.48 [cm],  60.96 [cm])</span></span>\n<span><span class=\"co\">#&gt; 6   60 [cm] [ 30.48 [cm],  60.96 [cm])</span></span>\n<span><span class=\"co\">#&gt; 7   70 [cm] [ 60.96 [cm],  91.44 [cm])</span></span>\n<span><span class=\"co\">#&gt; 8   80 [cm] [ 60.96 [cm],  91.44 [cm])</span></span>\n<span><span class=\"co\">#&gt; 9   90 [cm] [ 60.96 [cm],  91.44 [cm])</span></span>\n<span><span class=\"co\">#&gt; 10 100 [cm] [ 91.44 [cm], 100.00 [cm]]</span></span></code></pre></div>\n<p>You should be able to chop anything that has a comparison operator.\nYou can even chop character data using lexical ordering. By default\nsantoku emits a warning in this case, to avoid accidentally\nmisinterpreting results:</p>\n<div class=\"sourceCode\" id=\"cb32\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">letters</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span><span class=\"op\">]</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"d\"</span>, <span class=\"st\">\"f\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; Warning in categorize_non_numeric(x, breaks, left): `x` or `breaks` is of type</span></span>\n<span><span class=\"co\">#&gt; character, using lexical sorting. To turn off this warning, run:</span></span>\n<span><span class=\"co\">#&gt; options(santoku.warn_character = FALSE)</span></span>\n<span><span class=\"co\">#&gt;  [1] [a, d) [a, d) [a, d) [d, f) [d, f) [f, j] [f, j] [f, j] [f, j] [f, j]</span></span>\n<span><span class=\"co\">#&gt; Levels: [a, d) [d, f) [f, j]</span></span></code></pre></div>\n<p>If you find a type of data that you can’t chop, please <a href=\"https://github.com/hughjonesd/santoku/issues\" class=\"external-link\">file an\nissue</a>.</p>\n</div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside>\n</div>\n\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer>\n</div>\n\n\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/articles/santoku.md",
    "content": "# Introduction to santoku\n\n### Introduction\n\nSantoku is a package for cutting data into intervals. It provides\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md), a\nreplacement for base R’s [`cut()`](https://rdrr.io/r/base/cut.html)\nfunction, as well as several convenience functions to cut different\nkinds of intervals.\n\nTo install santoku, run:\n\n``` r\n\ninstall.packages(\"santoku\")\n```\n\n### Basic usage\n\nUse [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\nlike [`cut()`](https://rdrr.io/r/base/cut.html), to cut numeric data\ninto intervals between a set of `breaks`.\n\n``` r\n\nlibrary(santoku)\n\nx <- runif(10, 0, 10)\n(chopped <- chop(x, breaks = 0:10))\n#>  [1] [4, 5)  [8, 9)  [3, 4)  [4, 5)  [7, 8)  [9, 10] [6, 7)  [8, 9)  [1, 2) \n#> [10] [4, 5) \n#> Levels: [1, 2) [3, 4) [4, 5) [6, 7) [7, 8) [8, 9) [9, 10]\ndata.frame(x, chopped)\n#>        x chopped\n#> 1  4.978  [4, 5)\n#> 2  8.970  [8, 9)\n#> 3  3.392  [3, 4)\n#> 4  4.677  [4, 5)\n#> 5  7.057  [7, 8)\n#> 6  9.708 [9, 10]\n#> 7  6.714  [6, 7)\n#> 8  8.377  [8, 9)\n#> 9  1.086  [1, 2)\n#> 10 4.495  [4, 5)\n```\n\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\nreturns a factor.\n\nIf data is beyond the limits of `breaks`, they will be extended\nautomatically:\n\n``` r\n\nchopped <- chop(x, breaks = 3:7)\ndata.frame(x, chopped)\n#>        x    chopped\n#> 1  4.978     [4, 5)\n#> 2  8.970 [7, 9.708]\n#> 3  3.392     [3, 4)\n#> 4  4.677     [4, 5)\n#> 5  7.057 [7, 9.708]\n#> 6  9.708 [7, 9.708]\n#> 7  6.714     [6, 7)\n#> 8  8.377 [7, 9.708]\n#> 9  1.086 [1.086, 3)\n#> 10 4.495     [4, 5)\n```\n\nTo chop a single number into a separate category, put the number twice\nin `breaks`:\n\n``` r\n\nx_fives <- x\nx_fives[1:5] <- 5\nchopped <- chop(x_fives, c(2, 5, 5, 8))\ndata.frame(x_fives, chopped)\n#>    x_fives    chopped\n#> 1    5.000        {5}\n#> 2    5.000        {5}\n#> 3    5.000        {5}\n#> 4    5.000        {5}\n#> 5    5.000        {5}\n#> 6    9.708 [8, 9.708]\n#> 7    6.714     (5, 8)\n#> 8    8.377 [8, 9.708]\n#> 9    1.086 [1.086, 2)\n#> 10   4.495     [2, 5)\n```\n\nTo quickly produce a table of chopped data, use\n[`tab()`](https://hughjonesd.github.io/santoku/reference/chop.md):\n\n``` r\n\ntab(1:10, c(2, 5, 8))\n#>  [1, 2)  [2, 5)  [5, 8) [8, 10] \n#>       1       3       3       3\n```\n\n### Chopping by width and number of elements\n\nTo chop into fixed-width intervals, starting at the minimum value, use\n[`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md):\n\n``` r\n\nchopped <- chop_width(x, 2)\ndata.frame(x, chopped)\n#>        x        chopped\n#> 1  4.978 [3.086, 5.086)\n#> 2  8.970 [7.086, 9.086)\n#> 3  3.392 [3.086, 5.086)\n#> 4  4.677 [3.086, 5.086)\n#> 5  7.057 [5.086, 7.086)\n#> 6  9.708 [9.086, 11.09]\n#> 7  6.714 [5.086, 7.086)\n#> 8  8.377 [7.086, 9.086)\n#> 9  1.086 [1.086, 3.086)\n#> 10 4.495 [3.086, 5.086)\n```\n\nTo chop into a fixed number of intervals, each with the same width, use\n[`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md):\n\n``` r\n\nchopped <- chop_evenly(x, intervals = 3)\ndata.frame(x, chopped)\n#>        x        chopped\n#> 1  4.978  [3.96, 6.834)\n#> 2  8.970 [6.834, 9.708]\n#> 3  3.392  [1.086, 3.96)\n#> 4  4.677  [3.96, 6.834)\n#> 5  7.057 [6.834, 9.708]\n#> 6  9.708 [6.834, 9.708]\n#> 7  6.714  [3.96, 6.834)\n#> 8  8.377 [6.834, 9.708]\n#> 9  1.086  [1.086, 3.96)\n#> 10 4.495  [3.96, 6.834)\n```\n\nTo chop into groups with a fixed number of elements, use\n[`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md):\n\n``` r\n\nchopped <- chop_n(x, 4)\ntable(chopped)\n#> chopped\n#> [1.086, 4.978)  [4.978, 8.97)  [8.97, 9.708] \n#>              4              4              2\n```\n\nTo chop into a fixed number of groups, each with the same number of\nelements, use\n[`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md):\n\n``` r\n\nchopped <- chop_equally(x, groups = 5)\ntable(chopped)\n#> chopped\n#> [1.086, 4.275) [4.275, 4.858) [4.858, 6.851) [6.851, 8.495) [8.495, 9.708] \n#>              2              2              2              2              2\n```\n\nTo chop data up by quantiles, use\n[`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md):\n\n``` r\n\nchopped <- chop_quantiles(x, c(0.25, 0.5, 0.75))\ndata.frame(x, chopped)\n#>        x     chopped\n#> 1  4.978  [25%, 50%)\n#> 2  8.970 [75%, 100%]\n#> 3  3.392   [0%, 25%)\n#> 4  4.677  [25%, 50%)\n#> 5  7.057  [50%, 75%)\n#> 6  9.708 [75%, 100%]\n#> 7  6.714  [50%, 75%)\n#> 8  8.377 [75%, 100%]\n#> 9  1.086   [0%, 25%)\n#> 10 4.495   [0%, 25%)\n```\n\nTo chop data up by proportions of the data range, use\n[`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md):\n\n``` r\n\nchopped <- chop_proportions(x, c(0.25, 0.5, 0.75))\ndata.frame(x, chopped)\n#>        x        chopped\n#> 1  4.978 [3.242, 5.397)\n#> 2  8.970 [7.552, 9.708]\n#> 3  3.392 [3.242, 5.397)\n#> 4  4.677 [3.242, 5.397)\n#> 5  7.057 [5.397, 7.552)\n#> 6  9.708 [7.552, 9.708]\n#> 7  6.714 [5.397, 7.552)\n#> 8  8.377 [7.552, 9.708]\n#> 9  1.086 [1.086, 3.242)\n#> 10 4.495 [3.242, 5.397)\n```\n\nYou can think of these six functions as logically arranged in a table.\n\n| To chop into… | Sizing intervals by… |  |\n|:---|:---|:---|\n|   | number of elements: | interval width: |\n| a specific number of equal intervals… | [`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md) | [`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md) |\n| intervals of one specific size… | [`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md) | [`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md) |\n| intervals of different specific sizes… | [`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md) | [`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md) |\n\nDifferent ways to chop by size {.table}\n\n### Even more ways to chop\n\nTo chop data by standard deviations around the mean, use\n[`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md):\n\n``` r\n\nchopped <- chop_mean_sd(x)\ndata.frame(x, chopped)\n#>        x        chopped\n#> 1  4.978  [-1 sd, 0 sd)\n#> 2  8.970   [1 sd, 2 sd)\n#> 3  3.392  [-1 sd, 0 sd)\n#> 4  4.677  [-1 sd, 0 sd)\n#> 5  7.057   [0 sd, 1 sd)\n#> 6  9.708   [1 sd, 2 sd)\n#> 7  6.714   [0 sd, 1 sd)\n#> 8  8.377   [0 sd, 1 sd)\n#> 9  1.086 [-2 sd, -1 sd)\n#> 10 4.495  [-1 sd, 0 sd)\n```\n\nTo chop data into attractive intervals, use\n[`chop_pretty()`](https://hughjonesd.github.io/santoku/reference/chop_pretty.md).\nThis selects intervals which are a multiple of 2, 5 or 10. It’s useful\nfor producing bar plots.\n\n``` r\n\nchopped <- chop_pretty(x)\ndata.frame(x, chopped)\n#>        x chopped\n#> 1  4.978  [4, 6)\n#> 2  8.970 [8, 10]\n#> 3  3.392  [2, 4)\n#> 4  4.677  [4, 6)\n#> 5  7.057  [6, 8)\n#> 6  9.708 [8, 10]\n#> 7  6.714  [6, 8)\n#> 8  8.377 [8, 10]\n#> 9  1.086  [0, 2)\n#> 10 4.495  [4, 6)\n```\n\n### Isolating common values\n\nIn exploratory work, it’s sometimes useful to find common values and\ntreat them differently. You can use\n[`dissect()`](https://hughjonesd.github.io/santoku/reference/dissect.md)\nto do this:\n\n``` r\n\nx_spike <- rnorm(100)\nx_spike[1:50] <- x_spike[1]\n\nchopped <- dissect(x_spike, -3:3, prop = 0.1)\ntable(chopped)\n#> chopped\n#> [-3, -2) [-2, -1)  [-1, 0)   [0, 1) {0.6996}   [1, 2) \n#>        2        5       15       18       50       10\n```\n\n`prop = 0.2` will put any unique value of `x` into its own separate\ncategory if it makes up at least 20% of the data.\n\nNote that unlike all the other `chop_*` functions,\n[`dissect()`](https://hughjonesd.github.io/santoku/reference/dissect.md)\ndoesn’t always categorize `x` into ordered, connected intervals. To\nremind you of this, it is named differently. If you want to create\nseparate intervals on the left and right of common elements, use\n[`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md):\n\n``` r\n\nchopped <- chop_spikes(x_spike, -3:3, prop = 0.1)\ntable(chopped)\n#> chopped\n#>    [-3, -2)    [-2, -1)     [-1, 0) [0, 0.6996)    {0.6996} (0.6996, 1) \n#>           2           5          15          13          50           5 \n#>      [1, 2) \n#>          10\n```\n\nCompare this to the table before. There are two intervals on either side\nof the common value, instead of one interval surrounding it.\n\n### Quick tables\n\n[`tab_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md),\n[`tab_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md),\nand friends act similarly to\n[`tab()`](https://hughjonesd.github.io/santoku/reference/chop.md),\ncalling the related `chop_*` function and then\n[`table()`](https://rdrr.io/r/base/table.html) on the result.\n\n``` r\n\ntab_n(x, 4)\n#> [1.086, 4.978)  [4.978, 8.97)  [8.97, 9.708] \n#>              4              4              2\ntab_width(x, 2)\n#> [1.086, 3.086) [3.086, 5.086) [5.086, 7.086) [7.086, 9.086) [9.086, 11.09] \n#>              1              4              2              2              1\ntab_evenly(x, 5)\n#>  [1.086, 2.81)  [2.81, 4.535) [4.535, 6.259) [6.259, 7.983) [7.983, 9.708] \n#>              1              2              2              2              3\ntab_mean_sd(x)\n#> [-2 sd, -1 sd)  [-1 sd, 0 sd)   [0 sd, 1 sd)   [1 sd, 2 sd) \n#>              1              4              3              2\n```\n\n### Specifying labels\n\nBy default, santoku labels intervals using mathematical notation:\n\n- `[0, 1]` means all numbers between 0 and 1 inclusive.\n- `(0, 1)` means all numbers *strictly* between 0 and 1, not including\n  the endpoints.\n- `[0, 1)` means all numbers between 0 and 1, including 0 but not 1.\n- `(0, 1]` means all numbers between 0 and 1, including 1 but not 0.\n- `{0}` means just the number 0.\n\nTo override these labels, provide names to the `breaks` argument:\n\n``` r\n\nchopped <- chop(x, c(Lowest = 1, Low = 2, Higher = 5, Highest = 8))\ndata.frame(x, chopped)\n#>        x chopped\n#> 1  4.978     Low\n#> 2  8.970 Highest\n#> 3  3.392     Low\n#> 4  4.677     Low\n#> 5  7.057  Higher\n#> 6  9.708 Highest\n#> 7  6.714  Higher\n#> 8  8.377 Highest\n#> 9  1.086  Lowest\n#> 10 4.495     Low\n```\n\nOr, you can specify factor labels with the `labels` argument:\n\n``` r\n\nchopped <- chop(x, c(2, 5, 8), labels = c(\"Lowest\", \"Low\", \"Higher\", \"Highest\"))\ndata.frame(x, chopped)\n#>        x chopped\n#> 1  4.978     Low\n#> 2  8.970 Highest\n#> 3  3.392     Low\n#> 4  4.677     Low\n#> 5  7.057  Higher\n#> 6  9.708 Highest\n#> 7  6.714  Higher\n#> 8  8.377 Highest\n#> 9  1.086  Lowest\n#> 10 4.495     Low\n```\n\nYou need as many labels as there are intervals - one fewer than\n`length(breaks)` if your data doesn’t extend beyond `breaks`, one more\nthan `length(breaks)` if it does.\n\nTo label intervals with a dash, use\n[`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md):\n\n``` r\n\nchopped <- chop(x, c(2, 5, 8), labels = lbl_dash())\ndata.frame(x, chopped)\n#>        x chopped\n#> 1  4.978     2—5\n#> 2  8.970 8—9.708\n#> 3  3.392     2—5\n#> 4  4.677     2—5\n#> 5  7.057     5—8\n#> 6  9.708 8—9.708\n#> 7  6.714     5—8\n#> 8  8.377 8—9.708\n#> 9  1.086 1.086—2\n#> 10 4.495     2—5\n```\n\nTo label integer data, use\n[`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md).\nIt uses more informative right endpoints:\n\n``` r\n\nchopped  <- chop(1:10, c(2, 5, 8), labels = lbl_discrete())\nchopped2 <- chop(1:10, c(2, 5, 8), labels = lbl_dash())\ndata.frame(x = 1:10, lbl_discrete = chopped, lbl_dash = chopped2)\n#>     x lbl_discrete lbl_dash\n#> 1   1            1      1—2\n#> 2   2          2—4      2—5\n#> 3   3          2—4      2—5\n#> 4   4          2—4      2—5\n#> 5   5          5—7      5—8\n#> 6   6          5—7      5—8\n#> 7   7          5—7      5—8\n#> 8   8         8—10     8—10\n#> 9   9         8—10     8—10\n#> 10 10         8—10     8—10\n```\n\nYou can customize the first or last labels:\n\n``` r\n\nchopped <- chop(x, c(2, 5, 8), labels = lbl_dash(first = \"< 2\", last = \"8+\"))\ndata.frame(x, chopped)\n#>        x chopped\n#> 1  4.978     2—5\n#> 2  8.970      8+\n#> 3  3.392     2—5\n#> 4  4.677     2—5\n#> 5  7.057     5—8\n#> 6  9.708      8+\n#> 7  6.714     5—8\n#> 8  8.377      8+\n#> 9  1.086     < 2\n#> 10 4.495     2—5\n```\n\nTo label intervals in order use\n[`lbl_seq()`](https://hughjonesd.github.io/santoku/reference/lbl_seq.md):\n\n``` r\n\nchopped <- chop(x, c(2, 5, 8), labels = lbl_seq())\ndata.frame(x, chopped)\n#>        x chopped\n#> 1  4.978       b\n#> 2  8.970       d\n#> 3  3.392       b\n#> 4  4.677       b\n#> 5  7.057       c\n#> 6  9.708       d\n#> 7  6.714       c\n#> 8  8.377       d\n#> 9  1.086       a\n#> 10 4.495       b\n```\n\nYou can use numerals or even roman numerals:\n\n``` r\n\nchop(x, c(2, 5, 8), labels = lbl_seq(\"(1)\"))\n#>  [1] (2) (4) (2) (2) (3) (4) (3) (4) (1) (2)\n#> Levels: (1) (2) (3) (4)\nchop(x, c(2, 5, 8), labels = lbl_seq(\"i.\"))\n#>  [1] ii.  iv.  ii.  ii.  iii. iv.  iii. iv.  i.   ii. \n#> Levels: i. ii. iii. iv.\n```\n\nOther labelling functions include:\n\n- [`lbl_endpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md) -\n  use left endpoints as labels\n- [`lbl_midpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_midpoints.md) -\n  use interval midpoints as labels\n- [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md) -\n  specify labels flexibly with the [glue](https://glue.tidyverse.org/)\n  package\n\n### Specifying breaks\n\nBy default,\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\nextends `breaks` if necessary. If you don’t want that, set\n`extend = FALSE`:\n\n``` r\n\nchopped <- chop(x, c(3, 5, 7), extend = FALSE)\ndata.frame(x, chopped)\n#>        x chopped\n#> 1  4.978  [3, 5)\n#> 2  8.970    <NA>\n#> 3  3.392  [3, 5)\n#> 4  4.677  [3, 5)\n#> 5  7.057    <NA>\n#> 6  9.708    <NA>\n#> 7  6.714  [5, 7]\n#> 8  8.377    <NA>\n#> 9  1.086    <NA>\n#> 10 4.495  [3, 5)\n```\n\nData outside the range of `breaks` will become `NA`.\n\nBy default, intervals are closed on the left, i.e. they include their\nleft endpoints. If you want right-closed intervals, set `left = FALSE`:\n\n``` r\n\ny <- 1:5\ndata.frame(\n        y = y, \n        left_closed = chop(y, 1:5), \n        right_closed = chop(y, 1:5, left = FALSE)\n      )\n#>   y left_closed right_closed\n#> 1 1      [1, 2)       [1, 2]\n#> 2 2      [2, 3)       [1, 2]\n#> 3 3      [3, 4)       (2, 3]\n#> 4 4      [4, 5]       (3, 4]\n#> 5 5      [4, 5]       (4, 5]\n```\n\nBy default, the last interval is closed on both ends. If you want to\nkeep the last interval open at the end, set `close_end = FALSE`:\n\n``` r\n\ndata.frame(\n  y = y,\n  end_closed = chop(y, 1:5),\n  end_open   = chop(y, 1:5, close_end = FALSE)\n)\n#>   y end_closed end_open\n#> 1 1     [1, 2)   [1, 2)\n#> 2 2     [2, 3)   [2, 3)\n#> 3 3     [3, 4)   [3, 4)\n#> 4 4     [4, 5]   [4, 5)\n#> 5 5     [4, 5]      {5}\n```\n\n## Chopping dates, times and other vectors\n\nYou can chop many kinds of vectors with santoku, including Date objects…\n\n``` r\n\ny2k <- as.Date(\"2000-01-01\") + 0:10 * 7\ndata.frame(\n  y2k = y2k,\n  chopped = chop(y2k, as.Date(c(\"2000-02-01\", \"2000-03-01\")))\n)\n#>           y2k                  chopped\n#> 1  2000-01-01 [2000-01-01, 2000-02-01)\n#> 2  2000-01-08 [2000-01-01, 2000-02-01)\n#> 3  2000-01-15 [2000-01-01, 2000-02-01)\n#> 4  2000-01-22 [2000-01-01, 2000-02-01)\n#> 5  2000-01-29 [2000-01-01, 2000-02-01)\n#> 6  2000-02-05 [2000-02-01, 2000-03-01)\n#> 7  2000-02-12 [2000-02-01, 2000-03-01)\n#> 8  2000-02-19 [2000-02-01, 2000-03-01)\n#> 9  2000-02-26 [2000-02-01, 2000-03-01)\n#> 10 2000-03-04 [2000-03-01, 2000-03-11]\n#> 11 2000-03-11 [2000-03-01, 2000-03-11]\n```\n\n… and POSIXct (date-time) objects:\n\n``` r\n\n# hours of the 2020 Crew Dragon flight:\ncrew_dragon <- seq(as.POSIXct(\"2020-05-30 18:00\", tz = \"GMT\"), \n                     length.out = 24, by = \"hours\")\nliftoff <- as.POSIXct(\"2020-05-30 15:22\", tz = \"America/New_York\")\ndock    <- as.POSIXct(\"2020-05-31 10:16\", tz = \"America/New_York\")\n\ndata.frame(\n  crew_dragon = crew_dragon,\n  chopped = chop(crew_dragon, c(liftoff, dock), \n                   labels = c(\"pre-flight\", \"flight\", \"docked\"))\n)\n#> Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent\n#> Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent\n#>            crew_dragon    chopped\n#> 1  2020-05-30 18:00:00 pre-flight\n#> 2  2020-05-30 19:00:00 pre-flight\n#> 3  2020-05-30 20:00:00     flight\n#> 4  2020-05-30 21:00:00     flight\n#> 5  2020-05-30 22:00:00     flight\n#> 6  2020-05-30 23:00:00     flight\n#> 7  2020-05-31 00:00:00     flight\n#> 8  2020-05-31 01:00:00     flight\n#> 9  2020-05-31 02:00:00     flight\n#> 10 2020-05-31 03:00:00     flight\n#> 11 2020-05-31 04:00:00     flight\n#> 12 2020-05-31 05:00:00     flight\n#> 13 2020-05-31 06:00:00     flight\n#> 14 2020-05-31 07:00:00     flight\n#> 15 2020-05-31 08:00:00     flight\n#> 16 2020-05-31 09:00:00     flight\n#> 17 2020-05-31 10:00:00     flight\n#> 18 2020-05-31 11:00:00     flight\n#> 19 2020-05-31 12:00:00     flight\n#> 20 2020-05-31 13:00:00     flight\n#> 21 2020-05-31 14:00:00     flight\n#> 22 2020-05-31 15:00:00     docked\n#> 23 2020-05-31 16:00:00     docked\n#> 24 2020-05-31 17:00:00     docked\n```\n\nNote how santoku correctly handles the different timezones.\n\nYou can use\n[`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md)\nwith objects from the `lubridate` package, to chop by irregular periods\nsuch as months:\n\n``` r\n\nlibrary(lubridate)\n#> \n#> Attaching package: 'lubridate'\n#> The following objects are masked from 'package:base':\n#> \n#>     date, intersect, setdiff, union\ndata.frame(\n  y2k = y2k,\n  chopped = chop_width(y2k, months(1))\n)\n#>           y2k                  chopped\n#> 1  2000-01-01 [2000-01-01, 2000-02-01)\n#> 2  2000-01-08 [2000-01-01, 2000-02-01)\n#> 3  2000-01-15 [2000-01-01, 2000-02-01)\n#> 4  2000-01-22 [2000-01-01, 2000-02-01)\n#> 5  2000-01-29 [2000-01-01, 2000-02-01)\n#> 6  2000-02-05 [2000-02-01, 2000-03-01)\n#> 7  2000-02-12 [2000-02-01, 2000-03-01)\n#> 8  2000-02-19 [2000-02-01, 2000-03-01)\n#> 9  2000-02-26 [2000-02-01, 2000-03-01)\n#> 10 2000-03-04 [2000-03-01, 2000-04-01)\n#> 11 2000-03-11 [2000-03-01, 2000-04-01)\n```\n\n[`lbl_date()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md)\nproduces nicely formatted dates:\n\n``` r\n\ndata.frame(\n  y2k = y2k,\n  chopped = chop_width(y2k, days(28), labels = lbl_date())\n)\n#>           y2k              chopped\n#> 1  2000-01-01        1-28 Jan 2000\n#> 2  2000-01-08        1-28 Jan 2000\n#> 3  2000-01-15        1-28 Jan 2000\n#> 4  2000-01-22        1-28 Jan 2000\n#> 5  2000-01-29 29 Jan - 25 Feb 2000\n#> 6  2000-02-05 29 Jan - 25 Feb 2000\n#> 7  2000-02-12 29 Jan - 25 Feb 2000\n#> 8  2000-02-19 29 Jan - 25 Feb 2000\n#> 9  2000-02-26 26 Feb - 24 Mar 2000\n#> 10 2000-03-04 26 Feb - 24 Mar 2000\n#> 11 2000-03-11 26 Feb - 24 Mar 2000\n```\n\nYou can also chop vectors with units, using the `units` package:\n\n``` r\n\nlibrary(units)\n#> udunits database from /Users/davidhugh-jones/Library/R/arm64/4.6/library/units/share/udunits/udunits2.xml\n\nx <- set_units(1:10 * 10, cm)\nbr <- set_units(1:3, ft)\ndata.frame(\n  x = x,\n  chopped = chop(x, br)\n)\n#>           x                    chopped\n#> 1   10 [cm] [ 10.00 [cm],  30.48 [cm])\n#> 2   20 [cm] [ 10.00 [cm],  30.48 [cm])\n#> 3   30 [cm] [ 10.00 [cm],  30.48 [cm])\n#> 4   40 [cm] [ 30.48 [cm],  60.96 [cm])\n#> 5   50 [cm] [ 30.48 [cm],  60.96 [cm])\n#> 6   60 [cm] [ 30.48 [cm],  60.96 [cm])\n#> 7   70 [cm] [ 60.96 [cm],  91.44 [cm])\n#> 8   80 [cm] [ 60.96 [cm],  91.44 [cm])\n#> 9   90 [cm] [ 60.96 [cm],  91.44 [cm])\n#> 10 100 [cm] [ 91.44 [cm], 100.00 [cm]]\n```\n\nYou should be able to chop anything that has a comparison operator. You\ncan even chop character data using lexical ordering. By default santoku\nemits a warning in this case, to avoid accidentally misinterpreting\nresults:\n\n``` r\n\nchop(letters[1:10], c(\"d\", \"f\"))\n#> Warning in categorize_non_numeric(x, breaks, left): `x` or `breaks` is of type\n#> character, using lexical sorting. To turn off this warning, run:\n#> options(santoku.warn_character = FALSE)\n#>  [1] [a, d) [a, d) [a, d) [d, f) [d, f) [f, j] [f, j] [f, j] [f, j] [f, j]\n#> Levels: [a, d) [d, f) [f, j]\n```\n\nIf you find a type of data that you can’t chop, please [file an\nissue](https://github.com/hughjonesd/santoku/issues).\n"
  },
  {
    "path": "docs/articles/santoku_files/accessible-code-block-0.0.1/empty-anchor.js",
    "content": "// Hide empty <a> tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) -->\n// v0.0.1\n// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020.\n\ndocument.addEventListener('DOMContentLoaded', function() {\n  const codeList = document.getElementsByClassName(\"sourceCode\");\n  for (var i = 0; i < codeList.length; i++) {\n    var linkList = codeList[i].getElementsByTagName('a');\n    for (var j = 0; j < linkList.length; j++) {\n      if (linkList[j].innerHTML === \"\") {\n        linkList[j].setAttribute('aria-hidden', 'true');\n      }\n    }\n  }\n});\n"
  },
  {
    "path": "docs/articles/santoku_files/header-attrs-2.11/header-attrs.js",
    "content": "// 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"
  },
  {
    "path": "docs/articles/santoku_files/header-attrs-2.8/header-attrs.js",
    "content": "// 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"
  },
  {
    "path": "docs/articles/website-articles/performance.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<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>Performance • santoku</title>\n<!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../../favicon-96x96.png\">\n<link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../../favicon.svg\">\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../../apple-touch-icon.png\">\n<link rel=\"icon\" sizes=\"any\" href=\"../../favicon.ico\">\n<link rel=\"manifest\" href=\"../../site.webmanifest\">\n<script src=\"../../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<link href=\"../../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\">\n<script src=\"../../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\">\n<link href=\"../../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\">\n<script src=\"../../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../../pkgdown.js\"></script><link href=\"../../extra.css\" rel=\"stylesheet\">\n<meta property=\"og:title\" content=\"Performance\">\n</head>\n<body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\">\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../../articles/santoku.html\">Get started</a></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../../reference/index.html\">Reference</a></li>\n<li class=\"active 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/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul>\n</li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\">\n<li><a class=\"dropdown-item\" href=\"../../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul>\n</li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../../news/index.html\">Changelog</a></li>\n      </ul>\n<ul class=\"navbar-nav\">\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<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul>\n</div>\n\n\n  </div>\n</nav><div class=\"container template-article\">\n\n\n\n\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../../logo.png\" class=\"logo\" alt=\"\"><h1>Performance</h1>\n                        <h4 data-toc-skip class=\"author\">David\nHugh-Jones</h4>\n            \n            <h4 data-toc-skip class=\"date\">2026-04-28</h4>\n      \n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/vignettes/website-articles/performance.Rmd\" class=\"external-link\"><code>vignettes/website-articles/performance.Rmd</code></a></small>\n      <div class=\"d-none name\"><code>performance.Rmd</code></div>\n    </div>\n\n    \n    \n<div class=\"section level2\">\n<h2 id=\"speed\">Speed<a class=\"anchor\" aria-label=\"anchor\" href=\"#speed\"></a>\n</h2>\n<p>The core of santoku is written in C++. It is reasonably fast:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/packageDescription.html\" class=\"external-link\">packageVersion</a></span><span class=\"op\">(</span><span class=\"st\">\"santoku\"</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] '1.2.0'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">27101975</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"va\">mb</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">bench</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://bench.r-lib.org/reference/mark.html\" class=\"external-link\">mark</a></span><span class=\"op\">(</span>min_iterations <span class=\"op\">=</span> <span class=\"fl\">100</span>, check <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>        <span class=\"fu\">santoku</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"../../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">1e5</span><span class=\"op\">)</span>, <span class=\"op\">-</span><span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">2</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\">base</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/cut.html\" class=\"external-link\">cut</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">1e5</span><span class=\"op\">)</span>, <span class=\"op\">-</span><span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">2</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\">Hmisc</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/Hmisc/man/cut2.html\" class=\"external-link\">cut2</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">1e5</span><span class=\"op\">)</span>, <span class=\"op\">-</span><span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span>      <span class=\"op\">)</span></span>\n<span><span class=\"va\">mb</span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #949494;\"># A tibble: 3 × 6</span></span></span>\n<span><span class=\"co\">#&gt;   expression                             min median `itr/sec` mem_alloc `gc/sec`</span></span>\n<span><span class=\"co\">#&gt;   <span style=\"color: #949494; font-style: italic;\">&lt;bch:expr&gt;</span>                        <span style=\"color: #949494; font-style: italic;\">&lt;bch:tm&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;bch:&gt;</span>     <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;bch:byt&gt;</span>    <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span></span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">1</span> santoku::chop(rnorm(1e+05), -2:2)   6.34ms 6.54ms      150.   10.21MB     64.5</span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">2</span> base::cut(rnorm(1e+05), -2:2)       2.73ms 2.78ms      357.    2.35MB     31.5</span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">3</span> Hmisc::cut2(rnorm(1e+05), -2:2)     9.74ms 9.88ms      101.    19.5MB    223.</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">autoplot</span><span class=\"op\">(</span><span class=\"va\">mb</span>, type <span class=\"op\">=</span> <span class=\"st\">\"violin\"</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"performance_files/figure-html/unnamed-chunk-1-1.png\" class=\"r-plt\" alt=\"\" width=\"672\"></p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"many-breaks\">Many breaks<a class=\"anchor\" aria-label=\"anchor\" href=\"#many-breaks\"></a>\n</h2>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span></span>\n<span><span class=\"va\">many_breaks</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/seq.html\" class=\"external-link\">seq</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">2</span>, <span class=\"fl\">2</span>, <span class=\"fl\">0.001</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"va\">mb_breaks</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">bench</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://bench.r-lib.org/reference/mark.html\" class=\"external-link\">mark</a></span><span class=\"op\">(</span>min_iterations <span class=\"op\">=</span> <span class=\"fl\">100</span>, check <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>        <span class=\"fu\">santoku</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"../../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">1e4</span><span class=\"op\">)</span>, <span class=\"va\">many_breaks</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\">base</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/cut.html\" class=\"external-link\">cut</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">1e4</span><span class=\"op\">)</span>, <span class=\"va\">many_breaks</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\">Hmisc</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://rdrr.io/pkg/Hmisc/man/cut2.html\" class=\"external-link\">cut2</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">1e4</span><span class=\"op\">)</span>, <span class=\"va\">many_breaks</span><span class=\"op\">)</span></span>\n<span>      <span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"va\">mb_breaks</span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #949494;\"># A tibble: 3 × 6</span></span></span>\n<span><span class=\"co\">#&gt;   expression                            min  median `itr/sec` mem_alloc `gc/sec`</span></span>\n<span><span class=\"co\">#&gt;   <span style=\"color: #949494; font-style: italic;\">&lt;bch:expr&gt;</span>                        <span style=\"color: #949494; font-style: italic;\">&lt;bch:t&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;bch:t&gt;</span>     <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;bch:byt&gt;</span>    <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span></span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">1</span> santoku::chop(rnorm(10000), many… 20.95ms 21.28ms      46.2    5.14MB     8.81</span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">2</span> base::cut(rnorm(10000), many_bre…  2.35ms  2.43ms     409.     1.39MB    17.7 </span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">3</span> Hmisc::cut2(rnorm(10000), many_b…  7.03ms   7.2ms     138.      5.7MB    32.5</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">autoplot</span><span class=\"op\">(</span><span class=\"va\">mb_breaks</span>, type <span class=\"op\">=</span> <span class=\"st\">\"violin\"</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"performance_files/figure-html/unnamed-chunk-2-1.png\" class=\"r-plt\" alt=\"\" width=\"672\"></p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"various-chops\">Various chops<a class=\"anchor\" aria-label=\"anchor\" href=\"#various-chops\"></a>\n</h2>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span></span>\n<span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">9e4</span><span class=\"op\">)</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sample.html\" class=\"external-link\">sample</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">2</span>, <span class=\"fl\">1e4</span>, replace <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"va\">mb_various</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">bench</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://bench.r-lib.org/reference/mark.html\" class=\"external-link\">mark</a></span><span class=\"op\">(</span>min_iterations <span class=\"op\">=</span> <span class=\"fl\">100</span>, check <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>        <span class=\"fu\"><a href=\"../../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"op\">-</span><span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">2</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\"><a href=\"../../reference/chop_equally.html\">chop_equally</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, groups <span class=\"op\">=</span> <span class=\"fl\">20</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\"><a href=\"../../reference/chop_n.html\">chop_n</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, n <span class=\"op\">=</span> <span class=\"fl\">2e4</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\"><a href=\"../../reference/chop_quantiles.html\">chop_quantiles</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.05</span>, <span class=\"fl\">0.25</span>, <span class=\"fl\">0.5</span>, <span class=\"fl\">0.75</span>, <span class=\"fl\">0.95</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\"><a href=\"../../reference/chop_evenly.html\">chop_evenly</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, intervals <span class=\"op\">=</span> <span class=\"fl\">20</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\"><a href=\"../../reference/chop_width.html\">chop_width</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, width <span class=\"op\">=</span> <span class=\"fl\">0.25</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\"><a href=\"../../reference/chop_proportions.html\">chop_proportions</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, proportions <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.05</span>, <span class=\"fl\">0.25</span>, <span class=\"fl\">0.5</span>, <span class=\"fl\">0.75</span>, <span class=\"fl\">0.95</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\"><a href=\"../../reference/chop_mean_sd.html\">chop_mean_sd</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, sds <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">4</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\"><a href=\"../../reference/chop_fn.html\">chop_fn</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\">scales</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://scales.r-lib.org/reference/breaks_extended.html\" class=\"external-link\">breaks_extended</a></span><span class=\"op\">(</span><span class=\"fl\">10</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\"><a href=\"../../reference/chop_pretty.html\">chop_pretty</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, n <span class=\"op\">=</span> <span class=\"fl\">10</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\"><a href=\"../../reference/chop_spikes.html\">chop_spikes</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"op\">-</span><span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">2</span>, prop <span class=\"op\">=</span> <span class=\"fl\">0.01</span><span class=\"op\">)</span>,</span>\n<span>        <span class=\"fu\"><a href=\"../../reference/dissect.html\">dissect</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"op\">-</span><span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">2</span>, prop <span class=\"op\">=</span> <span class=\"fl\">0.01</span><span class=\"op\">)</span></span>\n<span>      <span class=\"op\">)</span></span>\n<span>      </span>\n<span><span class=\"va\">mb_various</span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #949494;\"># A tibble: 12 × 6</span></span></span>\n<span><span class=\"co\">#&gt;    expression                           min  median `itr/sec` mem_alloc `gc/sec`</span></span>\n<span><span class=\"co\">#&gt;    <span style=\"color: #949494; font-style: italic;\">&lt;bch:expr&gt;</span>                       <span style=\"color: #949494; font-style: italic;\">&lt;bch:t&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;bch:t&gt;</span>     <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span> <span style=\"color: #949494; font-style: italic;\">&lt;bch:byt&gt;</span>    <span style=\"color: #949494; font-style: italic;\">&lt;dbl&gt;</span></span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\"> 1</span> chop(x, -2:2)                     4.23ms  4.33ms     229.     8.63MB    118. </span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\"> 2</span> chop_equally(x, groups = 20)     11.04ms  11.2ms      88.5   12.18MB     72.4</span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\"> 3</span> chop_n(x, n = 20000)              7.65ms  8.11ms     124.     23.5MB    507. </span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\"> 4</span> chop_quantiles(x, c(0.05, 0.25,…  6.63ms  6.75ms     147.    12.08MB    125. </span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\"> 5</span> chop_evenly(x, intervals = 20)    5.43ms  5.57ms     178.    12.48MB    152. </span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\"> 6</span> chop_width(x, width = 0.25)       5.96ms  6.08ms     163.    12.53MB    139. </span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\"> 7</span> chop_proportions(x, proportions…  4.75ms  5.37ms     190.    12.48MB    162. </span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\"> 8</span> chop_mean_sd(x, sds = 1:4)         4.9ms     5ms     198.    11.36MB    150. </span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\"> 9</span> chop_fn(x, scales::breaks_exten…  5.33ms   5.5ms     177.    11.47MB    123. </span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">10</span> chop_pretty(x, n = 10)            4.87ms  5.02ms     197.    10.58MB    142. </span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">11</span> chop_spikes(x, -2:2, prop = 0.0…  8.14ms  8.41ms     119.    14.62MB    137. </span></span>\n<span><span class=\"co\">#&gt; <span style=\"color: #BCBCBC;\">12</span> dissect(x, -2:2, prop = 0.01)    11.42ms 11.61ms      85.6   22.27MB    257.</span></span></code></pre></div>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\">autoplot</span><span class=\"op\">(</span><span class=\"va\">mb_various</span>, type <span class=\"op\">=</span> <span class=\"st\">\"violin\"</span><span class=\"op\">)</span></span></code></pre></div>\n<p><img src=\"performance_files/figure-html/unnamed-chunk-3-1.png\" class=\"r-plt\" alt=\"\" width=\"672\"></p>\n</div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside>\n</div>\n\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer>\n</div>\n\n\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/articles/website-articles/performance.md",
    "content": "# Performance\n\n## Speed\n\nThe core of santoku is written in C++. It is reasonably fast:\n\n``` r\n\n\npackageVersion(\"santoku\")\n#> [1] '1.2.0'\nset.seed(27101975)\n\nmb <- bench::mark(min_iterations = 100, check = FALSE,\n        santoku::chop(rnorm(1e5), -2:2),\n        base::cut(rnorm(1e5), -2:2),\n        Hmisc::cut2(rnorm(1e5), -2:2)\n      )\nmb\n#> # A tibble: 3 × 6\n#>   expression                             min median `itr/sec` mem_alloc `gc/sec`\n#>   <bch:expr>                        <bch:tm> <bch:>     <dbl> <bch:byt>    <dbl>\n#> 1 santoku::chop(rnorm(1e+05), -2:2)   6.34ms 6.54ms      150.   10.21MB     64.5\n#> 2 base::cut(rnorm(1e+05), -2:2)       2.73ms 2.78ms      357.    2.35MB     31.5\n#> 3 Hmisc::cut2(rnorm(1e+05), -2:2)     9.74ms 9.88ms      101.    19.5MB    223.\n```\n\n``` r\n\nautoplot(mb, type = \"violin\")\n```\n\n![](performance_files/figure-html/unnamed-chunk-1-1.png)\n\n## Many breaks\n\n``` r\n\n\nmany_breaks <- seq(-2, 2, 0.001)\n\nmb_breaks <- bench::mark(min_iterations = 100, check = FALSE,\n        santoku::chop(rnorm(1e4), many_breaks),\n        base::cut(rnorm(1e4), many_breaks),\n        Hmisc::cut2(rnorm(1e4), many_breaks)\n      )\n\nmb_breaks\n#> # A tibble: 3 × 6\n#>   expression                            min  median `itr/sec` mem_alloc `gc/sec`\n#>   <bch:expr>                        <bch:t> <bch:t>     <dbl> <bch:byt>    <dbl>\n#> 1 santoku::chop(rnorm(10000), many… 20.95ms 21.28ms      46.2    5.14MB     8.81\n#> 2 base::cut(rnorm(10000), many_bre…  2.35ms  2.43ms     409.     1.39MB    17.7 \n#> 3 Hmisc::cut2(rnorm(10000), many_b…  7.03ms   7.2ms     138.      5.7MB    32.5\n```\n\n``` r\n\nautoplot(mb_breaks, type = \"violin\")\n```\n\n![](performance_files/figure-html/unnamed-chunk-2-1.png)\n\n## Various chops\n\n``` r\n\n\nx <- c(rnorm(9e4), sample(-2:2, 1e4, replace = TRUE))\n\nmb_various <- bench::mark(min_iterations = 100, check = FALSE,\n        chop(x, -2:2),\n        chop_equally(x, groups = 20),\n        chop_n(x, n = 2e4),\n        chop_quantiles(x, c(0.05, 0.25, 0.5, 0.75, 0.95)),\n        chop_evenly(x, intervals = 20),\n        chop_width(x, width = 0.25),\n        chop_proportions(x, proportions = c(0.05, 0.25, 0.5, 0.75, 0.95)),\n        chop_mean_sd(x, sds = 1:4),\n        chop_fn(x, scales::breaks_extended(10)),\n        chop_pretty(x, n = 10),\n        chop_spikes(x, -2:2, prop = 0.01),\n        dissect(x, -2:2, prop = 0.01)\n      )\n      \nmb_various\n#> # A tibble: 12 × 6\n#>    expression                           min  median `itr/sec` mem_alloc `gc/sec`\n#>    <bch:expr>                       <bch:t> <bch:t>     <dbl> <bch:byt>    <dbl>\n#>  1 chop(x, -2:2)                     4.23ms  4.33ms     229.     8.63MB    118. \n#>  2 chop_equally(x, groups = 20)     11.04ms  11.2ms      88.5   12.18MB     72.4\n#>  3 chop_n(x, n = 20000)              7.65ms  8.11ms     124.     23.5MB    507. \n#>  4 chop_quantiles(x, c(0.05, 0.25,…  6.63ms  6.75ms     147.    12.08MB    125. \n#>  5 chop_evenly(x, intervals = 20)    5.43ms  5.57ms     178.    12.48MB    152. \n#>  6 chop_width(x, width = 0.25)       5.96ms  6.08ms     163.    12.53MB    139. \n#>  7 chop_proportions(x, proportions…  4.75ms  5.37ms     190.    12.48MB    162. \n#>  8 chop_mean_sd(x, sds = 1:4)         4.9ms     5ms     198.    11.36MB    150. \n#>  9 chop_fn(x, scales::breaks_exten…  5.33ms   5.5ms     177.    11.47MB    123. \n#> 10 chop_pretty(x, n = 10)            4.87ms  5.02ms     197.    10.58MB    142. \n#> 11 chop_spikes(x, -2:2, prop = 0.0…  8.14ms  8.41ms     119.    14.62MB    137. \n#> 12 dissect(x, -2:2, prop = 0.01)    11.42ms 11.61ms      85.6   22.27MB    257.\n```\n\n``` r\n\nautoplot(mb_various, type = \"violin\")\n```\n\n![](performance_files/figure-html/unnamed-chunk-3-1.png)\n"
  },
  {
    "path": "docs/articles/website-articles/performance_files/accessible-code-block-0.0.1/empty-anchor.js",
    "content": "// Hide empty <a> tag within highlighted CodeBlock for screen reader accessibility (see https://github.com/jgm/pandoc/issues/6352#issuecomment-626106786) -->\n// v0.0.1\n// Written by JooYoung Seo (jooyoung@psu.edu) and Atsushi Yasumoto on June 1st, 2020.\n\ndocument.addEventListener('DOMContentLoaded', function() {\n  const codeList = document.getElementsByClassName(\"sourceCode\");\n  for (var i = 0; i < codeList.length; i++) {\n    var linkList = codeList[i].getElementsByTagName('a');\n    for (var j = 0; j < linkList.length; j++) {\n      if (linkList[j].innerHTML === \"\") {\n        linkList[j].setAttribute('aria-hidden', 'true');\n      }\n    }\n  }\n});\n"
  },
  {
    "path": "docs/articles/website-articles/performance_files/header-attrs-2.11/header-attrs.js",
    "content": "// 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"
  },
  {
    "path": "docs/articles/website-articles/performance_files/header-attrs-2.8/header-attrs.js",
    "content": "// 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"
  },
  {
    "path": "docs/articles/whats-new-in-0-9-0.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<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>What's new in santoku 0.9.0 • santoku</title>\n<!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\">\n<link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\">\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\">\n<link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\">\n<link rel=\"manifest\" href=\"../site.webmanifest\">\n<script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\">\n<script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\">\n<link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\">\n<script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\">\n<meta property=\"og:title\" content=\"What's new in santoku 0.9.0\">\n</head>\n<body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\">\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../reference/index.html\">Reference</a></li>\n<li class=\"active 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/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul>\n</li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\">\n<li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul>\n</li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul>\n<ul class=\"navbar-nav\">\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<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul>\n</div>\n\n\n  </div>\n</nav><div class=\"container template-article\">\n\n\n\n\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>What's new in santoku 0.9.0</h1>\n            \n      \n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/vignettes/whats-new-in-0-9-0.Rmd\" class=\"external-link\"><code>vignettes/whats-new-in-0-9-0.Rmd</code></a></small>\n      <div class=\"d-none name\"><code>whats-new-in-0-9-0.Rmd</code></div>\n    </div>\n\n    \n    \n<p>Santoku 0.9.0 has a few changes.</p>\n<div class=\"section level2\">\n<h2 id=\"you-can-use-break-names-for-labels\">You can use break names for labels<a class=\"anchor\" aria-label=\"anchor\" href=\"#you-can-use-break-names-for-labels\"></a>\n</h2>\n<p>On the command line, sometimes you’d like to quickly add labels to\nyour breaks. Now, you can do this simply by adding names to the\n<code>breaks</code> vector:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://github.com/hughjonesd/santoku\" class=\"external-link\">santoku</a></span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>,<span class=\"fl\">3</span>,<span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] [1, 3) [1, 3) [3, 5] [3, 5] [3, 5]</span></span>\n<span><span class=\"co\">#&gt; Levels: [1, 3) [3, 5]</span></span>\n<span></span>\n<span><span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span>Low <span class=\"op\">=</span> <span class=\"fl\">1</span>, High <span class=\"op\">=</span> <span class=\"fl\">3</span>, <span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] Low  Low  High High High</span></span>\n<span><span class=\"co\">#&gt; Levels: Low High</span></span></code></pre></div>\n<p>Break names override the <code>labels</code> argument, but you can\nstill use this for unnamed breaks:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span></span>\n<span><span class=\"va\">ages</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sample.html\" class=\"external-link\">sample</a></span><span class=\"op\">(</span><span class=\"fl\">12</span><span class=\"op\">:</span><span class=\"fl\">80</span>, <span class=\"fl\">20</span><span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"../reference/chop.html\">tab</a></span><span class=\"op\">(</span><span class=\"va\">ages</span>, </span>\n<span>      <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"Under 16\"</span> <span class=\"op\">=</span> <span class=\"fl\">0</span>, <span class=\"fl\">16</span>, <span class=\"fl\">25</span>, <span class=\"fl\">35</span>, <span class=\"fl\">45</span>, <span class=\"fl\">55</span>, <span class=\"st\">\"65 and over\"</span> <span class=\"op\">=</span> <span class=\"fl\">65</span><span class=\"op\">)</span>, </span>\n<span>      labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"../reference/lbl_discrete.html\">lbl_discrete</a></span><span class=\"op\">(</span><span class=\"op\">)</span></span>\n<span>    <span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;    Under 16       16—24       25—34       35—44       45—54       55—64 </span></span>\n<span><span class=\"co\">#&gt;           1           1           2           3           3           4 </span></span>\n<span><span class=\"co\">#&gt; 65 and over </span></span>\n<span><span class=\"co\">#&gt;           6</span></span></code></pre></div>\n<p>Names can also be used for labels in <code><a href=\"../reference/chop_quantiles.html\">chop_quantiles()</a></code>\nand <code><a href=\"../reference/chop_proportions.html\">chop_proportions()</a></code>:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">10</span><span class=\"op\">)</span></span>\n<span><span class=\"va\">chopped</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"../reference/chop_quantiles.html\">chop_quantiles</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, </span>\n<span>                            <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"Lower tail\"</span> <span class=\"op\">=</span> <span class=\"fl\">0</span>, <span class=\"fl\">0.025</span>, <span class=\"st\">\"Upper tail\"</span> <span class=\"op\">=</span> <span class=\"fl\">0.975</span><span class=\"op\">)</span></span>\n<span>                          <span class=\"op\">)</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/data.frame.html\" class=\"external-link\">data.frame</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">chopped</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;             x       chopped</span></span>\n<span><span class=\"co\">#&gt; 1  -1.3888607 [2.5%, 97.5%)</span></span>\n<span><span class=\"co\">#&gt; 2  -0.2787888 [2.5%, 97.5%)</span></span>\n<span><span class=\"co\">#&gt; 3  -0.1333213 [2.5%, 97.5%)</span></span>\n<span><span class=\"co\">#&gt; 4   0.6359504 [2.5%, 97.5%)</span></span>\n<span><span class=\"co\">#&gt; 5  -0.2842529 [2.5%, 97.5%)</span></span>\n<span><span class=\"co\">#&gt; 6  -2.6564554    Lower tail</span></span>\n<span><span class=\"co\">#&gt; 7  -2.4404669 [2.5%, 97.5%)</span></span>\n<span><span class=\"co\">#&gt; 8   1.3201133    Upper tail</span></span>\n<span><span class=\"co\">#&gt; 9  -0.3066386 [2.5%, 97.5%)</span></span>\n<span><span class=\"co\">#&gt; 10 -1.7813084 [2.5%, 97.5%)</span></span></code></pre></div>\n<p>This feature is experimental for now.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"close_end-works-differently\">\n<code>close_end</code> works differently<a class=\"anchor\" aria-label=\"anchor\" href=\"#close_end-works-differently\"></a>\n</h2>\n<p>The <code>close_end</code> parameter is used to right-close the last\nbreak. This used to be applied before breaks were extended to cover\nitems beyond the explicitly given breaks. We think this was confusing\nfor users. So now, <code>close_end</code> is applied only after the\nbreaks have been extended - i.e. to the very last break.</p>\n<p>In 0.8.0:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">4</span>, <span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">3</span>, close_end <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] [1, 2) [2, 3] [2, 3] (3, 4]</span></span>\n<span><span class=\"co\">#&gt; Levels: [1, 2) [2, 3] (3, 4]</span></span></code></pre></div>\n<p>Notice how the central break <code>[2, 3]</code> is right-closed.\n(The extended break <code>[3, 4]</code> is right-closed too, because\nextended breaks are always closed at the “outer” end.)</p>\n<p>In 0.9.0:</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">4</span>, <span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">3</span>, close_end <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] [1, 2) [2, 3) [3, 4] [3, 4]</span></span>\n<span><span class=\"co\">#&gt; Levels: [1, 2) [2, 3) [3, 4]</span></span></code></pre></div>\n<p>Now, <code>close_end</code> is applied to the final, extended break\n<code>[3, 4]</code>, not to the explicit break <code>[2, 3)</code>.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"close_end-is-true-by-default\">\n<code>close_end</code> is <code>TRUE</code> by default<a class=\"anchor\" aria-label=\"anchor\" href=\"#close_end-is-true-by-default\"></a>\n</h2>\n<p>We think that for exploratory work, users typically want to include\nall the data between the lowest and highest break, inclusive. So,\n<code>close_end</code> is now <code>TRUE</code> by default.</p>\n<p>In 0.8.0:</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span>, <span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">3</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] [1, 2) [2, 3) {3}   </span></span>\n<span><span class=\"co\">#&gt; Levels: [1, 2) [2, 3) {3}</span></span></code></pre></div>\n<p>In 0.9.0:</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span>, <span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">3</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] [1, 2) [2, 3] [2, 3]</span></span>\n<span><span class=\"co\">#&gt; Levels: [1, 2) [2, 3]</span></span></code></pre></div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"new-raw-parameter-for-chop\">New <code>raw</code> parameter for <code>chop()</code><a class=\"anchor\" aria-label=\"anchor\" href=\"#new-raw-parameter-for-chop\"></a>\n</h2>\n<p><code>lbl_*</code> functions have a <code>raw</code> parameter to use\nthe raw interval endpoints in labels, rather than e.g. percentiles or\nstandard deviations. We’ve moved this into the main <code><a href=\"../reference/chop.html\">chop()</a></code>\nfunction. This makes it easier to use:</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span></span>\n<span><span class=\"fu\"><a href=\"../reference/chop_mean_sd.html\">chop_mean_sd</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;  [1] [-1 sd, 0 sd)  [0 sd, 1 sd)   [0 sd, 1 sd)   [1 sd, 2 sd)   [0 sd, 1 sd)  </span></span>\n<span><span class=\"co\">#&gt;  [6] [-2 sd, -1 sd) [-2 sd, -1 sd) [1 sd, 2 sd)   [0 sd, 1 sd)   [-1 sd, 0 sd) </span></span>\n<span><span class=\"co\">#&gt; Levels: [-2 sd, -1 sd) [-1 sd, 0 sd) [0 sd, 1 sd) [1 sd, 2 sd)</span></span>\n<span></span>\n<span><span class=\"fu\"><a href=\"../reference/chop_mean_sd.html\">chop_mean_sd</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, raw <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;  [1] [-2.03, -0.7314)  [-0.7314, 0.5674) [-0.7314, 0.5674) [0.5674, 1.866)  </span></span>\n<span><span class=\"co\">#&gt;  [5] [-0.7314, 0.5674) [-3.329, -2.03)   [-3.329, -2.03)   [0.5674, 1.866)  </span></span>\n<span><span class=\"co\">#&gt;  [9] [-0.7314, 0.5674) [-2.03, -0.7314) </span></span>\n<span><span class=\"co\">#&gt; 4 Levels: [-3.329, -2.03) [-2.03, -0.7314) ... [0.5674, 1.866)</span></span></code></pre></div>\n<p>The <code>raw</code> parameter to <code>lbl_*</code> functions is\ndeprecated.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"other-changes\">Other changes<a class=\"anchor\" aria-label=\"anchor\" href=\"#other-changes\"></a>\n</h2>\n<p>The NEWS file lists other changes, including a new\n<code><a href=\"../reference/chop_fn.html\">chop_fn()</a></code> function which creates breaks using any arbitrary\nfunction.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"feedback\">Feedback<a class=\"anchor\" aria-label=\"anchor\" href=\"#feedback\"></a>\n</h2>\n<p>We expect this to be the last release before 1.0, when we’ll\nstabilize the interface and move santoku from “experimental” to\n“stable”. So, if you have problems or suggestions regarding any of these\nchanges, please <a href=\"https://github.com/hughjonesd/santoku/issues\" class=\"external-link\">file an\nissue</a>.</p>\n</div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside>\n</div>\n\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer>\n</div>\n\n\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/articles/whats-new-in-0-9-0.md",
    "content": "# What's new in santoku 0.9.0\n\nSantoku 0.9.0 has a few changes.\n\n## You can use break names for labels\n\nOn the command line, sometimes you’d like to quickly add labels to your\nbreaks. Now, you can do this simply by adding names to the `breaks`\nvector:\n\n``` r\n\nlibrary(santoku)\n\nchop(1:5, c(1,3,5))\n#> [1] [1, 3) [1, 3) [3, 5] [3, 5] [3, 5]\n#> Levels: [1, 3) [3, 5]\n\nchop(1:5, c(Low = 1, High = 3, 5))\n#> [1] Low  Low  High High High\n#> Levels: Low High\n```\n\nBreak names override the `labels` argument, but you can still use this\nfor unnamed breaks:\n\n``` r\n\n\nages <- sample(12:80, 20)\ntab(ages, \n      c(\"Under 16\" = 0, 16, 25, 35, 45, 55, \"65 and over\" = 65), \n      labels = lbl_discrete()\n    )\n#>    Under 16       16—24       25—34       35—44       45—54       55—64 \n#>           1           1           2           3           3           4 \n#> 65 and over \n#>           6\n```\n\nNames can also be used for labels in\n[`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\nand\n[`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md):\n\n``` r\n\nx <- rnorm(10)\nchopped <- chop_quantiles(x, \n                            c(\"Lower tail\" = 0, 0.025, \"Upper tail\" = 0.975)\n                          )\ndata.frame(x, chopped)\n#>             x       chopped\n#> 1  -1.3888607 [2.5%, 97.5%)\n#> 2  -0.2787888 [2.5%, 97.5%)\n#> 3  -0.1333213 [2.5%, 97.5%)\n#> 4   0.6359504 [2.5%, 97.5%)\n#> 5  -0.2842529 [2.5%, 97.5%)\n#> 6  -2.6564554    Lower tail\n#> 7  -2.4404669 [2.5%, 97.5%)\n#> 8   1.3201133    Upper tail\n#> 9  -0.3066386 [2.5%, 97.5%)\n#> 10 -1.7813084 [2.5%, 97.5%)\n```\n\nThis feature is experimental for now.\n\n## `close_end` works differently\n\nThe `close_end` parameter is used to right-close the last break. This\nused to be applied before breaks were extended to cover items beyond the\nexplicitly given breaks. We think this was confusing for users. So now,\n`close_end` is applied only after the breaks have been extended -\ni.e. to the very last break.\n\nIn 0.8.0:\n\n``` r\n\nchop(1:4, 2:3, close_end = TRUE)\n#> [1] [1, 2) [2, 3] [2, 3] (3, 4]\n#> Levels: [1, 2) [2, 3] (3, 4]\n```\n\nNotice how the central break `[2, 3]` is right-closed. (The extended\nbreak `[3, 4]` is right-closed too, because extended breaks are always\nclosed at the “outer” end.)\n\nIn 0.9.0:\n\n``` r\n\nchop(1:4, 2:3, close_end = TRUE)\n#> [1] [1, 2) [2, 3) [3, 4] [3, 4]\n#> Levels: [1, 2) [2, 3) [3, 4]\n```\n\nNow, `close_end` is applied to the final, extended break `[3, 4]`, not\nto the explicit break `[2, 3)`.\n\n## `close_end` is `TRUE` by default\n\nWe think that for exploratory work, users typically want to include all\nthe data between the lowest and highest break, inclusive. So,\n`close_end` is now `TRUE` by default.\n\nIn 0.8.0:\n\n``` r\n\nchop(1:3, 2:3)\n#> [1] [1, 2) [2, 3) {3}   \n#> Levels: [1, 2) [2, 3) {3}\n```\n\nIn 0.9.0:\n\n``` r\n\nchop(1:3, 2:3)\n#> [1] [1, 2) [2, 3] [2, 3]\n#> Levels: [1, 2) [2, 3]\n```\n\n## New `raw` parameter for `chop()`\n\n`lbl_*` functions have a `raw` parameter to use the raw interval\nendpoints in labels, rather than e.g. percentiles or standard\ndeviations. We’ve moved this into the main\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\nfunction. This makes it easier to use:\n\n``` r\n\n\nchop_mean_sd(x)\n#>  [1] [-1 sd, 0 sd)  [0 sd, 1 sd)   [0 sd, 1 sd)   [1 sd, 2 sd)   [0 sd, 1 sd)  \n#>  [6] [-2 sd, -1 sd) [-2 sd, -1 sd) [1 sd, 2 sd)   [0 sd, 1 sd)   [-1 sd, 0 sd) \n#> Levels: [-2 sd, -1 sd) [-1 sd, 0 sd) [0 sd, 1 sd) [1 sd, 2 sd)\n\nchop_mean_sd(x, raw = TRUE)\n#>  [1] [-2.03, -0.7314)  [-0.7314, 0.5674) [-0.7314, 0.5674) [0.5674, 1.866)  \n#>  [5] [-0.7314, 0.5674) [-3.329, -2.03)   [-3.329, -2.03)   [0.5674, 1.866)  \n#>  [9] [-0.7314, 0.5674) [-2.03, -0.7314) \n#> 4 Levels: [-3.329, -2.03) [-2.03, -0.7314) ... [0.5674, 1.866)\n```\n\nThe `raw` parameter to `lbl_*` functions is deprecated.\n\n## Other changes\n\nThe NEWS file lists other changes, including a new\n[`chop_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md)\nfunction which creates breaks using any arbitrary function.\n\n## Feedback\n\nWe expect this to be the last release before 1.0, when we’ll stabilize\nthe interface and move santoku from “experimental” to “stable”. So, if\nyou have problems or suggestions regarding any of these changes, please\n[file an issue](https://github.com/hughjonesd/santoku/issues).\n"
  },
  {
    "path": "docs/authors.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Authors and Citation • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"favicon.ico\"><link rel=\"manifest\" href=\"site.webmanifest\"><script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"deps/search-1.0.0/fuse.min.js\"></script><script src=\"deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"pkgdown.js\"></script><link href=\"extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Authors and Citation\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"articles/santoku.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\"><li><a class=\"dropdown-item\" href=\"articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-citation-authors\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"logo.png\" class=\"logo\" alt=\"\"><h1>Authors and Citation</h1>\n    </div>\n\n    <div class=\"section level2\">\n      <h2>Authors</h2>\n\n      <ul class=\"list-unstyled\"><li>\n          <p><strong>David Hugh-Jones</strong>. Author, maintainer.\n          </p>\n        </li>\n        <li>\n          <p><strong>Daniel Possenriede</strong>. Contributor.\n          </p>\n        </li>\n      </ul></div>\n\n    <div class=\"section level2\">\n      <h2 id=\"citation\">Citation</h2>\n      <p><small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/DESCRIPTION\" class=\"external-link\"><code>DESCRIPTION</code></a></small></p>\n\n      <p>Hugh-Jones D (2026).\n<em>santoku: A Versatile Cutting Tool</em>.\nR package version 1.2.0, <a href=\"https://github.com/hughjonesd/santoku\" class=\"external-link\">https://github.com/hughjonesd/santoku</a>.\n</p>\n      <pre>@Manual{,\n  title = {santoku: A Versatile Cutting Tool},\n  author = {David Hugh-Jones},\n  year = {2026},\n  note = {R package version 1.2.0},\n  url = {https://github.com/hughjonesd/santoku},\n}</pre>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/authors.md",
    "content": "# Authors and Citation\n\n## Authors\n\n- **David Hugh-Jones**. Author, maintainer.\n\n- **Daniel Possenriede**. Contributor.\n\n## Citation\n\nSource:\n[`DESCRIPTION`](https://github.com/hughjonesd/santoku/blob/HEAD/DESCRIPTION)\n\nHugh-Jones D (2026). *santoku: A Versatile Cutting Tool*. R package\nversion 1.2.0, <https://github.com/hughjonesd/santoku>.\n\n    @Manual{,\n      title = {santoku: A Versatile Cutting Tool},\n      author = {David Hugh-Jones},\n      year = {2026},\n      note = {R package version 1.2.0},\n      url = {https://github.com/hughjonesd/santoku},\n    }\n"
  },
  {
    "path": "docs/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": "docs/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": "docs/deps/_Courier Prime-0.4.0/font.css",
    "content": "@font-face {\n  font-family: 'Courier Prime';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(u-450q2lgwslOqpF_6gQ8kELWwU.woff) format('woff');\n}\n"
  },
  {
    "path": "docs/deps/bootstrap-5.1.0/font.css",
    "content": "@font-face {\n  font-family: 'Lato';\n  font-style: italic;\n  font-weight: 400;\n  font-display: swap;\n  src: url(fonts/S6u8w4BMUTPHjxswWA.woff) format('woff');\n}\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(fonts/S6uyw4BMUTPHvxo.woff) format('woff');\n}\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 700;\n  font-display: swap;\n  src: url(fonts/S6u9w4BMUTPHh6UVeww.woff) format('woff');\n}\n"
  },
  {
    "path": "docs/deps/bootstrap-5.1.3/font.css",
    "content": "@font-face {\n  font-family: 'Lato';\n  font-style: italic;\n  font-weight: 400;\n  font-display: swap;\n  src: url(fonts/S6u8w4BMUTPHjxswWA.woff) format('woff');\n}\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(fonts/S6uyw4BMUTPHvxo.woff) format('woff');\n}\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 700;\n  font-display: swap;\n  src: url(fonts/S6u9w4BMUTPHh6UVeww.woff) format('woff');\n}\n"
  },
  {
    "path": "docs/deps/bootstrap-5.2.2/font.css",
    "content": "@font-face {\n  font-family: 'Lato';\n  font-style: italic;\n  font-weight: 400;\n  font-display: swap;\n  src: url(fonts/S6u8w4BMUTPHjxswWA.woff) format('woff');\n}\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(fonts/S6uyw4BMUTPHvxo.woff) format('woff');\n}\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 700;\n  font-display: swap;\n  src: url(fonts/S6u9w4BMUTPHh6UVeww.woff) format('woff');\n}\n"
  },
  {
    "path": "docs/deps/bootstrap-5.3.1/font.css",
    "content": "/* latin-ext */\n@font-face {\n  font-family: 'Lato';\n  font-style: italic;\n  font-weight: 400;\n  font-display: swap;\n  src: url(fonts/S6u8w4BMUTPHjxsAUi-qJCY.woff2) format('woff2');\n  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n  font-family: 'Lato';\n  font-style: italic;\n  font-weight: 400;\n  font-display: swap;\n  src: url(fonts/S6u8w4BMUTPHjxsAXC-q.woff2) format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* latin-ext */\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(fonts/S6uyw4BMUTPHjxAwXjeu.woff2) format('woff2');\n  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 400;\n  font-display: swap;\n  src: url(fonts/S6uyw4BMUTPHjx4wXg.woff2) format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* latin-ext */\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 700;\n  font-display: swap;\n  src: url(fonts/S6u9w4BMUTPHh6UVSwaPGR_p.woff2) format('woff2');\n  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 700;\n  font-display: swap;\n  src: url(fonts/S6u9w4BMUTPHh6UVSwiPGQ.woff2) format('woff2');\n  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n"
  },
  {
    "path": "docs/deps/data-deps.txt",
    "content": "<script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\" />\n<link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\" />\n<script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script>\n<link href=\"deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\" />\n<link href=\"deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\" />\n<script src=\"deps/headroom-0.11.0/headroom.min.js\"></script>\n<script src=\"deps/headroom-0.11.0/jQuery.headroom.min.js\"></script>\n<script src=\"deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script>\n<script src=\"deps/clipboard.js-2.0.11/clipboard.min.js\"></script>\n<script src=\"deps/search-1.0.0/autocomplete.jquery.min.js\"></script>\n<script src=\"deps/search-1.0.0/fuse.min.js\"></script>\n<script src=\"deps/search-1.0.0/mark.min.js\"></script>\n"
  },
  {
    "path": "docs/deps/font-awesome-6.5.2/css/all.css",
    "content": "/*!\n * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n * Copyright 2024 Fonticons, Inc.\n */\n.fa {\n  font-family: var(--fa-style-family, \"Font Awesome 6 Free\");\n  font-weight: var(--fa-style, 900); }\n\n.fa,\n.fa-classic,\n.fa-sharp,\n.fas,\n.fa-solid,\n.far,\n.fa-regular,\n.fab,\n.fa-brands {\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  display: var(--fa-display, inline-block);\n  font-style: normal;\n  font-variant: normal;\n  line-height: 1;\n  text-rendering: auto; }\n\n.fas,\n.fa-classic,\n.fa-solid,\n.far,\n.fa-regular {\n  font-family: 'Font Awesome 6 Free'; }\n\n.fab,\n.fa-brands {\n  font-family: 'Font Awesome 6 Brands'; }\n\n.fa-1x {\n  font-size: 1em; }\n\n.fa-2x {\n  font-size: 2em; }\n\n.fa-3x {\n  font-size: 3em; }\n\n.fa-4x {\n  font-size: 4em; }\n\n.fa-5x {\n  font-size: 5em; }\n\n.fa-6x {\n  font-size: 6em; }\n\n.fa-7x {\n  font-size: 7em; }\n\n.fa-8x {\n  font-size: 8em; }\n\n.fa-9x {\n  font-size: 9em; }\n\n.fa-10x {\n  font-size: 10em; }\n\n.fa-2xs {\n  font-size: 0.625em;\n  line-height: 0.1em;\n  vertical-align: 0.225em; }\n\n.fa-xs {\n  font-size: 0.75em;\n  line-height: 0.08333em;\n  vertical-align: 0.125em; }\n\n.fa-sm {\n  font-size: 0.875em;\n  line-height: 0.07143em;\n  vertical-align: 0.05357em; }\n\n.fa-lg {\n  font-size: 1.25em;\n  line-height: 0.05em;\n  vertical-align: -0.075em; }\n\n.fa-xl {\n  font-size: 1.5em;\n  line-height: 0.04167em;\n  vertical-align: -0.125em; }\n\n.fa-2xl {\n  font-size: 2em;\n  line-height: 0.03125em;\n  vertical-align: -0.1875em; }\n\n.fa-fw {\n  text-align: center;\n  width: 1.25em; }\n\n.fa-ul {\n  list-style-type: none;\n  margin-left: var(--fa-li-margin, 2.5em);\n  padding-left: 0; }\n  .fa-ul > li {\n    position: relative; }\n\n.fa-li {\n  left: calc(var(--fa-li-width, 2em) * -1);\n  position: absolute;\n  text-align: center;\n  width: var(--fa-li-width, 2em);\n  line-height: inherit; }\n\n.fa-border {\n  border-color: var(--fa-border-color, #eee);\n  border-radius: var(--fa-border-radius, 0.1em);\n  border-style: var(--fa-border-style, solid);\n  border-width: var(--fa-border-width, 0.08em);\n  padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); }\n\n.fa-pull-left {\n  float: left;\n  margin-right: var(--fa-pull-margin, 0.3em); }\n\n.fa-pull-right {\n  float: right;\n  margin-left: var(--fa-pull-margin, 0.3em); }\n\n.fa-beat {\n  -webkit-animation-name: fa-beat;\n          animation-name: fa-beat;\n  -webkit-animation-delay: var(--fa-animation-delay, 0s);\n          animation-delay: var(--fa-animation-delay, 0s);\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\n          animation-direction: var(--fa-animation-direction, normal);\n  -webkit-animation-duration: var(--fa-animation-duration, 1s);\n          animation-duration: var(--fa-animation-duration, 1s);\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n  -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);\n          animation-timing-function: var(--fa-animation-timing, ease-in-out); }\n\n.fa-bounce {\n  -webkit-animation-name: fa-bounce;\n          animation-name: fa-bounce;\n  -webkit-animation-delay: var(--fa-animation-delay, 0s);\n          animation-delay: var(--fa-animation-delay, 0s);\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\n          animation-direction: var(--fa-animation-direction, normal);\n  -webkit-animation-duration: var(--fa-animation-duration, 1s);\n          animation-duration: var(--fa-animation-duration, 1s);\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n  -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\n          animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }\n\n.fa-fade {\n  -webkit-animation-name: fa-fade;\n          animation-name: fa-fade;\n  -webkit-animation-delay: var(--fa-animation-delay, 0s);\n          animation-delay: var(--fa-animation-delay, 0s);\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\n          animation-direction: var(--fa-animation-direction, normal);\n  -webkit-animation-duration: var(--fa-animation-duration, 1s);\n          animation-duration: var(--fa-animation-duration, 1s);\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n  -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\n          animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }\n\n.fa-beat-fade {\n  -webkit-animation-name: fa-beat-fade;\n          animation-name: fa-beat-fade;\n  -webkit-animation-delay: var(--fa-animation-delay, 0s);\n          animation-delay: var(--fa-animation-delay, 0s);\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\n          animation-direction: var(--fa-animation-direction, normal);\n  -webkit-animation-duration: var(--fa-animation-duration, 1s);\n          animation-duration: var(--fa-animation-duration, 1s);\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n  -webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\n          animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }\n\n.fa-flip {\n  -webkit-animation-name: fa-flip;\n          animation-name: fa-flip;\n  -webkit-animation-delay: var(--fa-animation-delay, 0s);\n          animation-delay: var(--fa-animation-delay, 0s);\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\n          animation-direction: var(--fa-animation-direction, normal);\n  -webkit-animation-duration: var(--fa-animation-duration, 1s);\n          animation-duration: var(--fa-animation-duration, 1s);\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n  -webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);\n          animation-timing-function: var(--fa-animation-timing, ease-in-out); }\n\n.fa-shake {\n  -webkit-animation-name: fa-shake;\n          animation-name: fa-shake;\n  -webkit-animation-delay: var(--fa-animation-delay, 0s);\n          animation-delay: var(--fa-animation-delay, 0s);\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\n          animation-direction: var(--fa-animation-direction, normal);\n  -webkit-animation-duration: var(--fa-animation-duration, 1s);\n          animation-duration: var(--fa-animation-duration, 1s);\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n  -webkit-animation-timing-function: var(--fa-animation-timing, linear);\n          animation-timing-function: var(--fa-animation-timing, linear); }\n\n.fa-spin {\n  -webkit-animation-name: fa-spin;\n          animation-name: fa-spin;\n  -webkit-animation-delay: var(--fa-animation-delay, 0s);\n          animation-delay: var(--fa-animation-delay, 0s);\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\n          animation-direction: var(--fa-animation-direction, normal);\n  -webkit-animation-duration: var(--fa-animation-duration, 2s);\n          animation-duration: var(--fa-animation-duration, 2s);\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n  -webkit-animation-timing-function: var(--fa-animation-timing, linear);\n          animation-timing-function: var(--fa-animation-timing, linear); }\n\n.fa-spin-reverse {\n  --fa-animation-direction: reverse; }\n\n.fa-pulse,\n.fa-spin-pulse {\n  -webkit-animation-name: fa-spin;\n          animation-name: fa-spin;\n  -webkit-animation-direction: var(--fa-animation-direction, normal);\n          animation-direction: var(--fa-animation-direction, normal);\n  -webkit-animation-duration: var(--fa-animation-duration, 1s);\n          animation-duration: var(--fa-animation-duration, 1s);\n  -webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n          animation-iteration-count: var(--fa-animation-iteration-count, infinite);\n  -webkit-animation-timing-function: var(--fa-animation-timing, steps(8));\n          animation-timing-function: var(--fa-animation-timing, steps(8)); }\n\n@media (prefers-reduced-motion: reduce) {\n  .fa-beat,\n  .fa-bounce,\n  .fa-fade,\n  .fa-beat-fade,\n  .fa-flip,\n  .fa-pulse,\n  .fa-shake,\n  .fa-spin,\n  .fa-spin-pulse {\n    -webkit-animation-delay: -1ms;\n            animation-delay: -1ms;\n    -webkit-animation-duration: 1ms;\n            animation-duration: 1ms;\n    -webkit-animation-iteration-count: 1;\n            animation-iteration-count: 1;\n    -webkit-transition-delay: 0s;\n            transition-delay: 0s;\n    -webkit-transition-duration: 0s;\n            transition-duration: 0s; } }\n\n@-webkit-keyframes fa-beat {\n  0%, 90% {\n    -webkit-transform: scale(1);\n            transform: scale(1); }\n  45% {\n    -webkit-transform: scale(var(--fa-beat-scale, 1.25));\n            transform: scale(var(--fa-beat-scale, 1.25)); } }\n\n@keyframes fa-beat {\n  0%, 90% {\n    -webkit-transform: scale(1);\n            transform: scale(1); }\n  45% {\n    -webkit-transform: scale(var(--fa-beat-scale, 1.25));\n            transform: scale(var(--fa-beat-scale, 1.25)); } }\n\n@-webkit-keyframes fa-bounce {\n  0% {\n    -webkit-transform: scale(1, 1) translateY(0);\n            transform: scale(1, 1) translateY(0); }\n  10% {\n    -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\n            transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }\n  30% {\n    -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\n            transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }\n  50% {\n    -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\n            transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }\n  57% {\n    -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\n            transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }\n  64% {\n    -webkit-transform: scale(1, 1) translateY(0);\n            transform: scale(1, 1) translateY(0); }\n  100% {\n    -webkit-transform: scale(1, 1) translateY(0);\n            transform: scale(1, 1) translateY(0); } }\n\n@keyframes fa-bounce {\n  0% {\n    -webkit-transform: scale(1, 1) translateY(0);\n            transform: scale(1, 1) translateY(0); }\n  10% {\n    -webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\n            transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }\n  30% {\n    -webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\n            transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }\n  50% {\n    -webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\n            transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }\n  57% {\n    -webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\n            transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }\n  64% {\n    -webkit-transform: scale(1, 1) translateY(0);\n            transform: scale(1, 1) translateY(0); }\n  100% {\n    -webkit-transform: scale(1, 1) translateY(0);\n            transform: scale(1, 1) translateY(0); } }\n\n@-webkit-keyframes fa-fade {\n  50% {\n    opacity: var(--fa-fade-opacity, 0.4); } }\n\n@keyframes fa-fade {\n  50% {\n    opacity: var(--fa-fade-opacity, 0.4); } }\n\n@-webkit-keyframes fa-beat-fade {\n  0%, 100% {\n    opacity: var(--fa-beat-fade-opacity, 0.4);\n    -webkit-transform: scale(1);\n            transform: scale(1); }\n  50% {\n    opacity: 1;\n    -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));\n            transform: scale(var(--fa-beat-fade-scale, 1.125)); } }\n\n@keyframes fa-beat-fade {\n  0%, 100% {\n    opacity: var(--fa-beat-fade-opacity, 0.4);\n    -webkit-transform: scale(1);\n            transform: scale(1); }\n  50% {\n    opacity: 1;\n    -webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));\n            transform: scale(var(--fa-beat-fade-scale, 1.125)); } }\n\n@-webkit-keyframes fa-flip {\n  50% {\n    -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\n            transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }\n\n@keyframes fa-flip {\n  50% {\n    -webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\n            transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }\n\n@-webkit-keyframes fa-shake {\n  0% {\n    -webkit-transform: rotate(-15deg);\n            transform: rotate(-15deg); }\n  4% {\n    -webkit-transform: rotate(15deg);\n            transform: rotate(15deg); }\n  8%, 24% {\n    -webkit-transform: rotate(-18deg);\n            transform: rotate(-18deg); }\n  12%, 28% {\n    -webkit-transform: rotate(18deg);\n            transform: rotate(18deg); }\n  16% {\n    -webkit-transform: rotate(-22deg);\n            transform: rotate(-22deg); }\n  20% {\n    -webkit-transform: rotate(22deg);\n            transform: rotate(22deg); }\n  32% {\n    -webkit-transform: rotate(-12deg);\n            transform: rotate(-12deg); }\n  36% {\n    -webkit-transform: rotate(12deg);\n            transform: rotate(12deg); }\n  40%, 100% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg); } }\n\n@keyframes fa-shake {\n  0% {\n    -webkit-transform: rotate(-15deg);\n            transform: rotate(-15deg); }\n  4% {\n    -webkit-transform: rotate(15deg);\n            transform: rotate(15deg); }\n  8%, 24% {\n    -webkit-transform: rotate(-18deg);\n            transform: rotate(-18deg); }\n  12%, 28% {\n    -webkit-transform: rotate(18deg);\n            transform: rotate(18deg); }\n  16% {\n    -webkit-transform: rotate(-22deg);\n            transform: rotate(-22deg); }\n  20% {\n    -webkit-transform: rotate(22deg);\n            transform: rotate(22deg); }\n  32% {\n    -webkit-transform: rotate(-12deg);\n            transform: rotate(-12deg); }\n  36% {\n    -webkit-transform: rotate(12deg);\n            transform: rotate(12deg); }\n  40%, 100% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg); } }\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg); }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg); } }\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg); }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg); } }\n\n.fa-rotate-90 {\n  -webkit-transform: rotate(90deg);\n          transform: rotate(90deg); }\n\n.fa-rotate-180 {\n  -webkit-transform: rotate(180deg);\n          transform: rotate(180deg); }\n\n.fa-rotate-270 {\n  -webkit-transform: rotate(270deg);\n          transform: rotate(270deg); }\n\n.fa-flip-horizontal {\n  -webkit-transform: scale(-1, 1);\n          transform: scale(-1, 1); }\n\n.fa-flip-vertical {\n  -webkit-transform: scale(1, -1);\n          transform: scale(1, -1); }\n\n.fa-flip-both,\n.fa-flip-horizontal.fa-flip-vertical {\n  -webkit-transform: scale(-1, -1);\n          transform: scale(-1, -1); }\n\n.fa-rotate-by {\n  -webkit-transform: rotate(var(--fa-rotate-angle, 0));\n          transform: rotate(var(--fa-rotate-angle, 0)); }\n\n.fa-stack {\n  display: inline-block;\n  height: 2em;\n  line-height: 2em;\n  position: relative;\n  vertical-align: middle;\n  width: 2.5em; }\n\n.fa-stack-1x,\n.fa-stack-2x {\n  left: 0;\n  position: absolute;\n  text-align: center;\n  width: 100%;\n  z-index: var(--fa-stack-z-index, auto); }\n\n.fa-stack-1x {\n  line-height: inherit; }\n\n.fa-stack-2x {\n  font-size: 2em; }\n\n.fa-inverse {\n  color: var(--fa-inverse, #fff); }\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\nreaders do not read off random characters that represent icons */\n\n.fa-0::before {\n  content: \"\\30\"; }\n\n.fa-1::before {\n  content: \"\\31\"; }\n\n.fa-2::before {\n  content: \"\\32\"; }\n\n.fa-3::before {\n  content: \"\\33\"; }\n\n.fa-4::before {\n  content: \"\\34\"; }\n\n.fa-5::before {\n  content: \"\\35\"; }\n\n.fa-6::before {\n  content: \"\\36\"; }\n\n.fa-7::before {\n  content: \"\\37\"; }\n\n.fa-8::before {\n  content: \"\\38\"; }\n\n.fa-9::before {\n  content: \"\\39\"; }\n\n.fa-fill-drip::before {\n  content: \"\\f576\"; }\n\n.fa-arrows-to-circle::before {\n  content: \"\\e4bd\"; }\n\n.fa-circle-chevron-right::before {\n  content: \"\\f138\"; }\n\n.fa-chevron-circle-right::before {\n  content: \"\\f138\"; }\n\n.fa-at::before {\n  content: \"\\40\"; }\n\n.fa-trash-can::before {\n  content: \"\\f2ed\"; }\n\n.fa-trash-alt::before {\n  content: \"\\f2ed\"; }\n\n.fa-text-height::before {\n  content: \"\\f034\"; }\n\n.fa-user-xmark::before {\n  content: \"\\f235\"; }\n\n.fa-user-times::before {\n  content: \"\\f235\"; }\n\n.fa-stethoscope::before {\n  content: \"\\f0f1\"; }\n\n.fa-message::before {\n  content: \"\\f27a\"; }\n\n.fa-comment-alt::before {\n  content: \"\\f27a\"; }\n\n.fa-info::before {\n  content: \"\\f129\"; }\n\n.fa-down-left-and-up-right-to-center::before {\n  content: \"\\f422\"; }\n\n.fa-compress-alt::before {\n  content: \"\\f422\"; }\n\n.fa-explosion::before {\n  content: \"\\e4e9\"; }\n\n.fa-file-lines::before {\n  content: \"\\f15c\"; }\n\n.fa-file-alt::before {\n  content: \"\\f15c\"; }\n\n.fa-file-text::before {\n  content: \"\\f15c\"; }\n\n.fa-wave-square::before {\n  content: \"\\f83e\"; }\n\n.fa-ring::before {\n  content: \"\\f70b\"; }\n\n.fa-building-un::before {\n  content: \"\\e4d9\"; }\n\n.fa-dice-three::before {\n  content: \"\\f527\"; }\n\n.fa-calendar-days::before {\n  content: \"\\f073\"; }\n\n.fa-calendar-alt::before {\n  content: \"\\f073\"; }\n\n.fa-anchor-circle-check::before {\n  content: \"\\e4aa\"; }\n\n.fa-building-circle-arrow-right::before {\n  content: \"\\e4d1\"; }\n\n.fa-volleyball::before {\n  content: \"\\f45f\"; }\n\n.fa-volleyball-ball::before {\n  content: \"\\f45f\"; }\n\n.fa-arrows-up-to-line::before {\n  content: \"\\e4c2\"; }\n\n.fa-sort-down::before {\n  content: \"\\f0dd\"; }\n\n.fa-sort-desc::before {\n  content: \"\\f0dd\"; }\n\n.fa-circle-minus::before {\n  content: \"\\f056\"; }\n\n.fa-minus-circle::before {\n  content: \"\\f056\"; }\n\n.fa-door-open::before {\n  content: \"\\f52b\"; }\n\n.fa-right-from-bracket::before {\n  content: \"\\f2f5\"; }\n\n.fa-sign-out-alt::before {\n  content: \"\\f2f5\"; }\n\n.fa-atom::before {\n  content: \"\\f5d2\"; }\n\n.fa-soap::before {\n  content: \"\\e06e\"; }\n\n.fa-icons::before {\n  content: \"\\f86d\"; }\n\n.fa-heart-music-camera-bolt::before {\n  content: \"\\f86d\"; }\n\n.fa-microphone-lines-slash::before {\n  content: \"\\f539\"; }\n\n.fa-microphone-alt-slash::before {\n  content: \"\\f539\"; }\n\n.fa-bridge-circle-check::before {\n  content: \"\\e4c9\"; }\n\n.fa-pump-medical::before {\n  content: \"\\e06a\"; }\n\n.fa-fingerprint::before {\n  content: \"\\f577\"; }\n\n.fa-hand-point-right::before {\n  content: \"\\f0a4\"; }\n\n.fa-magnifying-glass-location::before {\n  content: \"\\f689\"; }\n\n.fa-search-location::before {\n  content: \"\\f689\"; }\n\n.fa-forward-step::before {\n  content: \"\\f051\"; }\n\n.fa-step-forward::before {\n  content: \"\\f051\"; }\n\n.fa-face-smile-beam::before {\n  content: \"\\f5b8\"; }\n\n.fa-smile-beam::before {\n  content: \"\\f5b8\"; }\n\n.fa-flag-checkered::before {\n  content: \"\\f11e\"; }\n\n.fa-football::before {\n  content: \"\\f44e\"; }\n\n.fa-football-ball::before {\n  content: \"\\f44e\"; }\n\n.fa-school-circle-exclamation::before {\n  content: \"\\e56c\"; }\n\n.fa-crop::before {\n  content: \"\\f125\"; }\n\n.fa-angles-down::before {\n  content: \"\\f103\"; }\n\n.fa-angle-double-down::before {\n  content: \"\\f103\"; }\n\n.fa-users-rectangle::before {\n  content: \"\\e594\"; }\n\n.fa-people-roof::before {\n  content: \"\\e537\"; }\n\n.fa-people-line::before {\n  content: \"\\e534\"; }\n\n.fa-beer-mug-empty::before {\n  content: \"\\f0fc\"; }\n\n.fa-beer::before {\n  content: \"\\f0fc\"; }\n\n.fa-diagram-predecessor::before {\n  content: \"\\e477\"; }\n\n.fa-arrow-up-long::before {\n  content: \"\\f176\"; }\n\n.fa-long-arrow-up::before {\n  content: \"\\f176\"; }\n\n.fa-fire-flame-simple::before {\n  content: \"\\f46a\"; }\n\n.fa-burn::before {\n  content: \"\\f46a\"; }\n\n.fa-person::before {\n  content: \"\\f183\"; }\n\n.fa-male::before {\n  content: \"\\f183\"; }\n\n.fa-laptop::before {\n  content: \"\\f109\"; }\n\n.fa-file-csv::before {\n  content: \"\\f6dd\"; }\n\n.fa-menorah::before {\n  content: \"\\f676\"; }\n\n.fa-truck-plane::before {\n  content: \"\\e58f\"; }\n\n.fa-record-vinyl::before {\n  content: \"\\f8d9\"; }\n\n.fa-face-grin-stars::before {\n  content: \"\\f587\"; }\n\n.fa-grin-stars::before {\n  content: \"\\f587\"; }\n\n.fa-bong::before {\n  content: \"\\f55c\"; }\n\n.fa-spaghetti-monster-flying::before {\n  content: \"\\f67b\"; }\n\n.fa-pastafarianism::before {\n  content: \"\\f67b\"; }\n\n.fa-arrow-down-up-across-line::before {\n  content: \"\\e4af\"; }\n\n.fa-spoon::before {\n  content: \"\\f2e5\"; }\n\n.fa-utensil-spoon::before {\n  content: \"\\f2e5\"; }\n\n.fa-jar-wheat::before {\n  content: \"\\e517\"; }\n\n.fa-envelopes-bulk::before {\n  content: \"\\f674\"; }\n\n.fa-mail-bulk::before {\n  content: \"\\f674\"; }\n\n.fa-file-circle-exclamation::before {\n  content: \"\\e4eb\"; }\n\n.fa-circle-h::before {\n  content: \"\\f47e\"; }\n\n.fa-hospital-symbol::before {\n  content: \"\\f47e\"; }\n\n.fa-pager::before {\n  content: \"\\f815\"; }\n\n.fa-address-book::before {\n  content: \"\\f2b9\"; }\n\n.fa-contact-book::before {\n  content: \"\\f2b9\"; }\n\n.fa-strikethrough::before {\n  content: \"\\f0cc\"; }\n\n.fa-k::before {\n  content: \"\\4b\"; }\n\n.fa-landmark-flag::before {\n  content: \"\\e51c\"; }\n\n.fa-pencil::before {\n  content: \"\\f303\"; }\n\n.fa-pencil-alt::before {\n  content: \"\\f303\"; }\n\n.fa-backward::before {\n  content: \"\\f04a\"; }\n\n.fa-caret-right::before {\n  content: \"\\f0da\"; }\n\n.fa-comments::before {\n  content: \"\\f086\"; }\n\n.fa-paste::before {\n  content: \"\\f0ea\"; }\n\n.fa-file-clipboard::before {\n  content: \"\\f0ea\"; }\n\n.fa-code-pull-request::before {\n  content: \"\\e13c\"; }\n\n.fa-clipboard-list::before {\n  content: \"\\f46d\"; }\n\n.fa-truck-ramp-box::before {\n  content: \"\\f4de\"; }\n\n.fa-truck-loading::before {\n  content: \"\\f4de\"; }\n\n.fa-user-check::before {\n  content: \"\\f4fc\"; }\n\n.fa-vial-virus::before {\n  content: \"\\e597\"; }\n\n.fa-sheet-plastic::before {\n  content: \"\\e571\"; }\n\n.fa-blog::before {\n  content: \"\\f781\"; }\n\n.fa-user-ninja::before {\n  content: \"\\f504\"; }\n\n.fa-person-arrow-up-from-line::before {\n  content: \"\\e539\"; }\n\n.fa-scroll-torah::before {\n  content: \"\\f6a0\"; }\n\n.fa-torah::before {\n  content: \"\\f6a0\"; }\n\n.fa-broom-ball::before {\n  content: \"\\f458\"; }\n\n.fa-quidditch::before {\n  content: \"\\f458\"; }\n\n.fa-quidditch-broom-ball::before {\n  content: \"\\f458\"; }\n\n.fa-toggle-off::before {\n  content: \"\\f204\"; }\n\n.fa-box-archive::before {\n  content: \"\\f187\"; }\n\n.fa-archive::before {\n  content: \"\\f187\"; }\n\n.fa-person-drowning::before {\n  content: \"\\e545\"; }\n\n.fa-arrow-down-9-1::before {\n  content: \"\\f886\"; }\n\n.fa-sort-numeric-desc::before {\n  content: \"\\f886\"; }\n\n.fa-sort-numeric-down-alt::before {\n  content: \"\\f886\"; }\n\n.fa-face-grin-tongue-squint::before {\n  content: \"\\f58a\"; }\n\n.fa-grin-tongue-squint::before {\n  content: \"\\f58a\"; }\n\n.fa-spray-can::before {\n  content: \"\\f5bd\"; }\n\n.fa-truck-monster::before {\n  content: \"\\f63b\"; }\n\n.fa-w::before {\n  content: \"\\57\"; }\n\n.fa-earth-africa::before {\n  content: \"\\f57c\"; }\n\n.fa-globe-africa::before {\n  content: \"\\f57c\"; }\n\n.fa-rainbow::before {\n  content: \"\\f75b\"; }\n\n.fa-circle-notch::before {\n  content: \"\\f1ce\"; }\n\n.fa-tablet-screen-button::before {\n  content: \"\\f3fa\"; }\n\n.fa-tablet-alt::before {\n  content: \"\\f3fa\"; }\n\n.fa-paw::before {\n  content: \"\\f1b0\"; }\n\n.fa-cloud::before {\n  content: \"\\f0c2\"; }\n\n.fa-trowel-bricks::before {\n  content: \"\\e58a\"; }\n\n.fa-face-flushed::before {\n  content: \"\\f579\"; }\n\n.fa-flushed::before {\n  content: \"\\f579\"; }\n\n.fa-hospital-user::before {\n  content: \"\\f80d\"; }\n\n.fa-tent-arrow-left-right::before {\n  content: \"\\e57f\"; }\n\n.fa-gavel::before {\n  content: \"\\f0e3\"; }\n\n.fa-legal::before {\n  content: \"\\f0e3\"; }\n\n.fa-binoculars::before {\n  content: \"\\f1e5\"; }\n\n.fa-microphone-slash::before {\n  content: \"\\f131\"; }\n\n.fa-box-tissue::before {\n  content: \"\\e05b\"; }\n\n.fa-motorcycle::before {\n  content: \"\\f21c\"; }\n\n.fa-bell-concierge::before {\n  content: \"\\f562\"; }\n\n.fa-concierge-bell::before {\n  content: \"\\f562\"; }\n\n.fa-pen-ruler::before {\n  content: \"\\f5ae\"; }\n\n.fa-pencil-ruler::before {\n  content: \"\\f5ae\"; }\n\n.fa-people-arrows::before {\n  content: \"\\e068\"; }\n\n.fa-people-arrows-left-right::before {\n  content: \"\\e068\"; }\n\n.fa-mars-and-venus-burst::before {\n  content: \"\\e523\"; }\n\n.fa-square-caret-right::before {\n  content: \"\\f152\"; }\n\n.fa-caret-square-right::before {\n  content: \"\\f152\"; }\n\n.fa-scissors::before {\n  content: \"\\f0c4\"; }\n\n.fa-cut::before {\n  content: \"\\f0c4\"; }\n\n.fa-sun-plant-wilt::before {\n  content: \"\\e57a\"; }\n\n.fa-toilets-portable::before {\n  content: \"\\e584\"; }\n\n.fa-hockey-puck::before {\n  content: \"\\f453\"; }\n\n.fa-table::before {\n  content: \"\\f0ce\"; }\n\n.fa-magnifying-glass-arrow-right::before {\n  content: \"\\e521\"; }\n\n.fa-tachograph-digital::before {\n  content: \"\\f566\"; }\n\n.fa-digital-tachograph::before {\n  content: \"\\f566\"; }\n\n.fa-users-slash::before {\n  content: \"\\e073\"; }\n\n.fa-clover::before {\n  content: \"\\e139\"; }\n\n.fa-reply::before {\n  content: \"\\f3e5\"; }\n\n.fa-mail-reply::before {\n  content: \"\\f3e5\"; }\n\n.fa-star-and-crescent::before {\n  content: \"\\f699\"; }\n\n.fa-house-fire::before {\n  content: \"\\e50c\"; }\n\n.fa-square-minus::before {\n  content: \"\\f146\"; }\n\n.fa-minus-square::before {\n  content: \"\\f146\"; }\n\n.fa-helicopter::before {\n  content: \"\\f533\"; }\n\n.fa-compass::before {\n  content: \"\\f14e\"; }\n\n.fa-square-caret-down::before {\n  content: \"\\f150\"; }\n\n.fa-caret-square-down::before {\n  content: \"\\f150\"; }\n\n.fa-file-circle-question::before {\n  content: \"\\e4ef\"; }\n\n.fa-laptop-code::before {\n  content: \"\\f5fc\"; }\n\n.fa-swatchbook::before {\n  content: \"\\f5c3\"; }\n\n.fa-prescription-bottle::before {\n  content: \"\\f485\"; }\n\n.fa-bars::before {\n  content: \"\\f0c9\"; }\n\n.fa-navicon::before {\n  content: \"\\f0c9\"; }\n\n.fa-people-group::before {\n  content: \"\\e533\"; }\n\n.fa-hourglass-end::before {\n  content: \"\\f253\"; }\n\n.fa-hourglass-3::before {\n  content: \"\\f253\"; }\n\n.fa-heart-crack::before {\n  content: \"\\f7a9\"; }\n\n.fa-heart-broken::before {\n  content: \"\\f7a9\"; }\n\n.fa-square-up-right::before {\n  content: \"\\f360\"; }\n\n.fa-external-link-square-alt::before {\n  content: \"\\f360\"; }\n\n.fa-face-kiss-beam::before {\n  content: \"\\f597\"; }\n\n.fa-kiss-beam::before {\n  content: \"\\f597\"; }\n\n.fa-film::before {\n  content: \"\\f008\"; }\n\n.fa-ruler-horizontal::before {\n  content: \"\\f547\"; }\n\n.fa-people-robbery::before {\n  content: \"\\e536\"; }\n\n.fa-lightbulb::before {\n  content: \"\\f0eb\"; }\n\n.fa-caret-left::before {\n  content: \"\\f0d9\"; }\n\n.fa-circle-exclamation::before {\n  content: \"\\f06a\"; }\n\n.fa-exclamation-circle::before {\n  content: \"\\f06a\"; }\n\n.fa-school-circle-xmark::before {\n  content: \"\\e56d\"; }\n\n.fa-arrow-right-from-bracket::before {\n  content: \"\\f08b\"; }\n\n.fa-sign-out::before {\n  content: \"\\f08b\"; }\n\n.fa-circle-chevron-down::before {\n  content: \"\\f13a\"; }\n\n.fa-chevron-circle-down::before {\n  content: \"\\f13a\"; }\n\n.fa-unlock-keyhole::before {\n  content: \"\\f13e\"; }\n\n.fa-unlock-alt::before {\n  content: \"\\f13e\"; }\n\n.fa-cloud-showers-heavy::before {\n  content: \"\\f740\"; }\n\n.fa-headphones-simple::before {\n  content: \"\\f58f\"; }\n\n.fa-headphones-alt::before {\n  content: \"\\f58f\"; }\n\n.fa-sitemap::before {\n  content: \"\\f0e8\"; }\n\n.fa-circle-dollar-to-slot::before {\n  content: \"\\f4b9\"; }\n\n.fa-donate::before {\n  content: \"\\f4b9\"; }\n\n.fa-memory::before {\n  content: \"\\f538\"; }\n\n.fa-road-spikes::before {\n  content: \"\\e568\"; }\n\n.fa-fire-burner::before {\n  content: \"\\e4f1\"; }\n\n.fa-flag::before {\n  content: \"\\f024\"; }\n\n.fa-hanukiah::before {\n  content: \"\\f6e6\"; }\n\n.fa-feather::before {\n  content: \"\\f52d\"; }\n\n.fa-volume-low::before {\n  content: \"\\f027\"; }\n\n.fa-volume-down::before {\n  content: \"\\f027\"; }\n\n.fa-comment-slash::before {\n  content: \"\\f4b3\"; }\n\n.fa-cloud-sun-rain::before {\n  content: \"\\f743\"; }\n\n.fa-compress::before {\n  content: \"\\f066\"; }\n\n.fa-wheat-awn::before {\n  content: \"\\e2cd\"; }\n\n.fa-wheat-alt::before {\n  content: \"\\e2cd\"; }\n\n.fa-ankh::before {\n  content: \"\\f644\"; }\n\n.fa-hands-holding-child::before {\n  content: \"\\e4fa\"; }\n\n.fa-asterisk::before {\n  content: \"\\2a\"; }\n\n.fa-square-check::before {\n  content: \"\\f14a\"; }\n\n.fa-check-square::before {\n  content: \"\\f14a\"; }\n\n.fa-peseta-sign::before {\n  content: \"\\e221\"; }\n\n.fa-heading::before {\n  content: \"\\f1dc\"; }\n\n.fa-header::before {\n  content: \"\\f1dc\"; }\n\n.fa-ghost::before {\n  content: \"\\f6e2\"; }\n\n.fa-list::before {\n  content: \"\\f03a\"; }\n\n.fa-list-squares::before {\n  content: \"\\f03a\"; }\n\n.fa-square-phone-flip::before {\n  content: \"\\f87b\"; }\n\n.fa-phone-square-alt::before {\n  content: \"\\f87b\"; }\n\n.fa-cart-plus::before {\n  content: \"\\f217\"; }\n\n.fa-gamepad::before {\n  content: \"\\f11b\"; }\n\n.fa-circle-dot::before {\n  content: \"\\f192\"; }\n\n.fa-dot-circle::before {\n  content: \"\\f192\"; }\n\n.fa-face-dizzy::before {\n  content: \"\\f567\"; }\n\n.fa-dizzy::before {\n  content: \"\\f567\"; }\n\n.fa-egg::before {\n  content: \"\\f7fb\"; }\n\n.fa-house-medical-circle-xmark::before {\n  content: \"\\e513\"; }\n\n.fa-campground::before {\n  content: \"\\f6bb\"; }\n\n.fa-folder-plus::before {\n  content: \"\\f65e\"; }\n\n.fa-futbol::before {\n  content: \"\\f1e3\"; }\n\n.fa-futbol-ball::before {\n  content: \"\\f1e3\"; }\n\n.fa-soccer-ball::before {\n  content: \"\\f1e3\"; }\n\n.fa-paintbrush::before {\n  content: \"\\f1fc\"; }\n\n.fa-paint-brush::before {\n  content: \"\\f1fc\"; }\n\n.fa-lock::before {\n  content: \"\\f023\"; }\n\n.fa-gas-pump::before {\n  content: \"\\f52f\"; }\n\n.fa-hot-tub-person::before {\n  content: \"\\f593\"; }\n\n.fa-hot-tub::before {\n  content: \"\\f593\"; }\n\n.fa-map-location::before {\n  content: \"\\f59f\"; }\n\n.fa-map-marked::before {\n  content: \"\\f59f\"; }\n\n.fa-house-flood-water::before {\n  content: \"\\e50e\"; }\n\n.fa-tree::before {\n  content: \"\\f1bb\"; }\n\n.fa-bridge-lock::before {\n  content: \"\\e4cc\"; }\n\n.fa-sack-dollar::before {\n  content: \"\\f81d\"; }\n\n.fa-pen-to-square::before {\n  content: \"\\f044\"; }\n\n.fa-edit::before {\n  content: \"\\f044\"; }\n\n.fa-car-side::before {\n  content: \"\\f5e4\"; }\n\n.fa-share-nodes::before {\n  content: \"\\f1e0\"; }\n\n.fa-share-alt::before {\n  content: \"\\f1e0\"; }\n\n.fa-heart-circle-minus::before {\n  content: \"\\e4ff\"; }\n\n.fa-hourglass-half::before {\n  content: \"\\f252\"; }\n\n.fa-hourglass-2::before {\n  content: \"\\f252\"; }\n\n.fa-microscope::before {\n  content: \"\\f610\"; }\n\n.fa-sink::before {\n  content: \"\\e06d\"; }\n\n.fa-bag-shopping::before {\n  content: \"\\f290\"; }\n\n.fa-shopping-bag::before {\n  content: \"\\f290\"; }\n\n.fa-arrow-down-z-a::before {\n  content: \"\\f881\"; }\n\n.fa-sort-alpha-desc::before {\n  content: \"\\f881\"; }\n\n.fa-sort-alpha-down-alt::before {\n  content: \"\\f881\"; }\n\n.fa-mitten::before {\n  content: \"\\f7b5\"; }\n\n.fa-person-rays::before {\n  content: \"\\e54d\"; }\n\n.fa-users::before {\n  content: \"\\f0c0\"; }\n\n.fa-eye-slash::before {\n  content: \"\\f070\"; }\n\n.fa-flask-vial::before {\n  content: \"\\e4f3\"; }\n\n.fa-hand::before {\n  content: \"\\f256\"; }\n\n.fa-hand-paper::before {\n  content: \"\\f256\"; }\n\n.fa-om::before {\n  content: \"\\f679\"; }\n\n.fa-worm::before {\n  content: \"\\e599\"; }\n\n.fa-house-circle-xmark::before {\n  content: \"\\e50b\"; }\n\n.fa-plug::before {\n  content: \"\\f1e6\"; }\n\n.fa-chevron-up::before {\n  content: \"\\f077\"; }\n\n.fa-hand-spock::before {\n  content: \"\\f259\"; }\n\n.fa-stopwatch::before {\n  content: \"\\f2f2\"; }\n\n.fa-face-kiss::before {\n  content: \"\\f596\"; }\n\n.fa-kiss::before {\n  content: \"\\f596\"; }\n\n.fa-bridge-circle-xmark::before {\n  content: \"\\e4cb\"; }\n\n.fa-face-grin-tongue::before {\n  content: \"\\f589\"; }\n\n.fa-grin-tongue::before {\n  content: \"\\f589\"; }\n\n.fa-chess-bishop::before {\n  content: \"\\f43a\"; }\n\n.fa-face-grin-wink::before {\n  content: \"\\f58c\"; }\n\n.fa-grin-wink::before {\n  content: \"\\f58c\"; }\n\n.fa-ear-deaf::before {\n  content: \"\\f2a4\"; }\n\n.fa-deaf::before {\n  content: \"\\f2a4\"; }\n\n.fa-deafness::before {\n  content: \"\\f2a4\"; }\n\n.fa-hard-of-hearing::before {\n  content: \"\\f2a4\"; }\n\n.fa-road-circle-check::before {\n  content: \"\\e564\"; }\n\n.fa-dice-five::before {\n  content: \"\\f523\"; }\n\n.fa-square-rss::before {\n  content: \"\\f143\"; }\n\n.fa-rss-square::before {\n  content: \"\\f143\"; }\n\n.fa-land-mine-on::before {\n  content: \"\\e51b\"; }\n\n.fa-i-cursor::before {\n  content: \"\\f246\"; }\n\n.fa-stamp::before {\n  content: \"\\f5bf\"; }\n\n.fa-stairs::before {\n  content: \"\\e289\"; }\n\n.fa-i::before {\n  content: \"\\49\"; }\n\n.fa-hryvnia-sign::before {\n  content: \"\\f6f2\"; }\n\n.fa-hryvnia::before {\n  content: \"\\f6f2\"; }\n\n.fa-pills::before {\n  content: \"\\f484\"; }\n\n.fa-face-grin-wide::before {\n  content: \"\\f581\"; }\n\n.fa-grin-alt::before {\n  content: \"\\f581\"; }\n\n.fa-tooth::before {\n  content: \"\\f5c9\"; }\n\n.fa-v::before {\n  content: \"\\56\"; }\n\n.fa-bangladeshi-taka-sign::before {\n  content: \"\\e2e6\"; }\n\n.fa-bicycle::before {\n  content: \"\\f206\"; }\n\n.fa-staff-snake::before {\n  content: \"\\e579\"; }\n\n.fa-rod-asclepius::before {\n  content: \"\\e579\"; }\n\n.fa-rod-snake::before {\n  content: \"\\e579\"; }\n\n.fa-staff-aesculapius::before {\n  content: \"\\e579\"; }\n\n.fa-head-side-cough-slash::before {\n  content: \"\\e062\"; }\n\n.fa-truck-medical::before {\n  content: \"\\f0f9\"; }\n\n.fa-ambulance::before {\n  content: \"\\f0f9\"; }\n\n.fa-wheat-awn-circle-exclamation::before {\n  content: \"\\e598\"; }\n\n.fa-snowman::before {\n  content: \"\\f7d0\"; }\n\n.fa-mortar-pestle::before {\n  content: \"\\f5a7\"; }\n\n.fa-road-barrier::before {\n  content: \"\\e562\"; }\n\n.fa-school::before {\n  content: \"\\f549\"; }\n\n.fa-igloo::before {\n  content: \"\\f7ae\"; }\n\n.fa-joint::before {\n  content: \"\\f595\"; }\n\n.fa-angle-right::before {\n  content: \"\\f105\"; }\n\n.fa-horse::before {\n  content: \"\\f6f0\"; }\n\n.fa-q::before {\n  content: \"\\51\"; }\n\n.fa-g::before {\n  content: \"\\47\"; }\n\n.fa-notes-medical::before {\n  content: \"\\f481\"; }\n\n.fa-temperature-half::before {\n  content: \"\\f2c9\"; }\n\n.fa-temperature-2::before {\n  content: \"\\f2c9\"; }\n\n.fa-thermometer-2::before {\n  content: \"\\f2c9\"; }\n\n.fa-thermometer-half::before {\n  content: \"\\f2c9\"; }\n\n.fa-dong-sign::before {\n  content: \"\\e169\"; }\n\n.fa-capsules::before {\n  content: \"\\f46b\"; }\n\n.fa-poo-storm::before {\n  content: \"\\f75a\"; }\n\n.fa-poo-bolt::before {\n  content: \"\\f75a\"; }\n\n.fa-face-frown-open::before {\n  content: \"\\f57a\"; }\n\n.fa-frown-open::before {\n  content: \"\\f57a\"; }\n\n.fa-hand-point-up::before {\n  content: \"\\f0a6\"; }\n\n.fa-money-bill::before {\n  content: \"\\f0d6\"; }\n\n.fa-bookmark::before {\n  content: \"\\f02e\"; }\n\n.fa-align-justify::before {\n  content: \"\\f039\"; }\n\n.fa-umbrella-beach::before {\n  content: \"\\f5ca\"; }\n\n.fa-helmet-un::before {\n  content: \"\\e503\"; }\n\n.fa-bullseye::before {\n  content: \"\\f140\"; }\n\n.fa-bacon::before {\n  content: \"\\f7e5\"; }\n\n.fa-hand-point-down::before {\n  content: \"\\f0a7\"; }\n\n.fa-arrow-up-from-bracket::before {\n  content: \"\\e09a\"; }\n\n.fa-folder::before {\n  content: \"\\f07b\"; }\n\n.fa-folder-blank::before {\n  content: \"\\f07b\"; }\n\n.fa-file-waveform::before {\n  content: \"\\f478\"; }\n\n.fa-file-medical-alt::before {\n  content: \"\\f478\"; }\n\n.fa-radiation::before {\n  content: \"\\f7b9\"; }\n\n.fa-chart-simple::before {\n  content: \"\\e473\"; }\n\n.fa-mars-stroke::before {\n  content: \"\\f229\"; }\n\n.fa-vial::before {\n  content: \"\\f492\"; }\n\n.fa-gauge::before {\n  content: \"\\f624\"; }\n\n.fa-dashboard::before {\n  content: \"\\f624\"; }\n\n.fa-gauge-med::before {\n  content: \"\\f624\"; }\n\n.fa-tachometer-alt-average::before {\n  content: \"\\f624\"; }\n\n.fa-wand-magic-sparkles::before {\n  content: \"\\e2ca\"; }\n\n.fa-magic-wand-sparkles::before {\n  content: \"\\e2ca\"; }\n\n.fa-e::before {\n  content: \"\\45\"; }\n\n.fa-pen-clip::before {\n  content: \"\\f305\"; }\n\n.fa-pen-alt::before {\n  content: \"\\f305\"; }\n\n.fa-bridge-circle-exclamation::before {\n  content: \"\\e4ca\"; }\n\n.fa-user::before {\n  content: \"\\f007\"; }\n\n.fa-school-circle-check::before {\n  content: \"\\e56b\"; }\n\n.fa-dumpster::before {\n  content: \"\\f793\"; }\n\n.fa-van-shuttle::before {\n  content: \"\\f5b6\"; }\n\n.fa-shuttle-van::before {\n  content: \"\\f5b6\"; }\n\n.fa-building-user::before {\n  content: \"\\e4da\"; }\n\n.fa-square-caret-left::before {\n  content: \"\\f191\"; }\n\n.fa-caret-square-left::before {\n  content: \"\\f191\"; }\n\n.fa-highlighter::before {\n  content: \"\\f591\"; }\n\n.fa-key::before {\n  content: \"\\f084\"; }\n\n.fa-bullhorn::before {\n  content: \"\\f0a1\"; }\n\n.fa-globe::before {\n  content: \"\\f0ac\"; }\n\n.fa-synagogue::before {\n  content: \"\\f69b\"; }\n\n.fa-person-half-dress::before {\n  content: \"\\e548\"; }\n\n.fa-road-bridge::before {\n  content: \"\\e563\"; }\n\n.fa-location-arrow::before {\n  content: \"\\f124\"; }\n\n.fa-c::before {\n  content: \"\\43\"; }\n\n.fa-tablet-button::before {\n  content: \"\\f10a\"; }\n\n.fa-building-lock::before {\n  content: \"\\e4d6\"; }\n\n.fa-pizza-slice::before {\n  content: \"\\f818\"; }\n\n.fa-money-bill-wave::before {\n  content: \"\\f53a\"; }\n\n.fa-chart-area::before {\n  content: \"\\f1fe\"; }\n\n.fa-area-chart::before {\n  content: \"\\f1fe\"; }\n\n.fa-house-flag::before {\n  content: \"\\e50d\"; }\n\n.fa-person-circle-minus::before {\n  content: \"\\e540\"; }\n\n.fa-ban::before {\n  content: \"\\f05e\"; }\n\n.fa-cancel::before {\n  content: \"\\f05e\"; }\n\n.fa-camera-rotate::before {\n  content: \"\\e0d8\"; }\n\n.fa-spray-can-sparkles::before {\n  content: \"\\f5d0\"; }\n\n.fa-air-freshener::before {\n  content: \"\\f5d0\"; }\n\n.fa-star::before {\n  content: \"\\f005\"; }\n\n.fa-repeat::before {\n  content: \"\\f363\"; }\n\n.fa-cross::before {\n  content: \"\\f654\"; }\n\n.fa-box::before {\n  content: \"\\f466\"; }\n\n.fa-venus-mars::before {\n  content: \"\\f228\"; }\n\n.fa-arrow-pointer::before {\n  content: \"\\f245\"; }\n\n.fa-mouse-pointer::before {\n  content: \"\\f245\"; }\n\n.fa-maximize::before {\n  content: \"\\f31e\"; }\n\n.fa-expand-arrows-alt::before {\n  content: \"\\f31e\"; }\n\n.fa-charging-station::before {\n  content: \"\\f5e7\"; }\n\n.fa-shapes::before {\n  content: \"\\f61f\"; }\n\n.fa-triangle-circle-square::before {\n  content: \"\\f61f\"; }\n\n.fa-shuffle::before {\n  content: \"\\f074\"; }\n\n.fa-random::before {\n  content: \"\\f074\"; }\n\n.fa-person-running::before {\n  content: \"\\f70c\"; }\n\n.fa-running::before {\n  content: \"\\f70c\"; }\n\n.fa-mobile-retro::before {\n  content: \"\\e527\"; }\n\n.fa-grip-lines-vertical::before {\n  content: \"\\f7a5\"; }\n\n.fa-spider::before {\n  content: \"\\f717\"; }\n\n.fa-hands-bound::before {\n  content: \"\\e4f9\"; }\n\n.fa-file-invoice-dollar::before {\n  content: \"\\f571\"; }\n\n.fa-plane-circle-exclamation::before {\n  content: \"\\e556\"; }\n\n.fa-x-ray::before {\n  content: \"\\f497\"; }\n\n.fa-spell-check::before {\n  content: \"\\f891\"; }\n\n.fa-slash::before {\n  content: \"\\f715\"; }\n\n.fa-computer-mouse::before {\n  content: \"\\f8cc\"; }\n\n.fa-mouse::before {\n  content: \"\\f8cc\"; }\n\n.fa-arrow-right-to-bracket::before {\n  content: \"\\f090\"; }\n\n.fa-sign-in::before {\n  content: \"\\f090\"; }\n\n.fa-shop-slash::before {\n  content: \"\\e070\"; }\n\n.fa-store-alt-slash::before {\n  content: \"\\e070\"; }\n\n.fa-server::before {\n  content: \"\\f233\"; }\n\n.fa-virus-covid-slash::before {\n  content: \"\\e4a9\"; }\n\n.fa-shop-lock::before {\n  content: \"\\e4a5\"; }\n\n.fa-hourglass-start::before {\n  content: \"\\f251\"; }\n\n.fa-hourglass-1::before {\n  content: \"\\f251\"; }\n\n.fa-blender-phone::before {\n  content: \"\\f6b6\"; }\n\n.fa-building-wheat::before {\n  content: \"\\e4db\"; }\n\n.fa-person-breastfeeding::before {\n  content: \"\\e53a\"; }\n\n.fa-right-to-bracket::before {\n  content: \"\\f2f6\"; }\n\n.fa-sign-in-alt::before {\n  content: \"\\f2f6\"; }\n\n.fa-venus::before {\n  content: \"\\f221\"; }\n\n.fa-passport::before {\n  content: \"\\f5ab\"; }\n\n.fa-heart-pulse::before {\n  content: \"\\f21e\"; }\n\n.fa-heartbeat::before {\n  content: \"\\f21e\"; }\n\n.fa-people-carry-box::before {\n  content: \"\\f4ce\"; }\n\n.fa-people-carry::before {\n  content: \"\\f4ce\"; }\n\n.fa-temperature-high::before {\n  content: \"\\f769\"; }\n\n.fa-microchip::before {\n  content: \"\\f2db\"; }\n\n.fa-crown::before {\n  content: \"\\f521\"; }\n\n.fa-weight-hanging::before {\n  content: \"\\f5cd\"; }\n\n.fa-xmarks-lines::before {\n  content: \"\\e59a\"; }\n\n.fa-file-prescription::before {\n  content: \"\\f572\"; }\n\n.fa-weight-scale::before {\n  content: \"\\f496\"; }\n\n.fa-weight::before {\n  content: \"\\f496\"; }\n\n.fa-user-group::before {\n  content: \"\\f500\"; }\n\n.fa-user-friends::before {\n  content: \"\\f500\"; }\n\n.fa-arrow-up-a-z::before {\n  content: \"\\f15e\"; }\n\n.fa-sort-alpha-up::before {\n  content: \"\\f15e\"; }\n\n.fa-chess-knight::before {\n  content: \"\\f441\"; }\n\n.fa-face-laugh-squint::before {\n  content: \"\\f59b\"; }\n\n.fa-laugh-squint::before {\n  content: \"\\f59b\"; }\n\n.fa-wheelchair::before {\n  content: \"\\f193\"; }\n\n.fa-circle-arrow-up::before {\n  content: \"\\f0aa\"; }\n\n.fa-arrow-circle-up::before {\n  content: \"\\f0aa\"; }\n\n.fa-toggle-on::before {\n  content: \"\\f205\"; }\n\n.fa-person-walking::before {\n  content: \"\\f554\"; }\n\n.fa-walking::before {\n  content: \"\\f554\"; }\n\n.fa-l::before {\n  content: \"\\4c\"; }\n\n.fa-fire::before {\n  content: \"\\f06d\"; }\n\n.fa-bed-pulse::before {\n  content: \"\\f487\"; }\n\n.fa-procedures::before {\n  content: \"\\f487\"; }\n\n.fa-shuttle-space::before {\n  content: \"\\f197\"; }\n\n.fa-space-shuttle::before {\n  content: \"\\f197\"; }\n\n.fa-face-laugh::before {\n  content: \"\\f599\"; }\n\n.fa-laugh::before {\n  content: \"\\f599\"; }\n\n.fa-folder-open::before {\n  content: \"\\f07c\"; }\n\n.fa-heart-circle-plus::before {\n  content: \"\\e500\"; }\n\n.fa-code-fork::before {\n  content: \"\\e13b\"; }\n\n.fa-city::before {\n  content: \"\\f64f\"; }\n\n.fa-microphone-lines::before {\n  content: \"\\f3c9\"; }\n\n.fa-microphone-alt::before {\n  content: \"\\f3c9\"; }\n\n.fa-pepper-hot::before {\n  content: \"\\f816\"; }\n\n.fa-unlock::before {\n  content: \"\\f09c\"; }\n\n.fa-colon-sign::before {\n  content: \"\\e140\"; }\n\n.fa-headset::before {\n  content: \"\\f590\"; }\n\n.fa-store-slash::before {\n  content: \"\\e071\"; }\n\n.fa-road-circle-xmark::before {\n  content: \"\\e566\"; }\n\n.fa-user-minus::before {\n  content: \"\\f503\"; }\n\n.fa-mars-stroke-up::before {\n  content: \"\\f22a\"; }\n\n.fa-mars-stroke-v::before {\n  content: \"\\f22a\"; }\n\n.fa-champagne-glasses::before {\n  content: \"\\f79f\"; }\n\n.fa-glass-cheers::before {\n  content: \"\\f79f\"; }\n\n.fa-clipboard::before {\n  content: \"\\f328\"; }\n\n.fa-house-circle-exclamation::before {\n  content: \"\\e50a\"; }\n\n.fa-file-arrow-up::before {\n  content: \"\\f574\"; }\n\n.fa-file-upload::before {\n  content: \"\\f574\"; }\n\n.fa-wifi::before {\n  content: \"\\f1eb\"; }\n\n.fa-wifi-3::before {\n  content: \"\\f1eb\"; }\n\n.fa-wifi-strong::before {\n  content: \"\\f1eb\"; }\n\n.fa-bath::before {\n  content: \"\\f2cd\"; }\n\n.fa-bathtub::before {\n  content: \"\\f2cd\"; }\n\n.fa-underline::before {\n  content: \"\\f0cd\"; }\n\n.fa-user-pen::before {\n  content: \"\\f4ff\"; }\n\n.fa-user-edit::before {\n  content: \"\\f4ff\"; }\n\n.fa-signature::before {\n  content: \"\\f5b7\"; }\n\n.fa-stroopwafel::before {\n  content: \"\\f551\"; }\n\n.fa-bold::before {\n  content: \"\\f032\"; }\n\n.fa-anchor-lock::before {\n  content: \"\\e4ad\"; }\n\n.fa-building-ngo::before {\n  content: \"\\e4d7\"; }\n\n.fa-manat-sign::before {\n  content: \"\\e1d5\"; }\n\n.fa-not-equal::before {\n  content: \"\\f53e\"; }\n\n.fa-border-top-left::before {\n  content: \"\\f853\"; }\n\n.fa-border-style::before {\n  content: \"\\f853\"; }\n\n.fa-map-location-dot::before {\n  content: \"\\f5a0\"; }\n\n.fa-map-marked-alt::before {\n  content: \"\\f5a0\"; }\n\n.fa-jedi::before {\n  content: \"\\f669\"; }\n\n.fa-square-poll-vertical::before {\n  content: \"\\f681\"; }\n\n.fa-poll::before {\n  content: \"\\f681\"; }\n\n.fa-mug-hot::before {\n  content: \"\\f7b6\"; }\n\n.fa-car-battery::before {\n  content: \"\\f5df\"; }\n\n.fa-battery-car::before {\n  content: \"\\f5df\"; }\n\n.fa-gift::before {\n  content: \"\\f06b\"; }\n\n.fa-dice-two::before {\n  content: \"\\f528\"; }\n\n.fa-chess-queen::before {\n  content: \"\\f445\"; }\n\n.fa-glasses::before {\n  content: \"\\f530\"; }\n\n.fa-chess-board::before {\n  content: \"\\f43c\"; }\n\n.fa-building-circle-check::before {\n  content: \"\\e4d2\"; }\n\n.fa-person-chalkboard::before {\n  content: \"\\e53d\"; }\n\n.fa-mars-stroke-right::before {\n  content: \"\\f22b\"; }\n\n.fa-mars-stroke-h::before {\n  content: \"\\f22b\"; }\n\n.fa-hand-back-fist::before {\n  content: \"\\f255\"; }\n\n.fa-hand-rock::before {\n  content: \"\\f255\"; }\n\n.fa-square-caret-up::before {\n  content: \"\\f151\"; }\n\n.fa-caret-square-up::before {\n  content: \"\\f151\"; }\n\n.fa-cloud-showers-water::before {\n  content: \"\\e4e4\"; }\n\n.fa-chart-bar::before {\n  content: \"\\f080\"; }\n\n.fa-bar-chart::before {\n  content: \"\\f080\"; }\n\n.fa-hands-bubbles::before {\n  content: \"\\e05e\"; }\n\n.fa-hands-wash::before {\n  content: \"\\e05e\"; }\n\n.fa-less-than-equal::before {\n  content: \"\\f537\"; }\n\n.fa-train::before {\n  content: \"\\f238\"; }\n\n.fa-eye-low-vision::before {\n  content: \"\\f2a8\"; }\n\n.fa-low-vision::before {\n  content: \"\\f2a8\"; }\n\n.fa-crow::before {\n  content: \"\\f520\"; }\n\n.fa-sailboat::before {\n  content: \"\\e445\"; }\n\n.fa-window-restore::before {\n  content: \"\\f2d2\"; }\n\n.fa-square-plus::before {\n  content: \"\\f0fe\"; }\n\n.fa-plus-square::before {\n  content: \"\\f0fe\"; }\n\n.fa-torii-gate::before {\n  content: \"\\f6a1\"; }\n\n.fa-frog::before {\n  content: \"\\f52e\"; }\n\n.fa-bucket::before {\n  content: \"\\e4cf\"; }\n\n.fa-image::before {\n  content: \"\\f03e\"; }\n\n.fa-microphone::before {\n  content: \"\\f130\"; }\n\n.fa-cow::before {\n  content: \"\\f6c8\"; }\n\n.fa-caret-up::before {\n  content: \"\\f0d8\"; }\n\n.fa-screwdriver::before {\n  content: \"\\f54a\"; }\n\n.fa-folder-closed::before {\n  content: \"\\e185\"; }\n\n.fa-house-tsunami::before {\n  content: \"\\e515\"; }\n\n.fa-square-nfi::before {\n  content: \"\\e576\"; }\n\n.fa-arrow-up-from-ground-water::before {\n  content: \"\\e4b5\"; }\n\n.fa-martini-glass::before {\n  content: \"\\f57b\"; }\n\n.fa-glass-martini-alt::before {\n  content: \"\\f57b\"; }\n\n.fa-rotate-left::before {\n  content: \"\\f2ea\"; }\n\n.fa-rotate-back::before {\n  content: \"\\f2ea\"; }\n\n.fa-rotate-backward::before {\n  content: \"\\f2ea\"; }\n\n.fa-undo-alt::before {\n  content: \"\\f2ea\"; }\n\n.fa-table-columns::before {\n  content: \"\\f0db\"; }\n\n.fa-columns::before {\n  content: \"\\f0db\"; }\n\n.fa-lemon::before {\n  content: \"\\f094\"; }\n\n.fa-head-side-mask::before {\n  content: \"\\e063\"; }\n\n.fa-handshake::before {\n  content: \"\\f2b5\"; }\n\n.fa-gem::before {\n  content: \"\\f3a5\"; }\n\n.fa-dolly::before {\n  content: \"\\f472\"; }\n\n.fa-dolly-box::before {\n  content: \"\\f472\"; }\n\n.fa-smoking::before {\n  content: \"\\f48d\"; }\n\n.fa-minimize::before {\n  content: \"\\f78c\"; }\n\n.fa-compress-arrows-alt::before {\n  content: \"\\f78c\"; }\n\n.fa-monument::before {\n  content: \"\\f5a6\"; }\n\n.fa-snowplow::before {\n  content: \"\\f7d2\"; }\n\n.fa-angles-right::before {\n  content: \"\\f101\"; }\n\n.fa-angle-double-right::before {\n  content: \"\\f101\"; }\n\n.fa-cannabis::before {\n  content: \"\\f55f\"; }\n\n.fa-circle-play::before {\n  content: \"\\f144\"; }\n\n.fa-play-circle::before {\n  content: \"\\f144\"; }\n\n.fa-tablets::before {\n  content: \"\\f490\"; }\n\n.fa-ethernet::before {\n  content: \"\\f796\"; }\n\n.fa-euro-sign::before {\n  content: \"\\f153\"; }\n\n.fa-eur::before {\n  content: \"\\f153\"; }\n\n.fa-euro::before {\n  content: \"\\f153\"; }\n\n.fa-chair::before {\n  content: \"\\f6c0\"; }\n\n.fa-circle-check::before {\n  content: \"\\f058\"; }\n\n.fa-check-circle::before {\n  content: \"\\f058\"; }\n\n.fa-circle-stop::before {\n  content: \"\\f28d\"; }\n\n.fa-stop-circle::before {\n  content: \"\\f28d\"; }\n\n.fa-compass-drafting::before {\n  content: \"\\f568\"; }\n\n.fa-drafting-compass::before {\n  content: \"\\f568\"; }\n\n.fa-plate-wheat::before {\n  content: \"\\e55a\"; }\n\n.fa-icicles::before {\n  content: \"\\f7ad\"; }\n\n.fa-person-shelter::before {\n  content: \"\\e54f\"; }\n\n.fa-neuter::before {\n  content: \"\\f22c\"; }\n\n.fa-id-badge::before {\n  content: \"\\f2c1\"; }\n\n.fa-marker::before {\n  content: \"\\f5a1\"; }\n\n.fa-face-laugh-beam::before {\n  content: \"\\f59a\"; }\n\n.fa-laugh-beam::before {\n  content: \"\\f59a\"; }\n\n.fa-helicopter-symbol::before {\n  content: \"\\e502\"; }\n\n.fa-universal-access::before {\n  content: \"\\f29a\"; }\n\n.fa-circle-chevron-up::before {\n  content: \"\\f139\"; }\n\n.fa-chevron-circle-up::before {\n  content: \"\\f139\"; }\n\n.fa-lari-sign::before {\n  content: \"\\e1c8\"; }\n\n.fa-volcano::before {\n  content: \"\\f770\"; }\n\n.fa-person-walking-dashed-line-arrow-right::before {\n  content: \"\\e553\"; }\n\n.fa-sterling-sign::before {\n  content: \"\\f154\"; }\n\n.fa-gbp::before {\n  content: \"\\f154\"; }\n\n.fa-pound-sign::before {\n  content: \"\\f154\"; }\n\n.fa-viruses::before {\n  content: \"\\e076\"; }\n\n.fa-square-person-confined::before {\n  content: \"\\e577\"; }\n\n.fa-user-tie::before {\n  content: \"\\f508\"; }\n\n.fa-arrow-down-long::before {\n  content: \"\\f175\"; }\n\n.fa-long-arrow-down::before {\n  content: \"\\f175\"; }\n\n.fa-tent-arrow-down-to-line::before {\n  content: \"\\e57e\"; }\n\n.fa-certificate::before {\n  content: \"\\f0a3\"; }\n\n.fa-reply-all::before {\n  content: \"\\f122\"; }\n\n.fa-mail-reply-all::before {\n  content: \"\\f122\"; }\n\n.fa-suitcase::before {\n  content: \"\\f0f2\"; }\n\n.fa-person-skating::before {\n  content: \"\\f7c5\"; }\n\n.fa-skating::before {\n  content: \"\\f7c5\"; }\n\n.fa-filter-circle-dollar::before {\n  content: \"\\f662\"; }\n\n.fa-funnel-dollar::before {\n  content: \"\\f662\"; }\n\n.fa-camera-retro::before {\n  content: \"\\f083\"; }\n\n.fa-circle-arrow-down::before {\n  content: \"\\f0ab\"; }\n\n.fa-arrow-circle-down::before {\n  content: \"\\f0ab\"; }\n\n.fa-file-import::before {\n  content: \"\\f56f\"; }\n\n.fa-arrow-right-to-file::before {\n  content: \"\\f56f\"; }\n\n.fa-square-arrow-up-right::before {\n  content: \"\\f14c\"; }\n\n.fa-external-link-square::before {\n  content: \"\\f14c\"; }\n\n.fa-box-open::before {\n  content: \"\\f49e\"; }\n\n.fa-scroll::before {\n  content: \"\\f70e\"; }\n\n.fa-spa::before {\n  content: \"\\f5bb\"; }\n\n.fa-location-pin-lock::before {\n  content: \"\\e51f\"; }\n\n.fa-pause::before {\n  content: \"\\f04c\"; }\n\n.fa-hill-avalanche::before {\n  content: \"\\e507\"; }\n\n.fa-temperature-empty::before {\n  content: \"\\f2cb\"; }\n\n.fa-temperature-0::before {\n  content: \"\\f2cb\"; }\n\n.fa-thermometer-0::before {\n  content: \"\\f2cb\"; }\n\n.fa-thermometer-empty::before {\n  content: \"\\f2cb\"; }\n\n.fa-bomb::before {\n  content: \"\\f1e2\"; }\n\n.fa-registered::before {\n  content: \"\\f25d\"; }\n\n.fa-address-card::before {\n  content: \"\\f2bb\"; }\n\n.fa-contact-card::before {\n  content: \"\\f2bb\"; }\n\n.fa-vcard::before {\n  content: \"\\f2bb\"; }\n\n.fa-scale-unbalanced-flip::before {\n  content: \"\\f516\"; }\n\n.fa-balance-scale-right::before {\n  content: \"\\f516\"; }\n\n.fa-subscript::before {\n  content: \"\\f12c\"; }\n\n.fa-diamond-turn-right::before {\n  content: \"\\f5eb\"; }\n\n.fa-directions::before {\n  content: \"\\f5eb\"; }\n\n.fa-burst::before {\n  content: \"\\e4dc\"; }\n\n.fa-house-laptop::before {\n  content: \"\\e066\"; }\n\n.fa-laptop-house::before {\n  content: \"\\e066\"; }\n\n.fa-face-tired::before {\n  content: \"\\f5c8\"; }\n\n.fa-tired::before {\n  content: \"\\f5c8\"; }\n\n.fa-money-bills::before {\n  content: \"\\e1f3\"; }\n\n.fa-smog::before {\n  content: \"\\f75f\"; }\n\n.fa-crutch::before {\n  content: \"\\f7f7\"; }\n\n.fa-cloud-arrow-up::before {\n  content: \"\\f0ee\"; }\n\n.fa-cloud-upload::before {\n  content: \"\\f0ee\"; }\n\n.fa-cloud-upload-alt::before {\n  content: \"\\f0ee\"; }\n\n.fa-palette::before {\n  content: \"\\f53f\"; }\n\n.fa-arrows-turn-right::before {\n  content: \"\\e4c0\"; }\n\n.fa-vest::before {\n  content: \"\\e085\"; }\n\n.fa-ferry::before {\n  content: \"\\e4ea\"; }\n\n.fa-arrows-down-to-people::before {\n  content: \"\\e4b9\"; }\n\n.fa-seedling::before {\n  content: \"\\f4d8\"; }\n\n.fa-sprout::before {\n  content: \"\\f4d8\"; }\n\n.fa-left-right::before {\n  content: \"\\f337\"; }\n\n.fa-arrows-alt-h::before {\n  content: \"\\f337\"; }\n\n.fa-boxes-packing::before {\n  content: \"\\e4c7\"; }\n\n.fa-circle-arrow-left::before {\n  content: \"\\f0a8\"; }\n\n.fa-arrow-circle-left::before {\n  content: \"\\f0a8\"; }\n\n.fa-group-arrows-rotate::before {\n  content: \"\\e4f6\"; }\n\n.fa-bowl-food::before {\n  content: \"\\e4c6\"; }\n\n.fa-candy-cane::before {\n  content: \"\\f786\"; }\n\n.fa-arrow-down-wide-short::before {\n  content: \"\\f160\"; }\n\n.fa-sort-amount-asc::before {\n  content: \"\\f160\"; }\n\n.fa-sort-amount-down::before {\n  content: \"\\f160\"; }\n\n.fa-cloud-bolt::before {\n  content: \"\\f76c\"; }\n\n.fa-thunderstorm::before {\n  content: \"\\f76c\"; }\n\n.fa-text-slash::before {\n  content: \"\\f87d\"; }\n\n.fa-remove-format::before {\n  content: \"\\f87d\"; }\n\n.fa-face-smile-wink::before {\n  content: \"\\f4da\"; }\n\n.fa-smile-wink::before {\n  content: \"\\f4da\"; }\n\n.fa-file-word::before {\n  content: \"\\f1c2\"; }\n\n.fa-file-powerpoint::before {\n  content: \"\\f1c4\"; }\n\n.fa-arrows-left-right::before {\n  content: \"\\f07e\"; }\n\n.fa-arrows-h::before {\n  content: \"\\f07e\"; }\n\n.fa-house-lock::before {\n  content: \"\\e510\"; }\n\n.fa-cloud-arrow-down::before {\n  content: \"\\f0ed\"; }\n\n.fa-cloud-download::before {\n  content: \"\\f0ed\"; }\n\n.fa-cloud-download-alt::before {\n  content: \"\\f0ed\"; }\n\n.fa-children::before {\n  content: \"\\e4e1\"; }\n\n.fa-chalkboard::before {\n  content: \"\\f51b\"; }\n\n.fa-blackboard::before {\n  content: \"\\f51b\"; }\n\n.fa-user-large-slash::before {\n  content: \"\\f4fa\"; }\n\n.fa-user-alt-slash::before {\n  content: \"\\f4fa\"; }\n\n.fa-envelope-open::before {\n  content: \"\\f2b6\"; }\n\n.fa-handshake-simple-slash::before {\n  content: \"\\e05f\"; }\n\n.fa-handshake-alt-slash::before {\n  content: \"\\e05f\"; }\n\n.fa-mattress-pillow::before {\n  content: \"\\e525\"; }\n\n.fa-guarani-sign::before {\n  content: \"\\e19a\"; }\n\n.fa-arrows-rotate::before {\n  content: \"\\f021\"; }\n\n.fa-refresh::before {\n  content: \"\\f021\"; }\n\n.fa-sync::before {\n  content: \"\\f021\"; }\n\n.fa-fire-extinguisher::before {\n  content: \"\\f134\"; }\n\n.fa-cruzeiro-sign::before {\n  content: \"\\e152\"; }\n\n.fa-greater-than-equal::before {\n  content: \"\\f532\"; }\n\n.fa-shield-halved::before {\n  content: \"\\f3ed\"; }\n\n.fa-shield-alt::before {\n  content: \"\\f3ed\"; }\n\n.fa-book-atlas::before {\n  content: \"\\f558\"; }\n\n.fa-atlas::before {\n  content: \"\\f558\"; }\n\n.fa-virus::before {\n  content: \"\\e074\"; }\n\n.fa-envelope-circle-check::before {\n  content: \"\\e4e8\"; }\n\n.fa-layer-group::before {\n  content: \"\\f5fd\"; }\n\n.fa-arrows-to-dot::before {\n  content: \"\\e4be\"; }\n\n.fa-archway::before {\n  content: \"\\f557\"; }\n\n.fa-heart-circle-check::before {\n  content: \"\\e4fd\"; }\n\n.fa-house-chimney-crack::before {\n  content: \"\\f6f1\"; }\n\n.fa-house-damage::before {\n  content: \"\\f6f1\"; }\n\n.fa-file-zipper::before {\n  content: \"\\f1c6\"; }\n\n.fa-file-archive::before {\n  content: \"\\f1c6\"; }\n\n.fa-square::before {\n  content: \"\\f0c8\"; }\n\n.fa-martini-glass-empty::before {\n  content: \"\\f000\"; }\n\n.fa-glass-martini::before {\n  content: \"\\f000\"; }\n\n.fa-couch::before {\n  content: \"\\f4b8\"; }\n\n.fa-cedi-sign::before {\n  content: \"\\e0df\"; }\n\n.fa-italic::before {\n  content: \"\\f033\"; }\n\n.fa-table-cells-column-lock::before {\n  content: \"\\e678\"; }\n\n.fa-church::before {\n  content: \"\\f51d\"; }\n\n.fa-comments-dollar::before {\n  content: \"\\f653\"; }\n\n.fa-democrat::before {\n  content: \"\\f747\"; }\n\n.fa-z::before {\n  content: \"\\5a\"; }\n\n.fa-person-skiing::before {\n  content: \"\\f7c9\"; }\n\n.fa-skiing::before {\n  content: \"\\f7c9\"; }\n\n.fa-road-lock::before {\n  content: \"\\e567\"; }\n\n.fa-a::before {\n  content: \"\\41\"; }\n\n.fa-temperature-arrow-down::before {\n  content: \"\\e03f\"; }\n\n.fa-temperature-down::before {\n  content: \"\\e03f\"; }\n\n.fa-feather-pointed::before {\n  content: \"\\f56b\"; }\n\n.fa-feather-alt::before {\n  content: \"\\f56b\"; }\n\n.fa-p::before {\n  content: \"\\50\"; }\n\n.fa-snowflake::before {\n  content: \"\\f2dc\"; }\n\n.fa-newspaper::before {\n  content: \"\\f1ea\"; }\n\n.fa-rectangle-ad::before {\n  content: \"\\f641\"; }\n\n.fa-ad::before {\n  content: \"\\f641\"; }\n\n.fa-circle-arrow-right::before {\n  content: \"\\f0a9\"; }\n\n.fa-arrow-circle-right::before {\n  content: \"\\f0a9\"; }\n\n.fa-filter-circle-xmark::before {\n  content: \"\\e17b\"; }\n\n.fa-locust::before {\n  content: \"\\e520\"; }\n\n.fa-sort::before {\n  content: \"\\f0dc\"; }\n\n.fa-unsorted::before {\n  content: \"\\f0dc\"; }\n\n.fa-list-ol::before {\n  content: \"\\f0cb\"; }\n\n.fa-list-1-2::before {\n  content: \"\\f0cb\"; }\n\n.fa-list-numeric::before {\n  content: \"\\f0cb\"; }\n\n.fa-person-dress-burst::before {\n  content: \"\\e544\"; }\n\n.fa-money-check-dollar::before {\n  content: \"\\f53d\"; }\n\n.fa-money-check-alt::before {\n  content: \"\\f53d\"; }\n\n.fa-vector-square::before {\n  content: \"\\f5cb\"; }\n\n.fa-bread-slice::before {\n  content: \"\\f7ec\"; }\n\n.fa-language::before {\n  content: \"\\f1ab\"; }\n\n.fa-face-kiss-wink-heart::before {\n  content: \"\\f598\"; }\n\n.fa-kiss-wink-heart::before {\n  content: \"\\f598\"; }\n\n.fa-filter::before {\n  content: \"\\f0b0\"; }\n\n.fa-question::before {\n  content: \"\\3f\"; }\n\n.fa-file-signature::before {\n  content: \"\\f573\"; }\n\n.fa-up-down-left-right::before {\n  content: \"\\f0b2\"; }\n\n.fa-arrows-alt::before {\n  content: \"\\f0b2\"; }\n\n.fa-house-chimney-user::before {\n  content: \"\\e065\"; }\n\n.fa-hand-holding-heart::before {\n  content: \"\\f4be\"; }\n\n.fa-puzzle-piece::before {\n  content: \"\\f12e\"; }\n\n.fa-money-check::before {\n  content: \"\\f53c\"; }\n\n.fa-star-half-stroke::before {\n  content: \"\\f5c0\"; }\n\n.fa-star-half-alt::before {\n  content: \"\\f5c0\"; }\n\n.fa-code::before {\n  content: \"\\f121\"; }\n\n.fa-whiskey-glass::before {\n  content: \"\\f7a0\"; }\n\n.fa-glass-whiskey::before {\n  content: \"\\f7a0\"; }\n\n.fa-building-circle-exclamation::before {\n  content: \"\\e4d3\"; }\n\n.fa-magnifying-glass-chart::before {\n  content: \"\\e522\"; }\n\n.fa-arrow-up-right-from-square::before {\n  content: \"\\f08e\"; }\n\n.fa-external-link::before {\n  content: \"\\f08e\"; }\n\n.fa-cubes-stacked::before {\n  content: \"\\e4e6\"; }\n\n.fa-won-sign::before {\n  content: \"\\f159\"; }\n\n.fa-krw::before {\n  content: \"\\f159\"; }\n\n.fa-won::before {\n  content: \"\\f159\"; }\n\n.fa-virus-covid::before {\n  content: \"\\e4a8\"; }\n\n.fa-austral-sign::before {\n  content: \"\\e0a9\"; }\n\n.fa-f::before {\n  content: \"\\46\"; }\n\n.fa-leaf::before {\n  content: \"\\f06c\"; }\n\n.fa-road::before {\n  content: \"\\f018\"; }\n\n.fa-taxi::before {\n  content: \"\\f1ba\"; }\n\n.fa-cab::before {\n  content: \"\\f1ba\"; }\n\n.fa-person-circle-plus::before {\n  content: \"\\e541\"; }\n\n.fa-chart-pie::before {\n  content: \"\\f200\"; }\n\n.fa-pie-chart::before {\n  content: \"\\f200\"; }\n\n.fa-bolt-lightning::before {\n  content: \"\\e0b7\"; }\n\n.fa-sack-xmark::before {\n  content: \"\\e56a\"; }\n\n.fa-file-excel::before {\n  content: \"\\f1c3\"; }\n\n.fa-file-contract::before {\n  content: \"\\f56c\"; }\n\n.fa-fish-fins::before {\n  content: \"\\e4f2\"; }\n\n.fa-building-flag::before {\n  content: \"\\e4d5\"; }\n\n.fa-face-grin-beam::before {\n  content: \"\\f582\"; }\n\n.fa-grin-beam::before {\n  content: \"\\f582\"; }\n\n.fa-object-ungroup::before {\n  content: \"\\f248\"; }\n\n.fa-poop::before {\n  content: \"\\f619\"; }\n\n.fa-location-pin::before {\n  content: \"\\f041\"; }\n\n.fa-map-marker::before {\n  content: \"\\f041\"; }\n\n.fa-kaaba::before {\n  content: \"\\f66b\"; }\n\n.fa-toilet-paper::before {\n  content: \"\\f71e\"; }\n\n.fa-helmet-safety::before {\n  content: \"\\f807\"; }\n\n.fa-hard-hat::before {\n  content: \"\\f807\"; }\n\n.fa-hat-hard::before {\n  content: \"\\f807\"; }\n\n.fa-eject::before {\n  content: \"\\f052\"; }\n\n.fa-circle-right::before {\n  content: \"\\f35a\"; }\n\n.fa-arrow-alt-circle-right::before {\n  content: \"\\f35a\"; }\n\n.fa-plane-circle-check::before {\n  content: \"\\e555\"; }\n\n.fa-face-rolling-eyes::before {\n  content: \"\\f5a5\"; }\n\n.fa-meh-rolling-eyes::before {\n  content: \"\\f5a5\"; }\n\n.fa-object-group::before {\n  content: \"\\f247\"; }\n\n.fa-chart-line::before {\n  content: \"\\f201\"; }\n\n.fa-line-chart::before {\n  content: \"\\f201\"; }\n\n.fa-mask-ventilator::before {\n  content: \"\\e524\"; }\n\n.fa-arrow-right::before {\n  content: \"\\f061\"; }\n\n.fa-signs-post::before {\n  content: \"\\f277\"; }\n\n.fa-map-signs::before {\n  content: \"\\f277\"; }\n\n.fa-cash-register::before {\n  content: \"\\f788\"; }\n\n.fa-person-circle-question::before {\n  content: \"\\e542\"; }\n\n.fa-h::before {\n  content: \"\\48\"; }\n\n.fa-tarp::before {\n  content: \"\\e57b\"; }\n\n.fa-screwdriver-wrench::before {\n  content: \"\\f7d9\"; }\n\n.fa-tools::before {\n  content: \"\\f7d9\"; }\n\n.fa-arrows-to-eye::before {\n  content: \"\\e4bf\"; }\n\n.fa-plug-circle-bolt::before {\n  content: \"\\e55b\"; }\n\n.fa-heart::before {\n  content: \"\\f004\"; }\n\n.fa-mars-and-venus::before {\n  content: \"\\f224\"; }\n\n.fa-house-user::before {\n  content: \"\\e1b0\"; }\n\n.fa-home-user::before {\n  content: \"\\e1b0\"; }\n\n.fa-dumpster-fire::before {\n  content: \"\\f794\"; }\n\n.fa-house-crack::before {\n  content: \"\\e3b1\"; }\n\n.fa-martini-glass-citrus::before {\n  content: \"\\f561\"; }\n\n.fa-cocktail::before {\n  content: \"\\f561\"; }\n\n.fa-face-surprise::before {\n  content: \"\\f5c2\"; }\n\n.fa-surprise::before {\n  content: \"\\f5c2\"; }\n\n.fa-bottle-water::before {\n  content: \"\\e4c5\"; }\n\n.fa-circle-pause::before {\n  content: \"\\f28b\"; }\n\n.fa-pause-circle::before {\n  content: \"\\f28b\"; }\n\n.fa-toilet-paper-slash::before {\n  content: \"\\e072\"; }\n\n.fa-apple-whole::before {\n  content: \"\\f5d1\"; }\n\n.fa-apple-alt::before {\n  content: \"\\f5d1\"; }\n\n.fa-kitchen-set::before {\n  content: \"\\e51a\"; }\n\n.fa-r::before {\n  content: \"\\52\"; }\n\n.fa-temperature-quarter::before {\n  content: \"\\f2ca\"; }\n\n.fa-temperature-1::before {\n  content: \"\\f2ca\"; }\n\n.fa-thermometer-1::before {\n  content: \"\\f2ca\"; }\n\n.fa-thermometer-quarter::before {\n  content: \"\\f2ca\"; }\n\n.fa-cube::before {\n  content: \"\\f1b2\"; }\n\n.fa-bitcoin-sign::before {\n  content: \"\\e0b4\"; }\n\n.fa-shield-dog::before {\n  content: \"\\e573\"; }\n\n.fa-solar-panel::before {\n  content: \"\\f5ba\"; }\n\n.fa-lock-open::before {\n  content: \"\\f3c1\"; }\n\n.fa-elevator::before {\n  content: \"\\e16d\"; }\n\n.fa-money-bill-transfer::before {\n  content: \"\\e528\"; }\n\n.fa-money-bill-trend-up::before {\n  content: \"\\e529\"; }\n\n.fa-house-flood-water-circle-arrow-right::before {\n  content: \"\\e50f\"; }\n\n.fa-square-poll-horizontal::before {\n  content: \"\\f682\"; }\n\n.fa-poll-h::before {\n  content: \"\\f682\"; }\n\n.fa-circle::before {\n  content: \"\\f111\"; }\n\n.fa-backward-fast::before {\n  content: \"\\f049\"; }\n\n.fa-fast-backward::before {\n  content: \"\\f049\"; }\n\n.fa-recycle::before {\n  content: \"\\f1b8\"; }\n\n.fa-user-astronaut::before {\n  content: \"\\f4fb\"; }\n\n.fa-plane-slash::before {\n  content: \"\\e069\"; }\n\n.fa-trademark::before {\n  content: \"\\f25c\"; }\n\n.fa-basketball::before {\n  content: \"\\f434\"; }\n\n.fa-basketball-ball::before {\n  content: \"\\f434\"; }\n\n.fa-satellite-dish::before {\n  content: \"\\f7c0\"; }\n\n.fa-circle-up::before {\n  content: \"\\f35b\"; }\n\n.fa-arrow-alt-circle-up::before {\n  content: \"\\f35b\"; }\n\n.fa-mobile-screen-button::before {\n  content: \"\\f3cd\"; }\n\n.fa-mobile-alt::before {\n  content: \"\\f3cd\"; }\n\n.fa-volume-high::before {\n  content: \"\\f028\"; }\n\n.fa-volume-up::before {\n  content: \"\\f028\"; }\n\n.fa-users-rays::before {\n  content: \"\\e593\"; }\n\n.fa-wallet::before {\n  content: \"\\f555\"; }\n\n.fa-clipboard-check::before {\n  content: \"\\f46c\"; }\n\n.fa-file-audio::before {\n  content: \"\\f1c7\"; }\n\n.fa-burger::before {\n  content: \"\\f805\"; }\n\n.fa-hamburger::before {\n  content: \"\\f805\"; }\n\n.fa-wrench::before {\n  content: \"\\f0ad\"; }\n\n.fa-bugs::before {\n  content: \"\\e4d0\"; }\n\n.fa-rupee-sign::before {\n  content: \"\\f156\"; }\n\n.fa-rupee::before {\n  content: \"\\f156\"; }\n\n.fa-file-image::before {\n  content: \"\\f1c5\"; }\n\n.fa-circle-question::before {\n  content: \"\\f059\"; }\n\n.fa-question-circle::before {\n  content: \"\\f059\"; }\n\n.fa-plane-departure::before {\n  content: \"\\f5b0\"; }\n\n.fa-handshake-slash::before {\n  content: \"\\e060\"; }\n\n.fa-book-bookmark::before {\n  content: \"\\e0bb\"; }\n\n.fa-code-branch::before {\n  content: \"\\f126\"; }\n\n.fa-hat-cowboy::before {\n  content: \"\\f8c0\"; }\n\n.fa-bridge::before {\n  content: \"\\e4c8\"; }\n\n.fa-phone-flip::before {\n  content: \"\\f879\"; }\n\n.fa-phone-alt::before {\n  content: \"\\f879\"; }\n\n.fa-truck-front::before {\n  content: \"\\e2b7\"; }\n\n.fa-cat::before {\n  content: \"\\f6be\"; }\n\n.fa-anchor-circle-exclamation::before {\n  content: \"\\e4ab\"; }\n\n.fa-truck-field::before {\n  content: \"\\e58d\"; }\n\n.fa-route::before {\n  content: \"\\f4d7\"; }\n\n.fa-clipboard-question::before {\n  content: \"\\e4e3\"; }\n\n.fa-panorama::before {\n  content: \"\\e209\"; }\n\n.fa-comment-medical::before {\n  content: \"\\f7f5\"; }\n\n.fa-teeth-open::before {\n  content: \"\\f62f\"; }\n\n.fa-file-circle-minus::before {\n  content: \"\\e4ed\"; }\n\n.fa-tags::before {\n  content: \"\\f02c\"; }\n\n.fa-wine-glass::before {\n  content: \"\\f4e3\"; }\n\n.fa-forward-fast::before {\n  content: \"\\f050\"; }\n\n.fa-fast-forward::before {\n  content: \"\\f050\"; }\n\n.fa-face-meh-blank::before {\n  content: \"\\f5a4\"; }\n\n.fa-meh-blank::before {\n  content: \"\\f5a4\"; }\n\n.fa-square-parking::before {\n  content: \"\\f540\"; }\n\n.fa-parking::before {\n  content: \"\\f540\"; }\n\n.fa-house-signal::before {\n  content: \"\\e012\"; }\n\n.fa-bars-progress::before {\n  content: \"\\f828\"; }\n\n.fa-tasks-alt::before {\n  content: \"\\f828\"; }\n\n.fa-faucet-drip::before {\n  content: \"\\e006\"; }\n\n.fa-cart-flatbed::before {\n  content: \"\\f474\"; }\n\n.fa-dolly-flatbed::before {\n  content: \"\\f474\"; }\n\n.fa-ban-smoking::before {\n  content: \"\\f54d\"; }\n\n.fa-smoking-ban::before {\n  content: \"\\f54d\"; }\n\n.fa-terminal::before {\n  content: \"\\f120\"; }\n\n.fa-mobile-button::before {\n  content: \"\\f10b\"; }\n\n.fa-house-medical-flag::before {\n  content: \"\\e514\"; }\n\n.fa-basket-shopping::before {\n  content: \"\\f291\"; }\n\n.fa-shopping-basket::before {\n  content: \"\\f291\"; }\n\n.fa-tape::before {\n  content: \"\\f4db\"; }\n\n.fa-bus-simple::before {\n  content: \"\\f55e\"; }\n\n.fa-bus-alt::before {\n  content: \"\\f55e\"; }\n\n.fa-eye::before {\n  content: \"\\f06e\"; }\n\n.fa-face-sad-cry::before {\n  content: \"\\f5b3\"; }\n\n.fa-sad-cry::before {\n  content: \"\\f5b3\"; }\n\n.fa-audio-description::before {\n  content: \"\\f29e\"; }\n\n.fa-person-military-to-person::before {\n  content: \"\\e54c\"; }\n\n.fa-file-shield::before {\n  content: \"\\e4f0\"; }\n\n.fa-user-slash::before {\n  content: \"\\f506\"; }\n\n.fa-pen::before {\n  content: \"\\f304\"; }\n\n.fa-tower-observation::before {\n  content: \"\\e586\"; }\n\n.fa-file-code::before {\n  content: \"\\f1c9\"; }\n\n.fa-signal::before {\n  content: \"\\f012\"; }\n\n.fa-signal-5::before {\n  content: \"\\f012\"; }\n\n.fa-signal-perfect::before {\n  content: \"\\f012\"; }\n\n.fa-bus::before {\n  content: \"\\f207\"; }\n\n.fa-heart-circle-xmark::before {\n  content: \"\\e501\"; }\n\n.fa-house-chimney::before {\n  content: \"\\e3af\"; }\n\n.fa-home-lg::before {\n  content: \"\\e3af\"; }\n\n.fa-window-maximize::before {\n  content: \"\\f2d0\"; }\n\n.fa-face-frown::before {\n  content: \"\\f119\"; }\n\n.fa-frown::before {\n  content: \"\\f119\"; }\n\n.fa-prescription::before {\n  content: \"\\f5b1\"; }\n\n.fa-shop::before {\n  content: \"\\f54f\"; }\n\n.fa-store-alt::before {\n  content: \"\\f54f\"; }\n\n.fa-floppy-disk::before {\n  content: \"\\f0c7\"; }\n\n.fa-save::before {\n  content: \"\\f0c7\"; }\n\n.fa-vihara::before {\n  content: \"\\f6a7\"; }\n\n.fa-scale-unbalanced::before {\n  content: \"\\f515\"; }\n\n.fa-balance-scale-left::before {\n  content: \"\\f515\"; }\n\n.fa-sort-up::before {\n  content: \"\\f0de\"; }\n\n.fa-sort-asc::before {\n  content: \"\\f0de\"; }\n\n.fa-comment-dots::before {\n  content: \"\\f4ad\"; }\n\n.fa-commenting::before {\n  content: \"\\f4ad\"; }\n\n.fa-plant-wilt::before {\n  content: \"\\e5aa\"; }\n\n.fa-diamond::before {\n  content: \"\\f219\"; }\n\n.fa-face-grin-squint::before {\n  content: \"\\f585\"; }\n\n.fa-grin-squint::before {\n  content: \"\\f585\"; }\n\n.fa-hand-holding-dollar::before {\n  content: \"\\f4c0\"; }\n\n.fa-hand-holding-usd::before {\n  content: \"\\f4c0\"; }\n\n.fa-bacterium::before {\n  content: \"\\e05a\"; }\n\n.fa-hand-pointer::before {\n  content: \"\\f25a\"; }\n\n.fa-drum-steelpan::before {\n  content: \"\\f56a\"; }\n\n.fa-hand-scissors::before {\n  content: \"\\f257\"; }\n\n.fa-hands-praying::before {\n  content: \"\\f684\"; }\n\n.fa-praying-hands::before {\n  content: \"\\f684\"; }\n\n.fa-arrow-rotate-right::before {\n  content: \"\\f01e\"; }\n\n.fa-arrow-right-rotate::before {\n  content: \"\\f01e\"; }\n\n.fa-arrow-rotate-forward::before {\n  content: \"\\f01e\"; }\n\n.fa-redo::before {\n  content: \"\\f01e\"; }\n\n.fa-biohazard::before {\n  content: \"\\f780\"; }\n\n.fa-location-crosshairs::before {\n  content: \"\\f601\"; }\n\n.fa-location::before {\n  content: \"\\f601\"; }\n\n.fa-mars-double::before {\n  content: \"\\f227\"; }\n\n.fa-child-dress::before {\n  content: \"\\e59c\"; }\n\n.fa-users-between-lines::before {\n  content: \"\\e591\"; }\n\n.fa-lungs-virus::before {\n  content: \"\\e067\"; }\n\n.fa-face-grin-tears::before {\n  content: \"\\f588\"; }\n\n.fa-grin-tears::before {\n  content: \"\\f588\"; }\n\n.fa-phone::before {\n  content: \"\\f095\"; }\n\n.fa-calendar-xmark::before {\n  content: \"\\f273\"; }\n\n.fa-calendar-times::before {\n  content: \"\\f273\"; }\n\n.fa-child-reaching::before {\n  content: \"\\e59d\"; }\n\n.fa-head-side-virus::before {\n  content: \"\\e064\"; }\n\n.fa-user-gear::before {\n  content: \"\\f4fe\"; }\n\n.fa-user-cog::before {\n  content: \"\\f4fe\"; }\n\n.fa-arrow-up-1-9::before {\n  content: \"\\f163\"; }\n\n.fa-sort-numeric-up::before {\n  content: \"\\f163\"; }\n\n.fa-door-closed::before {\n  content: \"\\f52a\"; }\n\n.fa-shield-virus::before {\n  content: \"\\e06c\"; }\n\n.fa-dice-six::before {\n  content: \"\\f526\"; }\n\n.fa-mosquito-net::before {\n  content: \"\\e52c\"; }\n\n.fa-bridge-water::before {\n  content: \"\\e4ce\"; }\n\n.fa-person-booth::before {\n  content: \"\\f756\"; }\n\n.fa-text-width::before {\n  content: \"\\f035\"; }\n\n.fa-hat-wizard::before {\n  content: \"\\f6e8\"; }\n\n.fa-pen-fancy::before {\n  content: \"\\f5ac\"; }\n\n.fa-person-digging::before {\n  content: \"\\f85e\"; }\n\n.fa-digging::before {\n  content: \"\\f85e\"; }\n\n.fa-trash::before {\n  content: \"\\f1f8\"; }\n\n.fa-gauge-simple::before {\n  content: \"\\f629\"; }\n\n.fa-gauge-simple-med::before {\n  content: \"\\f629\"; }\n\n.fa-tachometer-average::before {\n  content: \"\\f629\"; }\n\n.fa-book-medical::before {\n  content: \"\\f7e6\"; }\n\n.fa-poo::before {\n  content: \"\\f2fe\"; }\n\n.fa-quote-right::before {\n  content: \"\\f10e\"; }\n\n.fa-quote-right-alt::before {\n  content: \"\\f10e\"; }\n\n.fa-shirt::before {\n  content: \"\\f553\"; }\n\n.fa-t-shirt::before {\n  content: \"\\f553\"; }\n\n.fa-tshirt::before {\n  content: \"\\f553\"; }\n\n.fa-cubes::before {\n  content: \"\\f1b3\"; }\n\n.fa-divide::before {\n  content: \"\\f529\"; }\n\n.fa-tenge-sign::before {\n  content: \"\\f7d7\"; }\n\n.fa-tenge::before {\n  content: \"\\f7d7\"; }\n\n.fa-headphones::before {\n  content: \"\\f025\"; }\n\n.fa-hands-holding::before {\n  content: \"\\f4c2\"; }\n\n.fa-hands-clapping::before {\n  content: \"\\e1a8\"; }\n\n.fa-republican::before {\n  content: \"\\f75e\"; }\n\n.fa-arrow-left::before {\n  content: \"\\f060\"; }\n\n.fa-person-circle-xmark::before {\n  content: \"\\e543\"; }\n\n.fa-ruler::before {\n  content: \"\\f545\"; }\n\n.fa-align-left::before {\n  content: \"\\f036\"; }\n\n.fa-dice-d6::before {\n  content: \"\\f6d1\"; }\n\n.fa-restroom::before {\n  content: \"\\f7bd\"; }\n\n.fa-j::before {\n  content: \"\\4a\"; }\n\n.fa-users-viewfinder::before {\n  content: \"\\e595\"; }\n\n.fa-file-video::before {\n  content: \"\\f1c8\"; }\n\n.fa-up-right-from-square::before {\n  content: \"\\f35d\"; }\n\n.fa-external-link-alt::before {\n  content: \"\\f35d\"; }\n\n.fa-table-cells::before {\n  content: \"\\f00a\"; }\n\n.fa-th::before {\n  content: \"\\f00a\"; }\n\n.fa-file-pdf::before {\n  content: \"\\f1c1\"; }\n\n.fa-book-bible::before {\n  content: \"\\f647\"; }\n\n.fa-bible::before {\n  content: \"\\f647\"; }\n\n.fa-o::before {\n  content: \"\\4f\"; }\n\n.fa-suitcase-medical::before {\n  content: \"\\f0fa\"; }\n\n.fa-medkit::before {\n  content: \"\\f0fa\"; }\n\n.fa-user-secret::before {\n  content: \"\\f21b\"; }\n\n.fa-otter::before {\n  content: \"\\f700\"; }\n\n.fa-person-dress::before {\n  content: \"\\f182\"; }\n\n.fa-female::before {\n  content: \"\\f182\"; }\n\n.fa-comment-dollar::before {\n  content: \"\\f651\"; }\n\n.fa-business-time::before {\n  content: \"\\f64a\"; }\n\n.fa-briefcase-clock::before {\n  content: \"\\f64a\"; }\n\n.fa-table-cells-large::before {\n  content: \"\\f009\"; }\n\n.fa-th-large::before {\n  content: \"\\f009\"; }\n\n.fa-book-tanakh::before {\n  content: \"\\f827\"; }\n\n.fa-tanakh::before {\n  content: \"\\f827\"; }\n\n.fa-phone-volume::before {\n  content: \"\\f2a0\"; }\n\n.fa-volume-control-phone::before {\n  content: \"\\f2a0\"; }\n\n.fa-hat-cowboy-side::before {\n  content: \"\\f8c1\"; }\n\n.fa-clipboard-user::before {\n  content: \"\\f7f3\"; }\n\n.fa-child::before {\n  content: \"\\f1ae\"; }\n\n.fa-lira-sign::before {\n  content: \"\\f195\"; }\n\n.fa-satellite::before {\n  content: \"\\f7bf\"; }\n\n.fa-plane-lock::before {\n  content: \"\\e558\"; }\n\n.fa-tag::before {\n  content: \"\\f02b\"; }\n\n.fa-comment::before {\n  content: \"\\f075\"; }\n\n.fa-cake-candles::before {\n  content: \"\\f1fd\"; }\n\n.fa-birthday-cake::before {\n  content: \"\\f1fd\"; }\n\n.fa-cake::before {\n  content: \"\\f1fd\"; }\n\n.fa-envelope::before {\n  content: \"\\f0e0\"; }\n\n.fa-angles-up::before {\n  content: \"\\f102\"; }\n\n.fa-angle-double-up::before {\n  content: \"\\f102\"; }\n\n.fa-paperclip::before {\n  content: \"\\f0c6\"; }\n\n.fa-arrow-right-to-city::before {\n  content: \"\\e4b3\"; }\n\n.fa-ribbon::before {\n  content: \"\\f4d6\"; }\n\n.fa-lungs::before {\n  content: \"\\f604\"; }\n\n.fa-arrow-up-9-1::before {\n  content: \"\\f887\"; }\n\n.fa-sort-numeric-up-alt::before {\n  content: \"\\f887\"; }\n\n.fa-litecoin-sign::before {\n  content: \"\\e1d3\"; }\n\n.fa-border-none::before {\n  content: \"\\f850\"; }\n\n.fa-circle-nodes::before {\n  content: \"\\e4e2\"; }\n\n.fa-parachute-box::before {\n  content: \"\\f4cd\"; }\n\n.fa-indent::before {\n  content: \"\\f03c\"; }\n\n.fa-truck-field-un::before {\n  content: \"\\e58e\"; }\n\n.fa-hourglass::before {\n  content: \"\\f254\"; }\n\n.fa-hourglass-empty::before {\n  content: \"\\f254\"; }\n\n.fa-mountain::before {\n  content: \"\\f6fc\"; }\n\n.fa-user-doctor::before {\n  content: \"\\f0f0\"; }\n\n.fa-user-md::before {\n  content: \"\\f0f0\"; }\n\n.fa-circle-info::before {\n  content: \"\\f05a\"; }\n\n.fa-info-circle::before {\n  content: \"\\f05a\"; }\n\n.fa-cloud-meatball::before {\n  content: \"\\f73b\"; }\n\n.fa-camera::before {\n  content: \"\\f030\"; }\n\n.fa-camera-alt::before {\n  content: \"\\f030\"; }\n\n.fa-square-virus::before {\n  content: \"\\e578\"; }\n\n.fa-meteor::before {\n  content: \"\\f753\"; }\n\n.fa-car-on::before {\n  content: \"\\e4dd\"; }\n\n.fa-sleigh::before {\n  content: \"\\f7cc\"; }\n\n.fa-arrow-down-1-9::before {\n  content: \"\\f162\"; }\n\n.fa-sort-numeric-asc::before {\n  content: \"\\f162\"; }\n\n.fa-sort-numeric-down::before {\n  content: \"\\f162\"; }\n\n.fa-hand-holding-droplet::before {\n  content: \"\\f4c1\"; }\n\n.fa-hand-holding-water::before {\n  content: \"\\f4c1\"; }\n\n.fa-water::before {\n  content: \"\\f773\"; }\n\n.fa-calendar-check::before {\n  content: \"\\f274\"; }\n\n.fa-braille::before {\n  content: \"\\f2a1\"; }\n\n.fa-prescription-bottle-medical::before {\n  content: \"\\f486\"; }\n\n.fa-prescription-bottle-alt::before {\n  content: \"\\f486\"; }\n\n.fa-landmark::before {\n  content: \"\\f66f\"; }\n\n.fa-truck::before {\n  content: \"\\f0d1\"; }\n\n.fa-crosshairs::before {\n  content: \"\\f05b\"; }\n\n.fa-person-cane::before {\n  content: \"\\e53c\"; }\n\n.fa-tent::before {\n  content: \"\\e57d\"; }\n\n.fa-vest-patches::before {\n  content: \"\\e086\"; }\n\n.fa-check-double::before {\n  content: \"\\f560\"; }\n\n.fa-arrow-down-a-z::before {\n  content: \"\\f15d\"; }\n\n.fa-sort-alpha-asc::before {\n  content: \"\\f15d\"; }\n\n.fa-sort-alpha-down::before {\n  content: \"\\f15d\"; }\n\n.fa-money-bill-wheat::before {\n  content: \"\\e52a\"; }\n\n.fa-cookie::before {\n  content: \"\\f563\"; }\n\n.fa-arrow-rotate-left::before {\n  content: \"\\f0e2\"; }\n\n.fa-arrow-left-rotate::before {\n  content: \"\\f0e2\"; }\n\n.fa-arrow-rotate-back::before {\n  content: \"\\f0e2\"; }\n\n.fa-arrow-rotate-backward::before {\n  content: \"\\f0e2\"; }\n\n.fa-undo::before {\n  content: \"\\f0e2\"; }\n\n.fa-hard-drive::before {\n  content: \"\\f0a0\"; }\n\n.fa-hdd::before {\n  content: \"\\f0a0\"; }\n\n.fa-face-grin-squint-tears::before {\n  content: \"\\f586\"; }\n\n.fa-grin-squint-tears::before {\n  content: \"\\f586\"; }\n\n.fa-dumbbell::before {\n  content: \"\\f44b\"; }\n\n.fa-rectangle-list::before {\n  content: \"\\f022\"; }\n\n.fa-list-alt::before {\n  content: \"\\f022\"; }\n\n.fa-tarp-droplet::before {\n  content: \"\\e57c\"; }\n\n.fa-house-medical-circle-check::before {\n  content: \"\\e511\"; }\n\n.fa-person-skiing-nordic::before {\n  content: \"\\f7ca\"; }\n\n.fa-skiing-nordic::before {\n  content: \"\\f7ca\"; }\n\n.fa-calendar-plus::before {\n  content: \"\\f271\"; }\n\n.fa-plane-arrival::before {\n  content: \"\\f5af\"; }\n\n.fa-circle-left::before {\n  content: \"\\f359\"; }\n\n.fa-arrow-alt-circle-left::before {\n  content: \"\\f359\"; }\n\n.fa-train-subway::before {\n  content: \"\\f239\"; }\n\n.fa-subway::before {\n  content: \"\\f239\"; }\n\n.fa-chart-gantt::before {\n  content: \"\\e0e4\"; }\n\n.fa-indian-rupee-sign::before {\n  content: \"\\e1bc\"; }\n\n.fa-indian-rupee::before {\n  content: \"\\e1bc\"; }\n\n.fa-inr::before {\n  content: \"\\e1bc\"; }\n\n.fa-crop-simple::before {\n  content: \"\\f565\"; }\n\n.fa-crop-alt::before {\n  content: \"\\f565\"; }\n\n.fa-money-bill-1::before {\n  content: \"\\f3d1\"; }\n\n.fa-money-bill-alt::before {\n  content: \"\\f3d1\"; }\n\n.fa-left-long::before {\n  content: \"\\f30a\"; }\n\n.fa-long-arrow-alt-left::before {\n  content: \"\\f30a\"; }\n\n.fa-dna::before {\n  content: \"\\f471\"; }\n\n.fa-virus-slash::before {\n  content: \"\\e075\"; }\n\n.fa-minus::before {\n  content: \"\\f068\"; }\n\n.fa-subtract::before {\n  content: \"\\f068\"; }\n\n.fa-chess::before {\n  content: \"\\f439\"; }\n\n.fa-arrow-left-long::before {\n  content: \"\\f177\"; }\n\n.fa-long-arrow-left::before {\n  content: \"\\f177\"; }\n\n.fa-plug-circle-check::before {\n  content: \"\\e55c\"; }\n\n.fa-street-view::before {\n  content: \"\\f21d\"; }\n\n.fa-franc-sign::before {\n  content: \"\\e18f\"; }\n\n.fa-volume-off::before {\n  content: \"\\f026\"; }\n\n.fa-hands-asl-interpreting::before {\n  content: \"\\f2a3\"; }\n\n.fa-american-sign-language-interpreting::before {\n  content: \"\\f2a3\"; }\n\n.fa-asl-interpreting::before {\n  content: \"\\f2a3\"; }\n\n.fa-hands-american-sign-language-interpreting::before {\n  content: \"\\f2a3\"; }\n\n.fa-gear::before {\n  content: \"\\f013\"; }\n\n.fa-cog::before {\n  content: \"\\f013\"; }\n\n.fa-droplet-slash::before {\n  content: \"\\f5c7\"; }\n\n.fa-tint-slash::before {\n  content: \"\\f5c7\"; }\n\n.fa-mosque::before {\n  content: \"\\f678\"; }\n\n.fa-mosquito::before {\n  content: \"\\e52b\"; }\n\n.fa-star-of-david::before {\n  content: \"\\f69a\"; }\n\n.fa-person-military-rifle::before {\n  content: \"\\e54b\"; }\n\n.fa-cart-shopping::before {\n  content: \"\\f07a\"; }\n\n.fa-shopping-cart::before {\n  content: \"\\f07a\"; }\n\n.fa-vials::before {\n  content: \"\\f493\"; }\n\n.fa-plug-circle-plus::before {\n  content: \"\\e55f\"; }\n\n.fa-place-of-worship::before {\n  content: \"\\f67f\"; }\n\n.fa-grip-vertical::before {\n  content: \"\\f58e\"; }\n\n.fa-arrow-turn-up::before {\n  content: \"\\f148\"; }\n\n.fa-level-up::before {\n  content: \"\\f148\"; }\n\n.fa-u::before {\n  content: \"\\55\"; }\n\n.fa-square-root-variable::before {\n  content: \"\\f698\"; }\n\n.fa-square-root-alt::before {\n  content: \"\\f698\"; }\n\n.fa-clock::before {\n  content: \"\\f017\"; }\n\n.fa-clock-four::before {\n  content: \"\\f017\"; }\n\n.fa-backward-step::before {\n  content: \"\\f048\"; }\n\n.fa-step-backward::before {\n  content: \"\\f048\"; }\n\n.fa-pallet::before {\n  content: \"\\f482\"; }\n\n.fa-faucet::before {\n  content: \"\\e005\"; }\n\n.fa-baseball-bat-ball::before {\n  content: \"\\f432\"; }\n\n.fa-s::before {\n  content: \"\\53\"; }\n\n.fa-timeline::before {\n  content: \"\\e29c\"; }\n\n.fa-keyboard::before {\n  content: \"\\f11c\"; }\n\n.fa-caret-down::before {\n  content: \"\\f0d7\"; }\n\n.fa-house-chimney-medical::before {\n  content: \"\\f7f2\"; }\n\n.fa-clinic-medical::before {\n  content: \"\\f7f2\"; }\n\n.fa-temperature-three-quarters::before {\n  content: \"\\f2c8\"; }\n\n.fa-temperature-3::before {\n  content: \"\\f2c8\"; }\n\n.fa-thermometer-3::before {\n  content: \"\\f2c8\"; }\n\n.fa-thermometer-three-quarters::before {\n  content: \"\\f2c8\"; }\n\n.fa-mobile-screen::before {\n  content: \"\\f3cf\"; }\n\n.fa-mobile-android-alt::before {\n  content: \"\\f3cf\"; }\n\n.fa-plane-up::before {\n  content: \"\\e22d\"; }\n\n.fa-piggy-bank::before {\n  content: \"\\f4d3\"; }\n\n.fa-battery-half::before {\n  content: \"\\f242\"; }\n\n.fa-battery-3::before {\n  content: \"\\f242\"; }\n\n.fa-mountain-city::before {\n  content: \"\\e52e\"; }\n\n.fa-coins::before {\n  content: \"\\f51e\"; }\n\n.fa-khanda::before {\n  content: \"\\f66d\"; }\n\n.fa-sliders::before {\n  content: \"\\f1de\"; }\n\n.fa-sliders-h::before {\n  content: \"\\f1de\"; }\n\n.fa-folder-tree::before {\n  content: \"\\f802\"; }\n\n.fa-network-wired::before {\n  content: \"\\f6ff\"; }\n\n.fa-map-pin::before {\n  content: \"\\f276\"; }\n\n.fa-hamsa::before {\n  content: \"\\f665\"; }\n\n.fa-cent-sign::before {\n  content: \"\\e3f5\"; }\n\n.fa-flask::before {\n  content: \"\\f0c3\"; }\n\n.fa-person-pregnant::before {\n  content: \"\\e31e\"; }\n\n.fa-wand-sparkles::before {\n  content: \"\\f72b\"; }\n\n.fa-ellipsis-vertical::before {\n  content: \"\\f142\"; }\n\n.fa-ellipsis-v::before {\n  content: \"\\f142\"; }\n\n.fa-ticket::before {\n  content: \"\\f145\"; }\n\n.fa-power-off::before {\n  content: \"\\f011\"; }\n\n.fa-right-long::before {\n  content: \"\\f30b\"; }\n\n.fa-long-arrow-alt-right::before {\n  content: \"\\f30b\"; }\n\n.fa-flag-usa::before {\n  content: \"\\f74d\"; }\n\n.fa-laptop-file::before {\n  content: \"\\e51d\"; }\n\n.fa-tty::before {\n  content: \"\\f1e4\"; }\n\n.fa-teletype::before {\n  content: \"\\f1e4\"; }\n\n.fa-diagram-next::before {\n  content: \"\\e476\"; }\n\n.fa-person-rifle::before {\n  content: \"\\e54e\"; }\n\n.fa-house-medical-circle-exclamation::before {\n  content: \"\\e512\"; }\n\n.fa-closed-captioning::before {\n  content: \"\\f20a\"; }\n\n.fa-person-hiking::before {\n  content: \"\\f6ec\"; }\n\n.fa-hiking::before {\n  content: \"\\f6ec\"; }\n\n.fa-venus-double::before {\n  content: \"\\f226\"; }\n\n.fa-images::before {\n  content: \"\\f302\"; }\n\n.fa-calculator::before {\n  content: \"\\f1ec\"; }\n\n.fa-people-pulling::before {\n  content: \"\\e535\"; }\n\n.fa-n::before {\n  content: \"\\4e\"; }\n\n.fa-cable-car::before {\n  content: \"\\f7da\"; }\n\n.fa-tram::before {\n  content: \"\\f7da\"; }\n\n.fa-cloud-rain::before {\n  content: \"\\f73d\"; }\n\n.fa-building-circle-xmark::before {\n  content: \"\\e4d4\"; }\n\n.fa-ship::before {\n  content: \"\\f21a\"; }\n\n.fa-arrows-down-to-line::before {\n  content: \"\\e4b8\"; }\n\n.fa-download::before {\n  content: \"\\f019\"; }\n\n.fa-face-grin::before {\n  content: \"\\f580\"; }\n\n.fa-grin::before {\n  content: \"\\f580\"; }\n\n.fa-delete-left::before {\n  content: \"\\f55a\"; }\n\n.fa-backspace::before {\n  content: \"\\f55a\"; }\n\n.fa-eye-dropper::before {\n  content: \"\\f1fb\"; }\n\n.fa-eye-dropper-empty::before {\n  content: \"\\f1fb\"; }\n\n.fa-eyedropper::before {\n  content: \"\\f1fb\"; }\n\n.fa-file-circle-check::before {\n  content: \"\\e5a0\"; }\n\n.fa-forward::before {\n  content: \"\\f04e\"; }\n\n.fa-mobile::before {\n  content: \"\\f3ce\"; }\n\n.fa-mobile-android::before {\n  content: \"\\f3ce\"; }\n\n.fa-mobile-phone::before {\n  content: \"\\f3ce\"; }\n\n.fa-face-meh::before {\n  content: \"\\f11a\"; }\n\n.fa-meh::before {\n  content: \"\\f11a\"; }\n\n.fa-align-center::before {\n  content: \"\\f037\"; }\n\n.fa-book-skull::before {\n  content: \"\\f6b7\"; }\n\n.fa-book-dead::before {\n  content: \"\\f6b7\"; }\n\n.fa-id-card::before {\n  content: \"\\f2c2\"; }\n\n.fa-drivers-license::before {\n  content: \"\\f2c2\"; }\n\n.fa-outdent::before {\n  content: \"\\f03b\"; }\n\n.fa-dedent::before {\n  content: \"\\f03b\"; }\n\n.fa-heart-circle-exclamation::before {\n  content: \"\\e4fe\"; }\n\n.fa-house::before {\n  content: \"\\f015\"; }\n\n.fa-home::before {\n  content: \"\\f015\"; }\n\n.fa-home-alt::before {\n  content: \"\\f015\"; }\n\n.fa-home-lg-alt::before {\n  content: \"\\f015\"; }\n\n.fa-calendar-week::before {\n  content: \"\\f784\"; }\n\n.fa-laptop-medical::before {\n  content: \"\\f812\"; }\n\n.fa-b::before {\n  content: \"\\42\"; }\n\n.fa-file-medical::before {\n  content: \"\\f477\"; }\n\n.fa-dice-one::before {\n  content: \"\\f525\"; }\n\n.fa-kiwi-bird::before {\n  content: \"\\f535\"; }\n\n.fa-arrow-right-arrow-left::before {\n  content: \"\\f0ec\"; }\n\n.fa-exchange::before {\n  content: \"\\f0ec\"; }\n\n.fa-rotate-right::before {\n  content: \"\\f2f9\"; }\n\n.fa-redo-alt::before {\n  content: \"\\f2f9\"; }\n\n.fa-rotate-forward::before {\n  content: \"\\f2f9\"; }\n\n.fa-utensils::before {\n  content: \"\\f2e7\"; }\n\n.fa-cutlery::before {\n  content: \"\\f2e7\"; }\n\n.fa-arrow-up-wide-short::before {\n  content: \"\\f161\"; }\n\n.fa-sort-amount-up::before {\n  content: \"\\f161\"; }\n\n.fa-mill-sign::before {\n  content: \"\\e1ed\"; }\n\n.fa-bowl-rice::before {\n  content: \"\\e2eb\"; }\n\n.fa-skull::before {\n  content: \"\\f54c\"; }\n\n.fa-tower-broadcast::before {\n  content: \"\\f519\"; }\n\n.fa-broadcast-tower::before {\n  content: \"\\f519\"; }\n\n.fa-truck-pickup::before {\n  content: \"\\f63c\"; }\n\n.fa-up-long::before {\n  content: \"\\f30c\"; }\n\n.fa-long-arrow-alt-up::before {\n  content: \"\\f30c\"; }\n\n.fa-stop::before {\n  content: \"\\f04d\"; }\n\n.fa-code-merge::before {\n  content: \"\\f387\"; }\n\n.fa-upload::before {\n  content: \"\\f093\"; }\n\n.fa-hurricane::before {\n  content: \"\\f751\"; }\n\n.fa-mound::before {\n  content: \"\\e52d\"; }\n\n.fa-toilet-portable::before {\n  content: \"\\e583\"; }\n\n.fa-compact-disc::before {\n  content: \"\\f51f\"; }\n\n.fa-file-arrow-down::before {\n  content: \"\\f56d\"; }\n\n.fa-file-download::before {\n  content: \"\\f56d\"; }\n\n.fa-caravan::before {\n  content: \"\\f8ff\"; }\n\n.fa-shield-cat::before {\n  content: \"\\e572\"; }\n\n.fa-bolt::before {\n  content: \"\\f0e7\"; }\n\n.fa-zap::before {\n  content: \"\\f0e7\"; }\n\n.fa-glass-water::before {\n  content: \"\\e4f4\"; }\n\n.fa-oil-well::before {\n  content: \"\\e532\"; }\n\n.fa-vault::before {\n  content: \"\\e2c5\"; }\n\n.fa-mars::before {\n  content: \"\\f222\"; }\n\n.fa-toilet::before {\n  content: \"\\f7d8\"; }\n\n.fa-plane-circle-xmark::before {\n  content: \"\\e557\"; }\n\n.fa-yen-sign::before {\n  content: \"\\f157\"; }\n\n.fa-cny::before {\n  content: \"\\f157\"; }\n\n.fa-jpy::before {\n  content: \"\\f157\"; }\n\n.fa-rmb::before {\n  content: \"\\f157\"; }\n\n.fa-yen::before {\n  content: \"\\f157\"; }\n\n.fa-ruble-sign::before {\n  content: \"\\f158\"; }\n\n.fa-rouble::before {\n  content: \"\\f158\"; }\n\n.fa-rub::before {\n  content: \"\\f158\"; }\n\n.fa-ruble::before {\n  content: \"\\f158\"; }\n\n.fa-sun::before {\n  content: \"\\f185\"; }\n\n.fa-guitar::before {\n  content: \"\\f7a6\"; }\n\n.fa-face-laugh-wink::before {\n  content: \"\\f59c\"; }\n\n.fa-laugh-wink::before {\n  content: \"\\f59c\"; }\n\n.fa-horse-head::before {\n  content: \"\\f7ab\"; }\n\n.fa-bore-hole::before {\n  content: \"\\e4c3\"; }\n\n.fa-industry::before {\n  content: \"\\f275\"; }\n\n.fa-circle-down::before {\n  content: \"\\f358\"; }\n\n.fa-arrow-alt-circle-down::before {\n  content: \"\\f358\"; }\n\n.fa-arrows-turn-to-dots::before {\n  content: \"\\e4c1\"; }\n\n.fa-florin-sign::before {\n  content: \"\\e184\"; }\n\n.fa-arrow-down-short-wide::before {\n  content: \"\\f884\"; }\n\n.fa-sort-amount-desc::before {\n  content: \"\\f884\"; }\n\n.fa-sort-amount-down-alt::before {\n  content: \"\\f884\"; }\n\n.fa-less-than::before {\n  content: \"\\3c\"; }\n\n.fa-angle-down::before {\n  content: \"\\f107\"; }\n\n.fa-car-tunnel::before {\n  content: \"\\e4de\"; }\n\n.fa-head-side-cough::before {\n  content: \"\\e061\"; }\n\n.fa-grip-lines::before {\n  content: \"\\f7a4\"; }\n\n.fa-thumbs-down::before {\n  content: \"\\f165\"; }\n\n.fa-user-lock::before {\n  content: \"\\f502\"; }\n\n.fa-arrow-right-long::before {\n  content: \"\\f178\"; }\n\n.fa-long-arrow-right::before {\n  content: \"\\f178\"; }\n\n.fa-anchor-circle-xmark::before {\n  content: \"\\e4ac\"; }\n\n.fa-ellipsis::before {\n  content: \"\\f141\"; }\n\n.fa-ellipsis-h::before {\n  content: \"\\f141\"; }\n\n.fa-chess-pawn::before {\n  content: \"\\f443\"; }\n\n.fa-kit-medical::before {\n  content: \"\\f479\"; }\n\n.fa-first-aid::before {\n  content: \"\\f479\"; }\n\n.fa-person-through-window::before {\n  content: \"\\e5a9\"; }\n\n.fa-toolbox::before {\n  content: \"\\f552\"; }\n\n.fa-hands-holding-circle::before {\n  content: \"\\e4fb\"; }\n\n.fa-bug::before {\n  content: \"\\f188\"; }\n\n.fa-credit-card::before {\n  content: \"\\f09d\"; }\n\n.fa-credit-card-alt::before {\n  content: \"\\f09d\"; }\n\n.fa-car::before {\n  content: \"\\f1b9\"; }\n\n.fa-automobile::before {\n  content: \"\\f1b9\"; }\n\n.fa-hand-holding-hand::before {\n  content: \"\\e4f7\"; }\n\n.fa-book-open-reader::before {\n  content: \"\\f5da\"; }\n\n.fa-book-reader::before {\n  content: \"\\f5da\"; }\n\n.fa-mountain-sun::before {\n  content: \"\\e52f\"; }\n\n.fa-arrows-left-right-to-line::before {\n  content: \"\\e4ba\"; }\n\n.fa-dice-d20::before {\n  content: \"\\f6cf\"; }\n\n.fa-truck-droplet::before {\n  content: \"\\e58c\"; }\n\n.fa-file-circle-xmark::before {\n  content: \"\\e5a1\"; }\n\n.fa-temperature-arrow-up::before {\n  content: \"\\e040\"; }\n\n.fa-temperature-up::before {\n  content: \"\\e040\"; }\n\n.fa-medal::before {\n  content: \"\\f5a2\"; }\n\n.fa-bed::before {\n  content: \"\\f236\"; }\n\n.fa-square-h::before {\n  content: \"\\f0fd\"; }\n\n.fa-h-square::before {\n  content: \"\\f0fd\"; }\n\n.fa-podcast::before {\n  content: \"\\f2ce\"; }\n\n.fa-temperature-full::before {\n  content: \"\\f2c7\"; }\n\n.fa-temperature-4::before {\n  content: \"\\f2c7\"; }\n\n.fa-thermometer-4::before {\n  content: \"\\f2c7\"; }\n\n.fa-thermometer-full::before {\n  content: \"\\f2c7\"; }\n\n.fa-bell::before {\n  content: \"\\f0f3\"; }\n\n.fa-superscript::before {\n  content: \"\\f12b\"; }\n\n.fa-plug-circle-xmark::before {\n  content: \"\\e560\"; }\n\n.fa-star-of-life::before {\n  content: \"\\f621\"; }\n\n.fa-phone-slash::before {\n  content: \"\\f3dd\"; }\n\n.fa-paint-roller::before {\n  content: \"\\f5aa\"; }\n\n.fa-handshake-angle::before {\n  content: \"\\f4c4\"; }\n\n.fa-hands-helping::before {\n  content: \"\\f4c4\"; }\n\n.fa-location-dot::before {\n  content: \"\\f3c5\"; }\n\n.fa-map-marker-alt::before {\n  content: \"\\f3c5\"; }\n\n.fa-file::before {\n  content: \"\\f15b\"; }\n\n.fa-greater-than::before {\n  content: \"\\3e\"; }\n\n.fa-person-swimming::before {\n  content: \"\\f5c4\"; }\n\n.fa-swimmer::before {\n  content: \"\\f5c4\"; }\n\n.fa-arrow-down::before {\n  content: \"\\f063\"; }\n\n.fa-droplet::before {\n  content: \"\\f043\"; }\n\n.fa-tint::before {\n  content: \"\\f043\"; }\n\n.fa-eraser::before {\n  content: \"\\f12d\"; }\n\n.fa-earth-americas::before {\n  content: \"\\f57d\"; }\n\n.fa-earth::before {\n  content: \"\\f57d\"; }\n\n.fa-earth-america::before {\n  content: \"\\f57d\"; }\n\n.fa-globe-americas::before {\n  content: \"\\f57d\"; }\n\n.fa-person-burst::before {\n  content: \"\\e53b\"; }\n\n.fa-dove::before {\n  content: \"\\f4ba\"; }\n\n.fa-battery-empty::before {\n  content: \"\\f244\"; }\n\n.fa-battery-0::before {\n  content: \"\\f244\"; }\n\n.fa-socks::before {\n  content: \"\\f696\"; }\n\n.fa-inbox::before {\n  content: \"\\f01c\"; }\n\n.fa-section::before {\n  content: \"\\e447\"; }\n\n.fa-gauge-high::before {\n  content: \"\\f625\"; }\n\n.fa-tachometer-alt::before {\n  content: \"\\f625\"; }\n\n.fa-tachometer-alt-fast::before {\n  content: \"\\f625\"; }\n\n.fa-envelope-open-text::before {\n  content: \"\\f658\"; }\n\n.fa-hospital::before {\n  content: \"\\f0f8\"; }\n\n.fa-hospital-alt::before {\n  content: \"\\f0f8\"; }\n\n.fa-hospital-wide::before {\n  content: \"\\f0f8\"; }\n\n.fa-wine-bottle::before {\n  content: \"\\f72f\"; }\n\n.fa-chess-rook::before {\n  content: \"\\f447\"; }\n\n.fa-bars-staggered::before {\n  content: \"\\f550\"; }\n\n.fa-reorder::before {\n  content: \"\\f550\"; }\n\n.fa-stream::before {\n  content: \"\\f550\"; }\n\n.fa-dharmachakra::before {\n  content: \"\\f655\"; }\n\n.fa-hotdog::before {\n  content: \"\\f80f\"; }\n\n.fa-person-walking-with-cane::before {\n  content: \"\\f29d\"; }\n\n.fa-blind::before {\n  content: \"\\f29d\"; }\n\n.fa-drum::before {\n  content: \"\\f569\"; }\n\n.fa-ice-cream::before {\n  content: \"\\f810\"; }\n\n.fa-heart-circle-bolt::before {\n  content: \"\\e4fc\"; }\n\n.fa-fax::before {\n  content: \"\\f1ac\"; }\n\n.fa-paragraph::before {\n  content: \"\\f1dd\"; }\n\n.fa-check-to-slot::before {\n  content: \"\\f772\"; }\n\n.fa-vote-yea::before {\n  content: \"\\f772\"; }\n\n.fa-star-half::before {\n  content: \"\\f089\"; }\n\n.fa-boxes-stacked::before {\n  content: \"\\f468\"; }\n\n.fa-boxes::before {\n  content: \"\\f468\"; }\n\n.fa-boxes-alt::before {\n  content: \"\\f468\"; }\n\n.fa-link::before {\n  content: \"\\f0c1\"; }\n\n.fa-chain::before {\n  content: \"\\f0c1\"; }\n\n.fa-ear-listen::before {\n  content: \"\\f2a2\"; }\n\n.fa-assistive-listening-systems::before {\n  content: \"\\f2a2\"; }\n\n.fa-tree-city::before {\n  content: \"\\e587\"; }\n\n.fa-play::before {\n  content: \"\\f04b\"; }\n\n.fa-font::before {\n  content: \"\\f031\"; }\n\n.fa-table-cells-row-lock::before {\n  content: \"\\e67a\"; }\n\n.fa-rupiah-sign::before {\n  content: \"\\e23d\"; }\n\n.fa-magnifying-glass::before {\n  content: \"\\f002\"; }\n\n.fa-search::before {\n  content: \"\\f002\"; }\n\n.fa-table-tennis-paddle-ball::before {\n  content: \"\\f45d\"; }\n\n.fa-ping-pong-paddle-ball::before {\n  content: \"\\f45d\"; }\n\n.fa-table-tennis::before {\n  content: \"\\f45d\"; }\n\n.fa-person-dots-from-line::before {\n  content: \"\\f470\"; }\n\n.fa-diagnoses::before {\n  content: \"\\f470\"; }\n\n.fa-trash-can-arrow-up::before {\n  content: \"\\f82a\"; }\n\n.fa-trash-restore-alt::before {\n  content: \"\\f82a\"; }\n\n.fa-naira-sign::before {\n  content: \"\\e1f6\"; }\n\n.fa-cart-arrow-down::before {\n  content: \"\\f218\"; }\n\n.fa-walkie-talkie::before {\n  content: \"\\f8ef\"; }\n\n.fa-file-pen::before {\n  content: \"\\f31c\"; }\n\n.fa-file-edit::before {\n  content: \"\\f31c\"; }\n\n.fa-receipt::before {\n  content: \"\\f543\"; }\n\n.fa-square-pen::before {\n  content: \"\\f14b\"; }\n\n.fa-pen-square::before {\n  content: \"\\f14b\"; }\n\n.fa-pencil-square::before {\n  content: \"\\f14b\"; }\n\n.fa-suitcase-rolling::before {\n  content: \"\\f5c1\"; }\n\n.fa-person-circle-exclamation::before {\n  content: \"\\e53f\"; }\n\n.fa-chevron-down::before {\n  content: \"\\f078\"; }\n\n.fa-battery-full::before {\n  content: \"\\f240\"; }\n\n.fa-battery::before {\n  content: \"\\f240\"; }\n\n.fa-battery-5::before {\n  content: \"\\f240\"; }\n\n.fa-skull-crossbones::before {\n  content: \"\\f714\"; }\n\n.fa-code-compare::before {\n  content: \"\\e13a\"; }\n\n.fa-list-ul::before {\n  content: \"\\f0ca\"; }\n\n.fa-list-dots::before {\n  content: \"\\f0ca\"; }\n\n.fa-school-lock::before {\n  content: \"\\e56f\"; }\n\n.fa-tower-cell::before {\n  content: \"\\e585\"; }\n\n.fa-down-long::before {\n  content: \"\\f309\"; }\n\n.fa-long-arrow-alt-down::before {\n  content: \"\\f309\"; }\n\n.fa-ranking-star::before {\n  content: \"\\e561\"; }\n\n.fa-chess-king::before {\n  content: \"\\f43f\"; }\n\n.fa-person-harassing::before {\n  content: \"\\e549\"; }\n\n.fa-brazilian-real-sign::before {\n  content: \"\\e46c\"; }\n\n.fa-landmark-dome::before {\n  content: \"\\f752\"; }\n\n.fa-landmark-alt::before {\n  content: \"\\f752\"; }\n\n.fa-arrow-up::before {\n  content: \"\\f062\"; }\n\n.fa-tv::before {\n  content: \"\\f26c\"; }\n\n.fa-television::before {\n  content: \"\\f26c\"; }\n\n.fa-tv-alt::before {\n  content: \"\\f26c\"; }\n\n.fa-shrimp::before {\n  content: \"\\e448\"; }\n\n.fa-list-check::before {\n  content: \"\\f0ae\"; }\n\n.fa-tasks::before {\n  content: \"\\f0ae\"; }\n\n.fa-jug-detergent::before {\n  content: \"\\e519\"; }\n\n.fa-circle-user::before {\n  content: \"\\f2bd\"; }\n\n.fa-user-circle::before {\n  content: \"\\f2bd\"; }\n\n.fa-user-shield::before {\n  content: \"\\f505\"; }\n\n.fa-wind::before {\n  content: \"\\f72e\"; }\n\n.fa-car-burst::before {\n  content: \"\\f5e1\"; }\n\n.fa-car-crash::before {\n  content: \"\\f5e1\"; }\n\n.fa-y::before {\n  content: \"\\59\"; }\n\n.fa-person-snowboarding::before {\n  content: \"\\f7ce\"; }\n\n.fa-snowboarding::before {\n  content: \"\\f7ce\"; }\n\n.fa-truck-fast::before {\n  content: \"\\f48b\"; }\n\n.fa-shipping-fast::before {\n  content: \"\\f48b\"; }\n\n.fa-fish::before {\n  content: \"\\f578\"; }\n\n.fa-user-graduate::before {\n  content: \"\\f501\"; }\n\n.fa-circle-half-stroke::before {\n  content: \"\\f042\"; }\n\n.fa-adjust::before {\n  content: \"\\f042\"; }\n\n.fa-clapperboard::before {\n  content: \"\\e131\"; }\n\n.fa-circle-radiation::before {\n  content: \"\\f7ba\"; }\n\n.fa-radiation-alt::before {\n  content: \"\\f7ba\"; }\n\n.fa-baseball::before {\n  content: \"\\f433\"; }\n\n.fa-baseball-ball::before {\n  content: \"\\f433\"; }\n\n.fa-jet-fighter-up::before {\n  content: \"\\e518\"; }\n\n.fa-diagram-project::before {\n  content: \"\\f542\"; }\n\n.fa-project-diagram::before {\n  content: \"\\f542\"; }\n\n.fa-copy::before {\n  content: \"\\f0c5\"; }\n\n.fa-volume-xmark::before {\n  content: \"\\f6a9\"; }\n\n.fa-volume-mute::before {\n  content: \"\\f6a9\"; }\n\n.fa-volume-times::before {\n  content: \"\\f6a9\"; }\n\n.fa-hand-sparkles::before {\n  content: \"\\e05d\"; }\n\n.fa-grip::before {\n  content: \"\\f58d\"; }\n\n.fa-grip-horizontal::before {\n  content: \"\\f58d\"; }\n\n.fa-share-from-square::before {\n  content: \"\\f14d\"; }\n\n.fa-share-square::before {\n  content: \"\\f14d\"; }\n\n.fa-child-combatant::before {\n  content: \"\\e4e0\"; }\n\n.fa-child-rifle::before {\n  content: \"\\e4e0\"; }\n\n.fa-gun::before {\n  content: \"\\e19b\"; }\n\n.fa-square-phone::before {\n  content: \"\\f098\"; }\n\n.fa-phone-square::before {\n  content: \"\\f098\"; }\n\n.fa-plus::before {\n  content: \"\\2b\"; }\n\n.fa-add::before {\n  content: \"\\2b\"; }\n\n.fa-expand::before {\n  content: \"\\f065\"; }\n\n.fa-computer::before {\n  content: \"\\e4e5\"; }\n\n.fa-xmark::before {\n  content: \"\\f00d\"; }\n\n.fa-close::before {\n  content: \"\\f00d\"; }\n\n.fa-multiply::before {\n  content: \"\\f00d\"; }\n\n.fa-remove::before {\n  content: \"\\f00d\"; }\n\n.fa-times::before {\n  content: \"\\f00d\"; }\n\n.fa-arrows-up-down-left-right::before {\n  content: \"\\f047\"; }\n\n.fa-arrows::before {\n  content: \"\\f047\"; }\n\n.fa-chalkboard-user::before {\n  content: \"\\f51c\"; }\n\n.fa-chalkboard-teacher::before {\n  content: \"\\f51c\"; }\n\n.fa-peso-sign::before {\n  content: \"\\e222\"; }\n\n.fa-building-shield::before {\n  content: \"\\e4d8\"; }\n\n.fa-baby::before {\n  content: \"\\f77c\"; }\n\n.fa-users-line::before {\n  content: \"\\e592\"; }\n\n.fa-quote-left::before {\n  content: \"\\f10d\"; }\n\n.fa-quote-left-alt::before {\n  content: \"\\f10d\"; }\n\n.fa-tractor::before {\n  content: \"\\f722\"; }\n\n.fa-trash-arrow-up::before {\n  content: \"\\f829\"; }\n\n.fa-trash-restore::before {\n  content: \"\\f829\"; }\n\n.fa-arrow-down-up-lock::before {\n  content: \"\\e4b0\"; }\n\n.fa-lines-leaning::before {\n  content: \"\\e51e\"; }\n\n.fa-ruler-combined::before {\n  content: \"\\f546\"; }\n\n.fa-copyright::before {\n  content: \"\\f1f9\"; }\n\n.fa-equals::before {\n  content: \"\\3d\"; }\n\n.fa-blender::before {\n  content: \"\\f517\"; }\n\n.fa-teeth::before {\n  content: \"\\f62e\"; }\n\n.fa-shekel-sign::before {\n  content: \"\\f20b\"; }\n\n.fa-ils::before {\n  content: \"\\f20b\"; }\n\n.fa-shekel::before {\n  content: \"\\f20b\"; }\n\n.fa-sheqel::before {\n  content: \"\\f20b\"; }\n\n.fa-sheqel-sign::before {\n  content: \"\\f20b\"; }\n\n.fa-map::before {\n  content: \"\\f279\"; }\n\n.fa-rocket::before {\n  content: \"\\f135\"; }\n\n.fa-photo-film::before {\n  content: \"\\f87c\"; }\n\n.fa-photo-video::before {\n  content: \"\\f87c\"; }\n\n.fa-folder-minus::before {\n  content: \"\\f65d\"; }\n\n.fa-store::before {\n  content: \"\\f54e\"; }\n\n.fa-arrow-trend-up::before {\n  content: \"\\e098\"; }\n\n.fa-plug-circle-minus::before {\n  content: \"\\e55e\"; }\n\n.fa-sign-hanging::before {\n  content: \"\\f4d9\"; }\n\n.fa-sign::before {\n  content: \"\\f4d9\"; }\n\n.fa-bezier-curve::before {\n  content: \"\\f55b\"; }\n\n.fa-bell-slash::before {\n  content: \"\\f1f6\"; }\n\n.fa-tablet::before {\n  content: \"\\f3fb\"; }\n\n.fa-tablet-android::before {\n  content: \"\\f3fb\"; }\n\n.fa-school-flag::before {\n  content: \"\\e56e\"; }\n\n.fa-fill::before {\n  content: \"\\f575\"; }\n\n.fa-angle-up::before {\n  content: \"\\f106\"; }\n\n.fa-drumstick-bite::before {\n  content: \"\\f6d7\"; }\n\n.fa-holly-berry::before {\n  content: \"\\f7aa\"; }\n\n.fa-chevron-left::before {\n  content: \"\\f053\"; }\n\n.fa-bacteria::before {\n  content: \"\\e059\"; }\n\n.fa-hand-lizard::before {\n  content: \"\\f258\"; }\n\n.fa-notdef::before {\n  content: \"\\e1fe\"; }\n\n.fa-disease::before {\n  content: \"\\f7fa\"; }\n\n.fa-briefcase-medical::before {\n  content: \"\\f469\"; }\n\n.fa-genderless::before {\n  content: \"\\f22d\"; }\n\n.fa-chevron-right::before {\n  content: \"\\f054\"; }\n\n.fa-retweet::before {\n  content: \"\\f079\"; }\n\n.fa-car-rear::before {\n  content: \"\\f5de\"; }\n\n.fa-car-alt::before {\n  content: \"\\f5de\"; }\n\n.fa-pump-soap::before {\n  content: \"\\e06b\"; }\n\n.fa-video-slash::before {\n  content: \"\\f4e2\"; }\n\n.fa-battery-quarter::before {\n  content: \"\\f243\"; }\n\n.fa-battery-2::before {\n  content: \"\\f243\"; }\n\n.fa-radio::before {\n  content: \"\\f8d7\"; }\n\n.fa-baby-carriage::before {\n  content: \"\\f77d\"; }\n\n.fa-carriage-baby::before {\n  content: \"\\f77d\"; }\n\n.fa-traffic-light::before {\n  content: \"\\f637\"; }\n\n.fa-thermometer::before {\n  content: \"\\f491\"; }\n\n.fa-vr-cardboard::before {\n  content: \"\\f729\"; }\n\n.fa-hand-middle-finger::before {\n  content: \"\\f806\"; }\n\n.fa-percent::before {\n  content: \"\\25\"; }\n\n.fa-percentage::before {\n  content: \"\\25\"; }\n\n.fa-truck-moving::before {\n  content: \"\\f4df\"; }\n\n.fa-glass-water-droplet::before {\n  content: \"\\e4f5\"; }\n\n.fa-display::before {\n  content: \"\\e163\"; }\n\n.fa-face-smile::before {\n  content: \"\\f118\"; }\n\n.fa-smile::before {\n  content: \"\\f118\"; }\n\n.fa-thumbtack::before {\n  content: \"\\f08d\"; }\n\n.fa-thumb-tack::before {\n  content: \"\\f08d\"; }\n\n.fa-trophy::before {\n  content: \"\\f091\"; }\n\n.fa-person-praying::before {\n  content: \"\\f683\"; }\n\n.fa-pray::before {\n  content: \"\\f683\"; }\n\n.fa-hammer::before {\n  content: \"\\f6e3\"; }\n\n.fa-hand-peace::before {\n  content: \"\\f25b\"; }\n\n.fa-rotate::before {\n  content: \"\\f2f1\"; }\n\n.fa-sync-alt::before {\n  content: \"\\f2f1\"; }\n\n.fa-spinner::before {\n  content: \"\\f110\"; }\n\n.fa-robot::before {\n  content: \"\\f544\"; }\n\n.fa-peace::before {\n  content: \"\\f67c\"; }\n\n.fa-gears::before {\n  content: \"\\f085\"; }\n\n.fa-cogs::before {\n  content: \"\\f085\"; }\n\n.fa-warehouse::before {\n  content: \"\\f494\"; }\n\n.fa-arrow-up-right-dots::before {\n  content: \"\\e4b7\"; }\n\n.fa-splotch::before {\n  content: \"\\f5bc\"; }\n\n.fa-face-grin-hearts::before {\n  content: \"\\f584\"; }\n\n.fa-grin-hearts::before {\n  content: \"\\f584\"; }\n\n.fa-dice-four::before {\n  content: \"\\f524\"; }\n\n.fa-sim-card::before {\n  content: \"\\f7c4\"; }\n\n.fa-transgender::before {\n  content: \"\\f225\"; }\n\n.fa-transgender-alt::before {\n  content: \"\\f225\"; }\n\n.fa-mercury::before {\n  content: \"\\f223\"; }\n\n.fa-arrow-turn-down::before {\n  content: \"\\f149\"; }\n\n.fa-level-down::before {\n  content: \"\\f149\"; }\n\n.fa-person-falling-burst::before {\n  content: \"\\e547\"; }\n\n.fa-award::before {\n  content: \"\\f559\"; }\n\n.fa-ticket-simple::before {\n  content: \"\\f3ff\"; }\n\n.fa-ticket-alt::before {\n  content: \"\\f3ff\"; }\n\n.fa-building::before {\n  content: \"\\f1ad\"; }\n\n.fa-angles-left::before {\n  content: \"\\f100\"; }\n\n.fa-angle-double-left::before {\n  content: \"\\f100\"; }\n\n.fa-qrcode::before {\n  content: \"\\f029\"; }\n\n.fa-clock-rotate-left::before {\n  content: \"\\f1da\"; }\n\n.fa-history::before {\n  content: \"\\f1da\"; }\n\n.fa-face-grin-beam-sweat::before {\n  content: \"\\f583\"; }\n\n.fa-grin-beam-sweat::before {\n  content: \"\\f583\"; }\n\n.fa-file-export::before {\n  content: \"\\f56e\"; }\n\n.fa-arrow-right-from-file::before {\n  content: \"\\f56e\"; }\n\n.fa-shield::before {\n  content: \"\\f132\"; }\n\n.fa-shield-blank::before {\n  content: \"\\f132\"; }\n\n.fa-arrow-up-short-wide::before {\n  content: \"\\f885\"; }\n\n.fa-sort-amount-up-alt::before {\n  content: \"\\f885\"; }\n\n.fa-house-medical::before {\n  content: \"\\e3b2\"; }\n\n.fa-golf-ball-tee::before {\n  content: \"\\f450\"; }\n\n.fa-golf-ball::before {\n  content: \"\\f450\"; }\n\n.fa-circle-chevron-left::before {\n  content: \"\\f137\"; }\n\n.fa-chevron-circle-left::before {\n  content: \"\\f137\"; }\n\n.fa-house-chimney-window::before {\n  content: \"\\e00d\"; }\n\n.fa-pen-nib::before {\n  content: \"\\f5ad\"; }\n\n.fa-tent-arrow-turn-left::before {\n  content: \"\\e580\"; }\n\n.fa-tents::before {\n  content: \"\\e582\"; }\n\n.fa-wand-magic::before {\n  content: \"\\f0d0\"; }\n\n.fa-magic::before {\n  content: \"\\f0d0\"; }\n\n.fa-dog::before {\n  content: \"\\f6d3\"; }\n\n.fa-carrot::before {\n  content: \"\\f787\"; }\n\n.fa-moon::before {\n  content: \"\\f186\"; }\n\n.fa-wine-glass-empty::before {\n  content: \"\\f5ce\"; }\n\n.fa-wine-glass-alt::before {\n  content: \"\\f5ce\"; }\n\n.fa-cheese::before {\n  content: \"\\f7ef\"; }\n\n.fa-yin-yang::before {\n  content: \"\\f6ad\"; }\n\n.fa-music::before {\n  content: \"\\f001\"; }\n\n.fa-code-commit::before {\n  content: \"\\f386\"; }\n\n.fa-temperature-low::before {\n  content: \"\\f76b\"; }\n\n.fa-person-biking::before {\n  content: \"\\f84a\"; }\n\n.fa-biking::before {\n  content: \"\\f84a\"; }\n\n.fa-broom::before {\n  content: \"\\f51a\"; }\n\n.fa-shield-heart::before {\n  content: \"\\e574\"; }\n\n.fa-gopuram::before {\n  content: \"\\f664\"; }\n\n.fa-earth-oceania::before {\n  content: \"\\e47b\"; }\n\n.fa-globe-oceania::before {\n  content: \"\\e47b\"; }\n\n.fa-square-xmark::before {\n  content: \"\\f2d3\"; }\n\n.fa-times-square::before {\n  content: \"\\f2d3\"; }\n\n.fa-xmark-square::before {\n  content: \"\\f2d3\"; }\n\n.fa-hashtag::before {\n  content: \"\\23\"; }\n\n.fa-up-right-and-down-left-from-center::before {\n  content: \"\\f424\"; }\n\n.fa-expand-alt::before {\n  content: \"\\f424\"; }\n\n.fa-oil-can::before {\n  content: \"\\f613\"; }\n\n.fa-t::before {\n  content: \"\\54\"; }\n\n.fa-hippo::before {\n  content: \"\\f6ed\"; }\n\n.fa-chart-column::before {\n  content: \"\\e0e3\"; }\n\n.fa-infinity::before {\n  content: \"\\f534\"; }\n\n.fa-vial-circle-check::before {\n  content: \"\\e596\"; }\n\n.fa-person-arrow-down-to-line::before {\n  content: \"\\e538\"; }\n\n.fa-voicemail::before {\n  content: \"\\f897\"; }\n\n.fa-fan::before {\n  content: \"\\f863\"; }\n\n.fa-person-walking-luggage::before {\n  content: \"\\e554\"; }\n\n.fa-up-down::before {\n  content: \"\\f338\"; }\n\n.fa-arrows-alt-v::before {\n  content: \"\\f338\"; }\n\n.fa-cloud-moon-rain::before {\n  content: \"\\f73c\"; }\n\n.fa-calendar::before {\n  content: \"\\f133\"; }\n\n.fa-trailer::before {\n  content: \"\\e041\"; }\n\n.fa-bahai::before {\n  content: \"\\f666\"; }\n\n.fa-haykal::before {\n  content: \"\\f666\"; }\n\n.fa-sd-card::before {\n  content: \"\\f7c2\"; }\n\n.fa-dragon::before {\n  content: \"\\f6d5\"; }\n\n.fa-shoe-prints::before {\n  content: \"\\f54b\"; }\n\n.fa-circle-plus::before {\n  content: \"\\f055\"; }\n\n.fa-plus-circle::before {\n  content: \"\\f055\"; }\n\n.fa-face-grin-tongue-wink::before {\n  content: \"\\f58b\"; }\n\n.fa-grin-tongue-wink::before {\n  content: \"\\f58b\"; }\n\n.fa-hand-holding::before {\n  content: \"\\f4bd\"; }\n\n.fa-plug-circle-exclamation::before {\n  content: \"\\e55d\"; }\n\n.fa-link-slash::before {\n  content: \"\\f127\"; }\n\n.fa-chain-broken::before {\n  content: \"\\f127\"; }\n\n.fa-chain-slash::before {\n  content: \"\\f127\"; }\n\n.fa-unlink::before {\n  content: \"\\f127\"; }\n\n.fa-clone::before {\n  content: \"\\f24d\"; }\n\n.fa-person-walking-arrow-loop-left::before {\n  content: \"\\e551\"; }\n\n.fa-arrow-up-z-a::before {\n  content: \"\\f882\"; }\n\n.fa-sort-alpha-up-alt::before {\n  content: \"\\f882\"; }\n\n.fa-fire-flame-curved::before {\n  content: \"\\f7e4\"; }\n\n.fa-fire-alt::before {\n  content: \"\\f7e4\"; }\n\n.fa-tornado::before {\n  content: \"\\f76f\"; }\n\n.fa-file-circle-plus::before {\n  content: \"\\e494\"; }\n\n.fa-book-quran::before {\n  content: \"\\f687\"; }\n\n.fa-quran::before {\n  content: \"\\f687\"; }\n\n.fa-anchor::before {\n  content: \"\\f13d\"; }\n\n.fa-border-all::before {\n  content: \"\\f84c\"; }\n\n.fa-face-angry::before {\n  content: \"\\f556\"; }\n\n.fa-angry::before {\n  content: \"\\f556\"; }\n\n.fa-cookie-bite::before {\n  content: \"\\f564\"; }\n\n.fa-arrow-trend-down::before {\n  content: \"\\e097\"; }\n\n.fa-rss::before {\n  content: \"\\f09e\"; }\n\n.fa-feed::before {\n  content: \"\\f09e\"; }\n\n.fa-draw-polygon::before {\n  content: \"\\f5ee\"; }\n\n.fa-scale-balanced::before {\n  content: \"\\f24e\"; }\n\n.fa-balance-scale::before {\n  content: \"\\f24e\"; }\n\n.fa-gauge-simple-high::before {\n  content: \"\\f62a\"; }\n\n.fa-tachometer::before {\n  content: \"\\f62a\"; }\n\n.fa-tachometer-fast::before {\n  content: \"\\f62a\"; }\n\n.fa-shower::before {\n  content: \"\\f2cc\"; }\n\n.fa-desktop::before {\n  content: \"\\f390\"; }\n\n.fa-desktop-alt::before {\n  content: \"\\f390\"; }\n\n.fa-m::before {\n  content: \"\\4d\"; }\n\n.fa-table-list::before {\n  content: \"\\f00b\"; }\n\n.fa-th-list::before {\n  content: \"\\f00b\"; }\n\n.fa-comment-sms::before {\n  content: \"\\f7cd\"; }\n\n.fa-sms::before {\n  content: \"\\f7cd\"; }\n\n.fa-book::before {\n  content: \"\\f02d\"; }\n\n.fa-user-plus::before {\n  content: \"\\f234\"; }\n\n.fa-check::before {\n  content: \"\\f00c\"; }\n\n.fa-battery-three-quarters::before {\n  content: \"\\f241\"; }\n\n.fa-battery-4::before {\n  content: \"\\f241\"; }\n\n.fa-house-circle-check::before {\n  content: \"\\e509\"; }\n\n.fa-angle-left::before {\n  content: \"\\f104\"; }\n\n.fa-diagram-successor::before {\n  content: \"\\e47a\"; }\n\n.fa-truck-arrow-right::before {\n  content: \"\\e58b\"; }\n\n.fa-arrows-split-up-and-left::before {\n  content: \"\\e4bc\"; }\n\n.fa-hand-fist::before {\n  content: \"\\f6de\"; }\n\n.fa-fist-raised::before {\n  content: \"\\f6de\"; }\n\n.fa-cloud-moon::before {\n  content: \"\\f6c3\"; }\n\n.fa-briefcase::before {\n  content: \"\\f0b1\"; }\n\n.fa-person-falling::before {\n  content: \"\\e546\"; }\n\n.fa-image-portrait::before {\n  content: \"\\f3e0\"; }\n\n.fa-portrait::before {\n  content: \"\\f3e0\"; }\n\n.fa-user-tag::before {\n  content: \"\\f507\"; }\n\n.fa-rug::before {\n  content: \"\\e569\"; }\n\n.fa-earth-europe::before {\n  content: \"\\f7a2\"; }\n\n.fa-globe-europe::before {\n  content: \"\\f7a2\"; }\n\n.fa-cart-flatbed-suitcase::before {\n  content: \"\\f59d\"; }\n\n.fa-luggage-cart::before {\n  content: \"\\f59d\"; }\n\n.fa-rectangle-xmark::before {\n  content: \"\\f410\"; }\n\n.fa-rectangle-times::before {\n  content: \"\\f410\"; }\n\n.fa-times-rectangle::before {\n  content: \"\\f410\"; }\n\n.fa-window-close::before {\n  content: \"\\f410\"; }\n\n.fa-baht-sign::before {\n  content: \"\\e0ac\"; }\n\n.fa-book-open::before {\n  content: \"\\f518\"; }\n\n.fa-book-journal-whills::before {\n  content: \"\\f66a\"; }\n\n.fa-journal-whills::before {\n  content: \"\\f66a\"; }\n\n.fa-handcuffs::before {\n  content: \"\\e4f8\"; }\n\n.fa-triangle-exclamation::before {\n  content: \"\\f071\"; }\n\n.fa-exclamation-triangle::before {\n  content: \"\\f071\"; }\n\n.fa-warning::before {\n  content: \"\\f071\"; }\n\n.fa-database::before {\n  content: \"\\f1c0\"; }\n\n.fa-share::before {\n  content: \"\\f064\"; }\n\n.fa-mail-forward::before {\n  content: \"\\f064\"; }\n\n.fa-bottle-droplet::before {\n  content: \"\\e4c4\"; }\n\n.fa-mask-face::before {\n  content: \"\\e1d7\"; }\n\n.fa-hill-rockslide::before {\n  content: \"\\e508\"; }\n\n.fa-right-left::before {\n  content: \"\\f362\"; }\n\n.fa-exchange-alt::before {\n  content: \"\\f362\"; }\n\n.fa-paper-plane::before {\n  content: \"\\f1d8\"; }\n\n.fa-road-circle-exclamation::before {\n  content: \"\\e565\"; }\n\n.fa-dungeon::before {\n  content: \"\\f6d9\"; }\n\n.fa-align-right::before {\n  content: \"\\f038\"; }\n\n.fa-money-bill-1-wave::before {\n  content: \"\\f53b\"; }\n\n.fa-money-bill-wave-alt::before {\n  content: \"\\f53b\"; }\n\n.fa-life-ring::before {\n  content: \"\\f1cd\"; }\n\n.fa-hands::before {\n  content: \"\\f2a7\"; }\n\n.fa-sign-language::before {\n  content: \"\\f2a7\"; }\n\n.fa-signing::before {\n  content: \"\\f2a7\"; }\n\n.fa-calendar-day::before {\n  content: \"\\f783\"; }\n\n.fa-water-ladder::before {\n  content: \"\\f5c5\"; }\n\n.fa-ladder-water::before {\n  content: \"\\f5c5\"; }\n\n.fa-swimming-pool::before {\n  content: \"\\f5c5\"; }\n\n.fa-arrows-up-down::before {\n  content: \"\\f07d\"; }\n\n.fa-arrows-v::before {\n  content: \"\\f07d\"; }\n\n.fa-face-grimace::before {\n  content: \"\\f57f\"; }\n\n.fa-grimace::before {\n  content: \"\\f57f\"; }\n\n.fa-wheelchair-move::before {\n  content: \"\\e2ce\"; }\n\n.fa-wheelchair-alt::before {\n  content: \"\\e2ce\"; }\n\n.fa-turn-down::before {\n  content: \"\\f3be\"; }\n\n.fa-level-down-alt::before {\n  content: \"\\f3be\"; }\n\n.fa-person-walking-arrow-right::before {\n  content: \"\\e552\"; }\n\n.fa-square-envelope::before {\n  content: \"\\f199\"; }\n\n.fa-envelope-square::before {\n  content: \"\\f199\"; }\n\n.fa-dice::before {\n  content: \"\\f522\"; }\n\n.fa-bowling-ball::before {\n  content: \"\\f436\"; }\n\n.fa-brain::before {\n  content: \"\\f5dc\"; }\n\n.fa-bandage::before {\n  content: \"\\f462\"; }\n\n.fa-band-aid::before {\n  content: \"\\f462\"; }\n\n.fa-calendar-minus::before {\n  content: \"\\f272\"; }\n\n.fa-circle-xmark::before {\n  content: \"\\f057\"; }\n\n.fa-times-circle::before {\n  content: \"\\f057\"; }\n\n.fa-xmark-circle::before {\n  content: \"\\f057\"; }\n\n.fa-gifts::before {\n  content: \"\\f79c\"; }\n\n.fa-hotel::before {\n  content: \"\\f594\"; }\n\n.fa-earth-asia::before {\n  content: \"\\f57e\"; }\n\n.fa-globe-asia::before {\n  content: \"\\f57e\"; }\n\n.fa-id-card-clip::before {\n  content: \"\\f47f\"; }\n\n.fa-id-card-alt::before {\n  content: \"\\f47f\"; }\n\n.fa-magnifying-glass-plus::before {\n  content: \"\\f00e\"; }\n\n.fa-search-plus::before {\n  content: \"\\f00e\"; }\n\n.fa-thumbs-up::before {\n  content: \"\\f164\"; }\n\n.fa-user-clock::before {\n  content: \"\\f4fd\"; }\n\n.fa-hand-dots::before {\n  content: \"\\f461\"; }\n\n.fa-allergies::before {\n  content: \"\\f461\"; }\n\n.fa-file-invoice::before {\n  content: \"\\f570\"; }\n\n.fa-window-minimize::before {\n  content: \"\\f2d1\"; }\n\n.fa-mug-saucer::before {\n  content: \"\\f0f4\"; }\n\n.fa-coffee::before {\n  content: \"\\f0f4\"; }\n\n.fa-brush::before {\n  content: \"\\f55d\"; }\n\n.fa-mask::before {\n  content: \"\\f6fa\"; }\n\n.fa-magnifying-glass-minus::before {\n  content: \"\\f010\"; }\n\n.fa-search-minus::before {\n  content: \"\\f010\"; }\n\n.fa-ruler-vertical::before {\n  content: \"\\f548\"; }\n\n.fa-user-large::before {\n  content: \"\\f406\"; }\n\n.fa-user-alt::before {\n  content: \"\\f406\"; }\n\n.fa-train-tram::before {\n  content: \"\\e5b4\"; }\n\n.fa-user-nurse::before {\n  content: \"\\f82f\"; }\n\n.fa-syringe::before {\n  content: \"\\f48e\"; }\n\n.fa-cloud-sun::before {\n  content: \"\\f6c4\"; }\n\n.fa-stopwatch-20::before {\n  content: \"\\e06f\"; }\n\n.fa-square-full::before {\n  content: \"\\f45c\"; }\n\n.fa-magnet::before {\n  content: \"\\f076\"; }\n\n.fa-jar::before {\n  content: \"\\e516\"; }\n\n.fa-note-sticky::before {\n  content: \"\\f249\"; }\n\n.fa-sticky-note::before {\n  content: \"\\f249\"; }\n\n.fa-bug-slash::before {\n  content: \"\\e490\"; }\n\n.fa-arrow-up-from-water-pump::before {\n  content: \"\\e4b6\"; }\n\n.fa-bone::before {\n  content: \"\\f5d7\"; }\n\n.fa-user-injured::before {\n  content: \"\\f728\"; }\n\n.fa-face-sad-tear::before {\n  content: \"\\f5b4\"; }\n\n.fa-sad-tear::before {\n  content: \"\\f5b4\"; }\n\n.fa-plane::before {\n  content: \"\\f072\"; }\n\n.fa-tent-arrows-down::before {\n  content: \"\\e581\"; }\n\n.fa-exclamation::before {\n  content: \"\\21\"; }\n\n.fa-arrows-spin::before {\n  content: \"\\e4bb\"; }\n\n.fa-print::before {\n  content: \"\\f02f\"; }\n\n.fa-turkish-lira-sign::before {\n  content: \"\\e2bb\"; }\n\n.fa-try::before {\n  content: \"\\e2bb\"; }\n\n.fa-turkish-lira::before {\n  content: \"\\e2bb\"; }\n\n.fa-dollar-sign::before {\n  content: \"\\24\"; }\n\n.fa-dollar::before {\n  content: \"\\24\"; }\n\n.fa-usd::before {\n  content: \"\\24\"; }\n\n.fa-x::before {\n  content: \"\\58\"; }\n\n.fa-magnifying-glass-dollar::before {\n  content: \"\\f688\"; }\n\n.fa-search-dollar::before {\n  content: \"\\f688\"; }\n\n.fa-users-gear::before {\n  content: \"\\f509\"; }\n\n.fa-users-cog::before {\n  content: \"\\f509\"; }\n\n.fa-person-military-pointing::before {\n  content: \"\\e54a\"; }\n\n.fa-building-columns::before {\n  content: \"\\f19c\"; }\n\n.fa-bank::before {\n  content: \"\\f19c\"; }\n\n.fa-institution::before {\n  content: \"\\f19c\"; }\n\n.fa-museum::before {\n  content: \"\\f19c\"; }\n\n.fa-university::before {\n  content: \"\\f19c\"; }\n\n.fa-umbrella::before {\n  content: \"\\f0e9\"; }\n\n.fa-trowel::before {\n  content: \"\\e589\"; }\n\n.fa-d::before {\n  content: \"\\44\"; }\n\n.fa-stapler::before {\n  content: \"\\e5af\"; }\n\n.fa-masks-theater::before {\n  content: \"\\f630\"; }\n\n.fa-theater-masks::before {\n  content: \"\\f630\"; }\n\n.fa-kip-sign::before {\n  content: \"\\e1c4\"; }\n\n.fa-hand-point-left::before {\n  content: \"\\f0a5\"; }\n\n.fa-handshake-simple::before {\n  content: \"\\f4c6\"; }\n\n.fa-handshake-alt::before {\n  content: \"\\f4c6\"; }\n\n.fa-jet-fighter::before {\n  content: \"\\f0fb\"; }\n\n.fa-fighter-jet::before {\n  content: \"\\f0fb\"; }\n\n.fa-square-share-nodes::before {\n  content: \"\\f1e1\"; }\n\n.fa-share-alt-square::before {\n  content: \"\\f1e1\"; }\n\n.fa-barcode::before {\n  content: \"\\f02a\"; }\n\n.fa-plus-minus::before {\n  content: \"\\e43c\"; }\n\n.fa-video::before {\n  content: \"\\f03d\"; }\n\n.fa-video-camera::before {\n  content: \"\\f03d\"; }\n\n.fa-graduation-cap::before {\n  content: \"\\f19d\"; }\n\n.fa-mortar-board::before {\n  content: \"\\f19d\"; }\n\n.fa-hand-holding-medical::before {\n  content: \"\\e05c\"; }\n\n.fa-person-circle-check::before {\n  content: \"\\e53e\"; }\n\n.fa-turn-up::before {\n  content: \"\\f3bf\"; }\n\n.fa-level-up-alt::before {\n  content: \"\\f3bf\"; }\n\n.sr-only,\n.fa-sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border-width: 0; }\n\n.sr-only-focusable:not(:focus),\n.fa-sr-only-focusable:not(:focus) {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border-width: 0; }\n:root, :host {\n  --fa-style-family-brands: 'Font Awesome 6 Brands';\n  --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; }\n\n@font-face {\n  font-family: 'Font Awesome 6 Brands';\n  font-style: normal;\n  font-weight: 400;\n  font-display: block;\n  src: url(\"../webfonts/fa-brands-400.woff2\") format(\"woff2\"), url(\"../webfonts/fa-brands-400.ttf\") format(\"truetype\"); }\n\n.fab,\n.fa-brands {\n  font-weight: 400; }\n\n.fa-monero:before {\n  content: \"\\f3d0\"; }\n\n.fa-hooli:before {\n  content: \"\\f427\"; }\n\n.fa-yelp:before {\n  content: \"\\f1e9\"; }\n\n.fa-cc-visa:before {\n  content: \"\\f1f0\"; }\n\n.fa-lastfm:before {\n  content: \"\\f202\"; }\n\n.fa-shopware:before {\n  content: \"\\f5b5\"; }\n\n.fa-creative-commons-nc:before {\n  content: \"\\f4e8\"; }\n\n.fa-aws:before {\n  content: \"\\f375\"; }\n\n.fa-redhat:before {\n  content: \"\\f7bc\"; }\n\n.fa-yoast:before {\n  content: \"\\f2b1\"; }\n\n.fa-cloudflare:before {\n  content: \"\\e07d\"; }\n\n.fa-ups:before {\n  content: \"\\f7e0\"; }\n\n.fa-pixiv:before {\n  content: \"\\e640\"; }\n\n.fa-wpexplorer:before {\n  content: \"\\f2de\"; }\n\n.fa-dyalog:before {\n  content: \"\\f399\"; }\n\n.fa-bity:before {\n  content: \"\\f37a\"; }\n\n.fa-stackpath:before {\n  content: \"\\f842\"; }\n\n.fa-buysellads:before {\n  content: \"\\f20d\"; }\n\n.fa-first-order:before {\n  content: \"\\f2b0\"; }\n\n.fa-modx:before {\n  content: \"\\f285\"; }\n\n.fa-guilded:before {\n  content: \"\\e07e\"; }\n\n.fa-vnv:before {\n  content: \"\\f40b\"; }\n\n.fa-square-js:before {\n  content: \"\\f3b9\"; }\n\n.fa-js-square:before {\n  content: \"\\f3b9\"; }\n\n.fa-microsoft:before {\n  content: \"\\f3ca\"; }\n\n.fa-qq:before {\n  content: \"\\f1d6\"; }\n\n.fa-orcid:before {\n  content: \"\\f8d2\"; }\n\n.fa-java:before {\n  content: \"\\f4e4\"; }\n\n.fa-invision:before {\n  content: \"\\f7b0\"; }\n\n.fa-creative-commons-pd-alt:before {\n  content: \"\\f4ed\"; }\n\n.fa-centercode:before {\n  content: \"\\f380\"; }\n\n.fa-glide-g:before {\n  content: \"\\f2a6\"; }\n\n.fa-drupal:before {\n  content: \"\\f1a9\"; }\n\n.fa-jxl:before {\n  content: \"\\e67b\"; }\n\n.fa-hire-a-helper:before {\n  content: \"\\f3b0\"; }\n\n.fa-creative-commons-by:before {\n  content: \"\\f4e7\"; }\n\n.fa-unity:before {\n  content: \"\\e049\"; }\n\n.fa-whmcs:before {\n  content: \"\\f40d\"; }\n\n.fa-rocketchat:before {\n  content: \"\\f3e8\"; }\n\n.fa-vk:before {\n  content: \"\\f189\"; }\n\n.fa-untappd:before {\n  content: \"\\f405\"; }\n\n.fa-mailchimp:before {\n  content: \"\\f59e\"; }\n\n.fa-css3-alt:before {\n  content: \"\\f38b\"; }\n\n.fa-square-reddit:before {\n  content: \"\\f1a2\"; }\n\n.fa-reddit-square:before {\n  content: \"\\f1a2\"; }\n\n.fa-vimeo-v:before {\n  content: \"\\f27d\"; }\n\n.fa-contao:before {\n  content: \"\\f26d\"; }\n\n.fa-square-font-awesome:before {\n  content: \"\\e5ad\"; }\n\n.fa-deskpro:before {\n  content: \"\\f38f\"; }\n\n.fa-brave:before {\n  content: \"\\e63c\"; }\n\n.fa-sistrix:before {\n  content: \"\\f3ee\"; }\n\n.fa-square-instagram:before {\n  content: \"\\e055\"; }\n\n.fa-instagram-square:before {\n  content: \"\\e055\"; }\n\n.fa-battle-net:before {\n  content: \"\\f835\"; }\n\n.fa-the-red-yeti:before {\n  content: \"\\f69d\"; }\n\n.fa-square-hacker-news:before {\n  content: \"\\f3af\"; }\n\n.fa-hacker-news-square:before {\n  content: \"\\f3af\"; }\n\n.fa-edge:before {\n  content: \"\\f282\"; }\n\n.fa-threads:before {\n  content: \"\\e618\"; }\n\n.fa-napster:before {\n  content: \"\\f3d2\"; }\n\n.fa-square-snapchat:before {\n  content: \"\\f2ad\"; }\n\n.fa-snapchat-square:before {\n  content: \"\\f2ad\"; }\n\n.fa-google-plus-g:before {\n  content: \"\\f0d5\"; }\n\n.fa-artstation:before {\n  content: \"\\f77a\"; }\n\n.fa-markdown:before {\n  content: \"\\f60f\"; }\n\n.fa-sourcetree:before {\n  content: \"\\f7d3\"; }\n\n.fa-google-plus:before {\n  content: \"\\f2b3\"; }\n\n.fa-diaspora:before {\n  content: \"\\f791\"; }\n\n.fa-foursquare:before {\n  content: \"\\f180\"; }\n\n.fa-stack-overflow:before {\n  content: \"\\f16c\"; }\n\n.fa-github-alt:before {\n  content: \"\\f113\"; }\n\n.fa-phoenix-squadron:before {\n  content: \"\\f511\"; }\n\n.fa-pagelines:before {\n  content: \"\\f18c\"; }\n\n.fa-algolia:before {\n  content: \"\\f36c\"; }\n\n.fa-red-river:before {\n  content: \"\\f3e3\"; }\n\n.fa-creative-commons-sa:before {\n  content: \"\\f4ef\"; }\n\n.fa-safari:before {\n  content: \"\\f267\"; }\n\n.fa-google:before {\n  content: \"\\f1a0\"; }\n\n.fa-square-font-awesome-stroke:before {\n  content: \"\\f35c\"; }\n\n.fa-font-awesome-alt:before {\n  content: \"\\f35c\"; }\n\n.fa-atlassian:before {\n  content: \"\\f77b\"; }\n\n.fa-linkedin-in:before {\n  content: \"\\f0e1\"; }\n\n.fa-digital-ocean:before {\n  content: \"\\f391\"; }\n\n.fa-nimblr:before {\n  content: \"\\f5a8\"; }\n\n.fa-chromecast:before {\n  content: \"\\f838\"; }\n\n.fa-evernote:before {\n  content: \"\\f839\"; }\n\n.fa-hacker-news:before {\n  content: \"\\f1d4\"; }\n\n.fa-creative-commons-sampling:before {\n  content: \"\\f4f0\"; }\n\n.fa-adversal:before {\n  content: \"\\f36a\"; }\n\n.fa-creative-commons:before {\n  content: \"\\f25e\"; }\n\n.fa-watchman-monitoring:before {\n  content: \"\\e087\"; }\n\n.fa-fonticons:before {\n  content: \"\\f280\"; }\n\n.fa-weixin:before {\n  content: \"\\f1d7\"; }\n\n.fa-shirtsinbulk:before {\n  content: \"\\f214\"; }\n\n.fa-codepen:before {\n  content: \"\\f1cb\"; }\n\n.fa-git-alt:before {\n  content: \"\\f841\"; }\n\n.fa-lyft:before {\n  content: \"\\f3c3\"; }\n\n.fa-rev:before {\n  content: \"\\f5b2\"; }\n\n.fa-windows:before {\n  content: \"\\f17a\"; }\n\n.fa-wizards-of-the-coast:before {\n  content: \"\\f730\"; }\n\n.fa-square-viadeo:before {\n  content: \"\\f2aa\"; }\n\n.fa-viadeo-square:before {\n  content: \"\\f2aa\"; }\n\n.fa-meetup:before {\n  content: \"\\f2e0\"; }\n\n.fa-centos:before {\n  content: \"\\f789\"; }\n\n.fa-adn:before {\n  content: \"\\f170\"; }\n\n.fa-cloudsmith:before {\n  content: \"\\f384\"; }\n\n.fa-opensuse:before {\n  content: \"\\e62b\"; }\n\n.fa-pied-piper-alt:before {\n  content: \"\\f1a8\"; }\n\n.fa-square-dribbble:before {\n  content: \"\\f397\"; }\n\n.fa-dribbble-square:before {\n  content: \"\\f397\"; }\n\n.fa-codiepie:before {\n  content: \"\\f284\"; }\n\n.fa-node:before {\n  content: \"\\f419\"; }\n\n.fa-mix:before {\n  content: \"\\f3cb\"; }\n\n.fa-steam:before {\n  content: \"\\f1b6\"; }\n\n.fa-cc-apple-pay:before {\n  content: \"\\f416\"; }\n\n.fa-scribd:before {\n  content: \"\\f28a\"; }\n\n.fa-debian:before {\n  content: \"\\e60b\"; }\n\n.fa-openid:before {\n  content: \"\\f19b\"; }\n\n.fa-instalod:before {\n  content: \"\\e081\"; }\n\n.fa-expeditedssl:before {\n  content: \"\\f23e\"; }\n\n.fa-sellcast:before {\n  content: \"\\f2da\"; }\n\n.fa-square-twitter:before {\n  content: \"\\f081\"; }\n\n.fa-twitter-square:before {\n  content: \"\\f081\"; }\n\n.fa-r-project:before {\n  content: \"\\f4f7\"; }\n\n.fa-delicious:before {\n  content: \"\\f1a5\"; }\n\n.fa-freebsd:before {\n  content: \"\\f3a4\"; }\n\n.fa-vuejs:before {\n  content: \"\\f41f\"; }\n\n.fa-accusoft:before {\n  content: \"\\f369\"; }\n\n.fa-ioxhost:before {\n  content: \"\\f208\"; }\n\n.fa-fonticons-fi:before {\n  content: \"\\f3a2\"; }\n\n.fa-app-store:before {\n  content: \"\\f36f\"; }\n\n.fa-cc-mastercard:before {\n  content: \"\\f1f1\"; }\n\n.fa-itunes-note:before {\n  content: \"\\f3b5\"; }\n\n.fa-golang:before {\n  content: \"\\e40f\"; }\n\n.fa-kickstarter:before {\n  content: \"\\f3bb\"; }\n\n.fa-square-kickstarter:before {\n  content: \"\\f3bb\"; }\n\n.fa-grav:before {\n  content: \"\\f2d6\"; }\n\n.fa-weibo:before {\n  content: \"\\f18a\"; }\n\n.fa-uncharted:before {\n  content: \"\\e084\"; }\n\n.fa-firstdraft:before {\n  content: \"\\f3a1\"; }\n\n.fa-square-youtube:before {\n  content: \"\\f431\"; }\n\n.fa-youtube-square:before {\n  content: \"\\f431\"; }\n\n.fa-wikipedia-w:before {\n  content: \"\\f266\"; }\n\n.fa-wpressr:before {\n  content: \"\\f3e4\"; }\n\n.fa-rendact:before {\n  content: \"\\f3e4\"; }\n\n.fa-angellist:before {\n  content: \"\\f209\"; }\n\n.fa-galactic-republic:before {\n  content: \"\\f50c\"; }\n\n.fa-nfc-directional:before {\n  content: \"\\e530\"; }\n\n.fa-skype:before {\n  content: \"\\f17e\"; }\n\n.fa-joget:before {\n  content: \"\\f3b7\"; }\n\n.fa-fedora:before {\n  content: \"\\f798\"; }\n\n.fa-stripe-s:before {\n  content: \"\\f42a\"; }\n\n.fa-meta:before {\n  content: \"\\e49b\"; }\n\n.fa-laravel:before {\n  content: \"\\f3bd\"; }\n\n.fa-hotjar:before {\n  content: \"\\f3b1\"; }\n\n.fa-bluetooth-b:before {\n  content: \"\\f294\"; }\n\n.fa-square-letterboxd:before {\n  content: \"\\e62e\"; }\n\n.fa-sticker-mule:before {\n  content: \"\\f3f7\"; }\n\n.fa-creative-commons-zero:before {\n  content: \"\\f4f3\"; }\n\n.fa-hips:before {\n  content: \"\\f452\"; }\n\n.fa-behance:before {\n  content: \"\\f1b4\"; }\n\n.fa-reddit:before {\n  content: \"\\f1a1\"; }\n\n.fa-discord:before {\n  content: \"\\f392\"; }\n\n.fa-chrome:before {\n  content: \"\\f268\"; }\n\n.fa-app-store-ios:before {\n  content: \"\\f370\"; }\n\n.fa-cc-discover:before {\n  content: \"\\f1f2\"; }\n\n.fa-wpbeginner:before {\n  content: \"\\f297\"; }\n\n.fa-confluence:before {\n  content: \"\\f78d\"; }\n\n.fa-shoelace:before {\n  content: \"\\e60c\"; }\n\n.fa-mdb:before {\n  content: \"\\f8ca\"; }\n\n.fa-dochub:before {\n  content: \"\\f394\"; }\n\n.fa-accessible-icon:before {\n  content: \"\\f368\"; }\n\n.fa-ebay:before {\n  content: \"\\f4f4\"; }\n\n.fa-amazon:before {\n  content: \"\\f270\"; }\n\n.fa-unsplash:before {\n  content: \"\\e07c\"; }\n\n.fa-yarn:before {\n  content: \"\\f7e3\"; }\n\n.fa-square-steam:before {\n  content: \"\\f1b7\"; }\n\n.fa-steam-square:before {\n  content: \"\\f1b7\"; }\n\n.fa-500px:before {\n  content: \"\\f26e\"; }\n\n.fa-square-vimeo:before {\n  content: \"\\f194\"; }\n\n.fa-vimeo-square:before {\n  content: \"\\f194\"; }\n\n.fa-asymmetrik:before {\n  content: \"\\f372\"; }\n\n.fa-font-awesome:before {\n  content: \"\\f2b4\"; }\n\n.fa-font-awesome-flag:before {\n  content: \"\\f2b4\"; }\n\n.fa-font-awesome-logo-full:before {\n  content: \"\\f2b4\"; }\n\n.fa-gratipay:before {\n  content: \"\\f184\"; }\n\n.fa-apple:before {\n  content: \"\\f179\"; }\n\n.fa-hive:before {\n  content: \"\\e07f\"; }\n\n.fa-gitkraken:before {\n  content: \"\\f3a6\"; }\n\n.fa-keybase:before {\n  content: \"\\f4f5\"; }\n\n.fa-apple-pay:before {\n  content: \"\\f415\"; }\n\n.fa-padlet:before {\n  content: \"\\e4a0\"; }\n\n.fa-amazon-pay:before {\n  content: \"\\f42c\"; }\n\n.fa-square-github:before {\n  content: \"\\f092\"; }\n\n.fa-github-square:before {\n  content: \"\\f092\"; }\n\n.fa-stumbleupon:before {\n  content: \"\\f1a4\"; }\n\n.fa-fedex:before {\n  content: \"\\f797\"; }\n\n.fa-phoenix-framework:before {\n  content: \"\\f3dc\"; }\n\n.fa-shopify:before {\n  content: \"\\e057\"; }\n\n.fa-neos:before {\n  content: \"\\f612\"; }\n\n.fa-square-threads:before {\n  content: \"\\e619\"; }\n\n.fa-hackerrank:before {\n  content: \"\\f5f7\"; }\n\n.fa-researchgate:before {\n  content: \"\\f4f8\"; }\n\n.fa-swift:before {\n  content: \"\\f8e1\"; }\n\n.fa-angular:before {\n  content: \"\\f420\"; }\n\n.fa-speakap:before {\n  content: \"\\f3f3\"; }\n\n.fa-angrycreative:before {\n  content: \"\\f36e\"; }\n\n.fa-y-combinator:before {\n  content: \"\\f23b\"; }\n\n.fa-empire:before {\n  content: \"\\f1d1\"; }\n\n.fa-envira:before {\n  content: \"\\f299\"; }\n\n.fa-google-scholar:before {\n  content: \"\\e63b\"; }\n\n.fa-square-gitlab:before {\n  content: \"\\e5ae\"; }\n\n.fa-gitlab-square:before {\n  content: \"\\e5ae\"; }\n\n.fa-studiovinari:before {\n  content: \"\\f3f8\"; }\n\n.fa-pied-piper:before {\n  content: \"\\f2ae\"; }\n\n.fa-wordpress:before {\n  content: \"\\f19a\"; }\n\n.fa-product-hunt:before {\n  content: \"\\f288\"; }\n\n.fa-firefox:before {\n  content: \"\\f269\"; }\n\n.fa-linode:before {\n  content: \"\\f2b8\"; }\n\n.fa-goodreads:before {\n  content: \"\\f3a8\"; }\n\n.fa-square-odnoklassniki:before {\n  content: \"\\f264\"; }\n\n.fa-odnoklassniki-square:before {\n  content: \"\\f264\"; }\n\n.fa-jsfiddle:before {\n  content: \"\\f1cc\"; }\n\n.fa-sith:before {\n  content: \"\\f512\"; }\n\n.fa-themeisle:before {\n  content: \"\\f2b2\"; }\n\n.fa-page4:before {\n  content: \"\\f3d7\"; }\n\n.fa-hashnode:before {\n  content: \"\\e499\"; }\n\n.fa-react:before {\n  content: \"\\f41b\"; }\n\n.fa-cc-paypal:before {\n  content: \"\\f1f4\"; }\n\n.fa-squarespace:before {\n  content: \"\\f5be\"; }\n\n.fa-cc-stripe:before {\n  content: \"\\f1f5\"; }\n\n.fa-creative-commons-share:before {\n  content: \"\\f4f2\"; }\n\n.fa-bitcoin:before {\n  content: \"\\f379\"; }\n\n.fa-keycdn:before {\n  content: \"\\f3ba\"; }\n\n.fa-opera:before {\n  content: \"\\f26a\"; }\n\n.fa-itch-io:before {\n  content: \"\\f83a\"; }\n\n.fa-umbraco:before {\n  content: \"\\f8e8\"; }\n\n.fa-galactic-senate:before {\n  content: \"\\f50d\"; }\n\n.fa-ubuntu:before {\n  content: \"\\f7df\"; }\n\n.fa-draft2digital:before {\n  content: \"\\f396\"; }\n\n.fa-stripe:before {\n  content: \"\\f429\"; }\n\n.fa-houzz:before {\n  content: \"\\f27c\"; }\n\n.fa-gg:before {\n  content: \"\\f260\"; }\n\n.fa-dhl:before {\n  content: \"\\f790\"; }\n\n.fa-square-pinterest:before {\n  content: \"\\f0d3\"; }\n\n.fa-pinterest-square:before {\n  content: \"\\f0d3\"; }\n\n.fa-xing:before {\n  content: \"\\f168\"; }\n\n.fa-blackberry:before {\n  content: \"\\f37b\"; }\n\n.fa-creative-commons-pd:before {\n  content: \"\\f4ec\"; }\n\n.fa-playstation:before {\n  content: \"\\f3df\"; }\n\n.fa-quinscape:before {\n  content: \"\\f459\"; }\n\n.fa-less:before {\n  content: \"\\f41d\"; }\n\n.fa-blogger-b:before {\n  content: \"\\f37d\"; }\n\n.fa-opencart:before {\n  content: \"\\f23d\"; }\n\n.fa-vine:before {\n  content: \"\\f1ca\"; }\n\n.fa-signal-messenger:before {\n  content: \"\\e663\"; }\n\n.fa-paypal:before {\n  content: \"\\f1ed\"; }\n\n.fa-gitlab:before {\n  content: \"\\f296\"; }\n\n.fa-typo3:before {\n  content: \"\\f42b\"; }\n\n.fa-reddit-alien:before {\n  content: \"\\f281\"; }\n\n.fa-yahoo:before {\n  content: \"\\f19e\"; }\n\n.fa-dailymotion:before {\n  content: \"\\e052\"; }\n\n.fa-affiliatetheme:before {\n  content: \"\\f36b\"; }\n\n.fa-pied-piper-pp:before {\n  content: \"\\f1a7\"; }\n\n.fa-bootstrap:before {\n  content: \"\\f836\"; }\n\n.fa-odnoklassniki:before {\n  content: \"\\f263\"; }\n\n.fa-nfc-symbol:before {\n  content: \"\\e531\"; }\n\n.fa-mintbit:before {\n  content: \"\\e62f\"; }\n\n.fa-ethereum:before {\n  content: \"\\f42e\"; }\n\n.fa-speaker-deck:before {\n  content: \"\\f83c\"; }\n\n.fa-creative-commons-nc-eu:before {\n  content: \"\\f4e9\"; }\n\n.fa-patreon:before {\n  content: \"\\f3d9\"; }\n\n.fa-avianex:before {\n  content: \"\\f374\"; }\n\n.fa-ello:before {\n  content: \"\\f5f1\"; }\n\n.fa-gofore:before {\n  content: \"\\f3a7\"; }\n\n.fa-bimobject:before {\n  content: \"\\f378\"; }\n\n.fa-brave-reverse:before {\n  content: \"\\e63d\"; }\n\n.fa-facebook-f:before {\n  content: \"\\f39e\"; }\n\n.fa-square-google-plus:before {\n  content: \"\\f0d4\"; }\n\n.fa-google-plus-square:before {\n  content: \"\\f0d4\"; }\n\n.fa-web-awesome:before {\n  content: \"\\e682\"; }\n\n.fa-mandalorian:before {\n  content: \"\\f50f\"; }\n\n.fa-first-order-alt:before {\n  content: \"\\f50a\"; }\n\n.fa-osi:before {\n  content: \"\\f41a\"; }\n\n.fa-google-wallet:before {\n  content: \"\\f1ee\"; }\n\n.fa-d-and-d-beyond:before {\n  content: \"\\f6ca\"; }\n\n.fa-periscope:before {\n  content: \"\\f3da\"; }\n\n.fa-fulcrum:before {\n  content: \"\\f50b\"; }\n\n.fa-cloudscale:before {\n  content: \"\\f383\"; }\n\n.fa-forumbee:before {\n  content: \"\\f211\"; }\n\n.fa-mizuni:before {\n  content: \"\\f3cc\"; }\n\n.fa-schlix:before {\n  content: \"\\f3ea\"; }\n\n.fa-square-xing:before {\n  content: \"\\f169\"; }\n\n.fa-xing-square:before {\n  content: \"\\f169\"; }\n\n.fa-bandcamp:before {\n  content: \"\\f2d5\"; }\n\n.fa-wpforms:before {\n  content: \"\\f298\"; }\n\n.fa-cloudversify:before {\n  content: \"\\f385\"; }\n\n.fa-usps:before {\n  content: \"\\f7e1\"; }\n\n.fa-megaport:before {\n  content: \"\\f5a3\"; }\n\n.fa-magento:before {\n  content: \"\\f3c4\"; }\n\n.fa-spotify:before {\n  content: \"\\f1bc\"; }\n\n.fa-optin-monster:before {\n  content: \"\\f23c\"; }\n\n.fa-fly:before {\n  content: \"\\f417\"; }\n\n.fa-aviato:before {\n  content: \"\\f421\"; }\n\n.fa-itunes:before {\n  content: \"\\f3b4\"; }\n\n.fa-cuttlefish:before {\n  content: \"\\f38c\"; }\n\n.fa-blogger:before {\n  content: \"\\f37c\"; }\n\n.fa-flickr:before {\n  content: \"\\f16e\"; }\n\n.fa-viber:before {\n  content: \"\\f409\"; }\n\n.fa-soundcloud:before {\n  content: \"\\f1be\"; }\n\n.fa-digg:before {\n  content: \"\\f1a6\"; }\n\n.fa-tencent-weibo:before {\n  content: \"\\f1d5\"; }\n\n.fa-letterboxd:before {\n  content: \"\\e62d\"; }\n\n.fa-symfony:before {\n  content: \"\\f83d\"; }\n\n.fa-maxcdn:before {\n  content: \"\\f136\"; }\n\n.fa-etsy:before {\n  content: \"\\f2d7\"; }\n\n.fa-facebook-messenger:before {\n  content: \"\\f39f\"; }\n\n.fa-audible:before {\n  content: \"\\f373\"; }\n\n.fa-think-peaks:before {\n  content: \"\\f731\"; }\n\n.fa-bilibili:before {\n  content: \"\\e3d9\"; }\n\n.fa-erlang:before {\n  content: \"\\f39d\"; }\n\n.fa-x-twitter:before {\n  content: \"\\e61b\"; }\n\n.fa-cotton-bureau:before {\n  content: \"\\f89e\"; }\n\n.fa-dashcube:before {\n  content: \"\\f210\"; }\n\n.fa-42-group:before {\n  content: \"\\e080\"; }\n\n.fa-innosoft:before {\n  content: \"\\e080\"; }\n\n.fa-stack-exchange:before {\n  content: \"\\f18d\"; }\n\n.fa-elementor:before {\n  content: \"\\f430\"; }\n\n.fa-square-pied-piper:before {\n  content: \"\\e01e\"; }\n\n.fa-pied-piper-square:before {\n  content: \"\\e01e\"; }\n\n.fa-creative-commons-nd:before {\n  content: \"\\f4eb\"; }\n\n.fa-palfed:before {\n  content: \"\\f3d8\"; }\n\n.fa-superpowers:before {\n  content: \"\\f2dd\"; }\n\n.fa-resolving:before {\n  content: \"\\f3e7\"; }\n\n.fa-xbox:before {\n  content: \"\\f412\"; }\n\n.fa-square-web-awesome-stroke:before {\n  content: \"\\e684\"; }\n\n.fa-searchengin:before {\n  content: \"\\f3eb\"; }\n\n.fa-tiktok:before {\n  content: \"\\e07b\"; }\n\n.fa-square-facebook:before {\n  content: \"\\f082\"; }\n\n.fa-facebook-square:before {\n  content: \"\\f082\"; }\n\n.fa-renren:before {\n  content: \"\\f18b\"; }\n\n.fa-linux:before {\n  content: \"\\f17c\"; }\n\n.fa-glide:before {\n  content: \"\\f2a5\"; }\n\n.fa-linkedin:before {\n  content: \"\\f08c\"; }\n\n.fa-hubspot:before {\n  content: \"\\f3b2\"; }\n\n.fa-deploydog:before {\n  content: \"\\f38e\"; }\n\n.fa-twitch:before {\n  content: \"\\f1e8\"; }\n\n.fa-ravelry:before {\n  content: \"\\f2d9\"; }\n\n.fa-mixer:before {\n  content: \"\\e056\"; }\n\n.fa-square-lastfm:before {\n  content: \"\\f203\"; }\n\n.fa-lastfm-square:before {\n  content: \"\\f203\"; }\n\n.fa-vimeo:before {\n  content: \"\\f40a\"; }\n\n.fa-mendeley:before {\n  content: \"\\f7b3\"; }\n\n.fa-uniregistry:before {\n  content: \"\\f404\"; }\n\n.fa-figma:before {\n  content: \"\\f799\"; }\n\n.fa-creative-commons-remix:before {\n  content: \"\\f4ee\"; }\n\n.fa-cc-amazon-pay:before {\n  content: \"\\f42d\"; }\n\n.fa-dropbox:before {\n  content: \"\\f16b\"; }\n\n.fa-instagram:before {\n  content: \"\\f16d\"; }\n\n.fa-cmplid:before {\n  content: \"\\e360\"; }\n\n.fa-upwork:before {\n  content: \"\\e641\"; }\n\n.fa-facebook:before {\n  content: \"\\f09a\"; }\n\n.fa-gripfire:before {\n  content: \"\\f3ac\"; }\n\n.fa-jedi-order:before {\n  content: \"\\f50e\"; }\n\n.fa-uikit:before {\n  content: \"\\f403\"; }\n\n.fa-fort-awesome-alt:before {\n  content: \"\\f3a3\"; }\n\n.fa-phabricator:before {\n  content: \"\\f3db\"; }\n\n.fa-ussunnah:before {\n  content: \"\\f407\"; }\n\n.fa-earlybirds:before {\n  content: \"\\f39a\"; }\n\n.fa-trade-federation:before {\n  content: \"\\f513\"; }\n\n.fa-autoprefixer:before {\n  content: \"\\f41c\"; }\n\n.fa-whatsapp:before {\n  content: \"\\f232\"; }\n\n.fa-square-upwork:before {\n  content: \"\\e67c\"; }\n\n.fa-slideshare:before {\n  content: \"\\f1e7\"; }\n\n.fa-google-play:before {\n  content: \"\\f3ab\"; }\n\n.fa-viadeo:before {\n  content: \"\\f2a9\"; }\n\n.fa-line:before {\n  content: \"\\f3c0\"; }\n\n.fa-google-drive:before {\n  content: \"\\f3aa\"; }\n\n.fa-servicestack:before {\n  content: \"\\f3ec\"; }\n\n.fa-simplybuilt:before {\n  content: \"\\f215\"; }\n\n.fa-bitbucket:before {\n  content: \"\\f171\"; }\n\n.fa-imdb:before {\n  content: \"\\f2d8\"; }\n\n.fa-deezer:before {\n  content: \"\\e077\"; }\n\n.fa-raspberry-pi:before {\n  content: \"\\f7bb\"; }\n\n.fa-jira:before {\n  content: \"\\f7b1\"; }\n\n.fa-docker:before {\n  content: \"\\f395\"; }\n\n.fa-screenpal:before {\n  content: \"\\e570\"; }\n\n.fa-bluetooth:before {\n  content: \"\\f293\"; }\n\n.fa-gitter:before {\n  content: \"\\f426\"; }\n\n.fa-d-and-d:before {\n  content: \"\\f38d\"; }\n\n.fa-microblog:before {\n  content: \"\\e01a\"; }\n\n.fa-cc-diners-club:before {\n  content: \"\\f24c\"; }\n\n.fa-gg-circle:before {\n  content: \"\\f261\"; }\n\n.fa-pied-piper-hat:before {\n  content: \"\\f4e5\"; }\n\n.fa-kickstarter-k:before {\n  content: \"\\f3bc\"; }\n\n.fa-yandex:before {\n  content: \"\\f413\"; }\n\n.fa-readme:before {\n  content: \"\\f4d5\"; }\n\n.fa-html5:before {\n  content: \"\\f13b\"; }\n\n.fa-sellsy:before {\n  content: \"\\f213\"; }\n\n.fa-square-web-awesome:before {\n  content: \"\\e683\"; }\n\n.fa-sass:before {\n  content: \"\\f41e\"; }\n\n.fa-wirsindhandwerk:before {\n  content: \"\\e2d0\"; }\n\n.fa-wsh:before {\n  content: \"\\e2d0\"; }\n\n.fa-buromobelexperte:before {\n  content: \"\\f37f\"; }\n\n.fa-salesforce:before {\n  content: \"\\f83b\"; }\n\n.fa-octopus-deploy:before {\n  content: \"\\e082\"; }\n\n.fa-medapps:before {\n  content: \"\\f3c6\"; }\n\n.fa-ns8:before {\n  content: \"\\f3d5\"; }\n\n.fa-pinterest-p:before {\n  content: \"\\f231\"; }\n\n.fa-apper:before {\n  content: \"\\f371\"; }\n\n.fa-fort-awesome:before {\n  content: \"\\f286\"; }\n\n.fa-waze:before {\n  content: \"\\f83f\"; }\n\n.fa-bluesky:before {\n  content: \"\\e671\"; }\n\n.fa-cc-jcb:before {\n  content: \"\\f24b\"; }\n\n.fa-snapchat:before {\n  content: \"\\f2ab\"; }\n\n.fa-snapchat-ghost:before {\n  content: \"\\f2ab\"; }\n\n.fa-fantasy-flight-games:before {\n  content: \"\\f6dc\"; }\n\n.fa-rust:before {\n  content: \"\\e07a\"; }\n\n.fa-wix:before {\n  content: \"\\f5cf\"; }\n\n.fa-square-behance:before {\n  content: \"\\f1b5\"; }\n\n.fa-behance-square:before {\n  content: \"\\f1b5\"; }\n\n.fa-supple:before {\n  content: \"\\f3f9\"; }\n\n.fa-webflow:before {\n  content: \"\\e65c\"; }\n\n.fa-rebel:before {\n  content: \"\\f1d0\"; }\n\n.fa-css3:before {\n  content: \"\\f13c\"; }\n\n.fa-staylinked:before {\n  content: \"\\f3f5\"; }\n\n.fa-kaggle:before {\n  content: \"\\f5fa\"; }\n\n.fa-space-awesome:before {\n  content: \"\\e5ac\"; }\n\n.fa-deviantart:before {\n  content: \"\\f1bd\"; }\n\n.fa-cpanel:before {\n  content: \"\\f388\"; }\n\n.fa-goodreads-g:before {\n  content: \"\\f3a9\"; }\n\n.fa-square-git:before {\n  content: \"\\f1d2\"; }\n\n.fa-git-square:before {\n  content: \"\\f1d2\"; }\n\n.fa-square-tumblr:before {\n  content: \"\\f174\"; }\n\n.fa-tumblr-square:before {\n  content: \"\\f174\"; }\n\n.fa-trello:before {\n  content: \"\\f181\"; }\n\n.fa-creative-commons-nc-jp:before {\n  content: \"\\f4ea\"; }\n\n.fa-get-pocket:before {\n  content: \"\\f265\"; }\n\n.fa-perbyte:before {\n  content: \"\\e083\"; }\n\n.fa-grunt:before {\n  content: \"\\f3ad\"; }\n\n.fa-weebly:before {\n  content: \"\\f5cc\"; }\n\n.fa-connectdevelop:before {\n  content: \"\\f20e\"; }\n\n.fa-leanpub:before {\n  content: \"\\f212\"; }\n\n.fa-black-tie:before {\n  content: \"\\f27e\"; }\n\n.fa-themeco:before {\n  content: \"\\f5c6\"; }\n\n.fa-python:before {\n  content: \"\\f3e2\"; }\n\n.fa-android:before {\n  content: \"\\f17b\"; }\n\n.fa-bots:before {\n  content: \"\\e340\"; }\n\n.fa-free-code-camp:before {\n  content: \"\\f2c5\"; }\n\n.fa-hornbill:before {\n  content: \"\\f592\"; }\n\n.fa-js:before {\n  content: \"\\f3b8\"; }\n\n.fa-ideal:before {\n  content: \"\\e013\"; }\n\n.fa-git:before {\n  content: \"\\f1d3\"; }\n\n.fa-dev:before {\n  content: \"\\f6cc\"; }\n\n.fa-sketch:before {\n  content: \"\\f7c6\"; }\n\n.fa-yandex-international:before {\n  content: \"\\f414\"; }\n\n.fa-cc-amex:before {\n  content: \"\\f1f3\"; }\n\n.fa-uber:before {\n  content: \"\\f402\"; }\n\n.fa-github:before {\n  content: \"\\f09b\"; }\n\n.fa-php:before {\n  content: \"\\f457\"; }\n\n.fa-alipay:before {\n  content: \"\\f642\"; }\n\n.fa-youtube:before {\n  content: \"\\f167\"; }\n\n.fa-skyatlas:before {\n  content: \"\\f216\"; }\n\n.fa-firefox-browser:before {\n  content: \"\\e007\"; }\n\n.fa-replyd:before {\n  content: \"\\f3e6\"; }\n\n.fa-suse:before {\n  content: \"\\f7d6\"; }\n\n.fa-jenkins:before {\n  content: \"\\f3b6\"; }\n\n.fa-twitter:before {\n  content: \"\\f099\"; }\n\n.fa-rockrms:before {\n  content: \"\\f3e9\"; }\n\n.fa-pinterest:before {\n  content: \"\\f0d2\"; }\n\n.fa-buffer:before {\n  content: \"\\f837\"; }\n\n.fa-npm:before {\n  content: \"\\f3d4\"; }\n\n.fa-yammer:before {\n  content: \"\\f840\"; }\n\n.fa-btc:before {\n  content: \"\\f15a\"; }\n\n.fa-dribbble:before {\n  content: \"\\f17d\"; }\n\n.fa-stumbleupon-circle:before {\n  content: \"\\f1a3\"; }\n\n.fa-internet-explorer:before {\n  content: \"\\f26b\"; }\n\n.fa-stubber:before {\n  content: \"\\e5c7\"; }\n\n.fa-telegram:before {\n  content: \"\\f2c6\"; }\n\n.fa-telegram-plane:before {\n  content: \"\\f2c6\"; }\n\n.fa-old-republic:before {\n  content: \"\\f510\"; }\n\n.fa-odysee:before {\n  content: \"\\e5c6\"; }\n\n.fa-square-whatsapp:before {\n  content: \"\\f40c\"; }\n\n.fa-whatsapp-square:before {\n  content: \"\\f40c\"; }\n\n.fa-node-js:before {\n  content: \"\\f3d3\"; }\n\n.fa-edge-legacy:before {\n  content: \"\\e078\"; }\n\n.fa-slack:before {\n  content: \"\\f198\"; }\n\n.fa-slack-hash:before {\n  content: \"\\f198\"; }\n\n.fa-medrt:before {\n  content: \"\\f3c8\"; }\n\n.fa-usb:before {\n  content: \"\\f287\"; }\n\n.fa-tumblr:before {\n  content: \"\\f173\"; }\n\n.fa-vaadin:before {\n  content: \"\\f408\"; }\n\n.fa-quora:before {\n  content: \"\\f2c4\"; }\n\n.fa-square-x-twitter:before {\n  content: \"\\e61a\"; }\n\n.fa-reacteurope:before {\n  content: \"\\f75d\"; }\n\n.fa-medium:before {\n  content: \"\\f23a\"; }\n\n.fa-medium-m:before {\n  content: \"\\f23a\"; }\n\n.fa-amilia:before {\n  content: \"\\f36d\"; }\n\n.fa-mixcloud:before {\n  content: \"\\f289\"; }\n\n.fa-flipboard:before {\n  content: \"\\f44d\"; }\n\n.fa-viacoin:before {\n  content: \"\\f237\"; }\n\n.fa-critical-role:before {\n  content: \"\\f6c9\"; }\n\n.fa-sitrox:before {\n  content: \"\\e44a\"; }\n\n.fa-discourse:before {\n  content: \"\\f393\"; }\n\n.fa-joomla:before {\n  content: \"\\f1aa\"; }\n\n.fa-mastodon:before {\n  content: \"\\f4f6\"; }\n\n.fa-airbnb:before {\n  content: \"\\f834\"; }\n\n.fa-wolf-pack-battalion:before {\n  content: \"\\f514\"; }\n\n.fa-buy-n-large:before {\n  content: \"\\f8a6\"; }\n\n.fa-gulp:before {\n  content: \"\\f3ae\"; }\n\n.fa-creative-commons-sampling-plus:before {\n  content: \"\\f4f1\"; }\n\n.fa-strava:before {\n  content: \"\\f428\"; }\n\n.fa-ember:before {\n  content: \"\\f423\"; }\n\n.fa-canadian-maple-leaf:before {\n  content: \"\\f785\"; }\n\n.fa-teamspeak:before {\n  content: \"\\f4f9\"; }\n\n.fa-pushed:before {\n  content: \"\\f3e1\"; }\n\n.fa-wordpress-simple:before {\n  content: \"\\f411\"; }\n\n.fa-nutritionix:before {\n  content: \"\\f3d6\"; }\n\n.fa-wodu:before {\n  content: \"\\e088\"; }\n\n.fa-google-pay:before {\n  content: \"\\e079\"; }\n\n.fa-intercom:before {\n  content: \"\\f7af\"; }\n\n.fa-zhihu:before {\n  content: \"\\f63f\"; }\n\n.fa-korvue:before {\n  content: \"\\f42f\"; }\n\n.fa-pix:before {\n  content: \"\\e43a\"; }\n\n.fa-steam-symbol:before {\n  content: \"\\f3f6\"; }\n:root, :host {\n  --fa-style-family-classic: 'Font Awesome 6 Free';\n  --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; }\n\n@font-face {\n  font-family: 'Font Awesome 6 Free';\n  font-style: normal;\n  font-weight: 400;\n  font-display: block;\n  src: url(\"../webfonts/fa-regular-400.woff2\") format(\"woff2\"), url(\"../webfonts/fa-regular-400.ttf\") format(\"truetype\"); }\n\n.far,\n.fa-regular {\n  font-weight: 400; }\n:root, :host {\n  --fa-style-family-classic: 'Font Awesome 6 Free';\n  --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; }\n\n@font-face {\n  font-family: 'Font Awesome 6 Free';\n  font-style: normal;\n  font-weight: 900;\n  font-display: block;\n  src: url(\"../webfonts/fa-solid-900.woff2\") format(\"woff2\"), url(\"../webfonts/fa-solid-900.ttf\") format(\"truetype\"); }\n\n.fas,\n.fa-solid {\n  font-weight: 900; }\n@font-face {\n  font-family: 'Font Awesome 5 Brands';\n  font-display: block;\n  font-weight: 400;\n  src: url(\"../webfonts/fa-brands-400.woff2\") format(\"woff2\"), url(\"../webfonts/fa-brands-400.ttf\") format(\"truetype\"); }\n\n@font-face {\n  font-family: 'Font Awesome 5 Free';\n  font-display: block;\n  font-weight: 900;\n  src: url(\"../webfonts/fa-solid-900.woff2\") format(\"woff2\"), url(\"../webfonts/fa-solid-900.ttf\") format(\"truetype\"); }\n\n@font-face {\n  font-family: 'Font Awesome 5 Free';\n  font-display: block;\n  font-weight: 400;\n  src: url(\"../webfonts/fa-regular-400.woff2\") format(\"woff2\"), url(\"../webfonts/fa-regular-400.ttf\") format(\"truetype\"); }\n@font-face {\n  font-family: 'FontAwesome';\n  font-display: block;\n  src: url(\"../webfonts/fa-solid-900.woff2\") format(\"woff2\"), url(\"../webfonts/fa-solid-900.ttf\") format(\"truetype\"); }\n\n@font-face {\n  font-family: 'FontAwesome';\n  font-display: block;\n  src: url(\"../webfonts/fa-brands-400.woff2\") format(\"woff2\"), url(\"../webfonts/fa-brands-400.ttf\") format(\"truetype\"); }\n\n@font-face {\n  font-family: 'FontAwesome';\n  font-display: block;\n  src: url(\"../webfonts/fa-regular-400.woff2\") format(\"woff2\"), url(\"../webfonts/fa-regular-400.ttf\") format(\"truetype\"); }\n\n@font-face {\n  font-family: 'FontAwesome';\n  font-display: block;\n  src: url(\"../webfonts/fa-v4compatibility.woff2\") format(\"woff2\"), url(\"../webfonts/fa-v4compatibility.ttf\") format(\"truetype\"); }\n"
  },
  {
    "path": "docs/deps/font-awesome-6.5.2/css/v4-shims.css",
    "content": "/*!\n * Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n * Copyright 2024 Fonticons, Inc.\n */\n.fa.fa-glass:before {\n  content: \"\\f000\"; }\n\n.fa.fa-envelope-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-envelope-o:before {\n  content: \"\\f0e0\"; }\n\n.fa.fa-star-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-star-o:before {\n  content: \"\\f005\"; }\n\n.fa.fa-remove:before {\n  content: \"\\f00d\"; }\n\n.fa.fa-close:before {\n  content: \"\\f00d\"; }\n\n.fa.fa-gear:before {\n  content: \"\\f013\"; }\n\n.fa.fa-trash-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-trash-o:before {\n  content: \"\\f2ed\"; }\n\n.fa.fa-home:before {\n  content: \"\\f015\"; }\n\n.fa.fa-file-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-o:before {\n  content: \"\\f15b\"; }\n\n.fa.fa-clock-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-clock-o:before {\n  content: \"\\f017\"; }\n\n.fa.fa-arrow-circle-o-down {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-arrow-circle-o-down:before {\n  content: \"\\f358\"; }\n\n.fa.fa-arrow-circle-o-up {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-arrow-circle-o-up:before {\n  content: \"\\f35b\"; }\n\n.fa.fa-play-circle-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-play-circle-o:before {\n  content: \"\\f144\"; }\n\n.fa.fa-repeat:before {\n  content: \"\\f01e\"; }\n\n.fa.fa-rotate-right:before {\n  content: \"\\f01e\"; }\n\n.fa.fa-refresh:before {\n  content: \"\\f021\"; }\n\n.fa.fa-list-alt {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-list-alt:before {\n  content: \"\\f022\"; }\n\n.fa.fa-dedent:before {\n  content: \"\\f03b\"; }\n\n.fa.fa-video-camera:before {\n  content: \"\\f03d\"; }\n\n.fa.fa-picture-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-picture-o:before {\n  content: \"\\f03e\"; }\n\n.fa.fa-photo {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-photo:before {\n  content: \"\\f03e\"; }\n\n.fa.fa-image {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-image:before {\n  content: \"\\f03e\"; }\n\n.fa.fa-map-marker:before {\n  content: \"\\f3c5\"; }\n\n.fa.fa-pencil-square-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-pencil-square-o:before {\n  content: \"\\f044\"; }\n\n.fa.fa-edit {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-edit:before {\n  content: \"\\f044\"; }\n\n.fa.fa-share-square-o:before {\n  content: \"\\f14d\"; }\n\n.fa.fa-check-square-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-check-square-o:before {\n  content: \"\\f14a\"; }\n\n.fa.fa-arrows:before {\n  content: \"\\f0b2\"; }\n\n.fa.fa-times-circle-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-times-circle-o:before {\n  content: \"\\f057\"; }\n\n.fa.fa-check-circle-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-check-circle-o:before {\n  content: \"\\f058\"; }\n\n.fa.fa-mail-forward:before {\n  content: \"\\f064\"; }\n\n.fa.fa-expand:before {\n  content: \"\\f424\"; }\n\n.fa.fa-compress:before {\n  content: \"\\f422\"; }\n\n.fa.fa-eye {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-eye-slash {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-warning:before {\n  content: \"\\f071\"; }\n\n.fa.fa-calendar:before {\n  content: \"\\f073\"; }\n\n.fa.fa-arrows-v:before {\n  content: \"\\f338\"; }\n\n.fa.fa-arrows-h:before {\n  content: \"\\f337\"; }\n\n.fa.fa-bar-chart:before {\n  content: \"\\e0e3\"; }\n\n.fa.fa-bar-chart-o:before {\n  content: \"\\e0e3\"; }\n\n.fa.fa-twitter-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-twitter-square:before {\n  content: \"\\f081\"; }\n\n.fa.fa-facebook-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-facebook-square:before {\n  content: \"\\f082\"; }\n\n.fa.fa-gears:before {\n  content: \"\\f085\"; }\n\n.fa.fa-thumbs-o-up {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-thumbs-o-up:before {\n  content: \"\\f164\"; }\n\n.fa.fa-thumbs-o-down {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-thumbs-o-down:before {\n  content: \"\\f165\"; }\n\n.fa.fa-heart-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-heart-o:before {\n  content: \"\\f004\"; }\n\n.fa.fa-sign-out:before {\n  content: \"\\f2f5\"; }\n\n.fa.fa-linkedin-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-linkedin-square:before {\n  content: \"\\f08c\"; }\n\n.fa.fa-thumb-tack:before {\n  content: \"\\f08d\"; }\n\n.fa.fa-external-link:before {\n  content: \"\\f35d\"; }\n\n.fa.fa-sign-in:before {\n  content: \"\\f2f6\"; }\n\n.fa.fa-github-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-github-square:before {\n  content: \"\\f092\"; }\n\n.fa.fa-lemon-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-lemon-o:before {\n  content: \"\\f094\"; }\n\n.fa.fa-square-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-square-o:before {\n  content: \"\\f0c8\"; }\n\n.fa.fa-bookmark-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-bookmark-o:before {\n  content: \"\\f02e\"; }\n\n.fa.fa-twitter {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-facebook {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-facebook:before {\n  content: \"\\f39e\"; }\n\n.fa.fa-facebook-f {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-facebook-f:before {\n  content: \"\\f39e\"; }\n\n.fa.fa-github {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-credit-card {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-feed:before {\n  content: \"\\f09e\"; }\n\n.fa.fa-hdd-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hdd-o:before {\n  content: \"\\f0a0\"; }\n\n.fa.fa-hand-o-right {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hand-o-right:before {\n  content: \"\\f0a4\"; }\n\n.fa.fa-hand-o-left {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hand-o-left:before {\n  content: \"\\f0a5\"; }\n\n.fa.fa-hand-o-up {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hand-o-up:before {\n  content: \"\\f0a6\"; }\n\n.fa.fa-hand-o-down {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hand-o-down:before {\n  content: \"\\f0a7\"; }\n\n.fa.fa-globe:before {\n  content: \"\\f57d\"; }\n\n.fa.fa-tasks:before {\n  content: \"\\f828\"; }\n\n.fa.fa-arrows-alt:before {\n  content: \"\\f31e\"; }\n\n.fa.fa-group:before {\n  content: \"\\f0c0\"; }\n\n.fa.fa-chain:before {\n  content: \"\\f0c1\"; }\n\n.fa.fa-cut:before {\n  content: \"\\f0c4\"; }\n\n.fa.fa-files-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-files-o:before {\n  content: \"\\f0c5\"; }\n\n.fa.fa-floppy-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-floppy-o:before {\n  content: \"\\f0c7\"; }\n\n.fa.fa-save {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-save:before {\n  content: \"\\f0c7\"; }\n\n.fa.fa-navicon:before {\n  content: \"\\f0c9\"; }\n\n.fa.fa-reorder:before {\n  content: \"\\f0c9\"; }\n\n.fa.fa-magic:before {\n  content: \"\\e2ca\"; }\n\n.fa.fa-pinterest {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-pinterest-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-pinterest-square:before {\n  content: \"\\f0d3\"; }\n\n.fa.fa-google-plus-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-google-plus-square:before {\n  content: \"\\f0d4\"; }\n\n.fa.fa-google-plus {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-google-plus:before {\n  content: \"\\f0d5\"; }\n\n.fa.fa-money:before {\n  content: \"\\f3d1\"; }\n\n.fa.fa-unsorted:before {\n  content: \"\\f0dc\"; }\n\n.fa.fa-sort-desc:before {\n  content: \"\\f0dd\"; }\n\n.fa.fa-sort-asc:before {\n  content: \"\\f0de\"; }\n\n.fa.fa-linkedin {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-linkedin:before {\n  content: \"\\f0e1\"; }\n\n.fa.fa-rotate-left:before {\n  content: \"\\f0e2\"; }\n\n.fa.fa-legal:before {\n  content: \"\\f0e3\"; }\n\n.fa.fa-tachometer:before {\n  content: \"\\f625\"; }\n\n.fa.fa-dashboard:before {\n  content: \"\\f625\"; }\n\n.fa.fa-comment-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-comment-o:before {\n  content: \"\\f075\"; }\n\n.fa.fa-comments-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-comments-o:before {\n  content: \"\\f086\"; }\n\n.fa.fa-flash:before {\n  content: \"\\f0e7\"; }\n\n.fa.fa-clipboard:before {\n  content: \"\\f0ea\"; }\n\n.fa.fa-lightbulb-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-lightbulb-o:before {\n  content: \"\\f0eb\"; }\n\n.fa.fa-exchange:before {\n  content: \"\\f362\"; }\n\n.fa.fa-cloud-download:before {\n  content: \"\\f0ed\"; }\n\n.fa.fa-cloud-upload:before {\n  content: \"\\f0ee\"; }\n\n.fa.fa-bell-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-bell-o:before {\n  content: \"\\f0f3\"; }\n\n.fa.fa-cutlery:before {\n  content: \"\\f2e7\"; }\n\n.fa.fa-file-text-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-text-o:before {\n  content: \"\\f15c\"; }\n\n.fa.fa-building-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-building-o:before {\n  content: \"\\f1ad\"; }\n\n.fa.fa-hospital-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hospital-o:before {\n  content: \"\\f0f8\"; }\n\n.fa.fa-tablet:before {\n  content: \"\\f3fa\"; }\n\n.fa.fa-mobile:before {\n  content: \"\\f3cd\"; }\n\n.fa.fa-mobile-phone:before {\n  content: \"\\f3cd\"; }\n\n.fa.fa-circle-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-circle-o:before {\n  content: \"\\f111\"; }\n\n.fa.fa-mail-reply:before {\n  content: \"\\f3e5\"; }\n\n.fa.fa-github-alt {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-folder-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-folder-o:before {\n  content: \"\\f07b\"; }\n\n.fa.fa-folder-open-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-folder-open-o:before {\n  content: \"\\f07c\"; }\n\n.fa.fa-smile-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-smile-o:before {\n  content: \"\\f118\"; }\n\n.fa.fa-frown-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-frown-o:before {\n  content: \"\\f119\"; }\n\n.fa.fa-meh-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-meh-o:before {\n  content: \"\\f11a\"; }\n\n.fa.fa-keyboard-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-keyboard-o:before {\n  content: \"\\f11c\"; }\n\n.fa.fa-flag-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-flag-o:before {\n  content: \"\\f024\"; }\n\n.fa.fa-mail-reply-all:before {\n  content: \"\\f122\"; }\n\n.fa.fa-star-half-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-star-half-o:before {\n  content: \"\\f5c0\"; }\n\n.fa.fa-star-half-empty {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-star-half-empty:before {\n  content: \"\\f5c0\"; }\n\n.fa.fa-star-half-full {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-star-half-full:before {\n  content: \"\\f5c0\"; }\n\n.fa.fa-code-fork:before {\n  content: \"\\f126\"; }\n\n.fa.fa-chain-broken:before {\n  content: \"\\f127\"; }\n\n.fa.fa-unlink:before {\n  content: \"\\f127\"; }\n\n.fa.fa-calendar-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-calendar-o:before {\n  content: \"\\f133\"; }\n\n.fa.fa-maxcdn {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-html5 {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-css3 {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-unlock-alt:before {\n  content: \"\\f09c\"; }\n\n.fa.fa-minus-square-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-minus-square-o:before {\n  content: \"\\f146\"; }\n\n.fa.fa-level-up:before {\n  content: \"\\f3bf\"; }\n\n.fa.fa-level-down:before {\n  content: \"\\f3be\"; }\n\n.fa.fa-pencil-square:before {\n  content: \"\\f14b\"; }\n\n.fa.fa-external-link-square:before {\n  content: \"\\f360\"; }\n\n.fa.fa-compass {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-caret-square-o-down {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-caret-square-o-down:before {\n  content: \"\\f150\"; }\n\n.fa.fa-toggle-down {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-toggle-down:before {\n  content: \"\\f150\"; }\n\n.fa.fa-caret-square-o-up {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-caret-square-o-up:before {\n  content: \"\\f151\"; }\n\n.fa.fa-toggle-up {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-toggle-up:before {\n  content: \"\\f151\"; }\n\n.fa.fa-caret-square-o-right {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-caret-square-o-right:before {\n  content: \"\\f152\"; }\n\n.fa.fa-toggle-right {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-toggle-right:before {\n  content: \"\\f152\"; }\n\n.fa.fa-eur:before {\n  content: \"\\f153\"; }\n\n.fa.fa-euro:before {\n  content: \"\\f153\"; }\n\n.fa.fa-gbp:before {\n  content: \"\\f154\"; }\n\n.fa.fa-usd:before {\n  content: \"\\24\"; }\n\n.fa.fa-dollar:before {\n  content: \"\\24\"; }\n\n.fa.fa-inr:before {\n  content: \"\\e1bc\"; }\n\n.fa.fa-rupee:before {\n  content: \"\\e1bc\"; }\n\n.fa.fa-jpy:before {\n  content: \"\\f157\"; }\n\n.fa.fa-cny:before {\n  content: \"\\f157\"; }\n\n.fa.fa-rmb:before {\n  content: \"\\f157\"; }\n\n.fa.fa-yen:before {\n  content: \"\\f157\"; }\n\n.fa.fa-rub:before {\n  content: \"\\f158\"; }\n\n.fa.fa-ruble:before {\n  content: \"\\f158\"; }\n\n.fa.fa-rouble:before {\n  content: \"\\f158\"; }\n\n.fa.fa-krw:before {\n  content: \"\\f159\"; }\n\n.fa.fa-won:before {\n  content: \"\\f159\"; }\n\n.fa.fa-btc {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-bitcoin {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-bitcoin:before {\n  content: \"\\f15a\"; }\n\n.fa.fa-file-text:before {\n  content: \"\\f15c\"; }\n\n.fa.fa-sort-alpha-asc:before {\n  content: \"\\f15d\"; }\n\n.fa.fa-sort-alpha-desc:before {\n  content: \"\\f881\"; }\n\n.fa.fa-sort-amount-asc:before {\n  content: \"\\f884\"; }\n\n.fa.fa-sort-amount-desc:before {\n  content: \"\\f160\"; }\n\n.fa.fa-sort-numeric-asc:before {\n  content: \"\\f162\"; }\n\n.fa.fa-sort-numeric-desc:before {\n  content: \"\\f886\"; }\n\n.fa.fa-youtube-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-youtube-square:before {\n  content: \"\\f431\"; }\n\n.fa.fa-youtube {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-xing {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-xing-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-xing-square:before {\n  content: \"\\f169\"; }\n\n.fa.fa-youtube-play {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-youtube-play:before {\n  content: \"\\f167\"; }\n\n.fa.fa-dropbox {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-stack-overflow {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-instagram {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-flickr {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-adn {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-bitbucket {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-bitbucket-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-bitbucket-square:before {\n  content: \"\\f171\"; }\n\n.fa.fa-tumblr {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-tumblr-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-tumblr-square:before {\n  content: \"\\f174\"; }\n\n.fa.fa-long-arrow-down:before {\n  content: \"\\f309\"; }\n\n.fa.fa-long-arrow-up:before {\n  content: \"\\f30c\"; }\n\n.fa.fa-long-arrow-left:before {\n  content: \"\\f30a\"; }\n\n.fa.fa-long-arrow-right:before {\n  content: \"\\f30b\"; }\n\n.fa.fa-apple {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-windows {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-android {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-linux {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-dribbble {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-skype {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-foursquare {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-trello {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-gratipay {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-gittip {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-gittip:before {\n  content: \"\\f184\"; }\n\n.fa.fa-sun-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-sun-o:before {\n  content: \"\\f185\"; }\n\n.fa.fa-moon-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-moon-o:before {\n  content: \"\\f186\"; }\n\n.fa.fa-vk {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-weibo {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-renren {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-pagelines {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-stack-exchange {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-arrow-circle-o-right {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-arrow-circle-o-right:before {\n  content: \"\\f35a\"; }\n\n.fa.fa-arrow-circle-o-left {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-arrow-circle-o-left:before {\n  content: \"\\f359\"; }\n\n.fa.fa-caret-square-o-left {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-caret-square-o-left:before {\n  content: \"\\f191\"; }\n\n.fa.fa-toggle-left {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-toggle-left:before {\n  content: \"\\f191\"; }\n\n.fa.fa-dot-circle-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-dot-circle-o:before {\n  content: \"\\f192\"; }\n\n.fa.fa-vimeo-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-vimeo-square:before {\n  content: \"\\f194\"; }\n\n.fa.fa-try:before {\n  content: \"\\e2bb\"; }\n\n.fa.fa-turkish-lira:before {\n  content: \"\\e2bb\"; }\n\n.fa.fa-plus-square-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-plus-square-o:before {\n  content: \"\\f0fe\"; }\n\n.fa.fa-slack {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-wordpress {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-openid {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-institution:before {\n  content: \"\\f19c\"; }\n\n.fa.fa-bank:before {\n  content: \"\\f19c\"; }\n\n.fa.fa-mortar-board:before {\n  content: \"\\f19d\"; }\n\n.fa.fa-yahoo {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-google {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-reddit {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-reddit-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-reddit-square:before {\n  content: \"\\f1a2\"; }\n\n.fa.fa-stumbleupon-circle {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-stumbleupon {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-delicious {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-digg {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-pied-piper-pp {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-pied-piper-alt {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-drupal {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-joomla {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-behance {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-behance-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-behance-square:before {\n  content: \"\\f1b5\"; }\n\n.fa.fa-steam {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-steam-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-steam-square:before {\n  content: \"\\f1b7\"; }\n\n.fa.fa-automobile:before {\n  content: \"\\f1b9\"; }\n\n.fa.fa-cab:before {\n  content: \"\\f1ba\"; }\n\n.fa.fa-spotify {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-deviantart {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-soundcloud {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-file-pdf-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-pdf-o:before {\n  content: \"\\f1c1\"; }\n\n.fa.fa-file-word-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-word-o:before {\n  content: \"\\f1c2\"; }\n\n.fa.fa-file-excel-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-excel-o:before {\n  content: \"\\f1c3\"; }\n\n.fa.fa-file-powerpoint-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-powerpoint-o:before {\n  content: \"\\f1c4\"; }\n\n.fa.fa-file-image-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-image-o:before {\n  content: \"\\f1c5\"; }\n\n.fa.fa-file-photo-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-photo-o:before {\n  content: \"\\f1c5\"; }\n\n.fa.fa-file-picture-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-picture-o:before {\n  content: \"\\f1c5\"; }\n\n.fa.fa-file-archive-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-archive-o:before {\n  content: \"\\f1c6\"; }\n\n.fa.fa-file-zip-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-zip-o:before {\n  content: \"\\f1c6\"; }\n\n.fa.fa-file-audio-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-audio-o:before {\n  content: \"\\f1c7\"; }\n\n.fa.fa-file-sound-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-sound-o:before {\n  content: \"\\f1c7\"; }\n\n.fa.fa-file-video-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-video-o:before {\n  content: \"\\f1c8\"; }\n\n.fa.fa-file-movie-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-movie-o:before {\n  content: \"\\f1c8\"; }\n\n.fa.fa-file-code-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-file-code-o:before {\n  content: \"\\f1c9\"; }\n\n.fa.fa-vine {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-codepen {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-jsfiddle {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-life-bouy:before {\n  content: \"\\f1cd\"; }\n\n.fa.fa-life-buoy:before {\n  content: \"\\f1cd\"; }\n\n.fa.fa-life-saver:before {\n  content: \"\\f1cd\"; }\n\n.fa.fa-support:before {\n  content: \"\\f1cd\"; }\n\n.fa.fa-circle-o-notch:before {\n  content: \"\\f1ce\"; }\n\n.fa.fa-rebel {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-ra {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-ra:before {\n  content: \"\\f1d0\"; }\n\n.fa.fa-resistance {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-resistance:before {\n  content: \"\\f1d0\"; }\n\n.fa.fa-empire {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-ge {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-ge:before {\n  content: \"\\f1d1\"; }\n\n.fa.fa-git-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-git-square:before {\n  content: \"\\f1d2\"; }\n\n.fa.fa-git {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-hacker-news {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-y-combinator-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-y-combinator-square:before {\n  content: \"\\f1d4\"; }\n\n.fa.fa-yc-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-yc-square:before {\n  content: \"\\f1d4\"; }\n\n.fa.fa-tencent-weibo {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-qq {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-weixin {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-wechat {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-wechat:before {\n  content: \"\\f1d7\"; }\n\n.fa.fa-send:before {\n  content: \"\\f1d8\"; }\n\n.fa.fa-paper-plane-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-paper-plane-o:before {\n  content: \"\\f1d8\"; }\n\n.fa.fa-send-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-send-o:before {\n  content: \"\\f1d8\"; }\n\n.fa.fa-circle-thin {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-circle-thin:before {\n  content: \"\\f111\"; }\n\n.fa.fa-header:before {\n  content: \"\\f1dc\"; }\n\n.fa.fa-futbol-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-futbol-o:before {\n  content: \"\\f1e3\"; }\n\n.fa.fa-soccer-ball-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-soccer-ball-o:before {\n  content: \"\\f1e3\"; }\n\n.fa.fa-slideshare {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-twitch {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-yelp {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-newspaper-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-newspaper-o:before {\n  content: \"\\f1ea\"; }\n\n.fa.fa-paypal {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-google-wallet {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-cc-visa {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-cc-mastercard {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-cc-discover {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-cc-amex {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-cc-paypal {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-cc-stripe {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-bell-slash-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-bell-slash-o:before {\n  content: \"\\f1f6\"; }\n\n.fa.fa-trash:before {\n  content: \"\\f2ed\"; }\n\n.fa.fa-copyright {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-eyedropper:before {\n  content: \"\\f1fb\"; }\n\n.fa.fa-area-chart:before {\n  content: \"\\f1fe\"; }\n\n.fa.fa-pie-chart:before {\n  content: \"\\f200\"; }\n\n.fa.fa-line-chart:before {\n  content: \"\\f201\"; }\n\n.fa.fa-lastfm {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-lastfm-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-lastfm-square:before {\n  content: \"\\f203\"; }\n\n.fa.fa-ioxhost {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-angellist {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-cc {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-cc:before {\n  content: \"\\f20a\"; }\n\n.fa.fa-ils:before {\n  content: \"\\f20b\"; }\n\n.fa.fa-shekel:before {\n  content: \"\\f20b\"; }\n\n.fa.fa-sheqel:before {\n  content: \"\\f20b\"; }\n\n.fa.fa-buysellads {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-connectdevelop {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-dashcube {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-forumbee {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-leanpub {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-sellsy {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-shirtsinbulk {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-simplybuilt {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-skyatlas {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-diamond {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-diamond:before {\n  content: \"\\f3a5\"; }\n\n.fa.fa-transgender:before {\n  content: \"\\f224\"; }\n\n.fa.fa-intersex:before {\n  content: \"\\f224\"; }\n\n.fa.fa-transgender-alt:before {\n  content: \"\\f225\"; }\n\n.fa.fa-facebook-official {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-facebook-official:before {\n  content: \"\\f09a\"; }\n\n.fa.fa-pinterest-p {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-whatsapp {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-hotel:before {\n  content: \"\\f236\"; }\n\n.fa.fa-viacoin {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-medium {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-y-combinator {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-yc {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-yc:before {\n  content: \"\\f23b\"; }\n\n.fa.fa-optin-monster {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-opencart {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-expeditedssl {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-battery-4:before {\n  content: \"\\f240\"; }\n\n.fa.fa-battery:before {\n  content: \"\\f240\"; }\n\n.fa.fa-battery-3:before {\n  content: \"\\f241\"; }\n\n.fa.fa-battery-2:before {\n  content: \"\\f242\"; }\n\n.fa.fa-battery-1:before {\n  content: \"\\f243\"; }\n\n.fa.fa-battery-0:before {\n  content: \"\\f244\"; }\n\n.fa.fa-object-group {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-object-ungroup {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-sticky-note-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-sticky-note-o:before {\n  content: \"\\f249\"; }\n\n.fa.fa-cc-jcb {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-cc-diners-club {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-clone {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hourglass-o:before {\n  content: \"\\f254\"; }\n\n.fa.fa-hourglass-1:before {\n  content: \"\\f251\"; }\n\n.fa.fa-hourglass-2:before {\n  content: \"\\f252\"; }\n\n.fa.fa-hourglass-3:before {\n  content: \"\\f253\"; }\n\n.fa.fa-hand-rock-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hand-rock-o:before {\n  content: \"\\f255\"; }\n\n.fa.fa-hand-grab-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hand-grab-o:before {\n  content: \"\\f255\"; }\n\n.fa.fa-hand-paper-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hand-paper-o:before {\n  content: \"\\f256\"; }\n\n.fa.fa-hand-stop-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hand-stop-o:before {\n  content: \"\\f256\"; }\n\n.fa.fa-hand-scissors-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hand-scissors-o:before {\n  content: \"\\f257\"; }\n\n.fa.fa-hand-lizard-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hand-lizard-o:before {\n  content: \"\\f258\"; }\n\n.fa.fa-hand-spock-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hand-spock-o:before {\n  content: \"\\f259\"; }\n\n.fa.fa-hand-pointer-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hand-pointer-o:before {\n  content: \"\\f25a\"; }\n\n.fa.fa-hand-peace-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-hand-peace-o:before {\n  content: \"\\f25b\"; }\n\n.fa.fa-registered {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-creative-commons {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-gg {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-gg-circle {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-odnoklassniki {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-odnoklassniki-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-odnoklassniki-square:before {\n  content: \"\\f264\"; }\n\n.fa.fa-get-pocket {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-wikipedia-w {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-safari {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-chrome {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-firefox {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-opera {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-internet-explorer {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-television:before {\n  content: \"\\f26c\"; }\n\n.fa.fa-contao {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-500px {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-amazon {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-calendar-plus-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-calendar-plus-o:before {\n  content: \"\\f271\"; }\n\n.fa.fa-calendar-minus-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-calendar-minus-o:before {\n  content: \"\\f272\"; }\n\n.fa.fa-calendar-times-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-calendar-times-o:before {\n  content: \"\\f273\"; }\n\n.fa.fa-calendar-check-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-calendar-check-o:before {\n  content: \"\\f274\"; }\n\n.fa.fa-map-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-map-o:before {\n  content: \"\\f279\"; }\n\n.fa.fa-commenting:before {\n  content: \"\\f4ad\"; }\n\n.fa.fa-commenting-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-commenting-o:before {\n  content: \"\\f4ad\"; }\n\n.fa.fa-houzz {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-vimeo {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-vimeo:before {\n  content: \"\\f27d\"; }\n\n.fa.fa-black-tie {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-fonticons {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-reddit-alien {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-edge {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-credit-card-alt:before {\n  content: \"\\f09d\"; }\n\n.fa.fa-codiepie {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-modx {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-fort-awesome {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-usb {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-product-hunt {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-mixcloud {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-scribd {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-pause-circle-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-pause-circle-o:before {\n  content: \"\\f28b\"; }\n\n.fa.fa-stop-circle-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-stop-circle-o:before {\n  content: \"\\f28d\"; }\n\n.fa.fa-bluetooth {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-bluetooth-b {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-gitlab {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-wpbeginner {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-wpforms {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-envira {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-wheelchair-alt {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-wheelchair-alt:before {\n  content: \"\\f368\"; }\n\n.fa.fa-question-circle-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-question-circle-o:before {\n  content: \"\\f059\"; }\n\n.fa.fa-volume-control-phone:before {\n  content: \"\\f2a0\"; }\n\n.fa.fa-asl-interpreting:before {\n  content: \"\\f2a3\"; }\n\n.fa.fa-deafness:before {\n  content: \"\\f2a4\"; }\n\n.fa.fa-hard-of-hearing:before {\n  content: \"\\f2a4\"; }\n\n.fa.fa-glide {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-glide-g {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-signing:before {\n  content: \"\\f2a7\"; }\n\n.fa.fa-viadeo {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-viadeo-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-viadeo-square:before {\n  content: \"\\f2aa\"; }\n\n.fa.fa-snapchat {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-snapchat-ghost {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-snapchat-ghost:before {\n  content: \"\\f2ab\"; }\n\n.fa.fa-snapchat-square {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-snapchat-square:before {\n  content: \"\\f2ad\"; }\n\n.fa.fa-pied-piper {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-first-order {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-yoast {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-themeisle {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-google-plus-official {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-google-plus-official:before {\n  content: \"\\f2b3\"; }\n\n.fa.fa-google-plus-circle {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-google-plus-circle:before {\n  content: \"\\f2b3\"; }\n\n.fa.fa-font-awesome {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-fa {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-fa:before {\n  content: \"\\f2b4\"; }\n\n.fa.fa-handshake-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-handshake-o:before {\n  content: \"\\f2b5\"; }\n\n.fa.fa-envelope-open-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-envelope-open-o:before {\n  content: \"\\f2b6\"; }\n\n.fa.fa-linode {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-address-book-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-address-book-o:before {\n  content: \"\\f2b9\"; }\n\n.fa.fa-vcard:before {\n  content: \"\\f2bb\"; }\n\n.fa.fa-address-card-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-address-card-o:before {\n  content: \"\\f2bb\"; }\n\n.fa.fa-vcard-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-vcard-o:before {\n  content: \"\\f2bb\"; }\n\n.fa.fa-user-circle-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-user-circle-o:before {\n  content: \"\\f2bd\"; }\n\n.fa.fa-user-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-user-o:before {\n  content: \"\\f007\"; }\n\n.fa.fa-id-badge {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-drivers-license:before {\n  content: \"\\f2c2\"; }\n\n.fa.fa-id-card-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-id-card-o:before {\n  content: \"\\f2c2\"; }\n\n.fa.fa-drivers-license-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-drivers-license-o:before {\n  content: \"\\f2c2\"; }\n\n.fa.fa-quora {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-free-code-camp {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-telegram {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-thermometer-4:before {\n  content: \"\\f2c7\"; }\n\n.fa.fa-thermometer:before {\n  content: \"\\f2c7\"; }\n\n.fa.fa-thermometer-3:before {\n  content: \"\\f2c8\"; }\n\n.fa.fa-thermometer-2:before {\n  content: \"\\f2c9\"; }\n\n.fa.fa-thermometer-1:before {\n  content: \"\\f2ca\"; }\n\n.fa.fa-thermometer-0:before {\n  content: \"\\f2cb\"; }\n\n.fa.fa-bathtub:before {\n  content: \"\\f2cd\"; }\n\n.fa.fa-s15:before {\n  content: \"\\f2cd\"; }\n\n.fa.fa-window-maximize {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-window-restore {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-times-rectangle:before {\n  content: \"\\f410\"; }\n\n.fa.fa-window-close-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-window-close-o:before {\n  content: \"\\f410\"; }\n\n.fa.fa-times-rectangle-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-times-rectangle-o:before {\n  content: \"\\f410\"; }\n\n.fa.fa-bandcamp {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-grav {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-etsy {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-imdb {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-ravelry {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-eercast {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-eercast:before {\n  content: \"\\f2da\"; }\n\n.fa.fa-snowflake-o {\n  font-family: 'Font Awesome 6 Free';\n  font-weight: 400; }\n\n.fa.fa-snowflake-o:before {\n  content: \"\\f2dc\"; }\n\n.fa.fa-superpowers {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-wpexplorer {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n\n.fa.fa-meetup {\n  font-family: 'Font Awesome 6 Brands';\n  font-weight: 400; }\n"
  },
  {
    "path": "docs/deps/jquery-3.6.0/jquery-3.6.0.js",
    "content": "/*!\n * jQuery JavaScript Library v3.6.0\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2021-03-02T17:08Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML <object> elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.6.0\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.6\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2021-02-16\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem && elem.namespaceURI,\n\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Support: Chrome 86+\n\t\t\t\t\t\t// In Chrome, if an element having a focusout handler is blurred by\n\t\t\t\t\t\t// clicking outside of it, it invokes the handler synchronously. If\n\t\t\t\t\t\t// that handler calls `.remove()` on the element, the data is cleared,\n\t\t\t\t\t\t// leaving `result` undefined. We need to guard against this.\n\t\t\t\t\t\treturn result && result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\t// Suppress native focus or blur as it's already being fired\n\t\t// in leverageNative.\n\t\t_default: function() {\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is display: block\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( {\n\t\tpadding: \"inner\" + name,\n\t\tcontent: type,\n\t\t\"\": \"outer\" + name\n\t}, function( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each(\n\t( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t}\n);\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n"
  },
  {
    "path": "docs/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": "docs/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": "docs/extra.css",
    "content": "pre code span.fu      {color: #F9EA6B;}  /* function */\npre code span.kw      {color: #F9EA6B;}  /* keyword */\npre code span.va      {color: #89b0dd;}  /* keyword */\npre code span.op      {color: white;}  /* ? */"
  },
  {
    "path": "docs/index.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<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>A Versatile Cutting Tool • santoku</title>\n<!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"favicon-96x96.png\">\n<link rel=\"icon\" type=\"”image/svg+xml”\" href=\"favicon.svg\">\n<link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"apple-touch-icon.png\">\n<link rel=\"icon\" sizes=\"any\" href=\"favicon.ico\">\n<link rel=\"manifest\" href=\"site.webmanifest\">\n<script src=\"deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n<link href=\"deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\">\n<script src=\"deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\">\n<link href=\"deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\">\n<script src=\"deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"deps/search-1.0.0/fuse.min.js\"></script><script src=\"deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"pkgdown.js\"></script><link href=\"extra.css\" rel=\"stylesheet\">\n<meta property=\"og:title\" content=\"A Versatile Cutting Tool\">\n<meta name=\"description\" content=\"A tool for cutting data into intervals. Allows singleton intervals. Always includes the whole range of data by default. Flexible labelling. Convenience functions for cutting by quantiles etc. Handles dates, times, units and other vectors.\">\n<meta property=\"og:description\" content=\"A tool for cutting data into intervals. Allows singleton intervals. Always includes the whole range of data by default. Flexible labelling. Convenience functions for cutting by quantiles etc. Handles dates, times, units and other vectors.\">\n<meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\">\n</head>\n<body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\">\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"articles/santoku.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/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul>\n</li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\">\n<li><a class=\"dropdown-item\" href=\"tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul>\n</li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"news/index.html\">Changelog</a></li>\n      </ul>\n<ul class=\"navbar-nav\">\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<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul>\n</div>\n\n\n  </div>\n</nav><div class=\"container template-home\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"section level1\">\n<div class=\"page-header\">\n<img src=\"logo.png\" class=\"logo\" alt=\"\"><h1 id=\"santoku-\">santoku <a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-\"></a>\n</h1>\n</div>\n<!-- badges: start -->\n\n<p>santoku is a versatile cutting tool for R. It provides <code><a href=\"reference/chop.html\">chop()</a></code>, a replacement for <code><a href=\"https://rdrr.io/r/base/cut.html\" class=\"external-link\">base::cut()</a></code>.</p>\n<div class=\"section level2\">\n<h2 id=\"installation\">Installation<a class=\"anchor\" aria-label=\"anchor\" href=\"#installation\"></a>\n</h2>\n<p>Install from <a href=\"https://r-universe.dev\" class=\"external-link\">r-universe</a>:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/install.packages.html\" class=\"external-link\">install.packages</a></span><span class=\"op\">(</span><span class=\"st\">\"santoku\"</span>, repos <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"https://hughjonesd.r-universe.dev\"</span>, </span>\n<span>                                      <span class=\"st\">\"https://cloud.r-project.org\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Or from CRAN:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/install.packages.html\" class=\"external-link\">install.packages</a></span><span class=\"op\">(</span><span class=\"st\">\"santoku\"</span><span class=\"op\">)</span></span></code></pre></div>\n<p>Or get the development version from github:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"co\"># install.packages(\"remotes\")</span></span>\n<span><span class=\"fu\">remotes</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://remotes.r-lib.org/reference/install_github.html\" class=\"external-link\">install_github</a></span><span class=\"op\">(</span><span class=\"st\">\"hughjonesd/santoku\"</span><span class=\"op\">)</span></span></code></pre></div>\n</div>\n<div class=\"section level2\">\n<h2 id=\"advantages\">Advantages<a class=\"anchor\" aria-label=\"anchor\" href=\"#advantages\"></a>\n</h2>\n<p>Here are some advantages of santoku:</p>\n<ul>\n<li><p>By default, <code><a href=\"reference/chop.html\">chop()</a></code> always covers the whole range of the data, so you won’t get unexpected <code>NA</code> values.</p></li>\n<li><p><code><a href=\"reference/chop.html\">chop()</a></code> can handle single values as well as intervals. For example, <code>chop(x, breaks = c(1, 2, 2, 3))</code> will create a separate factor level for values exactly equal to 2.</p></li>\n<li><p><code><a href=\"reference/chop.html\">chop()</a></code> can handle many kinds of data, including numbers, dates and times, and <a href=\"https://r-quantities.github.io/units/\" class=\"external-link\">units</a>.</p></li>\n<li><p><code>chop_*</code> functions create intervals in many ways, using quantiles of the data, standard deviations, fixed-width intervals, equal-sized groups, or pretty intervals for use in graphs.</p></li>\n<li><p>It’s easy to label intervals: use names for your breaks vector, or use a <code>lbl_*</code> function to create interval notation like <code>[1, 2)</code>, dash notation like <code>1-2</code>, or arbitrary styles using <code><a href=\"https://glue.tidyverse.org/reference/glue.html\" class=\"external-link\">glue::glue()</a></code>.</p></li>\n<li><p><code>tab_*</code> functions quickly chop data, then tabulate it.</p></li>\n</ul>\n<p>These advantages make santoku especially useful for exploratory analysis, where you may not know the range of your data in advance.</p>\n</div>\n<div class=\"section level2\">\n<h2 id=\"examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#examples\"></a>\n</h2>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://github.com/hughjonesd/santoku\" class=\"external-link\">santoku</a></span><span class=\"op\">)</span></span></code></pre></div>\n<p><code>chop</code> returns a factor:</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">4</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] [1, 2) [2, 4) [2, 4) [4, 5] [4, 5]</span></span>\n<span><span class=\"co\">#&gt; Levels: [1, 2) [2, 4) [4, 5]</span></span></code></pre></div>\n<p>Include a number twice to match it exactly:</p>\n<div class=\"sourceCode\" id=\"cb6\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">2</span>, <span class=\"fl\">4</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] [1, 2) {2}    (2, 4) [4, 5] [4, 5]</span></span>\n<span><span class=\"co\">#&gt; Levels: [1, 2) {2} (2, 4) [4, 5]</span></span></code></pre></div>\n<p>Use names in breaks for labels:</p>\n<div class=\"sourceCode\" id=\"cb7\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span>Low <span class=\"op\">=</span> <span class=\"fl\">1</span>, Mid <span class=\"op\">=</span> <span class=\"fl\">2</span>, High <span class=\"op\">=</span> <span class=\"fl\">4</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] Low  Mid  Mid  High High</span></span>\n<span><span class=\"co\">#&gt; Levels: Low Mid High</span></span></code></pre></div>\n<p>Or use <code>lbl_*</code> functions:</p>\n<div class=\"sourceCode\" id=\"cb8\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">4</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"reference/lbl_dash.html\">lbl_dash</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; [1] 1—2 2—4 2—4 4—5 4—5</span></span>\n<span><span class=\"co\">#&gt; Levels: 1—2 2—4 4—5</span></span></code></pre></div>\n<p>Chop into fixed-width intervals:</p>\n<div class=\"sourceCode\" id=\"cb9\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"reference/chop_width.html\">chop_width</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"fl\">10</span><span class=\"op\">)</span>, <span class=\"fl\">0.1</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;  [1] [0.368, 0.468)   [0.268, 0.368)   [0.768, 0.868]   [0.568, 0.668)  </span></span>\n<span><span class=\"co\">#&gt;  [5] [0.668, 0.768)   [0.768, 0.868]   [0.06801, 0.168) [0.668, 0.768)  </span></span>\n<span><span class=\"co\">#&gt;  [9] [0.06801, 0.168) [0.468, 0.568)  </span></span>\n<span><span class=\"co\">#&gt; 7 Levels: [0.06801, 0.168) [0.268, 0.368) [0.368, 0.468) ... [0.768, 0.868]</span></span></code></pre></div>\n<p>Or into fixed-size groups:</p>\n<div class=\"sourceCode\" id=\"cb10\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"reference/chop_n.html\">chop_n</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fl\">5</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt;  [1] [1, 6)  [1, 6)  [1, 6)  [1, 6)  [1, 6)  [6, 10] [6, 10] [6, 10] [6, 10]</span></span>\n<span><span class=\"co\">#&gt; [10] [6, 10]</span></span>\n<span><span class=\"co\">#&gt; Levels: [1, 6) [6, 10]</span></span></code></pre></div>\n<p>Chop dates by calendar month, then tabulate:</p>\n<div class=\"sourceCode\" id=\"cb11\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"kw\"><a href=\"https://rdrr.io/r/base/library.html\" class=\"external-link\">library</a></span><span class=\"op\">(</span><span class=\"va\"><a href=\"https://lubridate.tidyverse.org\" class=\"external-link\">lubridate</a></span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt; Attaching package: 'lubridate'</span></span>\n<span><span class=\"co\">#&gt; The following objects are masked from 'package:base':</span></span>\n<span><span class=\"co\">#&gt; </span></span>\n<span><span class=\"co\">#&gt;     date, intersect, setdiff, union</span></span>\n<span></span>\n<span><span class=\"va\">dates</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.Date.html\" class=\"external-link\">as.Date</a></span><span class=\"op\">(</span><span class=\"st\">\"2021-12-31\"</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">90</span></span>\n<span></span>\n<span><span class=\"fu\"><a href=\"reference/chop_width.html\">tab_width</a></span><span class=\"op\">(</span><span class=\"va\">dates</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/weekday.POSIXt.html\" class=\"external-link\">months</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"reference/lbl_discrete.html\">lbl_discrete</a></span><span class=\"op\">(</span>fmt <span class=\"op\">=</span> <span class=\"st\">\"%d %b\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">#&gt; 01 Jan—31 Jan 01 Feb—28 Feb 01 Mar—31 Mar </span></span>\n<span><span class=\"co\">#&gt;            31            28            31</span></span></code></pre></div>\n<p>For more information, see the <a href=\"https://hughjonesd.github.io/santoku/articles/santoku.html\">vignette</a>.</p>\n</div>\n</div>\n  </main><aside class=\"col-md-3\"><div class=\"links\">\n<h2 data-toc-skip>Links</h2>\n<ul class=\"list-unstyled\">\n<li><a href=\"https://cloud.r-project.org/package=santoku\" class=\"external-link\">View on CRAN</a></li>\n<li><a href=\"https://github.com/hughjonesd/santoku/\" class=\"external-link\">Browse source code</a></li>\n<li><a href=\"https://github.com/hughjonesd/santoku/issues\" class=\"external-link\">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><a href=\"LICENSE.html\">Full license</a></li>\n<li><small><a href=\"https://opensource.org/licenses/mit-license.php\" class=\"external-link\">MIT</a> + file <a href=\"LICENSE-text.html\">LICENSE</a></small></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 santoku</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>David Hugh-Jones <br><small class=\"roles\"> Author, maintainer </small>   </li>\n<li><a href=\"authors.html\">More about authors...</a></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><a href=\"https://CRAN.R-project.org/package=santoku\" class=\"external-link\"><img src=\"https://www.r-pkg.org/badges/version/santoku\" alt=\"CRAN status\"></a></li>\n<li><a href=\"https://lifecycle.r-lib.org/articles/stages.html#stable\" class=\"external-link\"><img src=\"https://img.shields.io/badge/lifecycle-stable-brightgreen.svg\" alt=\"Lifecycle: stable\"></a></li>\n<li><a href=\"https://CRAN.R-project.org/package=santoku\" class=\"external-link\"><img src=\"http://cranlogs.r-pkg.org/badges/santoku\" alt=\"CRAN Downloads Per Month\"></a></li>\n<li><a href=\"https://hughjonesd.r-universe.dev/santoku\" class=\"external-link\"><img src=\"https://hughjonesd.r-universe.dev/badges/santoku\" alt=\"R-universe\"></a></li>\n<li><a href=\"https://github.com/hughjonesd/santoku/actions\" class=\"external-link\"><img src=\"https://github.com/hughjonesd/santoku/workflows/R-CMD-check/badge.svg\" alt=\"R-CMD-check\"></a></li>\n<li><a href=\"https://app.codecov.io/gh/hughjonesd/santoku?branch=master\" class=\"external-link\"><img src=\"https://codecov.io/gh/hughjonesd/santoku/branch/master/graph/badge.svg\" alt=\"Codecov test coverage\"></a></li>\n</ul>\n</div>\n\n  </aside>\n</div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer>\n</div>\n\n\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/index.md",
    "content": "# santoku\n\nsantoku is a versatile cutting tool for R. It provides\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md), a\nreplacement for [`base::cut()`](https://rdrr.io/r/base/cut.html).\n\n## Installation\n\nInstall from [r-universe](https://r-universe.dev):\n\n``` r\n\ninstall.packages(\"santoku\", repos = c(\"https://hughjonesd.r-universe.dev\", \n                                      \"https://cloud.r-project.org\"))\n```\n\nOr from CRAN:\n\n``` r\n\ninstall.packages(\"santoku\")\n```\n\nOr get the development version from github:\n\n``` r\n\n# install.packages(\"remotes\")\nremotes::install_github(\"hughjonesd/santoku\")\n```\n\n## Advantages\n\nHere are some advantages of santoku:\n\n- By default,\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n  always covers the whole range of the data, so you won’t get unexpected\n  `NA` values.\n\n- [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md) can\n  handle single values as well as intervals. For example,\n  `chop(x, breaks = c(1, 2, 2, 3))` will create a separate factor level\n  for values exactly equal to 2.\n\n- [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md) can\n  handle many kinds of data, including numbers, dates and times, and\n  [units](https://r-quantities.github.io/units/).\n\n- `chop_*` functions create intervals in many ways, using quantiles of\n  the data, standard deviations, fixed-width intervals, equal-sized\n  groups, or pretty intervals for use in graphs.\n\n- It’s easy to label intervals: use names for your breaks vector, or use\n  a `lbl_*` function to create interval notation like `[1, 2)`, dash\n  notation like `1-2`, or arbitrary styles using\n  [`glue::glue()`](https://glue.tidyverse.org/reference/glue.html).\n\n- `tab_*` functions quickly chop data, then tabulate it.\n\nThese advantages make santoku especially useful for exploratory\nanalysis, where you may not know the range of your data in advance.\n\n## Examples\n\n``` r\n\nlibrary(santoku)\n```\n\n`chop` returns a factor:\n\n``` r\n\nchop(1:5, c(2, 4))\n#> [1] [1, 2) [2, 4) [2, 4) [4, 5] [4, 5]\n#> Levels: [1, 2) [2, 4) [4, 5]\n```\n\nInclude a number twice to match it exactly:\n\n``` r\n\nchop(1:5, c(2, 2, 4))\n#> [1] [1, 2) {2}    (2, 4) [4, 5] [4, 5]\n#> Levels: [1, 2) {2} (2, 4) [4, 5]\n```\n\nUse names in breaks for labels:\n\n``` r\n\nchop(1:5, c(Low = 1, Mid = 2, High = 4))\n#> [1] Low  Mid  Mid  High High\n#> Levels: Low Mid High\n```\n\nOr use `lbl_*` functions:\n\n``` r\n\nchop(1:5, c(2, 4), labels = lbl_dash())\n#> [1] 1—2 2—4 2—4 4—5 4—5\n#> Levels: 1—2 2—4 4—5\n```\n\nChop into fixed-width intervals:\n\n``` r\n\nchop_width(runif(10), 0.1)\n#>  [1] [0.368, 0.468)   [0.268, 0.368)   [0.768, 0.868]   [0.568, 0.668)  \n#>  [5] [0.668, 0.768)   [0.768, 0.868]   [0.06801, 0.168) [0.668, 0.768)  \n#>  [9] [0.06801, 0.168) [0.468, 0.568)  \n#> 7 Levels: [0.06801, 0.168) [0.268, 0.368) [0.368, 0.468) ... [0.768, 0.868]\n```\n\nOr into fixed-size groups:\n\n``` r\n\nchop_n(1:10, 5)\n#>  [1] [1, 6)  [1, 6)  [1, 6)  [1, 6)  [1, 6)  [6, 10] [6, 10] [6, 10] [6, 10]\n#> [10] [6, 10]\n#> Levels: [1, 6) [6, 10]\n```\n\nChop dates by calendar month, then tabulate:\n\n``` r\n\nlibrary(lubridate)\n#> \n#> Attaching package: 'lubridate'\n#> The following objects are masked from 'package:base':\n#> \n#>     date, intersect, setdiff, union\n\ndates <- as.Date(\"2021-12-31\") + 1:90\n\ntab_width(dates, months(1), labels = lbl_discrete(fmt = \"%d %b\"))\n#> 01 Jan—31 Jan 01 Feb—28 Feb 01 Mar—31 Mar \n#>            31            28            31\n```\n\nFor more information, see the\n[vignette](https://hughjonesd.github.io/santoku/articles/santoku.html).\n"
  },
  {
    "path": "docs/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": "docs/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": "docs/llms.txt",
    "content": "# santoku\n\nsantoku is a versatile cutting tool for R. It provides\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md), a\nreplacement for [`base::cut()`](https://rdrr.io/r/base/cut.html).\n\n## Installation\n\nInstall from [r-universe](https://r-universe.dev):\n\n``` r\n\ninstall.packages(\"santoku\", repos = c(\"https://hughjonesd.r-universe.dev\", \n                                      \"https://cloud.r-project.org\"))\n```\n\nOr from CRAN:\n\n``` r\n\ninstall.packages(\"santoku\")\n```\n\nOr get the development version from github:\n\n``` r\n\n# install.packages(\"remotes\")\nremotes::install_github(\"hughjonesd/santoku\")\n```\n\n## Advantages\n\nHere are some advantages of santoku:\n\n- By default,\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n  always covers the whole range of the data, so you won’t get unexpected\n  `NA` values.\n\n- [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md) can\n  handle single values as well as intervals. For example,\n  `chop(x, breaks = c(1, 2, 2, 3))` will create a separate factor level\n  for values exactly equal to 2.\n\n- [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md) can\n  handle many kinds of data, including numbers, dates and times, and\n  [units](https://r-quantities.github.io/units/).\n\n- `chop_*` functions create intervals in many ways, using quantiles of\n  the data, standard deviations, fixed-width intervals, equal-sized\n  groups, or pretty intervals for use in graphs.\n\n- It’s easy to label intervals: use names for your breaks vector, or use\n  a `lbl_*` function to create interval notation like `[1, 2)`, dash\n  notation like `1-2`, or arbitrary styles using\n  [`glue::glue()`](https://glue.tidyverse.org/reference/glue.html).\n\n- `tab_*` functions quickly chop data, then tabulate it.\n\nThese advantages make santoku especially useful for exploratory\nanalysis, where you may not know the range of your data in advance.\n\n## Examples\n\n``` r\n\nlibrary(santoku)\n```\n\n`chop` returns a factor:\n\n``` r\n\nchop(1:5, c(2, 4))\n#> [1] [1, 2) [2, 4) [2, 4) [4, 5] [4, 5]\n#> Levels: [1, 2) [2, 4) [4, 5]\n```\n\nInclude a number twice to match it exactly:\n\n``` r\n\nchop(1:5, c(2, 2, 4))\n#> [1] [1, 2) {2}    (2, 4) [4, 5] [4, 5]\n#> Levels: [1, 2) {2} (2, 4) [4, 5]\n```\n\nUse names in breaks for labels:\n\n``` r\n\nchop(1:5, c(Low = 1, Mid = 2, High = 4))\n#> [1] Low  Mid  Mid  High High\n#> Levels: Low Mid High\n```\n\nOr use `lbl_*` functions:\n\n``` r\n\nchop(1:5, c(2, 4), labels = lbl_dash())\n#> [1] 1—2 2—4 2—4 4—5 4—5\n#> Levels: 1—2 2—4 4—5\n```\n\nChop into fixed-width intervals:\n\n``` r\n\nchop_width(runif(10), 0.1)\n#>  [1] [0.368, 0.468)   [0.268, 0.368)   [0.768, 0.868]   [0.568, 0.668)  \n#>  [5] [0.668, 0.768)   [0.768, 0.868]   [0.06801, 0.168) [0.668, 0.768)  \n#>  [9] [0.06801, 0.168) [0.468, 0.568)  \n#> 7 Levels: [0.06801, 0.168) [0.268, 0.368) [0.368, 0.468) ... [0.768, 0.868]\n```\n\nOr into fixed-size groups:\n\n``` r\n\nchop_n(1:10, 5)\n#>  [1] [1, 6)  [1, 6)  [1, 6)  [1, 6)  [1, 6)  [6, 10] [6, 10] [6, 10] [6, 10]\n#> [10] [6, 10]\n#> Levels: [1, 6) [6, 10]\n```\n\nChop dates by calendar month, then tabulate:\n\n``` r\n\nlibrary(lubridate)\n#> \n#> Attaching package: 'lubridate'\n#> The following objects are masked from 'package:base':\n#> \n#>     date, intersect, setdiff, union\n\ndates <- as.Date(\"2021-12-31\") + 1:90\n\ntab_width(dates, months(1), labels = lbl_discrete(fmt = \"%d %b\"))\n#> 01 Jan—31 Jan 01 Feb—28 Feb 01 Mar—31 Mar \n#>            31            28            31\n```\n\nFor more information, see the\n[vignette](https://hughjonesd.github.io/santoku/articles/santoku.html).\n\n# Package index\n\n## Package overview\n\n- [`santoku`](https://hughjonesd.github.io/santoku/reference/santoku-package.md)\n  [`santoku-package`](https://hughjonesd.github.io/santoku/reference/santoku-package.md)\n  : A versatile cutting tool for R: package overview and options\n\n## Basic chop functions\n\nCut a vector into intervals\n\n- [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n  [`kiru()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n  [`tab()`](https://hughjonesd.github.io/santoku/reference/chop.md) :\n  Cut data into intervals\n- [`fillet()`](https://hughjonesd.github.io/santoku/reference/fillet.md)\n  : Chop data precisely (for programmers)\n\n## Chopping by width\n\nCut a vector into intervals defined by width\n\n- [`brk_width(`*`<Duration>`*`)`](https://hughjonesd.github.io/santoku/reference/brk_width-for-datetime.md)\n  : Equal-width intervals for dates or datetimes\n- [`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md)\n  [`brk_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md)\n  [`tab_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md)\n  : Chop into fixed-width intervals\n- [`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md)\n  [`brk_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md)\n  [`tab_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md)\n  : Chop into proportions of the range of x\n- [`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md)\n  [`brk_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md)\n  [`tab_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md)\n  : Chop into equal-width intervals\n\n## Chopping by n\n\nCut a vector into intervals defined by number of elements\n\n- [`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md)\n  [`brk_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md)\n  [`tab_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md)\n  : Chop into fixed-sized groups\n- [`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  [`chop_deciles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  [`brk_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  [`tab_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  [`tab_deciles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  : Chop by quantiles\n- [`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md)\n  [`brk_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md)\n  [`tab_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md)\n  : Chop equal-sized groups\n\n## Chopping and separating\n\nCut a vector into intervals, separating out common values\n\n- [`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md)\n  [`brk_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md)\n  [`tab_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md)\n  : Chop common values into singleton intervals\n- [`dissect()`](https://hughjonesd.github.io/santoku/reference/dissect.md)\n  [`tab_dissect()`](https://hughjonesd.github.io/santoku/reference/dissect.md)\n  : Cut data into intervals, separating out common values\n\n## Other chop functions\n\nMiscellaneous ways to cut a vector into intervals\n\n- [`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md)\n  [`brk_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md)\n  [`tab_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md)\n  : Chop by standard deviations\n\n- [`chop_pretty()`](https://hughjonesd.github.io/santoku/reference/chop_pretty.md)\n  [`brk_pretty()`](https://hughjonesd.github.io/santoku/reference/chop_pretty.md)\n  [`tab_pretty()`](https://hughjonesd.github.io/santoku/reference/chop_pretty.md)\n  : Chop using pretty breakpoints\n\n- [`chop_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md)\n  [`brk_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md)\n  [`tab_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md)\n  : Chop using an existing function\n\n- [`brk_default()`](https://hughjonesd.github.io/santoku/reference/brk_default.md)\n  : Create a standard set of breaks\n\n- [`brk_manual()`](https://hughjonesd.github.io/santoku/reference/brk_manual.md)\n  :\n\n  Create a `breaks` object manually\n\n## Label functions\n\nSpecify how to label the chopped intervals\n\n- [`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md)\n  : Label chopped intervals like 1-4, 4-5, ...\n\n- [`lbl_date()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md)\n  [`lbl_datetime()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md)\n  **\\[experimental\\]** : Label dates and datetimes\n\n- [`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md)\n  : Label discrete data\n\n- [`lbl_endpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md)\n  [`lbl_endpoint()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md)\n  : Label chopped intervals by their left or right endpoints\n\n- [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  :\n\n  Label chopped intervals using the `glue` package\n\n- [`lbl_intervals()`](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md)\n  : Label chopped intervals using set notation\n\n- [`lbl_midpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_midpoints.md)\n  : Label chopped intervals by their midpoints\n\n- [`lbl_seq()`](https://hughjonesd.github.io/santoku/reference/lbl_seq.md)\n  : Label chopped intervals in sequence\n\n## Miscellaneous\n\nOther helper functions\n\n- [`format(`*`<breaks>`*`)`](https://hughjonesd.github.io/santoku/reference/breaks-class.md)\n  [`print(`*`<breaks>`*`)`](https://hughjonesd.github.io/santoku/reference/breaks-class.md)\n  [`is.breaks()`](https://hughjonesd.github.io/santoku/reference/breaks-class.md)\n  : Class representing a set of intervals\n- [`exactly()`](https://hughjonesd.github.io/santoku/reference/exactly.md)\n  : Define singleton intervals explicitly\n- [`non-standard-types`](https://hughjonesd.github.io/santoku/reference/non-standard-types.md)\n  : Tips for chopping non-standard types\n- [`percent()`](https://hughjonesd.github.io/santoku/reference/percent.md)\n  : Simple percentage formatter\n\n# Articles\n\n### All vignettes\n\n- [Performance](https://hughjonesd.github.io/santoku/articles/website-articles/performance.md):\n- [Introduction to\n  santoku](https://hughjonesd.github.io/santoku/articles/santoku.md):\n- [What's new in santoku\n  0.9.0](https://hughjonesd.github.io/santoku/articles/whats-new-in-0-9-0.md):\n"
  },
  {
    "path": "docs/news/index.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Changelog • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Changelog\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"active nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-news\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Changelog</h1>\n      <small>Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/NEWS.md\" class=\"external-link\"><code>NEWS.md</code></a></small>\n    </div>\n\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"1.2.0\" id=\"santoku-120\">santoku 1.2.0<a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-120\"></a></h2>\n<ul><li>New experimental <code><a href=\"../reference/lbl_datetime.html\">lbl_date()</a></code> and <code><a href=\"../reference/lbl_datetime.html\">lbl_datetime()</a></code> functions for pretty formatting of dates and date-times.</li>\n<li>Bugfix: extended breaks were failing on <code><a href=\"https://haven.tidyverse.org/reference/labelled.html\" class=\"external-link\">haven::labelled</a></code> objects.</li>\n<li>The <code>raw</code> argument to <code>lbl_*</code> functions, deprecated since 0.9.0, now throws an error.</li>\n</ul></div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"1.1.0\" id=\"santoku-110\">santoku 1.1.0<a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-110\"></a></h2><p class=\"text-muted\">CRAN release: 2025-09-11</p>\n<ul><li>Core logic has been speeded up using raw pointers. This was vibe-coded by me and Claude Code. If it breaks, please file a bug report.</li>\n<li>The experimental <code><a href=\"../reference/chop_spikes.html\">chop_spikes()</a></code> and <code><a href=\"../reference/dissect.html\">dissect()</a></code> functions give common values of <code>x</code> their own singleton intervals.</li>\n<li>On Unicode platforms, infinity will be represented as ∞ in breaks. Set <code>options(santoku.infinity = \"Inf\")</code> to use the old behaviour.</li>\n<li>Singleton breaks are not labelled specially by default in <code>chop_quantiles(..., raw = FALSE)</code>. This means that e.g. if the 10th and 20th percentiles are both the same number, the label will still be <code>[10%, 20%]</code>.</li>\n<li>When multiple quantiles are the same, santoku warns and returns the leftmost quantile interval. Before it would merge the intervals, creating labels that might be different to what the user asked for.</li>\n<li>\n<code><a href=\"../reference/chop_quantiles.html\">chop_quantiles()</a></code> gains a <code>recalc_probs</code> argument. <code>recalc_probs = TRUE</code> recalculates probabilities using <code>ecdf(x)</code>, which may give more accurate interval labels.</li>\n<li>\n<code>single = NULL</code> has been documented explicitly in <code>lbl_*</code> functions.</li>\n<li>Bugfix: <code><a href=\"../reference/brk_manual.html\">brk_manual()</a></code> no longer warns if <code>close_end = TRUE</code> (the default).</li>\n</ul></div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"1.0.0\" id=\"santoku-100\">santoku 1.0.0<a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-100\"></a></h2><p class=\"text-muted\">CRAN release: 2024-06-04</p>\n<ul><li>santoku is now considered stable.</li>\n<li>\n<code><a href=\"../reference/chop_quantiles.html\">chop_quantiles()</a></code> and <code><a href=\"../reference/chop_quantiles.html\">brk_quantiles()</a></code> gain a new <code>weights</code> argument, letting you chop by weighted quantiles using <code><a href=\"https://rdrr.io/pkg/Hmisc/man/wtd.stats.html\" class=\"external-link\">Hmisc::wtd.quantile()</a></code>.</li>\n<li>\n<code><a href=\"../reference/chop_quantiles.html\">brk_quantiles()</a></code> may now return singleton breaks, producing more accurate results when <code>x</code> has duplicate elements.</li>\n<li>Some deprecated functions have been removed, and the <code>raw</code> argument to <code>lbl_*</code> functions now always gives a deprecation warning.</li>\n</ul></div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"0.10.0\" id=\"santoku-0100\">santoku 0.10.0<a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-0100\"></a></h2><p class=\"text-muted\">CRAN release: 2023-10-12</p>\n<ul><li>List arguments to <code>fmt</code> in <code>lbl_*</code> functions will be taken as arguments to <code><a href=\"https://rdrr.io/r/base/format.html\" class=\"external-link\">base::format</a></code>. This gives more flexibility in formatting, e.g., <code>units</code> breaks.</li>\n<li>\n<code><a href=\"../reference/chop_n.html\">chop_n()</a></code> gains a <code>tail</code> argument, to deal with a last interval containing less than <code>n</code> elements. Set <code>tail = \"merge\"</code> to merge it with the previous interval. This guarantees that all intervals contain at least <code>n</code> elements.</li>\n<li>\n<code><a href=\"../reference/chop_equally.html\">chop_equally()</a></code> may return fewer than <code>groups</code> groups when there are duplicate elements. We now warn when this happens.</li>\n<li>Bugfix: <code><a href=\"../reference/chop_n.html\">chop_n()</a></code> could return intervals with fewer than <code>n</code> elements when there were duplicate elements. The new algorithm avoids this, but may be slower in this case.</li>\n</ul></div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"0.9.1\" id=\"santoku-091\">santoku 0.9.1<a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-091\"></a></h2><p class=\"text-muted\">CRAN release: 2023-03-08</p>\n<ul><li>\n<code>endpoint_labels()</code> methods gain an unused <code>...</code> argument to satisfy R CMD CHECK.</li>\n</ul></div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"0.9.0\" id=\"santoku-090\">santoku 0.9.0<a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-090\"></a></h2><p class=\"text-muted\">CRAN release: 2022-11-01</p>\n<div class=\"section level3\">\n<h3 id=\"breaking-changes-0-9-0\">Breaking changes<a class=\"anchor\" aria-label=\"anchor\" href=\"#breaking-changes-0-9-0\"></a></h3>\n<p>There are important changes to <code>close_end</code>.</p>\n<ul><li>\n<p><code>close_end</code> is now <code>TRUE</code> by default in <code><a href=\"../reference/chop.html\">chop()</a></code> and <code><a href=\"../reference/fillet.html\">fillet()</a></code>. In previous versions:</p>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">2</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">## [1] [1, 2) {2}   </span></span>\n<span><span class=\"co\">## Levels: [1, 2) {2}  </span></span></code></pre></div>\n<p>Whereas now:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">2</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">2</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">## [1] [1, 2] [1, 2]</span></span>\n<span><span class=\"co\">## Levels: [1, 2]</span></span></code></pre></div>\n</li>\n<li>\n<p><code>close_end</code> is now always applied after <code>extend</code>. For example, in previous versions:</p>\n<div class=\"sourceCode\" id=\"cb3\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">4</span>, <span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">3</span>, close_end <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">## [1] [1, 2) [2, 3] [2, 3] (3, 4]</span></span>\n<span><span class=\"co\">## Levels: [1, 2) [2, 3] (3, 4]</span></span></code></pre></div>\n<p>Whereas now:</p>\n<div class=\"sourceCode\" id=\"cb4\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">4</span>, <span class=\"fl\">2</span><span class=\"op\">:</span><span class=\"fl\">3</span>, close_end <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">## [1] [1, 2) [2, 3) [3, 4] [3, 4]</span></span>\n<span><span class=\"co\">## Levels: [1, 2) [2, 3) [3, 4]</span></span></code></pre></div>\n</li>\n</ul><p>We changed this behaviour to be more in line with user expectations.</p>\n<ul><li>\n<p>If <code>breaks</code> has names, they will be used as labels:</p>\n<div class=\"sourceCode\" id=\"cb5\"><pre class=\"downlit sourceCode r\">\n<code class=\"sourceCode R\"><span><span class=\"fu\"><a href=\"../reference/chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span>Low <span class=\"op\">=</span> <span class=\"fl\">1</span>, Mid <span class=\"op\">=</span> <span class=\"fl\">2</span>, High <span class=\"op\">=</span> <span class=\"fl\">4</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span><span class=\"co\">## [1] Low  Mid  Mid  High High</span></span>\n<span><span class=\"co\">## Levels: Low Mid High  </span></span></code></pre></div>\n<p>Names can also be used for labels in <code>probs</code> in <code><a href=\"../reference/chop_quantiles.html\">chop_quantiles()</a></code> and <code>proportions</code> in <code><a href=\"../reference/chop_proportions.html\">chop_proportions()</a></code>.</p>\n</li>\n<li><p>There is a new <code>raw</code> parameter to <code><a href=\"../reference/chop.html\">chop()</a></code>. This replaces the parameter <code>raw</code> in <code>lbl_*</code> functions, which is now soft-deprecated.</p></li>\n<li><p><code><a href=\"../reference/lbl_manual.html\">lbl_manual()</a></code> is deprecated. Just use a vector argument to <code>labels</code> instead.</p></li>\n<li><p>A <code>labels</code> argument to <code><a href=\"../reference/chop_quantiles.html\">chop_quantiles()</a></code> now needs to be explicitly named.</p></li>\n</ul><p>I expect these to be the last important breaking changes before we release version 1.0 and mark the package as “stable”. If they cause problems for you, please file an issue.</p>\n</div>\n<div class=\"section level3\">\n<h3 id=\"other-changes-0-9-0\">Other changes<a class=\"anchor\" aria-label=\"anchor\" href=\"#other-changes-0-9-0\"></a></h3>\n<ul><li>New <code><a href=\"../reference/chop_fn.html\">chop_fn()</a></code>, <code><a href=\"../reference/chop_fn.html\">brk_fn()</a></code> and <code><a href=\"../reference/chop_fn.html\">tab_fn()</a></code> chop using an arbitrary function.</li>\n<li>Added section on non-standard objects to vignette.</li>\n</ul></div>\n</div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"0.8.0\" id=\"santoku-080\">santoku 0.8.0<a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-080\"></a></h2><p class=\"text-muted\">CRAN release: 2022-06-08</p>\n<div class=\"section level3\">\n<h3 id=\"breaking-changes-0-8-0\">Breaking changes<a class=\"anchor\" aria-label=\"anchor\" href=\"#breaking-changes-0-8-0\"></a></h3>\n<ul><li>\n<code><a href=\"../reference/lbl_endpoints.html\">lbl_endpoint()</a></code> has been renamed to <code><a href=\"../reference/lbl_endpoints.html\">lbl_endpoints()</a></code>. The old version will trigger a deprecation warning. <code><a href=\"../reference/lbl_endpoints.html\">lbl_endpoints()</a></code> gains <code>first</code>, <code>last</code> and <code>single</code> arguments like other labelling functions.</li>\n</ul></div>\n<div class=\"section level3\">\n<h3 id=\"other-changes-0-8-0\">Other changes<a class=\"anchor\" aria-label=\"anchor\" href=\"#other-changes-0-8-0\"></a></h3>\n<ul><li>New <code><a href=\"../reference/chop_pretty.html\">chop_pretty()</a></code>, <code><a href=\"../reference/chop_pretty.html\">brk_pretty()</a></code> and <code><a href=\"../reference/chop_pretty.html\">tab_pretty()</a></code> functions use <code><a href=\"https://rdrr.io/r/base/pretty.html\" class=\"external-link\">base::pretty()</a></code> to calculate attractive breakpoints. Thanks <a href=\"https://github.com/davidhodge931\" class=\"external-link\">@davidhodge931</a>.</li>\n<li>New <code><a href=\"../reference/chop_proportions.html\">chop_proportions()</a></code>, <code><a href=\"../reference/chop_proportions.html\">brk_proportions()</a></code> and <code><a href=\"../reference/chop_proportions.html\">tab_proportions()</a></code> functions chop <code>x</code> into proportions of its range.</li>\n<li>\n<code><a href=\"../reference/chop_equally.html\">chop_equally()</a></code> now uses <code>lbl_intervals(raw = TRUE)</code> by default, bringing it into line with <code><a href=\"../reference/chop_evenly.html\">chop_evenly()</a></code>, <code><a href=\"../reference/chop_width.html\">chop_width()</a></code> and <code><a href=\"../reference/chop_n.html\">chop_n()</a></code>.</li>\n<li>New <code><a href=\"../reference/lbl_midpoints.html\">lbl_midpoints()</a></code> function labels breaks by their midpoints.</li>\n<li>\n<code><a href=\"../reference/lbl_discrete.html\">lbl_discrete()</a></code> gains a <code>single</code> argument.</li>\n<li>You can now chop <code>ts</code>, <code><a href=\"https://rdrr.io/pkg/xts/man/xts.html\" class=\"external-link\">xts::xts</a></code> and <code><a href=\"https://rdrr.io/pkg/zoo/man/zoo.html\" class=\"external-link\">zoo::zoo</a></code> objects.</li>\n<li>\n<code><a href=\"../reference/chop.html\">chop()</a></code> is more forgiving when mixing different types, e.g.:\n<ul><li>\n<code>Date</code> objects with <code>POSIXct</code> breaks, and vice versa</li>\n<li>\n<code><a href=\"https://bit64.r-lib.org/reference/bit64-package.html\" class=\"external-link\">bit64::integer64</a></code> and <code>double</code>s</li>\n</ul></li>\n<li>Bugfix: <code><a href=\"../reference/lbl_discrete.html\">lbl_discrete()</a></code> sometimes had ugly label formatting.</li>\n</ul></div>\n</div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"0.7.0\" id=\"santoku-070\">santoku 0.7.0<a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-070\"></a></h2><p class=\"text-muted\">CRAN release: 2022-03-18</p>\n<div class=\"section level3\">\n<h3 id=\"breaking-changes-0-7-0\">Breaking changes<a class=\"anchor\" aria-label=\"anchor\" href=\"#breaking-changes-0-7-0\"></a></h3>\n<ul><li>In labelling functions, <code>first</code> and <code>last</code> arguments are now passed to <code><a href=\"https://glue.tidyverse.org/reference/glue.html\" class=\"external-link\">glue::glue()</a></code>. Variables <code>l</code> and <code>r</code> represent the left and right endpoints of the intervals.</li>\n<li>\n<code><a href=\"../reference/chop_mean_sd.html\">chop_mean_sd()</a></code> now takes a vector <code>sds</code> of standard deviations, rather than a single maximum number <code>sd</code> of standard deviations. Write e.g.  <code>chop_mean_sd(sds = 1:3)</code> rather than <code>chop_mean_sd(sd = 3)</code>. The <code>sd</code> argument is deprecated.</li>\n<li>The <code>groups</code> argument to <code><a href=\"../reference/chop_evenly.html\">chop_evenly()</a></code>, deprecated in 0.4.0, has been removed.</li>\n<li>\n<code>brk_left()</code> and <code>brk_right()</code>, deprecated in 0.4.0, have been removed.</li>\n<li>\n<code>knife()</code>, deprecated in 0.4.0, has been removed.</li>\n<li>\n<code>lbl_format()</code>, questioning since 0.4.0, has been removed.</li>\n<li>Arguments of <code><a href=\"../reference/lbl_dash.html\">lbl_dash()</a></code> and <code><a href=\"../reference/lbl_intervals.html\">lbl_intervals()</a></code> have been reordered for consistency with other labelling functions.</li>\n</ul></div>\n<div class=\"section level3\">\n<h3 id=\"other-changes-0-7-0\">Other changes<a class=\"anchor\" aria-label=\"anchor\" href=\"#other-changes-0-7-0\"></a></h3>\n<ul><li>You can now chop many more types, including <code>units</code> from the <code>units</code> package, <code>difftime</code> objects, <code>package_version</code> objects, etc.\n<ul><li>Character vectors will be chopped by lexicographic order, with an optional warning.</li>\n<li>If you have problems chopping a vector type, file a bug report.</li>\n</ul></li>\n<li>The <a href=\"https://glue.tidyverse.org/\" class=\"external-link\">glue</a> package has become a hard dependency. It is used in many places to format labels.</li>\n<li>There is a new <code><a href=\"../reference/lbl_glue.html\">lbl_glue()</a></code> function using the <a href=\"https://glue.tidyverse.org/\" class=\"external-link\">glue</a> package. Thanks to <a href=\"https://github.com/dpprdan\" class=\"external-link\">@dpprdan</a>.</li>\n<li>You can now set <code>labels = NULL</code> to return integer codes.</li>\n<li>Arguments <code>first</code>, <code>last</code> and <code>single</code> can be used in <code><a href=\"../reference/lbl_intervals.html\">lbl_intervals()</a></code> and <code><a href=\"../reference/lbl_dash.html\">lbl_dash()</a></code>, to override the first and last interval labels, or to label singleton intervals.</li>\n<li>\n<code><a href=\"../reference/lbl_dash.html\">lbl_dash()</a></code> and <code><a href=\"../reference/lbl_discrete.html\">lbl_discrete()</a></code> use unicode em-dash where possible.</li>\n<li>\n<code><a href=\"../reference/brk_default.html\">brk_default()</a></code> throws an error if breaks are not sorted.</li>\n</ul></div>\n<div class=\"section level3\">\n<h3 id=\"bugfixes-0-7-0\">Bugfixes<a class=\"anchor\" aria-label=\"anchor\" href=\"#bugfixes-0-7-0\"></a></h3>\n<ul><li>Bugfix: <code><a href=\"../reference/chop.html\">tab()</a></code> and friends no longer display an <code>x</code> as the variable name.</li>\n<li>Bugfix: <code><a href=\"../reference/lbl_endpoints.html\">lbl_endpoint()</a></code> was erroring for some types of breaks.</li>\n</ul></div>\n</div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"0.6.0\" id=\"santoku-060\">santoku 0.6.0<a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-060\"></a></h2><p class=\"text-muted\">CRAN release: 2021-11-04</p>\n<ul><li><p>New arguments <code>first</code> and <code>last</code> in <code><a href=\"../reference/lbl_dash.html\">lbl_dash()</a></code> and <code><a href=\"../reference/lbl_discrete.html\">lbl_discrete()</a></code> allow you to override the first and last interval labels.</p></li>\n<li><p>Fixes for CRAN.</p></li>\n</ul></div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"0.5.0\" id=\"santoku-050\">santoku 0.5.0<a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-050\"></a></h2><p class=\"text-muted\">CRAN release: 2020-08-27</p>\n<ul><li>Negative numbers can be used in <code><a href=\"../reference/chop_width.html\">chop_width()</a></code>.\n<ul><li>This sets <code>left = FALSE</code> by default.</li>\n<li>Also works for negative time intervals.</li>\n</ul></li>\n</ul></div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"0.4.1\" id=\"santoku-041\">santoku 0.4.1<a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-041\"></a></h2><p class=\"text-muted\">CRAN release: 2020-06-16</p>\n<ul><li>Bugfix: <code>chop(1:4, 1)</code> was erroring.</li>\n</ul></div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"0.4.0\" id=\"santoku-040\">santoku 0.4.0<a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-040\"></a></h2><p class=\"text-muted\">CRAN release: 2020-06-09</p>\n<div class=\"section level3\">\n<h3 id=\"interface-changes-0-4-0\">Interface changes<a class=\"anchor\" aria-label=\"anchor\" href=\"#interface-changes-0-4-0\"></a></h3>\n<p>The new version has some interface changes. These are based on user experience, and are designed to make using <code><a href=\"../reference/chop.html\">chop()</a></code> more intuitive and predictable.</p>\n<ul><li>\n<p><code><a href=\"../reference/chop.html\">chop()</a></code> has two new arguments, <code>left</code> and <code>close_end</code>.</p>\n<ul><li>Using <code>left = FALSE</code> is simpler and more intuitive than wrapping breaks in <code>brk_right()</code>.</li>\n<li>\n<code>brk_left()</code> and <code>brk_right()</code> have been kept for now, but cannot be used to wrap other break functions.</li>\n<li>Using <code>close_end</code> is simpler than passing <code>close_end</code> into <code>brk_left()</code> or <code>brk_right()</code> (which no longer accept this argument directly).</li>\n<li>\n<code>left = TRUE</code> by default, except for non-numeric objects in <code><a href=\"../reference/chop_quantiles.html\">chop_quantiles()</a></code> and <code><a href=\"../reference/chop_equally.html\">chop_equally()</a></code>, where <code>left = FALSE</code> works better.</li>\n</ul></li>\n<li>\n<p><code>close_end</code> is now <code>FALSE</code> by default.</p>\n<ul><li>This prevents user surprises when e.g. <code>chop(3, 1:3)</code> puts <code>3</code> into a different category than <code>chop(3, 1:4)</code>.</li>\n<li>\n<code>close_end</code> is <code>TRUE</code> by default for <code><a href=\"../reference/chop_quantiles.html\">chop_quantiles()</a></code>, <code><a href=\"../reference/chop_n.html\">chop_n()</a></code> and similar functions. This ensures that e.g.  <code>chop_quantiles(x, c(0, 1/3, 2/3, 1))</code> does what you would expect.</li>\n</ul></li>\n<li><p>The <code>groups</code> argument to <code><a href=\"../reference/chop_evenly.html\">chop_evenly()</a></code> has been renamed from <code>groups</code> to <code>intervals</code>. This should make it easier to remember the difference between <code><a href=\"../reference/chop_evenly.html\">chop_evenly()</a></code> and <code><a href=\"../reference/chop_equally.html\">chop_equally()</a></code>. (Chop evenly into <code>n</code> equal-width <em>intervals</em>, or chop equally into <code>n</code> equal-sized <em>groups</em>.)</p></li>\n<li><p><code>knife()</code> has been deprecated to keep the interface slim and focused. Use <code><a href=\"https://purrr.tidyverse.org/reference/partial.html\" class=\"external-link\">purrr::partial()</a></code> instead.</p></li>\n</ul></div>\n<div class=\"section level3\">\n<h3 id=\"other-changes-0-4-0\">Other changes<a class=\"anchor\" aria-label=\"anchor\" href=\"#other-changes-0-4-0\"></a></h3>\n<ul><li>\n<p>Date and datetime (<code>POSIXct</code>) objects can now be chopped.</p>\n<ul><li>\n<code><a href=\"../reference/chop_width.html\">chop_width()</a></code> accepts <code>difftime</code>, <code><a href=\"https://lubridate.tidyverse.org/reference/period.html\" class=\"external-link\">lubridate::period</a></code> or <code><a href=\"https://lubridate.tidyverse.org/reference/duration.html\" class=\"external-link\">lubridate::duration</a></code> objects</li>\n<li>all other <code>chop_</code> functions work as well.</li>\n</ul></li>\n<li><p>Many labelling functions have a new <code>fmt</code> argument. This can be a string interpreted by <code><a href=\"https://rdrr.io/r/base/sprintf.html\" class=\"external-link\">sprintf()</a></code> or <code><a href=\"https://rdrr.io/r/base/format.html\" class=\"external-link\">format()</a></code>, or a 1-argument formatting function for break endpoints, e.g. <code><a href=\"https://scales.r-lib.org/reference/label_percent.html\" class=\"external-link\">scales::label_percent()</a></code>.</p></li>\n<li><p>Experimental: <code><a href=\"../reference/lbl_discrete.html\">lbl_discrete()</a></code> for discrete data such as integers or (most) dates.</p></li>\n<li><p>There is a new <code><a href=\"../reference/lbl_endpoints.html\">lbl_endpoint()</a></code> function for labelling intervals solely by their left or right endpoint.</p></li>\n<li><p><code><a href=\"../reference/chop_mean_sd.html\">brk_mean_sd()</a></code> now accepts non-integer positive numbers.</p></li>\n<li><p>Add <code><a href=\"../reference/chop_equally.html\">brk_equally()</a></code> for symmetry with <code><a href=\"../reference/chop_equally.html\">chop_equally()</a></code>.</p></li>\n<li><p>Minor tweaks to <code><a href=\"../reference/chop_quantiles.html\">chop_deciles()</a></code>.</p></li>\n<li><p>Bugfix: <code>lbl_format()</code> wasn’t accepting numeric formats, even when <code>raw = TRUE</code>. Thanks to Sharla Gelfand.</p></li>\n</ul></div>\n</div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"0.3.0\" id=\"santoku-030\">santoku 0.3.0<a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-030\"></a></h2><p class=\"text-muted\">CRAN release: 2020-01-24</p>\n<ul><li><p>First CRAN release.</p></li>\n<li><p>Changed <code>kut()</code> to <code><a href=\"../reference/chop.html\">kiru()</a></code>. <code><a href=\"../reference/chop.html\">kiru()</a></code> is an alternative spelling for <code><a href=\"../reference/chop.html\">chop()</a></code>, for use when the tidyr package is loaded.</p></li>\n<li><p><code>lbl_sequence()</code> has become <code><a href=\"../reference/lbl_manual.html\">lbl_manual()</a></code>.</p></li>\n<li>\n<p><code>lbl_letters()</code> and friends have been replaced by <code><a href=\"../reference/lbl_seq.html\">lbl_seq()</a></code>:</p>\n<ul><li>to replace <code>lbl_letters()</code> use <code><a href=\"../reference/lbl_seq.html\">lbl_seq()</a></code>\n</li>\n<li>to replace <code>lbl_LETTERS()</code> use <code>lbl_seq(\"A\")</code>\n</li>\n<li>to replace <code>lbl_roman()</code> use <code>lbl_seq(\"i\")</code>\n</li>\n<li>to replace <code>lbl_ROMAN()</code> use <code>lbl_seq(\"I\")</code>\n</li>\n<li>to replace <code>lbl_numerals()</code> use <code>lbl_seq(\"1\")</code>\n</li>\n<li>for more complex formatting use e.g. <code>lbl_seq(\"A:\")</code>, <code>lbl_seq(\"(i)\")</code>\n</li>\n</ul></li>\n</ul></div>\n    <div class=\"section level2\">\n<h2 class=\"pkg-version\" data-toc-text=\"0.2.0\" id=\"santoku-020\">santoku 0.2.0<a class=\"anchor\" aria-label=\"anchor\" href=\"#santoku-020\"></a></h2>\n<ul><li><p>Added a <code>NEWS.md</code> file to track changes to the package.</p></li>\n<li><p>Default labels when <code>extend = NULL</code> have changed, from <code>[-Inf, ...</code> and <code>..., Inf]</code> to <code>[min(x), ...</code> and <code>..., max(x)]</code>.</p></li>\n</ul></div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/news/index.md",
    "content": "# Changelog\n\n## santoku 1.2.0\n\n- New experimental\n  [`lbl_date()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md)\n  and\n  [`lbl_datetime()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md)\n  functions for pretty formatting of dates and date-times.\n- Bugfix: extended breaks were failing on\n  [`haven::labelled`](https://haven.tidyverse.org/reference/labelled.html)\n  objects.\n- The `raw` argument to `lbl_*` functions, deprecated since 0.9.0, now\n  throws an error.\n\n## santoku 1.1.0\n\nCRAN release: 2025-09-11\n\n- Core logic has been speeded up using raw pointers. This was vibe-coded\n  by me and Claude Code. If it breaks, please file a bug report.\n- The experimental\n  [`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md)\n  and\n  [`dissect()`](https://hughjonesd.github.io/santoku/reference/dissect.md)\n  functions give common values of `x` their own singleton intervals.\n- On Unicode platforms, infinity will be represented as ∞ in breaks. Set\n  `options(santoku.infinity = \"Inf\")` to use the old behaviour.\n- Singleton breaks are not labelled specially by default in\n  `chop_quantiles(..., raw = FALSE)`. This means that e.g. if the 10th\n  and 20th percentiles are both the same number, the label will still be\n  `[10%, 20%]`.\n- When multiple quantiles are the same, santoku warns and returns the\n  leftmost quantile interval. Before it would merge the intervals,\n  creating labels that might be different to what the user asked for.\n- [`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  gains a `recalc_probs` argument. `recalc_probs = TRUE` recalculates\n  probabilities using `ecdf(x)`, which may give more accurate interval\n  labels.\n- `single = NULL` has been documented explicitly in `lbl_*` functions.\n- Bugfix:\n  [`brk_manual()`](https://hughjonesd.github.io/santoku/reference/brk_manual.md)\n  no longer warns if `close_end = TRUE` (the default).\n\n## santoku 1.0.0\n\nCRAN release: 2024-06-04\n\n- santoku is now considered stable.\n- [`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  and\n  [`brk_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  gain a new `weights` argument, letting you chop by weighted quantiles\n  using\n  [`Hmisc::wtd.quantile()`](https://rdrr.io/pkg/Hmisc/man/wtd.stats.html).\n- [`brk_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  may now return singleton breaks, producing more accurate results when\n  `x` has duplicate elements.\n- Some deprecated functions have been removed, and the `raw` argument to\n  `lbl_*` functions now always gives a deprecation warning.\n\n## santoku 0.10.0\n\nCRAN release: 2023-10-12\n\n- List arguments to `fmt` in `lbl_*` functions will be taken as\n  arguments to [`base::format`](https://rdrr.io/r/base/format.html).\n  This gives more flexibility in formatting, e.g., `units` breaks.\n- [`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md)\n  gains a `tail` argument, to deal with a last interval containing less\n  than `n` elements. Set `tail = \"merge\"` to merge it with the previous\n  interval. This guarantees that all intervals contain at least `n`\n  elements.\n- [`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md)\n  may return fewer than `groups` groups when there are duplicate\n  elements. We now warn when this happens.\n- Bugfix:\n  [`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md)\n  could return intervals with fewer than `n` elements when there were\n  duplicate elements. The new algorithm avoids this, but may be slower\n  in this case.\n\n## santoku 0.9.1\n\nCRAN release: 2023-03-08\n\n- `endpoint_labels()` methods gain an unused `...` argument to satisfy R\n  CMD CHECK.\n\n## santoku 0.9.0\n\nCRAN release: 2022-11-01\n\n### Breaking changes\n\nThere are important changes to `close_end`.\n\n- `close_end` is now `TRUE` by default in\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md) and\n  [`fillet()`](https://hughjonesd.github.io/santoku/reference/fillet.md).\n  In previous versions:\n\n  ``` r\n\n  chop(1:2, 1:2)\n  ## [1] [1, 2) {2}   \n  ## Levels: [1, 2) {2}  \n  ```\n\n  Whereas now:\n\n  ``` r\n\n  chop(1:2, 1:2)\n  ## [1] [1, 2] [1, 2]\n  ## Levels: [1, 2]\n  ```\n\n- `close_end` is now always applied after `extend`. For example, in\n  previous versions:\n\n  ``` r\n\n  chop(1:4, 2:3, close_end = TRUE)\n  ## [1] [1, 2) [2, 3] [2, 3] (3, 4]\n  ## Levels: [1, 2) [2, 3] (3, 4]\n  ```\n\n  Whereas now:\n\n  ``` r\n\n  chop(1:4, 2:3, close_end = TRUE)\n  ## [1] [1, 2) [2, 3) [3, 4] [3, 4]\n  ## Levels: [1, 2) [2, 3) [3, 4]\n  ```\n\nWe changed this behaviour to be more in line with user expectations.\n\n- If `breaks` has names, they will be used as labels:\n\n  ``` r\n\n  chop(1:5, c(Low = 1, Mid = 2, High = 4))\n  ## [1] Low  Mid  Mid  High High\n  ## Levels: Low Mid High  \n  ```\n\n  Names can also be used for labels in `probs` in\n  [`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  and `proportions` in\n  [`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md).\n\n- There is a new `raw` parameter to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n  This replaces the parameter `raw` in `lbl_*` functions, which is now\n  soft-deprecated.\n\n- [`lbl_manual()`](https://hughjonesd.github.io/santoku/reference/lbl_manual.md)\n  is deprecated. Just use a vector argument to `labels` instead.\n\n- A `labels` argument to\n  [`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  now needs to be explicitly named.\n\nI expect these to be the last important breaking changes before we\nrelease version 1.0 and mark the package as “stable”. If they cause\nproblems for you, please file an issue.\n\n### Other changes\n\n- New\n  [`chop_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md),\n  [`brk_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md)\n  and\n  [`tab_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md)\n  chop using an arbitrary function.\n- Added section on non-standard objects to vignette.\n\n## santoku 0.8.0\n\nCRAN release: 2022-06-08\n\n### Breaking changes\n\n- [`lbl_endpoint()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md)\n  has been renamed to\n  [`lbl_endpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md).\n  The old version will trigger a deprecation warning.\n  [`lbl_endpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md)\n  gains `first`, `last` and `single` arguments like other labelling\n  functions.\n\n### Other changes\n\n- New\n  [`chop_pretty()`](https://hughjonesd.github.io/santoku/reference/chop_pretty.md),\n  [`brk_pretty()`](https://hughjonesd.github.io/santoku/reference/chop_pretty.md)\n  and\n  [`tab_pretty()`](https://hughjonesd.github.io/santoku/reference/chop_pretty.md)\n  functions use [`base::pretty()`](https://rdrr.io/r/base/pretty.html)\n  to calculate attractive breakpoints. Thanks\n  [@davidhodge931](https://github.com/davidhodge931).\n- New\n  [`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md),\n  [`brk_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md)\n  and\n  [`tab_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md)\n  functions chop `x` into proportions of its range.\n- [`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md)\n  now uses `lbl_intervals(raw = TRUE)` by default, bringing it into line\n  with\n  [`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md),\n  [`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md)\n  and\n  [`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md).\n- New\n  [`lbl_midpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_midpoints.md)\n  function labels breaks by their midpoints.\n- [`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md)\n  gains a `single` argument.\n- You can now chop `ts`,\n  [`xts::xts`](https://rdrr.io/pkg/xts/man/xts.html) and\n  [`zoo::zoo`](https://rdrr.io/pkg/zoo/man/zoo.html) objects.\n- [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md) is\n  more forgiving when mixing different types, e.g.:\n  - `Date` objects with `POSIXct` breaks, and vice versa\n  - [`bit64::integer64`](https://bit64.r-lib.org/reference/bit64-package.html)\n    and `double`s\n- Bugfix:\n  [`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md)\n  sometimes had ugly label formatting.\n\n## santoku 0.7.0\n\nCRAN release: 2022-03-18\n\n### Breaking changes\n\n- In labelling functions, `first` and `last` arguments are now passed to\n  [`glue::glue()`](https://glue.tidyverse.org/reference/glue.html).\n  Variables `l` and `r` represent the left and right endpoints of the\n  intervals.\n- [`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md)\n  now takes a vector `sds` of standard deviations, rather than a single\n  maximum number `sd` of standard deviations. Write e.g. \n  `chop_mean_sd(sds = 1:3)` rather than `chop_mean_sd(sd = 3)`. The `sd`\n  argument is deprecated.\n- The `groups` argument to\n  [`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md),\n  deprecated in 0.4.0, has been removed.\n- `brk_left()` and `brk_right()`, deprecated in 0.4.0, have been\n  removed.\n- `knife()`, deprecated in 0.4.0, has been removed.\n- `lbl_format()`, questioning since 0.4.0, has been removed.\n- Arguments of\n  [`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md)\n  and\n  [`lbl_intervals()`](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md)\n  have been reordered for consistency with other labelling functions.\n\n### Other changes\n\n- You can now chop many more types, including `units` from the `units`\n  package, `difftime` objects, `package_version` objects, etc.\n  - Character vectors will be chopped by lexicographic order, with an\n    optional warning.\n  - If you have problems chopping a vector type, file a bug report.\n- The [glue](https://glue.tidyverse.org/) package has become a hard\n  dependency. It is used in many places to format labels.\n- There is a new\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  function using the [glue](https://glue.tidyverse.org/) package. Thanks\n  to [@dpprdan](https://github.com/dpprdan).\n- You can now set `labels = NULL` to return integer codes.\n- Arguments `first`, `last` and `single` can be used in\n  [`lbl_intervals()`](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md)\n  and\n  [`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md),\n  to override the first and last interval labels, or to label singleton\n  intervals.\n- [`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md)\n  and\n  [`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md)\n  use unicode em-dash where possible.\n- [`brk_default()`](https://hughjonesd.github.io/santoku/reference/brk_default.md)\n  throws an error if breaks are not sorted.\n\n### Bugfixes\n\n- Bugfix:\n  [`tab()`](https://hughjonesd.github.io/santoku/reference/chop.md) and\n  friends no longer display an `x` as the variable name.\n- Bugfix:\n  [`lbl_endpoint()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md)\n  was erroring for some types of breaks.\n\n## santoku 0.6.0\n\nCRAN release: 2021-11-04\n\n- New arguments `first` and `last` in\n  [`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md)\n  and\n  [`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md)\n  allow you to override the first and last interval labels.\n\n- Fixes for CRAN.\n\n## santoku 0.5.0\n\nCRAN release: 2020-08-27\n\n- Negative numbers can be used in\n  [`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md).\n  - This sets `left = FALSE` by default.\n  - Also works for negative time intervals.\n\n## santoku 0.4.1\n\nCRAN release: 2020-06-16\n\n- Bugfix: `chop(1:4, 1)` was erroring.\n\n## santoku 0.4.0\n\nCRAN release: 2020-06-09\n\n### Interface changes\n\nThe new version has some interface changes. These are based on user\nexperience, and are designed to make using\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md) more\nintuitive and predictable.\n\n- [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md) has\n  two new arguments, `left` and `close_end`.\n\n  - Using `left = FALSE` is simpler and more intuitive than wrapping\n    breaks in `brk_right()`.\n  - `brk_left()` and `brk_right()` have been kept for now, but cannot be\n    used to wrap other break functions.\n  - Using `close_end` is simpler than passing `close_end` into\n    `brk_left()` or `brk_right()` (which no longer accept this argument\n    directly).\n  - `left = TRUE` by default, except for non-numeric objects in\n    [`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n    and\n    [`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md),\n    where `left = FALSE` works better.\n\n- `close_end` is now `FALSE` by default.\n\n  - This prevents user surprises when e.g. `chop(3, 1:3)` puts `3` into\n    a different category than `chop(3, 1:4)`.\n  - `close_end` is `TRUE` by default for\n    [`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md),\n    [`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md)\n    and similar functions. This ensures that e.g. \n    `chop_quantiles(x, c(0, 1/3, 2/3, 1))` does what you would expect.\n\n- The `groups` argument to\n  [`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md)\n  has been renamed from `groups` to `intervals`. This should make it\n  easier to remember the difference between\n  [`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md)\n  and\n  [`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md).\n  (Chop evenly into `n` equal-width *intervals*, or chop equally into\n  `n` equal-sized *groups*.)\n\n- `knife()` has been deprecated to keep the interface slim and focused.\n  Use\n  [`purrr::partial()`](https://purrr.tidyverse.org/reference/partial.html)\n  instead.\n\n### Other changes\n\n- Date and datetime (`POSIXct`) objects can now be chopped.\n\n  - [`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md)\n    accepts `difftime`,\n    [`lubridate::period`](https://lubridate.tidyverse.org/reference/period.html)\n    or\n    [`lubridate::duration`](https://lubridate.tidyverse.org/reference/duration.html)\n    objects\n  - all other `chop_` functions work as well.\n\n- Many labelling functions have a new `fmt` argument. This can be a\n  string interpreted by\n  [`sprintf()`](https://rdrr.io/r/base/sprintf.html) or\n  [`format()`](https://rdrr.io/r/base/format.html), or a 1-argument\n  formatting function for break endpoints,\n  e.g. [`scales::label_percent()`](https://scales.r-lib.org/reference/label_percent.html).\n\n- Experimental:\n  [`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md)\n  for discrete data such as integers or (most) dates.\n\n- There is a new\n  [`lbl_endpoint()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md)\n  function for labelling intervals solely by their left or right\n  endpoint.\n\n- [`brk_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md)\n  now accepts non-integer positive numbers.\n\n- Add\n  [`brk_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md)\n  for symmetry with\n  [`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md).\n\n- Minor tweaks to\n  [`chop_deciles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md).\n\n- Bugfix: `lbl_format()` wasn’t accepting numeric formats, even when\n  `raw = TRUE`. Thanks to Sharla Gelfand.\n\n## santoku 0.3.0\n\nCRAN release: 2020-01-24\n\n- First CRAN release.\n\n- Changed `kut()` to\n  [`kiru()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n  [`kiru()`](https://hughjonesd.github.io/santoku/reference/chop.md) is\n  an alternative spelling for\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md),\n  for use when the tidyr package is loaded.\n\n- `lbl_sequence()` has become\n  [`lbl_manual()`](https://hughjonesd.github.io/santoku/reference/lbl_manual.md).\n\n- `lbl_letters()` and friends have been replaced by\n  [`lbl_seq()`](https://hughjonesd.github.io/santoku/reference/lbl_seq.md):\n\n  - to replace `lbl_letters()` use\n    [`lbl_seq()`](https://hughjonesd.github.io/santoku/reference/lbl_seq.md)\n  - to replace `lbl_LETTERS()` use `lbl_seq(\"A\")`\n  - to replace `lbl_roman()` use `lbl_seq(\"i\")`\n  - to replace `lbl_ROMAN()` use `lbl_seq(\"I\")`\n  - to replace `lbl_numerals()` use `lbl_seq(\"1\")`\n  - for more complex formatting use e.g. `lbl_seq(\"A:\")`,\n    `lbl_seq(\"(i)\")`\n\n## santoku 0.2.0\n\n- Added a `NEWS.md` file to track changes to the package.\n\n- Default labels when `extend = NULL` have changed, from `[-Inf, ...`\n  and `..., Inf]` to `[min(x), ...` and `..., max(x)]`.\n"
  },
  {
    "path": "docs/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\nimg {\n  max-width: 100%;\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  margin-left: -30px;\n  display:inline-block;\n  width: 30px;\n  height: 30px;\n  visibility: hidden;\n\n  background-image: url(./link.svg);\n  background-repeat: no-repeat;\n  background-size: 20px 20px;\n  background-position: center center;\n}\n\n.hasAnchor:hover a.anchor {\n  visibility: visible;\n}\n\n@media (max-width: 767px) {\n  .hasAnchor:hover a.anchor {\n    visibility: hidden;\n  }\n}\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 {\n  word-wrap: normal;\n  word-break: normal;\n  border: 1px solid #eee;\n}\n\npre, code {\n  background-color: #f8f8f8;\n  color: #333;\n}\n\npre code {\n  overflow: auto;\n  word-wrap: normal;\n  white-space: pre;\n}\n\npre .img {\n  margin: 5px 0;\n}\n\npre .img img {\n  background-color: #fff;\n  display: block;\n  height: auto;\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.message { color: black;   font-weight: bolder;}\n.error   { color: orange;  font-weight: bolder;}\n.warning { color: #6A0366; 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"
  },
  {
    "path": "docs/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": "docs/pkgdown.yml",
    "content": "pandoc: 3.8.3\npkgdown: 2.2.0\npkgdown_sha: ~\narticles:\n  website-articles/performance: website-articles/performance.html\n  santoku: santoku.html\n  whats-new-in-0-9-0: whats-new-in-0-9-0.html\nlast_built: 2026-04-28T14:11Z\nurls:\n  reference: https://hughjonesd.github.io/santoku/reference\n  article: https://hughjonesd.github.io/santoku/articles\n"
  },
  {
    "path": "docs/reference/breaks-class.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Class representing a set of intervals — breaks-class • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Class representing a set of intervals — breaks-class\"><meta name=\"description\" content=\"Class representing a set of intervals\"><meta property=\"og:description\" content=\"Class representing a set of intervals\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Class representing a set of intervals</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks.R\" class=\"external-link\"><code>R/breaks.R</code></a></small>\n      <div class=\"d-none name\"><code>breaks-class.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Class representing a set of intervals</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'breaks'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/format.html\" class=\"external-link\">format</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'breaks'</span></span>\n<span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/print.html\" class=\"external-link\">print</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">is.breaks</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A breaks object</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Unused</p></dd>\n\n</dl></div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/breaks-class.md",
    "content": "# Class representing a set of intervals\n\nClass representing a set of intervals\n\n## Usage\n\n``` r\n# S3 method for class 'breaks'\nformat(x, ...)\n\n# S3 method for class 'breaks'\nprint(x, ...)\n\nis.breaks(x, ...)\n```\n\n## Arguments\n\n- x:\n\n  A breaks object\n\n- ...:\n\n  Unused\n"
  },
  {
    "path": "docs/reference/brk-left-right.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"\"><title>Left- or right-closed breaks — brk-left-right • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../favicon-16x16.png\"><link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../favicon-32x32.png\"><link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"120x120\" href=\"../apple-touch-icon-120x120.png\"><link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"76x76\" href=\"../apple-touch-icon-76x76.png\"><link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"60x60\" href=\"../apple-touch-icon-60x60.png\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.1.0/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.1.0/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><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\"><!-- bootstrap-toc --><script src=\"https://cdn.rawgit.com/afeld/bootstrap-toc/v1.0.1/dist/bootstrap-toc.min.js\"></script><!-- headroom.js --><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><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Left- or right-closed breaks — brk-left-right\"><meta property=\"og:description\" content=\"\"><meta property=\"og:image\" content=\"/logo.png\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><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><!--[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]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">0.6.0.9000</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a>\n</li>\n<li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a>\n  </div>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-tutorials\">Tutorials</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\">\n    <a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to Santoku</a>\n    <a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Left- or right-closed breaks</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks.R\" class=\"external-link\"><code>R/breaks.R</code></a></small>\n      <div class=\"d-none name\"><code>brk-left-right.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><a href=\"https://lifecycle.r-lib.org/articles/stages.html#questioning\" class=\"external-link\"><img src=\"figures/lifecycle-questioning.svg\" alt=\"[Questioning]\"></a></p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"fu\">brk_left</span><span class=\"op\">(</span><span class=\"va\">breaks</span><span class=\"op\">)</span>\n\n<span class=\"fu\">brk_right</span><span class=\"op\">(</span><span class=\"va\">breaks</span><span class=\"op\">)</span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>breaks</dt>\n<dd><p>A numeric vector.</p></dd>\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A (function which returns an) object of class <code>breaks</code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>These functions are in the \"questioning\" stage because they clash with the\n<code>left</code> argument to <code><a href=\"chop.html\">chop()</a></code> and friends.</p>\n<p>These functions override the <code>left</code> argument of <code><a href=\"chop.html\">chop()</a></code>.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">5</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\">brk_left</span><span class=\"op\">(</span><span class=\"fl\">5</span><span class=\"op\">:</span><span class=\"fl\">7</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>`brk_left()` was deprecated in santoku 0.4.0.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> Please use the `left` argument to `chop()` instead.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #555555;\">This warning is displayed once every 8 hours.</span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #555555;\">Call `lifecycle::last_warnings()` to see where this warning was generated.</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [5, 6) [6, 7) {7}   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [5, 6) [6, 7) {7}</span>\n<span class=\"r-in\"></span>\n<span class=\"r-in\"><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">5</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\">brk_right</span><span class=\"op\">(</span><span class=\"fl\">5</span><span class=\"op\">:</span><span class=\"fl\">7</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>`brk_right()` was deprecated in santoku 0.4.0.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> Please use the `left` argument to `chop()` instead.</span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #555555;\">This warning is displayed once every 8 hours.</span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span style=\"color: #555555;\">Call `lifecycle::last_warnings()` to see where this warning was generated.</span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>`left` argument to `brk_right()` ignored</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] {5}    (5, 6] (6, 7]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: {5} (5, 6] (6, 7]</span>\n<span class=\"r-in\"></span>\n<span class=\"r-in\"><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">5</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\">brk_left</span><span class=\"op\">(</span><span class=\"fl\">5</span><span class=\"op\">:</span><span class=\"fl\">7</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [5, 6) [6, 7) {7}   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [5, 6) [6, 7) {7}</span>\n<span class=\"r-in\"></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.2.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/brk-left-right.md",
    "content": "# Left- or right-closed breaks\n\n**\\[questioning\\]**\n\n## Usage\n\n``` r\nbrk_left(breaks)\n\nbrk_right(breaks)\n```\n\n## Arguments\n\n- breaks:\n\n  A numeric vector.\n\n## Value\n\nA (function which returns an) object of class `breaks`.\n\n## Details\n\nThese functions are in the \"questioning\" stage because they clash with\nthe `left` argument to\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md) and\nfriends.\n\nThese functions override the `left` argument of\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n\n## Examples\n\n``` r\nchop(5:7, brk_left(5:7))\n#> Warning: `brk_left()` was deprecated in santoku 0.4.0.\n#> Please use the `left` argument to `chop()` instead.\n#> This warning is displayed once every 8 hours.\n#> Call `lifecycle::last_warnings()` to see where this warning was generated.\n#> [1] [5, 6) [6, 7) {7}   \n#> Levels: [5, 6) [6, 7) {7}\n\nchop(5:7, brk_right(5:7))\n#> Warning: `brk_right()` was deprecated in santoku 0.4.0.\n#> Please use the `left` argument to `chop()` instead.\n#> This warning is displayed once every 8 hours.\n#> Call `lifecycle::last_warnings()` to see where this warning was generated.\n#> Warning: `left` argument to `brk_right()` ignored\n#> [1] {5}    (5, 6] (6, 7]\n#> Levels: {5} (5, 6] (6, 7]\n\nchop(5:7, brk_left(5:7))\n#> [1] [5, 6) [6, 7) {7}   \n#> Levels: [5, 6) [6, 7) {7}\n```\n"
  },
  {
    "path": "docs/reference/brk_default.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Create a standard set of breaks — brk_default • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Create a standard set of breaks — brk_default\"><meta name=\"description\" content=\"Create a standard set of breaks\"><meta property=\"og:description\" content=\"Create a standard set of breaks\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Create a standard set of breaks</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks.R\" class=\"external-link\"><code>R/breaks.R</code></a></small>\n      <div class=\"d-none name\"><code>brk_default.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Create a standard set of breaks</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">brk_default</span><span class=\"op\">(</span><span class=\"va\">breaks</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-breaks\">breaks<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-breaks\"></a></dt>\n<dd><p>A numeric vector.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A function which returns an object of class <code>breaks</code>.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  [5, 8)  [5, 8)  [5, 8)  [8, 10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2) [2, 5) [5, 8) [8, 10]</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\">brk_default</span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  [5, 8)  [5, 8)  [5, 8)  [8, 10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2) [2, 5) [5, 8) [8, 10]</span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/brk_default.md",
    "content": "# Create a standard set of breaks\n\nCreate a standard set of breaks\n\n## Usage\n\n``` r\nbrk_default(breaks)\n```\n\n## Arguments\n\n- breaks:\n\n  A numeric vector.\n\n## Value\n\nA function which returns an object of class `breaks`.\n\n## Examples\n\n``` r\n\nchop(1:10, c(2, 5, 8))\n#>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  [5, 8)  [5, 8)  [5, 8)  [8, 10] [8, 10]\n#> [10] [8, 10]\n#> Levels: [1, 2) [2, 5) [5, 8) [8, 10]\nchop(1:10, brk_default(c(2, 5, 8)))\n#>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  [5, 8)  [5, 8)  [5, 8)  [8, 10] [8, 10]\n#> [10] [8, 10]\n#> Levels: [1, 2) [2, 5) [5, 8) [8, 10]\n```\n"
  },
  {
    "path": "docs/reference/brk_equally.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_equally.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_equally.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/brk_evenly.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_evenly.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_evenly.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/brk_fn.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_fn.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_fn.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/brk_manual.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Create a breaks object manually — brk_manual • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Create a breaks object manually — brk_manual\"><meta name=\"description\" content=\"Create a breaks object manually\"><meta property=\"og:description\" content=\"Create a breaks object manually\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Create a <code>breaks</code> object manually</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks-misc.R\" class=\"external-link\"><code>R/breaks-misc.R</code></a></small>\n      <div class=\"d-none name\"><code>brk_manual.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Create a <code>breaks</code> object manually</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">brk_manual</span><span class=\"op\">(</span><span class=\"va\">breaks</span>, <span class=\"va\">left_vec</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-breaks\">breaks<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-breaks\"></a></dt>\n<dd><p>A vector, which must be sorted.</p></dd>\n\n\n<dt id=\"arg-left-vec\">left_vec<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-left-vec\"></a></dt>\n<dd><p>A logical vector, the same length as <code>breaks</code>.\nSpecifies whether each break is left-closed or right-closed.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A function which returns an object of class <code>breaks</code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>All breaks must be closed on exactly one side, like <code>..., x) [x, ...</code>\n(left-closed) or <code>..., x) [x, ...</code> (right-closed).</p>\n<p>For example, if <code>breaks = 1:3</code> and <code>left = c(TRUE, FALSE, TRUE)</code>, then the\nresulting intervals are</p><div class=\"sourceCode\"><pre><code>\nT        F       T\n[ 1,  2 ] ( 2, 3 )\n</code></pre></div>\n\n<p>Singleton breaks are created by repeating a number in <code>breaks</code>. Singletons\nmust be closed on both sides, so if there is a repeated number\nat indices <code>i</code>, <code>i+1</code>, <code>left[i]</code> <em>must</em> be <code>TRUE</code> and <code>left[i+1]</code> must be\n<code>FALSE</code>.</p>\n<p><code>brk_manual()</code> ignores <code>left</code> and <code>close_end</code> arguments passed in\nfrom <code><a href=\"chop.html\">chop()</a></code>, since <code>left_vec</code> sets these manually.\n<code>extend</code> and <code>drop</code> arguments are respected as usual.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"va\">lbrks</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">brk_manual</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"cn\">TRUE</span>, <span class=\"fl\">3</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span>, <span class=\"va\">lbrks</span>, extend <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [1, 2) [2, 3) &lt;NA&gt;  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2) [2, 3)</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">rbrks</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">brk_manual</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"cn\">FALSE</span>, <span class=\"fl\">3</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span>, <span class=\"va\">rbrks</span>, extend <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] &lt;NA&gt;   (1, 2] (2, 3]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: (1, 2] (2, 3]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">brks_singleton</span> <span class=\"op\">&lt;-</span> <span class=\"fu\">brk_manual</span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>      <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>,    <span class=\"fl\">2</span>,    <span class=\"fl\">2</span>,     <span class=\"fl\">3</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>      <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"cn\">TRUE</span>, <span class=\"cn\">TRUE</span>, <span class=\"cn\">FALSE</span>, <span class=\"cn\">TRUE</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span>, <span class=\"va\">brks_singleton</span>, extend <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [1, 2) {2}    &lt;NA&gt;  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2) {2}</span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/brk_manual.md",
    "content": "# Create a `breaks` object manually\n\nCreate a `breaks` object manually\n\n## Usage\n\n``` r\nbrk_manual(breaks, left_vec)\n```\n\n## Arguments\n\n- breaks:\n\n  A vector, which must be sorted.\n\n- left_vec:\n\n  A logical vector, the same length as `breaks`. Specifies whether each\n  break is left-closed or right-closed.\n\n## Value\n\nA function which returns an object of class `breaks`.\n\n## Details\n\nAll breaks must be closed on exactly one side, like `..., x) [x, ...`\n(left-closed) or `..., x) [x, ...` (right-closed).\n\nFor example, if `breaks = 1:3` and `left = c(TRUE, FALSE, TRUE)`, then\nthe resulting intervals are\n\n\n    T        F       T\n    [ 1,  2 ] ( 2, 3 )\n\nSingleton breaks are created by repeating a number in `breaks`.\nSingletons must be closed on both sides, so if there is a repeated\nnumber at indices `i`, `i+1`, `left[i]` *must* be `TRUE` and `left[i+1]`\nmust be `FALSE`.\n\n`brk_manual()` ignores `left` and `close_end` arguments passed in from\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md),\nsince `left_vec` sets these manually. `extend` and `drop` arguments are\nrespected as usual.\n\n## Examples\n\n``` r\nlbrks <- brk_manual(1:3, rep(TRUE, 3))\nchop(1:3, lbrks, extend = FALSE)\n#> [1] [1, 2) [2, 3) <NA>  \n#> Levels: [1, 2) [2, 3)\n\nrbrks <- brk_manual(1:3, rep(FALSE, 3))\nchop(1:3, rbrks, extend = FALSE)\n#> [1] <NA>   (1, 2] (2, 3]\n#> Levels: (1, 2] (2, 3]\n\nbrks_singleton <- brk_manual(\n      c(1,    2,    2,     3),\n      c(TRUE, TRUE, FALSE, TRUE))\n\nchop(1:3, brks_singleton, extend = FALSE)\n#> [1] [1, 2) {2}    <NA>  \n#> Levels: [1, 2) {2}\n```\n"
  },
  {
    "path": "docs/reference/brk_mean_sd.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_mean_sd.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_mean_sd.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/brk_n.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_n.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_n.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/brk_pretty.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_pretty.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_pretty.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/brk_proportions.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_proportions.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_proportions.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/brk_quantiles.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_quantiles.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_quantiles.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/brk_spikes.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_spikes.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_spikes.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/brk_width-for-datetime.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Equal-width intervals for dates or datetimes — brk_width-for-datetime • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Equal-width intervals for dates or datetimes — brk_width-for-datetime\"><meta name=\"description\" content=\"brk_width() can be used with time interval classes from base R or the\nlubridate package.\"><meta property=\"og:description\" content=\"brk_width() can be used with time interval classes from base R or the\nlubridate package.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Equal-width intervals for dates or datetimes</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks-by-width.R\" class=\"external-link\"><code>R/breaks-by-width.R</code></a></small>\n      <div class=\"d-none name\"><code>brk_width-for-datetime.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code><a href=\"chop_width.html\">brk_width()</a></code> can be used with time interval classes from base R or the\n<code>lubridate</code> package.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># S3 method for class 'Duration'</span></span>\n<span><span class=\"fu\"><a href=\"chop_width.html\">brk_width</a></span><span class=\"op\">(</span><span class=\"va\">width</span>, <span class=\"va\">start</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-width\">width<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-width\"></a></dt>\n<dd><p>A scalar <a href=\"https://rdrr.io/r/base/difftime.html\" class=\"external-link\">difftime</a>, <a href=\"https://lubridate.tidyverse.org/reference/Period-class.html\" class=\"external-link\">Period</a> or\n<a href=\"https://lubridate.tidyverse.org/reference/Duration-class.html\" class=\"external-link\">Duration</a> object.</p></dd>\n\n\n<dt id=\"arg-start\">start<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-start\"></a></dt>\n<dd><p>A scalar of class <a href=\"https://rdrr.io/r/base/Dates.html\" class=\"external-link\">Date</a> or <a href=\"https://rdrr.io/r/base/DateTimeClasses.html\" class=\"external-link\">POSIXct</a>.\nCan be omitted.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>If <code>width</code> is a Period, <code><a href=\"https://lubridate.tidyverse.org/reference/mplus.html\" class=\"external-link\">lubridate::add_with_rollback()</a></code>\nis used to calculate the widths. This can be useful for e.g. calendar months.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\">if</span> <span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/ns-load.html\" class=\"external-link\">requireNamespace</a></span><span class=\"op\">(</span><span class=\"st\">\"lubridate\"</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"va\">year2001</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.Date.html\" class=\"external-link\">as.Date</a></span><span class=\"op\">(</span><span class=\"st\">\"2001-01-01\"</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fl\">0</span><span class=\"op\">:</span><span class=\"fl\">364</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"chop_width.html\">tab_width</a></span><span class=\"op\">(</span><span class=\"va\">year2001</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/weekday.POSIXt.html\" class=\"external-link\">months</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>        labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"lbl_discrete.html\">lbl_discrete</a></span><span class=\"op\">(</span><span class=\"st\">\" to \"</span>, fmt <span class=\"op\">=</span> <span class=\"st\">\"%e %b %y\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  1 Jan 01 to 31 Jan 01  1 Feb 01 to 28 Feb 01  1 Mar 01 to 31 Mar 01 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                     31                     28                     31 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  1 Apr 01 to 30 Apr 01  1 May 01 to 31 May 01  1 Jun 01 to 30 Jun 01 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                     30                     31                     30 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  1 Jul 01 to 31 Jul 01  1 Aug 01 to 31 Aug 01  1 Sep 01 to 30 Sep 01 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                     31                     31                     30 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  1 Oct 01 to 31 Oct 01  1 Nov 01 to 30 Nov 01  1 Dec 01 to 31 Dec 01 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                     31                     30                     31 </span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/brk_width-for-datetime.md",
    "content": "# Equal-width intervals for dates or datetimes\n\n[`brk_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md)\ncan be used with time interval classes from base R or the `lubridate`\npackage.\n\n## Usage\n\n``` r\n# S3 method for class 'Duration'\nbrk_width(width, start)\n```\n\n## Arguments\n\n- width:\n\n  A scalar [difftime](https://rdrr.io/r/base/difftime.html),\n  [Period](https://lubridate.tidyverse.org/reference/Period-class.html)\n  or\n  [Duration](https://lubridate.tidyverse.org/reference/Duration-class.html)\n  object.\n\n- start:\n\n  A scalar of class [Date](https://rdrr.io/r/base/Dates.html) or\n  [POSIXct](https://rdrr.io/r/base/DateTimeClasses.html). Can be\n  omitted.\n\n## Details\n\nIf `width` is a Period,\n[`lubridate::add_with_rollback()`](https://lubridate.tidyverse.org/reference/mplus.html)\nis used to calculate the widths. This can be useful for e.g. calendar\nmonths.\n\n## Examples\n\n``` r\n\nif (requireNamespace(\"lubridate\")) {\n  year2001 <- as.Date(\"2001-01-01\") + 0:364\n  tab_width(year2001, months(1),\n        labels = lbl_discrete(\" to \", fmt = \"%e %b %y\"))\n}\n#>  1 Jan 01 to 31 Jan 01  1 Feb 01 to 28 Feb 01  1 Mar 01 to 31 Mar 01 \n#>                     31                     28                     31 \n#>  1 Apr 01 to 30 Apr 01  1 May 01 to 31 May 01  1 Jun 01 to 30 Jun 01 \n#>                     30                     31                     30 \n#>  1 Jul 01 to 31 Jul 01  1 Aug 01 to 31 Aug 01  1 Sep 01 to 30 Sep 01 \n#>                     31                     31                     30 \n#>  1 Oct 01 to 31 Oct 01  1 Nov 01 to 30 Nov 01  1 Dec 01 to 31 Dec 01 \n#>                     31                     30                     31 \n```\n"
  },
  {
    "path": "docs/reference/brk_width.Duration.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/brk_width-for-datetime.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/brk_width-for-datetime.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/brk_width.default.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_width.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_width.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/brk_width.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_width.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_width.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/chop.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Cut data into intervals — chop • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Cut data into intervals — chop\"><meta name=\"description\" content=\"chop() cuts x into intervals. It returns a factor of\nthe same length as x, representing which interval contains each element of x.\nkiru() is an alias for chop.\ntab() calls chop() and returns a contingency table from\nthe result.\"><meta property=\"og:description\" content=\"chop() cuts x into intervals. It returns a factor of\nthe same length as x, representing which interval contains each element of x.\nkiru() is an alias for chop.\ntab() calls chop() and returns a contingency table from\nthe result.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Cut data into intervals</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/chop.R\" class=\"external-link\"><code>R/chop.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/tab.R\" class=\"external-link\"><code>R/tab.R</code></a></small>\n      <div class=\"d-none name\"><code>chop.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>chop()</code> cuts <code>x</code> into intervals. It returns a <code><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></code> of\nthe same length as <code>x</code>, representing which interval contains each element of <code>x</code>.\n<code>kiru()</code> is an alias for <code>chop</code>.\n<code>tab()</code> calls <code>chop()</code> and returns a contingency <code><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></code> from\nthe result.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">chop</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  <span class=\"va\">breaks</span>,</span>\n<span>  labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"lbl_intervals.html\">lbl_intervals</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  extend <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  left <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  close_end <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  raw <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  drop <span class=\"op\">=</span> <span class=\"cn\">TRUE</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">kiru</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  <span class=\"va\">breaks</span>,</span>\n<span>  labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"lbl_intervals.html\">lbl_intervals</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  extend <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  left <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  close_end <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  raw <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  drop <span class=\"op\">=</span> <span class=\"cn\">TRUE</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">tab</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  <span class=\"va\">breaks</span>,</span>\n<span>  labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"lbl_intervals.html\">lbl_intervals</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  extend <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  left <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  close_end <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  raw <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  drop <span class=\"op\">=</span> <span class=\"cn\">TRUE</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A vector.</p></dd>\n\n\n<dt id=\"arg-breaks\">breaks<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-breaks\"></a></dt>\n<dd><p>A numeric vector of cut-points, or a function to create\ncut-points from <code>x</code>.</p></dd>\n\n\n<dt id=\"arg-labels\">labels<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-labels\"></a></dt>\n<dd><p>A character vector of labels or a function to create labels.</p></dd>\n\n\n<dt id=\"arg-extend\">extend<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-extend\"></a></dt>\n<dd><p>Logical. If <code>TRUE</code>, always extend breaks to <code>+/-Inf</code>. If <code>NULL</code>,\nextend breaks to <code>min(x)</code> and/or <code>max(x)</code> only if necessary. If <code>FALSE</code>, never\nextend.</p></dd>\n\n\n<dt id=\"arg-left\">left<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-left\"></a></dt>\n<dd><p>Logical. Left-closed or right-closed breaks?</p></dd>\n\n\n<dt id=\"arg-close-end\">close_end<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-close-end\"></a></dt>\n<dd><p>Logical. Close last break at right? (If <code>left</code> is <code>FALSE</code>,\nclose first break at left?)</p></dd>\n\n\n<dt id=\"arg-raw\">raw<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-raw\"></a></dt>\n<dd><p>Logical. Use raw values in labels?</p></dd>\n\n\n<dt id=\"arg-drop\">drop<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-drop\"></a></dt>\n<dd><p>Logical. Drop unused levels from the result?</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>chop()</code> returns a <code><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></code> of the same length as <code>x</code>,\nrepresenting the intervals containing the value of <code>x</code>.</p>\n<p><code>tab()</code> returns a contingency <code><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p><code>x</code> may be a numeric vector, or more generally, any vector which can be\ncompared with <code>&lt;</code> and <code>==</code> (see <a href=\"https://rdrr.io/r/base/groupGeneric.html\" class=\"external-link\">Ops</a>). In particular\n<a href=\"https://rdrr.io/r/base/Dates.html\" class=\"external-link\">Date</a> and <a href=\"https://rdrr.io/r/base/DateTimeClasses.html\" class=\"external-link\">date-time</a> objects are supported.\nCharacter vectors are supported with a warning.</p><div class=\"section\">\n<h3 id=\"breaks\">Breaks<a class=\"anchor\" aria-label=\"anchor\" href=\"#breaks\"></a></h3>\n\n\n<p><code>breaks</code> may be a vector or a function.</p>\n<p>If it is a vector, <code>breaks</code> gives the interval endpoints. Repeating a value\ncreates a \"singleton\" interval, which contains only that value.\nFor example <code>breaks = c(1, 3, 3, 5)</code> creates 3 intervals:\n<code>[1, 3)</code>, <code>{3}</code> and <code>(3, 5]</code>.</p>\n<p>If <code>breaks</code> is a function, it is called with the <code>x</code>, <code>extend</code>, <code>left</code> and\n<code>close_end</code> arguments, and should return an object of class <code>breaks</code>.\nUse <code>brk_*</code> functions to create a variety of data-dependent breaks.</p>\n<p>Names of <code>breaks</code> may be used for labels. See \"Labels\" below.</p>\n</div>\n\n<div class=\"section\">\n<h3 id=\"options-for-breaks\">Options for breaks<a class=\"anchor\" aria-label=\"anchor\" href=\"#options-for-breaks\"></a></h3>\n\n\n<p>By default, left-closed intervals are created. If <code>left</code> is <code>FALSE</code>,\nright-closed intervals are created.</p>\n<p>If <code>close_end</code> is <code>TRUE</code> the final break (or first break if <code>left</code> is <code>FALSE</code>)\nwill be closed at both ends. This guarantees that all values <code>x</code> with\n<code>min(breaks) &lt;= x &lt;= max(breaks)</code> are included in the intervals.</p>\n<p>Before version 0.9.0, <code>close_end</code> was <code>FALSE</code> by default, and also behaved\ndifferently with respect to extended breaks: see \"Extending intervals\" below.</p>\n<p>Using <a href=\"lbl_intervals.html\">mathematical set notation</a>:</p><ul><li><p>If <code>left</code> is <code>TRUE</code> and <code>close_end</code> is <code>TRUE</code>, breaks will look like\n<code>[b1, b2), [b2, b3) ... [b_(n-1), b_n]</code>.</p></li>\n<li><p>If <code>left</code> is <code>FALSE</code> and <code>close_end</code> is <code>TRUE</code>, breaks will look like\n<code>[b1, b2], (b2, b3] ... (b_(n-1), b_n]</code>.</p></li>\n<li><p>If <code>left</code> is <code>TRUE</code> and <code>close_end</code> is <code>FALSE</code>, all breaks will look like\n<code>... [b1, b2) ...</code>.</p></li>\n<li><p>If <code>left</code> is <code>FALSE</code> and <code>close_end</code> is <code>FALSE</code>, all breaks will look like\n<code>... (b1, b2] ...</code>.</p></li>\n</ul></div>\n\n<div class=\"section\">\n<h3 id=\"extending-intervals\">Extending intervals<a class=\"anchor\" aria-label=\"anchor\" href=\"#extending-intervals\"></a></h3>\n\n\n<p>If <code>extend</code> is <code>TRUE</code>, intervals will be extended to <code>[-Inf,\nmin(breaks))</code> and <code>(max(breaks), Inf]</code>.</p>\n<p>If <code>extend</code> is <code>NULL</code> (the default), intervals will be extended to\n<code>[min(x), min(breaks))</code> and <code>(max(breaks), max(x)]</code>, only if\nnecessary, i.e. only if elements of <code>x</code> would be outside the unextended\nbreaks.</p>\n<p>If <code>extend</code> is <code>FALSE</code>, intervals are never extended.</p>\n<p>Note that even when <code>extend = TRUE</code>, extended intervals will be\ndropped from the factor levels if they contain no elements and <code>drop = TRUE</code>.</p>\n<p><code>close_end</code> is only relevant if intervals are not extended;\nextended intervals are always closed on the outside. This is a change from\nprevious behaviour. Up to version 0.8.0, <code>close_end</code> was applied to the\nlast user-specified interval, before any extended intervals were created.</p>\n<p>Since 1.1.0, infinity is represented as \\(\\infty\\)\nin breaks on unicode platforms. Set  <code>options(santoku.infinity = \"Inf\")</code>\nto get the old behaviour.</p>\n</div>\n\n<div class=\"section\">\n<h3 id=\"labels\">Labels<a class=\"anchor\" aria-label=\"anchor\" href=\"#labels\"></a></h3>\n\n\n<p><code>labels</code> may be a character vector. It should have the same length as the\n(possibly extended) number of intervals. Alternatively, <code>labels</code> may be a\n<code>lbl_*</code> function such as <code><a href=\"lbl_dash.html\">lbl_dash()</a></code>.</p>\n<p>If <code>breaks</code> is a named vector, then names of <code>breaks</code> will be\nused as labels for the interval starting at the corresponding element. This\noverrides the <code>labels</code> argument (but unnamed breaks will still use <code>labels</code>).\nThis feature is <a href=\"https://lifecycle.r-lib.org/articles/stages.html#experimental\" class=\"external-link\"><img src=\"figures/lifecycle-experimental.svg\" alt=\"[Experimental]\"></a>.</p>\n<p>If <code>labels</code> is <code>NULL</code>, then integer codes will be returned instead of a\nfactor.</p>\n<p>If <code>raw</code> is <code>TRUE</code>, labels will show the actual interval endpoints, usually\nnumbers. If <code>raw</code> is <code>FALSE</code> then labels may show other objects, such\nas quantiles for <code><a href=\"chop_quantiles.html\">chop_quantiles()</a></code> and friends, proportions of the range for\n<code><a href=\"chop_proportions.html\">chop_proportions()</a></code>, or standard deviations for <code><a href=\"chop_mean_sd.html\">chop_mean_sd()</a></code>.</p>\n<p>If <code>raw</code> is <code>NULL</code> then <code>lbl_*</code> functions will use their default (usually\n<code>FALSE</code>). Otherwise, the <code>raw</code> argument to <code>chop()</code> overrides <code>raw</code> arguments\npassed into <code>lbl_*</code> functions directly.</p>\n</div>\n\n<div class=\"section\">\n<h3 id=\"miscellaneous\">Miscellaneous<a class=\"anchor\" aria-label=\"anchor\" href=\"#miscellaneous\"></a></h3>\n\n\n<p><code>NA</code> values in <code>x</code>, and values which are outside the extended endpoints,\nreturn <code>NA</code>.</p>\n<p><code>kiru()</code> is a synonym for <code>chop()</code>. If you load <code>{tidyr}</code>, you can use it to\navoid confusion with <code><a href=\"https://tidyr.tidyverse.org/reference/chop.html\" class=\"external-link\">tidyr::chop()</a></code>.</p>\n<p>Note that <code>chop()</code>, like all of R, uses binary arithmetic. Thus, numbers may\nnot be exactly equal to what you think they should be. There is an example\nbelow.</p>\n</div>\n\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"https://rdrr.io/r/base/cut.html\" class=\"external-link\">base::cut()</a></code>, <code><a href=\"non-standard-types.html\">non-standard-types</a></code> for chopping objects that\naren't numbers.</p>\n<p>Other chopping functions:\n<code><a href=\"chop_equally.html\">chop_equally()</a></code>,\n<code><a href=\"chop_evenly.html\">chop_evenly()</a></code>,\n<code><a href=\"chop_fn.html\">chop_fn()</a></code>,\n<code><a href=\"chop_mean_sd.html\">chop_mean_sd()</a></code>,\n<code><a href=\"chop_n.html\">chop_n()</a></code>,\n<code><a href=\"chop_proportions.html\">chop_proportions()</a></code>,\n<code><a href=\"chop_quantiles.html\">chop_quantiles()</a></code>,\n<code><a href=\"chop_spikes.html\">chop_spikes()</a></code>,\n<code><a href=\"chop_width.html\">chop_width()</a></code>,\n<code><a href=\"fillet.html\">fillet()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">4</span>, <span class=\"fl\">6</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [1, 2) [2, 4) [2, 4) [4, 6) [4, 6) [6, 7] [6, 7]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2) [2, 4) [4, 6) [6, 7]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">4</span>, <span class=\"fl\">6</span><span class=\"op\">)</span>, extend <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] &lt;NA&gt;   [2, 4) [2, 4) [4, 6] [4, 6] [4, 6] &lt;NA&gt;  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [2, 4) [4, 6]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Repeat a number for a singleton break:</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">4</span>, <span class=\"fl\">4</span>, <span class=\"fl\">6</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [1, 2) [2, 4) [2, 4) {4}    (4, 6) [6, 7] [6, 7]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2) [2, 4) {4} (4, 6) [6, 7]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">4</span>, <span class=\"fl\">6</span><span class=\"op\">)</span>, left <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [1, 2] [1, 2] (2, 4] (2, 4] (4, 6] (4, 6] (6, 7]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2] (2, 4] (4, 6] (6, 7]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">4</span>, <span class=\"fl\">6</span><span class=\"op\">)</span>, close_end <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [1, 2) [2, 4) [2, 4) [4, 6) [4, 6) [6, 7] [6, 7]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2) [2, 4) [4, 6) [6, 7]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\"><a href=\"chop_quantiles.html\">brk_quantiles</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.25</span>, <span class=\"fl\">0.75</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [0%, 25%)   [0%, 25%)   [25%, 75%)  [25%, 75%)  [25%, 75%)  [75%, 100%]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [7] [75%, 100%]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [0%, 25%) [25%, 75%) [75%, 100%]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># A single break is fine if `extend` is not `FALSE`:</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fl\">4</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [1, 4) [1, 4) [1, 4) [4, 7] [4, 7] [4, 7] [4, 7]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 4) [4, 7]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Floating point inaccuracy:</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop</span><span class=\"op\">(</span><span class=\"fl\">0.3</span><span class=\"op\">/</span><span class=\"fl\">3</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0</span>, <span class=\"fl\">0.1</span>, <span class=\"fl\">0.1</span>, <span class=\"fl\">1</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"&lt; 0.1\"</span>, <span class=\"st\">\"0.1\"</span>, <span class=\"st\">\"&gt; 0.1\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] &lt; 0.1</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: &lt; 0.1</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># -- Labels --</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span>Lowest <span class=\"op\">=</span> <span class=\"fl\">1</span>, Low <span class=\"op\">=</span> <span class=\"fl\">2</span>, Mid <span class=\"op\">=</span> <span class=\"fl\">4</span>, High <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] Lowest Low    Low    Mid    Mid    High   High  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: Lowest Low Mid High</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">4</span>, <span class=\"fl\">6</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"Lowest\"</span>, <span class=\"st\">\"Low\"</span>, <span class=\"st\">\"Mid\"</span>, <span class=\"st\">\"High\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] Lowest Low    Low    Mid    Mid    High   High  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: Lowest Low Mid High</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">4</span>, <span class=\"fl\">6</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"lbl_dash.html\">lbl_dash</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] 1—2 2—4 2—4 4—6 4—6 6—7 6—7</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: 1—2 2—4 4—6 6—7</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Mixing names and other labels:</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"&lt;2\"</span> <span class=\"op\">=</span> <span class=\"fl\">1</span>, <span class=\"fl\">2</span>, <span class=\"fl\">4</span>, <span class=\"st\">\"&gt;=6\"</span> <span class=\"op\">=</span> <span class=\"fl\">6</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"lbl_dash.html\">lbl_dash</a></span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] &lt;2  2—4 2—4 4—6 4—6 &gt;=6 &gt;=6</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: &lt;2 2—4 4—6 &gt;=6</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># -- Non-standard types --</span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop</span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.Date.html\" class=\"external-link\">as.Date</a></span><span class=\"op\">(</span><span class=\"st\">\"2001-01-01\"</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.Date.html\" class=\"external-link\">as.Date</a></span><span class=\"op\">(</span><span class=\"st\">\"2001-01-04\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [2001-01-02, 2001-01-04) [2001-01-02, 2001-01-04) [2001-01-04, 2001-01-08]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [4] [2001-01-04, 2001-01-08] [2001-01-04, 2001-01-08] [2001-01-04, 2001-01-08]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [7] [2001-01-04, 2001-01-08]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [2001-01-02, 2001-01-04) [2001-01-04, 2001-01-08]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/warning.html\" class=\"external-link\">suppressWarnings</a></span><span class=\"op\">(</span><span class=\"fu\">chop</span><span class=\"op\">(</span><span class=\"va\">LETTERS</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span><span class=\"op\">]</span>, <span class=\"st\">\"D\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [A, D) [A, D) [A, D) [D, G] [D, G] [D, G] [D, G]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [A, D) [D, G]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">tab</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1, 2)  [2, 5)  [5, 8) [8, 10] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       1       3       3       3 </span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/chop.md",
    "content": "# Cut data into intervals\n\n`chop()` cuts `x` into intervals. It returns a\n[`factor`](https://rdrr.io/r/base/factor.html) of the same length as\n`x`, representing which interval contains each element of `x`. `kiru()`\nis an alias for `chop`. `tab()` calls `chop()` and returns a contingency\n[`table`](https://rdrr.io/r/base/table.html) from the result.\n\n## Usage\n\n``` r\nchop(\n  x,\n  breaks,\n  labels = lbl_intervals(),\n  extend = NULL,\n  left = TRUE,\n  close_end = TRUE,\n  raw = NULL,\n  drop = TRUE\n)\n\nkiru(\n  x,\n  breaks,\n  labels = lbl_intervals(),\n  extend = NULL,\n  left = TRUE,\n  close_end = TRUE,\n  raw = NULL,\n  drop = TRUE\n)\n\ntab(\n  x,\n  breaks,\n  labels = lbl_intervals(),\n  extend = NULL,\n  left = TRUE,\n  close_end = TRUE,\n  raw = NULL,\n  drop = TRUE\n)\n```\n\n## Arguments\n\n- x:\n\n  A vector.\n\n- breaks:\n\n  A numeric vector of cut-points, or a function to create cut-points\n  from `x`.\n\n- labels:\n\n  A character vector of labels or a function to create labels.\n\n- extend:\n\n  Logical. If `TRUE`, always extend breaks to `+/-Inf`. If `NULL`,\n  extend breaks to `min(x)` and/or `max(x)` only if necessary. If\n  `FALSE`, never extend.\n\n- left:\n\n  Logical. Left-closed or right-closed breaks?\n\n- close_end:\n\n  Logical. Close last break at right? (If `left` is `FALSE`, close first\n  break at left?)\n\n- raw:\n\n  Logical. Use raw values in labels?\n\n- drop:\n\n  Logical. Drop unused levels from the result?\n\n## Value\n\n`chop()` returns a [`factor`](https://rdrr.io/r/base/factor.html) of the\nsame length as `x`, representing the intervals containing the value of\n`x`.\n\n`tab()` returns a contingency\n[`table`](https://rdrr.io/r/base/table.html).\n\n## Details\n\n`x` may be a numeric vector, or more generally, any vector which can be\ncompared with `<` and `==` (see\n[Ops](https://rdrr.io/r/base/groupGeneric.html)). In particular\n[Date](https://rdrr.io/r/base/Dates.html) and\n[date-time](https://rdrr.io/r/base/DateTimeClasses.html) objects are\nsupported. Character vectors are supported with a warning.\n\n### Breaks\n\n`breaks` may be a vector or a function.\n\nIf it is a vector, `breaks` gives the interval endpoints. Repeating a\nvalue creates a \"singleton\" interval, which contains only that value.\nFor example `breaks = c(1, 3, 3, 5)` creates 3 intervals: `[1, 3)`,\n`{3}` and `(3, 5]`.\n\nIf `breaks` is a function, it is called with the `x`, `extend`, `left`\nand `close_end` arguments, and should return an object of class\n`breaks`. Use `brk_*` functions to create a variety of data-dependent\nbreaks.\n\nNames of `breaks` may be used for labels. See \"Labels\" below.\n\n### Options for breaks\n\nBy default, left-closed intervals are created. If `left` is `FALSE`,\nright-closed intervals are created.\n\nIf `close_end` is `TRUE` the final break (or first break if `left` is\n`FALSE`) will be closed at both ends. This guarantees that all values\n`x` with `min(breaks) <= x <= max(breaks)` are included in the\nintervals.\n\nBefore version 0.9.0, `close_end` was `FALSE` by default, and also\nbehaved differently with respect to extended breaks: see \"Extending\nintervals\" below.\n\nUsing [mathematical set\nnotation](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md):\n\n- If `left` is `TRUE` and `close_end` is `TRUE`, breaks will look like\n  `[b1, b2), [b2, b3) ... [b_(n-1), b_n]`.\n\n- If `left` is `FALSE` and `close_end` is `TRUE`, breaks will look like\n  `[b1, b2], (b2, b3] ... (b_(n-1), b_n]`.\n\n- If `left` is `TRUE` and `close_end` is `FALSE`, all breaks will look\n  like `... [b1, b2) ...`.\n\n- If `left` is `FALSE` and `close_end` is `FALSE`, all breaks will look\n  like `... (b1, b2] ...`.\n\n### Extending intervals\n\nIf `extend` is `TRUE`, intervals will be extended to\n`[-Inf, min(breaks))` and `(max(breaks), Inf]`.\n\nIf `extend` is `NULL` (the default), intervals will be extended to\n`[min(x), min(breaks))` and `(max(breaks), max(x)]`, only if necessary,\ni.e. only if elements of `x` would be outside the unextended breaks.\n\nIf `extend` is `FALSE`, intervals are never extended.\n\nNote that even when `extend = TRUE`, extended intervals will be dropped\nfrom the factor levels if they contain no elements and `drop = TRUE`.\n\n`close_end` is only relevant if intervals are not extended; extended\nintervals are always closed on the outside. This is a change from\nprevious behaviour. Up to version 0.8.0, `close_end` was applied to the\nlast user-specified interval, before any extended intervals were\ncreated.\n\nSince 1.1.0, infinity is represented as \\\\\\infty\\\\ in breaks on unicode\nplatforms. Set `options(santoku.infinity = \"Inf\")` to get the old\nbehaviour.\n\n### Labels\n\n`labels` may be a character vector. It should have the same length as\nthe (possibly extended) number of intervals. Alternatively, `labels` may\nbe a `lbl_*` function such as\n[`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md).\n\nIf `breaks` is a named vector, then names of `breaks` will be used as\nlabels for the interval starting at the corresponding element. This\noverrides the `labels` argument (but unnamed breaks will still use\n`labels`). This feature is **\\[experimental\\]**.\n\nIf `labels` is `NULL`, then integer codes will be returned instead of a\nfactor.\n\nIf `raw` is `TRUE`, labels will show the actual interval endpoints,\nusually numbers. If `raw` is `FALSE` then labels may show other objects,\nsuch as quantiles for\n[`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\nand friends, proportions of the range for\n[`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md),\nor standard deviations for\n[`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md).\n\nIf `raw` is `NULL` then `lbl_*` functions will use their default\n(usually `FALSE`). Otherwise, the `raw` argument to `chop()` overrides\n`raw` arguments passed into `lbl_*` functions directly.\n\n### Miscellaneous\n\n`NA` values in `x`, and values which are outside the extended endpoints,\nreturn `NA`.\n\n`kiru()` is a synonym for `chop()`. If you load `{tidyr}`, you can use\nit to avoid confusion with\n[`tidyr::chop()`](https://tidyr.tidyverse.org/reference/chop.html).\n\nNote that `chop()`, like all of R, uses binary arithmetic. Thus, numbers\nmay not be exactly equal to what you think they should be. There is an\nexample below.\n\n## See also\n\n[`base::cut()`](https://rdrr.io/r/base/cut.html),\n[`non-standard-types`](https://hughjonesd.github.io/santoku/reference/non-standard-types.md)\nfor chopping objects that aren't numbers.\n\nOther chopping functions:\n[`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md),\n[`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md),\n[`chop_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md),\n[`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md),\n[`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md),\n[`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md),\n[`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md),\n[`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md),\n[`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md),\n[`fillet()`](https://hughjonesd.github.io/santoku/reference/fillet.md)\n\n## Examples\n\n``` r\n\nchop(1:7, c(2, 4, 6))\n#> [1] [1, 2) [2, 4) [2, 4) [4, 6) [4, 6) [6, 7] [6, 7]\n#> Levels: [1, 2) [2, 4) [4, 6) [6, 7]\n\nchop(1:7, c(2, 4, 6), extend = FALSE)\n#> [1] <NA>   [2, 4) [2, 4) [4, 6] [4, 6] [4, 6] <NA>  \n#> Levels: [2, 4) [4, 6]\n\n# Repeat a number for a singleton break:\nchop(1:7, c(2, 4, 4, 6))\n#> [1] [1, 2) [2, 4) [2, 4) {4}    (4, 6) [6, 7] [6, 7]\n#> Levels: [1, 2) [2, 4) {4} (4, 6) [6, 7]\n\nchop(1:7, c(2, 4, 6), left = FALSE)\n#> [1] [1, 2] [1, 2] (2, 4] (2, 4] (4, 6] (4, 6] (6, 7]\n#> Levels: [1, 2] (2, 4] (4, 6] (6, 7]\n\nchop(1:7, c(2, 4, 6), close_end = FALSE)\n#> [1] [1, 2) [2, 4) [2, 4) [4, 6) [4, 6) [6, 7] [6, 7]\n#> Levels: [1, 2) [2, 4) [4, 6) [6, 7]\n\nchop(1:7, brk_quantiles(c(0.25, 0.75)))\n#> [1] [0%, 25%)   [0%, 25%)   [25%, 75%)  [25%, 75%)  [25%, 75%)  [75%, 100%]\n#> [7] [75%, 100%]\n#> Levels: [0%, 25%) [25%, 75%) [75%, 100%]\n\n# A single break is fine if `extend` is not `FALSE`:\nchop(1:7, 4)\n#> [1] [1, 4) [1, 4) [1, 4) [4, 7] [4, 7] [4, 7] [4, 7]\n#> Levels: [1, 4) [4, 7]\n\n# Floating point inaccuracy:\nchop(0.3/3, c(0, 0.1, 0.1, 1), labels = c(\"< 0.1\", \"0.1\", \"> 0.1\"))\n#> [1] < 0.1\n#> Levels: < 0.1\n\n# -- Labels --\n\nchop(1:7, c(Lowest = 1, Low = 2, Mid = 4, High = 6))\n#> [1] Lowest Low    Low    Mid    Mid    High   High  \n#> Levels: Lowest Low Mid High\n\nchop(1:7, c(2, 4, 6), labels = c(\"Lowest\", \"Low\", \"Mid\", \"High\"))\n#> [1] Lowest Low    Low    Mid    Mid    High   High  \n#> Levels: Lowest Low Mid High\n\nchop(1:7, c(2, 4, 6), labels = lbl_dash())\n#> [1] 1—2 2—4 2—4 4—6 4—6 6—7 6—7\n#> Levels: 1—2 2—4 4—6 6—7\n\n# Mixing names and other labels:\nchop(1:7, c(\"<2\" = 1, 2, 4, \">=6\" = 6), labels = lbl_dash())\n#> [1] <2  2—4 2—4 4—6 4—6 >=6 >=6\n#> Levels: <2 2—4 4—6 >=6\n\n# -- Non-standard types --\n\nchop(as.Date(\"2001-01-01\") + 1:7, as.Date(\"2001-01-04\"))\n#> [1] [2001-01-02, 2001-01-04) [2001-01-02, 2001-01-04) [2001-01-04, 2001-01-08]\n#> [4] [2001-01-04, 2001-01-08] [2001-01-04, 2001-01-08] [2001-01-04, 2001-01-08]\n#> [7] [2001-01-04, 2001-01-08]\n#> Levels: [2001-01-02, 2001-01-04) [2001-01-04, 2001-01-08]\n\nsuppressWarnings(chop(LETTERS[1:7], \"D\"))\n#> [1] [A, D) [A, D) [A, D) [D, G] [D, G] [D, G] [D, G]\n#> Levels: [A, D) [D, G]\n\n\ntab(1:10, c(2, 5, 8))\n#>  [1, 2)  [2, 5)  [5, 8) [8, 10] \n#>       1       3       3       3 \n```\n"
  },
  {
    "path": "docs/reference/chop_deciles.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_quantiles.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_quantiles.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/chop_equally.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Chop equal-sized groups — chop_equally • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Chop equal-sized groups — chop_equally\"><meta name=\"description\" content=\"chop_equally() chops x into groups with an equal number of elements.\"><meta property=\"og:description\" content=\"chop_equally() chops x into groups with an equal number of elements.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Chop equal-sized groups</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/chop-by-group-size.R\" class=\"external-link\"><code>R/chop-by-group-size.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks-by-group-size.R\" class=\"external-link\"><code>R/breaks-by-group-size.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/tab.R\" class=\"external-link\"><code>R/tab.R</code></a></small>\n      <div class=\"d-none name\"><code>chop_equally.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>chop_equally()</code> chops <code>x</code> into groups with an equal number of elements.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">chop_equally</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  <span class=\"va\">groups</span>,</span>\n<span>  <span class=\"va\">...</span>,</span>\n<span>  labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"lbl_intervals.html\">lbl_intervals</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  left <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">is.numeric</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span>,</span>\n<span>  raw <span class=\"op\">=</span> <span class=\"cn\">TRUE</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">brk_equally</span><span class=\"op\">(</span><span class=\"va\">groups</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">tab_equally</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">groups</span>, <span class=\"va\">...</span>, left <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">is.numeric</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span>, raw <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A vector.</p></dd>\n\n\n<dt id=\"arg-groups\">groups<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-groups\"></a></dt>\n<dd><p>Number of groups.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Passed to <code><a href=\"chop.html\">chop()</a></code>.</p></dd>\n\n\n<dt id=\"arg-labels\">labels<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-labels\"></a></dt>\n<dd><p>A character vector of labels or a function to create labels.</p></dd>\n\n\n<dt id=\"arg-left\">left<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-left\"></a></dt>\n<dd><p>Logical. Left-closed or right-closed breaks?</p></dd>\n\n\n<dt id=\"arg-raw\">raw<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-raw\"></a></dt>\n<dd><p>Logical. Use raw values in labels?</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>chop_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></code> of the same length as <code>x</code>.</p>\n<p><code>brk_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/function.html\" class=\"external-link\">function</a></code> to create <code>breaks</code>.</p>\n<p><code>tab_*</code> functions return a contingency <code><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p><code>chop_equally()</code> uses <code><a href=\"chop_quantiles.html\">brk_quantiles()</a></code> under the hood. If <code>x</code> has duplicate\nelements, you may get fewer <code>groups</code> than requested. If so, a warning will\nbe emitted. See the examples.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other chopping functions:\n<code><a href=\"chop.html\">chop()</a></code>,\n<code><a href=\"chop_evenly.html\">chop_evenly()</a></code>,\n<code><a href=\"chop_fn.html\">chop_fn()</a></code>,\n<code><a href=\"chop_mean_sd.html\">chop_mean_sd()</a></code>,\n<code><a href=\"chop_n.html\">chop_n()</a></code>,\n<code><a href=\"chop_proportions.html\">chop_proportions()</a></code>,\n<code><a href=\"chop_quantiles.html\">chop_quantiles()</a></code>,\n<code><a href=\"chop_spikes.html\">chop_spikes()</a></code>,\n<code><a href=\"chop_width.html\">chop_width()</a></code>,\n<code><a href=\"fillet.html\">fillet()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\">chop_equally</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fl\">5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [1, 2.8)   [1, 2.8)   [2.8, 4.6) [2.8, 4.6) [4.6, 6.4) [4.6, 6.4)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [7] [6.4, 8.2) [6.4, 8.2) [8.2, 10]  [8.2, 10] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2.8) [2.8, 4.6) [4.6, 6.4) [6.4, 8.2) [8.2, 10]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># You can't always guarantee equal-sized groups:</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">dupes</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">1</span>, <span class=\"fl\">1</span>, <span class=\"fl\">2</span>, <span class=\"fl\">3</span>, <span class=\"fl\">4</span>, <span class=\"fl\">4</span>, <span class=\"fl\">4</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/quantile.html\" class=\"external-link\">quantile</a></span><span class=\"op\">(</span><span class=\"va\">dupes</span>, <span class=\"fl\">0</span><span class=\"op\">:</span><span class=\"fl\">4</span><span class=\"op\">/</span><span class=\"fl\">4</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   0%  25%  50%  75% 100% </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  1.0  1.0  2.5  4.0  4.0 </span>\n<span class=\"r-in\"><span><span class=\"fu\">chop_equally</span><span class=\"op\">(</span><span class=\"va\">dupes</span>, <span class=\"fl\">4</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>`x` has duplicate quantiles: break labels may be misleading</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] {1}      {1}      {1}      (1, 2.5) [2.5, 4) {4}      {4}      {4}     </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: {1} (1, 2.5) [2.5, 4) {4}</span>\n<span class=\"r-in\"><span><span class=\"co\"># Or as many groups as you ask for:</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop_equally</span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">1</span>, <span class=\"fl\">2</span>, <span class=\"fl\">2</span><span class=\"op\">)</span>, <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>`x` has duplicate quantiles: break labels may be misleading</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] {1} {1} {2} {2}</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: {1} {2}</span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/chop_equally.md",
    "content": "# Chop equal-sized groups\n\n`chop_equally()` chops `x` into groups with an equal number of elements.\n\n## Usage\n\n``` r\nchop_equally(\n  x,\n  groups,\n  ...,\n  labels = lbl_intervals(),\n  left = is.numeric(x),\n  raw = TRUE\n)\n\nbrk_equally(groups)\n\ntab_equally(x, groups, ..., left = is.numeric(x), raw = TRUE)\n```\n\n## Arguments\n\n- x:\n\n  A vector.\n\n- groups:\n\n  Number of groups.\n\n- ...:\n\n  Passed to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n\n- labels:\n\n  A character vector of labels or a function to create labels.\n\n- left:\n\n  Logical. Left-closed or right-closed breaks?\n\n- raw:\n\n  Logical. Use raw values in labels?\n\n## Value\n\n`chop_*` functions return a\n[`factor`](https://rdrr.io/r/base/factor.html) of the same length as\n`x`.\n\n`brk_*` functions return a\n[`function`](https://rdrr.io/r/base/function.html) to create `breaks`.\n\n`tab_*` functions return a contingency\n[`table`](https://rdrr.io/r/base/table.html).\n\n## Details\n\n`chop_equally()` uses\n[`brk_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\nunder the hood. If `x` has duplicate elements, you may get fewer\n`groups` than requested. If so, a warning will be emitted. See the\nexamples.\n\n## See also\n\nOther chopping functions:\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md),\n[`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md),\n[`chop_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md),\n[`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md),\n[`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md),\n[`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md),\n[`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md),\n[`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md),\n[`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md),\n[`fillet()`](https://hughjonesd.github.io/santoku/reference/fillet.md)\n\n## Examples\n\n``` r\nchop_equally(1:10, 5)\n#>  [1] [1, 2.8)   [1, 2.8)   [2.8, 4.6) [2.8, 4.6) [4.6, 6.4) [4.6, 6.4)\n#>  [7] [6.4, 8.2) [6.4, 8.2) [8.2, 10]  [8.2, 10] \n#> Levels: [1, 2.8) [2.8, 4.6) [4.6, 6.4) [6.4, 8.2) [8.2, 10]\n\n# You can't always guarantee equal-sized groups:\ndupes <- c(1, 1, 1, 2, 3, 4, 4, 4)\nquantile(dupes, 0:4/4)\n#>   0%  25%  50%  75% 100% \n#>  1.0  1.0  2.5  4.0  4.0 \nchop_equally(dupes, 4)\n#> Warning: `x` has duplicate quantiles: break labels may be misleading\n#> [1] {1}      {1}      {1}      (1, 2.5) [2.5, 4) {4}      {4}      {4}     \n#> Levels: {1} (1, 2.5) [2.5, 4) {4}\n# Or as many groups as you ask for:\nchop_equally(c(1, 1, 2, 2), 3)\n#> Warning: `x` has duplicate quantiles: break labels may be misleading\n#> [1] {1} {1} {2} {2}\n#> Levels: {1} {2}\n```\n"
  },
  {
    "path": "docs/reference/chop_evenly.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Chop into equal-width intervals — chop_evenly • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Chop into equal-width intervals — chop_evenly\"><meta name=\"description\" content=\"chop_evenly() chops x into intervals intervals of equal width.\"><meta property=\"og:description\" content=\"chop_evenly() chops x into intervals intervals of equal width.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Chop into equal-width intervals</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/chop-by-width.R\" class=\"external-link\"><code>R/chop-by-width.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks-by-width.R\" class=\"external-link\"><code>R/breaks-by-width.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/tab.R\" class=\"external-link\"><code>R/tab.R</code></a></small>\n      <div class=\"d-none name\"><code>chop_evenly.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>chop_evenly()</code> chops <code>x</code> into <code>intervals</code> intervals of equal width.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">chop_evenly</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">intervals</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">brk_evenly</span><span class=\"op\">(</span><span class=\"va\">intervals</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">tab_evenly</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">intervals</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A vector.</p></dd>\n\n\n<dt id=\"arg-intervals\">intervals<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-intervals\"></a></dt>\n<dd><p>Integer: number of intervals to create.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Passed to <code><a href=\"chop.html\">chop()</a></code>.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>chop_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></code> of the same length as <code>x</code>.</p>\n<p><code>brk_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/function.html\" class=\"external-link\">function</a></code> to create <code>breaks</code>.</p>\n<p><code>tab_*</code> functions return a contingency <code><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other chopping functions:\n<code><a href=\"chop.html\">chop()</a></code>,\n<code><a href=\"chop_equally.html\">chop_equally()</a></code>,\n<code><a href=\"chop_fn.html\">chop_fn()</a></code>,\n<code><a href=\"chop_mean_sd.html\">chop_mean_sd()</a></code>,\n<code><a href=\"chop_n.html\">chop_n()</a></code>,\n<code><a href=\"chop_proportions.html\">chop_proportions()</a></code>,\n<code><a href=\"chop_quantiles.html\">chop_quantiles()</a></code>,\n<code><a href=\"chop_spikes.html\">chop_spikes()</a></code>,\n<code><a href=\"chop_width.html\">chop_width()</a></code>,\n<code><a href=\"fillet.html\">fillet()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\">chop_evenly</span><span class=\"op\">(</span><span class=\"fl\">0</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fl\">5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [0, 2)  [0, 2)  [2, 4)  [2, 4)  [4, 6)  [4, 6)  [6, 8)  [6, 8)  [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] [8, 10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [0, 2) [2, 4) [4, 6) [6, 8) [8, 10]</span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/chop_evenly.md",
    "content": "# Chop into equal-width intervals\n\n`chop_evenly()` chops `x` into `intervals` intervals of equal width.\n\n## Usage\n\n``` r\nchop_evenly(x, intervals, ...)\n\nbrk_evenly(intervals)\n\ntab_evenly(x, intervals, ...)\n```\n\n## Arguments\n\n- x:\n\n  A vector.\n\n- intervals:\n\n  Integer: number of intervals to create.\n\n- ...:\n\n  Passed to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n\n## Value\n\n`chop_*` functions return a\n[`factor`](https://rdrr.io/r/base/factor.html) of the same length as\n`x`.\n\n`brk_*` functions return a\n[`function`](https://rdrr.io/r/base/function.html) to create `breaks`.\n\n`tab_*` functions return a contingency\n[`table`](https://rdrr.io/r/base/table.html).\n\n## See also\n\nOther chopping functions:\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md),\n[`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md),\n[`chop_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md),\n[`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md),\n[`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md),\n[`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md),\n[`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md),\n[`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md),\n[`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md),\n[`fillet()`](https://hughjonesd.github.io/santoku/reference/fillet.md)\n\n## Examples\n\n``` r\nchop_evenly(0:10, 5)\n#>  [1] [0, 2)  [0, 2)  [2, 4)  [2, 4)  [4, 6)  [4, 6)  [6, 8)  [6, 8)  [8, 10]\n#> [10] [8, 10] [8, 10]\n#> Levels: [0, 2) [2, 4) [4, 6) [6, 8) [8, 10]\n```\n"
  },
  {
    "path": "docs/reference/chop_fn.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Chop using an existing function — chop_fn • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Chop using an existing function — chop_fn\"><meta name=\"description\" content=\"chop_fn() is a convenience wrapper: chop_fn(x, foo, ...)\nis the same as chop(x, foo(x, ...)).\"><meta property=\"og:description\" content=\"chop_fn() is a convenience wrapper: chop_fn(x, foo, ...)\nis the same as chop(x, foo(x, ...)).\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Chop using an existing function</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/chop-misc.R\" class=\"external-link\"><code>R/chop-misc.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks-misc.R\" class=\"external-link\"><code>R/breaks-misc.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/tab.R\" class=\"external-link\"><code>R/tab.R</code></a></small>\n      <div class=\"d-none name\"><code>chop_fn.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>chop_fn()</code> is a convenience wrapper: <code>chop_fn(x, foo, ...)</code>\nis the same as <code>chop(x, foo(x, ...))</code>.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">chop_fn</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  <span class=\"va\">fn</span>,</span>\n<span>  <span class=\"va\">...</span>,</span>\n<span>  extend <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  left <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  close_end <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  raw <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  drop <span class=\"op\">=</span> <span class=\"cn\">TRUE</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">brk_fn</span><span class=\"op\">(</span><span class=\"va\">fn</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">tab_fn</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  <span class=\"va\">fn</span>,</span>\n<span>  <span class=\"va\">...</span>,</span>\n<span>  extend <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  left <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  close_end <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  raw <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  drop <span class=\"op\">=</span> <span class=\"cn\">TRUE</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A vector.</p></dd>\n\n\n<dt id=\"arg-fn\">fn<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-fn\"></a></dt>\n<dd><p>A function which returns a numeric vector of breaks.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Further arguments to <code>fn</code></p></dd>\n\n\n<dt id=\"arg-extend\">extend<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-extend\"></a></dt>\n<dd><p>Logical. If <code>TRUE</code>, always extend breaks to <code>+/-Inf</code>. If <code>NULL</code>,\nextend breaks to <code>min(x)</code> and/or <code>max(x)</code> only if necessary. If <code>FALSE</code>, never\nextend.</p></dd>\n\n\n<dt id=\"arg-left\">left<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-left\"></a></dt>\n<dd><p>Logical. Left-closed or right-closed breaks?</p></dd>\n\n\n<dt id=\"arg-close-end\">close_end<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-close-end\"></a></dt>\n<dd><p>Logical. Close last break at right? (If <code>left</code> is <code>FALSE</code>,\nclose first break at left?)</p></dd>\n\n\n<dt id=\"arg-raw\">raw<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-raw\"></a></dt>\n<dd><p>Logical. Use raw values in labels?</p></dd>\n\n\n<dt id=\"arg-drop\">drop<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-drop\"></a></dt>\n<dd><p>Logical. Drop unused levels from the result?</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>chop_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></code> of the same length as <code>x</code>.</p>\n<p><code>brk_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/function.html\" class=\"external-link\">function</a></code> to create <code>breaks</code>.</p>\n<p><code>tab_*</code> functions return a contingency <code><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other chopping functions:\n<code><a href=\"chop.html\">chop()</a></code>,\n<code><a href=\"chop_equally.html\">chop_equally()</a></code>,\n<code><a href=\"chop_evenly.html\">chop_evenly()</a></code>,\n<code><a href=\"chop_mean_sd.html\">chop_mean_sd()</a></code>,\n<code><a href=\"chop_n.html\">chop_n()</a></code>,\n<code><a href=\"chop_proportions.html\">chop_proportions()</a></code>,\n<code><a href=\"chop_quantiles.html\">chop_quantiles()</a></code>,\n<code><a href=\"chop_spikes.html\">chop_spikes()</a></code>,\n<code><a href=\"chop_width.html\">chop_width()</a></code>,\n<code><a href=\"fillet.html\">fillet()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\">if</span> <span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/ns-load.html\" class=\"external-link\">requireNamespace</a></span><span class=\"op\">(</span><span class=\"st\">\"scales\"</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\">chop_fn</span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Lognormal.html\" class=\"external-link\">rlnorm</a></span><span class=\"op\">(</span><span class=\"fl\">10</span><span class=\"op\">)</span>, <span class=\"fu\">scales</span><span class=\"fu\">::</span><span class=\"fu\"><a href=\"https://scales.r-lib.org/reference/breaks_log.html\" class=\"external-link\">breaks_log</a></span><span class=\"op\">(</span><span class=\"fl\">5</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"co\"># same as</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"co\"># x &lt;- rlnorm(10)</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"co\"># chop(x, scales::breaks_log(5)(x))</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-msg co\"><span class=\"r-pr\">#&gt;</span> Loading required namespace: scales</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [0.1, 0.3)  [1, 3)      [0.03, 0.1) [0.3, 1)    [1, 3)      [3, 10]    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [7] [0.1, 0.3)  [0.3, 1)    [0.3, 1)    [0.3, 1)   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [0.03, 0.1) [0.1, 0.3) [0.3, 1) [1, 3) [3, 10]</span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/chop_fn.md",
    "content": "# Chop using an existing function\n\n`chop_fn()` is a convenience wrapper: `chop_fn(x, foo, ...)` is the same\nas `chop(x, foo(x, ...))`.\n\n## Usage\n\n``` r\nchop_fn(\n  x,\n  fn,\n  ...,\n  extend = NULL,\n  left = TRUE,\n  close_end = TRUE,\n  raw = NULL,\n  drop = TRUE\n)\n\nbrk_fn(fn, ...)\n\ntab_fn(\n  x,\n  fn,\n  ...,\n  extend = NULL,\n  left = TRUE,\n  close_end = TRUE,\n  raw = NULL,\n  drop = TRUE\n)\n```\n\n## Arguments\n\n- x:\n\n  A vector.\n\n- fn:\n\n  A function which returns a numeric vector of breaks.\n\n- ...:\n\n  Further arguments to `fn`\n\n- extend:\n\n  Logical. If `TRUE`, always extend breaks to `+/-Inf`. If `NULL`,\n  extend breaks to `min(x)` and/or `max(x)` only if necessary. If\n  `FALSE`, never extend.\n\n- left:\n\n  Logical. Left-closed or right-closed breaks?\n\n- close_end:\n\n  Logical. Close last break at right? (If `left` is `FALSE`, close first\n  break at left?)\n\n- raw:\n\n  Logical. Use raw values in labels?\n\n- drop:\n\n  Logical. Drop unused levels from the result?\n\n## Value\n\n`chop_*` functions return a\n[`factor`](https://rdrr.io/r/base/factor.html) of the same length as\n`x`.\n\n`brk_*` functions return a\n[`function`](https://rdrr.io/r/base/function.html) to create `breaks`.\n\n`tab_*` functions return a contingency\n[`table`](https://rdrr.io/r/base/table.html).\n\n## See also\n\nOther chopping functions:\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md),\n[`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md),\n[`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md),\n[`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md),\n[`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md),\n[`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md),\n[`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md),\n[`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md),\n[`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md),\n[`fillet()`](https://hughjonesd.github.io/santoku/reference/fillet.md)\n\n## Examples\n\n``` r\n\nif (requireNamespace(\"scales\")) {\n  chop_fn(rlnorm(10), scales::breaks_log(5))\n  # same as\n  # x <- rlnorm(10)\n  # chop(x, scales::breaks_log(5)(x))\n}\n#> Loading required namespace: scales\n#>  [1] [0.1, 0.3)  [1, 3)      [0.03, 0.1) [0.3, 1)    [1, 3)      [3, 10]    \n#>  [7] [0.1, 0.3)  [0.3, 1)    [0.3, 1)    [0.3, 1)   \n#> Levels: [0.03, 0.1) [0.1, 0.3) [0.3, 1) [1, 3) [3, 10]\n```\n"
  },
  {
    "path": "docs/reference/chop_mean_sd.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Chop by standard deviations — chop_mean_sd • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Chop by standard deviations — chop_mean_sd\"><meta name=\"description\" content=\"Intervals are measured in standard deviations on either side of the\nmean.\"><meta property=\"og:description\" content=\"Intervals are measured in standard deviations on either side of the\nmean.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Chop by standard deviations</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/chop-misc.R\" class=\"external-link\"><code>R/chop-misc.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks-misc.R\" class=\"external-link\"><code>R/breaks-misc.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/tab.R\" class=\"external-link\"><code>R/tab.R</code></a></small>\n      <div class=\"d-none name\"><code>chop_mean_sd.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Intervals are measured in standard deviations on either side of the\nmean.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">chop_mean_sd</span><span class=\"op\">(</span><span class=\"va\">x</span>, sds <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span>, <span class=\"va\">...</span>, raw <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, sd <span class=\"op\">=</span> <span class=\"fu\">deprecated</span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">brk_mean_sd</span><span class=\"op\">(</span>sds <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span>, sd <span class=\"op\">=</span> <span class=\"fu\">deprecated</span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">tab_mean_sd</span><span class=\"op\">(</span><span class=\"va\">x</span>, sds <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span>, <span class=\"va\">...</span>, raw <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A vector.</p></dd>\n\n\n<dt id=\"arg-sds\">sds<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-sds\"></a></dt>\n<dd><p>Positive numeric vector of standard deviations.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Passed to <code><a href=\"chop.html\">chop()</a></code>.</p></dd>\n\n\n<dt id=\"arg-raw\">raw<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-raw\"></a></dt>\n<dd><p>Logical. Use raw values in labels?</p></dd>\n\n\n<dt id=\"arg-sd\">sd<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-sd\"></a></dt>\n<dd><p><a href=\"https://lifecycle.r-lib.org/articles/stages.html#deprecated\" class=\"external-link\"><img src=\"figures/lifecycle-deprecated.svg\" alt=\"[Deprecated]\"></a></p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>chop_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></code> of the same length as <code>x</code>.</p>\n<p><code>brk_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/function.html\" class=\"external-link\">function</a></code> to create <code>breaks</code>.</p>\n<p><code>tab_*</code> functions return a contingency <code><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>In version 0.7.0, these functions changed to specifying <code>sds</code> as a vector.\nTo chop 1, 2 and 3 standard deviations around the mean, write\n<code>chop_mean_sd(x, sds = 1:3)</code> instead of <code>chop_mean_sd(x, sd = 3)</code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other chopping functions:\n<code><a href=\"chop.html\">chop()</a></code>,\n<code><a href=\"chop_equally.html\">chop_equally()</a></code>,\n<code><a href=\"chop_evenly.html\">chop_evenly()</a></code>,\n<code><a href=\"chop_fn.html\">chop_fn()</a></code>,\n<code><a href=\"chop_n.html\">chop_n()</a></code>,\n<code><a href=\"chop_proportions.html\">chop_proportions()</a></code>,\n<code><a href=\"chop_quantiles.html\">chop_quantiles()</a></code>,\n<code><a href=\"chop_spikes.html\">chop_spikes()</a></code>,\n<code><a href=\"chop_width.html\">chop_width()</a></code>,\n<code><a href=\"fillet.html\">fillet()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\">chop_mean_sd</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [-2 sd, -1 sd) [-2 sd, -1 sd) [-1 sd, 0 sd)  [-1 sd, 0 sd)  [-1 sd, 0 sd) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [6] [0 sd, 1 sd)   [0 sd, 1 sd)   [0 sd, 1 sd)   [1 sd, 2 sd)   [1 sd, 2 sd)  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [-2 sd, -1 sd) [-1 sd, 0 sd) [0 sd, 1 sd) [1 sd, 2 sd)</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\">brk_mean_sd</span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [-2 sd, -1 sd) [-2 sd, -1 sd) [-1 sd, 0 sd)  [-1 sd, 0 sd)  [-1 sd, 0 sd) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [6] [0 sd, 1 sd)   [0 sd, 1 sd)   [0 sd, 1 sd)   [1 sd, 2 sd)   [1 sd, 2 sd)  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [-2 sd, -1 sd) [-1 sd, 0 sd) [0 sd, 1 sd) [1 sd, 2 sd)</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">tab_mean_sd</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [-2 sd, -1 sd)  [-1 sd, 0 sd)   [0 sd, 1 sd)   [1 sd, 2 sd) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>              2              3              3              2 </span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/chop_mean_sd.md",
    "content": "# Chop by standard deviations\n\nIntervals are measured in standard deviations on either side of the\nmean.\n\n## Usage\n\n``` r\nchop_mean_sd(x, sds = 1:3, ..., raw = FALSE, sd = deprecated())\n\nbrk_mean_sd(sds = 1:3, sd = deprecated())\n\ntab_mean_sd(x, sds = 1:3, ..., raw = FALSE)\n```\n\n## Arguments\n\n- x:\n\n  A vector.\n\n- sds:\n\n  Positive numeric vector of standard deviations.\n\n- ...:\n\n  Passed to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n\n- raw:\n\n  Logical. Use raw values in labels?\n\n- sd:\n\n  **\\[deprecated\\]**\n\n## Value\n\n`chop_*` functions return a\n[`factor`](https://rdrr.io/r/base/factor.html) of the same length as\n`x`.\n\n`brk_*` functions return a\n[`function`](https://rdrr.io/r/base/function.html) to create `breaks`.\n\n`tab_*` functions return a contingency\n[`table`](https://rdrr.io/r/base/table.html).\n\n## Details\n\nIn version 0.7.0, these functions changed to specifying `sds` as a\nvector. To chop 1, 2 and 3 standard deviations around the mean, write\n`chop_mean_sd(x, sds = 1:3)` instead of `chop_mean_sd(x, sd = 3)`.\n\n## See also\n\nOther chopping functions:\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md),\n[`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md),\n[`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md),\n[`chop_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md),\n[`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md),\n[`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md),\n[`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md),\n[`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md),\n[`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md),\n[`fillet()`](https://hughjonesd.github.io/santoku/reference/fillet.md)\n\n## Examples\n\n``` r\nchop_mean_sd(1:10)\n#>  [1] [-2 sd, -1 sd) [-2 sd, -1 sd) [-1 sd, 0 sd)  [-1 sd, 0 sd)  [-1 sd, 0 sd) \n#>  [6] [0 sd, 1 sd)   [0 sd, 1 sd)   [0 sd, 1 sd)   [1 sd, 2 sd)   [1 sd, 2 sd)  \n#> Levels: [-2 sd, -1 sd) [-1 sd, 0 sd) [0 sd, 1 sd) [1 sd, 2 sd)\n\nchop(1:10, brk_mean_sd())\n#>  [1] [-2 sd, -1 sd) [-2 sd, -1 sd) [-1 sd, 0 sd)  [-1 sd, 0 sd)  [-1 sd, 0 sd) \n#>  [6] [0 sd, 1 sd)   [0 sd, 1 sd)   [0 sd, 1 sd)   [1 sd, 2 sd)   [1 sd, 2 sd)  \n#> Levels: [-2 sd, -1 sd) [-1 sd, 0 sd) [0 sd, 1 sd) [1 sd, 2 sd)\n\ntab_mean_sd(1:10)\n#> [-2 sd, -1 sd)  [-1 sd, 0 sd)   [0 sd, 1 sd)   [1 sd, 2 sd) \n#>              2              3              3              2 \n```\n"
  },
  {
    "path": "docs/reference/chop_n.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Chop into fixed-sized groups — chop_n • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Chop into fixed-sized groups — chop_n\"><meta name=\"description\" content=\"chop_n() creates intervals containing a fixed number of elements.\"><meta property=\"og:description\" content=\"chop_n() creates intervals containing a fixed number of elements.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Chop into fixed-sized groups</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/chop-by-group-size.R\" class=\"external-link\"><code>R/chop-by-group-size.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks-by-group-size.R\" class=\"external-link\"><code>R/breaks-by-group-size.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/tab.R\" class=\"external-link\"><code>R/tab.R</code></a></small>\n      <div class=\"d-none name\"><code>chop_n.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>chop_n()</code> creates intervals containing a fixed number of elements.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">chop_n</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">n</span>, <span class=\"va\">...</span>, tail <span class=\"op\">=</span> <span class=\"st\">\"split\"</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">brk_n</span><span class=\"op\">(</span><span class=\"va\">n</span>, tail <span class=\"op\">=</span> <span class=\"st\">\"split\"</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">tab_n</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">n</span>, <span class=\"va\">...</span>, tail <span class=\"op\">=</span> <span class=\"st\">\"split\"</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A vector.</p></dd>\n\n\n<dt id=\"arg-n\">n<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n\"></a></dt>\n<dd><p>Integer. Number of elements in each interval.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Passed to <code><a href=\"chop.html\">chop()</a></code>.</p></dd>\n\n\n<dt id=\"arg-tail\">tail<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-tail\"></a></dt>\n<dd><p>String. What to do if the final interval has fewer than <code>n</code> elements?\n<code>\"split\"</code> to keep it separate. <code>\"merge\"</code> to merge it with the neighbouring\ninterval.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>chop_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></code> of the same length as <code>x</code>.</p>\n<p><code>brk_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/function.html\" class=\"external-link\">function</a></code> to create <code>breaks</code>.</p>\n<p><code>tab_*</code> functions return a contingency <code><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>The algorithm guarantees that intervals contain no more than <code>n</code> elements, so\nlong as there are no duplicates in <code>x</code> and <code>tail = \"split\"</code>. It also\nguarantees that intervals contain no fewer than <code>n</code> elements, except possibly\nthe last interval (or first interval if <code>left</code> is <code>FALSE</code>).</p>\n<p>To ensure that all intervals contain at least <code>n</code> elements (so long as there\nare at least <code>n</code> elements in <code>x</code>!) set <code>tail = \"merge\"</code>.</p>\n<p>If <code>tail = \"split\"</code> and there are intervals containing duplicates with more\nthan <code>n</code> elements, a warning is given.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other chopping functions:\n<code><a href=\"chop.html\">chop()</a></code>,\n<code><a href=\"chop_equally.html\">chop_equally()</a></code>,\n<code><a href=\"chop_evenly.html\">chop_evenly()</a></code>,\n<code><a href=\"chop_fn.html\">chop_fn()</a></code>,\n<code><a href=\"chop_mean_sd.html\">chop_mean_sd()</a></code>,\n<code><a href=\"chop_proportions.html\">chop_proportions()</a></code>,\n<code><a href=\"chop_quantiles.html\">chop_quantiles()</a></code>,\n<code><a href=\"chop_spikes.html\">chop_spikes()</a></code>,\n<code><a href=\"chop_width.html\">chop_width()</a></code>,\n<code><a href=\"fillet.html\">fillet()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\">chop_n</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fl\">5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [1, 6)  [1, 6)  [1, 6)  [1, 6)  [1, 6)  [6, 10] [6, 10] [6, 10] [6, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] [6, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 6) [6, 10]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop_n</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [1, 3) [1, 3) [3, 5) [3, 5) {5}   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 3) [3, 5) {5}</span>\n<span class=\"r-in\"><span><span class=\"fu\">chop_n</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span>, <span class=\"fl\">2</span>, tail <span class=\"op\">=</span> <span class=\"st\">\"merge\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [1, 3) [1, 3) [3, 5] [3, 5] [3, 5]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 3) [3, 5]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># too many duplicates</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">2</span>, each <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop_n</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>Some intervals contain more than 2 elements</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [1, 2) [1, 2) [1, 2) {2}    {2}    {2}   </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2) {2}</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">tab_n</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fl\">5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1, 6) [6, 10] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       5       5 </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># fewer elements in one group</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">tab_n</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fl\">4</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1, 5)  [5, 9) [9, 10] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       4       4       2 </span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/chop_n.md",
    "content": "# Chop into fixed-sized groups\n\n`chop_n()` creates intervals containing a fixed number of elements.\n\n## Usage\n\n``` r\nchop_n(x, n, ..., tail = \"split\")\n\nbrk_n(n, tail = \"split\")\n\ntab_n(x, n, ..., tail = \"split\")\n```\n\n## Arguments\n\n- x:\n\n  A vector.\n\n- n:\n\n  Integer. Number of elements in each interval.\n\n- ...:\n\n  Passed to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n\n- tail:\n\n  String. What to do if the final interval has fewer than `n` elements?\n  `\"split\"` to keep it separate. `\"merge\"` to merge it with the\n  neighbouring interval.\n\n## Value\n\n`chop_*` functions return a\n[`factor`](https://rdrr.io/r/base/factor.html) of the same length as\n`x`.\n\n`brk_*` functions return a\n[`function`](https://rdrr.io/r/base/function.html) to create `breaks`.\n\n`tab_*` functions return a contingency\n[`table`](https://rdrr.io/r/base/table.html).\n\n## Details\n\nThe algorithm guarantees that intervals contain no more than `n`\nelements, so long as there are no duplicates in `x` and\n`tail = \"split\"`. It also guarantees that intervals contain no fewer\nthan `n` elements, except possibly the last interval (or first interval\nif `left` is `FALSE`).\n\nTo ensure that all intervals contain at least `n` elements (so long as\nthere are at least `n` elements in `x`!) set `tail = \"merge\"`.\n\nIf `tail = \"split\"` and there are intervals containing duplicates with\nmore than `n` elements, a warning is given.\n\n## See also\n\nOther chopping functions:\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md),\n[`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md),\n[`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md),\n[`chop_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md),\n[`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md),\n[`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md),\n[`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md),\n[`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md),\n[`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md),\n[`fillet()`](https://hughjonesd.github.io/santoku/reference/fillet.md)\n\n## Examples\n\n``` r\nchop_n(1:10, 5)\n#>  [1] [1, 6)  [1, 6)  [1, 6)  [1, 6)  [1, 6)  [6, 10] [6, 10] [6, 10] [6, 10]\n#> [10] [6, 10]\n#> Levels: [1, 6) [6, 10]\n\nchop_n(1:5, 2)\n#> [1] [1, 3) [1, 3) [3, 5) [3, 5) {5}   \n#> Levels: [1, 3) [3, 5) {5}\nchop_n(1:5, 2, tail = \"merge\")\n#> [1] [1, 3) [1, 3) [3, 5] [3, 5] [3, 5]\n#> Levels: [1, 3) [3, 5]\n\n# too many duplicates\nx <- rep(1:2, each = 3)\nchop_n(x, 2)\n#> Warning: Some intervals contain more than 2 elements\n#> [1] [1, 2) [1, 2) [1, 2) {2}    {2}    {2}   \n#> Levels: [1, 2) {2}\n\ntab_n(1:10, 5)\n#>  [1, 6) [6, 10] \n#>       5       5 \n\n# fewer elements in one group\ntab_n(1:10, 4)\n#>  [1, 5)  [5, 9) [9, 10] \n#>       4       4       2 \n```\n"
  },
  {
    "path": "docs/reference/chop_pretty.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Chop using pretty breakpoints — chop_pretty • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Chop using pretty breakpoints — chop_pretty\"><meta name=\"description\" content=\"chop_pretty() uses base::pretty() to calculate breakpoints\nwhich are 1, 2 or 5 times a power of 10. These look nice in graphs.\"><meta property=\"og:description\" content=\"chop_pretty() uses base::pretty() to calculate breakpoints\nwhich are 1, 2 or 5 times a power of 10. These look nice in graphs.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Chop using pretty breakpoints</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/chop-misc.R\" class=\"external-link\"><code>R/chop-misc.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks-misc.R\" class=\"external-link\"><code>R/breaks-misc.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/tab.R\" class=\"external-link\"><code>R/tab.R</code></a></small>\n      <div class=\"d-none name\"><code>chop_pretty.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>chop_pretty()</code> uses <code><a href=\"https://rdrr.io/r/base/pretty.html\" class=\"external-link\">base::pretty()</a></code> to calculate breakpoints\nwhich are 1, 2 or 5 times a power of 10. These look nice in graphs.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">chop_pretty</span><span class=\"op\">(</span><span class=\"va\">x</span>, n <span class=\"op\">=</span> <span class=\"fl\">5</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">brk_pretty</span><span class=\"op\">(</span>n <span class=\"op\">=</span> <span class=\"fl\">5</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">tab_pretty</span><span class=\"op\">(</span><span class=\"va\">x</span>, n <span class=\"op\">=</span> <span class=\"fl\">5</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A vector.</p></dd>\n\n\n<dt id=\"arg-n\">n<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n\"></a></dt>\n<dd><p>Positive integer passed to <code><a href=\"https://rdrr.io/r/base/pretty.html\" class=\"external-link\">base::pretty()</a></code>. How many intervals to chop into?</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Passed to <code><a href=\"chop.html\">chop()</a></code> by <code>chop_pretty()</code> and <code>tab_pretty()</code>; passed\nto <code><a href=\"https://rdrr.io/r/base/pretty.html\" class=\"external-link\">base::pretty()</a></code> by <code>brk_pretty()</code>.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>chop_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></code> of the same length as <code>x</code>.</p>\n<p><code>brk_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/function.html\" class=\"external-link\">function</a></code> to create <code>breaks</code>.</p>\n<p><code>tab_*</code> functions return a contingency <code><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p><code><a href=\"https://rdrr.io/r/base/pretty.html\" class=\"external-link\">base::pretty()</a></code> tries to return <code>n+1</code> breakpoints, i.e. <code>n</code> intervals, but\nnote that this is not guaranteed. There are methods for Date and POSIXct\nobjects.</p>\n<p>For fine-grained control over <code><a href=\"https://rdrr.io/r/base/pretty.html\" class=\"external-link\">base::pretty()</a></code> parameters, use\n<code>chop(x, brk_pretty(...))</code>.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\">chop_pretty</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [0, 2)  [2, 4)  [2, 4)  [4, 6)  [4, 6)  [6, 8)  [6, 8)  [8, 10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [0, 2) [2, 4) [4, 6) [6, 8) [8, 10]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\">brk_pretty</span><span class=\"op\">(</span>n <span class=\"op\">=</span> <span class=\"fl\">5</span>, high.u.bias <span class=\"op\">=</span> <span class=\"fl\">0</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [1, 2)  [2, 3)  [3, 4)  [4, 5)  [5, 6)  [6, 7)  [7, 8)  [8, 9)  [9, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] [9, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2) [2, 3) [3, 4) [4, 5) [5, 6) [6, 7) [7, 8) [8, 9) [9, 10]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">tab_pretty</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [0, 2)  [2, 4)  [4, 6)  [6, 8) [8, 10] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       1       2       2       2       3 </span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/chop_pretty.md",
    "content": "# Chop using pretty breakpoints\n\n`chop_pretty()` uses\n[`base::pretty()`](https://rdrr.io/r/base/pretty.html) to calculate\nbreakpoints which are 1, 2 or 5 times a power of 10. These look nice in\ngraphs.\n\n## Usage\n\n``` r\nchop_pretty(x, n = 5, ...)\n\nbrk_pretty(n = 5, ...)\n\ntab_pretty(x, n = 5, ...)\n```\n\n## Arguments\n\n- x:\n\n  A vector.\n\n- n:\n\n  Positive integer passed to\n  [`base::pretty()`](https://rdrr.io/r/base/pretty.html). How many\n  intervals to chop into?\n\n- ...:\n\n  Passed to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md) by\n  `chop_pretty()` and `tab_pretty()`; passed to\n  [`base::pretty()`](https://rdrr.io/r/base/pretty.html) by\n  `brk_pretty()`.\n\n## Value\n\n`chop_*` functions return a\n[`factor`](https://rdrr.io/r/base/factor.html) of the same length as\n`x`.\n\n`brk_*` functions return a\n[`function`](https://rdrr.io/r/base/function.html) to create `breaks`.\n\n`tab_*` functions return a contingency\n[`table`](https://rdrr.io/r/base/table.html).\n\n## Details\n\n[`base::pretty()`](https://rdrr.io/r/base/pretty.html) tries to return\n`n+1` breakpoints, i.e. `n` intervals, but note that this is not\nguaranteed. There are methods for Date and POSIXct objects.\n\nFor fine-grained control over\n[`base::pretty()`](https://rdrr.io/r/base/pretty.html) parameters, use\n`chop(x, brk_pretty(...))`.\n\n## Examples\n\n``` r\nchop_pretty(1:10)\n#>  [1] [0, 2)  [2, 4)  [2, 4)  [4, 6)  [4, 6)  [6, 8)  [6, 8)  [8, 10] [8, 10]\n#> [10] [8, 10]\n#> Levels: [0, 2) [2, 4) [4, 6) [6, 8) [8, 10]\n\nchop(1:10, brk_pretty(n = 5, high.u.bias = 0))\n#>  [1] [1, 2)  [2, 3)  [3, 4)  [4, 5)  [5, 6)  [6, 7)  [7, 8)  [8, 9)  [9, 10]\n#> [10] [9, 10]\n#> Levels: [1, 2) [2, 3) [3, 4) [4, 5) [5, 6) [6, 7) [7, 8) [8, 9) [9, 10]\n\ntab_pretty(1:10)\n#>  [0, 2)  [2, 4)  [4, 6)  [6, 8) [8, 10] \n#>       1       2       2       2       3 \n```\n"
  },
  {
    "path": "docs/reference/chop_proportions.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Chop into proportions of the range of x — chop_proportions • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Chop into proportions of the range of x — chop_proportions\"><meta name=\"description\" content=\"chop_proportions() chops x into proportions of its range, excluding\ninfinite values.\"><meta property=\"og:description\" content=\"chop_proportions() chops x into proportions of its range, excluding\ninfinite values.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Chop into proportions of the range of x</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/chop-by-width.R\" class=\"external-link\"><code>R/chop-by-width.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks-by-width.R\" class=\"external-link\"><code>R/breaks-by-width.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/tab.R\" class=\"external-link\"><code>R/tab.R</code></a></small>\n      <div class=\"d-none name\"><code>chop_proportions.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>chop_proportions()</code> chops <code>x</code> into <code>proportions</code> of its range, excluding\ninfinite values.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">chop_proportions</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">proportions</span>, <span class=\"va\">...</span>, raw <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">brk_proportions</span><span class=\"op\">(</span><span class=\"va\">proportions</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">tab_proportions</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">proportions</span>, <span class=\"va\">...</span>, raw <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A vector.</p></dd>\n\n\n<dt id=\"arg-proportions\">proportions<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-proportions\"></a></dt>\n<dd><p>Numeric vector between 0 and 1: proportions of x's range.\nIf <code>proportions</code> has names, these will be used for labels.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Passed to <code><a href=\"chop.html\">chop()</a></code>.</p></dd>\n\n\n<dt id=\"arg-raw\">raw<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-raw\"></a></dt>\n<dd><p>Logical. Use raw values in labels?</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>chop_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></code> of the same length as <code>x</code>.</p>\n<p><code>brk_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/function.html\" class=\"external-link\">function</a></code> to create <code>breaks</code>.</p>\n<p><code>tab_*</code> functions return a contingency <code><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>By default, labels show the raw numeric endpoints. To label intervals by\nthe proportions, use <code>raw = FALSE</code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other chopping functions:\n<code><a href=\"chop.html\">chop()</a></code>,\n<code><a href=\"chop_equally.html\">chop_equally()</a></code>,\n<code><a href=\"chop_evenly.html\">chop_evenly()</a></code>,\n<code><a href=\"chop_fn.html\">chop_fn()</a></code>,\n<code><a href=\"chop_mean_sd.html\">chop_mean_sd()</a></code>,\n<code><a href=\"chop_n.html\">chop_n()</a></code>,\n<code><a href=\"chop_quantiles.html\">chop_quantiles()</a></code>,\n<code><a href=\"chop_spikes.html\">chop_spikes()</a></code>,\n<code><a href=\"chop_width.html\">chop_width()</a></code>,\n<code><a href=\"fillet.html\">fillet()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\">chop_proportions</span><span class=\"op\">(</span><span class=\"fl\">0</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.2</span>, <span class=\"fl\">0.8</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [0, 2)  [0, 2)  [2, 8)  [2, 8)  [2, 8)  [2, 8)  [2, 8)  [2, 8)  [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] [8, 10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [0, 2) [2, 8) [8, 10]</span>\n<span class=\"r-in\"><span><span class=\"fu\">chop_proportions</span><span class=\"op\">(</span><span class=\"fl\">0</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span>Low <span class=\"op\">=</span> <span class=\"fl\">0</span>, Mid <span class=\"op\">=</span> <span class=\"fl\">0.2</span>, High <span class=\"op\">=</span> <span class=\"fl\">0.8</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] Low  Low  Mid  Mid  Mid  Mid  Mid  Mid  High High High</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: Low Mid High</span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/chop_proportions.md",
    "content": "# Chop into proportions of the range of x\n\n`chop_proportions()` chops `x` into `proportions` of its range,\nexcluding infinite values.\n\n## Usage\n\n``` r\nchop_proportions(x, proportions, ..., raw = TRUE)\n\nbrk_proportions(proportions)\n\ntab_proportions(x, proportions, ..., raw = TRUE)\n```\n\n## Arguments\n\n- x:\n\n  A vector.\n\n- proportions:\n\n  Numeric vector between 0 and 1: proportions of x's range. If\n  `proportions` has names, these will be used for labels.\n\n- ...:\n\n  Passed to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n\n- raw:\n\n  Logical. Use raw values in labels?\n\n## Value\n\n`chop_*` functions return a\n[`factor`](https://rdrr.io/r/base/factor.html) of the same length as\n`x`.\n\n`brk_*` functions return a\n[`function`](https://rdrr.io/r/base/function.html) to create `breaks`.\n\n`tab_*` functions return a contingency\n[`table`](https://rdrr.io/r/base/table.html).\n\n## Details\n\nBy default, labels show the raw numeric endpoints. To label intervals by\nthe proportions, use `raw = FALSE`.\n\n## See also\n\nOther chopping functions:\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md),\n[`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md),\n[`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md),\n[`chop_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md),\n[`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md),\n[`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md),\n[`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md),\n[`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md),\n[`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md),\n[`fillet()`](https://hughjonesd.github.io/santoku/reference/fillet.md)\n\n## Examples\n\n``` r\nchop_proportions(0:10, c(0.2, 0.8))\n#>  [1] [0, 2)  [0, 2)  [2, 8)  [2, 8)  [2, 8)  [2, 8)  [2, 8)  [2, 8)  [8, 10]\n#> [10] [8, 10] [8, 10]\n#> Levels: [0, 2) [2, 8) [8, 10]\nchop_proportions(0:10, c(Low = 0, Mid = 0.2, High = 0.8))\n#>  [1] Low  Low  Mid  Mid  Mid  Mid  Mid  Mid  High High High\n#> Levels: Low Mid High\n```\n"
  },
  {
    "path": "docs/reference/chop_quantiles.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Chop by quantiles — chop_quantiles • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Chop by quantiles — chop_quantiles\"><meta name=\"description\" content=\"chop_quantiles() chops data by quantiles.\nchop_deciles() is a convenience function which chops into deciles.\"><meta property=\"og:description\" content=\"chop_quantiles() chops data by quantiles.\nchop_deciles() is a convenience function which chops into deciles.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Chop by quantiles</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/chop-by-group-size.R\" class=\"external-link\"><code>R/chop-by-group-size.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks-by-group-size.R\" class=\"external-link\"><code>R/breaks-by-group-size.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/tab.R\" class=\"external-link\"><code>R/tab.R</code></a></small>\n      <div class=\"d-none name\"><code>chop_quantiles.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>chop_quantiles()</code> chops data by quantiles.\n<code>chop_deciles()</code> is a convenience function which chops into deciles.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">chop_quantiles</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  <span class=\"va\">probs</span>,</span>\n<span>  <span class=\"va\">...</span>,</span>\n<span>  labels <span class=\"op\">=</span> <span class=\"kw\">if</span> <span class=\"op\">(</span><span class=\"va\">raw</span><span class=\"op\">)</span> <span class=\"fu\"><a href=\"lbl_intervals.html\">lbl_intervals</a></span><span class=\"op\">(</span><span class=\"op\">)</span> <span class=\"kw\">else</span> <span class=\"fu\"><a href=\"lbl_intervals.html\">lbl_intervals</a></span><span class=\"op\">(</span>single <span class=\"op\">=</span> <span class=\"cn\">NULL</span><span class=\"op\">)</span>,</span>\n<span>  left <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">is.numeric</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span>,</span>\n<span>  raw <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>,</span>\n<span>  weights <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  recalc_probs <span class=\"op\">=</span> <span class=\"cn\">FALSE</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">chop_deciles</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">brk_quantiles</span><span class=\"op\">(</span><span class=\"va\">probs</span>, <span class=\"va\">...</span>, weights <span class=\"op\">=</span> <span class=\"cn\">NULL</span>, recalc_probs <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">tab_quantiles</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">probs</span>, <span class=\"va\">...</span>, left <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/numeric.html\" class=\"external-link\">is.numeric</a></span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span>, raw <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">tab_deciles</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">...</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A vector.</p></dd>\n\n\n<dt id=\"arg-probs\">probs<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-probs\"></a></dt>\n<dd><p>A vector of probabilities for the quantiles. If <code>probs</code> has\nnames, these will be used for labels.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>For <code>chop_quantiles</code>, passed to <code><a href=\"chop.html\">chop()</a></code>. For <code>brk_quantiles()</code>,\npassed to <code><a href=\"https://rdrr.io/r/stats/quantile.html\" class=\"external-link\">stats::quantile()</a></code> or <code><a href=\"https://rdrr.io/pkg/Hmisc/man/wtd.stats.html\" class=\"external-link\">Hmisc::wtd.quantile()</a></code>.</p></dd>\n\n\n<dt id=\"arg-labels\">labels<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-labels\"></a></dt>\n<dd><p>A character vector of labels or a function to create labels.</p></dd>\n\n\n<dt id=\"arg-left\">left<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-left\"></a></dt>\n<dd><p>Logical. Left-closed or right-closed breaks?</p></dd>\n\n\n<dt id=\"arg-raw\">raw<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-raw\"></a></dt>\n<dd><p>Logical. Use raw values in labels?</p></dd>\n\n\n<dt id=\"arg-weights\">weights<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-weights\"></a></dt>\n<dd><p><code>NULL</code> or numeric vector of same length as <code>x</code>. If not\n<code>NULL</code>, <code><a href=\"https://rdrr.io/pkg/Hmisc/man/wtd.stats.html\" class=\"external-link\">Hmisc::wtd.quantile()</a></code> is used to calculate weighted quantiles.</p></dd>\n\n\n<dt id=\"arg-recalc-probs\">recalc_probs<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-recalc-probs\"></a></dt>\n<dd><p>Logical. Recalculate probabilities of quantiles using\n<code><a href=\"https://rdrr.io/r/stats/ecdf.html\" class=\"external-link\">ecdf(x)</a></code>? See below.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>chop_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></code> of the same length as <code>x</code>.</p>\n<p><code>brk_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/function.html\" class=\"external-link\">function</a></code> to create <code>breaks</code>.</p>\n<p><code>tab_*</code> functions return a contingency <code><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>For non-numeric <code>x</code>, <code>left</code> is set to <code>FALSE</code> by default. This works better\nfor calculating \"type 1\" quantiles, since they round down. See\n<code><a href=\"https://rdrr.io/r/stats/quantile.html\" class=\"external-link\">stats::quantile()</a></code>.</p>\n<p>By default, <code>chop_quantiles()</code> shows the requested probabilities in the\nlabels. To show the numeric quantiles themselves, set <code>raw = TRUE</code>.</p>\n<p>When <code>x</code> contains duplicates, consecutive quantiles may be the same number. If\nso, interval labels may be misleading, and if <code>recalc_probs = FALSE</code> a warning is\nemitted. Set <code>recalc_probs = TRUE</code> to recalculate the probabilities of the quantiles\nusing the <a href=\"https://rdrr.io/r/stats/ecdf.html\" class=\"external-link\">empirical cumulative distribution function</a> of <code>x</code>.\nDoing so may give you different labels from what you expect, and will\nremove any names from <code>probs</code>, but it never changes the actual\nquantiles used for breaks. At present, <code>recalc_probs = TRUE</code> is incompatible\nwith non-null <code>weights</code>. See the example below.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other chopping functions:\n<code><a href=\"chop.html\">chop()</a></code>,\n<code><a href=\"chop_equally.html\">chop_equally()</a></code>,\n<code><a href=\"chop_evenly.html\">chop_evenly()</a></code>,\n<code><a href=\"chop_fn.html\">chop_fn()</a></code>,\n<code><a href=\"chop_mean_sd.html\">chop_mean_sd()</a></code>,\n<code><a href=\"chop_n.html\">chop_n()</a></code>,\n<code><a href=\"chop_proportions.html\">chop_proportions()</a></code>,\n<code><a href=\"chop_spikes.html\">chop_spikes()</a></code>,\n<code><a href=\"chop_width.html\">chop_width()</a></code>,\n<code><a href=\"fillet.html\">fillet()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\">chop_quantiles</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span><span class=\"op\">/</span><span class=\"fl\">4</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [0%, 25%)   [0%, 25%)   [0%, 25%)   [25%, 50%)  [25%, 50%)  [50%, 75%) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [7] [50%, 75%)  [75%, 100%] [75%, 100%] [75%, 100%]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [0%, 25%) [25%, 50%) [50%, 75%) [75%, 100%]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop_quantiles</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span>Q1 <span class=\"op\">=</span> <span class=\"fl\">0</span>, Q2 <span class=\"op\">=</span> <span class=\"fl\">0.25</span>, Q3 <span class=\"op\">=</span> <span class=\"fl\">0.5</span>, Q4 <span class=\"op\">=</span> <span class=\"fl\">0.75</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] Q1 Q1 Q1 Q2 Q2 Q3 Q3 Q4 Q4 Q4</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: Q1 Q2 Q3 Q4</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\">brk_quantiles</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span><span class=\"op\">/</span><span class=\"fl\">4</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [0%, 25%)   [0%, 25%)   [0%, 25%)   [25%, 50%)  [25%, 50%)  [50%, 75%) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [7] [50%, 75%)  [75%, 100%] [75%, 100%] [75%, 100%]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [0%, 25%) [25%, 50%) [50%, 75%) [75%, 100%]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop_deciles</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [0%, 10%)   [10%, 20%)  [20%, 30%)  [30%, 40%)  [40%, 50%)  [50%, 60%) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [7] [60%, 70%)  [70%, 80%)  [80%, 90%)  [90%, 100%]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 10 Levels: [0%, 10%) [10%, 20%) [20%, 30%) [30%, 40%) [40%, 50%) ... [90%, 100%]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># to label by the quantiles themselves:</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop_quantiles</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span><span class=\"op\">/</span><span class=\"fl\">4</span>, raw <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [1, 3.25)   [1, 3.25)   [1, 3.25)   [3.25, 5.5) [3.25, 5.5) [5.5, 7.75)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [7] [5.5, 7.75) [7.75, 10]  [7.75, 10]  [7.75, 10] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 3.25) [3.25, 5.5) [5.5, 7.75) [7.75, 10]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># duplicate quantiles:</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">1</span>, <span class=\"fl\">1</span>, <span class=\"fl\">2</span>, <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/quantile.html\" class=\"external-link\">quantile</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">/</span><span class=\"fl\">5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  20%  40%  60%  80% 100% </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  1.0  1.0  1.4  2.2  3.0 </span>\n<span class=\"r-in\"><span><span class=\"fu\">tab_quantiles</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">/</span><span class=\"fl\">5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-wrn co\"><span class=\"r-pr\">#&gt;</span> <span class=\"warning\">Warning: </span>`x` has duplicate quantiles: break labels may be misleading</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [20%, 40%]  [60%, 80%) [80%, 100%] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>           3           1           1 </span>\n<span class=\"r-in\"><span><span class=\"fu\">tab_quantiles</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">5</span><span class=\"op\">/</span><span class=\"fl\">5</span>, recalc_probs <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   [0%, 60%]  [60%, 80%) [80%, 100%] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>           3           1           1 </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">42</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">tab_quantiles</span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">100</span><span class=\"op\">)</span>, probs <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span><span class=\"op\">/</span><span class=\"fl\">4</span>, raw <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [-2.993, -0.6167) [-0.6167, 0.0898)  [0.0898, 0.6616)   [0.6616, 2.287] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                25                25                25                25 </span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/chop_quantiles.md",
    "content": "# Chop by quantiles\n\n`chop_quantiles()` chops data by quantiles. `chop_deciles()` is a\nconvenience function which chops into deciles.\n\n## Usage\n\n``` r\nchop_quantiles(\n  x,\n  probs,\n  ...,\n  labels = if (raw) lbl_intervals() else lbl_intervals(single = NULL),\n  left = is.numeric(x),\n  raw = FALSE,\n  weights = NULL,\n  recalc_probs = FALSE\n)\n\nchop_deciles(x, ...)\n\nbrk_quantiles(probs, ..., weights = NULL, recalc_probs = FALSE)\n\ntab_quantiles(x, probs, ..., left = is.numeric(x), raw = FALSE)\n\ntab_deciles(x, ...)\n```\n\n## Arguments\n\n- x:\n\n  A vector.\n\n- probs:\n\n  A vector of probabilities for the quantiles. If `probs` has names,\n  these will be used for labels.\n\n- ...:\n\n  For `chop_quantiles`, passed to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n  For `brk_quantiles()`, passed to\n  [`stats::quantile()`](https://rdrr.io/r/stats/quantile.html) or\n  [`Hmisc::wtd.quantile()`](https://rdrr.io/pkg/Hmisc/man/wtd.stats.html).\n\n- labels:\n\n  A character vector of labels or a function to create labels.\n\n- left:\n\n  Logical. Left-closed or right-closed breaks?\n\n- raw:\n\n  Logical. Use raw values in labels?\n\n- weights:\n\n  `NULL` or numeric vector of same length as `x`. If not `NULL`,\n  [`Hmisc::wtd.quantile()`](https://rdrr.io/pkg/Hmisc/man/wtd.stats.html)\n  is used to calculate weighted quantiles.\n\n- recalc_probs:\n\n  Logical. Recalculate probabilities of quantiles using\n  [`ecdf(x)`](https://rdrr.io/r/stats/ecdf.html)? See below.\n\n## Value\n\n`chop_*` functions return a\n[`factor`](https://rdrr.io/r/base/factor.html) of the same length as\n`x`.\n\n`brk_*` functions return a\n[`function`](https://rdrr.io/r/base/function.html) to create `breaks`.\n\n`tab_*` functions return a contingency\n[`table`](https://rdrr.io/r/base/table.html).\n\n## Details\n\nFor non-numeric `x`, `left` is set to `FALSE` by default. This works\nbetter for calculating \"type 1\" quantiles, since they round down. See\n[`stats::quantile()`](https://rdrr.io/r/stats/quantile.html).\n\nBy default, `chop_quantiles()` shows the requested probabilities in the\nlabels. To show the numeric quantiles themselves, set `raw = TRUE`.\n\nWhen `x` contains duplicates, consecutive quantiles may be the same\nnumber. If so, interval labels may be misleading, and if\n`recalc_probs = FALSE` a warning is emitted. Set `recalc_probs = TRUE`\nto recalculate the probabilities of the quantiles using the [empirical\ncumulative distribution function](https://rdrr.io/r/stats/ecdf.html) of\n`x`. Doing so may give you different labels from what you expect, and\nwill remove any names from `probs`, but it never changes the actual\nquantiles used for breaks. At present, `recalc_probs = TRUE` is\nincompatible with non-null `weights`. See the example below.\n\n## See also\n\nOther chopping functions:\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md),\n[`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md),\n[`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md),\n[`chop_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md),\n[`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md),\n[`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md),\n[`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md),\n[`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md),\n[`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md),\n[`fillet()`](https://hughjonesd.github.io/santoku/reference/fillet.md)\n\n## Examples\n\n``` r\nchop_quantiles(1:10, 1:3/4)\n#>  [1] [0%, 25%)   [0%, 25%)   [0%, 25%)   [25%, 50%)  [25%, 50%)  [50%, 75%) \n#>  [7] [50%, 75%)  [75%, 100%] [75%, 100%] [75%, 100%]\n#> Levels: [0%, 25%) [25%, 50%) [50%, 75%) [75%, 100%]\n\nchop_quantiles(1:10, c(Q1 = 0, Q2 = 0.25, Q3 = 0.5, Q4 = 0.75))\n#>  [1] Q1 Q1 Q1 Q2 Q2 Q3 Q3 Q4 Q4 Q4\n#> Levels: Q1 Q2 Q3 Q4\n\nchop(1:10, brk_quantiles(1:3/4))\n#>  [1] [0%, 25%)   [0%, 25%)   [0%, 25%)   [25%, 50%)  [25%, 50%)  [50%, 75%) \n#>  [7] [50%, 75%)  [75%, 100%] [75%, 100%] [75%, 100%]\n#> Levels: [0%, 25%) [25%, 50%) [50%, 75%) [75%, 100%]\n\nchop_deciles(1:10)\n#>  [1] [0%, 10%)   [10%, 20%)  [20%, 30%)  [30%, 40%)  [40%, 50%)  [50%, 60%) \n#>  [7] [60%, 70%)  [70%, 80%)  [80%, 90%)  [90%, 100%]\n#> 10 Levels: [0%, 10%) [10%, 20%) [20%, 30%) [30%, 40%) [40%, 50%) ... [90%, 100%]\n\n# to label by the quantiles themselves:\nchop_quantiles(1:10, 1:3/4, raw = TRUE)\n#>  [1] [1, 3.25)   [1, 3.25)   [1, 3.25)   [3.25, 5.5) [3.25, 5.5) [5.5, 7.75)\n#>  [7] [5.5, 7.75) [7.75, 10]  [7.75, 10]  [7.75, 10] \n#> Levels: [1, 3.25) [3.25, 5.5) [5.5, 7.75) [7.75, 10]\n\n# duplicate quantiles:\nx <- c(1, 1, 1, 2, 3)\nquantile(x, 1:5/5)\n#>  20%  40%  60%  80% 100% \n#>  1.0  1.0  1.4  2.2  3.0 \ntab_quantiles(x, 1:5/5)\n#> Warning: `x` has duplicate quantiles: break labels may be misleading\n#>  [20%, 40%]  [60%, 80%) [80%, 100%] \n#>           3           1           1 \ntab_quantiles(x, 1:5/5, recalc_probs = TRUE)\n#>   [0%, 60%]  [60%, 80%) [80%, 100%] \n#>           3           1           1 \nset.seed(42)\ntab_quantiles(rnorm(100), probs = 1:3/4, raw = TRUE)\n#> [-2.993, -0.6167) [-0.6167, 0.0898)  [0.0898, 0.6616)   [0.6616, 2.287] \n#>                25                25                25                25 \n```\n"
  },
  {
    "path": "docs/reference/chop_spikes.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Chop common values into singleton intervals — chop_spikes • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Chop common values into singleton intervals — chop_spikes\"><meta name=\"description\" content=\"chop_spikes() lets you chop common values of x into their own\nsingleton intervals. This can help make unusual values visible.\"><meta property=\"og:description\" content=\"chop_spikes() lets you chop common values of x into their own\nsingleton intervals. This can help make unusual values visible.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Chop common values into singleton intervals</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/chop-isolates.R\" class=\"external-link\"><code>R/chop-isolates.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks.R\" class=\"external-link\"><code>R/breaks.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/tab.R\" class=\"external-link\"><code>R/tab.R</code></a></small>\n      <div class=\"d-none name\"><code>chop_spikes.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>chop_spikes()</code> lets you chop common values of <code>x</code> into their own\nsingleton intervals. This can help make unusual values visible.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">chop_spikes</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">breaks</span>, <span class=\"va\">...</span>, n <span class=\"op\">=</span> <span class=\"cn\">NULL</span>, prop <span class=\"op\">=</span> <span class=\"cn\">NULL</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">brk_spikes</span><span class=\"op\">(</span><span class=\"va\">breaks</span>, n <span class=\"op\">=</span> <span class=\"cn\">NULL</span>, prop <span class=\"op\">=</span> <span class=\"cn\">NULL</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">tab_spikes</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">breaks</span>, <span class=\"va\">...</span>, n <span class=\"op\">=</span> <span class=\"cn\">NULL</span>, prop <span class=\"op\">=</span> <span class=\"cn\">NULL</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A vector.</p></dd>\n\n\n<dt id=\"arg-breaks\">breaks<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-breaks\"></a></dt>\n<dd><p>A numeric vector of cut-points or a call to a <code>brk_*</code> function.\nThe resulting <code><a href=\"breaks-class.html\">breaks</a></code> object will be modified to add\nsingleton breaks.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Passed to <code><a href=\"chop.html\">chop()</a></code>.</p></dd>\n\n\n<dt id=\"arg-n-prop\">n, prop<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-prop\"></a></dt>\n<dd><p>Scalar. Provide either <code>n</code>, a number of values, or <code>prop</code>,\na proportion of <code>length(x)</code>. Values of <code>x</code> which occur at least this\noften will get their own singleton break.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>chop_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></code> of the same length as <code>x</code>.</p>\n<p><code>brk_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/function.html\" class=\"external-link\">function</a></code> to create <code>breaks</code>.</p>\n<p><code>tab_*</code> functions return a contingency <code><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>This function is <a href=\"https://lifecycle.r-lib.org/articles/stages.html#experimental\" class=\"external-link\"><img src=\"figures/lifecycle-experimental.svg\" alt=\"[Experimental]\"></a>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"dissect.html\">dissect()</a></code> for a different approach.</p>\n<p>Other chopping functions:\n<code><a href=\"chop.html\">chop()</a></code>,\n<code><a href=\"chop_equally.html\">chop_equally()</a></code>,\n<code><a href=\"chop_evenly.html\">chop_evenly()</a></code>,\n<code><a href=\"chop_fn.html\">chop_fn()</a></code>,\n<code><a href=\"chop_mean_sd.html\">chop_mean_sd()</a></code>,\n<code><a href=\"chop_n.html\">chop_n()</a></code>,\n<code><a href=\"chop_proportions.html\">chop_proportions()</a></code>,\n<code><a href=\"chop_quantiles.html\">chop_quantiles()</a></code>,\n<code><a href=\"chop_width.html\">chop_width()</a></code>,\n<code><a href=\"fillet.html\">fillet()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">4</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/rep.html\" class=\"external-link\">rep</a></span><span class=\"op\">(</span><span class=\"fl\">5</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>, <span class=\"fl\">6</span><span class=\"op\">:</span><span class=\"fl\">10</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop_spikes</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">7</span><span class=\"op\">)</span>, n <span class=\"op\">=</span> <span class=\"fl\">5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  {5}     {5}     {5}     {5}     {5}    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] (5, 7)  [7, 10] [7, 10] [7, 10] [7, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2) [2, 5) {5} (5, 7) [7, 10]</span>\n<span class=\"r-in\"><span><span class=\"fu\">chop_spikes</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">7</span><span class=\"op\">)</span>, prop <span class=\"op\">=</span> <span class=\"fl\">0.25</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  {5}     {5}     {5}     {5}     {5}    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] (5, 7)  [7, 10] [7, 10] [7, 10] [7, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2) [2, 5) {5} (5, 7) [7, 10]</span>\n<span class=\"r-in\"><span><span class=\"fu\">chop_spikes</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"chop_width.html\">brk_width</a></span><span class=\"op\">(</span><span class=\"fl\">5</span><span class=\"op\">)</span>, n <span class=\"op\">=</span> <span class=\"fl\">5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [1, 5)  [1, 5)  [1, 5)  [1, 5)  {5}     {5}     {5}     {5}     {5}    </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] [6, 11] [6, 11] [6, 11] [6, 11] [6, 11]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 5) {5} [6, 11]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">42</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"fl\">40</span>, <span class=\"fl\">0</span>, <span class=\"fl\">10</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sample.html\" class=\"external-link\">sample</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fl\">200</span>, replace <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">tab_spikes</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"chop_width.html\">brk_width</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">0</span><span class=\"op\">)</span>, prop <span class=\"op\">=</span> <span class=\"fl\">0.05</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>      [0, 2)      [2, 4)      [4, 6)      [6, 8)  [8, 9.057)     {9.057} </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>          30          24          36          40          22          11 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (9.057, 10] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>          37 </span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/chop_spikes.md",
    "content": "# Chop common values into singleton intervals\n\n`chop_spikes()` lets you chop common values of `x` into their own\nsingleton intervals. This can help make unusual values visible.\n\n## Usage\n\n``` r\nchop_spikes(x, breaks, ..., n = NULL, prop = NULL)\n\nbrk_spikes(breaks, n = NULL, prop = NULL)\n\ntab_spikes(x, breaks, ..., n = NULL, prop = NULL)\n```\n\n## Arguments\n\n- x:\n\n  A vector.\n\n- breaks:\n\n  A numeric vector of cut-points or a call to a `brk_*` function. The\n  resulting\n  [`breaks`](https://hughjonesd.github.io/santoku/reference/breaks-class.md)\n  object will be modified to add singleton breaks.\n\n- ...:\n\n  Passed to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n\n- n, prop:\n\n  Scalar. Provide either `n`, a number of values, or `prop`, a\n  proportion of `length(x)`. Values of `x` which occur at least this\n  often will get their own singleton break.\n\n## Value\n\n`chop_*` functions return a\n[`factor`](https://rdrr.io/r/base/factor.html) of the same length as\n`x`.\n\n`brk_*` functions return a\n[`function`](https://rdrr.io/r/base/function.html) to create `breaks`.\n\n`tab_*` functions return a contingency\n[`table`](https://rdrr.io/r/base/table.html).\n\n## Details\n\nThis function is **\\[experimental\\]**.\n\n## See also\n\n[`dissect()`](https://hughjonesd.github.io/santoku/reference/dissect.md)\nfor a different approach.\n\nOther chopping functions:\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md),\n[`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md),\n[`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md),\n[`chop_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md),\n[`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md),\n[`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md),\n[`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md),\n[`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md),\n[`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md),\n[`fillet()`](https://hughjonesd.github.io/santoku/reference/fillet.md)\n\n## Examples\n\n``` r\nx <- c(1:4, rep(5, 5), 6:10)\nchop_spikes(x, c(2, 7), n = 5)\n#>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  {5}     {5}     {5}     {5}     {5}    \n#> [10] (5, 7)  [7, 10] [7, 10] [7, 10] [7, 10]\n#> Levels: [1, 2) [2, 5) {5} (5, 7) [7, 10]\nchop_spikes(x, c(2, 7), prop = 0.25)\n#>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  {5}     {5}     {5}     {5}     {5}    \n#> [10] (5, 7)  [7, 10] [7, 10] [7, 10] [7, 10]\n#> Levels: [1, 2) [2, 5) {5} (5, 7) [7, 10]\nchop_spikes(x, brk_width(5), n = 5)\n#>  [1] [1, 5)  [1, 5)  [1, 5)  [1, 5)  {5}     {5}     {5}     {5}     {5}    \n#> [10] [6, 11] [6, 11] [6, 11] [6, 11] [6, 11]\n#> Levels: [1, 5) {5} [6, 11]\n\nset.seed(42)\nx <- runif(40, 0, 10)\nx <- sample(x, 200, replace = TRUE)\ntab_spikes(x, brk_width(2, 0), prop = 0.05)\n#>      [0, 2)      [2, 4)      [4, 6)      [6, 8)  [8, 9.057)     {9.057} \n#>          30          24          36          40          22          11 \n#> (9.057, 10] \n#>          37 \n```\n"
  },
  {
    "path": "docs/reference/chop_width.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Chop into fixed-width intervals — chop_width • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Chop into fixed-width intervals — chop_width\"><meta name=\"description\" content=\"chop_width() chops x into intervals of fixed width.\"><meta property=\"og:description\" content=\"chop_width() chops x into intervals of fixed width.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Chop into fixed-width intervals</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/chop-by-width.R\" class=\"external-link\"><code>R/chop-by-width.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/breaks-by-width.R\" class=\"external-link\"><code>R/breaks-by-width.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/tab.R\" class=\"external-link\"><code>R/tab.R</code></a></small>\n      <div class=\"d-none name\"><code>chop_width.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>chop_width()</code> chops <code>x</code> into intervals of fixed <code>width</code>.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">chop_width</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">width</span>, <span class=\"va\">start</span>, <span class=\"va\">...</span>, left <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sign.html\" class=\"external-link\">sign</a></span><span class=\"op\">(</span><span class=\"va\">width</span><span class=\"op\">)</span> <span class=\"op\">&gt;</span> <span class=\"fl\">0</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">brk_width</span><span class=\"op\">(</span><span class=\"va\">width</span>, <span class=\"va\">start</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># Default S3 method</span></span>\n<span><span class=\"fu\">brk_width</span><span class=\"op\">(</span><span class=\"va\">width</span>, <span class=\"va\">start</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">tab_width</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">width</span>, <span class=\"va\">start</span>, <span class=\"va\">...</span>, left <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sign.html\" class=\"external-link\">sign</a></span><span class=\"op\">(</span><span class=\"va\">width</span><span class=\"op\">)</span> <span class=\"op\">&gt;</span> <span class=\"fl\">0</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A vector.</p></dd>\n\n\n<dt id=\"arg-width\">width<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-width\"></a></dt>\n<dd><p>Width of intervals.</p></dd>\n\n\n<dt id=\"arg-start\">start<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-start\"></a></dt>\n<dd><p>Starting point for intervals. By default the smallest\nfinite <code>x</code> (largest if <code>width</code> is negative).</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Passed to <code><a href=\"chop.html\">chop()</a></code>.</p></dd>\n\n\n<dt id=\"arg-left\">left<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-left\"></a></dt>\n<dd><p>Logical. Left-closed or right-closed breaks?</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>chop_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></code> of the same length as <code>x</code>.</p>\n<p><code>brk_*</code> functions return a <code><a href=\"https://rdrr.io/r/base/function.html\" class=\"external-link\">function</a></code> to create <code>breaks</code>.</p>\n<p><code>tab_*</code> functions return a contingency <code><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>If <code>width</code> is negative, <code>chop_width()</code> sets <code>left = FALSE</code> and intervals will\ngo downwards from <code>start</code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><a href=\"brk_width-for-datetime.html\">brk_width-for-datetime</a></p>\n<p>Other chopping functions:\n<code><a href=\"chop.html\">chop()</a></code>,\n<code><a href=\"chop_equally.html\">chop_equally()</a></code>,\n<code><a href=\"chop_evenly.html\">chop_evenly()</a></code>,\n<code><a href=\"chop_fn.html\">chop_fn()</a></code>,\n<code><a href=\"chop_mean_sd.html\">chop_mean_sd()</a></code>,\n<code><a href=\"chop_n.html\">chop_n()</a></code>,\n<code><a href=\"chop_proportions.html\">chop_proportions()</a></code>,\n<code><a href=\"chop_quantiles.html\">chop_quantiles()</a></code>,\n<code><a href=\"chop_spikes.html\">chop_spikes()</a></code>,\n<code><a href=\"fillet.html\">fillet()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\">chop_width</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [1, 3)  [1, 3)  [3, 5)  [3, 5)  [5, 7)  [5, 7)  [7, 9)  [7, 9)  [9, 11]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] [9, 11]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 3) [3, 5) [5, 7) [7, 9) [9, 11]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop_width</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fl\">2</span>, start <span class=\"op\">=</span> <span class=\"fl\">0</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [0, 2)  [2, 4)  [2, 4)  [4, 6)  [4, 6)  [6, 8)  [6, 8)  [8, 10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [0, 2) [2, 4) [4, 6) [6, 8) [8, 10]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">chop_width</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">9</span>, <span class=\"op\">-</span><span class=\"fl\">2</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [1, 3] [1, 3] [1, 3] (3, 5] (3, 5] (5, 7] (5, 7] (7, 9] (7, 9]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 3] (3, 5] (5, 7] (7, 9]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\">brk_width</span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">0</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [0, 2)  [2, 4)  [2, 4)  [4, 6)  [4, 6)  [6, 8)  [6, 8)  [8, 10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [0, 2) [2, 4) [4, 6) [6, 8) [8, 10]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">tab_width</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fl\">2</span>, start <span class=\"op\">=</span> <span class=\"fl\">0</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [0, 2)  [2, 4)  [4, 6)  [6, 8) [8, 10] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       1       2       2       2       3 </span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/chop_width.md",
    "content": "# Chop into fixed-width intervals\n\n`chop_width()` chops `x` into intervals of fixed `width`.\n\n## Usage\n\n``` r\nchop_width(x, width, start, ..., left = sign(width) > 0)\n\nbrk_width(width, start)\n\n# Default S3 method\nbrk_width(width, start)\n\ntab_width(x, width, start, ..., left = sign(width) > 0)\n```\n\n## Arguments\n\n- x:\n\n  A vector.\n\n- width:\n\n  Width of intervals.\n\n- start:\n\n  Starting point for intervals. By default the smallest finite `x`\n  (largest if `width` is negative).\n\n- ...:\n\n  Passed to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n\n- left:\n\n  Logical. Left-closed or right-closed breaks?\n\n## Value\n\n`chop_*` functions return a\n[`factor`](https://rdrr.io/r/base/factor.html) of the same length as\n`x`.\n\n`brk_*` functions return a\n[`function`](https://rdrr.io/r/base/function.html) to create `breaks`.\n\n`tab_*` functions return a contingency\n[`table`](https://rdrr.io/r/base/table.html).\n\n## Details\n\nIf `width` is negative, `chop_width()` sets `left = FALSE` and intervals\nwill go downwards from `start`.\n\n## See also\n\n[brk_width-for-datetime](https://hughjonesd.github.io/santoku/reference/brk_width-for-datetime.md)\n\nOther chopping functions:\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md),\n[`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md),\n[`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md),\n[`chop_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md),\n[`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md),\n[`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md),\n[`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md),\n[`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md),\n[`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md),\n[`fillet()`](https://hughjonesd.github.io/santoku/reference/fillet.md)\n\n## Examples\n\n``` r\nchop_width(1:10, 2)\n#>  [1] [1, 3)  [1, 3)  [3, 5)  [3, 5)  [5, 7)  [5, 7)  [7, 9)  [7, 9)  [9, 11]\n#> [10] [9, 11]\n#> Levels: [1, 3) [3, 5) [5, 7) [7, 9) [9, 11]\n\nchop_width(1:10, 2, start = 0)\n#>  [1] [0, 2)  [2, 4)  [2, 4)  [4, 6)  [4, 6)  [6, 8)  [6, 8)  [8, 10] [8, 10]\n#> [10] [8, 10]\n#> Levels: [0, 2) [2, 4) [4, 6) [6, 8) [8, 10]\n\nchop_width(1:9, -2)\n#> [1] [1, 3] [1, 3] [1, 3] (3, 5] (3, 5] (5, 7] (5, 7] (7, 9] (7, 9]\n#> Levels: [1, 3] (3, 5] (5, 7] (7, 9]\n\nchop(1:10, brk_width(2, 0))\n#>  [1] [0, 2)  [2, 4)  [2, 4)  [4, 6)  [4, 6)  [6, 8)  [6, 8)  [8, 10] [8, 10]\n#> [10] [8, 10]\n#> Levels: [0, 2) [2, 4) [4, 6) [6, 8) [8, 10]\n\ntab_width(1:10, 2, start = 0)\n#>  [0, 2)  [2, 4)  [4, 6)  [6, 8) [8, 10] \n#>       1       2       2       2       3 \n```\n"
  },
  {
    "path": "docs/reference/dissect.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Cut data into intervals, separating out common values — dissect • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Cut data into intervals, separating out common values — dissect\"><meta name=\"description\" content=\"Sometimes it's useful to separate out common elements of x.\ndissect() chops x, but puts common elements of x (&quot;spikes&quot;)\ninto separate categories.\"><meta property=\"og:description\" content=\"Sometimes it's useful to separate out common elements of x.\ndissect() chops x, but puts common elements of x (&quot;spikes&quot;)\ninto separate categories.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Cut data into intervals, separating out common values</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/chop-isolates.R\" class=\"external-link\"><code>R/chop-isolates.R</code></a>, <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/tab.R\" class=\"external-link\"><code>R/tab.R</code></a></small>\n      <div class=\"d-none name\"><code>dissect.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Sometimes it's useful to separate out common elements of <code>x</code>.\n<code>dissect()</code> chops <code>x</code>, but puts common elements of <code>x</code> (\"spikes\")\ninto separate categories.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">dissect</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  <span class=\"va\">breaks</span>,</span>\n<span>  <span class=\"va\">...</span>,</span>\n<span>  n <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  prop <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  spike_labels <span class=\"op\">=</span> <span class=\"st\">\"{{{l}}}\"</span>,</span>\n<span>  exclude_spikes <span class=\"op\">=</span> <span class=\"cn\">FALSE</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">tab_dissect</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">breaks</span>, <span class=\"va\">...</span>, n <span class=\"op\">=</span> <span class=\"cn\">NULL</span>, prop <span class=\"op\">=</span> <span class=\"cn\">NULL</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x-breaks-\">x, breaks, ...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x-breaks-\"></a></dt>\n<dd><p>Passed to <code><a href=\"chop.html\">chop()</a></code>.</p></dd>\n\n\n<dt id=\"arg-n-prop\">n, prop<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-n-prop\"></a></dt>\n<dd><p>Scalar. Provide either <code>n</code>, a number of values, or <code>prop</code>,\na proportion of <code>length(x)</code>. Values of <code>x</code> which occur at least this\noften will get their own singleton break.</p></dd>\n\n\n<dt id=\"arg-spike-labels\">spike_labels<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-spike-labels\"></a></dt>\n<dd><p><a href=\"https://glue.tidyverse.org/reference/glue.html\" class=\"external-link\">Glue</a> string for spike labels. Use <code>\"{l}\"</code>\nfor the spike value.</p></dd>\n\n\n<dt id=\"arg-exclude-spikes\">exclude_spikes<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-exclude-spikes\"></a></dt>\n<dd><p>Logical. Exclude spikes before chopping <code>x</code>? This\ncan affect the location of data-dependent breaks.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>dissect()</code> returns the result of <code><a href=\"chop.html\">chop()</a></code>, but with common values put into\nseparate factor levels.</p>\n<p><code>tab_dissect()</code> returns a contingency <a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table()</a>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Unlike <code><a href=\"chop_spikes.html\">chop_spikes()</a></code>, <code>dissect()</code> doesn't break up\nintervals which contain a spike. As a result, unlike <code>chop_*</code> functions,\n<code>dissect()</code> does not chop <code>x</code> into disjoint intervals. See the examples.</p>\n<p>If breaks are data-dependent, their labels may be misleading after common\nelements have been removed. See the example below. To get round this,\nset <code>exclude_spikes</code> to <code>TRUE</code>. Then breaks will be calculated after\nremoving spikes from the data.</p>\n<p>Levels of the result are ordered by the minimum element in each level. As\na result, if <code>drop = FALSE</code>, empty levels will be placed last.</p>\n<p>This function is <a href=\"https://lifecycle.r-lib.org/articles/stages.html#experimental\" class=\"external-link\"><img src=\"figures/lifecycle-experimental.svg\" alt=\"[Experimental]\"></a>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p><code><a href=\"chop_spikes.html\">chop_spikes()</a></code> for a different approach.</p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">3</span>, <span class=\"fl\">3</span>, <span class=\"fl\">3</span>, <span class=\"fl\">4</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">dissect</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">4</span><span class=\"op\">)</span>, n <span class=\"op\">=</span> <span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [2, 4] {3}    {3}    {3}    [2, 4]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [2, 4] {3}</span>\n<span class=\"r-in\"><span><span class=\"fu\">dissect</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"chop_width.html\">brk_width</a></span><span class=\"op\">(</span><span class=\"fl\">2</span><span class=\"op\">)</span>, prop <span class=\"op\">=</span> <span class=\"fl\">0.5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] [2, 4] {3}    {3}    {3}    [2, 4]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [2, 4] {3}</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">42</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"fl\">40</span>, <span class=\"fl\">0</span>, <span class=\"fl\">10</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sample.html\" class=\"external-link\">sample</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fl\">200</span>, replace <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Compare:</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/table.html\" class=\"external-link\">table</a></span><span class=\"op\">(</span><span class=\"fu\">dissect</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"chop_width.html\">brk_width</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">0</span><span class=\"op\">)</span>, prop <span class=\"op\">=</span> <span class=\"fl\">0.05</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [0, 2)  [2, 4)  [4, 6)  [6, 8) [8, 10] {9.057} </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>      30      24      36      40      59      11 </span>\n<span class=\"r-in\"><span><span class=\"co\"># Versus:</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop_spikes.html\">tab_spikes</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"chop_width.html\">brk_width</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">0</span><span class=\"op\">)</span>, prop <span class=\"op\">=</span> <span class=\"fl\">0.05</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>      [0, 2)      [2, 4)      [4, 6)      [6, 8)  [8, 9.057)     {9.057} </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>          30          24          36          40          22          11 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> (9.057, 10] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>          37 </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Potentially confusing data-dependent breaks:</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/Random.html\" class=\"external-link\">set.seed</a></span><span class=\"op\">(</span><span class=\"fl\">42</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Normal.html\" class=\"external-link\">rnorm</a></span><span class=\"op\">(</span><span class=\"fl\">99</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">x</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">9</span><span class=\"op\">]</span> <span class=\"op\">&lt;-</span> <span class=\"va\">x</span><span class=\"op\">[</span><span class=\"fl\">1</span><span class=\"op\">]</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop_quantiles.html\">tab_quantiles</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">2</span><span class=\"op\">/</span><span class=\"fl\">3</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     [0%, 33.33%) [33.33%, 66.67%)   [66.67%, 100%] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>               33               33               33 </span>\n<span class=\"r-in\"><span><span class=\"fu\">tab_dissect</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"chop_quantiles.html\">brk_quantiles</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">2</span><span class=\"op\">/</span><span class=\"fl\">3</span><span class=\"op\">)</span>, n <span class=\"op\">=</span> <span class=\"fl\">9</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     [0%, 33.33%) [33.33%, 66.67%)   [66.67%, 100%]          {1.371} </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>               33               33               24                9 </span>\n<span class=\"r-in\"><span><span class=\"co\"># Calculate quantiles excluding spikes:</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\">tab_dissect</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"fu\"><a href=\"chop_quantiles.html\">brk_quantiles</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">2</span><span class=\"op\">/</span><span class=\"fl\">3</span><span class=\"op\">)</span>, n <span class=\"op\">=</span> <span class=\"fl\">9</span>, exclude_spikes <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>     [0%, 33.33%) [33.33%, 66.67%)   [66.67%, 100%]          {1.371} </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>               30               30               30                9 </span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/dissect.md",
    "content": "# Cut data into intervals, separating out common values\n\nSometimes it's useful to separate out common elements of `x`.\n`dissect()` chops `x`, but puts common elements of `x` (\"spikes\") into\nseparate categories.\n\n## Usage\n\n``` r\ndissect(\n  x,\n  breaks,\n  ...,\n  n = NULL,\n  prop = NULL,\n  spike_labels = \"{{{l}}}\",\n  exclude_spikes = FALSE\n)\n\ntab_dissect(x, breaks, ..., n = NULL, prop = NULL)\n```\n\n## Arguments\n\n- x, breaks, ...:\n\n  Passed to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n\n- n, prop:\n\n  Scalar. Provide either `n`, a number of values, or `prop`, a\n  proportion of `length(x)`. Values of `x` which occur at least this\n  often will get their own singleton break.\n\n- spike_labels:\n\n  [Glue](https://glue.tidyverse.org/reference/glue.html) string for\n  spike labels. Use `\"{l}\"` for the spike value.\n\n- exclude_spikes:\n\n  Logical. Exclude spikes before chopping `x`? This can affect the\n  location of data-dependent breaks.\n\n## Value\n\n`dissect()` returns the result of\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md), but\nwith common values put into separate factor levels.\n\n`tab_dissect()` returns a contingency\n[table()](https://rdrr.io/r/base/table.html).\n\n## Details\n\nUnlike\n[`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md),\n`dissect()` doesn't break up intervals which contain a spike. As a\nresult, unlike `chop_*` functions, `dissect()` does not chop `x` into\ndisjoint intervals. See the examples.\n\nIf breaks are data-dependent, their labels may be misleading after\ncommon elements have been removed. See the example below. To get round\nthis, set `exclude_spikes` to `TRUE`. Then breaks will be calculated\nafter removing spikes from the data.\n\nLevels of the result are ordered by the minimum element in each level.\nAs a result, if `drop = FALSE`, empty levels will be placed last.\n\nThis function is **\\[experimental\\]**.\n\n## See also\n\n[`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md)\nfor a different approach.\n\n## Examples\n\n``` r\nx <- c(2, 3, 3, 3, 4)\ndissect(x, c(2, 4), n = 3)\n#> [1] [2, 4] {3}    {3}    {3}    [2, 4]\n#> Levels: [2, 4] {3}\ndissect(x, brk_width(2), prop = 0.5)\n#> [1] [2, 4] {3}    {3}    {3}    [2, 4]\n#> Levels: [2, 4] {3}\n\nset.seed(42)\nx <- runif(40, 0, 10)\nx <- sample(x, 200, replace = TRUE)\n# Compare:\ntable(dissect(x, brk_width(2, 0), prop = 0.05))\n#> \n#>  [0, 2)  [2, 4)  [4, 6)  [6, 8) [8, 10] {9.057} \n#>      30      24      36      40      59      11 \n# Versus:\ntab_spikes(x, brk_width(2, 0), prop = 0.05)\n#>      [0, 2)      [2, 4)      [4, 6)      [6, 8)  [8, 9.057)     {9.057} \n#>          30          24          36          40          22          11 \n#> (9.057, 10] \n#>          37 \n\n# Potentially confusing data-dependent breaks:\nset.seed(42)\nx <- rnorm(99)\nx[1:9] <- x[1]\ntab_quantiles(x, 1:2/3)\n#>     [0%, 33.33%) [33.33%, 66.67%)   [66.67%, 100%] \n#>               33               33               33 \ntab_dissect(x, brk_quantiles(1:2/3), n = 9)\n#>     [0%, 33.33%) [33.33%, 66.67%)   [66.67%, 100%]          {1.371} \n#>               33               33               24                9 \n# Calculate quantiles excluding spikes:\ntab_dissect(x, brk_quantiles(1:2/3), n = 9, exclude_spikes = TRUE)\n#>     [0%, 33.33%) [33.33%, 66.67%)   [66.67%, 100%]          {1.371} \n#>               30               30               30                9 \n```\n"
  },
  {
    "path": "docs/reference/exactly.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Define singleton intervals explicitly — exactly • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Define singleton intervals explicitly — exactly\"><meta name=\"description\" content=\"exactly() duplicates its input.\nIt lets you define singleton intervals like this: chop(x, c(1, exactly(2), 3)).\nThis is the same as chop(x, c(1, 2, 2, 3)) but conveys your intent more\nclearly.\"><meta property=\"og:description\" content=\"exactly() duplicates its input.\nIt lets you define singleton intervals like this: chop(x, c(1, exactly(2), 3)).\nThis is the same as chop(x, c(1, 2, 2, 3)) but conveys your intent more\nclearly.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Define singleton intervals explicitly</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/utils.R\" class=\"external-link\"><code>R/utils.R</code></a></small>\n      <div class=\"d-none name\"><code>exactly.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>exactly()</code> duplicates its input.\nIt lets you define singleton intervals like this: <code>chop(x, c(1, exactly(2), 3))</code>.\nThis is the same as <code>chop(x, c(1, 2, 2, 3))</code> but conveys your intent more\nclearly.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">exactly</span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A numeric vector.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>The same as <code>rep(x, each = 2)</code>.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fu\">exactly</span><span class=\"op\">(</span><span class=\"fl\">5</span><span class=\"op\">)</span>, <span class=\"fl\">8</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  {5}     (5, 8)  (5, 8)  [8, 10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2) [2, 5) {5} (5, 8) [8, 10]</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># same:</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  {5}     (5, 8)  (5, 8)  [8, 10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [10] [8, 10]</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [1, 2) [2, 5) {5} (5, 8) [8, 10]</span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/exactly.md",
    "content": "# Define singleton intervals explicitly\n\n`exactly()` duplicates its input. It lets you define singleton intervals\nlike this: `chop(x, c(1, exactly(2), 3))`. This is the same as\n`chop(x, c(1, 2, 2, 3))` but conveys your intent more clearly.\n\n## Usage\n\n``` r\nexactly(x)\n```\n\n## Arguments\n\n- x:\n\n  A numeric vector.\n\n## Value\n\nThe same as `rep(x, each = 2)`.\n\n## Examples\n\n``` r\nchop(1:10, c(2, exactly(5), 8))\n#>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  {5}     (5, 8)  (5, 8)  [8, 10] [8, 10]\n#> [10] [8, 10]\n#> Levels: [1, 2) [2, 5) {5} (5, 8) [8, 10]\n\n# same:\nchop(1:10, c(2, 5, 5, 8))\n#>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  {5}     (5, 8)  (5, 8)  [8, 10] [8, 10]\n#> [10] [8, 10]\n#> Levels: [1, 2) [2, 5) {5} (5, 8) [8, 10]\n```\n"
  },
  {
    "path": "docs/reference/fillet.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Chop data precisely (for programmers) — fillet • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Chop data precisely (for programmers) — fillet\"><meta name=\"description\" content=\"fillet() calls chop() with extend = FALSE and drop = FALSE. This\nensures that you get only the breaks and labels you ask for. When\nprogramming, consider using fillet() instead of chop().\"><meta property=\"og:description\" content=\"fillet() calls chop() with extend = FALSE and drop = FALSE. This\nensures that you get only the breaks and labels you ask for. When\nprogramming, consider using fillet() instead of chop().\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Chop data precisely (for programmers)</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/chop.R\" class=\"external-link\"><code>R/chop.R</code></a></small>\n      <div class=\"d-none name\"><code>fillet.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>fillet()</code> calls <code><a href=\"chop.html\">chop()</a></code> with <code>extend = FALSE</code> and <code>drop = FALSE</code>. This\nensures that you get only the <code>breaks</code> and <code>labels</code> you ask for. When\nprogramming, consider using <code>fillet()</code> instead of <code><a href=\"chop.html\">chop()</a></code>.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">fillet</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">x</span>,</span>\n<span>  <span class=\"va\">breaks</span>,</span>\n<span>  labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"lbl_intervals.html\">lbl_intervals</a></span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  left <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  close_end <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  raw <span class=\"op\">=</span> <span class=\"cn\">NULL</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>A vector.</p></dd>\n\n\n<dt id=\"arg-breaks\">breaks<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-breaks\"></a></dt>\n<dd><p>A numeric vector of cut-points, or a function to create\ncut-points from <code>x</code>.</p></dd>\n\n\n<dt id=\"arg-labels\">labels<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-labels\"></a></dt>\n<dd><p>A character vector of labels or a function to create labels.</p></dd>\n\n\n<dt id=\"arg-left\">left<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-left\"></a></dt>\n<dd><p>Logical. Left-closed or right-closed breaks?</p></dd>\n\n\n<dt id=\"arg-close-end\">close_end<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-close-end\"></a></dt>\n<dd><p>Logical. Close last break at right? (If <code>left</code> is <code>FALSE</code>,\nclose first break at left?)</p></dd>\n\n\n<dt id=\"arg-raw\">raw<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-raw\"></a></dt>\n<dd><p>Logical. Use raw values in labels?</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>fillet()</code> returns a <code><a href=\"https://rdrr.io/r/base/factor.html\" class=\"external-link\">factor</a></code> of the same length as\n<code>x</code>, representing the intervals containing the value of <code>x</code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other chopping functions:\n<code><a href=\"chop.html\">chop()</a></code>,\n<code><a href=\"chop_equally.html\">chop_equally()</a></code>,\n<code><a href=\"chop_evenly.html\">chop_evenly()</a></code>,\n<code><a href=\"chop_fn.html\">chop_fn()</a></code>,\n<code><a href=\"chop_mean_sd.html\">chop_mean_sd()</a></code>,\n<code><a href=\"chop_n.html\">chop_n()</a></code>,\n<code><a href=\"chop_proportions.html\">chop_proportions()</a></code>,\n<code><a href=\"chop_quantiles.html\">chop_quantiles()</a></code>,\n<code><a href=\"chop_spikes.html\">chop_spikes()</a></code>,\n<code><a href=\"chop_width.html\">chop_width()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\">fillet</span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] &lt;NA&gt;   [2, 5) [2, 5) [2, 5) [5, 8] [5, 8] [5, 8] [5, 8] &lt;NA&gt;   &lt;NA&gt;  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: [2, 5) [5, 8]</span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/fillet.md",
    "content": "# Chop data precisely (for programmers)\n\n`fillet()` calls\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md) with\n`extend = FALSE` and `drop = FALSE`. This ensures that you get only the\n`breaks` and `labels` you ask for. When programming, consider using\n`fillet()` instead of\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n\n## Usage\n\n``` r\nfillet(\n  x,\n  breaks,\n  labels = lbl_intervals(),\n  left = TRUE,\n  close_end = TRUE,\n  raw = NULL\n)\n```\n\n## Arguments\n\n- x:\n\n  A vector.\n\n- breaks:\n\n  A numeric vector of cut-points, or a function to create cut-points\n  from `x`.\n\n- labels:\n\n  A character vector of labels or a function to create labels.\n\n- left:\n\n  Logical. Left-closed or right-closed breaks?\n\n- close_end:\n\n  Logical. Close last break at right? (If `left` is `FALSE`, close first\n  break at left?)\n\n- raw:\n\n  Logical. Use raw values in labels?\n\n## Value\n\n`fillet()` returns a [`factor`](https://rdrr.io/r/base/factor.html) of\nthe same length as `x`, representing the intervals containing the value\nof `x`.\n\n## See also\n\nOther chopping functions:\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md),\n[`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md),\n[`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md),\n[`chop_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md),\n[`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md),\n[`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md),\n[`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md),\n[`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md),\n[`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md),\n[`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md)\n\n## Examples\n\n``` r\nfillet(1:10, c(2, 5, 8))\n#>  [1] <NA>   [2, 5) [2, 5) [2, 5) [5, 8] [5, 8] [5, 8] [5, 8] <NA>   <NA>  \n#> Levels: [2, 5) [5, 8]\n```\n"
  },
  {
    "path": "docs/reference/format.breaks.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/breaks-class.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/breaks-class.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/index.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Package index • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Package index\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-index\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Package index</h1>\n    </div>\n\n    <div class=\"section level2\">\n      <h2 id=\"package-overview\">Package overview<a class=\"anchor\" aria-label=\"anchor\" href=\"#package-overview\"></a></h2>\n\n\n\n      <dl></dl></div><div class=\"section level2\">\n\n\n\n\n      <dl><dt>\n\n          <code><a href=\"santoku-package.html\">santoku</a></code> <code><a href=\"santoku-package.html\">santoku-package</a></code>\n\n        </dt>\n        <dd>A versatile cutting tool for R: package overview and options</dd>\n      </dl></div><div class=\"section level2\">\n      <h2 id=\"basic-chop-functions\">Basic chop functions<a class=\"anchor\" aria-label=\"anchor\" href=\"#basic-chop-functions\"></a></h2>\n\n      <div class=\"section-desc\"><p>Cut a vector into intervals</p></div>\n\n      <dl></dl></div><div class=\"section level2\">\n\n\n\n\n      <dl><dt>\n\n          <code><a href=\"chop.html\">chop()</a></code> <code><a href=\"chop.html\">kiru()</a></code> <code><a href=\"chop.html\">tab()</a></code>\n\n        </dt>\n        <dd>Cut data into intervals</dd>\n\n        <dt>\n\n          <code><a href=\"fillet.html\">fillet()</a></code>\n\n        </dt>\n        <dd>Chop data precisely (for programmers)</dd>\n      </dl></div><div class=\"section level2\">\n      <h2 id=\"chopping-by-width\">Chopping by width<a class=\"anchor\" aria-label=\"anchor\" href=\"#chopping-by-width\"></a></h2>\n\n      <div class=\"section-desc\"><p>Cut a vector into intervals defined by width</p></div>\n\n      <dl></dl></div><div class=\"section level2\">\n\n\n\n\n      <dl><dt>\n\n          <code><a href=\"brk_width-for-datetime.html\">brk_width(<i>&lt;Duration&gt;</i>)</a></code>\n\n        </dt>\n        <dd>Equal-width intervals for dates or datetimes</dd>\n\n        <dt>\n\n          <code><a href=\"chop_width.html\">chop_width()</a></code> <code><a href=\"chop_width.html\">brk_width()</a></code> <code><a href=\"chop_width.html\">tab_width()</a></code>\n\n        </dt>\n        <dd>Chop into fixed-width intervals</dd>\n\n        <dt>\n\n          <code><a href=\"chop_proportions.html\">chop_proportions()</a></code> <code><a href=\"chop_proportions.html\">brk_proportions()</a></code> <code><a href=\"chop_proportions.html\">tab_proportions()</a></code>\n\n        </dt>\n        <dd>Chop into proportions of the range of x</dd>\n\n        <dt>\n\n          <code><a href=\"chop_evenly.html\">chop_evenly()</a></code> <code><a href=\"chop_evenly.html\">brk_evenly()</a></code> <code><a href=\"chop_evenly.html\">tab_evenly()</a></code>\n\n        </dt>\n        <dd>Chop into equal-width intervals</dd>\n      </dl></div><div class=\"section level2\">\n      <h2 id=\"chopping-by-n\">Chopping by n<a class=\"anchor\" aria-label=\"anchor\" href=\"#chopping-by-n\"></a></h2>\n\n      <div class=\"section-desc\"><p>Cut a vector into intervals defined by number of elements</p></div>\n\n      <dl></dl></div><div class=\"section level2\">\n\n\n\n\n      <dl><dt>\n\n          <code><a href=\"chop_n.html\">chop_n()</a></code> <code><a href=\"chop_n.html\">brk_n()</a></code> <code><a href=\"chop_n.html\">tab_n()</a></code>\n\n        </dt>\n        <dd>Chop into fixed-sized groups</dd>\n\n        <dt>\n\n          <code><a href=\"chop_quantiles.html\">chop_quantiles()</a></code> <code><a href=\"chop_quantiles.html\">chop_deciles()</a></code> <code><a href=\"chop_quantiles.html\">brk_quantiles()</a></code> <code><a href=\"chop_quantiles.html\">tab_quantiles()</a></code> <code><a href=\"chop_quantiles.html\">tab_deciles()</a></code>\n\n        </dt>\n        <dd>Chop by quantiles</dd>\n\n        <dt>\n\n          <code><a href=\"chop_equally.html\">chop_equally()</a></code> <code><a href=\"chop_equally.html\">brk_equally()</a></code> <code><a href=\"chop_equally.html\">tab_equally()</a></code>\n\n        </dt>\n        <dd>Chop equal-sized groups</dd>\n      </dl></div><div class=\"section level2\">\n      <h2 id=\"chopping-and-separating\">Chopping and separating<a class=\"anchor\" aria-label=\"anchor\" href=\"#chopping-and-separating\"></a></h2>\n\n      <div class=\"section-desc\"><p>Cut a vector into intervals, separating out common values</p></div>\n\n      <dl></dl></div><div class=\"section level2\">\n\n\n\n\n      <dl><dt>\n\n          <code><a href=\"chop_spikes.html\">chop_spikes()</a></code> <code><a href=\"chop_spikes.html\">brk_spikes()</a></code> <code><a href=\"chop_spikes.html\">tab_spikes()</a></code>\n\n        </dt>\n        <dd>Chop common values into singleton intervals</dd>\n\n        <dt>\n\n          <code><a href=\"dissect.html\">dissect()</a></code> <code><a href=\"dissect.html\">tab_dissect()</a></code>\n\n        </dt>\n        <dd>Cut data into intervals, separating out common values</dd>\n      </dl></div><div class=\"section level2\">\n      <h2 id=\"other-chop-functions\">Other chop functions<a class=\"anchor\" aria-label=\"anchor\" href=\"#other-chop-functions\"></a></h2>\n\n      <div class=\"section-desc\"><p>Miscellaneous ways to cut a vector into intervals</p></div>\n\n      <dl></dl></div><div class=\"section level2\">\n\n\n\n\n      <dl><dt>\n\n          <code><a href=\"chop_mean_sd.html\">chop_mean_sd()</a></code> <code><a href=\"chop_mean_sd.html\">brk_mean_sd()</a></code> <code><a href=\"chop_mean_sd.html\">tab_mean_sd()</a></code>\n\n        </dt>\n        <dd>Chop by standard deviations</dd>\n\n        <dt>\n\n          <code><a href=\"chop_pretty.html\">chop_pretty()</a></code> <code><a href=\"chop_pretty.html\">brk_pretty()</a></code> <code><a href=\"chop_pretty.html\">tab_pretty()</a></code>\n\n        </dt>\n        <dd>Chop using pretty breakpoints</dd>\n\n        <dt>\n\n          <code><a href=\"chop_fn.html\">chop_fn()</a></code> <code><a href=\"chop_fn.html\">brk_fn()</a></code> <code><a href=\"chop_fn.html\">tab_fn()</a></code>\n\n        </dt>\n        <dd>Chop using an existing function</dd>\n\n        <dt>\n\n          <code><a href=\"brk_default.html\">brk_default()</a></code>\n\n        </dt>\n        <dd>Create a standard set of breaks</dd>\n\n        <dt>\n\n          <code><a href=\"brk_manual.html\">brk_manual()</a></code>\n\n        </dt>\n        <dd>Create a <code>breaks</code> object manually</dd>\n      </dl></div><div class=\"section level2\">\n      <h2 id=\"label-functions\">Label functions<a class=\"anchor\" aria-label=\"anchor\" href=\"#label-functions\"></a></h2>\n\n      <div class=\"section-desc\"><p>Specify how to label the chopped intervals</p></div>\n\n      <dl></dl></div><div class=\"section level2\">\n\n\n\n\n      <dl><dt>\n\n          <code><a href=\"lbl_dash.html\">lbl_dash()</a></code>\n\n        </dt>\n        <dd>Label chopped intervals like 1-4, 4-5, ...</dd>\n\n        <dt>\n\n          <code><a href=\"lbl_datetime.html\">lbl_date()</a></code> <code><a href=\"lbl_datetime.html\">lbl_datetime()</a></code>\n          <span class=\"badge lifecycle lifecycle-experimental\">experimental</span>\n        </dt>\n        <dd>Label dates and datetimes</dd>\n\n        <dt>\n\n          <code><a href=\"lbl_discrete.html\">lbl_discrete()</a></code>\n\n        </dt>\n        <dd>Label discrete data</dd>\n\n        <dt>\n\n          <code><a href=\"lbl_endpoints.html\">lbl_endpoints()</a></code> <code><a href=\"lbl_endpoints.html\">lbl_endpoint()</a></code>\n\n        </dt>\n        <dd>Label chopped intervals by their left or right endpoints</dd>\n\n        <dt>\n\n          <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\n\n        </dt>\n        <dd>Label chopped intervals using the <code>glue</code> package</dd>\n\n        <dt>\n\n          <code><a href=\"lbl_intervals.html\">lbl_intervals()</a></code>\n\n        </dt>\n        <dd>Label chopped intervals using set notation</dd>\n\n        <dt>\n\n          <code><a href=\"lbl_midpoints.html\">lbl_midpoints()</a></code>\n\n        </dt>\n        <dd>Label chopped intervals by their midpoints</dd>\n\n        <dt>\n\n          <code><a href=\"lbl_seq.html\">lbl_seq()</a></code>\n\n        </dt>\n        <dd>Label chopped intervals in sequence</dd>\n      </dl></div><div class=\"section level2\">\n      <h2 id=\"miscellaneous\">Miscellaneous<a class=\"anchor\" aria-label=\"anchor\" href=\"#miscellaneous\"></a></h2>\n\n      <div class=\"section-desc\"><p>Other helper functions</p></div>\n\n      <dl></dl></div><div class=\"section level2\">\n\n\n\n\n      <dl><dt>\n\n          <code><a href=\"breaks-class.html\">format(<i>&lt;breaks&gt;</i>)</a></code> <code><a href=\"breaks-class.html\">print(<i>&lt;breaks&gt;</i>)</a></code> <code><a href=\"breaks-class.html\">is.breaks()</a></code>\n\n        </dt>\n        <dd>Class representing a set of intervals</dd>\n\n        <dt>\n\n          <code><a href=\"exactly.html\">exactly()</a></code>\n\n        </dt>\n        <dd>Define singleton intervals explicitly</dd>\n\n        <dt>\n\n          <code><a href=\"non-standard-types.html\">non-standard-types</a></code>\n\n        </dt>\n        <dd>Tips for chopping non-standard types</dd>\n\n        <dt>\n\n          <code><a href=\"percent.html\">percent()</a></code>\n\n        </dt>\n        <dd>Simple percentage formatter</dd>\n      </dl></div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/index.md",
    "content": "# Package index\n\n## Package overview\n\n- [`santoku`](https://hughjonesd.github.io/santoku/reference/santoku-package.md)\n  [`santoku-package`](https://hughjonesd.github.io/santoku/reference/santoku-package.md)\n  : A versatile cutting tool for R: package overview and options\n\n## Basic chop functions\n\nCut a vector into intervals\n\n- [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n  [`kiru()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n  [`tab()`](https://hughjonesd.github.io/santoku/reference/chop.md) :\n  Cut data into intervals\n- [`fillet()`](https://hughjonesd.github.io/santoku/reference/fillet.md)\n  : Chop data precisely (for programmers)\n\n## Chopping by width\n\nCut a vector into intervals defined by width\n\n- [`brk_width(`*`<Duration>`*`)`](https://hughjonesd.github.io/santoku/reference/brk_width-for-datetime.md)\n  : Equal-width intervals for dates or datetimes\n- [`chop_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md)\n  [`brk_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md)\n  [`tab_width()`](https://hughjonesd.github.io/santoku/reference/chop_width.md)\n  : Chop into fixed-width intervals\n- [`chop_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md)\n  [`brk_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md)\n  [`tab_proportions()`](https://hughjonesd.github.io/santoku/reference/chop_proportions.md)\n  : Chop into proportions of the range of x\n- [`chop_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md)\n  [`brk_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md)\n  [`tab_evenly()`](https://hughjonesd.github.io/santoku/reference/chop_evenly.md)\n  : Chop into equal-width intervals\n\n## Chopping by n\n\nCut a vector into intervals defined by number of elements\n\n- [`chop_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md)\n  [`brk_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md)\n  [`tab_n()`](https://hughjonesd.github.io/santoku/reference/chop_n.md)\n  : Chop into fixed-sized groups\n- [`chop_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  [`chop_deciles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  [`brk_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  [`tab_quantiles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  [`tab_deciles()`](https://hughjonesd.github.io/santoku/reference/chop_quantiles.md)\n  : Chop by quantiles\n- [`chop_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md)\n  [`brk_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md)\n  [`tab_equally()`](https://hughjonesd.github.io/santoku/reference/chop_equally.md)\n  : Chop equal-sized groups\n\n## Chopping and separating\n\nCut a vector into intervals, separating out common values\n\n- [`chop_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md)\n  [`brk_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md)\n  [`tab_spikes()`](https://hughjonesd.github.io/santoku/reference/chop_spikes.md)\n  : Chop common values into singleton intervals\n- [`dissect()`](https://hughjonesd.github.io/santoku/reference/dissect.md)\n  [`tab_dissect()`](https://hughjonesd.github.io/santoku/reference/dissect.md)\n  : Cut data into intervals, separating out common values\n\n## Other chop functions\n\nMiscellaneous ways to cut a vector into intervals\n\n- [`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md)\n  [`brk_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md)\n  [`tab_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md)\n  : Chop by standard deviations\n\n- [`chop_pretty()`](https://hughjonesd.github.io/santoku/reference/chop_pretty.md)\n  [`brk_pretty()`](https://hughjonesd.github.io/santoku/reference/chop_pretty.md)\n  [`tab_pretty()`](https://hughjonesd.github.io/santoku/reference/chop_pretty.md)\n  : Chop using pretty breakpoints\n\n- [`chop_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md)\n  [`brk_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md)\n  [`tab_fn()`](https://hughjonesd.github.io/santoku/reference/chop_fn.md)\n  : Chop using an existing function\n\n- [`brk_default()`](https://hughjonesd.github.io/santoku/reference/brk_default.md)\n  : Create a standard set of breaks\n\n- [`brk_manual()`](https://hughjonesd.github.io/santoku/reference/brk_manual.md)\n  :\n\n  Create a `breaks` object manually\n\n## Label functions\n\nSpecify how to label the chopped intervals\n\n- [`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md)\n  : Label chopped intervals like 1-4, 4-5, ...\n\n- [`lbl_date()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md)\n  [`lbl_datetime()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md)\n  **\\[experimental\\]** : Label dates and datetimes\n\n- [`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md)\n  : Label discrete data\n\n- [`lbl_endpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md)\n  [`lbl_endpoint()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md)\n  : Label chopped intervals by their left or right endpoints\n\n- [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  :\n\n  Label chopped intervals using the `glue` package\n\n- [`lbl_intervals()`](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md)\n  : Label chopped intervals using set notation\n\n- [`lbl_midpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_midpoints.md)\n  : Label chopped intervals by their midpoints\n\n- [`lbl_seq()`](https://hughjonesd.github.io/santoku/reference/lbl_seq.md)\n  : Label chopped intervals in sequence\n\n## Miscellaneous\n\nOther helper functions\n\n- [`format(`*`<breaks>`*`)`](https://hughjonesd.github.io/santoku/reference/breaks-class.md)\n  [`print(`*`<breaks>`*`)`](https://hughjonesd.github.io/santoku/reference/breaks-class.md)\n  [`is.breaks()`](https://hughjonesd.github.io/santoku/reference/breaks-class.md)\n  : Class representing a set of intervals\n- [`exactly()`](https://hughjonesd.github.io/santoku/reference/exactly.md)\n  : Define singleton intervals explicitly\n- [`non-standard-types`](https://hughjonesd.github.io/santoku/reference/non-standard-types.md)\n  : Tips for chopping non-standard types\n- [`percent()`](https://hughjonesd.github.io/santoku/reference/percent.md)\n  : Simple percentage formatter\n"
  },
  {
    "path": "docs/reference/is.breaks.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/breaks-class.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/breaks-class.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/kiru.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/knife.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"\n\nknife() is deprecated in favour of purrr::partial().\"><title>Deprecated — knife • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../favicon-16x16.png\"><link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../favicon-32x32.png\"><link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"120x120\" href=\"../apple-touch-icon-120x120.png\"><link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"76x76\" href=\"../apple-touch-icon-76x76.png\"><link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"60x60\" href=\"../apple-touch-icon-60x60.png\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.1.0/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.1.0/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><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\"><!-- bootstrap-toc --><script src=\"https://cdn.rawgit.com/afeld/bootstrap-toc/v1.0.1/dist/bootstrap-toc.min.js\"></script><!-- headroom.js --><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><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Deprecated — knife\"><meta property=\"og:description\" content=\"\n\nknife() is deprecated in favour of purrr::partial().\"><meta property=\"og:image\" content=\"/logo.png\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><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><!--[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]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">0.6.0.9000</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a>\n</li>\n<li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a>\n  </div>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-tutorials\">Tutorials</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\">\n    <a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to Santoku</a>\n    <a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Deprecated</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/knife.R\" class=\"external-link\"><code>R/knife.R</code></a></small>\n      <div class=\"d-none name\"><code>knife.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><a href=\"https://lifecycle.r-lib.org/articles/stages.html#soft-deprecated\" class=\"external-link\"><img src=\"figures/lifecycle-soft-deprecated.svg\" alt=\"[Soft-deprecated]\"></a>\n\n<code>knife()</code> is deprecated in favour of <code><a href=\"https://purrr.tidyverse.org/reference/partial.html\" class=\"external-link\">purrr::partial()</a></code>.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"fu\">knife</span><span class=\"op\">(</span><span class=\"va\">...</span><span class=\"op\">)</span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>...</dt>\n<dd><p>Parameters for <code><a href=\"chop.html\">chop()</a></code>.</p></dd>\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A function.</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.2.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/knife.md",
    "content": "# Deprecated\n\n**\\[soft-deprecated\\]** `knife()` is deprecated in favour of\n[`purrr::partial()`](https://purrr.tidyverse.org/reference/partial.html).\n\n## Usage\n\n``` r\nknife(...)\n```\n\n## Arguments\n\n- ...:\n\n  Parameters for\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n\n## Value\n\nA function.\n"
  },
  {
    "path": "docs/reference/lbl_dash.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Label chopped intervals like 1-4, 4-5, ... — lbl_dash • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Label chopped intervals like 1-4, 4-5, ... — lbl_dash\"><meta name=\"description\" content=\"This label style is user-friendly, but doesn't distinguish between\nleft- and right-closed intervals. It's good for continuous data\nwhere you don't expect points to be exactly on the breaks.\"><meta property=\"og:description\" content=\"This label style is user-friendly, but doesn't distinguish between\nleft- and right-closed intervals. It's good for continuous data\nwhere you don't expect points to be exactly on the breaks.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Label chopped intervals like 1-4, 4-5, ...</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/labels.R\" class=\"external-link\"><code>R/labels.R</code></a></small>\n      <div class=\"d-none name\"><code>lbl_dash.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This label style is user-friendly, but doesn't distinguish between\nleft- and right-closed intervals. It's good for continuous data\nwhere you don't expect points to be exactly on the breaks.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">lbl_dash</span><span class=\"op\">(</span></span>\n<span>  symbol <span class=\"op\">=</span> <span class=\"fu\">em_dash</span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  fmt <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  single <span class=\"op\">=</span> <span class=\"st\">\"{l}\"</span>,</span>\n<span>  first <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  last <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  raw <span class=\"op\">=</span> <span class=\"fu\">deprecated</span><span class=\"op\">(</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-symbol\">symbol<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-symbol\"></a></dt>\n<dd><p>String: symbol to use for the dash.</p></dd>\n\n\n<dt id=\"arg-fmt\">fmt<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-fmt\"></a></dt>\n<dd><p>String, list or function. A format for break endpoints.</p></dd>\n\n\n<dt id=\"arg-single\">single<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-single\"></a></dt>\n<dd><p>Glue string: label for singleton intervals. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details. If <code>NULL</code>, singleton intervals will be labelled the same way\nas other intervals.</p></dd>\n\n\n<dt id=\"arg-first\">first<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-first\"></a></dt>\n<dd><p>Glue string: override label for the first category. Write e.g.\n<code>first = \"&lt;{r}\"</code> to create a label like <code>\"&lt;18\"</code>. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details.</p></dd>\n\n\n<dt id=\"arg-last\">last<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-last\"></a></dt>\n<dd><p>String: override label for the last category. Write e.g.\n<code>last = \"&gt;{l}\"</code> to create a label like <code>\"&gt;65\"</code>. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details.</p></dd>\n\n\n<dt id=\"arg-raw\">raw<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-raw\"></a></dt>\n<dd><p><a href=\"https://lifecycle.r-lib.org/articles/stages.html#deprecated\" class=\"external-link\"><img src=\"figures/lifecycle-deprecated.svg\" alt=\"[Deprecated]\"></a>. Throws an error.\nUse the <code>raw</code> argument to <code><a href=\"chop.html\">chop()</a></code> instead.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A function that creates a vector of labels.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>If you don't want unicode output, use <code>lbl_dash(\"-\")</code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"formatting-endpoints\">Formatting endpoints<a class=\"anchor\" aria-label=\"anchor\" href=\"#formatting-endpoints\"></a></h2>\n\n\n\n<p>If <code>fmt</code> is not <code>NULL</code> then it is used to format the endpoints.</p><ul><li><p>If <code>fmt</code> is a string, then numeric endpoints will be formatted by\n<code>sprintf(fmt, breaks)</code>; other endpoints, e.g. <a href=\"https://rdrr.io/r/base/Dates.html\" class=\"external-link\">Date</a> objects,\nwill be formatted by <code>format(breaks, fmt)</code>.</p></li>\n<li><p>If <code>fmt</code> is a list, then it will be used as arguments to <a href=\"https://rdrr.io/r/base/format.html\" class=\"external-link\">format</a>.</p></li>\n<li><p>If <code>fmt</code> is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the <code>{scales}</code> package, e.g. <code><a href=\"https://scales.r-lib.org/reference/label_number.html\" class=\"external-link\">scales::label_comma()</a></code>.</p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other labelling functions:\n<code><a href=\"lbl_datetime.html\">lbl_date()</a></code>,\n<code><a href=\"lbl_discrete.html\">lbl_discrete()</a></code>,\n<code><a href=\"lbl_endpoints.html\">lbl_endpoints()</a></code>,\n<code><a href=\"lbl_glue.html\">lbl_glue()</a></code>,\n<code><a href=\"lbl_intervals.html\">lbl_intervals()</a></code>,\n<code><a href=\"lbl_manual.html\">lbl_manual()</a></code>,\n<code><a href=\"lbl_midpoints.html\">lbl_midpoints()</a></code>,\n<code><a href=\"lbl_seq.html\">lbl_seq()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, <span class=\"fu\">lbl_dash</span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] 1—2  2—5  2—5  2—5  5—8  5—8  5—8  8—10 8—10 8—10</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: 1—2 2—5 5—8 8—10</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, <span class=\"fu\">lbl_dash</span><span class=\"op\">(</span><span class=\"st\">\" to \"</span>, fmt <span class=\"op\">=</span> <span class=\"st\">\"%.1f\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] 1.0 to 2.0  2.0 to 5.0  2.0 to 5.0  2.0 to 5.0  5.0 to 8.0  5.0 to 8.0 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [7] 5.0 to 8.0  8.0 to 10.0 8.0 to 10.0 8.0 to 10.0</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: 1.0 to 2.0 2.0 to 5.0 5.0 to 8.0 8.0 to 10.0</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, <span class=\"fu\">lbl_dash</span><span class=\"op\">(</span>first <span class=\"op\">=</span> <span class=\"st\">\"&lt;{r}\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] &lt;2   2—5  2—5  2—5  5—8  5—8  5—8  8—10 8—10 8—10</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: &lt;2 2—5 5—8 8—10</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">pretty</span> <span class=\"op\">&lt;-</span> <span class=\"kw\">function</span> <span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/formatc.html\" class=\"external-link\">prettyNum</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, big.mark <span class=\"op\">=</span> <span class=\"st\">\",\"</span>, digits <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"fl\">10</span><span class=\"op\">)</span> <span class=\"op\">*</span> <span class=\"fl\">10000</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">3000</span>, <span class=\"fl\">7000</span><span class=\"op\">)</span>, <span class=\"fu\">lbl_dash</span><span class=\"op\">(</span><span class=\"st\">\" to \"</span>, fmt <span class=\"op\">=</span> <span class=\"va\">pretty</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] 7,000 to 9,677 7,000 to 9,677 7,000 to 9,677 3,000 to 7,000 7,000 to 9,677</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [6] 3,000 to 7,000 1,579 to 3,000 3,000 to 7,000 7,000 to 9,677 3,000 to 7,000</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: 1,579 to 3,000 3,000 to 7,000 7,000 to 9,677</span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/lbl_dash.md",
    "content": "# Label chopped intervals like 1-4, 4-5, ...\n\nThis label style is user-friendly, but doesn't distinguish between left-\nand right-closed intervals. It's good for continuous data where you\ndon't expect points to be exactly on the breaks.\n\n## Usage\n\n``` r\nlbl_dash(\n  symbol = em_dash(),\n  fmt = NULL,\n  single = \"{l}\",\n  first = NULL,\n  last = NULL,\n  raw = deprecated()\n)\n```\n\n## Arguments\n\n- symbol:\n\n  String: symbol to use for the dash.\n\n- fmt:\n\n  String, list or function. A format for break endpoints.\n\n- single:\n\n  Glue string: label for singleton intervals. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details. If `NULL`, singleton intervals will be labelled the same\n  way as other intervals.\n\n- first:\n\n  Glue string: override label for the first category. Write e.g.\n  `first = \"<{r}\"` to create a label like `\"<18\"`. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details.\n\n- last:\n\n  String: override label for the last category. Write e.g.\n  `last = \">{l}\"` to create a label like `\">65\"`. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details.\n\n- raw:\n\n  **\\[deprecated\\]**. Throws an error. Use the `raw` argument to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n  instead.\n\n## Value\n\nA function that creates a vector of labels.\n\n## Details\n\nIf you don't want unicode output, use `lbl_dash(\"-\")`.\n\n## Formatting endpoints\n\nIf `fmt` is not `NULL` then it is used to format the endpoints.\n\n- If `fmt` is a string, then numeric endpoints will be formatted by\n  `sprintf(fmt, breaks)`; other endpoints, e.g.\n  [Date](https://rdrr.io/r/base/Dates.html) objects, will be formatted\n  by `format(breaks, fmt)`.\n\n- If `fmt` is a list, then it will be used as arguments to\n  [format](https://rdrr.io/r/base/format.html).\n\n- If `fmt` is a function, it should take a vector of numbers (or other\n  objects that can be used as breaks) and return a character vector. It\n  may be helpful to use functions from the `{scales}` package, e.g.\n  [`scales::label_comma()`](https://scales.r-lib.org/reference/label_number.html).\n\n## See also\n\nOther labelling functions:\n[`lbl_date()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md),\n[`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md),\n[`lbl_endpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md),\n[`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md),\n[`lbl_intervals()`](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md),\n[`lbl_manual()`](https://hughjonesd.github.io/santoku/reference/lbl_manual.md),\n[`lbl_midpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_midpoints.md),\n[`lbl_seq()`](https://hughjonesd.github.io/santoku/reference/lbl_seq.md)\n\n## Examples\n\n``` r\nchop(1:10, c(2, 5, 8), lbl_dash())\n#>  [1] 1—2  2—5  2—5  2—5  5—8  5—8  5—8  8—10 8—10 8—10\n#> Levels: 1—2 2—5 5—8 8—10\n\nchop(1:10, c(2, 5, 8), lbl_dash(\" to \", fmt = \"%.1f\"))\n#>  [1] 1.0 to 2.0  2.0 to 5.0  2.0 to 5.0  2.0 to 5.0  5.0 to 8.0  5.0 to 8.0 \n#>  [7] 5.0 to 8.0  8.0 to 10.0 8.0 to 10.0 8.0 to 10.0\n#> Levels: 1.0 to 2.0 2.0 to 5.0 5.0 to 8.0 8.0 to 10.0\n\nchop(1:10, c(2, 5, 8), lbl_dash(first = \"<{r}\"))\n#>  [1] <2   2—5  2—5  2—5  5—8  5—8  5—8  8—10 8—10 8—10\n#> Levels: <2 2—5 5—8 8—10\n\npretty <- function (x) prettyNum(x, big.mark = \",\", digits = 1)\nchop(runif(10) * 10000, c(3000, 7000), lbl_dash(\" to \", fmt = pretty))\n#>  [1] 7,000 to 9,677 7,000 to 9,677 7,000 to 9,677 3,000 to 7,000 7,000 to 9,677\n#>  [6] 3,000 to 7,000 1,579 to 3,000 3,000 to 7,000 7,000 to 9,677 3,000 to 7,000\n#> Levels: 1,579 to 3,000 3,000 to 7,000 7,000 to 9,677\n```\n"
  },
  {
    "path": "docs/reference/lbl_datetime.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Label dates and datetimes — lbl_date • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Label dates and datetimes — lbl_date\"><meta name=\"description\" content='\nlbl_date() and lbl_datetime() produce nice labels for dates\nand datetimes. Where possible ranges are simplified, like\nlike \"13-14 Jul 2026\" or \"11:15-12:15 1 Dec 2025\".'><meta property=\"og:description\" content='\nlbl_date() and lbl_datetime() produce nice labels for dates\nand datetimes. Where possible ranges are simplified, like\nlike \"13-14 Jul 2026\" or \"11:15-12:15 1 Dec 2025\".'><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Label dates and datetimes</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/labels-datetime.R\" class=\"external-link\"><code>R/labels-datetime.R</code></a></small>\n      <div class=\"d-none name\"><code>lbl_datetime.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><a href=\"https://lifecycle.r-lib.org/articles/stages.html#experimental\" class=\"external-link\"><img src=\"figures/lifecycle-experimental.svg\" alt=\"[Experimental]\"></a></p>\n<p><code>lbl_date()</code> and <code>lbl_datetime()</code> produce nice labels for dates\nand datetimes. Where possible ranges are simplified, like\nlike \"13-14 Jul 2026\" or \"11:15-12:15 1 Dec 2025\".</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">lbl_date</span><span class=\"op\">(</span></span>\n<span>  fmt <span class=\"op\">=</span> <span class=\"st\">\"%e %b %Y\"</span>,</span>\n<span>  symbol <span class=\"op\">=</span> <span class=\"st\">\"-\"</span>,</span>\n<span>  unit <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://generics.r-lib.org/reference/coercion-time-difference.html\" class=\"external-link\">as.difftime</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, units <span class=\"op\">=</span> <span class=\"st\">\"days\"</span><span class=\"op\">)</span>,</span>\n<span>  single <span class=\"op\">=</span> <span class=\"st\">\"{l}\"</span>,</span>\n<span>  first <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  last <span class=\"op\">=</span> <span class=\"cn\">NULL</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">lbl_datetime</span><span class=\"op\">(</span></span>\n<span>  fmt <span class=\"op\">=</span> <span class=\"st\">\"%H:%M:%S %b %e %Y\"</span>,</span>\n<span>  symbol <span class=\"op\">=</span> <span class=\"st\">\"-\"</span>,</span>\n<span>  unit <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  single <span class=\"op\">=</span> <span class=\"st\">\"{l}\"</span>,</span>\n<span>  first <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  last <span class=\"op\">=</span> <span class=\"cn\">NULL</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-fmt\">fmt<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-fmt\"></a></dt>\n<dd><p>String, list or function. A format for break endpoints.</p></dd>\n\n\n<dt id=\"arg-symbol\">symbol<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-symbol\"></a></dt>\n<dd><p>String: separator to use for full ranges.</p></dd>\n\n\n<dt id=\"arg-unit\">unit<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-unit\"></a></dt>\n<dd><p>Optional interval unit for non-overlapping labels. If not <code>NULL</code>,\n.  endpoints are adjusted in the style of <code><a href=\"lbl_discrete.html\">lbl_discrete()</a></code>.</p></dd>\n\n\n<dt id=\"arg-single\">single<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-single\"></a></dt>\n<dd><p>Glue string: label for singleton intervals. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details. If <code>NULL</code>, singleton intervals will be labelled the same way\nas other intervals.</p></dd>\n\n\n<dt id=\"arg-first\">first<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-first\"></a></dt>\n<dd><p>Glue string: override label for the first category. Write e.g.\n<code>first = \"&lt;{r}\"</code> to create a label like <code>\"&lt;18\"</code>. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details.</p></dd>\n\n\n<dt id=\"arg-last\">last<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-last\"></a></dt>\n<dd><p>String: override label for the last category. Write e.g.\n<code>last = \"&gt;{l}\"</code> to create a label like <code>\"&gt;65\"</code>. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A function that creates a vector of labels.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"formatting-endpoints\">Formatting endpoints<a class=\"anchor\" aria-label=\"anchor\" href=\"#formatting-endpoints\"></a></h2>\n\n\n\n<p>If <code>fmt</code> is not <code>NULL</code> then it is used to format the endpoints.</p><ul><li><p>If <code>fmt</code> is a string, then numeric endpoints will be formatted by\n<code>sprintf(fmt, breaks)</code>; other endpoints, e.g. <a href=\"https://rdrr.io/r/base/Dates.html\" class=\"external-link\">Date</a> objects,\nwill be formatted by <code>format(breaks, fmt)</code>.</p></li>\n<li><p>If <code>fmt</code> is a list, then it will be used as arguments to <a href=\"https://rdrr.io/r/base/format.html\" class=\"external-link\">format</a>.</p></li>\n<li><p>If <code>fmt</code> is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the <code>{scales}</code> package, e.g. <code><a href=\"https://scales.r-lib.org/reference/label_number.html\" class=\"external-link\">scales::label_comma()</a></code>.</p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other labelling functions:\n<code><a href=\"lbl_dash.html\">lbl_dash()</a></code>,\n<code><a href=\"lbl_discrete.html\">lbl_discrete()</a></code>,\n<code><a href=\"lbl_endpoints.html\">lbl_endpoints()</a></code>,\n<code><a href=\"lbl_glue.html\">lbl_glue()</a></code>,\n<code><a href=\"lbl_intervals.html\">lbl_intervals()</a></code>,\n<code><a href=\"lbl_manual.html\">lbl_manual()</a></code>,\n<code><a href=\"lbl_midpoints.html\">lbl_midpoints()</a></code>,\n<code><a href=\"lbl_seq.html\">lbl_seq()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"va\">winter</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.Date.html\" class=\"external-link\">as.Date</a></span><span class=\"op\">(</span><span class=\"st\">\"2025-12-01\"</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fl\">0</span><span class=\"op\">:</span><span class=\"fl\">89</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">tab</a></span><span class=\"op\">(</span><span class=\"va\">winter</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.Date.html\" class=\"external-link\">as.Date</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"2025-12-25\"</span>, <span class=\"st\">\"2026-01-06\"</span><span class=\"op\">)</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>    labels <span class=\"op\">=</span> <span class=\"fu\">lbl_date</span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>             1-24 Dec 2025 25 Dec 2025 -  5 Jan 2026       6 Jan - 28 Feb 2026 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                        24                        12                        54 </span>\n<span class=\"r-in\"><span><span class=\"va\">new_year</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.POSIXlt.html\" class=\"external-link\">as.POSIXct</a></span><span class=\"op\">(</span><span class=\"st\">\"2025-12-31 23:00\"</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fl\">0</span><span class=\"op\">:</span><span class=\"fl\">120</span> <span class=\"op\">*</span> <span class=\"fl\">60</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">round_midnight</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.POSIXlt.html\" class=\"external-link\">as.POSIXct</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"2025-12-31 23:59\"</span>, <span class=\"st\">\"2026-01-01 00:05\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">tab</a></span><span class=\"op\">(</span><span class=\"va\">new_year</span>, <span class=\"va\">round_midnight</span>,</span></span>\n<span class=\"r-in\"><span>    labels <span class=\"op\">=</span> <span class=\"fu\">lbl_datetime</span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>               23:00:00-23:59:00 Dec 31 2025 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                          59 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 23:59:00 Dec 31 2025 - 00:05:00 Jan  1 2026 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                           6 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>               00:05:00-01:00:00 Jan  1 2026 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                          56 </span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">tab</a></span><span class=\"op\">(</span><span class=\"va\">new_year</span>, <span class=\"va\">round_midnight</span>,</span></span>\n<span class=\"r-in\"><span>    labels <span class=\"op\">=</span> <span class=\"fu\">lbl_datetime</span><span class=\"op\">(</span>unit <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://generics.r-lib.org/reference/coercion-time-difference.html\" class=\"external-link\">as.difftime</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, units <span class=\"op\">=</span> <span class=\"st\">\"mins\"</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>               23:00:00-23:58:00 Dec 31 2025 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                          59 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 23:59:00 Dec 31 2025 - 00:04:00 Jan  1 2026 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                           6 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>               00:05:00-01:00:00 Jan  1 2026 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                                          56 </span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/lbl_datetime.md",
    "content": "# Label dates and datetimes\n\n**\\[experimental\\]**\n\n`lbl_date()` and `lbl_datetime()` produce nice labels for dates and\ndatetimes. Where possible ranges are simplified, like like \"13-14 Jul\n2026\" or \"11:15-12:15 1 Dec 2025\".\n\n## Usage\n\n``` r\nlbl_date(\n  fmt = \"%e %b %Y\",\n  symbol = \"-\",\n  unit = as.difftime(1, units = \"days\"),\n  single = \"{l}\",\n  first = NULL,\n  last = NULL\n)\n\nlbl_datetime(\n  fmt = \"%H:%M:%S %b %e %Y\",\n  symbol = \"-\",\n  unit = NULL,\n  single = \"{l}\",\n  first = NULL,\n  last = NULL\n)\n```\n\n## Arguments\n\n- fmt:\n\n  String, list or function. A format for break endpoints.\n\n- symbol:\n\n  String: separator to use for full ranges.\n\n- unit:\n\n  Optional interval unit for non-overlapping labels. If not `NULL`, .\n  endpoints are adjusted in the style of\n  [`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md).\n\n- single:\n\n  Glue string: label for singleton intervals. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details. If `NULL`, singleton intervals will be labelled the same\n  way as other intervals.\n\n- first:\n\n  Glue string: override label for the first category. Write e.g.\n  `first = \"<{r}\"` to create a label like `\"<18\"`. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details.\n\n- last:\n\n  String: override label for the last category. Write e.g.\n  `last = \">{l}\"` to create a label like `\">65\"`. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details.\n\n## Value\n\nA function that creates a vector of labels.\n\n## Formatting endpoints\n\nIf `fmt` is not `NULL` then it is used to format the endpoints.\n\n- If `fmt` is a string, then numeric endpoints will be formatted by\n  `sprintf(fmt, breaks)`; other endpoints, e.g.\n  [Date](https://rdrr.io/r/base/Dates.html) objects, will be formatted\n  by `format(breaks, fmt)`.\n\n- If `fmt` is a list, then it will be used as arguments to\n  [format](https://rdrr.io/r/base/format.html).\n\n- If `fmt` is a function, it should take a vector of numbers (or other\n  objects that can be used as breaks) and return a character vector. It\n  may be helpful to use functions from the `{scales}` package, e.g.\n  [`scales::label_comma()`](https://scales.r-lib.org/reference/label_number.html).\n\n## See also\n\nOther labelling functions:\n[`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md),\n[`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md),\n[`lbl_endpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md),\n[`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md),\n[`lbl_intervals()`](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md),\n[`lbl_manual()`](https://hughjonesd.github.io/santoku/reference/lbl_manual.md),\n[`lbl_midpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_midpoints.md),\n[`lbl_seq()`](https://hughjonesd.github.io/santoku/reference/lbl_seq.md)\n\n## Examples\n\n``` r\nwinter <- as.Date(\"2025-12-01\") + 0:89\ntab(winter, as.Date(c(\"2025-12-25\", \"2026-01-06\")),\n    labels = lbl_date())\n#>             1-24 Dec 2025 25 Dec 2025 -  5 Jan 2026       6 Jan - 28 Feb 2026 \n#>                        24                        12                        54 \nnew_year <- as.POSIXct(\"2025-12-31 23:00\") + 0:120 * 60\nround_midnight <- as.POSIXct(c(\"2025-12-31 23:59\", \"2026-01-01 00:05\"))\ntab(new_year, round_midnight,\n    labels = lbl_datetime())\n#>               23:00:00-23:59:00 Dec 31 2025 \n#>                                          59 \n#> 23:59:00 Dec 31 2025 - 00:05:00 Jan  1 2026 \n#>                                           6 \n#>               00:05:00-01:00:00 Jan  1 2026 \n#>                                          56 \ntab(new_year, round_midnight,\n    labels = lbl_datetime(unit = as.difftime(1, units = \"mins\")))\n#>               23:00:00-23:58:00 Dec 31 2025 \n#>                                          59 \n#> 23:59:00 Dec 31 2025 - 00:04:00 Jan  1 2026 \n#>                                           6 \n#>               00:05:00-01:00:00 Jan  1 2026 \n#>                                          56 \n```\n"
  },
  {
    "path": "docs/reference/lbl_discrete.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Label discrete data — lbl_discrete • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Label discrete data — lbl_discrete\"><meta name=\"description\" content='lbl_discrete() creates labels for discrete data, such as integers.\nFor example, breaks\nc(1, 3, 4, 6, 7) are labelled: \"1-2\", \"3\", \"4-5\", \"6-7\".'><meta property=\"og:description\" content='lbl_discrete() creates labels for discrete data, such as integers.\nFor example, breaks\nc(1, 3, 4, 6, 7) are labelled: \"1-2\", \"3\", \"4-5\", \"6-7\".'><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Label discrete data</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/labels.R\" class=\"external-link\"><code>R/labels.R</code></a></small>\n      <div class=\"d-none name\"><code>lbl_discrete.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>lbl_discrete()</code> creates labels for discrete data, such as integers.\nFor example, breaks\n<code>c(1, 3, 4, 6, 7)</code> are labelled: <code>\"1-2\", \"3\", \"4-5\", \"6-7\"</code>.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">lbl_discrete</span><span class=\"op\">(</span></span>\n<span>  symbol <span class=\"op\">=</span> <span class=\"fu\">em_dash</span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  unit <span class=\"op\">=</span> <span class=\"fl\">1L</span>,</span>\n<span>  fmt <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  single <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  first <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  last <span class=\"op\">=</span> <span class=\"cn\">NULL</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-symbol\">symbol<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-symbol\"></a></dt>\n<dd><p>String: symbol to use for the dash.</p></dd>\n\n\n<dt id=\"arg-unit\">unit<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-unit\"></a></dt>\n<dd><p>Minimum difference between distinct values of data.\nFor integers, 1.</p></dd>\n\n\n<dt id=\"arg-fmt\">fmt<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-fmt\"></a></dt>\n<dd><p>String, list or function. A format for break endpoints.</p></dd>\n\n\n<dt id=\"arg-single\">single<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-single\"></a></dt>\n<dd><p>Glue string: label for singleton intervals. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details. If <code>NULL</code>, singleton intervals will be labelled the same way\nas other intervals.</p></dd>\n\n\n<dt id=\"arg-first\">first<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-first\"></a></dt>\n<dd><p>Glue string: override label for the first category. Write e.g.\n<code>first = \"&lt;{r}\"</code> to create a label like <code>\"&lt;18\"</code>. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details.</p></dd>\n\n\n<dt id=\"arg-last\">last<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-last\"></a></dt>\n<dd><p>String: override label for the last category. Write e.g.\n<code>last = \"&gt;{l}\"</code> to create a label like <code>\"&gt;65\"</code>. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A function that creates a vector of labels.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>No check is done that the data are discrete-valued. If they are not, then\nthese labels may be misleading. Here, discrete-valued means that if\n<code>x &lt; y</code>, then <code>x &lt;= y - unit</code>.</p>\n<p>Be aware that Date objects may have non-integer values. See\n<a href=\"https://rdrr.io/r/base/Dates.html\" class=\"external-link\">Date</a>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"formatting-endpoints\">Formatting endpoints<a class=\"anchor\" aria-label=\"anchor\" href=\"#formatting-endpoints\"></a></h2>\n\n\n\n<p>If <code>fmt</code> is not <code>NULL</code> then it is used to format the endpoints.</p><ul><li><p>If <code>fmt</code> is a string, then numeric endpoints will be formatted by\n<code>sprintf(fmt, breaks)</code>; other endpoints, e.g. <a href=\"https://rdrr.io/r/base/Dates.html\" class=\"external-link\">Date</a> objects,\nwill be formatted by <code>format(breaks, fmt)</code>.</p></li>\n<li><p>If <code>fmt</code> is a list, then it will be used as arguments to <a href=\"https://rdrr.io/r/base/format.html\" class=\"external-link\">format</a>.</p></li>\n<li><p>If <code>fmt</code> is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the <code>{scales}</code> package, e.g. <code><a href=\"https://scales.r-lib.org/reference/label_number.html\" class=\"external-link\">scales::label_comma()</a></code>.</p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other labelling functions:\n<code><a href=\"lbl_dash.html\">lbl_dash()</a></code>,\n<code><a href=\"lbl_datetime.html\">lbl_date()</a></code>,\n<code><a href=\"lbl_endpoints.html\">lbl_endpoints()</a></code>,\n<code><a href=\"lbl_glue.html\">lbl_glue()</a></code>,\n<code><a href=\"lbl_intervals.html\">lbl_intervals()</a></code>,\n<code><a href=\"lbl_manual.html\">lbl_manual()</a></code>,\n<code><a href=\"lbl_midpoints.html\">lbl_midpoints()</a></code>,\n<code><a href=\"lbl_seq.html\">lbl_seq()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">tab</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">3</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>, <span class=\"fu\">lbl_discrete</span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1—2 3—4 5—7 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>   2   2   3 </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">tab</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">3</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>, <span class=\"fu\">lbl_discrete</span><span class=\"op\">(</span>first <span class=\"op\">=</span> <span class=\"st\">\"&lt;= {r}\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> &lt;= 2  3—4  5—7 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    2    2    3 </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">tab</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">7</span> <span class=\"op\">*</span> <span class=\"fl\">1000</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">3</span>, <span class=\"fl\">5</span><span class=\"op\">)</span> <span class=\"op\">*</span> <span class=\"fl\">1000</span>, <span class=\"fu\">lbl_discrete</span><span class=\"op\">(</span>unit <span class=\"op\">=</span> <span class=\"fl\">1000</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> 1000—2000 3000—4000 5000—7000 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         2         2         3 </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># Misleading labels for non-integer data</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">2.5</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">3</span>, <span class=\"fl\">5</span><span class=\"op\">)</span>, <span class=\"fu\">lbl_discrete</span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] 1—2</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: 1—2</span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/lbl_discrete.md",
    "content": "# Label discrete data\n\n`lbl_discrete()` creates labels for discrete data, such as integers. For\nexample, breaks `c(1, 3, 4, 6, 7)` are labelled:\n`\"1-2\", \"3\", \"4-5\", \"6-7\"`.\n\n## Usage\n\n``` r\nlbl_discrete(\n  symbol = em_dash(),\n  unit = 1L,\n  fmt = NULL,\n  single = NULL,\n  first = NULL,\n  last = NULL\n)\n```\n\n## Arguments\n\n- symbol:\n\n  String: symbol to use for the dash.\n\n- unit:\n\n  Minimum difference between distinct values of data. For integers, 1.\n\n- fmt:\n\n  String, list or function. A format for break endpoints.\n\n- single:\n\n  Glue string: label for singleton intervals. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details. If `NULL`, singleton intervals will be labelled the same\n  way as other intervals.\n\n- first:\n\n  Glue string: override label for the first category. Write e.g.\n  `first = \"<{r}\"` to create a label like `\"<18\"`. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details.\n\n- last:\n\n  String: override label for the last category. Write e.g.\n  `last = \">{l}\"` to create a label like `\">65\"`. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details.\n\n## Value\n\nA function that creates a vector of labels.\n\n## Details\n\nNo check is done that the data are discrete-valued. If they are not,\nthen these labels may be misleading. Here, discrete-valued means that if\n`x < y`, then `x <= y - unit`.\n\nBe aware that Date objects may have non-integer values. See\n[Date](https://rdrr.io/r/base/Dates.html).\n\n## Formatting endpoints\n\nIf `fmt` is not `NULL` then it is used to format the endpoints.\n\n- If `fmt` is a string, then numeric endpoints will be formatted by\n  `sprintf(fmt, breaks)`; other endpoints, e.g.\n  [Date](https://rdrr.io/r/base/Dates.html) objects, will be formatted\n  by `format(breaks, fmt)`.\n\n- If `fmt` is a list, then it will be used as arguments to\n  [format](https://rdrr.io/r/base/format.html).\n\n- If `fmt` is a function, it should take a vector of numbers (or other\n  objects that can be used as breaks) and return a character vector. It\n  may be helpful to use functions from the `{scales}` package, e.g.\n  [`scales::label_comma()`](https://scales.r-lib.org/reference/label_number.html).\n\n## See also\n\nOther labelling functions:\n[`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md),\n[`lbl_date()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md),\n[`lbl_endpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md),\n[`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md),\n[`lbl_intervals()`](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md),\n[`lbl_manual()`](https://hughjonesd.github.io/santoku/reference/lbl_manual.md),\n[`lbl_midpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_midpoints.md),\n[`lbl_seq()`](https://hughjonesd.github.io/santoku/reference/lbl_seq.md)\n\n## Examples\n\n``` r\ntab(1:7, c(1, 3, 5), lbl_discrete())\n#> 1—2 3—4 5—7 \n#>   2   2   3 \n\ntab(1:7, c(3, 5), lbl_discrete(first = \"<= {r}\"))\n#> <= 2  3—4  5—7 \n#>    2    2    3 \n\ntab(1:7 * 1000, c(1, 3, 5) * 1000, lbl_discrete(unit = 1000))\n#> 1000—2000 3000—4000 5000—7000 \n#>         2         2         3 \n\n# Misleading labels for non-integer data\nchop(2.5, c(1, 3, 5), lbl_discrete())\n#> [1] 1—2\n#> Levels: 1—2\n```\n"
  },
  {
    "path": "docs/reference/lbl_endpoint.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/lbl_endpoints.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/lbl_endpoints.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/lbl_endpoints.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Label chopped intervals by their left or right endpoints — lbl_endpoints • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Label chopped intervals by their left or right endpoints — lbl_endpoints\"><meta name=\"description\" content=\"This is useful when the left endpoint unambiguously indicates the\ninterval. In other cases it may give errors due to duplicate labels.\"><meta property=\"og:description\" content=\"This is useful when the left endpoint unambiguously indicates the\ninterval. In other cases it may give errors due to duplicate labels.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Label chopped intervals by their left or right endpoints</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/labels-single.R\" class=\"external-link\"><code>R/labels-single.R</code></a></small>\n      <div class=\"d-none name\"><code>lbl_endpoints.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This is useful when the left endpoint unambiguously indicates the\ninterval. In other cases it may give errors due to duplicate labels.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">lbl_endpoints</span><span class=\"op\">(</span></span>\n<span>  left <span class=\"op\">=</span> <span class=\"cn\">TRUE</span>,</span>\n<span>  fmt <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  single <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  first <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  last <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  raw <span class=\"op\">=</span> <span class=\"fu\">deprecated</span><span class=\"op\">(</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"fu\">lbl_endpoint</span><span class=\"op\">(</span>fmt <span class=\"op\">=</span> <span class=\"cn\">NULL</span>, raw <span class=\"op\">=</span> <span class=\"cn\">FALSE</span>, left <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-left\">left<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-left\"></a></dt>\n<dd><p>Flag. Use left endpoint or right endpoint?</p></dd>\n\n\n<dt id=\"arg-fmt\">fmt<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-fmt\"></a></dt>\n<dd><p>String, list or function. A format for break endpoints.</p></dd>\n\n\n<dt id=\"arg-single\">single<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-single\"></a></dt>\n<dd><p>Glue string: label for singleton intervals. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details. If <code>NULL</code>, singleton intervals will be labelled the same way\nas other intervals.</p></dd>\n\n\n<dt id=\"arg-first\">first<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-first\"></a></dt>\n<dd><p>Glue string: override label for the first category. Write e.g.\n<code>first = \"&lt;{r}\"</code> to create a label like <code>\"&lt;18\"</code>. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details.</p></dd>\n\n\n<dt id=\"arg-last\">last<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-last\"></a></dt>\n<dd><p>String: override label for the last category. Write e.g.\n<code>last = \"&gt;{l}\"</code> to create a label like <code>\"&gt;65\"</code>. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details.</p></dd>\n\n\n<dt id=\"arg-raw\">raw<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-raw\"></a></dt>\n<dd><p><a href=\"https://lifecycle.r-lib.org/articles/stages.html#deprecated\" class=\"external-link\"><img src=\"figures/lifecycle-deprecated.svg\" alt=\"[Deprecated]\"></a>. Throws an error.\nUse the <code>raw</code> argument to <code><a href=\"chop.html\">chop()</a></code> instead.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A function that creates a vector of labels.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p><code>lbl_endpoint()</code> is <a href=\"https://lifecycle.r-lib.org/articles/stages.html#defunct\" class=\"external-link\"><img src=\"figures/lifecycle-defunct.svg\" alt=\"[Defunct]\"></a> and gives an\nerror since santoku 1.0.0.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"formatting-endpoints\">Formatting endpoints<a class=\"anchor\" aria-label=\"anchor\" href=\"#formatting-endpoints\"></a></h2>\n\n\n\n<p>If <code>fmt</code> is not <code>NULL</code> then it is used to format the endpoints.</p><ul><li><p>If <code>fmt</code> is a string, then numeric endpoints will be formatted by\n<code>sprintf(fmt, breaks)</code>; other endpoints, e.g. <a href=\"https://rdrr.io/r/base/Dates.html\" class=\"external-link\">Date</a> objects,\nwill be formatted by <code>format(breaks, fmt)</code>.</p></li>\n<li><p>If <code>fmt</code> is a list, then it will be used as arguments to <a href=\"https://rdrr.io/r/base/format.html\" class=\"external-link\">format</a>.</p></li>\n<li><p>If <code>fmt</code> is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the <code>{scales}</code> package, e.g. <code><a href=\"https://scales.r-lib.org/reference/label_number.html\" class=\"external-link\">scales::label_comma()</a></code>.</p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other labelling functions:\n<code><a href=\"lbl_dash.html\">lbl_dash()</a></code>,\n<code><a href=\"lbl_datetime.html\">lbl_date()</a></code>,\n<code><a href=\"lbl_discrete.html\">lbl_discrete()</a></code>,\n<code><a href=\"lbl_glue.html\">lbl_glue()</a></code>,\n<code><a href=\"lbl_intervals.html\">lbl_intervals()</a></code>,\n<code><a href=\"lbl_manual.html\">lbl_manual()</a></code>,\n<code><a href=\"lbl_midpoints.html\">lbl_midpoints()</a></code>,\n<code><a href=\"lbl_seq.html\">lbl_seq()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, <span class=\"fu\">lbl_endpoints</span><span class=\"op\">(</span>left <span class=\"op\">=</span> <span class=\"cn\">TRUE</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] 1 2 2 2 5 5 5 8 8 8</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: 1 2 5 8</span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, <span class=\"fu\">lbl_endpoints</span><span class=\"op\">(</span>left <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] 2  5  5  5  8  8  8  10 10 10</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: 2 5 8 10</span>\n<span class=\"r-in\"><span><span class=\"kw\">if</span> <span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/ns-load.html\" class=\"external-link\">requireNamespace</a></span><span class=\"op\">(</span><span class=\"st\">\"lubridate\"</span><span class=\"op\">)</span><span class=\"op\">)</span> <span class=\"op\">{</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"chop_width.html\">tab_width</a></span><span class=\"op\">(</span></span></span>\n<span class=\"r-in\"><span>          <span class=\"fu\"><a href=\"https://rdrr.io/r/base/as.Date.html\" class=\"external-link\">as.Date</a></span><span class=\"op\">(</span><span class=\"st\">\"2000-01-01\"</span><span class=\"op\">)</span> <span class=\"op\">+</span> <span class=\"fl\">0</span><span class=\"op\">:</span><span class=\"fl\">365</span>,</span></span>\n<span class=\"r-in\"><span>         <span class=\"fu\"><a href=\"https://rdrr.io/r/base/weekday.POSIXt.html\" class=\"external-link\">months</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>         labels <span class=\"op\">=</span> <span class=\"fu\">lbl_endpoints</span><span class=\"op\">(</span>fmt <span class=\"op\">=</span> <span class=\"st\">\"%b\"</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span>       <span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  31  29  31  30  31  30  31  31  30  31  30  31 </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"kw\">if</span> <span class=\"op\">(</span><span class=\"cn\">FALSE</span><span class=\"op\">)</span> <span class=\"op\">{</span> <span class=\"co\"># \\dontrun{</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"co\"># This gives breaks `[1, 2) [2, 3) {3}` which lead to</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"co\"># duplicate labels `\"2\", \"3\", \"3\"`:</span></span></span>\n<span class=\"r-in\"><span>  <span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span>, <span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">3</span>, <span class=\"fu\">lbl_endpoints</span><span class=\"op\">(</span>left <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span> <span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/lbl_endpoints.md",
    "content": "# Label chopped intervals by their left or right endpoints\n\nThis is useful when the left endpoint unambiguously indicates the\ninterval. In other cases it may give errors due to duplicate labels.\n\n## Usage\n\n``` r\nlbl_endpoints(\n  left = TRUE,\n  fmt = NULL,\n  single = NULL,\n  first = NULL,\n  last = NULL,\n  raw = deprecated()\n)\n\nlbl_endpoint(fmt = NULL, raw = FALSE, left = TRUE)\n```\n\n## Arguments\n\n- left:\n\n  Flag. Use left endpoint or right endpoint?\n\n- fmt:\n\n  String, list or function. A format for break endpoints.\n\n- single:\n\n  Glue string: label for singleton intervals. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details. If `NULL`, singleton intervals will be labelled the same\n  way as other intervals.\n\n- first:\n\n  Glue string: override label for the first category. Write e.g.\n  `first = \"<{r}\"` to create a label like `\"<18\"`. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details.\n\n- last:\n\n  String: override label for the last category. Write e.g.\n  `last = \">{l}\"` to create a label like `\">65\"`. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details.\n\n- raw:\n\n  **\\[deprecated\\]**. Throws an error. Use the `raw` argument to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n  instead.\n\n## Value\n\nA function that creates a vector of labels.\n\n## Details\n\n`lbl_endpoint()` is **\\[defunct\\]** and gives an error since santoku\n1.0.0.\n\n## Formatting endpoints\n\nIf `fmt` is not `NULL` then it is used to format the endpoints.\n\n- If `fmt` is a string, then numeric endpoints will be formatted by\n  `sprintf(fmt, breaks)`; other endpoints, e.g.\n  [Date](https://rdrr.io/r/base/Dates.html) objects, will be formatted\n  by `format(breaks, fmt)`.\n\n- If `fmt` is a list, then it will be used as arguments to\n  [format](https://rdrr.io/r/base/format.html).\n\n- If `fmt` is a function, it should take a vector of numbers (or other\n  objects that can be used as breaks) and return a character vector. It\n  may be helpful to use functions from the `{scales}` package, e.g.\n  [`scales::label_comma()`](https://scales.r-lib.org/reference/label_number.html).\n\n## See also\n\nOther labelling functions:\n[`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md),\n[`lbl_date()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md),\n[`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md),\n[`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md),\n[`lbl_intervals()`](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md),\n[`lbl_manual()`](https://hughjonesd.github.io/santoku/reference/lbl_manual.md),\n[`lbl_midpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_midpoints.md),\n[`lbl_seq()`](https://hughjonesd.github.io/santoku/reference/lbl_seq.md)\n\n## Examples\n\n``` r\nchop(1:10, c(2, 5, 8), lbl_endpoints(left = TRUE))\n#>  [1] 1 2 2 2 5 5 5 8 8 8\n#> Levels: 1 2 5 8\nchop(1:10, c(2, 5, 8), lbl_endpoints(left = FALSE))\n#>  [1] 2  5  5  5  8  8  8  10 10 10\n#> Levels: 2 5 8 10\nif (requireNamespace(\"lubridate\")) {\n  tab_width(\n          as.Date(\"2000-01-01\") + 0:365,\n         months(1),\n         labels = lbl_endpoints(fmt = \"%b\")\n       )\n}\n#> Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec \n#>  31  29  31  30  31  30  31  31  30  31  30  31 \n\nif (FALSE) { # \\dontrun{\n  # This gives breaks `[1, 2) [2, 3) {3}` which lead to\n  # duplicate labels `\"2\", \"3\", \"3\"`:\n  chop(1:3, 1:3, lbl_endpoints(left = FALSE))\n} # }\n```\n"
  },
  {
    "path": "docs/reference/lbl_format.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><meta name=\"description\" content=\"\"><title>Label chopped intervals with arbitrary formatting — lbl_format • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../favicon-16x16.png\"><link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../favicon-32x32.png\"><link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"120x120\" href=\"../apple-touch-icon-120x120.png\"><link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"76x76\" href=\"../apple-touch-icon-76x76.png\"><link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"60x60\" href=\"../apple-touch-icon-60x60.png\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.1.0/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.1.0/bootstrap.bundle.min.js\"></script><!-- Font Awesome icons --><link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css\" integrity=\"sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=\" crossorigin=\"anonymous\"><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\"><!-- bootstrap-toc --><script src=\"https://cdn.rawgit.com/afeld/bootstrap-toc/v1.0.1/dist/bootstrap-toc.min.js\"></script><!-- headroom.js --><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><script src=\"https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js\" integrity=\"sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=\" crossorigin=\"anonymous\"></script><!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js\" integrity=\"sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=\" crossorigin=\"anonymous\"></script><!-- search --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/fuse.js/6.4.6/fuse.js\" integrity=\"sha512-zv6Ywkjyktsohkbp9bb45V6tEMoWhzFzXis+LrMehmJZZSys19Yxf1dopHx7WzIKxr5tK2dVcYmaCk2uqdjF4A==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/autocomplete.js/0.38.0/autocomplete.jquery.min.js\" integrity=\"sha512-GU9ayf+66Xx2TmpxqJpliWbT5PiGYxpaG8rfnBEk1LL8l1KGkRShhngwdXK1UgqhAzWpZHSiYPc09/NwDQIGyg==\" crossorigin=\"anonymous\"></script><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/mark.min.js\" integrity=\"sha512-5CYOlHXGh6QpOFA/TeTylKLWfB3ftPsde7AnmhuitiTX4K5SqCLBeKro6sPS8ilsz1Q4NRx3v8Ko2IBiszzdww==\" crossorigin=\"anonymous\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Label chopped intervals with arbitrary formatting — lbl_format\"><meta property=\"og:description\" content=\"\"><meta property=\"og:image\" content=\"/logo.png\"><!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js\" integrity=\"sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=\" crossorigin=\"anonymous\"></script><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><!--[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]--></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n    \n\n    <nav class=\"navbar fixed-top navbar-dark navbar-expand-lg bg-primary\"><div class=\"container\">\n    \n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">0.6.0.9000</small>\n\n    \n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a>\n</li>\n<li class=\"active nav-item\">\n  <a class=\"nav-link\" href=\"../reference/index.html\">Reference</a>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-articles\">Articles</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-articles\">\n    <a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a>\n  </div>\n</li>\n<li class=\"nav-item dropdown\">\n  <a href=\"#\" class=\"nav-link dropdown-toggle\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" aria-haspopup=\"true\" id=\"dropdown-tutorials\">Tutorials</a>\n  <div class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\">\n    <a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to Santoku</a>\n    <a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a>\n  </div>\n</li>\n<li class=\"nav-item\">\n  <a class=\"nav-link\" href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul><form class=\"form-inline my-2 my-lg-0\" role=\"search\">\n        <input type=\"search\" class=\"form-control me-sm-2\" aria-label=\"Toggle navigation\" name=\"search-input\" data-search-index=\"../search.json\" id=\"search-input\" placeholder=\"Search for\" autocomplete=\"off\"></form>\n\n      <ul class=\"navbar-nav\"><li class=\"nav-item\">\n  <a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"github\">\n    <span class=\"fab fa fab fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul></div>\n\n    \n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Label chopped intervals with arbitrary formatting</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/labels.R\" class=\"external-link\"><code>R/labels.R</code></a></small>\n      <div class=\"d-none name\"><code>lbl_format.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><a href=\"https://lifecycle.r-lib.org/articles/stages.html#questioning\" class=\"external-link\"><img src=\"figures/lifecycle-questioning.svg\" alt=\"[Questioning]\"></a></p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"fu\">lbl_format</span><span class=\"op\">(</span><span class=\"va\">fmt</span>, fmt1 <span class=\"op\">=</span> <span class=\"st\">\"%.3g\"</span>, raw <span class=\"op\">=</span> <span class=\"cn\">FALSE</span><span class=\"op\">)</span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n    <dl><dt>fmt</dt>\n<dd><p>A format. Can be a string, passed into <code><a href=\"https://rdrr.io/r/base/sprintf.html\" class=\"external-link\">base::sprintf()</a></code> or <code><a href=\"https://rdrr.io/r/base/format.html\" class=\"external-link\">format()</a></code>\nmethods; or a one-argument formatting function.</p></dd>\n<dt>fmt1</dt>\n<dd><p>Format for breaks consisting of a single value.</p></dd>\n<dt>raw</dt>\n<dd><p>Logical. Always use raw <code>breaks</code> in labels, rather than e.g. quantiles\nor standard deviations?</p></dd>\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A vector of labels for <code>chop</code>, or a function that creates labels.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>These labels let you format breaks arbitrarily, using either a string\n(passed to <code><a href=\"https://rdrr.io/r/base/sprintf.html\" class=\"external-link\">sprintf()</a></code>) or a function.</p>\n<p>If <code>fmt</code> is a function, it must accept two arguments, representing the\nleft and right endpoints of each interval.</p>\n<p>If <code>breaks</code> are non-numeric, you can only use <code>\"%s\"</code> in a string <code>fmt</code>.\n<code>breaks</code> will be converted to character in this case.</p>\n<p><code>lbl_format()</code> is in the \"questioning\" stage. As an alternative, consider\nusing <code><a href=\"lbl_dash.html\">lbl_dash()</a></code> or <code><a href=\"lbl_intervals.html\">lbl_intervals()</a></code> with the <code>fmt</code> argument.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other labelling functions: \n<code><a href=\"lbl_dash.html\">lbl_dash</a>()</code>,\n<code><a href=\"lbl_discrete.html\">lbl_discrete</a>()</code>,\n<code><a href=\"lbl_intervals.html\">lbl_intervals</a>()</code>,\n<code><a href=\"lbl_manual.html\">lbl_manual</a>()</code>,\n<code><a href=\"lbl_seq.html\">lbl_seq</a>()</code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"></span>\n<span class=\"r-in\"><span class=\"fu\"><a href=\"tab.html\">tab</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>,<span class=\"fl\">3</span>, <span class=\"fl\">3</span>, <span class=\"fl\">7</span><span class=\"op\">)</span>,</span>\n<span class=\"r-in\">      label <span class=\"op\">=</span> <span class=\"fu\">lbl_format</span><span class=\"op\">(</span><span class=\"st\">\"%.3g to %.3g\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  1 to 3       3  3 to 7 7 to 10 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       2       1       3       4 </span>\n<span class=\"r-in\"><span class=\"fu\"><a href=\"tab.html\">tab</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>,<span class=\"fl\">3</span>, <span class=\"fl\">3</span>, <span class=\"fl\">7</span><span class=\"op\">)</span>,</span>\n<span class=\"r-in\">      label <span class=\"op\">=</span> <span class=\"fu\">lbl_format</span><span class=\"op\">(</span><span class=\"st\">\"%.3g to %.3g\"</span>, <span class=\"st\">\"Exactly %.3g\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    1 to 3 Exactly 3    3 to 7   7 to 10 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         2         1         3         4 </span>\n<span class=\"r-in\"></span>\n<span class=\"r-in\"><span class=\"va\">percent2</span> <span class=\"op\">&lt;-</span> <span class=\"kw\">function</span> <span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">y</span><span class=\"op\">)</span> <span class=\"op\">{</span></span>\n<span class=\"r-in\">  <span class=\"fu\"><a href=\"https://rdrr.io/r/base/sprintf.html\" class=\"external-link\">sprintf</a></span><span class=\"op\">(</span><span class=\"st\">\"%.2f%% - %.2f%%\"</span>, <span class=\"va\">x</span><span class=\"op\">*</span><span class=\"fl\">100</span>, <span class=\"va\">y</span><span class=\"op\">*</span><span class=\"fl\">100</span><span class=\"op\">)</span></span>\n<span class=\"r-in\"><span class=\"op\">}</span></span>\n<span class=\"r-in\"><span class=\"fu\"><a href=\"tab.html\">tab</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"fl\">100</span><span class=\"op\">)</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">0.25</span>, <span class=\"fl\">0.5</span>, <span class=\"fl\">.75</span><span class=\"op\">)</span>,</span>\n<span class=\"r-in\">      labels <span class=\"op\">=</span> <span class=\"fu\">lbl_format</span><span class=\"op\">(</span><span class=\"va\">percent2</span><span class=\"op\">)</span><span class=\"op\">)</span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  0.64% - 25.00% 25.00% - 50.00% 50.00% - 75.00% 75.00% - 98.41% </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>              21              20              33              26 </span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p></p><p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p></p><p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.0.2.</p>\n</div>\n\n    </footer></div>\n\n  \n\n  \n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/lbl_format.md",
    "content": "# Label chopped intervals with arbitrary formatting\n\n**\\[questioning\\]**\n\n## Usage\n\n``` r\nlbl_format(fmt, fmt1 = \"%.3g\", raw = FALSE)\n```\n\n## Arguments\n\n- fmt:\n\n  A format. Can be a string, passed into\n  [`base::sprintf()`](https://rdrr.io/r/base/sprintf.html) or\n  [`format()`](https://rdrr.io/r/base/format.html) methods; or a\n  one-argument formatting function.\n\n- fmt1:\n\n  Format for breaks consisting of a single value.\n\n- raw:\n\n  Logical. Always use raw `breaks` in labels, rather than e.g. quantiles\n  or standard deviations?\n\n## Value\n\nA vector of labels for `chop`, or a function that creates labels.\n\n## Details\n\nThese labels let you format breaks arbitrarily, using either a string\n(passed to [`sprintf()`](https://rdrr.io/r/base/sprintf.html)) or a\nfunction.\n\nIf `fmt` is a function, it must accept two arguments, representing the\nleft and right endpoints of each interval.\n\nIf `breaks` are non-numeric, you can only use `\"%s\"` in a string `fmt`.\n`breaks` will be converted to character in this case.\n\n`lbl_format()` is in the \"questioning\" stage. As an alternative,\nconsider using\n[`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md)\nor\n[`lbl_intervals()`](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md)\nwith the `fmt` argument.\n\n## See also\n\nOther labelling functions:\n[`lbl_dash`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md)`()`,\n[`lbl_discrete`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md)`()`,\n[`lbl_intervals`](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md)`()`,\n[`lbl_manual`](https://hughjonesd.github.io/santoku/reference/lbl_manual.md)`()`,\n[`lbl_seq`](https://hughjonesd.github.io/santoku/reference/lbl_seq.md)`()`\n\n## Examples\n\n``` r\n\ntab(1:10, c(1,3, 3, 7),\n      label = lbl_format(\"%.3g to %.3g\"))\n#>  1 to 3       3  3 to 7 7 to 10 \n#>       2       1       3       4 \ntab(1:10, c(1,3, 3, 7),\n      label = lbl_format(\"%.3g to %.3g\", \"Exactly %.3g\"))\n#>    1 to 3 Exactly 3    3 to 7   7 to 10 \n#>         2         1         3         4 \n\npercent2 <- function (x, y) {\n  sprintf(\"%.2f%% - %.2f%%\", x*100, y*100)\n}\ntab(runif(100), c(0.25, 0.5, .75),\n      labels = lbl_format(percent2))\n#>  0.64% - 25.00% 25.00% - 50.00% 50.00% - 75.00% 75.00% - 98.41% \n#>              21              20              33              26 \n```\n"
  },
  {
    "path": "docs/reference/lbl_glue.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Label chopped intervals using the glue package — lbl_glue • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Label chopped intervals using the glue package — lbl_glue\"><meta name=\"description\" content='Use \"{l}\" and \"{r}\" to show the left and right endpoints of the intervals.'><meta property=\"og:description\" content='Use \"{l}\" and \"{r}\" to show the left and right endpoints of the intervals.'><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Label chopped intervals using the <code>glue</code> package</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/labels-glue.R\" class=\"external-link\"><code>R/labels-glue.R</code></a></small>\n      <div class=\"d-none name\"><code>lbl_glue.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Use <code>\"{l}\"</code> and <code>\"{r}\"</code> to show the left and right endpoints of the intervals.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">lbl_glue</span><span class=\"op\">(</span></span>\n<span>  <span class=\"va\">label</span>,</span>\n<span>  fmt <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  single <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  first <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  last <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  raw <span class=\"op\">=</span> <span class=\"fu\">deprecated</span><span class=\"op\">(</span><span class=\"op\">)</span>,</span>\n<span>  <span class=\"va\">...</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-label\">label<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-label\"></a></dt>\n<dd><p>A glue string passed to <code><a href=\"https://glue.tidyverse.org/reference/glue.html\" class=\"external-link\">glue::glue()</a></code>.</p></dd>\n\n\n<dt id=\"arg-fmt\">fmt<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-fmt\"></a></dt>\n<dd><p>String, list or function. A format for break endpoints.</p></dd>\n\n\n<dt id=\"arg-single\">single<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-single\"></a></dt>\n<dd><p>Glue string: label for singleton intervals. See <code>lbl_glue()</code>\nfor details. If <code>NULL</code>, singleton intervals will be labelled the same way\nas other intervals.</p></dd>\n\n\n<dt id=\"arg-first\">first<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-first\"></a></dt>\n<dd><p>Glue string: override label for the first category. Write e.g.\n<code>first = \"&lt;{r}\"</code> to create a label like <code>\"&lt;18\"</code>. See <code>lbl_glue()</code>\nfor details.</p></dd>\n\n\n<dt id=\"arg-last\">last<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-last\"></a></dt>\n<dd><p>String: override label for the last category. Write e.g.\n<code>last = \"&gt;{l}\"</code> to create a label like <code>\"&gt;65\"</code>. See <code>lbl_glue()</code>\nfor details.</p></dd>\n\n\n<dt id=\"arg-raw\">raw<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-raw\"></a></dt>\n<dd><p><a href=\"https://lifecycle.r-lib.org/articles/stages.html#deprecated\" class=\"external-link\"><img src=\"figures/lifecycle-deprecated.svg\" alt=\"[Deprecated]\"></a>. Throws an error.\nUse the <code>raw</code> argument to <code><a href=\"chop.html\">chop()</a></code> instead.</p></dd>\n\n\n<dt id=\"arg--\">...<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg--\"></a></dt>\n<dd><p>Further arguments passed to <code><a href=\"https://glue.tidyverse.org/reference/glue.html\" class=\"external-link\">glue::glue()</a></code>.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A function that creates a vector of labels.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>The following variables are available in the glue string:</p><ul><li><p><code>l</code> is a character vector of left endpoints of intervals.</p></li>\n<li><p><code>r</code> is a character vector of right endpoints of intervals.</p></li>\n<li><p><code>l_closed</code> is a logical vector. Elements are <code>TRUE</code> when the left\nendpoint is closed.</p></li>\n<li><p><code>r_closed</code> is a logical vector, <code>TRUE</code> when the right endpoint is closed.</p></li>\n</ul><p>Endpoints will be formatted by <code>fmt</code> before being passed to <code>glue()</code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"formatting-endpoints\">Formatting endpoints<a class=\"anchor\" aria-label=\"anchor\" href=\"#formatting-endpoints\"></a></h2>\n\n\n\n<p>If <code>fmt</code> is not <code>NULL</code> then it is used to format the endpoints.</p><ul><li><p>If <code>fmt</code> is a string, then numeric endpoints will be formatted by\n<code>sprintf(fmt, breaks)</code>; other endpoints, e.g. <a href=\"https://rdrr.io/r/base/Dates.html\" class=\"external-link\">Date</a> objects,\nwill be formatted by <code>format(breaks, fmt)</code>.</p></li>\n<li><p>If <code>fmt</code> is a list, then it will be used as arguments to <a href=\"https://rdrr.io/r/base/format.html\" class=\"external-link\">format</a>.</p></li>\n<li><p>If <code>fmt</code> is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the <code>{scales}</code> package, e.g. <code><a href=\"https://scales.r-lib.org/reference/label_number.html\" class=\"external-link\">scales::label_comma()</a></code>.</p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other labelling functions:\n<code><a href=\"lbl_dash.html\">lbl_dash()</a></code>,\n<code><a href=\"lbl_datetime.html\">lbl_date()</a></code>,\n<code><a href=\"lbl_discrete.html\">lbl_discrete()</a></code>,\n<code><a href=\"lbl_endpoints.html\">lbl_endpoints()</a></code>,\n<code><a href=\"lbl_intervals.html\">lbl_intervals()</a></code>,\n<code><a href=\"lbl_manual.html\">lbl_manual()</a></code>,\n<code><a href=\"lbl_midpoints.html\">lbl_midpoints()</a></code>,\n<code><a href=\"lbl_seq.html\">lbl_seq()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">tab</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">3</span>, <span class=\"fl\">3</span>, <span class=\"fl\">7</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>    labels <span class=\"op\">=</span> <span class=\"fu\">lbl_glue</span><span class=\"op\">(</span><span class=\"st\">\"{l} to {r}\"</span>, single <span class=\"op\">=</span> <span class=\"st\">\"Exactly {l}\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>    1 to 3 Exactly 3    3 to 7   7 to 10 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         2         1         3         4 </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">tab</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span> <span class=\"op\">*</span> <span class=\"fl\">1000</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">3</span>, <span class=\"fl\">5</span>, <span class=\"fl\">7</span><span class=\"op\">)</span> <span class=\"op\">*</span> <span class=\"fl\">1000</span>,</span></span>\n<span class=\"r-in\"><span>    labels <span class=\"op\">=</span> <span class=\"fu\">lbl_glue</span><span class=\"op\">(</span><span class=\"st\">\"{l}-{r}\"</span>,</span></span>\n<span class=\"r-in\"><span>                      fmt <span class=\"op\">=</span> <span class=\"kw\">function</span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/formatc.html\" class=\"external-link\">prettyNum</a></span><span class=\"op\">(</span><span class=\"va\">x</span>, big.mark<span class=\"op\">=</span><span class=\"st\">','</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  1,000-3,000  3,000-5,000  5,000-7,000 7,000-10,000 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>            2            2            2            4 </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># reproducing lbl_intervals():</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">interval_left</span> <span class=\"op\">&lt;-</span> <span class=\"st\">\"{ifelse(l_closed, '[', '(')}\"</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">interval_right</span> <span class=\"op\">&lt;-</span> <span class=\"st\">\"{ifelse(r_closed, ']', ')')}\"</span></span></span>\n<span class=\"r-in\"><span><span class=\"va\">glue_string</span> <span class=\"op\">&lt;-</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/paste.html\" class=\"external-link\">paste0</a></span><span class=\"op\">(</span><span class=\"va\">interval_left</span>, <span class=\"st\">\"{l}\"</span>, <span class=\"st\">\", \"</span>, <span class=\"st\">\"{r}\"</span>, <span class=\"va\">interval_right</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">tab</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">1</span>, <span class=\"fl\">3</span>, <span class=\"fl\">3</span>, <span class=\"fl\">7</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\">lbl_glue</span><span class=\"op\">(</span><span class=\"va\">glue_string</span>, single <span class=\"op\">=</span> <span class=\"st\">\"{{{l}}}\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1, 3)     {3}  (3, 7) [7, 10] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>       2       1       3       4 </span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/lbl_glue.md",
    "content": "# Label chopped intervals using the `glue` package\n\nUse `\"{l}\"` and `\"{r}\"` to show the left and right endpoints of the\nintervals.\n\n## Usage\n\n``` r\nlbl_glue(\n  label,\n  fmt = NULL,\n  single = NULL,\n  first = NULL,\n  last = NULL,\n  raw = deprecated(),\n  ...\n)\n```\n\n## Arguments\n\n- label:\n\n  A glue string passed to\n  [`glue::glue()`](https://glue.tidyverse.org/reference/glue.html).\n\n- fmt:\n\n  String, list or function. A format for break endpoints.\n\n- single:\n\n  Glue string: label for singleton intervals. See `lbl_glue()` for\n  details. If `NULL`, singleton intervals will be labelled the same way\n  as other intervals.\n\n- first:\n\n  Glue string: override label for the first category. Write e.g.\n  `first = \"<{r}\"` to create a label like `\"<18\"`. See `lbl_glue()` for\n  details.\n\n- last:\n\n  String: override label for the last category. Write e.g.\n  `last = \">{l}\"` to create a label like `\">65\"`. See `lbl_glue()` for\n  details.\n\n- raw:\n\n  **\\[deprecated\\]**. Throws an error. Use the `raw` argument to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n  instead.\n\n- ...:\n\n  Further arguments passed to\n  [`glue::glue()`](https://glue.tidyverse.org/reference/glue.html).\n\n## Value\n\nA function that creates a vector of labels.\n\n## Details\n\nThe following variables are available in the glue string:\n\n- `l` is a character vector of left endpoints of intervals.\n\n- `r` is a character vector of right endpoints of intervals.\n\n- `l_closed` is a logical vector. Elements are `TRUE` when the left\n  endpoint is closed.\n\n- `r_closed` is a logical vector, `TRUE` when the right endpoint is\n  closed.\n\nEndpoints will be formatted by `fmt` before being passed to `glue()`.\n\n## Formatting endpoints\n\nIf `fmt` is not `NULL` then it is used to format the endpoints.\n\n- If `fmt` is a string, then numeric endpoints will be formatted by\n  `sprintf(fmt, breaks)`; other endpoints, e.g.\n  [Date](https://rdrr.io/r/base/Dates.html) objects, will be formatted\n  by `format(breaks, fmt)`.\n\n- If `fmt` is a list, then it will be used as arguments to\n  [format](https://rdrr.io/r/base/format.html).\n\n- If `fmt` is a function, it should take a vector of numbers (or other\n  objects that can be used as breaks) and return a character vector. It\n  may be helpful to use functions from the `{scales}` package, e.g.\n  [`scales::label_comma()`](https://scales.r-lib.org/reference/label_number.html).\n\n## See also\n\nOther labelling functions:\n[`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md),\n[`lbl_date()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md),\n[`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md),\n[`lbl_endpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md),\n[`lbl_intervals()`](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md),\n[`lbl_manual()`](https://hughjonesd.github.io/santoku/reference/lbl_manual.md),\n[`lbl_midpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_midpoints.md),\n[`lbl_seq()`](https://hughjonesd.github.io/santoku/reference/lbl_seq.md)\n\n## Examples\n\n``` r\ntab(1:10, c(1, 3, 3, 7),\n    labels = lbl_glue(\"{l} to {r}\", single = \"Exactly {l}\"))\n#>    1 to 3 Exactly 3    3 to 7   7 to 10 \n#>         2         1         3         4 \n\ntab(1:10 * 1000, c(1, 3, 5, 7) * 1000,\n    labels = lbl_glue(\"{l}-{r}\",\n                      fmt = function(x) prettyNum(x, big.mark=',')))\n#>  1,000-3,000  3,000-5,000  5,000-7,000 7,000-10,000 \n#>            2            2            2            4 \n\n# reproducing lbl_intervals():\ninterval_left <- \"{ifelse(l_closed, '[', '(')}\"\ninterval_right <- \"{ifelse(r_closed, ']', ')')}\"\nglue_string <- paste0(interval_left, \"{l}\", \", \", \"{r}\", interval_right)\ntab(1:10, c(1, 3, 3, 7), labels = lbl_glue(glue_string, single = \"{{{l}}}\"))\n#>  [1, 3)     {3}  (3, 7) [7, 10] \n#>       2       1       3       4 \n```\n"
  },
  {
    "path": "docs/reference/lbl_intervals.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Label chopped intervals using set notation — lbl_intervals • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Label chopped intervals using set notation — lbl_intervals\"><meta name=\"description\" content='These labels are the most exact, since they show you whether\nintervals are \"closed\" or \"open\", i.e. whether they include their endpoints.'><meta property=\"og:description\" content='These labels are the most exact, since they show you whether\nintervals are \"closed\" or \"open\", i.e. whether they include their endpoints.'><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Label chopped intervals using set notation</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/labels.R\" class=\"external-link\"><code>R/labels.R</code></a></small>\n      <div class=\"d-none name\"><code>lbl_intervals.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>These labels are the most exact, since they show you whether\nintervals are \"closed\" or \"open\", i.e. whether they include their endpoints.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">lbl_intervals</span><span class=\"op\">(</span></span>\n<span>  fmt <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  single <span class=\"op\">=</span> <span class=\"st\">\"{{{l}}}\"</span>,</span>\n<span>  first <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  last <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  raw <span class=\"op\">=</span> <span class=\"fu\">deprecated</span><span class=\"op\">(</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-fmt\">fmt<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-fmt\"></a></dt>\n<dd><p>String, list or function. A format for break endpoints.</p></dd>\n\n\n<dt id=\"arg-single\">single<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-single\"></a></dt>\n<dd><p>Glue string: label for singleton intervals. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details. If <code>NULL</code>, singleton intervals will be labelled the same way\nas other intervals.</p></dd>\n\n\n<dt id=\"arg-first\">first<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-first\"></a></dt>\n<dd><p>Glue string: override label for the first category. Write e.g.\n<code>first = \"&lt;{r}\"</code> to create a label like <code>\"&lt;18\"</code>. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details.</p></dd>\n\n\n<dt id=\"arg-last\">last<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-last\"></a></dt>\n<dd><p>String: override label for the last category. Write e.g.\n<code>last = \"&gt;{l}\"</code> to create a label like <code>\"&gt;65\"</code>. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details.</p></dd>\n\n\n<dt id=\"arg-raw\">raw<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-raw\"></a></dt>\n<dd><p><a href=\"https://lifecycle.r-lib.org/articles/stages.html#deprecated\" class=\"external-link\"><img src=\"figures/lifecycle-deprecated.svg\" alt=\"[Deprecated]\"></a>. Throws an error.\nUse the <code>raw</code> argument to <code><a href=\"chop.html\">chop()</a></code> instead.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A function that creates a vector of labels.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Mathematical set notation looks like this:</p><ul><li><p><code>[a, b]</code>: all numbers <code>x</code> where <code>a &lt;= x &lt;= b</code>;</p></li>\n<li><p><code>(a, b)</code>: all numbers where <code>a &lt; x &lt; b</code>;</p></li>\n<li><p><code>[a, b)</code>: all numbers where <code>a &lt;= x &lt; b</code>;</p></li>\n<li><p><code>(a, b]</code>: all numbers where <code>a &lt; x &lt;= b</code>;</p></li>\n<li><p><code>{a}</code>: just the number <code>a</code> exactly.</p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"formatting-endpoints\">Formatting endpoints<a class=\"anchor\" aria-label=\"anchor\" href=\"#formatting-endpoints\"></a></h2>\n\n\n\n<p>If <code>fmt</code> is not <code>NULL</code> then it is used to format the endpoints.</p><ul><li><p>If <code>fmt</code> is a string, then numeric endpoints will be formatted by\n<code>sprintf(fmt, breaks)</code>; other endpoints, e.g. <a href=\"https://rdrr.io/r/base/Dates.html\" class=\"external-link\">Date</a> objects,\nwill be formatted by <code>format(breaks, fmt)</code>.</p></li>\n<li><p>If <code>fmt</code> is a list, then it will be used as arguments to <a href=\"https://rdrr.io/r/base/format.html\" class=\"external-link\">format</a>.</p></li>\n<li><p>If <code>fmt</code> is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the <code>{scales}</code> package, e.g. <code><a href=\"https://scales.r-lib.org/reference/label_number.html\" class=\"external-link\">scales::label_comma()</a></code>.</p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other labelling functions:\n<code><a href=\"lbl_dash.html\">lbl_dash()</a></code>,\n<code><a href=\"lbl_datetime.html\">lbl_date()</a></code>,\n<code><a href=\"lbl_discrete.html\">lbl_discrete()</a></code>,\n<code><a href=\"lbl_endpoints.html\">lbl_endpoints()</a></code>,\n<code><a href=\"lbl_glue.html\">lbl_glue()</a></code>,\n<code><a href=\"lbl_manual.html\">lbl_manual()</a></code>,\n<code><a href=\"lbl_midpoints.html\">lbl_midpoints()</a></code>,\n<code><a href=\"lbl_seq.html\">lbl_seq()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">tab</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">10</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">3</span>, <span class=\"fl\">0</span>, <span class=\"fl\">0</span>, <span class=\"fl\">3</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>      labels <span class=\"op\">=</span> <span class=\"fu\">lbl_intervals</span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [-10, -3)   [-3, 0)       {0}    (0, 3)   [3, 10] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>         7         3         1         2         8 </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">tab</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">10</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"op\">-</span><span class=\"fl\">3</span>, <span class=\"fl\">0</span>, <span class=\"fl\">0</span>, <span class=\"fl\">3</span><span class=\"op\">)</span>,</span></span>\n<span class=\"r-in\"><span>      labels <span class=\"op\">=</span> <span class=\"fu\">lbl_intervals</span><span class=\"op\">(</span>fmt <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/list.html\" class=\"external-link\">list</a></span><span class=\"op\">(</span>nsmall <span class=\"op\">=</span> <span class=\"fl\">1</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [-10.0,  -3.0) [ -3.0,   0.0)        {  0.0} (  0.0,   3.0) [  3.0,  10.0] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>              7              3              1              2              8 </span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop_evenly.html\">tab_evenly</a></span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/stats/Uniform.html\" class=\"external-link\">runif</a></span><span class=\"op\">(</span><span class=\"fl\">20</span><span class=\"op\">)</span>, <span class=\"fl\">10</span>,</span></span>\n<span class=\"r-in\"><span>      labels <span class=\"op\">=</span> <span class=\"fu\">lbl_intervals</span><span class=\"op\">(</span>fmt <span class=\"op\">=</span> <span class=\"va\">percent</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [6.095%, 15.1%)  [15.1%, 24.11%) [24.11%, 33.11%) [33.11%, 42.12%) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                1                2                4                2 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [42.12%, 51.12%) [51.12%, 60.13%) [60.13%, 69.13%) [78.14%, 87.14%) </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                2                4                1                2 </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [87.14%, 96.15%] </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>                2 </span>\n<span class=\"r-in\"><span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/lbl_intervals.md",
    "content": "# Label chopped intervals using set notation\n\nThese labels are the most exact, since they show you whether intervals\nare \"closed\" or \"open\", i.e. whether they include their endpoints.\n\n## Usage\n\n``` r\nlbl_intervals(\n  fmt = NULL,\n  single = \"{{{l}}}\",\n  first = NULL,\n  last = NULL,\n  raw = deprecated()\n)\n```\n\n## Arguments\n\n- fmt:\n\n  String, list or function. A format for break endpoints.\n\n- single:\n\n  Glue string: label for singleton intervals. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details. If `NULL`, singleton intervals will be labelled the same\n  way as other intervals.\n\n- first:\n\n  Glue string: override label for the first category. Write e.g.\n  `first = \"<{r}\"` to create a label like `\"<18\"`. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details.\n\n- last:\n\n  String: override label for the last category. Write e.g.\n  `last = \">{l}\"` to create a label like `\">65\"`. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details.\n\n- raw:\n\n  **\\[deprecated\\]**. Throws an error. Use the `raw` argument to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n  instead.\n\n## Value\n\nA function that creates a vector of labels.\n\n## Details\n\nMathematical set notation looks like this:\n\n- `[a, b]`: all numbers `x` where `a <= x <= b`;\n\n- `(a, b)`: all numbers where `a < x < b`;\n\n- `[a, b)`: all numbers where `a <= x < b`;\n\n- `(a, b]`: all numbers where `a < x <= b`;\n\n- `{a}`: just the number `a` exactly.\n\n## Formatting endpoints\n\nIf `fmt` is not `NULL` then it is used to format the endpoints.\n\n- If `fmt` is a string, then numeric endpoints will be formatted by\n  `sprintf(fmt, breaks)`; other endpoints, e.g.\n  [Date](https://rdrr.io/r/base/Dates.html) objects, will be formatted\n  by `format(breaks, fmt)`.\n\n- If `fmt` is a list, then it will be used as arguments to\n  [format](https://rdrr.io/r/base/format.html).\n\n- If `fmt` is a function, it should take a vector of numbers (or other\n  objects that can be used as breaks) and return a character vector. It\n  may be helpful to use functions from the `{scales}` package, e.g.\n  [`scales::label_comma()`](https://scales.r-lib.org/reference/label_number.html).\n\n## See also\n\nOther labelling functions:\n[`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md),\n[`lbl_date()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md),\n[`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md),\n[`lbl_endpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md),\n[`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md),\n[`lbl_manual()`](https://hughjonesd.github.io/santoku/reference/lbl_manual.md),\n[`lbl_midpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_midpoints.md),\n[`lbl_seq()`](https://hughjonesd.github.io/santoku/reference/lbl_seq.md)\n\n## Examples\n\n``` r\n\ntab(-10:10, c(-3, 0, 0, 3),\n      labels = lbl_intervals())\n#> [-10, -3)   [-3, 0)       {0}    (0, 3)   [3, 10] \n#>         7         3         1         2         8 \n\ntab(-10:10, c(-3, 0, 0, 3),\n      labels = lbl_intervals(fmt = list(nsmall = 1)))\n#> [-10.0,  -3.0) [ -3.0,   0.0)        {  0.0} (  0.0,   3.0) [  3.0,  10.0] \n#>              7              3              1              2              8 \n\ntab_evenly(runif(20), 10,\n      labels = lbl_intervals(fmt = percent))\n#>  [6.095%, 15.1%)  [15.1%, 24.11%) [24.11%, 33.11%) [33.11%, 42.12%) \n#>                1                2                4                2 \n#> [42.12%, 51.12%) [51.12%, 60.13%) [60.13%, 69.13%) [78.14%, 87.14%) \n#>                2                4                1                2 \n#> [87.14%, 96.15%] \n#>                2 \n```\n"
  },
  {
    "path": "docs/reference/lbl_manual.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Defunct: label chopped intervals in a user-defined sequence — lbl_manual • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Defunct: label chopped intervals in a user-defined sequence — lbl_manual\"><meta name=\"description\" content=\"\"><meta property=\"og:description\" content=\"\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Defunct: label chopped intervals in a user-defined sequence</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/labels-single.R\" class=\"external-link\"><code>R/labels-single.R</code></a></small>\n      <div class=\"d-none name\"><code>lbl_manual.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><a href=\"https://lifecycle.r-lib.org/articles/stages.html#defunct\" class=\"external-link\"><img src=\"figures/lifecycle-defunct.svg\" alt=\"[Defunct]\"></a></p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">lbl_manual</span><span class=\"op\">(</span><span class=\"va\">sequence</span>, fmt <span class=\"op\">=</span> <span class=\"st\">\"%s\"</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-sequence\">sequence<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-sequence\"></a></dt>\n<dd><p>A character vector of labels.</p></dd>\n\n\n<dt id=\"arg-fmt\">fmt<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-fmt\"></a></dt>\n<dd><p>String, list or function. A format for break endpoints.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A function that creates a vector of labels.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p><code>lbl_manual()</code> is defunct since santoku 1.0.0. It is little used and is not\nclosely related to the rest of the package. It also risks mislabelling\nintervals, e.g. if intervals are extended. Use of <code>lbl_manual()</code> will give\nan error.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"formatting-endpoints\">Formatting endpoints<a class=\"anchor\" aria-label=\"anchor\" href=\"#formatting-endpoints\"></a></h2>\n\n\n\n<p>If <code>fmt</code> is not <code>NULL</code> then it is used to format the endpoints.</p><ul><li><p>If <code>fmt</code> is a string, then numeric endpoints will be formatted by\n<code>sprintf(fmt, breaks)</code>; other endpoints, e.g. <a href=\"https://rdrr.io/r/base/Dates.html\" class=\"external-link\">Date</a> objects,\nwill be formatted by <code>format(breaks, fmt)</code>.</p></li>\n<li><p>If <code>fmt</code> is a list, then it will be used as arguments to <a href=\"https://rdrr.io/r/base/format.html\" class=\"external-link\">format</a>.</p></li>\n<li><p>If <code>fmt</code> is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the <code>{scales}</code> package, e.g. <code><a href=\"https://scales.r-lib.org/reference/label_number.html\" class=\"external-link\">scales::label_comma()</a></code>.</p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other labelling functions:\n<code><a href=\"lbl_dash.html\">lbl_dash()</a></code>,\n<code><a href=\"lbl_datetime.html\">lbl_date()</a></code>,\n<code><a href=\"lbl_discrete.html\">lbl_discrete()</a></code>,\n<code><a href=\"lbl_endpoints.html\">lbl_endpoints()</a></code>,\n<code><a href=\"lbl_glue.html\">lbl_glue()</a></code>,\n<code><a href=\"lbl_intervals.html\">lbl_intervals()</a></code>,\n<code><a href=\"lbl_midpoints.html\">lbl_midpoints()</a></code>,\n<code><a href=\"lbl_seq.html\">lbl_seq()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"kw\">if</span> <span class=\"op\">(</span><span class=\"cn\">FALSE</span><span class=\"op\">)</span> <span class=\"op\">{</span> <span class=\"co\"># \\dontrun{</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, <span class=\"fu\">lbl_manual</span><span class=\"op\">(</span><span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"w\"</span>, <span class=\"st\">\"x\"</span>, <span class=\"st\">\"y\"</span>, <span class=\"st\">\"z\"</span><span class=\"op\">)</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"co\"># -&gt;</span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, labels <span class=\"op\">=</span> <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"st\">\"w\"</span>, <span class=\"st\">\"x\"</span>, <span class=\"st\">\"y\"</span>, <span class=\"st\">\"z\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-in\"><span><span class=\"op\">}</span> <span class=\"co\"># }</span></span></span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/lbl_manual.md",
    "content": "# Defunct: label chopped intervals in a user-defined sequence\n\n**\\[defunct\\]**\n\n## Usage\n\n``` r\nlbl_manual(sequence, fmt = \"%s\")\n```\n\n## Arguments\n\n- sequence:\n\n  A character vector of labels.\n\n- fmt:\n\n  String, list or function. A format for break endpoints.\n\n## Value\n\nA function that creates a vector of labels.\n\n## Details\n\n`lbl_manual()` is defunct since santoku 1.0.0. It is little used and is\nnot closely related to the rest of the package. It also risks\nmislabelling intervals, e.g. if intervals are extended. Use of\n`lbl_manual()` will give an error.\n\n## Formatting endpoints\n\nIf `fmt` is not `NULL` then it is used to format the endpoints.\n\n- If `fmt` is a string, then numeric endpoints will be formatted by\n  `sprintf(fmt, breaks)`; other endpoints, e.g.\n  [Date](https://rdrr.io/r/base/Dates.html) objects, will be formatted\n  by `format(breaks, fmt)`.\n\n- If `fmt` is a list, then it will be used as arguments to\n  [format](https://rdrr.io/r/base/format.html).\n\n- If `fmt` is a function, it should take a vector of numbers (or other\n  objects that can be used as breaks) and return a character vector. It\n  may be helpful to use functions from the `{scales}` package, e.g.\n  [`scales::label_comma()`](https://scales.r-lib.org/reference/label_number.html).\n\n## See also\n\nOther labelling functions:\n[`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md),\n[`lbl_date()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md),\n[`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md),\n[`lbl_endpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md),\n[`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md),\n[`lbl_intervals()`](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md),\n[`lbl_midpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_midpoints.md),\n[`lbl_seq()`](https://hughjonesd.github.io/santoku/reference/lbl_seq.md)\n\n## Examples\n\n``` r\nif (FALSE) { # \\dontrun{\nchop(1:10, c(2, 5, 8), lbl_manual(c(\"w\", \"x\", \"y\", \"z\")))\n# ->\nchop(1:10, c(2, 5, 8), labels = c(\"w\", \"x\", \"y\", \"z\"))\n} # }\n```\n"
  },
  {
    "path": "docs/reference/lbl_midpoints.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Label chopped intervals by their midpoints — lbl_midpoints • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Label chopped intervals by their midpoints — lbl_midpoints\"><meta name=\"description\" content=\"This uses the midpoint of each interval for\nits label.\"><meta property=\"og:description\" content=\"This uses the midpoint of each interval for\nits label.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Label chopped intervals by their midpoints</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/labels-single.R\" class=\"external-link\"><code>R/labels-single.R</code></a></small>\n      <div class=\"d-none name\"><code>lbl_midpoints.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>This uses the midpoint of each interval for\nits label.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">lbl_midpoints</span><span class=\"op\">(</span></span>\n<span>  fmt <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  single <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  first <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  last <span class=\"op\">=</span> <span class=\"cn\">NULL</span>,</span>\n<span>  raw <span class=\"op\">=</span> <span class=\"fu\">deprecated</span><span class=\"op\">(</span><span class=\"op\">)</span></span>\n<span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-fmt\">fmt<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-fmt\"></a></dt>\n<dd><p>String, list or function. A format for break endpoints.</p></dd>\n\n\n<dt id=\"arg-single\">single<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-single\"></a></dt>\n<dd><p>Glue string: label for singleton intervals. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details. If <code>NULL</code>, singleton intervals will be labelled the same way\nas other intervals.</p></dd>\n\n\n<dt id=\"arg-first\">first<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-first\"></a></dt>\n<dd><p>Glue string: override label for the first category. Write e.g.\n<code>first = \"&lt;{r}\"</code> to create a label like <code>\"&lt;18\"</code>. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details.</p></dd>\n\n\n<dt id=\"arg-last\">last<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-last\"></a></dt>\n<dd><p>String: override label for the last category. Write e.g.\n<code>last = \"&gt;{l}\"</code> to create a label like <code>\"&gt;65\"</code>. See <code><a href=\"lbl_glue.html\">lbl_glue()</a></code>\nfor details.</p></dd>\n\n\n<dt id=\"arg-raw\">raw<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-raw\"></a></dt>\n<dd><p><a href=\"https://lifecycle.r-lib.org/articles/stages.html#deprecated\" class=\"external-link\"><img src=\"figures/lifecycle-deprecated.svg\" alt=\"[Deprecated]\"></a>. Throws an error.\nUse the <code>raw</code> argument to <code><a href=\"chop.html\">chop()</a></code> instead.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A function that creates a vector of labels.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"formatting-endpoints\">Formatting endpoints<a class=\"anchor\" aria-label=\"anchor\" href=\"#formatting-endpoints\"></a></h2>\n\n\n\n<p>If <code>fmt</code> is not <code>NULL</code> then it is used to format the endpoints.</p><ul><li><p>If <code>fmt</code> is a string, then numeric endpoints will be formatted by\n<code>sprintf(fmt, breaks)</code>; other endpoints, e.g. <a href=\"https://rdrr.io/r/base/Dates.html\" class=\"external-link\">Date</a> objects,\nwill be formatted by <code>format(breaks, fmt)</code>.</p></li>\n<li><p>If <code>fmt</code> is a list, then it will be used as arguments to <a href=\"https://rdrr.io/r/base/format.html\" class=\"external-link\">format</a>.</p></li>\n<li><p>If <code>fmt</code> is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the <code>{scales}</code> package, e.g. <code><a href=\"https://scales.r-lib.org/reference/label_number.html\" class=\"external-link\">scales::label_comma()</a></code>.</p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other labelling functions:\n<code><a href=\"lbl_dash.html\">lbl_dash()</a></code>,\n<code><a href=\"lbl_datetime.html\">lbl_date()</a></code>,\n<code><a href=\"lbl_discrete.html\">lbl_discrete()</a></code>,\n<code><a href=\"lbl_endpoints.html\">lbl_endpoints()</a></code>,\n<code><a href=\"lbl_glue.html\">lbl_glue()</a></code>,\n<code><a href=\"lbl_intervals.html\">lbl_intervals()</a></code>,\n<code><a href=\"lbl_manual.html\">lbl_manual()</a></code>,\n<code><a href=\"lbl_seq.html\">lbl_seq()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, <span class=\"fu\">lbl_midpoints</span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] 1.5 3.5 3.5 3.5 6.5 6.5 6.5 9   9   9  </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: 1.5 3.5 6.5 9</span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/lbl_midpoints.md",
    "content": "# Label chopped intervals by their midpoints\n\nThis uses the midpoint of each interval for its label.\n\n## Usage\n\n``` r\nlbl_midpoints(\n  fmt = NULL,\n  single = NULL,\n  first = NULL,\n  last = NULL,\n  raw = deprecated()\n)\n```\n\n## Arguments\n\n- fmt:\n\n  String, list or function. A format for break endpoints.\n\n- single:\n\n  Glue string: label for singleton intervals. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details. If `NULL`, singleton intervals will be labelled the same\n  way as other intervals.\n\n- first:\n\n  Glue string: override label for the first category. Write e.g.\n  `first = \"<{r}\"` to create a label like `\"<18\"`. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details.\n\n- last:\n\n  String: override label for the last category. Write e.g.\n  `last = \">{l}\"` to create a label like `\">65\"`. See\n  [`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md)\n  for details.\n\n- raw:\n\n  **\\[deprecated\\]**. Throws an error. Use the `raw` argument to\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n  instead.\n\n## Value\n\nA function that creates a vector of labels.\n\n## Formatting endpoints\n\nIf `fmt` is not `NULL` then it is used to format the endpoints.\n\n- If `fmt` is a string, then numeric endpoints will be formatted by\n  `sprintf(fmt, breaks)`; other endpoints, e.g.\n  [Date](https://rdrr.io/r/base/Dates.html) objects, will be formatted\n  by `format(breaks, fmt)`.\n\n- If `fmt` is a list, then it will be used as arguments to\n  [format](https://rdrr.io/r/base/format.html).\n\n- If `fmt` is a function, it should take a vector of numbers (or other\n  objects that can be used as breaks) and return a character vector. It\n  may be helpful to use functions from the `{scales}` package, e.g.\n  [`scales::label_comma()`](https://scales.r-lib.org/reference/label_number.html).\n\n## See also\n\nOther labelling functions:\n[`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md),\n[`lbl_date()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md),\n[`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md),\n[`lbl_endpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md),\n[`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md),\n[`lbl_intervals()`](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md),\n[`lbl_manual()`](https://hughjonesd.github.io/santoku/reference/lbl_manual.md),\n[`lbl_seq()`](https://hughjonesd.github.io/santoku/reference/lbl_seq.md)\n\n## Examples\n\n``` r\nchop(1:10, c(2, 5, 8), lbl_midpoints())\n#>  [1] 1.5 3.5 3.5 3.5 6.5 6.5 6.5 9   9   9  \n#> Levels: 1.5 3.5 6.5 9\n```\n"
  },
  {
    "path": "docs/reference/lbl_seq.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Label chopped intervals in sequence — lbl_seq • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Label chopped intervals in sequence — lbl_seq\"><meta name=\"description\" content=\"lbl_seq() labels intervals sequentially, using numbers or letters.\"><meta property=\"og:description\" content=\"lbl_seq() labels intervals sequentially, using numbers or letters.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Label chopped intervals in sequence</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/labels-single.R\" class=\"external-link\"><code>R/labels-single.R</code></a></small>\n      <div class=\"d-none name\"><code>lbl_seq.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>lbl_seq()</code> labels intervals sequentially, using numbers or letters.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">lbl_seq</span><span class=\"op\">(</span>start <span class=\"op\">=</span> <span class=\"st\">\"a\"</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-start\">start<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-start\"></a></dt>\n<dd><p>String. A template for the sequence. See below.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A function that creates a vector of labels.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p><code>start</code> shows the first element of the sequence. It must contain exactly <em>one</em>\ncharacter out of the set \"a\", \"A\", \"i\", \"I\" or \"1\". For later elements:</p><ul><li><p>\"a\" will be replaced by \"a\", \"b\", \"c\", ...</p></li>\n<li><p>\"A\" will be replaced by \"A\", \"B\", \"C\", ...</p></li>\n<li><p>\"i\" will be replaced by lower-case Roman numerals \"i\", \"ii\", \"iii\", ...</p></li>\n<li><p>\"I\" will be replaced by upper-case Roman numerals \"I\", \"II\", \"III\", ...</p></li>\n<li><p>\"1\" will be replaced by numbers \"1\", \"2\", \"3\", ...</p></li>\n</ul><p>Other characters will be retained as-is.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Other labelling functions:\n<code><a href=\"lbl_dash.html\">lbl_dash()</a></code>,\n<code><a href=\"lbl_datetime.html\">lbl_date()</a></code>,\n<code><a href=\"lbl_discrete.html\">lbl_discrete()</a></code>,\n<code><a href=\"lbl_endpoints.html\">lbl_endpoints()</a></code>,\n<code><a href=\"lbl_glue.html\">lbl_glue()</a></code>,\n<code><a href=\"lbl_intervals.html\">lbl_intervals()</a></code>,\n<code><a href=\"lbl_manual.html\">lbl_manual()</a></code>,\n<code><a href=\"lbl_midpoints.html\">lbl_midpoints()</a></code></p></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, <span class=\"fu\">lbl_seq</span><span class=\"op\">(</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] a b b b c c c d d d</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: a b c d</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, <span class=\"fu\">lbl_seq</span><span class=\"op\">(</span><span class=\"st\">\"i.\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] i.   ii.  ii.  ii.  iii. iii. iii. iv.  iv.  iv. </span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: i. ii. iii. iv.</span>\n<span class=\"r-in\"><span></span></span>\n<span class=\"r-in\"><span><span class=\"fu\"><a href=\"chop.html\">chop</a></span><span class=\"op\">(</span><span class=\"fl\">1</span><span class=\"op\">:</span><span class=\"fl\">10</span>, <span class=\"fu\"><a href=\"https://rdrr.io/r/base/c.html\" class=\"external-link\">c</a></span><span class=\"op\">(</span><span class=\"fl\">2</span>, <span class=\"fl\">5</span>, <span class=\"fl\">8</span><span class=\"op\">)</span>, <span class=\"fu\">lbl_seq</span><span class=\"op\">(</span><span class=\"st\">\"(A)\"</span><span class=\"op\">)</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span>  [1] (A) (B) (B) (B) (C) (C) (C) (D) (D) (D)</span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> Levels: (A) (B) (C) (D)</span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/lbl_seq.md",
    "content": "# Label chopped intervals in sequence\n\n`lbl_seq()` labels intervals sequentially, using numbers or letters.\n\n## Usage\n\n``` r\nlbl_seq(start = \"a\")\n```\n\n## Arguments\n\n- start:\n\n  String. A template for the sequence. See below.\n\n## Value\n\nA function that creates a vector of labels.\n\n## Details\n\n`start` shows the first element of the sequence. It must contain exactly\n*one* character out of the set \"a\", \"A\", \"i\", \"I\" or \"1\". For later\nelements:\n\n- \"a\" will be replaced by \"a\", \"b\", \"c\", ...\n\n- \"A\" will be replaced by \"A\", \"B\", \"C\", ...\n\n- \"i\" will be replaced by lower-case Roman numerals \"i\", \"ii\", \"iii\",\n  ...\n\n- \"I\" will be replaced by upper-case Roman numerals \"I\", \"II\", \"III\",\n  ...\n\n- \"1\" will be replaced by numbers \"1\", \"2\", \"3\", ...\n\nOther characters will be retained as-is.\n\n## See also\n\nOther labelling functions:\n[`lbl_dash()`](https://hughjonesd.github.io/santoku/reference/lbl_dash.md),\n[`lbl_date()`](https://hughjonesd.github.io/santoku/reference/lbl_datetime.md),\n[`lbl_discrete()`](https://hughjonesd.github.io/santoku/reference/lbl_discrete.md),\n[`lbl_endpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_endpoints.md),\n[`lbl_glue()`](https://hughjonesd.github.io/santoku/reference/lbl_glue.md),\n[`lbl_intervals()`](https://hughjonesd.github.io/santoku/reference/lbl_intervals.md),\n[`lbl_manual()`](https://hughjonesd.github.io/santoku/reference/lbl_manual.md),\n[`lbl_midpoints()`](https://hughjonesd.github.io/santoku/reference/lbl_midpoints.md)\n\n## Examples\n\n``` r\nchop(1:10, c(2, 5, 8), lbl_seq())\n#>  [1] a b b b c c c d d d\n#> Levels: a b c d\n\nchop(1:10, c(2, 5, 8), lbl_seq(\"i.\"))\n#>  [1] i.   ii.  ii.  ii.  iii. iii. iii. iv.  iv.  iv. \n#> Levels: i. ii. iii. iv.\n\nchop(1:10, c(2, 5, 8), lbl_seq(\"(A)\"))\n#>  [1] (A) (B) (B) (B) (C) (C) (C) (D) (D) (D)\n#> Levels: (A) (B) (C) (D)\n```\n"
  },
  {
    "path": "docs/reference/non-standard-types.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Tips for chopping non-standard types — non-standard-types • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Tips for chopping non-standard types — non-standard-types\"><meta name=\"description\" content=\"Santoku can handle many non-standard types.\"><meta property=\"og:description\" content=\"Santoku can handle many non-standard types.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Tips for chopping non-standard types</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/non-standard-types-doc.R\" class=\"external-link\"><code>R/non-standard-types-doc.R</code></a></small>\n      <div class=\"d-none name\"><code>non-standard-types.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Santoku can handle many non-standard types.</p>\n    </div>\n\n\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n\n<ul><li><p>If objects can be compared using <code>&lt;</code>, <code>==</code> etc. then they should\nbe choppable.</p></li>\n<li><p>Objects which can't be converted to numeric are handled within R code,\nwhich may be slower.</p></li>\n<li><p>Character <code>x</code> and <code>breaks</code> are chopped with a warning.</p></li>\n<li><p>If <code>x</code> and <code>breaks</code> are not the same type, they should be able to\nbe cast to the same type, usually using <code><a href=\"https://vctrs.r-lib.org/reference/vec_cast.html\" class=\"external-link\">vctrs::vec_cast_common()</a></code>.</p></li>\n<li><p>Not all chopping operations make sense, for example, <code><a href=\"chop_mean_sd.html\">chop_mean_sd()</a></code>\non a character vector.</p></li>\n<li><p>For indexed objects such as <code><a href=\"https://rdrr.io/r/stats/ts.html\" class=\"external-link\">stats::ts()</a></code> objects, indices will be dropped\nfrom the result.</p></li>\n<li><p>If you get errors, try setting <code>extend = FALSE</code> (but also file a bug report).</p></li>\n<li><p>To request support for a type, open an issue on Github.</p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>brk-width-for-Datetime</p></div>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/non-standard-types.md",
    "content": "# Tips for chopping non-standard types\n\nSantoku can handle many non-standard types.\n\n## Details\n\n- If objects can be compared using `<`, `==` etc. then they should be\n  choppable.\n\n- Objects which can't be converted to numeric are handled within R code,\n  which may be slower.\n\n- Character `x` and `breaks` are chopped with a warning.\n\n- If `x` and `breaks` are not the same type, they should be able to be\n  cast to the same type, usually using\n  [`vctrs::vec_cast_common()`](https://vctrs.r-lib.org/reference/vec_cast.html).\n\n- Not all chopping operations make sense, for example,\n  [`chop_mean_sd()`](https://hughjonesd.github.io/santoku/reference/chop_mean_sd.md)\n  on a character vector.\n\n- For indexed objects such as\n  [`stats::ts()`](https://rdrr.io/r/stats/ts.html) objects, indices will\n  be dropped from the result.\n\n- If you get errors, try setting `extend = FALSE` (but also file a bug\n  report).\n\n- To request support for a type, open an issue on Github.\n\n## See also\n\nbrk-width-for-Datetime\n"
  },
  {
    "path": "docs/reference/percent.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Simple percentage formatter — percent • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Simple percentage formatter — percent\"><meta name=\"description\" content=\"percent() formats x as a percentage.\nFor a wider range of formatters, consider the scales package.\"><meta property=\"og:description\" content=\"percent() formats x as a percentage.\nFor a wider range of formatters, consider the scales package.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Simple percentage formatter</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/utils.R\" class=\"external-link\"><code>R/utils.R</code></a></small>\n      <div class=\"d-none name\"><code>percent.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p><code>percent()</code> formats <code>x</code> as a percentage.\nFor a wider range of formatters, consider the <a href=\"https://cran.r-project.org/package=scales\" class=\"external-link\"><code>scales</code> package</a>.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"fu\">percent</span><span class=\"op\">(</span><span class=\"va\">x</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x\">x<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x\"></a></dt>\n<dd><p>Numeric values.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p><code>x</code> formatted as a percent.</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-examples\">Examples<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-examples\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span class=\"r-in\"><span><span class=\"fu\">percent</span><span class=\"op\">(</span><span class=\"fl\">0.5</span><span class=\"op\">)</span></span></span>\n<span class=\"r-out co\"><span class=\"r-pr\">#&gt;</span> [1] \"50%\"</span>\n</code></pre></div>\n    </div>\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/percent.md",
    "content": "# Simple percentage formatter\n\n`percent()` formats `x` as a percentage. For a wider range of\nformatters, consider the [`scales`\npackage](https://cran.r-project.org/package=scales).\n\n## Usage\n\n``` r\npercent(x)\n```\n\n## Arguments\n\n- x:\n\n  Numeric values.\n\n## Value\n\n`x` formatted as a percent.\n\n## Examples\n\n``` r\npercent(0.5)\n#> [1] \"50%\"\n```\n"
  },
  {
    "path": "docs/reference/print.breaks.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/breaks-class.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/breaks-class.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/santoku-cast.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Internal functions — santoku-cast • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Internal functions — santoku-cast\"><meta name=\"description\" content=\"Internal functions\"><meta property=\"og:description\" content=\"Internal functions\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Internal functions</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/santoku-cast.R\" class=\"external-link\"><code>R/santoku-cast.R</code></a></small>\n      <div class=\"d-none name\"><code>santoku-cast.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>Internal functions</p>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"ref-usage\">Usage<a class=\"anchor\" aria-label=\"anchor\" href=\"#ref-usage\"></a></h2>\n    <div class=\"sourceCode\"><pre class=\"sourceCode r\"><code><span><span class=\"co\"># Default S3 method</span></span>\n<span><span class=\"fu\">santoku_cast_common</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">y</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'double'</span></span>\n<span><span class=\"fu\">santoku_cast_common</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">y</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'Date'</span></span>\n<span><span class=\"fu\">santoku_cast_common</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">y</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'POSIXct'</span></span>\n<span><span class=\"fu\">santoku_cast_common</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">y</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'ts'</span></span>\n<span><span class=\"fu\">santoku_cast_common</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">y</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'zoo'</span></span>\n<span><span class=\"fu\">santoku_cast_common</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">y</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'integer64'</span></span>\n<span><span class=\"fu\">santoku_cast_common</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">y</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'hexmode'</span></span>\n<span><span class=\"fu\">santoku_cast_common</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">y</span><span class=\"op\">)</span></span>\n<span></span>\n<span><span class=\"co\"># S3 method for class 'octmode'</span></span>\n<span><span class=\"fu\">santoku_cast_common</span><span class=\"op\">(</span><span class=\"va\">x</span>, <span class=\"va\">y</span><span class=\"op\">)</span></span></code></pre></div>\n    </div>\n\n    <div class=\"section level2\">\n    <h2 id=\"arguments\">Arguments<a class=\"anchor\" aria-label=\"anchor\" href=\"#arguments\"></a></h2>\n\n\n<dl><dt id=\"arg-x-y\">x, y<a class=\"anchor\" aria-label=\"anchor\" href=\"#arg-x-y\"></a></dt>\n<dd><p>Vectors to cast.</p></dd>\n\n</dl></div>\n    <div class=\"section level2\">\n    <h2 id=\"value\">Value<a class=\"anchor\" aria-label=\"anchor\" href=\"#value\"></a></h2>\n    <p>A list.</p>\n    </div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/santoku-cast.md",
    "content": "# Internal functions\n\nInternal functions\n\n## Usage\n\n``` r\n# Default S3 method\nsantoku_cast_common(x, y)\n\n# S3 method for class 'double'\nsantoku_cast_common(x, y)\n\n# S3 method for class 'Date'\nsantoku_cast_common(x, y)\n\n# S3 method for class 'POSIXct'\nsantoku_cast_common(x, y)\n\n# S3 method for class 'ts'\nsantoku_cast_common(x, y)\n\n# S3 method for class 'zoo'\nsantoku_cast_common(x, y)\n\n# S3 method for class 'integer64'\nsantoku_cast_common(x, y)\n\n# S3 method for class 'hexmode'\nsantoku_cast_common(x, y)\n\n# S3 method for class 'octmode'\nsantoku_cast_common(x, y)\n```\n\n## Arguments\n\n- x, y:\n\n  Vectors to cast.\n\n## Value\n\nA list.\n"
  },
  {
    "path": "docs/reference/santoku-package.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>A versatile cutting tool for R: package overview and options — santoku-package • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"A versatile cutting tool for R: package overview and options — santoku-package\"><meta name=\"description\" content=\"santoku is a tool for cutting data into intervals. It provides\nthe function chop(), which is similar to base R's cut() or Hmisc::cut2().\nchop(x, breaks) takes a vector x and returns a factor of the\nsame length, coding which interval each element of x falls into.\"><meta property=\"og:description\" content=\"santoku is a tool for cutting data into intervals. It provides\nthe function chop(), which is similar to base R's cut() or Hmisc::cut2().\nchop(x, breaks) takes a vector x and returns a factor of the\nsame length, coding which interval each element of x falls into.\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.html\">Get started</a></li>\n<li class=\"active 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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-reference-topic\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>A versatile cutting tool for R: package overview and options</h1>\n      <small class=\"dont-index\">Source: <a href=\"https://github.com/hughjonesd/santoku/blob/HEAD/R/santoku-package.R\" class=\"external-link\"><code>R/santoku-package.R</code></a></small>\n      <div class=\"d-none name\"><code>santoku-package.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description section level2\">\n    <p>santoku is a tool for cutting data into intervals. It provides\nthe function <code><a href=\"chop.html\">chop()</a></code>, which is similar to base R's <code><a href=\"https://rdrr.io/r/base/cut.html\" class=\"external-link\">cut()</a></code> or <code><a href=\"https://rdrr.io/pkg/Hmisc/man/cut2.html\" class=\"external-link\">Hmisc::cut2()</a></code>.\n<code>chop(x, breaks)</code> takes a vector <code>x</code> and returns a factor of the\nsame length, coding which interval each element of <code>x</code> falls into.</p>\n    </div>\n\n\n    <div class=\"section level2\">\n    <h2 id=\"details\">Details<a class=\"anchor\" aria-label=\"anchor\" href=\"#details\"></a></h2>\n    <p>Here are some advantages of santoku:</p><ul><li><p>By default, <code><a href=\"chop.html\">chop()</a></code> always covers the whole range of the data, so you\nwon't get unexpected <code>NA</code> values.</p></li>\n<li><p>Unlike <code><a href=\"https://rdrr.io/r/base/cut.html\" class=\"external-link\">cut()</a></code> or <code>cut2()</code>, <code><a href=\"chop.html\">chop()</a></code> can handle single values as well as\nintervals. For example, <code>chop(x, breaks = c(1, 2, 2, 3))</code> will create a\nseparate factor level for values exactly equal to 2.</p></li>\n<li><p>Flexible and easy labelling.</p></li>\n<li><p>Convenience functions for creating quantile intervals, evenly-spaced\nintervals or equal-sized groups.</p></li>\n<li><p>Convenience functions to quickly tabulate chopped data.</p></li>\n<li><p>Can chop numbers, dates, date-times and other objects.</p></li>\n</ul><p>These advantages make santoku especially useful for exploratory analysis,\nwhere you may not know the range of your data in advance.</p>\n<p>To get started, read the vignette:</p>\n<p></p><div class=\"sourceCode r\"><pre><code><span><span class=\"fu\"><a href=\"https://rdrr.io/r/utils/vignette.html\" class=\"external-link\">vignette</a></span><span class=\"op\">(</span><span class=\"st\">\"santoku\"</span><span class=\"op\">)</span></span></code></pre><p></p></div>\n<p>For more details, start with the documentation for <code><a href=\"chop.html\">chop()</a></code>.</p>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"options\">Options<a class=\"anchor\" aria-label=\"anchor\" href=\"#options\"></a></h2>\n    <p>Santoku has two options:</p><ul><li><p><code>options(\"santoku.infinity\")</code> sets the symbol for infinity in breaks. The default is\n<code>NULL</code>, in which case the infinity symbol is used on platforms that support it, otherwise\n<code>\"Inf\"</code> is used.</p></li>\n<li><p><code>options(\"santoku.warn_character\")</code> warns if you try to chop a character vector. Set to\n<code>FALSE</code> to turn off this warning.</p></li>\n</ul></div>\n    <div class=\"section level2\">\n    <h2 id=\"see-also\">See also<a class=\"anchor\" aria-label=\"anchor\" href=\"#see-also\"></a></h2>\n    <div class=\"dont-index\"><p>Useful links:</p><ul><li><p><a href=\"https://github.com/hughjonesd/santoku\" class=\"external-link\">https://github.com/hughjonesd/santoku</a></p></li>\n<li><p><a href=\"https://hughjonesd.github.io/santoku/\">https://hughjonesd.github.io/santoku/</a></p></li>\n<li><p>Report bugs at <a href=\"https://github.com/hughjonesd/santoku/issues\" class=\"external-link\">https://github.com/hughjonesd/santoku/issues</a></p></li>\n</ul></div>\n    </div>\n    <div class=\"section level2\">\n    <h2 id=\"author\">Author<a class=\"anchor\" aria-label=\"anchor\" href=\"#author\"></a></h2>\n    <p><strong>Maintainer</strong>: David Hugh-Jones <a href=\"mailto:davidhughjones@gmail.com\">davidhughjones@gmail.com</a></p>\n<p>Other contributors:</p><ul><li><p>Daniel Possenriede <a href=\"mailto:possenriede@gmail.com\">possenriede@gmail.com</a> [contributor]</p></li>\n</ul></div>\n\n  </main><aside class=\"col-md-3\"><nav id=\"toc\" aria-label=\"Table of contents\"><h2>On this page</h2>\n    </nav></aside></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/reference/santoku-package.md",
    "content": "# A versatile cutting tool for R: package overview and options\n\nsantoku is a tool for cutting data into intervals. It provides the\nfunction\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md),\nwhich is similar to base R's [`cut()`](https://rdrr.io/r/base/cut.html)\nor [`Hmisc::cut2()`](https://rdrr.io/pkg/Hmisc/man/cut2.html).\n`chop(x, breaks)` takes a vector `x` and returns a factor of the same\nlength, coding which interval each element of `x` falls into.\n\n## Details\n\nHere are some advantages of santoku:\n\n- By default,\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md)\n  always covers the whole range of the data, so you won't get unexpected\n  `NA` values.\n\n- Unlike [`cut()`](https://rdrr.io/r/base/cut.html) or `cut2()`,\n  [`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md) can\n  handle single values as well as intervals. For example,\n  `chop(x, breaks = c(1, 2, 2, 3))` will create a separate factor level\n  for values exactly equal to 2.\n\n- Flexible and easy labelling.\n\n- Convenience functions for creating quantile intervals, evenly-spaced\n  intervals or equal-sized groups.\n\n- Convenience functions to quickly tabulate chopped data.\n\n- Can chop numbers, dates, date-times and other objects.\n\nThese advantages make santoku especially useful for exploratory\nanalysis, where you may not know the range of your data in advance.\n\nTo get started, read the vignette:\n\n    vignette(\"santoku\")\n\nFor more details, start with the documentation for\n[`chop()`](https://hughjonesd.github.io/santoku/reference/chop.md).\n\n## Options\n\nSantoku has two options:\n\n- `options(\"santoku.infinity\")` sets the symbol for infinity in breaks.\n  The default is `NULL`, in which case the infinity symbol is used on\n  platforms that support it, otherwise `\"Inf\"` is used.\n\n- `options(\"santoku.warn_character\")` warns if you try to chop a\n  character vector. Set to `FALSE` to turn off this warning.\n\n## See also\n\nUseful links:\n\n- <https://github.com/hughjonesd/santoku>\n\n- <https://hughjonesd.github.io/santoku/>\n\n- Report bugs at <https://github.com/hughjonesd/santoku/issues>\n\n## Author\n\n**Maintainer**: David Hugh-Jones <davidhughjones@gmail.com>\n\nOther contributors:\n\n- Daniel Possenriede <possenriede@gmail.com> \\[contributor\\]\n"
  },
  {
    "path": "docs/reference/santoku.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/santoku-package.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/santoku-package.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/santoku_cast_common.Date.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/santoku-cast.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/santoku-cast.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/santoku_cast_common.POSIXct.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/santoku-cast.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/santoku-cast.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/santoku_cast_common.default.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/santoku-cast.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/santoku-cast.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/santoku_cast_common.double.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/santoku-cast.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/santoku-cast.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/santoku_cast_common.hexmode.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/santoku-cast.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/santoku-cast.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/santoku_cast_common.integer64.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/santoku-cast.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/santoku-cast.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/santoku_cast_common.octmode.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/santoku-cast.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/santoku-cast.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/santoku_cast_common.ts.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/santoku-cast.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/santoku-cast.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/santoku_cast_common.zoo.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/santoku-cast.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/santoku-cast.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/sequence-labels.html",
    "content": "<!-- Generated by pkgdown: do not edit by hand -->\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n  <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>Label manually in sequence — sequence-labels • santoku</title>\n\n<!-- favicons -->\n<link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"../favicon-16x16.png\">\n<link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"../favicon-32x32.png\">\n<link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"../apple-touch-icon.png\" />\n<link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"120x120\" href=\"../apple-touch-icon-120x120.png\" />\n<link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"76x76\" href=\"../apple-touch-icon-76x76.png\" />\n<link rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"60x60\" href=\"../apple-touch-icon-60x60.png\" />\n\n<!-- jquery -->\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js\" integrity=\"sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=\" crossorigin=\"anonymous\"></script>\n<!-- Bootstrap -->\n\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css\" integrity=\"sha256-916EbMg70RQy9LHiGkXzG8hSg9EdNy97GazNG/aiY1w=\" crossorigin=\"anonymous\" />\n\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js\" integrity=\"sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8=\" crossorigin=\"anonymous\"></script>\n\n<!-- Font Awesome icons -->\n<link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css\" integrity=\"sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=\" crossorigin=\"anonymous\" />\n\n<!-- clipboard.js -->\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js\" integrity=\"sha256-FiZwavyI2V6+EXO1U+xzLG3IKldpiTFf3153ea9zikQ=\" crossorigin=\"anonymous\"></script>\n\n<!-- sticky kit -->\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/sticky-kit/1.1.3/sticky-kit.min.js\" integrity=\"sha256-c4Rlo1ZozqTPE2RLuvbusY3+SU1pQaJC0TjuhygMipw=\" crossorigin=\"anonymous\"></script>\n\n<!-- pkgdown -->\n<link href=\"../pkgdown.css\" rel=\"stylesheet\">\n<script src=\"../pkgdown.js\"></script>\n\n\n\n\n<meta property=\"og:title\" content=\"Label manually in sequence — sequence-labels\" />\n<meta property=\"og:description\" content=\"lbl_manual() uses an arbitrary sequence to label\nintervals. If the sequence is too short, it will be pasted with itself and\nrepeated.\" />\n<meta property=\"og:image\" content=\"/logo.png\" />\n<meta name=\"twitter:card\" content=\"summary\" />\n\n\n\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\n  </head>\n\n  <body>\n    <div class=\"container template-reference-topic\">\n      <header>\n      <div class=\"navbar navbar-default 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=\"../index.html\">santoku</a>\n        <span class=\"version label label-default\" data-toggle=\"tooltip\" data-placement=\"bottom\" title=\"Released version\">0.2.0.9000</span>\n      </span>\n    </div>\n\n    <div id=\"navbar\" class=\"navbar-collapse collapse\">\n      <ul class=\"nav navbar-nav\">\n        <li>\n  <a href=\"../index.html\">\n    <span class=\"fa fa-home fa-lg\"></span>\n     \n  </a>\n</li>\n<li>\n  <a href=\"../articles/santoku.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\" 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/website-articles/performance.html\">Performance</a>\n    </li>\n  </ul>\n</li>\n<li class=\"dropdown\">\n  <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\">\n    Tutorials\n     \n    <span class=\"caret\"></span>\n  </a>\n  <ul class=\"dropdown-menu\" role=\"menu\">\n    <li>\n      <a href=\"../tutorials/00-visualintroduction.html\">A visual introduction to Santoku</a>\n    </li>\n  </ul>\n</li>\n<li>\n  <a href=\"../news/index.html\">Changelog</a>\n</li>\n      </ul>\n      <ul class=\"nav navbar-nav navbar-right\">\n        <li>\n  <a href=\"https://github.com/hughjonesd/santoku\">\n    <span class=\"fa fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul>\n      \n    </div><!--/.nav-collapse -->\n  </div><!--/.container -->\n</div><!--/.navbar -->\n\n      \n      </header>\n\n<div class=\"row\">\n  <div class=\"col-md-9 contents\">\n    <div class=\"page-header\">\n    <h1>Label manually in sequence</h1>\n    <small class=\"dont-index\">Source: <a href='https://github.com/hughjonesd/santoku/blob/master/R/labels.R'><code>R/labels.R</code></a></small>\n    <div class=\"hidden name\"><code>sequence-labels.Rd</code></div>\n    </div>\n\n    <div class=\"ref-description\">\n    <p><code>lbl_manual()</code> uses an arbitrary sequence to label\nintervals. If the sequence is too short, it will be pasted with itself and\nrepeated.</p>\n    </div>\n\n    <pre class=\"usage\"><span class='fu'>lbl_manual</span>(<span class='no'>sequence</span>, <span class='kw'>fmt</span> <span class='kw'>=</span> <span class='st'>\"%s\"</span>)</pre>\n\n    <h2 class=\"hasAnchor\" id=\"arguments\"><a class=\"anchor\" href=\"#arguments\"></a>Arguments</h2>\n    <table class=\"ref-arguments\">\n    <colgroup><col class=\"name\" /><col class=\"desc\" /></colgroup>\n    <tr>\n      <th>fmt</th>\n      <td><p>A <code><a href='https://www.rdocumentation.org/packages/base/topics/sprintf'>sprintf()</a></code>-style format.</p></td>\n    </tr>\n    </table>\n\n    <h2 class=\"hasAnchor\" id=\"value\"><a class=\"anchor\" href=\"#value\"></a>Value</h2>\n\n    <p>A vector of labels for <code>chop</code>, or a function that creates labels.</p>\n    <h2 class=\"hasAnchor\" id=\"see-also\"><a class=\"anchor\" href=\"#see-also\"></a>See also</h2>\n\n    <div class='dont-index'><p>Other labelling functions: <code><a href='lbl_dash.html'>lbl_dash</a></code>,\n  <code><a href='lbl_format.html'>lbl_format</a></code>, <code><a href='lbl_intervals.html'>lbl_intervals</a></code>,\n  <code><a href='lbl_seq.html'>lbl_seq</a></code></p></div>\n\n    <h2 class=\"hasAnchor\" id=\"examples\"><a class=\"anchor\" href=\"#examples\"></a>Examples</h2>\n    <pre class=\"examples\"><div class='input'><span class='fu'><a href='chop.html'>chop</a></span>(<span class='fl'>1</span>:<span class='fl'>10</span>, <span class='fu'><a href='https://www.rdocumentation.org/packages/base/topics/c'>c</a></span>(<span class='fl'>2</span>, <span class='fl'>5</span>, <span class='fl'>8</span>), <span class='fu'>lbl_manual</span>(<span class='fu'><a href='https://www.rdocumentation.org/packages/base/topics/c'>c</a></span>(<span class='st'>\"w\"</span>, <span class='st'>\"x\"</span>, <span class='st'>\"y\"</span>, <span class='st'>\"z\"</span>)))</div><div class='output co'>#&gt; <span class='error'>Error in lbl_manual(c(\"w\", \"x\", \"y\", \"z\")): could not find function \"lbl_manual\"</span></div><div class='input'>\n<span class='co'># if labels need repeating:</span>\n<span class='fu'><a href='chop.html'>chop</a></span>(<span class='fl'>1</span>:<span class='fl'>10</span>, <span class='fl'>1</span>:<span class='fl'>10</span>, <span class='fu'>lbl_manual</span>(<span class='fu'><a href='https://www.rdocumentation.org/packages/base/topics/c'>c</a></span>(<span class='st'>\"x\"</span>, <span class='st'>\"y\"</span>, <span class='st'>\"z\"</span>)))</div><div class='output co'>#&gt; <span class='error'>Error in lbl_manual(c(\"x\", \"y\", \"z\")): could not find function \"lbl_manual\"</span></div></pre>\n  </div>\n  <div class=\"col-md-3 hidden-xs hidden-sm\" id=\"sidebar\">\n    <h2>Contents</h2>\n    <ul class=\"nav nav-pills nav-stacked\">\n      <li><a href=\"#arguments\">Arguments</a></li>\n      <li><a href=\"#value\">Value</a></li>\n      <li><a href=\"#see-also\">See also</a></li>\n      <li><a href=\"#examples\">Examples</a></li>\n    </ul>\n\n  </div>\n</div>\n\n      <footer>\n      <div class=\"copyright\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\">pkgdown</a> 1.3.0.</p>\n</div>\n      </footer>\n   </div>\n\n  \n\n  </body>\n</html>\n\n"
  },
  {
    "path": "docs/reference/tab.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/tab_deciles.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_quantiles.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_quantiles.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/tab_dissect.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/dissect.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/dissect.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/tab_equally.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_equally.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_equally.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/tab_evenly.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_evenly.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_evenly.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/tab_fn.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_fn.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_fn.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/tab_mean_sd.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_mean_sd.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_mean_sd.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/tab_n.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_n.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_n.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/tab_pretty.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_pretty.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_pretty.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/tab_proportions.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_proportions.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_proportions.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/tab_quantiles.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_quantiles.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_quantiles.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/tab_spikes.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_spikes.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_spikes.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/reference/tab_width.html",
    "content": "<html>\n  <head>\n    <meta http-equiv=\"refresh\" content=\"0;URL=https://hughjonesd.github.io/santoku/reference/chop_width.html\" />\n    <meta name=\"robots\" content=\"noindex\">\n    <link rel=\"canonical\" href=\"https://hughjonesd.github.io/santoku/reference/chop_width.html\">\n  </head>\n</html>\n\n"
  },
  {
    "path": "docs/search.json",
    "content": "[{\"path\":\"https://hughjonesd.github.io/santoku/AGENTS.html\",\"id\":null,\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"AGENTS.md\",\"title\":\"AGENTS.md\",\"text\":\"file provides guidance agents working code repository.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/AGENTS.html\",\"id\":\"project-overview\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Project Overview\",\"title\":\"AGENTS.md\",\"text\":\"santoku R package provides chop(), versatile replacement base::cut() cutting data intervals. package handles numeric vectors, dates, times, comparable objects, support singleton intervals flexible labeling.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/AGENTS.html\",\"id\":\"testing\",\"dir\":\"\",\"previous_headings\":\"Common Commands\",\"what\":\"Testing\",\"title\":\"AGENTS.md\",\"text\":\"\",\"code\":\"# Run all tests devtools::test()  # Run tests from command line R CMD check .  # Run specific test file testthat::test_file(\\\"tests/testthat/test-chop.R\\\")\"},{\"path\":\"https://hughjonesd.github.io/santoku/AGENTS.html\",\"id\":\"development-workflow\",\"dir\":\"\",\"previous_headings\":\"Common Commands\",\"what\":\"Development workflow\",\"title\":\"AGENTS.md\",\"text\":\"\",\"code\":\"# Build package devtools::build()  # Install package locally devtools::install()  # Check package devtools::check()  # Load package for interactive development devtools::load_all()\"},{\"path\":\"https://hughjonesd.github.io/santoku/AGENTS.html\",\"id\":\"documentation\",\"dir\":\"\",\"previous_headings\":\"Common Commands\",\"what\":\"Documentation\",\"title\":\"AGENTS.md\",\"text\":\"\",\"code\":\"# Update documentation devtools::document()  # Build website pkgdown::build_site()\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/AGENTS.html\",\"id\":\"core-components\",\"dir\":\"\",\"previous_headings\":\"Architecture\",\"what\":\"Core Components\",\"title\":\"AGENTS.md\",\"text\":\"Main cutting function: chop() R/chop.R - primary interface calls functions Break creation: R/breaks*.R files contain functions create break points (brk_* functions) Labeling system: R/labels*.R files contain labeling functions (lbl_* functions) Convenience functions: R/chop-*.R files contain chop_* wrapper functions common use cases C++ backend: src/categorize.cpp provides fast interval categorization via Rcpp Tabulation: R/tab.R provides tab_* functions chop tabulate one step\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/AGENTS.html\",\"id\":\"key-design-patterns\",\"dir\":\"\",\"previous_headings\":\"Architecture\",\"what\":\"Key Design Patterns\",\"title\":\"AGENTS.md\",\"text\":\"Function factories: Many functions return functions (e.g., brk_* functions return break-creation functions) Method dispatch: Uses S3 methods vctrs handling different data types (numbers, dates, etc.) Extensible labeling: Label functions can combined customized using lbl_* family Performance: Core categorization logic implemented C++ speed\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/AGENTS.html\",\"id\":\"file-organization\",\"dir\":\"\",\"previous_headings\":\"Architecture\",\"what\":\"File Organization\",\"title\":\"AGENTS.md\",\"text\":\"R/chop.R - Main chop() function documentation R/breaks*.R - Break point creation (brk_default, brk_width, etc.) R/labels*.R - Label generation (lbl_intervals, lbl_dash, etc.) R/chop-*.R - Convenience functions (chop_quantiles, chop_width, etc.) R/tab.R - Tabulation functions R/utils.R - Utility functions like exactly() percent() src/categorize.cpp - Fast C++ categorization implementation tests/testthat/ - Comprehensive test suite\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/AGENTS.html\",\"id\":\"development-notes\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Development Notes\",\"title\":\"AGENTS.md\",\"text\":\"package uses Rcpp performance-critical categorization Tests extensive include systematic testing test-zzz-systematic.R package supports non-standard data types (dates, times, units) via vctrs package Documentation follows roxygen2 conventions extensive examples Uses lifecycle package function lifecycle management\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/CLAUDE.html\",\"id\":null,\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"CLAUDE.md\",\"title\":\"CLAUDE.md\",\"text\":\"file provides guidance Claude Code (claude.ai/code) working code repository.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/CLAUDE.html\",\"id\":\"project-overview\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Project Overview\",\"title\":\"CLAUDE.md\",\"text\":\"santoku R package provides chop(), versatile replacement base::cut() cutting data intervals. package handles numeric vectors, dates, times, comparable objects, support singleton intervals flexible labeling.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/CLAUDE.html\",\"id\":\"testing\",\"dir\":\"\",\"previous_headings\":\"Common Commands\",\"what\":\"Testing\",\"title\":\"CLAUDE.md\",\"text\":\"\",\"code\":\"# Run all tests devtools::test()  # Run tests from command line R CMD check .  # Run specific test file testthat::test_file(\\\"tests/testthat/test-chop.R\\\")\"},{\"path\":\"https://hughjonesd.github.io/santoku/CLAUDE.html\",\"id\":\"development-workflow\",\"dir\":\"\",\"previous_headings\":\"Common Commands\",\"what\":\"Development workflow\",\"title\":\"CLAUDE.md\",\"text\":\"\",\"code\":\"# Build package devtools::build()  # Install package locally devtools::install()  # Check package devtools::check()  # Load package for interactive development devtools::load_all()\"},{\"path\":\"https://hughjonesd.github.io/santoku/CLAUDE.html\",\"id\":\"documentation\",\"dir\":\"\",\"previous_headings\":\"Common Commands\",\"what\":\"Documentation\",\"title\":\"CLAUDE.md\",\"text\":\"\",\"code\":\"# Update documentation devtools::document()  # Build website pkgdown::build_site()\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/CLAUDE.html\",\"id\":\"core-components\",\"dir\":\"\",\"previous_headings\":\"Architecture\",\"what\":\"Core Components\",\"title\":\"CLAUDE.md\",\"text\":\"Main cutting function: chop() R/chop.R - primary interface calls functions Break creation: R/breaks*.R files contain functions create break points (brk_* functions) Labeling system: R/labels*.R files contain labeling functions (lbl_* functions) Convenience functions: R/chop-*.R files contain chop_* wrapper functions common use cases C++ backend: src/categorize.cpp provides fast interval categorization via Rcpp Tabulation: R/tab.R provides tab_* functions chop tabulate one step\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/CLAUDE.html\",\"id\":\"key-design-patterns\",\"dir\":\"\",\"previous_headings\":\"Architecture\",\"what\":\"Key Design Patterns\",\"title\":\"CLAUDE.md\",\"text\":\"Function factories: Many functions return functions (e.g., brk_* functions return break-creation functions) Method dispatch: Uses S3 methods vctrs handling different data types (numbers, dates, etc.) Extensible labeling: Label functions can combined customized using lbl_* family Performance: Core categorization logic implemented C++ speed\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/CLAUDE.html\",\"id\":\"file-organization\",\"dir\":\"\",\"previous_headings\":\"Architecture\",\"what\":\"File Organization\",\"title\":\"CLAUDE.md\",\"text\":\"R/chop.R - Main chop() function documentation R/breaks*.R - Break point creation (brk_default, brk_width, etc.) R/labels*.R - Label generation (lbl_intervals, lbl_dash, etc.) R/chop-*.R - Convenience functions (chop_quantiles, chop_width, etc.) R/tab.R - Tabulation functions R/utils.R - Utility functions like exactly() percent() src/categorize.cpp - Fast C++ categorization implementation tests/testthat/ - Comprehensive test suite\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/CLAUDE.html\",\"id\":\"development-notes\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Development Notes\",\"title\":\"CLAUDE.md\",\"text\":\"package uses Rcpp performance-critical categorization Tests extensive include systematic testing test-zzz-systematic.R package supports non-standard data types (dates, times, units) via vctrs package Documentation follows roxygen2 conventions extensive examples Uses lifecycle package function lifecycle management\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/LICENSE.html\",\"id\":null,\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"MIT License\",\"title\":\"MIT License\",\"text\":\"Copyright (c) 2019 David Hugh-Jones Permission hereby granted, free charge, person obtaining copy software associated documentation files (“Software”), deal Software without restriction, including without limitation rights use, copy, modify, merge, publish, distribute, sublicense, /sell copies Software, permit persons Software furnished , subject following conditions: copyright notice permission notice shall included copies substantial portions Software. SOFTWARE PROVIDED “”, WITHOUT WARRANTY KIND, EXPRESS IMPLIED, INCLUDING LIMITED WARRANTIES MERCHANTABILITY, FITNESS PARTICULAR PURPOSE NONINFRINGEMENT. EVENT SHALL AUTHORS COPYRIGHT HOLDERS LIABLE CLAIM, DAMAGES LIABILITY, WHETHER ACTION CONTRACT, TORT OTHERWISE, ARISING , CONNECTION SOFTWARE USE DEALINGS SOFTWARE.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/TODO.html\",\"id\":null,\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"TODO\",\"title\":\"TODO\",\"text\":\"tests left close_end arguments tests brk_default brk_width() needs tests match guarantees documentation ditto brk_evenly() now uses implementation guarantee exactly intervals intervals systematic tests brk_* functions problem moment vec_cast() highly unreliable never know particular class accept Inf. infinity class fine, go existing breaks object underlying class? NB requires new way create labels, kinda sucks….\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/TODO.html\",\"id\":\"thoughts-on-errors\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Thoughts on errors\",\"title\":\"TODO\",\"text\":\"Exception: x wrong class type. e.g. brk_manual() extend set. cases, e.g. brk_evenly() don’t need make guarantee.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/TODO.html\",\"id\":\"questions\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Questions\",\"title\":\"TODO\",\"text\":\"alternative x non-numeric. makes surprise rarer, rare surprises can worse… adds complexity since functions generic. another alternative: chop sets left = FALSE non-numeric x. Probably better. drop default ! isTRUE(extend) .e. FALSE extend = TRUE?\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/TODO.html\",\"id\":\"questions-with-a-provisional-answer\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Questions with a (provisional) answer\",\"title\":\"TODO\",\"text\":\", labels = NULL integer codes though. sense , unless someone asks. Oh, someone just ask; generally though. . don’t want people set position, distinguish initial arguments. Current answer: fuck ’em. (NB: just kidding. huge tidyverse fan.) provide kiru(). REPL, people can just use kiru() load santoku first. load santoku second, ’ll use tidyr::chop(), reading documentation, suspect rare. programming, people probably used fully qualified name anyway. think default “necessary” (extend = NULL); always extend Inf, -Inf break labels data-dependent Tension wanting something predictable new data, vs. something readable tab_*. E.g. surely return labels , b, c. means aren’t always extending. lets people e.g. chop(rnorm(100), -2:2, LETTERS) might hide errors overall ’m maybe label functions access x? informed breaks got extended? breaks object know extend labels? current solution: labels get extend think better: breaks objects include suggested labels user can override. way always info necessary. choosing break numbers (may actual values, e.g quantiles std errs 0) formatting numbers, dashes, set notation etc maybe brk_* functions always return break numbers; labels decide format ? warning? currently error throw error cases e.g. brk_quantiles, brk_width, data may work well e.g. NA. empty set breaks?\",\"code\":\"tab_size(1:9, 3, lbl_seq())\"},{\"path\":\"https://hughjonesd.github.io/santoku/TODO.html\",\"id\":\"possible-interfaces\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Possible interfaces\",\"title\":\"TODO\",\"text\":\"hist_xxx functions histograms/barplots? (treat singletons?) grp_xxx group_by? Hmmm… New label interface replace lbl_sequence: lbl_style(\\\"1.\\\"), lbl_style(\\\"()\\\"), lbl_style(\\\"\\\") etc.? Still wonder, drop extend adds complexity just () extend() new breaks functions?\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/TODO.html\",\"id\":\"other-ideas\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Other ideas\",\"title\":\"TODO\",\"text\":\"Speedup categorize checking left intervals, add 1 past interval [: actually fewer checks end…] Speedup using pointers? hmm, magic…\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/santoku.html\",\"id\":\"introduction\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Introduction\",\"title\":\"Introduction to santoku\",\"text\":\"Santoku package cutting data intervals. provides chop(), replacement base R’s cut() function, well several convenience functions cut different kinds intervals. install santoku, run:\",\"code\":\"install.packages(\\\"santoku\\\")\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/santoku.html\",\"id\":\"basic-usage\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Basic usage\",\"title\":\"Introduction to santoku\",\"text\":\"Use chop() like cut(), cut numeric data intervals set breaks. chop() returns factor. data beyond limits breaks, extended automatically: chop single number separate category, put number twice breaks: quickly produce table chopped data, use tab():\",\"code\":\"library(santoku)  x <- runif(10, 0, 10) (chopped <- chop(x, breaks = 0:10)) #>  [1] [4, 5)  [8, 9)  [3, 4)  [4, 5)  [7, 8)  [9, 10] [6, 7)  [8, 9)  [1, 2)  #> [10] [4, 5)  #> Levels: [1, 2) [3, 4) [4, 5) [6, 7) [7, 8) [8, 9) [9, 10] data.frame(x, chopped) #>        x chopped #> 1  4.978  [4, 5) #> 2  8.970  [8, 9) #> 3  3.392  [3, 4) #> 4  4.677  [4, 5) #> 5  7.057  [7, 8) #> 6  9.708 [9, 10] #> 7  6.714  [6, 7) #> 8  8.377  [8, 9) #> 9  1.086  [1, 2) #> 10 4.495  [4, 5) chopped <- chop(x, breaks = 3:7) data.frame(x, chopped) #>        x    chopped #> 1  4.978     [4, 5) #> 2  8.970 [7, 9.708] #> 3  3.392     [3, 4) #> 4  4.677     [4, 5) #> 5  7.057 [7, 9.708] #> 6  9.708 [7, 9.708] #> 7  6.714     [6, 7) #> 8  8.377 [7, 9.708] #> 9  1.086 [1.086, 3) #> 10 4.495     [4, 5) x_fives <- x x_fives[1:5] <- 5 chopped <- chop(x_fives, c(2, 5, 5, 8)) data.frame(x_fives, chopped) #>    x_fives    chopped #> 1    5.000        {5} #> 2    5.000        {5} #> 3    5.000        {5} #> 4    5.000        {5} #> 5    5.000        {5} #> 6    9.708 [8, 9.708] #> 7    6.714     (5, 8) #> 8    8.377 [8, 9.708] #> 9    1.086 [1.086, 2) #> 10   4.495     [2, 5) tab(1:10, c(2, 5, 8)) #>  [1, 2)  [2, 5)  [5, 8) [8, 10]  #>       1       3       3       3\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/santoku.html\",\"id\":\"chopping-by-width-and-number-of-elements\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Chopping by width and number of elements\",\"title\":\"Introduction to santoku\",\"text\":\"chop fixed-width intervals, starting minimum value, use chop_width(): chop fixed number intervals, width, use chop_evenly(): chop groups fixed number elements, use chop_n(): chop fixed number groups, number elements, use chop_equally(): chop data quantiles, use chop_quantiles(): chop data proportions data range, use chop_proportions(): can think six functions logically arranged table. Different ways chop size\",\"code\":\"chopped <- chop_width(x, 2) data.frame(x, chopped) #>        x        chopped #> 1  4.978 [3.086, 5.086) #> 2  8.970 [7.086, 9.086) #> 3  3.392 [3.086, 5.086) #> 4  4.677 [3.086, 5.086) #> 5  7.057 [5.086, 7.086) #> 6  9.708 [9.086, 11.09] #> 7  6.714 [5.086, 7.086) #> 8  8.377 [7.086, 9.086) #> 9  1.086 [1.086, 3.086) #> 10 4.495 [3.086, 5.086) chopped <- chop_evenly(x, intervals = 3) data.frame(x, chopped) #>        x        chopped #> 1  4.978  [3.96, 6.834) #> 2  8.970 [6.834, 9.708] #> 3  3.392  [1.086, 3.96) #> 4  4.677  [3.96, 6.834) #> 5  7.057 [6.834, 9.708] #> 6  9.708 [6.834, 9.708] #> 7  6.714  [3.96, 6.834) #> 8  8.377 [6.834, 9.708] #> 9  1.086  [1.086, 3.96) #> 10 4.495  [3.96, 6.834) chopped <- chop_n(x, 4) table(chopped) #> chopped #> [1.086, 4.978)  [4.978, 8.97)  [8.97, 9.708]  #>              4              4              2 chopped <- chop_equally(x, groups = 5) table(chopped) #> chopped #> [1.086, 4.275) [4.275, 4.858) [4.858, 6.851) [6.851, 8.495) [8.495, 9.708]  #>              2              2              2              2              2 chopped <- chop_quantiles(x, c(0.25, 0.5, 0.75)) data.frame(x, chopped) #>        x     chopped #> 1  4.978  [25%, 50%) #> 2  8.970 [75%, 100%] #> 3  3.392   [0%, 25%) #> 4  4.677  [25%, 50%) #> 5  7.057  [50%, 75%) #> 6  9.708 [75%, 100%] #> 7  6.714  [50%, 75%) #> 8  8.377 [75%, 100%] #> 9  1.086   [0%, 25%) #> 10 4.495   [0%, 25%) chopped <- chop_proportions(x, c(0.25, 0.5, 0.75)) data.frame(x, chopped) #>        x        chopped #> 1  4.978 [3.242, 5.397) #> 2  8.970 [7.552, 9.708] #> 3  3.392 [3.242, 5.397) #> 4  4.677 [3.242, 5.397) #> 5  7.057 [5.397, 7.552) #> 6  9.708 [7.552, 9.708] #> 7  6.714 [5.397, 7.552) #> 8  8.377 [7.552, 9.708] #> 9  1.086 [1.086, 3.242) #> 10 4.495 [3.242, 5.397)\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/santoku.html\",\"id\":\"even-more-ways-to-chop\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Even more ways to chop\",\"title\":\"Introduction to santoku\",\"text\":\"chop data standard deviations around mean, use chop_mean_sd(): chop data attractive intervals, use chop_pretty(). selects intervals multiple 2, 5 10. ’s useful producing bar plots.\",\"code\":\"chopped <- chop_mean_sd(x) data.frame(x, chopped) #>        x        chopped #> 1  4.978  [-1 sd, 0 sd) #> 2  8.970   [1 sd, 2 sd) #> 3  3.392  [-1 sd, 0 sd) #> 4  4.677  [-1 sd, 0 sd) #> 5  7.057   [0 sd, 1 sd) #> 6  9.708   [1 sd, 2 sd) #> 7  6.714   [0 sd, 1 sd) #> 8  8.377   [0 sd, 1 sd) #> 9  1.086 [-2 sd, -1 sd) #> 10 4.495  [-1 sd, 0 sd) chopped <- chop_pretty(x) data.frame(x, chopped) #>        x chopped #> 1  4.978  [4, 6) #> 2  8.970 [8, 10] #> 3  3.392  [2, 4) #> 4  4.677  [4, 6) #> 5  7.057  [6, 8) #> 6  9.708 [8, 10] #> 7  6.714  [6, 8) #> 8  8.377 [8, 10] #> 9  1.086  [0, 2) #> 10 4.495  [4, 6)\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/santoku.html\",\"id\":\"isolating-common-values\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Isolating common values\",\"title\":\"Introduction to santoku\",\"text\":\"exploratory work, ’s sometimes useful find common values treat differently. can use dissect() : prop = 0.2 put unique value x separate category makes least 20% data. Note unlike chop_* functions, dissect() doesn’t always categorize x ordered, connected intervals. remind , named differently. want create separate intervals left right common elements, use chop_spikes(): Compare table . two intervals either side common value, instead one interval surrounding .\",\"code\":\"x_spike <- rnorm(100) x_spike[1:50] <- x_spike[1]  chopped <- dissect(x_spike, -3:3, prop = 0.1) table(chopped) #> chopped #> [-3, -2) [-2, -1)  [-1, 0)   [0, 1) {0.6996}   [1, 2)  #>        2        5       15       18       50       10 chopped <- chop_spikes(x_spike, -3:3, prop = 0.1) table(chopped) #> chopped #>    [-3, -2)    [-2, -1)     [-1, 0) [0, 0.6996)    {0.6996} (0.6996, 1)  #>           2           5          15          13          50           5  #>      [1, 2)  #>          10\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/santoku.html\",\"id\":\"quick-tables\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Quick tables\",\"title\":\"Introduction to santoku\",\"text\":\"tab_n(), tab_width(), friends act similarly tab(), calling related chop_* function table() result.\",\"code\":\"tab_n(x, 4) #> [1.086, 4.978)  [4.978, 8.97)  [8.97, 9.708]  #>              4              4              2 tab_width(x, 2) #> [1.086, 3.086) [3.086, 5.086) [5.086, 7.086) [7.086, 9.086) [9.086, 11.09]  #>              1              4              2              2              1 tab_evenly(x, 5) #>  [1.086, 2.81)  [2.81, 4.535) [4.535, 6.259) [6.259, 7.983) [7.983, 9.708]  #>              1              2              2              2              3 tab_mean_sd(x) #> [-2 sd, -1 sd)  [-1 sd, 0 sd)   [0 sd, 1 sd)   [1 sd, 2 sd)  #>              1              4              3              2\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/santoku.html\",\"id\":\"specifying-labels\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Specifying labels\",\"title\":\"Introduction to santoku\",\"text\":\"default, santoku labels intervals using mathematical notation: [0, 1] means numbers 0 1 inclusive. (0, 1) means numbers strictly 0 1, including endpoints. [0, 1) means numbers 0 1, including 0 1. (0, 1] means numbers 0 1, including 1 0. {0} means just number 0. override labels, provide names breaks argument: , can specify factor labels labels argument: need many labels intervals - one fewer length(breaks) data doesn’t extend beyond breaks, one length(breaks) . label intervals dash, use lbl_dash(): label integer data, use lbl_discrete(). uses informative right endpoints: can customize first last labels: label intervals order use lbl_seq(): can use numerals even roman numerals: labelling functions include: lbl_endpoints() - use left endpoints labels lbl_midpoints() - use interval midpoints labels lbl_glue() - specify labels flexibly glue package\",\"code\":\"chopped <- chop(x, c(Lowest = 1, Low = 2, Higher = 5, Highest = 8)) data.frame(x, chopped) #>        x chopped #> 1  4.978     Low #> 2  8.970 Highest #> 3  3.392     Low #> 4  4.677     Low #> 5  7.057  Higher #> 6  9.708 Highest #> 7  6.714  Higher #> 8  8.377 Highest #> 9  1.086  Lowest #> 10 4.495     Low chopped <- chop(x, c(2, 5, 8), labels = c(\\\"Lowest\\\", \\\"Low\\\", \\\"Higher\\\", \\\"Highest\\\")) data.frame(x, chopped) #>        x chopped #> 1  4.978     Low #> 2  8.970 Highest #> 3  3.392     Low #> 4  4.677     Low #> 5  7.057  Higher #> 6  9.708 Highest #> 7  6.714  Higher #> 8  8.377 Highest #> 9  1.086  Lowest #> 10 4.495     Low chopped <- chop(x, c(2, 5, 8), labels = lbl_dash()) data.frame(x, chopped) #>        x chopped #> 1  4.978     2—5 #> 2  8.970 8—9.708 #> 3  3.392     2—5 #> 4  4.677     2—5 #> 5  7.057     5—8 #> 6  9.708 8—9.708 #> 7  6.714     5—8 #> 8  8.377 8—9.708 #> 9  1.086 1.086—2 #> 10 4.495     2—5 chopped  <- chop(1:10, c(2, 5, 8), labels = lbl_discrete()) chopped2 <- chop(1:10, c(2, 5, 8), labels = lbl_dash()) data.frame(x = 1:10, lbl_discrete = chopped, lbl_dash = chopped2) #>     x lbl_discrete lbl_dash #> 1   1            1      1—2 #> 2   2          2—4      2—5 #> 3   3          2—4      2—5 #> 4   4          2—4      2—5 #> 5   5          5—7      5—8 #> 6   6          5—7      5—8 #> 7   7          5—7      5—8 #> 8   8         8—10     8—10 #> 9   9         8—10     8—10 #> 10 10         8—10     8—10 chopped <- chop(x, c(2, 5, 8), labels = lbl_dash(first = \\\"< 2\\\", last = \\\"8+\\\")) data.frame(x, chopped) #>        x chopped #> 1  4.978     2—5 #> 2  8.970      8+ #> 3  3.392     2—5 #> 4  4.677     2—5 #> 5  7.057     5—8 #> 6  9.708      8+ #> 7  6.714     5—8 #> 8  8.377      8+ #> 9  1.086     < 2 #> 10 4.495     2—5 chopped <- chop(x, c(2, 5, 8), labels = lbl_seq()) data.frame(x, chopped) #>        x chopped #> 1  4.978       b #> 2  8.970       d #> 3  3.392       b #> 4  4.677       b #> 5  7.057       c #> 6  9.708       d #> 7  6.714       c #> 8  8.377       d #> 9  1.086       a #> 10 4.495       b chop(x, c(2, 5, 8), labels = lbl_seq(\\\"(1)\\\")) #>  [1] (2) (4) (2) (2) (3) (4) (3) (4) (1) (2) #> Levels: (1) (2) (3) (4) chop(x, c(2, 5, 8), labels = lbl_seq(\\\"i.\\\")) #>  [1] ii.  iv.  ii.  ii.  iii. iv.  iii. iv.  i.   ii.  #> Levels: i. ii. iii. iv.\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/santoku.html\",\"id\":\"specifying-breaks\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Specifying breaks\",\"title\":\"Introduction to santoku\",\"text\":\"default, chop() extends breaks necessary. don’t want , set extend = FALSE: Data outside range breaks become NA. default, intervals closed left, .e. include left endpoints. want right-closed intervals, set left = FALSE: default, last interval closed ends. want keep last interval open end, set close_end = FALSE:\",\"code\":\"chopped <- chop(x, c(3, 5, 7), extend = FALSE) data.frame(x, chopped) #>        x chopped #> 1  4.978  [3, 5) #> 2  8.970    <NA> #> 3  3.392  [3, 5) #> 4  4.677  [3, 5) #> 5  7.057    <NA> #> 6  9.708    <NA> #> 7  6.714  [5, 7] #> 8  8.377    <NA> #> 9  1.086    <NA> #> 10 4.495  [3, 5) y <- 1:5 data.frame(         y = y,          left_closed = chop(y, 1:5),          right_closed = chop(y, 1:5, left = FALSE)       ) #>   y left_closed right_closed #> 1 1      [1, 2)       [1, 2] #> 2 2      [2, 3)       [1, 2] #> 3 3      [3, 4)       (2, 3] #> 4 4      [4, 5]       (3, 4] #> 5 5      [4, 5]       (4, 5] data.frame(   y = y,   end_closed = chop(y, 1:5),   end_open   = chop(y, 1:5, close_end = FALSE) ) #>   y end_closed end_open #> 1 1     [1, 2)   [1, 2) #> 2 2     [2, 3)   [2, 3) #> 3 3     [3, 4)   [3, 4) #> 4 4     [4, 5]   [4, 5) #> 5 5     [4, 5]      {5}\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/santoku.html\",\"id\":\"chopping-dates-times-and-other-vectors\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Chopping dates, times and other vectors\",\"title\":\"Introduction to santoku\",\"text\":\"can chop many kinds vectors santoku, including Date objects… … POSIXct (date-time) objects: Note santoku correctly handles different timezones. can use chop_width() objects lubridate package, chop irregular periods months: lbl_date() produces nicely formatted dates: can also chop vectors units, using units package: able chop anything comparison operator. can even chop character data using lexical ordering. default santoku emits warning case, avoid accidentally misinterpreting results: find type data can’t chop, please file issue.\",\"code\":\"y2k <- as.Date(\\\"2000-01-01\\\") + 0:10 * 7 data.frame(   y2k = y2k,   chopped = chop(y2k, as.Date(c(\\\"2000-02-01\\\", \\\"2000-03-01\\\"))) ) #>           y2k                  chopped #> 1  2000-01-01 [2000-01-01, 2000-02-01) #> 2  2000-01-08 [2000-01-01, 2000-02-01) #> 3  2000-01-15 [2000-01-01, 2000-02-01) #> 4  2000-01-22 [2000-01-01, 2000-02-01) #> 5  2000-01-29 [2000-01-01, 2000-02-01) #> 6  2000-02-05 [2000-02-01, 2000-03-01) #> 7  2000-02-12 [2000-02-01, 2000-03-01) #> 8  2000-02-19 [2000-02-01, 2000-03-01) #> 9  2000-02-26 [2000-02-01, 2000-03-01) #> 10 2000-03-04 [2000-03-01, 2000-03-11] #> 11 2000-03-11 [2000-03-01, 2000-03-11] # hours of the 2020 Crew Dragon flight: crew_dragon <- seq(as.POSIXct(\\\"2020-05-30 18:00\\\", tz = \\\"GMT\\\"),                       length.out = 24, by = \\\"hours\\\") liftoff <- as.POSIXct(\\\"2020-05-30 15:22\\\", tz = \\\"America/New_York\\\") dock    <- as.POSIXct(\\\"2020-05-31 10:16\\\", tz = \\\"America/New_York\\\")  data.frame(   crew_dragon = crew_dragon,   chopped = chop(crew_dragon, c(liftoff, dock),                     labels = c(\\\"pre-flight\\\", \\\"flight\\\", \\\"docked\\\")) ) #> Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent #> Warning in .check_tzones(e1, e2): 'tzone' attributes are inconsistent #>            crew_dragon    chopped #> 1  2020-05-30 18:00:00 pre-flight #> 2  2020-05-30 19:00:00 pre-flight #> 3  2020-05-30 20:00:00     flight #> 4  2020-05-30 21:00:00     flight #> 5  2020-05-30 22:00:00     flight #> 6  2020-05-30 23:00:00     flight #> 7  2020-05-31 00:00:00     flight #> 8  2020-05-31 01:00:00     flight #> 9  2020-05-31 02:00:00     flight #> 10 2020-05-31 03:00:00     flight #> 11 2020-05-31 04:00:00     flight #> 12 2020-05-31 05:00:00     flight #> 13 2020-05-31 06:00:00     flight #> 14 2020-05-31 07:00:00     flight #> 15 2020-05-31 08:00:00     flight #> 16 2020-05-31 09:00:00     flight #> 17 2020-05-31 10:00:00     flight #> 18 2020-05-31 11:00:00     flight #> 19 2020-05-31 12:00:00     flight #> 20 2020-05-31 13:00:00     flight #> 21 2020-05-31 14:00:00     flight #> 22 2020-05-31 15:00:00     docked #> 23 2020-05-31 16:00:00     docked #> 24 2020-05-31 17:00:00     docked library(lubridate) #>  #> Attaching package: 'lubridate' #> The following objects are masked from 'package:base': #>  #>     date, intersect, setdiff, union data.frame(   y2k = y2k,   chopped = chop_width(y2k, months(1)) ) #>           y2k                  chopped #> 1  2000-01-01 [2000-01-01, 2000-02-01) #> 2  2000-01-08 [2000-01-01, 2000-02-01) #> 3  2000-01-15 [2000-01-01, 2000-02-01) #> 4  2000-01-22 [2000-01-01, 2000-02-01) #> 5  2000-01-29 [2000-01-01, 2000-02-01) #> 6  2000-02-05 [2000-02-01, 2000-03-01) #> 7  2000-02-12 [2000-02-01, 2000-03-01) #> 8  2000-02-19 [2000-02-01, 2000-03-01) #> 9  2000-02-26 [2000-02-01, 2000-03-01) #> 10 2000-03-04 [2000-03-01, 2000-04-01) #> 11 2000-03-11 [2000-03-01, 2000-04-01) data.frame(   y2k = y2k,   chopped = chop_width(y2k, days(28), labels = lbl_date()) ) #>           y2k              chopped #> 1  2000-01-01        1-28 Jan 2000 #> 2  2000-01-08        1-28 Jan 2000 #> 3  2000-01-15        1-28 Jan 2000 #> 4  2000-01-22        1-28 Jan 2000 #> 5  2000-01-29 29 Jan - 25 Feb 2000 #> 6  2000-02-05 29 Jan - 25 Feb 2000 #> 7  2000-02-12 29 Jan - 25 Feb 2000 #> 8  2000-02-19 29 Jan - 25 Feb 2000 #> 9  2000-02-26 26 Feb - 24 Mar 2000 #> 10 2000-03-04 26 Feb - 24 Mar 2000 #> 11 2000-03-11 26 Feb - 24 Mar 2000 library(units) #> udunits database from /Users/davidhugh-jones/Library/R/arm64/4.6/library/units/share/udunits/udunits2.xml  x <- set_units(1:10 * 10, cm) br <- set_units(1:3, ft) data.frame(   x = x,   chopped = chop(x, br) ) #>           x                    chopped #> 1   10 [cm] [ 10.00 [cm],  30.48 [cm]) #> 2   20 [cm] [ 10.00 [cm],  30.48 [cm]) #> 3   30 [cm] [ 10.00 [cm],  30.48 [cm]) #> 4   40 [cm] [ 30.48 [cm],  60.96 [cm]) #> 5   50 [cm] [ 30.48 [cm],  60.96 [cm]) #> 6   60 [cm] [ 30.48 [cm],  60.96 [cm]) #> 7   70 [cm] [ 60.96 [cm],  91.44 [cm]) #> 8   80 [cm] [ 60.96 [cm],  91.44 [cm]) #> 9   90 [cm] [ 60.96 [cm],  91.44 [cm]) #> 10 100 [cm] [ 91.44 [cm], 100.00 [cm]] chop(letters[1:10], c(\\\"d\\\", \\\"f\\\")) #> Warning in categorize_non_numeric(x, breaks, left): `x` or `breaks` is of type #> character, using lexical sorting. To turn off this warning, run: #> options(santoku.warn_character = FALSE) #>  [1] [a, d) [a, d) [a, d) [d, f) [d, f) [f, j] [f, j] [f, j] [f, j] [f, j] #> Levels: [a, d) [d, f) [f, j]\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/website-articles/performance.html\",\"id\":\"speed\",\"dir\":\"Articles > Website-articles\",\"previous_headings\":\"\",\"what\":\"Speed\",\"title\":\"Performance\",\"text\":\"core santoku written C++. reasonably fast:\",\"code\":\"packageVersion(\\\"santoku\\\") #> [1] '1.2.0' set.seed(27101975)  mb <- bench::mark(min_iterations = 100, check = FALSE,         santoku::chop(rnorm(1e5), -2:2),         base::cut(rnorm(1e5), -2:2),         Hmisc::cut2(rnorm(1e5), -2:2)       ) mb #> # A tibble: 3 × 6 #>   expression                             min median `itr/sec` mem_alloc `gc/sec` #>   <bch:expr>                        <bch:tm> <bch:>     <dbl> <bch:byt>    <dbl> #> 1 santoku::chop(rnorm(1e+05), -2:2)   6.34ms 6.54ms      150.   10.21MB     64.5 #> 2 base::cut(rnorm(1e+05), -2:2)       2.73ms 2.78ms      357.    2.35MB     31.5 #> 3 Hmisc::cut2(rnorm(1e+05), -2:2)     9.74ms 9.88ms      101.    19.5MB    223. autoplot(mb, type = \\\"violin\\\")\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/website-articles/performance.html\",\"id\":\"many-breaks\",\"dir\":\"Articles > Website-articles\",\"previous_headings\":\"\",\"what\":\"Many breaks\",\"title\":\"Performance\",\"text\":\"\",\"code\":\"many_breaks <- seq(-2, 2, 0.001)  mb_breaks <- bench::mark(min_iterations = 100, check = FALSE,         santoku::chop(rnorm(1e4), many_breaks),         base::cut(rnorm(1e4), many_breaks),         Hmisc::cut2(rnorm(1e4), many_breaks)       )  mb_breaks #> # A tibble: 3 × 6 #>   expression                            min  median `itr/sec` mem_alloc `gc/sec` #>   <bch:expr>                        <bch:t> <bch:t>     <dbl> <bch:byt>    <dbl> #> 1 santoku::chop(rnorm(10000), many… 20.95ms 21.28ms      46.2    5.14MB     8.81 #> 2 base::cut(rnorm(10000), many_bre…  2.35ms  2.43ms     409.     1.39MB    17.7  #> 3 Hmisc::cut2(rnorm(10000), many_b…  7.03ms   7.2ms     138.      5.7MB    32.5 autoplot(mb_breaks, type = \\\"violin\\\")\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/website-articles/performance.html\",\"id\":\"various-chops\",\"dir\":\"Articles > Website-articles\",\"previous_headings\":\"\",\"what\":\"Various chops\",\"title\":\"Performance\",\"text\":\"\",\"code\":\"x <- c(rnorm(9e4), sample(-2:2, 1e4, replace = TRUE))  mb_various <- bench::mark(min_iterations = 100, check = FALSE,         chop(x, -2:2),         chop_equally(x, groups = 20),         chop_n(x, n = 2e4),         chop_quantiles(x, c(0.05, 0.25, 0.5, 0.75, 0.95)),         chop_evenly(x, intervals = 20),         chop_width(x, width = 0.25),         chop_proportions(x, proportions = c(0.05, 0.25, 0.5, 0.75, 0.95)),         chop_mean_sd(x, sds = 1:4),         chop_fn(x, scales::breaks_extended(10)),         chop_pretty(x, n = 10),         chop_spikes(x, -2:2, prop = 0.01),         dissect(x, -2:2, prop = 0.01)       )        mb_various #> # A tibble: 12 × 6 #>    expression                           min  median `itr/sec` mem_alloc `gc/sec` #>    <bch:expr>                       <bch:t> <bch:t>     <dbl> <bch:byt>    <dbl> #>  1 chop(x, -2:2)                     4.23ms  4.33ms     229.     8.63MB    118.  #>  2 chop_equally(x, groups = 20)     11.04ms  11.2ms      88.5   12.18MB     72.4 #>  3 chop_n(x, n = 20000)              7.65ms  8.11ms     124.     23.5MB    507.  #>  4 chop_quantiles(x, c(0.05, 0.25,…  6.63ms  6.75ms     147.    12.08MB    125.  #>  5 chop_evenly(x, intervals = 20)    5.43ms  5.57ms     178.    12.48MB    152.  #>  6 chop_width(x, width = 0.25)       5.96ms  6.08ms     163.    12.53MB    139.  #>  7 chop_proportions(x, proportions…  4.75ms  5.37ms     190.    12.48MB    162.  #>  8 chop_mean_sd(x, sds = 1:4)         4.9ms     5ms     198.    11.36MB    150.  #>  9 chop_fn(x, scales::breaks_exten…  5.33ms   5.5ms     177.    11.47MB    123.  #> 10 chop_pretty(x, n = 10)            4.87ms  5.02ms     197.    10.58MB    142.  #> 11 chop_spikes(x, -2:2, prop = 0.0…  8.14ms  8.41ms     119.    14.62MB    137.  #> 12 dissect(x, -2:2, prop = 0.01)    11.42ms 11.61ms      85.6   22.27MB    257. autoplot(mb_various, type = \\\"violin\\\")\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/whats-new-in-0-9-0.html\",\"id\":\"you-can-use-break-names-for-labels\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"You can use break names for labels\",\"title\":\"What's new in santoku 0.9.0\",\"text\":\"command line, sometimes ’d like quickly add labels breaks. Now, can simply adding names breaks vector: Break names override labels argument, can still use unnamed breaks: Names can also used labels chop_quantiles() chop_proportions(): feature experimental now.\",\"code\":\"library(santoku)  chop(1:5, c(1,3,5)) #> [1] [1, 3) [1, 3) [3, 5] [3, 5] [3, 5] #> Levels: [1, 3) [3, 5]  chop(1:5, c(Low = 1, High = 3, 5)) #> [1] Low  Low  High High High #> Levels: Low High ages <- sample(12:80, 20) tab(ages,        c(\\\"Under 16\\\" = 0, 16, 25, 35, 45, 55, \\\"65 and over\\\" = 65),        labels = lbl_discrete()     ) #>    Under 16       16—24       25—34       35—44       45—54       55—64  #>           1           1           2           3           3           4  #> 65 and over  #>           6 x <- rnorm(10) chopped <- chop_quantiles(x,                              c(\\\"Lower tail\\\" = 0, 0.025, \\\"Upper tail\\\" = 0.975)                           ) data.frame(x, chopped) #>             x       chopped #> 1  -1.3888607 [2.5%, 97.5%) #> 2  -0.2787888 [2.5%, 97.5%) #> 3  -0.1333213 [2.5%, 97.5%) #> 4   0.6359504 [2.5%, 97.5%) #> 5  -0.2842529 [2.5%, 97.5%) #> 6  -2.6564554    Lower tail #> 7  -2.4404669 [2.5%, 97.5%) #> 8   1.3201133    Upper tail #> 9  -0.3066386 [2.5%, 97.5%) #> 10 -1.7813084 [2.5%, 97.5%)\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/whats-new-in-0-9-0.html\",\"id\":\"close_end-works-differently\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"close_end works differently\",\"title\":\"What's new in santoku 0.9.0\",\"text\":\"close_end parameter used right-close last break. used applied breaks extended cover items beyond explicitly given breaks. think confusing users. now, close_end applied breaks extended - .e. last break. 0.8.0: Notice central break [2, 3] right-closed. (extended break [3, 4] right-closed , extended breaks always closed “outer” end.) 0.9.0: Now, close_end applied final, extended break [3, 4], explicit break [2, 3).\",\"code\":\"chop(1:4, 2:3, close_end = TRUE) #> [1] [1, 2) [2, 3] [2, 3] (3, 4] #> Levels: [1, 2) [2, 3] (3, 4] chop(1:4, 2:3, close_end = TRUE) #> [1] [1, 2) [2, 3) [3, 4] [3, 4] #> Levels: [1, 2) [2, 3) [3, 4]\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/whats-new-in-0-9-0.html\",\"id\":\"close_end-is-true-by-default\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"close_end is TRUE by default\",\"title\":\"What's new in santoku 0.9.0\",\"text\":\"think exploratory work, users typically want include data lowest highest break, inclusive. , close_end now TRUE default. 0.8.0: 0.9.0:\",\"code\":\"chop(1:3, 2:3) #> [1] [1, 2) [2, 3) {3}    #> Levels: [1, 2) [2, 3) {3} chop(1:3, 2:3) #> [1] [1, 2) [2, 3] [2, 3] #> Levels: [1, 2) [2, 3]\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/whats-new-in-0-9-0.html\",\"id\":\"new-raw-parameter-for-chop\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"New raw parameter for chop()\",\"title\":\"What's new in santoku 0.9.0\",\"text\":\"lbl_* functions raw parameter use raw interval endpoints labels, rather e.g. percentiles standard deviations. ’ve moved main chop() function. makes easier use: raw parameter lbl_* functions deprecated.\",\"code\":\"chop_mean_sd(x) #>  [1] [-1 sd, 0 sd)  [0 sd, 1 sd)   [0 sd, 1 sd)   [1 sd, 2 sd)   [0 sd, 1 sd)   #>  [6] [-2 sd, -1 sd) [-2 sd, -1 sd) [1 sd, 2 sd)   [0 sd, 1 sd)   [-1 sd, 0 sd)  #> Levels: [-2 sd, -1 sd) [-1 sd, 0 sd) [0 sd, 1 sd) [1 sd, 2 sd)  chop_mean_sd(x, raw = TRUE) #>  [1] [-2.03, -0.7314)  [-0.7314, 0.5674) [-0.7314, 0.5674) [0.5674, 1.866)   #>  [5] [-0.7314, 0.5674) [-3.329, -2.03)   [-3.329, -2.03)   [0.5674, 1.866)   #>  [9] [-0.7314, 0.5674) [-2.03, -0.7314)  #> 4 Levels: [-3.329, -2.03) [-2.03, -0.7314) ... [0.5674, 1.866)\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/whats-new-in-0-9-0.html\",\"id\":\"other-changes\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Other changes\",\"title\":\"What's new in santoku 0.9.0\",\"text\":\"NEWS file lists changes, including new chop_fn() function creates breaks using arbitrary function.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/articles/whats-new-in-0-9-0.html\",\"id\":\"feedback\",\"dir\":\"Articles\",\"previous_headings\":\"\",\"what\":\"Feedback\",\"title\":\"What's new in santoku 0.9.0\",\"text\":\"expect last release 1.0, ’ll stabilize interface move santoku “experimental” “stable”. , problems suggestions regarding changes, please file issue.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/authors.html\",\"id\":null,\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Authors\",\"title\":\"Authors and Citation\",\"text\":\"David Hugh-Jones. Author, maintainer. Daniel Possenriede. Contributor.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/authors.html\",\"id\":\"citation\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Citation\",\"title\":\"Authors and Citation\",\"text\":\"Hugh-Jones D (2026). santoku: Versatile Cutting Tool. R package version 1.2.0, https://github.com/hughjonesd/santoku.\",\"code\":\"@Manual{,   title = {santoku: A Versatile Cutting Tool},   author = {David Hugh-Jones},   year = {2026},   note = {R package version 1.2.0},   url = {https://github.com/hughjonesd/santoku}, }\"},{\"path\":\"https://hughjonesd.github.io/santoku/index.html\",\"id\":\"santoku-\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"A Versatile Cutting Tool\",\"title\":\"A Versatile Cutting Tool\",\"text\":\"santoku versatile cutting tool R. provides chop(), replacement base::cut().\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/index.html\",\"id\":\"installation\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Installation\",\"title\":\"A Versatile Cutting Tool\",\"text\":\"Install r-universe: CRAN: get development version github:\",\"code\":\"install.packages(\\\"santoku\\\", repos = c(\\\"https://hughjonesd.r-universe.dev\\\",                                        \\\"https://cloud.r-project.org\\\")) install.packages(\\\"santoku\\\") # install.packages(\\\"remotes\\\") remotes::install_github(\\\"hughjonesd/santoku\\\")\"},{\"path\":\"https://hughjonesd.github.io/santoku/index.html\",\"id\":\"advantages\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Advantages\",\"title\":\"A Versatile Cutting Tool\",\"text\":\"advantages santoku: default, chop() always covers whole range data, won’t get unexpected NA values. chop() can handle single values well intervals. example, chop(x, breaks = c(1, 2, 2, 3)) create separate factor level values exactly equal 2. chop() can handle many kinds data, including numbers, dates times, units. chop_* functions create intervals many ways, using quantiles data, standard deviations, fixed-width intervals, equal-sized groups, pretty intervals use graphs. ’s easy label intervals: use names breaks vector, use lbl_* function create interval notation like [1, 2), dash notation like 1-2, arbitrary styles using glue::glue(). tab_* functions quickly chop data, tabulate . advantages make santoku especially useful exploratory analysis, may know range data advance.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/index.html\",\"id\":\"examples\",\"dir\":\"\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"A Versatile Cutting Tool\",\"text\":\"chop returns factor: Include number twice match exactly: Use names breaks labels: use lbl_* functions: Chop fixed-width intervals: fixed-size groups: Chop dates calendar month, tabulate: information, see vignette.\",\"code\":\"library(santoku) chop(1:5, c(2, 4)) #> [1] [1, 2) [2, 4) [2, 4) [4, 5] [4, 5] #> Levels: [1, 2) [2, 4) [4, 5] chop(1:5, c(2, 2, 4)) #> [1] [1, 2) {2}    (2, 4) [4, 5] [4, 5] #> Levels: [1, 2) {2} (2, 4) [4, 5] chop(1:5, c(Low = 1, Mid = 2, High = 4)) #> [1] Low  Mid  Mid  High High #> Levels: Low Mid High chop(1:5, c(2, 4), labels = lbl_dash()) #> [1] 1—2 2—4 2—4 4—5 4—5 #> Levels: 1—2 2—4 4—5 chop_width(runif(10), 0.1) #>  [1] [0.368, 0.468)   [0.268, 0.368)   [0.768, 0.868]   [0.568, 0.668)   #>  [5] [0.668, 0.768)   [0.768, 0.868]   [0.06801, 0.168) [0.668, 0.768)   #>  [9] [0.06801, 0.168) [0.468, 0.568)   #> 7 Levels: [0.06801, 0.168) [0.268, 0.368) [0.368, 0.468) ... [0.768, 0.868] chop_n(1:10, 5) #>  [1] [1, 6)  [1, 6)  [1, 6)  [1, 6)  [1, 6)  [6, 10] [6, 10] [6, 10] [6, 10] #> [10] [6, 10] #> Levels: [1, 6) [6, 10] library(lubridate) #>  #> Attaching package: 'lubridate' #> The following objects are masked from 'package:base': #>  #>     date, intersect, setdiff, union  dates <- as.Date(\\\"2021-12-31\\\") + 1:90  tab_width(dates, months(1), labels = lbl_discrete(fmt = \\\"%d %b\\\")) #> 01 Jan—31 Jan 01 Feb—28 Feb 01 Mar—31 Mar  #>            31            28            31\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/breaks-class.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Class representing a set of intervals — breaks-class\",\"title\":\"Class representing a set of intervals — breaks-class\",\"text\":\"Class representing set intervals\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/breaks-class.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Class representing a set of intervals — breaks-class\",\"text\":\"\",\"code\":\"# S3 method for class 'breaks' format(x, ...)  # S3 method for class 'breaks' print(x, ...)  is.breaks(x, ...)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/breaks-class.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Class representing a set of intervals — breaks-class\",\"text\":\"x breaks object ... Unused\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk-left-right.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Left- or right-closed breaks — brk-left-right\",\"text\":\"\",\"code\":\"brk_left(breaks)  brk_right(breaks)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk-left-right.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Left- or right-closed breaks — brk-left-right\",\"text\":\"breaks numeric vector.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk-left-right.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Left- or right-closed breaks — brk-left-right\",\"text\":\"(function returns ) object class breaks.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk-left-right.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Left- or right-closed breaks — brk-left-right\",\"text\":\"functions \\\"questioning\\\" stage clash left argument chop() friends. functions override left argument chop().\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk-left-right.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Left- or right-closed breaks — brk-left-right\",\"text\":\"\",\"code\":\"chop(5:7, brk_left(5:7)) #> Warning: `brk_left()` was deprecated in santoku 0.4.0. #> Please use the `left` argument to `chop()` instead. #> This warning is displayed once every 8 hours. #> Call `lifecycle::last_warnings()` to see where this warning was generated. #> [1] [5, 6) [6, 7) {7}    #> Levels: [5, 6) [6, 7) {7}  chop(5:7, brk_right(5:7)) #> Warning: `brk_right()` was deprecated in santoku 0.4.0. #> Please use the `left` argument to `chop()` instead. #> This warning is displayed once every 8 hours. #> Call `lifecycle::last_warnings()` to see where this warning was generated. #> Warning: `left` argument to `brk_right()` ignored #> [1] {5}    (5, 6] (6, 7] #> Levels: {5} (5, 6] (6, 7]  chop(5:7, brk_left(5:7)) #> [1] [5, 6) [6, 7) {7}    #> Levels: [5, 6) [6, 7) {7}\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_default.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Create a standard set of breaks — brk_default\",\"title\":\"Create a standard set of breaks — brk_default\",\"text\":\"Create standard set breaks\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_default.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Create a standard set of breaks — brk_default\",\"text\":\"\",\"code\":\"brk_default(breaks)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_default.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Create a standard set of breaks — brk_default\",\"text\":\"breaks numeric vector.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_default.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Create a standard set of breaks — brk_default\",\"text\":\"function returns object class breaks.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_default.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Create a standard set of breaks — brk_default\",\"text\":\"\",\"code\":\"chop(1:10, c(2, 5, 8)) #>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  [5, 8)  [5, 8)  [5, 8)  [8, 10] [8, 10] #> [10] [8, 10] #> Levels: [1, 2) [2, 5) [5, 8) [8, 10] chop(1:10, brk_default(c(2, 5, 8))) #>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  [5, 8)  [5, 8)  [5, 8)  [8, 10] [8, 10] #> [10] [8, 10] #> Levels: [1, 2) [2, 5) [5, 8) [8, 10]\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_manual.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Create a breaks object manually — brk_manual\",\"title\":\"Create a breaks object manually — brk_manual\",\"text\":\"Create breaks object manually\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_manual.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Create a breaks object manually — brk_manual\",\"text\":\"\",\"code\":\"brk_manual(breaks, left_vec)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_manual.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Create a breaks object manually — brk_manual\",\"text\":\"breaks vector, must sorted. left_vec logical vector, length breaks. Specifies whether break left-closed right-closed.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_manual.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Create a breaks object manually — brk_manual\",\"text\":\"function returns object class breaks.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_manual.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Create a breaks object manually — brk_manual\",\"text\":\"breaks must closed exactly one side, like ..., x) [x, ... (left-closed) ..., x) [x, ... (right-closed). example, breaks = 1:3 left = c(TRUE, FALSE, TRUE), resulting intervals Singleton breaks created repeating number breaks. Singletons must closed sides, repeated number indices , +1, left[] must TRUE left[+1] must FALSE. brk_manual() ignores left close_end arguments passed chop(), since left_vec sets manually. extend drop arguments respected usual.\",\"code\":\"T        F       T [ 1,  2 ] ( 2, 3 )\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_manual.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Create a breaks object manually — brk_manual\",\"text\":\"\",\"code\":\"lbrks <- brk_manual(1:3, rep(TRUE, 3)) chop(1:3, lbrks, extend = FALSE) #> [1] [1, 2) [2, 3) <NA>   #> Levels: [1, 2) [2, 3)  rbrks <- brk_manual(1:3, rep(FALSE, 3)) chop(1:3, rbrks, extend = FALSE) #> [1] <NA>   (1, 2] (2, 3] #> Levels: (1, 2] (2, 3]  brks_singleton <- brk_manual(       c(1,    2,    2,     3),       c(TRUE, TRUE, FALSE, TRUE))  chop(1:3, brks_singleton, extend = FALSE) #> [1] [1, 2) {2}    <NA>   #> Levels: [1, 2) {2}\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_width-for-datetime.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Equal-width intervals for dates or datetimes — brk_width-for-datetime\",\"title\":\"Equal-width intervals for dates or datetimes — brk_width-for-datetime\",\"text\":\"brk_width() can used time interval classes base R lubridate package.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_width-for-datetime.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Equal-width intervals for dates or datetimes — brk_width-for-datetime\",\"text\":\"\",\"code\":\"# S3 method for class 'Duration' brk_width(width, start)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_width-for-datetime.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Equal-width intervals for dates or datetimes — brk_width-for-datetime\",\"text\":\"width scalar difftime, Period Duration object. start scalar class Date POSIXct. Can omitted.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_width-for-datetime.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Equal-width intervals for dates or datetimes — brk_width-for-datetime\",\"text\":\"width Period, lubridate::add_with_rollback() used calculate widths. can useful e.g. calendar months.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/brk_width-for-datetime.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Equal-width intervals for dates or datetimes — brk_width-for-datetime\",\"text\":\"\",\"code\":\"if (requireNamespace(\\\"lubridate\\\")) {   year2001 <- as.Date(\\\"2001-01-01\\\") + 0:364   tab_width(year2001, months(1),         labels = lbl_discrete(\\\" to \\\", fmt = \\\"%e %b %y\\\")) } #>  1 Jan 01 to 31 Jan 01  1 Feb 01 to 28 Feb 01  1 Mar 01 to 31 Mar 01  #>                     31                     28                     31  #>  1 Apr 01 to 30 Apr 01  1 May 01 to 31 May 01  1 Jun 01 to 30 Jun 01  #>                     30                     31                     30  #>  1 Jul 01 to 31 Jul 01  1 Aug 01 to 31 Aug 01  1 Sep 01 to 30 Sep 01  #>                     31                     31                     30  #>  1 Oct 01 to 31 Oct 01  1 Nov 01 to 30 Nov 01  1 Dec 01 to 31 Dec 01  #>                     31                     30                     31\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Cut data into intervals — chop\",\"title\":\"Cut data into intervals — chop\",\"text\":\"chop() cuts x intervals. returns factor length x, representing interval contains element x. kiru() alias chop. tab() calls chop() returns contingency table result.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Cut data into intervals — chop\",\"text\":\"\",\"code\":\"chop(   x,   breaks,   labels = lbl_intervals(),   extend = NULL,   left = TRUE,   close_end = TRUE,   raw = NULL,   drop = TRUE )  kiru(   x,   breaks,   labels = lbl_intervals(),   extend = NULL,   left = TRUE,   close_end = TRUE,   raw = NULL,   drop = TRUE )  tab(   x,   breaks,   labels = lbl_intervals(),   extend = NULL,   left = TRUE,   close_end = TRUE,   raw = NULL,   drop = TRUE )\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Cut data into intervals — chop\",\"text\":\"x vector. breaks numeric vector cut-points, function create cut-points x. labels character vector labels function create labels. extend Logical. TRUE, always extend breaks +/-Inf. NULL, extend breaks min(x) /max(x) necessary. FALSE, never extend. left Logical. Left-closed right-closed breaks? close_end Logical. Close last break right? (left FALSE, close first break left?) raw Logical. Use raw values labels? drop Logical. Drop unused levels result?\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Cut data into intervals — chop\",\"text\":\"chop() returns factor length x, representing intervals containing value x. tab() returns contingency table.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Cut data into intervals — chop\",\"text\":\"x may numeric vector, generally, vector can compared < == (see Ops). particular Date date-time objects supported. Character vectors supported warning.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop.html\",\"id\":\"breaks\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Breaks\",\"title\":\"Cut data into intervals — chop\",\"text\":\"breaks may vector function. vector, breaks gives interval endpoints. Repeating value creates \\\"singleton\\\" interval, contains value. example breaks = c(1, 3, 3, 5) creates 3 intervals: [1, 3), {3} (3, 5]. breaks function, called x, extend, left close_end arguments, return object class breaks. Use brk_* functions create variety data-dependent breaks. Names breaks may used labels. See \\\"Labels\\\" .\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop.html\",\"id\":\"options-for-breaks\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Options for breaks\",\"title\":\"Cut data into intervals — chop\",\"text\":\"default, left-closed intervals created. left FALSE, right-closed intervals created. close_end TRUE final break (first break left FALSE) closed ends. guarantees values x min(breaks) <= x <= max(breaks) included intervals. version 0.9.0, close_end FALSE default, also behaved differently respect extended breaks: see \\\"Extending intervals\\\" . Using mathematical set notation: left TRUE close_end TRUE, breaks look like [b1, b2), [b2, b3) ... [b_(n-1), b_n]. left FALSE close_end TRUE, breaks look like [b1, b2], (b2, b3] ... (b_(n-1), b_n]. left TRUE close_end FALSE, breaks look like ... [b1, b2) .... left FALSE close_end FALSE, breaks look like ... (b1, b2] ....\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop.html\",\"id\":\"extending-intervals\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Extending intervals\",\"title\":\"Cut data into intervals — chop\",\"text\":\"extend TRUE, intervals extended [-Inf, min(breaks)) (max(breaks), Inf]. extend NULL (default), intervals extended [min(x), min(breaks)) (max(breaks), max(x)], necessary, .e. elements x outside unextended breaks. extend FALSE, intervals never extended. Note even extend = TRUE, extended intervals dropped factor levels contain elements drop = TRUE. close_end relevant intervals extended; extended intervals always closed outside. change previous behaviour. version 0.8.0, close_end applied last user-specified interval, extended intervals created. Since 1.1.0, infinity represented \\\\(\\\\infty\\\\) breaks unicode platforms. Set  options(santoku.infinity = \\\"Inf\\\") get old behaviour.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop.html\",\"id\":\"labels\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Labels\",\"title\":\"Cut data into intervals — chop\",\"text\":\"labels may character vector. length (possibly extended) number intervals. Alternatively, labels may lbl_* function lbl_dash(). breaks named vector, names breaks used labels interval starting corresponding element. overrides labels argument (unnamed breaks still use labels). feature . labels NULL, integer codes returned instead factor. raw TRUE, labels show actual interval endpoints, usually numbers. raw FALSE labels may show objects, quantiles chop_quantiles() friends, proportions range chop_proportions(), standard deviations chop_mean_sd(). raw NULL lbl_* functions use default (usually FALSE). Otherwise, raw argument chop() overrides raw arguments passed lbl_* functions directly.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop.html\",\"id\":\"miscellaneous\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Miscellaneous\",\"title\":\"Cut data into intervals — chop\",\"text\":\"NA values x, values outside extended endpoints, return NA. kiru() synonym chop(). load {tidyr}, can use avoid confusion tidyr::chop(). Note chop(), like R, uses binary arithmetic. Thus, numbers may exactly equal think . example .\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Cut data into intervals — chop\",\"text\":\"\",\"code\":\"chop(1:7, c(2, 4, 6)) #> [1] [1, 2) [2, 4) [2, 4) [4, 6) [4, 6) [6, 7] [6, 7] #> Levels: [1, 2) [2, 4) [4, 6) [6, 7]  chop(1:7, c(2, 4, 6), extend = FALSE) #> [1] <NA>   [2, 4) [2, 4) [4, 6] [4, 6] [4, 6] <NA>   #> Levels: [2, 4) [4, 6]  # Repeat a number for a singleton break: chop(1:7, c(2, 4, 4, 6)) #> [1] [1, 2) [2, 4) [2, 4) {4}    (4, 6) [6, 7] [6, 7] #> Levels: [1, 2) [2, 4) {4} (4, 6) [6, 7]  chop(1:7, c(2, 4, 6), left = FALSE) #> [1] [1, 2] [1, 2] (2, 4] (2, 4] (4, 6] (4, 6] (6, 7] #> Levels: [1, 2] (2, 4] (4, 6] (6, 7]  chop(1:7, c(2, 4, 6), close_end = FALSE) #> [1] [1, 2) [2, 4) [2, 4) [4, 6) [4, 6) [6, 7] [6, 7] #> Levels: [1, 2) [2, 4) [4, 6) [6, 7]  chop(1:7, brk_quantiles(c(0.25, 0.75))) #> [1] [0%, 25%)   [0%, 25%)   [25%, 75%)  [25%, 75%)  [25%, 75%)  [75%, 100%] #> [7] [75%, 100%] #> Levels: [0%, 25%) [25%, 75%) [75%, 100%]  # A single break is fine if `extend` is not `FALSE`: chop(1:7, 4) #> [1] [1, 4) [1, 4) [1, 4) [4, 7] [4, 7] [4, 7] [4, 7] #> Levels: [1, 4) [4, 7]  # Floating point inaccuracy: chop(0.3/3, c(0, 0.1, 0.1, 1), labels = c(\\\"< 0.1\\\", \\\"0.1\\\", \\\"> 0.1\\\")) #> [1] < 0.1 #> Levels: < 0.1  # -- Labels --  chop(1:7, c(Lowest = 1, Low = 2, Mid = 4, High = 6)) #> [1] Lowest Low    Low    Mid    Mid    High   High   #> Levels: Lowest Low Mid High  chop(1:7, c(2, 4, 6), labels = c(\\\"Lowest\\\", \\\"Low\\\", \\\"Mid\\\", \\\"High\\\")) #> [1] Lowest Low    Low    Mid    Mid    High   High   #> Levels: Lowest Low Mid High  chop(1:7, c(2, 4, 6), labels = lbl_dash()) #> [1] 1—2 2—4 2—4 4—6 4—6 6—7 6—7 #> Levels: 1—2 2—4 4—6 6—7  # Mixing names and other labels: chop(1:7, c(\\\"<2\\\" = 1, 2, 4, \\\">=6\\\" = 6), labels = lbl_dash()) #> [1] <2  2—4 2—4 4—6 4—6 >=6 >=6 #> Levels: <2 2—4 4—6 >=6  # -- Non-standard types --  chop(as.Date(\\\"2001-01-01\\\") + 1:7, as.Date(\\\"2001-01-04\\\")) #> [1] [2001-01-02, 2001-01-04) [2001-01-02, 2001-01-04) [2001-01-04, 2001-01-08] #> [4] [2001-01-04, 2001-01-08] [2001-01-04, 2001-01-08] [2001-01-04, 2001-01-08] #> [7] [2001-01-04, 2001-01-08] #> Levels: [2001-01-02, 2001-01-04) [2001-01-04, 2001-01-08]  suppressWarnings(chop(LETTERS[1:7], \\\"D\\\")) #> [1] [A, D) [A, D) [A, D) [D, G] [D, G] [D, G] [D, G] #> Levels: [A, D) [D, G]   tab(1:10, c(2, 5, 8)) #>  [1, 2)  [2, 5)  [5, 8) [8, 10]  #>       1       3       3       3\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_equally.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Chop equal-sized groups — chop_equally\",\"title\":\"Chop equal-sized groups — chop_equally\",\"text\":\"chop_equally() chops x groups equal number elements.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_equally.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Chop equal-sized groups — chop_equally\",\"text\":\"\",\"code\":\"chop_equally(   x,   groups,   ...,   labels = lbl_intervals(),   left = is.numeric(x),   raw = TRUE )  brk_equally(groups)  tab_equally(x, groups, ..., left = is.numeric(x), raw = TRUE)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_equally.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Chop equal-sized groups — chop_equally\",\"text\":\"x vector. groups Number groups. ... Passed chop(). labels character vector labels function create labels. left Logical. Left-closed right-closed breaks? raw Logical. Use raw values labels?\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_equally.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Chop equal-sized groups — chop_equally\",\"text\":\"chop_* functions return factor length x. brk_* functions return function create breaks. tab_* functions return contingency table.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_equally.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Chop equal-sized groups — chop_equally\",\"text\":\"chop_equally() uses brk_quantiles() hood. x duplicate elements, may get fewer groups requested. , warning emitted. See examples.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_equally.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Chop equal-sized groups — chop_equally\",\"text\":\"\",\"code\":\"chop_equally(1:10, 5) #>  [1] [1, 2.8)   [1, 2.8)   [2.8, 4.6) [2.8, 4.6) [4.6, 6.4) [4.6, 6.4) #>  [7] [6.4, 8.2) [6.4, 8.2) [8.2, 10]  [8.2, 10]  #> Levels: [1, 2.8) [2.8, 4.6) [4.6, 6.4) [6.4, 8.2) [8.2, 10]  # You can't always guarantee equal-sized groups: dupes <- c(1, 1, 1, 2, 3, 4, 4, 4) quantile(dupes, 0:4/4) #>   0%  25%  50%  75% 100%  #>  1.0  1.0  2.5  4.0  4.0  chop_equally(dupes, 4) #> Warning: `x` has duplicate quantiles: break labels may be misleading #> [1] {1}      {1}      {1}      (1, 2.5) [2.5, 4) {4}      {4}      {4}      #> Levels: {1} (1, 2.5) [2.5, 4) {4} # Or as many groups as you ask for: chop_equally(c(1, 1, 2, 2), 3) #> Warning: `x` has duplicate quantiles: break labels may be misleading #> [1] {1} {1} {2} {2} #> Levels: {1} {2}\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_evenly.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Chop into equal-width intervals — chop_evenly\",\"title\":\"Chop into equal-width intervals — chop_evenly\",\"text\":\"chop_evenly() chops x intervals intervals equal width.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_evenly.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Chop into equal-width intervals — chop_evenly\",\"text\":\"\",\"code\":\"chop_evenly(x, intervals, ...)  brk_evenly(intervals)  tab_evenly(x, intervals, ...)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_evenly.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Chop into equal-width intervals — chop_evenly\",\"text\":\"x vector. intervals Integer: number intervals create. ... Passed chop().\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_evenly.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Chop into equal-width intervals — chop_evenly\",\"text\":\"chop_* functions return factor length x. brk_* functions return function create breaks. tab_* functions return contingency table.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_evenly.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Chop into equal-width intervals — chop_evenly\",\"text\":\"\",\"code\":\"chop_evenly(0:10, 5) #>  [1] [0, 2)  [0, 2)  [2, 4)  [2, 4)  [4, 6)  [4, 6)  [6, 8)  [6, 8)  [8, 10] #> [10] [8, 10] [8, 10] #> Levels: [0, 2) [2, 4) [4, 6) [6, 8) [8, 10]\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_fn.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Chop using an existing function — chop_fn\",\"title\":\"Chop using an existing function — chop_fn\",\"text\":\"chop_fn() convenience wrapper: chop_fn(x, foo, ...) chop(x, foo(x, ...)).\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_fn.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Chop using an existing function — chop_fn\",\"text\":\"\",\"code\":\"chop_fn(   x,   fn,   ...,   extend = NULL,   left = TRUE,   close_end = TRUE,   raw = NULL,   drop = TRUE )  brk_fn(fn, ...)  tab_fn(   x,   fn,   ...,   extend = NULL,   left = TRUE,   close_end = TRUE,   raw = NULL,   drop = TRUE )\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_fn.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Chop using an existing function — chop_fn\",\"text\":\"x vector. fn function returns numeric vector breaks. ... arguments fn extend Logical. TRUE, always extend breaks +/-Inf. NULL, extend breaks min(x) /max(x) necessary. FALSE, never extend. left Logical. Left-closed right-closed breaks? close_end Logical. Close last break right? (left FALSE, close first break left?) raw Logical. Use raw values labels? drop Logical. Drop unused levels result?\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_fn.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Chop using an existing function — chop_fn\",\"text\":\"chop_* functions return factor length x. brk_* functions return function create breaks. tab_* functions return contingency table.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_fn.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Chop using an existing function — chop_fn\",\"text\":\"\",\"code\":\"if (requireNamespace(\\\"scales\\\")) {   chop_fn(rlnorm(10), scales::breaks_log(5))   # same as   # x <- rlnorm(10)   # chop(x, scales::breaks_log(5)(x)) } #> Loading required namespace: scales #>  [1] [0.1, 0.3)  [1, 3)      [0.03, 0.1) [0.3, 1)    [1, 3)      [3, 10]     #>  [7] [0.1, 0.3)  [0.3, 1)    [0.3, 1)    [0.3, 1)    #> Levels: [0.03, 0.1) [0.1, 0.3) [0.3, 1) [1, 3) [3, 10]\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_mean_sd.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Chop by standard deviations — chop_mean_sd\",\"title\":\"Chop by standard deviations — chop_mean_sd\",\"text\":\"Intervals measured standard deviations either side mean.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_mean_sd.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Chop by standard deviations — chop_mean_sd\",\"text\":\"\",\"code\":\"chop_mean_sd(x, sds = 1:3, ..., raw = FALSE, sd = deprecated())  brk_mean_sd(sds = 1:3, sd = deprecated())  tab_mean_sd(x, sds = 1:3, ..., raw = FALSE)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_mean_sd.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Chop by standard deviations — chop_mean_sd\",\"text\":\"x vector. sds Positive numeric vector standard deviations. ... Passed chop(). raw Logical. Use raw values labels? sd\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_mean_sd.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Chop by standard deviations — chop_mean_sd\",\"text\":\"chop_* functions return factor length x. brk_* functions return function create breaks. tab_* functions return contingency table.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_mean_sd.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Chop by standard deviations — chop_mean_sd\",\"text\":\"version 0.7.0, functions changed specifying sds vector. chop 1, 2 3 standard deviations around mean, write chop_mean_sd(x, sds = 1:3) instead chop_mean_sd(x, sd = 3).\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_mean_sd.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Chop by standard deviations — chop_mean_sd\",\"text\":\"\",\"code\":\"chop_mean_sd(1:10) #>  [1] [-2 sd, -1 sd) [-2 sd, -1 sd) [-1 sd, 0 sd)  [-1 sd, 0 sd)  [-1 sd, 0 sd)  #>  [6] [0 sd, 1 sd)   [0 sd, 1 sd)   [0 sd, 1 sd)   [1 sd, 2 sd)   [1 sd, 2 sd)   #> Levels: [-2 sd, -1 sd) [-1 sd, 0 sd) [0 sd, 1 sd) [1 sd, 2 sd)  chop(1:10, brk_mean_sd()) #>  [1] [-2 sd, -1 sd) [-2 sd, -1 sd) [-1 sd, 0 sd)  [-1 sd, 0 sd)  [-1 sd, 0 sd)  #>  [6] [0 sd, 1 sd)   [0 sd, 1 sd)   [0 sd, 1 sd)   [1 sd, 2 sd)   [1 sd, 2 sd)   #> Levels: [-2 sd, -1 sd) [-1 sd, 0 sd) [0 sd, 1 sd) [1 sd, 2 sd)  tab_mean_sd(1:10) #> [-2 sd, -1 sd)  [-1 sd, 0 sd)   [0 sd, 1 sd)   [1 sd, 2 sd)  #>              2              3              3              2\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_n.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Chop into fixed-sized groups — chop_n\",\"title\":\"Chop into fixed-sized groups — chop_n\",\"text\":\"chop_n() creates intervals containing fixed number elements.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_n.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Chop into fixed-sized groups — chop_n\",\"text\":\"\",\"code\":\"chop_n(x, n, ..., tail = \\\"split\\\")  brk_n(n, tail = \\\"split\\\")  tab_n(x, n, ..., tail = \\\"split\\\")\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_n.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Chop into fixed-sized groups — chop_n\",\"text\":\"x vector. n Integer. Number elements interval. ... Passed chop(). tail String. final interval fewer n elements? \\\"split\\\" keep separate. \\\"merge\\\" merge neighbouring interval.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_n.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Chop into fixed-sized groups — chop_n\",\"text\":\"chop_* functions return factor length x. brk_* functions return function create breaks. tab_* functions return contingency table.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_n.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Chop into fixed-sized groups — chop_n\",\"text\":\"algorithm guarantees intervals contain n elements, long duplicates x tail = \\\"split\\\". also guarantees intervals contain fewer n elements, except possibly last interval (first interval left FALSE). ensure intervals contain least n elements (long least n elements x!) set tail = \\\"merge\\\". tail = \\\"split\\\" intervals containing duplicates n elements, warning given.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_n.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Chop into fixed-sized groups — chop_n\",\"text\":\"\",\"code\":\"chop_n(1:10, 5) #>  [1] [1, 6)  [1, 6)  [1, 6)  [1, 6)  [1, 6)  [6, 10] [6, 10] [6, 10] [6, 10] #> [10] [6, 10] #> Levels: [1, 6) [6, 10]  chop_n(1:5, 2) #> [1] [1, 3) [1, 3) [3, 5) [3, 5) {5}    #> Levels: [1, 3) [3, 5) {5} chop_n(1:5, 2, tail = \\\"merge\\\") #> [1] [1, 3) [1, 3) [3, 5] [3, 5] [3, 5] #> Levels: [1, 3) [3, 5]  # too many duplicates x <- rep(1:2, each = 3) chop_n(x, 2) #> Warning: Some intervals contain more than 2 elements #> [1] [1, 2) [1, 2) [1, 2) {2}    {2}    {2}    #> Levels: [1, 2) {2}  tab_n(1:10, 5) #>  [1, 6) [6, 10]  #>       5       5   # fewer elements in one group tab_n(1:10, 4) #>  [1, 5)  [5, 9) [9, 10]  #>       4       4       2\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_pretty.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Chop using pretty breakpoints — chop_pretty\",\"title\":\"Chop using pretty breakpoints — chop_pretty\",\"text\":\"chop_pretty() uses base::pretty() calculate breakpoints 1, 2 5 times power 10. look nice graphs.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_pretty.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Chop using pretty breakpoints — chop_pretty\",\"text\":\"\",\"code\":\"chop_pretty(x, n = 5, ...)  brk_pretty(n = 5, ...)  tab_pretty(x, n = 5, ...)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_pretty.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Chop using pretty breakpoints — chop_pretty\",\"text\":\"x vector. n Positive integer passed base::pretty(). many intervals chop ? ... Passed chop() chop_pretty() tab_pretty(); passed base::pretty() brk_pretty().\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_pretty.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Chop using pretty breakpoints — chop_pretty\",\"text\":\"chop_* functions return factor length x. brk_* functions return function create breaks. tab_* functions return contingency table.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_pretty.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Chop using pretty breakpoints — chop_pretty\",\"text\":\"base::pretty() tries return n+1 breakpoints, .e. n intervals, note guaranteed. methods Date POSIXct objects. fine-grained control base::pretty() parameters, use chop(x, brk_pretty(...)).\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_pretty.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Chop using pretty breakpoints — chop_pretty\",\"text\":\"\",\"code\":\"chop_pretty(1:10) #>  [1] [0, 2)  [2, 4)  [2, 4)  [4, 6)  [4, 6)  [6, 8)  [6, 8)  [8, 10] [8, 10] #> [10] [8, 10] #> Levels: [0, 2) [2, 4) [4, 6) [6, 8) [8, 10]  chop(1:10, brk_pretty(n = 5, high.u.bias = 0)) #>  [1] [1, 2)  [2, 3)  [3, 4)  [4, 5)  [5, 6)  [6, 7)  [7, 8)  [8, 9)  [9, 10] #> [10] [9, 10] #> Levels: [1, 2) [2, 3) [3, 4) [4, 5) [5, 6) [6, 7) [7, 8) [8, 9) [9, 10]  tab_pretty(1:10) #>  [0, 2)  [2, 4)  [4, 6)  [6, 8) [8, 10]  #>       1       2       2       2       3\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_proportions.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Chop into proportions of the range of x — chop_proportions\",\"title\":\"Chop into proportions of the range of x — chop_proportions\",\"text\":\"chop_proportions() chops x proportions range, excluding infinite values.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_proportions.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Chop into proportions of the range of x — chop_proportions\",\"text\":\"\",\"code\":\"chop_proportions(x, proportions, ..., raw = TRUE)  brk_proportions(proportions)  tab_proportions(x, proportions, ..., raw = TRUE)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_proportions.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Chop into proportions of the range of x — chop_proportions\",\"text\":\"x vector. proportions Numeric vector 0 1: proportions x's range. proportions names, used labels. ... Passed chop(). raw Logical. Use raw values labels?\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_proportions.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Chop into proportions of the range of x — chop_proportions\",\"text\":\"chop_* functions return factor length x. brk_* functions return function create breaks. tab_* functions return contingency table.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_proportions.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Chop into proportions of the range of x — chop_proportions\",\"text\":\"default, labels show raw numeric endpoints. label intervals proportions, use raw = FALSE.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_proportions.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Chop into proportions of the range of x — chop_proportions\",\"text\":\"\",\"code\":\"chop_proportions(0:10, c(0.2, 0.8)) #>  [1] [0, 2)  [0, 2)  [2, 8)  [2, 8)  [2, 8)  [2, 8)  [2, 8)  [2, 8)  [8, 10] #> [10] [8, 10] [8, 10] #> Levels: [0, 2) [2, 8) [8, 10] chop_proportions(0:10, c(Low = 0, Mid = 0.2, High = 0.8)) #>  [1] Low  Low  Mid  Mid  Mid  Mid  Mid  Mid  High High High #> Levels: Low Mid High\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_quantiles.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Chop by quantiles — chop_quantiles\",\"title\":\"Chop by quantiles — chop_quantiles\",\"text\":\"chop_quantiles() chops data quantiles. chop_deciles() convenience function chops deciles.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_quantiles.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Chop by quantiles — chop_quantiles\",\"text\":\"\",\"code\":\"chop_quantiles(   x,   probs,   ...,   labels = if (raw) lbl_intervals() else lbl_intervals(single = NULL),   left = is.numeric(x),   raw = FALSE,   weights = NULL,   recalc_probs = FALSE )  chop_deciles(x, ...)  brk_quantiles(probs, ..., weights = NULL, recalc_probs = FALSE)  tab_quantiles(x, probs, ..., left = is.numeric(x), raw = FALSE)  tab_deciles(x, ...)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_quantiles.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Chop by quantiles — chop_quantiles\",\"text\":\"x vector. probs vector probabilities quantiles. probs names, used labels. ... chop_quantiles, passed chop(). brk_quantiles(), passed stats::quantile() Hmisc::wtd.quantile(). labels character vector labels function create labels. left Logical. Left-closed right-closed breaks? raw Logical. Use raw values labels? weights NULL numeric vector length x. NULL, Hmisc::wtd.quantile() used calculate weighted quantiles. recalc_probs Logical. Recalculate probabilities quantiles using ecdf(x)? See .\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_quantiles.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Chop by quantiles — chop_quantiles\",\"text\":\"chop_* functions return factor length x. brk_* functions return function create breaks. tab_* functions return contingency table.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_quantiles.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Chop by quantiles — chop_quantiles\",\"text\":\"non-numeric x, left set FALSE default. works better calculating \\\"type 1\\\" quantiles, since round . See stats::quantile(). default, chop_quantiles() shows requested probabilities labels. show numeric quantiles , set raw = TRUE. x contains duplicates, consecutive quantiles may number. , interval labels may misleading, recalc_probs = FALSE warning emitted. Set recalc_probs = TRUE recalculate probabilities quantiles using empirical cumulative distribution function x. may give different labels expect, remove names probs, never changes actual quantiles used breaks. present, recalc_probs = TRUE incompatible non-null weights. See example .\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_quantiles.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Chop by quantiles — chop_quantiles\",\"text\":\"\",\"code\":\"chop_quantiles(1:10, 1:3/4) #>  [1] [0%, 25%)   [0%, 25%)   [0%, 25%)   [25%, 50%)  [25%, 50%)  [50%, 75%)  #>  [7] [50%, 75%)  [75%, 100%] [75%, 100%] [75%, 100%] #> Levels: [0%, 25%) [25%, 50%) [50%, 75%) [75%, 100%]  chop_quantiles(1:10, c(Q1 = 0, Q2 = 0.25, Q3 = 0.5, Q4 = 0.75)) #>  [1] Q1 Q1 Q1 Q2 Q2 Q3 Q3 Q4 Q4 Q4 #> Levels: Q1 Q2 Q3 Q4  chop(1:10, brk_quantiles(1:3/4)) #>  [1] [0%, 25%)   [0%, 25%)   [0%, 25%)   [25%, 50%)  [25%, 50%)  [50%, 75%)  #>  [7] [50%, 75%)  [75%, 100%] [75%, 100%] [75%, 100%] #> Levels: [0%, 25%) [25%, 50%) [50%, 75%) [75%, 100%]  chop_deciles(1:10) #>  [1] [0%, 10%)   [10%, 20%)  [20%, 30%)  [30%, 40%)  [40%, 50%)  [50%, 60%)  #>  [7] [60%, 70%)  [70%, 80%)  [80%, 90%)  [90%, 100%] #> 10 Levels: [0%, 10%) [10%, 20%) [20%, 30%) [30%, 40%) [40%, 50%) ... [90%, 100%]  # to label by the quantiles themselves: chop_quantiles(1:10, 1:3/4, raw = TRUE) #>  [1] [1, 3.25)   [1, 3.25)   [1, 3.25)   [3.25, 5.5) [3.25, 5.5) [5.5, 7.75) #>  [7] [5.5, 7.75) [7.75, 10]  [7.75, 10]  [7.75, 10]  #> Levels: [1, 3.25) [3.25, 5.5) [5.5, 7.75) [7.75, 10]  # duplicate quantiles: x <- c(1, 1, 1, 2, 3) quantile(x, 1:5/5) #>  20%  40%  60%  80% 100%  #>  1.0  1.0  1.4  2.2  3.0  tab_quantiles(x, 1:5/5) #> Warning: `x` has duplicate quantiles: break labels may be misleading #>  [20%, 40%]  [60%, 80%) [80%, 100%]  #>           3           1           1  tab_quantiles(x, 1:5/5, recalc_probs = TRUE) #>   [0%, 60%]  [60%, 80%) [80%, 100%]  #>           3           1           1  set.seed(42) tab_quantiles(rnorm(100), probs = 1:3/4, raw = TRUE) #> [-2.993, -0.6167) [-0.6167, 0.0898)  [0.0898, 0.6616)   [0.6616, 2.287]  #>                25                25                25                25\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_spikes.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Chop common values into singleton intervals — chop_spikes\",\"title\":\"Chop common values into singleton intervals — chop_spikes\",\"text\":\"chop_spikes() lets chop common values x singleton intervals. can help make unusual values visible.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_spikes.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Chop common values into singleton intervals — chop_spikes\",\"text\":\"\",\"code\":\"chop_spikes(x, breaks, ..., n = NULL, prop = NULL)  brk_spikes(breaks, n = NULL, prop = NULL)  tab_spikes(x, breaks, ..., n = NULL, prop = NULL)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_spikes.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Chop common values into singleton intervals — chop_spikes\",\"text\":\"x vector. breaks numeric vector cut-points call brk_* function. resulting breaks object modified add singleton breaks. ... Passed chop(). n, prop Scalar. Provide either n, number values, prop, proportion length(x). Values x occur least often get singleton break.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_spikes.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Chop common values into singleton intervals — chop_spikes\",\"text\":\"chop_* functions return factor length x. brk_* functions return function create breaks. tab_* functions return contingency table.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_spikes.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Chop common values into singleton intervals — chop_spikes\",\"text\":\"function .\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_spikes.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Chop common values into singleton intervals — chop_spikes\",\"text\":\"\",\"code\":\"x <- c(1:4, rep(5, 5), 6:10) chop_spikes(x, c(2, 7), n = 5) #>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  {5}     {5}     {5}     {5}     {5}     #> [10] (5, 7)  [7, 10] [7, 10] [7, 10] [7, 10] #> Levels: [1, 2) [2, 5) {5} (5, 7) [7, 10] chop_spikes(x, c(2, 7), prop = 0.25) #>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  {5}     {5}     {5}     {5}     {5}     #> [10] (5, 7)  [7, 10] [7, 10] [7, 10] [7, 10] #> Levels: [1, 2) [2, 5) {5} (5, 7) [7, 10] chop_spikes(x, brk_width(5), n = 5) #>  [1] [1, 5)  [1, 5)  [1, 5)  [1, 5)  {5}     {5}     {5}     {5}     {5}     #> [10] [6, 11] [6, 11] [6, 11] [6, 11] [6, 11] #> Levels: [1, 5) {5} [6, 11]  set.seed(42) x <- runif(40, 0, 10) x <- sample(x, 200, replace = TRUE) tab_spikes(x, brk_width(2, 0), prop = 0.05) #>      [0, 2)      [2, 4)      [4, 6)      [6, 8)  [8, 9.057)     {9.057}  #>          30          24          36          40          22          11  #> (9.057, 10]  #>          37\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_width.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Chop into fixed-width intervals — chop_width\",\"title\":\"Chop into fixed-width intervals — chop_width\",\"text\":\"chop_width() chops x intervals fixed width.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_width.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Chop into fixed-width intervals — chop_width\",\"text\":\"\",\"code\":\"chop_width(x, width, start, ..., left = sign(width) > 0)  brk_width(width, start)  # Default S3 method brk_width(width, start)  tab_width(x, width, start, ..., left = sign(width) > 0)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_width.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Chop into fixed-width intervals — chop_width\",\"text\":\"x vector. width Width intervals. start Starting point intervals. default smallest finite x (largest width negative). ... Passed chop(). left Logical. Left-closed right-closed breaks?\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_width.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Chop into fixed-width intervals — chop_width\",\"text\":\"chop_* functions return factor length x. brk_* functions return function create breaks. tab_* functions return contingency table.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_width.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Chop into fixed-width intervals — chop_width\",\"text\":\"width negative, chop_width() sets left = FALSE intervals go downwards start.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/chop_width.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Chop into fixed-width intervals — chop_width\",\"text\":\"\",\"code\":\"chop_width(1:10, 2) #>  [1] [1, 3)  [1, 3)  [3, 5)  [3, 5)  [5, 7)  [5, 7)  [7, 9)  [7, 9)  [9, 11] #> [10] [9, 11] #> Levels: [1, 3) [3, 5) [5, 7) [7, 9) [9, 11]  chop_width(1:10, 2, start = 0) #>  [1] [0, 2)  [2, 4)  [2, 4)  [4, 6)  [4, 6)  [6, 8)  [6, 8)  [8, 10] [8, 10] #> [10] [8, 10] #> Levels: [0, 2) [2, 4) [4, 6) [6, 8) [8, 10]  chop_width(1:9, -2) #> [1] [1, 3] [1, 3] [1, 3] (3, 5] (3, 5] (5, 7] (5, 7] (7, 9] (7, 9] #> Levels: [1, 3] (3, 5] (5, 7] (7, 9]  chop(1:10, brk_width(2, 0)) #>  [1] [0, 2)  [2, 4)  [2, 4)  [4, 6)  [4, 6)  [6, 8)  [6, 8)  [8, 10] [8, 10] #> [10] [8, 10] #> Levels: [0, 2) [2, 4) [4, 6) [6, 8) [8, 10]  tab_width(1:10, 2, start = 0) #>  [0, 2)  [2, 4)  [4, 6)  [6, 8) [8, 10]  #>       1       2       2       2       3\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/dissect.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Cut data into intervals, separating out common values — dissect\",\"title\":\"Cut data into intervals, separating out common values — dissect\",\"text\":\"Sometimes useful separate common elements x. dissect() chops x, puts common elements x (\\\"spikes\\\") separate categories.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/dissect.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Cut data into intervals, separating out common values — dissect\",\"text\":\"\",\"code\":\"dissect(   x,   breaks,   ...,   n = NULL,   prop = NULL,   spike_labels = \\\"{{{l}}}\\\",   exclude_spikes = FALSE )  tab_dissect(x, breaks, ..., n = NULL, prop = NULL)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/dissect.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Cut data into intervals, separating out common values — dissect\",\"text\":\"x, breaks, ... Passed chop(). n, prop Scalar. Provide either n, number values, prop, proportion length(x). Values x occur least often get singleton break. spike_labels Glue string spike labels. Use \\\"{l}\\\" spike value. exclude_spikes Logical. Exclude spikes chopping x? can affect location data-dependent breaks.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/dissect.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Cut data into intervals, separating out common values — dissect\",\"text\":\"dissect() returns result chop(), common values put separate factor levels. tab_dissect() returns contingency table().\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/dissect.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Cut data into intervals, separating out common values — dissect\",\"text\":\"Unlike chop_spikes(), dissect() break intervals contain spike. result, unlike chop_* functions, dissect() chop x disjoint intervals. See examples. breaks data-dependent, labels may misleading common elements removed. See example . get round , set exclude_spikes TRUE. breaks calculated removing spikes data. Levels result ordered minimum element level. result, drop = FALSE, empty levels placed last. function .\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/dissect.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Cut data into intervals, separating out common values — dissect\",\"text\":\"\",\"code\":\"x <- c(2, 3, 3, 3, 4) dissect(x, c(2, 4), n = 3) #> [1] [2, 4] {3}    {3}    {3}    [2, 4] #> Levels: [2, 4] {3} dissect(x, brk_width(2), prop = 0.5) #> [1] [2, 4] {3}    {3}    {3}    [2, 4] #> Levels: [2, 4] {3}  set.seed(42) x <- runif(40, 0, 10) x <- sample(x, 200, replace = TRUE) # Compare: table(dissect(x, brk_width(2, 0), prop = 0.05)) #>  #>  [0, 2)  [2, 4)  [4, 6)  [6, 8) [8, 10] {9.057}  #>      30      24      36      40      59      11  # Versus: tab_spikes(x, brk_width(2, 0), prop = 0.05) #>      [0, 2)      [2, 4)      [4, 6)      [6, 8)  [8, 9.057)     {9.057}  #>          30          24          36          40          22          11  #> (9.057, 10]  #>          37   # Potentially confusing data-dependent breaks: set.seed(42) x <- rnorm(99) x[1:9] <- x[1] tab_quantiles(x, 1:2/3) #>     [0%, 33.33%) [33.33%, 66.67%)   [66.67%, 100%]  #>               33               33               33  tab_dissect(x, brk_quantiles(1:2/3), n = 9) #>     [0%, 33.33%) [33.33%, 66.67%)   [66.67%, 100%]          {1.371}  #>               33               33               24                9  # Calculate quantiles excluding spikes: tab_dissect(x, brk_quantiles(1:2/3), n = 9, exclude_spikes = TRUE) #>     [0%, 33.33%) [33.33%, 66.67%)   [66.67%, 100%]          {1.371}  #>               30               30               30                9\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/exactly.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Define singleton intervals explicitly — exactly\",\"title\":\"Define singleton intervals explicitly — exactly\",\"text\":\"exactly() duplicates input. lets define singleton intervals like : chop(x, c(1, exactly(2), 3)). chop(x, c(1, 2, 2, 3)) conveys intent clearly.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/exactly.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Define singleton intervals explicitly — exactly\",\"text\":\"\",\"code\":\"exactly(x)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/exactly.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Define singleton intervals explicitly — exactly\",\"text\":\"x numeric vector.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/exactly.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Define singleton intervals explicitly — exactly\",\"text\":\"rep(x, = 2).\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/exactly.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Define singleton intervals explicitly — exactly\",\"text\":\"\",\"code\":\"chop(1:10, c(2, exactly(5), 8)) #>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  {5}     (5, 8)  (5, 8)  [8, 10] [8, 10] #> [10] [8, 10] #> Levels: [1, 2) [2, 5) {5} (5, 8) [8, 10]  # same: chop(1:10, c(2, 5, 5, 8)) #>  [1] [1, 2)  [2, 5)  [2, 5)  [2, 5)  {5}     (5, 8)  (5, 8)  [8, 10] [8, 10] #> [10] [8, 10] #> Levels: [1, 2) [2, 5) {5} (5, 8) [8, 10]\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/fillet.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Chop data precisely (for programmers) — fillet\",\"title\":\"Chop data precisely (for programmers) — fillet\",\"text\":\"fillet() calls chop() extend = FALSE drop = FALSE. ensures get breaks labels ask . programming, consider using fillet() instead chop().\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/fillet.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Chop data precisely (for programmers) — fillet\",\"text\":\"\",\"code\":\"fillet(   x,   breaks,   labels = lbl_intervals(),   left = TRUE,   close_end = TRUE,   raw = NULL )\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/fillet.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Chop data precisely (for programmers) — fillet\",\"text\":\"x vector. breaks numeric vector cut-points, function create cut-points x. labels character vector labels function create labels. left Logical. Left-closed right-closed breaks? close_end Logical. Close last break right? (left FALSE, close first break left?) raw Logical. Use raw values labels?\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/fillet.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Chop data precisely (for programmers) — fillet\",\"text\":\"fillet() returns factor length x, representing intervals containing value x.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/fillet.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Chop data precisely (for programmers) — fillet\",\"text\":\"\",\"code\":\"fillet(1:10, c(2, 5, 8)) #>  [1] <NA>   [2, 5) [2, 5) [2, 5) [5, 8] [5, 8] [5, 8] [5, 8] <NA>   <NA>   #> Levels: [2, 5) [5, 8]\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/knife.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Deprecated — knife\",\"title\":\"Deprecated — knife\",\"text\":\"knife() deprecated favour purrr::partial().\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/knife.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Deprecated — knife\",\"text\":\"\",\"code\":\"knife(...)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/knife.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Deprecated — knife\",\"text\":\"... Parameters chop().\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/knife.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Deprecated — knife\",\"text\":\"function.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_dash.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Label chopped intervals like 1-4, 4-5, ... — lbl_dash\",\"title\":\"Label chopped intervals like 1-4, 4-5, ... — lbl_dash\",\"text\":\"label style user-friendly, distinguish left- right-closed intervals. good continuous data expect points exactly breaks.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_dash.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Label chopped intervals like 1-4, 4-5, ... — lbl_dash\",\"text\":\"\",\"code\":\"lbl_dash(   symbol = em_dash(),   fmt = NULL,   single = \\\"{l}\\\",   first = NULL,   last = NULL,   raw = deprecated() )\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_dash.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Label chopped intervals like 1-4, 4-5, ... — lbl_dash\",\"text\":\"symbol String: symbol use dash. fmt String, list function. format break endpoints. single Glue string: label singleton intervals. See lbl_glue() details. NULL, singleton intervals labelled way intervals. first Glue string: override label first category. Write e.g. first = \\\"<{r}\\\" create label like \\\"<18\\\". See lbl_glue() details. last String: override label last category. Write e.g. last = \\\">{l}\\\" create label like \\\">65\\\". See lbl_glue() details. raw . Throws error. Use raw argument chop() instead.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_dash.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Label chopped intervals like 1-4, 4-5, ... — lbl_dash\",\"text\":\"function creates vector labels.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_dash.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Label chopped intervals like 1-4, 4-5, ... — lbl_dash\",\"text\":\"want unicode output, use lbl_dash(\\\"-\\\").\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_dash.html\",\"id\":\"formatting-endpoints\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Formatting endpoints\",\"title\":\"Label chopped intervals like 1-4, 4-5, ... — lbl_dash\",\"text\":\"fmt NULL used format endpoints. fmt string, numeric endpoints formatted sprintf(fmt, breaks); endpoints, e.g. Date objects, formatted format(breaks, fmt). fmt list, used arguments format. fmt function, take vector numbers (objects can used breaks) return character vector. may helpful use functions {scales} package, e.g. scales::label_comma().\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_dash.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Label chopped intervals like 1-4, 4-5, ... — lbl_dash\",\"text\":\"\",\"code\":\"chop(1:10, c(2, 5, 8), lbl_dash()) #>  [1] 1—2  2—5  2—5  2—5  5—8  5—8  5—8  8—10 8—10 8—10 #> Levels: 1—2 2—5 5—8 8—10  chop(1:10, c(2, 5, 8), lbl_dash(\\\" to \\\", fmt = \\\"%.1f\\\")) #>  [1] 1.0 to 2.0  2.0 to 5.0  2.0 to 5.0  2.0 to 5.0  5.0 to 8.0  5.0 to 8.0  #>  [7] 5.0 to 8.0  8.0 to 10.0 8.0 to 10.0 8.0 to 10.0 #> Levels: 1.0 to 2.0 2.0 to 5.0 5.0 to 8.0 8.0 to 10.0  chop(1:10, c(2, 5, 8), lbl_dash(first = \\\"<{r}\\\")) #>  [1] <2   2—5  2—5  2—5  5—8  5—8  5—8  8—10 8—10 8—10 #> Levels: <2 2—5 5—8 8—10  pretty <- function (x) prettyNum(x, big.mark = \\\",\\\", digits = 1) chop(runif(10) * 10000, c(3000, 7000), lbl_dash(\\\" to \\\", fmt = pretty)) #>  [1] 7,000 to 9,677 7,000 to 9,677 7,000 to 9,677 3,000 to 7,000 7,000 to 9,677 #>  [6] 3,000 to 7,000 1,579 to 3,000 3,000 to 7,000 7,000 to 9,677 3,000 to 7,000 #> Levels: 1,579 to 3,000 3,000 to 7,000 7,000 to 9,677\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_datetime.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Label dates and datetimes — lbl_date\",\"title\":\"Label dates and datetimes — lbl_date\",\"text\":\"lbl_date() lbl_datetime() produce nice labels dates datetimes. possible ranges simplified, like like \\\"13-14 Jul 2026\\\" \\\"11:15-12:15 1 Dec 2025\\\".\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_datetime.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Label dates and datetimes — lbl_date\",\"text\":\"\",\"code\":\"lbl_date(   fmt = \\\"%e %b %Y\\\",   symbol = \\\"-\\\",   unit = as.difftime(1, units = \\\"days\\\"),   single = \\\"{l}\\\",   first = NULL,   last = NULL )  lbl_datetime(   fmt = \\\"%H:%M:%S %b %e %Y\\\",   symbol = \\\"-\\\",   unit = NULL,   single = \\\"{l}\\\",   first = NULL,   last = NULL )\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_datetime.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Label dates and datetimes — lbl_date\",\"text\":\"fmt String, list function. format break endpoints. symbol String: separator use full ranges. unit Optional interval unit non-overlapping labels. NULL, .  endpoints adjusted style lbl_discrete(). single Glue string: label singleton intervals. See lbl_glue() details. NULL, singleton intervals labelled way intervals. first Glue string: override label first category. Write e.g. first = \\\"<{r}\\\" create label like \\\"<18\\\". See lbl_glue() details. last String: override label last category. Write e.g. last = \\\">{l}\\\" create label like \\\">65\\\". See lbl_glue() details.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_datetime.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Label dates and datetimes — lbl_date\",\"text\":\"function creates vector labels.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_datetime.html\",\"id\":\"formatting-endpoints\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Formatting endpoints\",\"title\":\"Label dates and datetimes — lbl_date\",\"text\":\"fmt NULL used format endpoints. fmt string, numeric endpoints formatted sprintf(fmt, breaks); endpoints, e.g. Date objects, formatted format(breaks, fmt). fmt list, used arguments format. fmt function, take vector numbers (objects can used breaks) return character vector. may helpful use functions {scales} package, e.g. scales::label_comma().\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_datetime.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Label dates and datetimes — lbl_date\",\"text\":\"\",\"code\":\"winter <- as.Date(\\\"2025-12-01\\\") + 0:89 tab(winter, as.Date(c(\\\"2025-12-25\\\", \\\"2026-01-06\\\")),     labels = lbl_date()) #>             1-24 Dec 2025 25 Dec 2025 -  5 Jan 2026       6 Jan - 28 Feb 2026  #>                        24                        12                        54  new_year <- as.POSIXct(\\\"2025-12-31 23:00\\\") + 0:120 * 60 round_midnight <- as.POSIXct(c(\\\"2025-12-31 23:59\\\", \\\"2026-01-01 00:05\\\")) tab(new_year, round_midnight,     labels = lbl_datetime()) #>               23:00:00-23:59:00 Dec 31 2025  #>                                          59  #> 23:59:00 Dec 31 2025 - 00:05:00 Jan  1 2026  #>                                           6  #>               00:05:00-01:00:00 Jan  1 2026  #>                                          56  tab(new_year, round_midnight,     labels = lbl_datetime(unit = as.difftime(1, units = \\\"mins\\\"))) #>               23:00:00-23:58:00 Dec 31 2025  #>                                          59  #> 23:59:00 Dec 31 2025 - 00:04:00 Jan  1 2026  #>                                           6  #>               00:05:00-01:00:00 Jan  1 2026  #>                                          56\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_discrete.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Label discrete data — lbl_discrete\",\"title\":\"Label discrete data — lbl_discrete\",\"text\":\"lbl_discrete() creates labels discrete data, integers. example, breaks c(1, 3, 4, 6, 7) labelled: \\\"1-2\\\", \\\"3\\\", \\\"4-5\\\", \\\"6-7\\\".\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_discrete.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Label discrete data — lbl_discrete\",\"text\":\"\",\"code\":\"lbl_discrete(   symbol = em_dash(),   unit = 1L,   fmt = NULL,   single = NULL,   first = NULL,   last = NULL )\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_discrete.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Label discrete data — lbl_discrete\",\"text\":\"symbol String: symbol use dash. unit Minimum difference distinct values data. integers, 1. fmt String, list function. format break endpoints. single Glue string: label singleton intervals. See lbl_glue() details. NULL, singleton intervals labelled way intervals. first Glue string: override label first category. Write e.g. first = \\\"<{r}\\\" create label like \\\"<18\\\". See lbl_glue() details. last String: override label last category. Write e.g. last = \\\">{l}\\\" create label like \\\">65\\\". See lbl_glue() details.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_discrete.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Label discrete data — lbl_discrete\",\"text\":\"function creates vector labels.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_discrete.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Label discrete data — lbl_discrete\",\"text\":\"check done data discrete-valued. , labels may misleading. , discrete-valued means x < y, x <= y - unit. aware Date objects may non-integer values. See Date.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_discrete.html\",\"id\":\"formatting-endpoints\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Formatting endpoints\",\"title\":\"Label discrete data — lbl_discrete\",\"text\":\"fmt NULL used format endpoints. fmt string, numeric endpoints formatted sprintf(fmt, breaks); endpoints, e.g. Date objects, formatted format(breaks, fmt). fmt list, used arguments format. fmt function, take vector numbers (objects can used breaks) return character vector. may helpful use functions {scales} package, e.g. scales::label_comma().\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_discrete.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Label discrete data — lbl_discrete\",\"text\":\"\",\"code\":\"tab(1:7, c(1, 3, 5), lbl_discrete()) #> 1—2 3—4 5—7  #>   2   2   3   tab(1:7, c(3, 5), lbl_discrete(first = \\\"<= {r}\\\")) #> <= 2  3—4  5—7  #>    2    2    3   tab(1:7 * 1000, c(1, 3, 5) * 1000, lbl_discrete(unit = 1000)) #> 1000—2000 3000—4000 5000—7000  #>         2         2         3   # Misleading labels for non-integer data chop(2.5, c(1, 3, 5), lbl_discrete()) #> [1] 1—2 #> Levels: 1—2\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_endpoints.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Label chopped intervals by their left or right endpoints — lbl_endpoints\",\"title\":\"Label chopped intervals by their left or right endpoints — lbl_endpoints\",\"text\":\"useful left endpoint unambiguously indicates interval. cases may give errors due duplicate labels.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_endpoints.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Label chopped intervals by their left or right endpoints — lbl_endpoints\",\"text\":\"\",\"code\":\"lbl_endpoints(   left = TRUE,   fmt = NULL,   single = NULL,   first = NULL,   last = NULL,   raw = deprecated() )  lbl_endpoint(fmt = NULL, raw = FALSE, left = TRUE)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_endpoints.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Label chopped intervals by their left or right endpoints — lbl_endpoints\",\"text\":\"left Flag. Use left endpoint right endpoint? fmt String, list function. format break endpoints. single Glue string: label singleton intervals. See lbl_glue() details. NULL, singleton intervals labelled way intervals. first Glue string: override label first category. Write e.g. first = \\\"<{r}\\\" create label like \\\"<18\\\". See lbl_glue() details. last String: override label last category. Write e.g. last = \\\">{l}\\\" create label like \\\">65\\\". See lbl_glue() details. raw . Throws error. Use raw argument chop() instead.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_endpoints.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Label chopped intervals by their left or right endpoints — lbl_endpoints\",\"text\":\"function creates vector labels.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_endpoints.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Label chopped intervals by their left or right endpoints — lbl_endpoints\",\"text\":\"lbl_endpoint()  gives error since santoku 1.0.0.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_endpoints.html\",\"id\":\"formatting-endpoints\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Formatting endpoints\",\"title\":\"Label chopped intervals by their left or right endpoints — lbl_endpoints\",\"text\":\"fmt NULL used format endpoints. fmt string, numeric endpoints formatted sprintf(fmt, breaks); endpoints, e.g. Date objects, formatted format(breaks, fmt). fmt list, used arguments format. fmt function, take vector numbers (objects can used breaks) return character vector. may helpful use functions {scales} package, e.g. scales::label_comma().\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_endpoints.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Label chopped intervals by their left or right endpoints — lbl_endpoints\",\"text\":\"\",\"code\":\"chop(1:10, c(2, 5, 8), lbl_endpoints(left = TRUE)) #>  [1] 1 2 2 2 5 5 5 8 8 8 #> Levels: 1 2 5 8 chop(1:10, c(2, 5, 8), lbl_endpoints(left = FALSE)) #>  [1] 2  5  5  5  8  8  8  10 10 10 #> Levels: 2 5 8 10 if (requireNamespace(\\\"lubridate\\\")) {   tab_width(           as.Date(\\\"2000-01-01\\\") + 0:365,          months(1),          labels = lbl_endpoints(fmt = \\\"%b\\\")        ) } #> Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec  #>  31  29  31  30  31  30  31  31  30  31  30  31   if (FALSE) { # \\\\dontrun{   # This gives breaks `[1, 2) [2, 3) {3}` which lead to   # duplicate labels `\\\"2\\\", \\\"3\\\", \\\"3\\\"`:   chop(1:3, 1:3, lbl_endpoints(left = FALSE)) } # }\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_format.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Label chopped intervals with arbitrary formatting — lbl_format\",\"text\":\"\",\"code\":\"lbl_format(fmt, fmt1 = \\\"%.3g\\\", raw = FALSE)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_format.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Label chopped intervals with arbitrary formatting — lbl_format\",\"text\":\"fmt format. Can string, passed base::sprintf() format() methods; one-argument formatting function. fmt1 Format breaks consisting single value. raw Logical. Always use raw breaks labels, rather e.g. quantiles standard deviations?\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_format.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Label chopped intervals with arbitrary formatting — lbl_format\",\"text\":\"vector labels chop, function creates labels.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_format.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Label chopped intervals with arbitrary formatting — lbl_format\",\"text\":\"labels let format breaks arbitrarily, using either string (passed sprintf()) function. fmt function, must accept two arguments, representing left right endpoints interval. breaks non-numeric, can use \\\"%s\\\" string fmt. breaks converted character case. lbl_format() \\\"questioning\\\" stage. alternative, consider using lbl_dash() lbl_intervals() fmt argument.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_format.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Label chopped intervals with arbitrary formatting — lbl_format\",\"text\":\"\",\"code\":\"tab(1:10, c(1,3, 3, 7),       label = lbl_format(\\\"%.3g to %.3g\\\")) #>  1 to 3       3  3 to 7 7 to 10  #>       2       1       3       4  tab(1:10, c(1,3, 3, 7),       label = lbl_format(\\\"%.3g to %.3g\\\", \\\"Exactly %.3g\\\")) #>    1 to 3 Exactly 3    3 to 7   7 to 10  #>         2         1         3         4   percent2 <- function (x, y) {   sprintf(\\\"%.2f%% - %.2f%%\\\", x*100, y*100) } tab(runif(100), c(0.25, 0.5, .75),       labels = lbl_format(percent2)) #>  0.64% - 25.00% 25.00% - 50.00% 50.00% - 75.00% 75.00% - 98.41%  #>              21              20              33              26\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_glue.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Label chopped intervals using the glue package — lbl_glue\",\"title\":\"Label chopped intervals using the glue package — lbl_glue\",\"text\":\"Use \\\"{l}\\\" \\\"{r}\\\" show left right endpoints intervals.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_glue.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Label chopped intervals using the glue package — lbl_glue\",\"text\":\"\",\"code\":\"lbl_glue(   label,   fmt = NULL,   single = NULL,   first = NULL,   last = NULL,   raw = deprecated(),   ... )\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_glue.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Label chopped intervals using the glue package — lbl_glue\",\"text\":\"label glue string passed glue::glue(). fmt String, list function. format break endpoints. single Glue string: label singleton intervals. See lbl_glue() details. NULL, singleton intervals labelled way intervals. first Glue string: override label first category. Write e.g. first = \\\"<{r}\\\" create label like \\\"<18\\\". See lbl_glue() details. last String: override label last category. Write e.g. last = \\\">{l}\\\" create label like \\\">65\\\". See lbl_glue() details. raw . Throws error. Use raw argument chop() instead. ... arguments passed glue::glue().\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_glue.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Label chopped intervals using the glue package — lbl_glue\",\"text\":\"function creates vector labels.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_glue.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Label chopped intervals using the glue package — lbl_glue\",\"text\":\"following variables available glue string: l character vector left endpoints intervals. r character vector right endpoints intervals. l_closed logical vector. Elements TRUE left endpoint closed. r_closed logical vector, TRUE right endpoint closed. Endpoints formatted fmt passed glue().\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_glue.html\",\"id\":\"formatting-endpoints\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Formatting endpoints\",\"title\":\"Label chopped intervals using the glue package — lbl_glue\",\"text\":\"fmt NULL used format endpoints. fmt string, numeric endpoints formatted sprintf(fmt, breaks); endpoints, e.g. Date objects, formatted format(breaks, fmt). fmt list, used arguments format. fmt function, take vector numbers (objects can used breaks) return character vector. may helpful use functions {scales} package, e.g. scales::label_comma().\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_glue.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Label chopped intervals using the glue package — lbl_glue\",\"text\":\"\",\"code\":\"tab(1:10, c(1, 3, 3, 7),     labels = lbl_glue(\\\"{l} to {r}\\\", single = \\\"Exactly {l}\\\")) #>    1 to 3 Exactly 3    3 to 7   7 to 10  #>         2         1         3         4   tab(1:10 * 1000, c(1, 3, 5, 7) * 1000,     labels = lbl_glue(\\\"{l}-{r}\\\",                       fmt = function(x) prettyNum(x, big.mark=','))) #>  1,000-3,000  3,000-5,000  5,000-7,000 7,000-10,000  #>            2            2            2            4   # reproducing lbl_intervals(): interval_left <- \\\"{ifelse(l_closed, '[', '(')}\\\" interval_right <- \\\"{ifelse(r_closed, ']', ')')}\\\" glue_string <- paste0(interval_left, \\\"{l}\\\", \\\", \\\", \\\"{r}\\\", interval_right) tab(1:10, c(1, 3, 3, 7), labels = lbl_glue(glue_string, single = \\\"{{{l}}}\\\")) #>  [1, 3)     {3}  (3, 7) [7, 10]  #>       2       1       3       4\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_intervals.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Label chopped intervals using set notation — lbl_intervals\",\"title\":\"Label chopped intervals using set notation — lbl_intervals\",\"text\":\"labels exact, since show whether intervals \\\"closed\\\" \\\"open\\\", .e. whether include endpoints.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_intervals.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Label chopped intervals using set notation — lbl_intervals\",\"text\":\"\",\"code\":\"lbl_intervals(   fmt = NULL,   single = \\\"{{{l}}}\\\",   first = NULL,   last = NULL,   raw = deprecated() )\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_intervals.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Label chopped intervals using set notation — lbl_intervals\",\"text\":\"fmt String, list function. format break endpoints. single Glue string: label singleton intervals. See lbl_glue() details. NULL, singleton intervals labelled way intervals. first Glue string: override label first category. Write e.g. first = \\\"<{r}\\\" create label like \\\"<18\\\". See lbl_glue() details. last String: override label last category. Write e.g. last = \\\">{l}\\\" create label like \\\">65\\\". See lbl_glue() details. raw . Throws error. Use raw argument chop() instead.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_intervals.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Label chopped intervals using set notation — lbl_intervals\",\"text\":\"function creates vector labels.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_intervals.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Label chopped intervals using set notation — lbl_intervals\",\"text\":\"Mathematical set notation looks like : [, b]: numbers x <= x <= b; (, b): numbers < x < b; [, b): numbers <= x < b; (, b]: numbers < x <= b; {}: just number exactly.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_intervals.html\",\"id\":\"formatting-endpoints\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Formatting endpoints\",\"title\":\"Label chopped intervals using set notation — lbl_intervals\",\"text\":\"fmt NULL used format endpoints. fmt string, numeric endpoints formatted sprintf(fmt, breaks); endpoints, e.g. Date objects, formatted format(breaks, fmt). fmt list, used arguments format. fmt function, take vector numbers (objects can used breaks) return character vector. may helpful use functions {scales} package, e.g. scales::label_comma().\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_intervals.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Label chopped intervals using set notation — lbl_intervals\",\"text\":\"\",\"code\":\"tab(-10:10, c(-3, 0, 0, 3),       labels = lbl_intervals()) #> [-10, -3)   [-3, 0)       {0}    (0, 3)   [3, 10]  #>         7         3         1         2         8   tab(-10:10, c(-3, 0, 0, 3),       labels = lbl_intervals(fmt = list(nsmall = 1))) #> [-10.0,  -3.0) [ -3.0,   0.0)        {  0.0} (  0.0,   3.0) [  3.0,  10.0]  #>              7              3              1              2              8   tab_evenly(runif(20), 10,       labels = lbl_intervals(fmt = percent)) #>  [6.095%, 15.1%)  [15.1%, 24.11%) [24.11%, 33.11%) [33.11%, 42.12%)  #>                1                2                4                2  #> [42.12%, 51.12%) [51.12%, 60.13%) [60.13%, 69.13%) [78.14%, 87.14%)  #>                2                4                1                2  #> [87.14%, 96.15%]  #>                2\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_manual.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Defunct: label chopped intervals in a user-defined sequence — lbl_manual\",\"text\":\"\",\"code\":\"lbl_manual(sequence, fmt = \\\"%s\\\")\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_manual.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Defunct: label chopped intervals in a user-defined sequence — lbl_manual\",\"text\":\"sequence character vector labels. fmt String, list function. format break endpoints.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_manual.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Defunct: label chopped intervals in a user-defined sequence — lbl_manual\",\"text\":\"function creates vector labels.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_manual.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Defunct: label chopped intervals in a user-defined sequence — lbl_manual\",\"text\":\"lbl_manual() defunct since santoku 1.0.0. little used closely related rest package. also risks mislabelling intervals, e.g. intervals extended. Use lbl_manual() give error.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_manual.html\",\"id\":\"formatting-endpoints\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Formatting endpoints\",\"title\":\"Defunct: label chopped intervals in a user-defined sequence — lbl_manual\",\"text\":\"fmt NULL used format endpoints. fmt string, numeric endpoints formatted sprintf(fmt, breaks); endpoints, e.g. Date objects, formatted format(breaks, fmt). fmt list, used arguments format. fmt function, take vector numbers (objects can used breaks) return character vector. may helpful use functions {scales} package, e.g. scales::label_comma().\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_manual.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Defunct: label chopped intervals in a user-defined sequence — lbl_manual\",\"text\":\"\",\"code\":\"if (FALSE) { # \\\\dontrun{ chop(1:10, c(2, 5, 8), lbl_manual(c(\\\"w\\\", \\\"x\\\", \\\"y\\\", \\\"z\\\"))) # -> chop(1:10, c(2, 5, 8), labels = c(\\\"w\\\", \\\"x\\\", \\\"y\\\", \\\"z\\\")) } # }\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_midpoints.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Label chopped intervals by their midpoints — lbl_midpoints\",\"title\":\"Label chopped intervals by their midpoints — lbl_midpoints\",\"text\":\"uses midpoint interval label.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_midpoints.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Label chopped intervals by their midpoints — lbl_midpoints\",\"text\":\"\",\"code\":\"lbl_midpoints(   fmt = NULL,   single = NULL,   first = NULL,   last = NULL,   raw = deprecated() )\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_midpoints.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Label chopped intervals by their midpoints — lbl_midpoints\",\"text\":\"fmt String, list function. format break endpoints. single Glue string: label singleton intervals. See lbl_glue() details. NULL, singleton intervals labelled way intervals. first Glue string: override label first category. Write e.g. first = \\\"<{r}\\\" create label like \\\"<18\\\". See lbl_glue() details. last String: override label last category. Write e.g. last = \\\">{l}\\\" create label like \\\">65\\\". See lbl_glue() details. raw . Throws error. Use raw argument chop() instead.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_midpoints.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Label chopped intervals by their midpoints — lbl_midpoints\",\"text\":\"function creates vector labels.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_midpoints.html\",\"id\":\"formatting-endpoints\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Formatting endpoints\",\"title\":\"Label chopped intervals by their midpoints — lbl_midpoints\",\"text\":\"fmt NULL used format endpoints. fmt string, numeric endpoints formatted sprintf(fmt, breaks); endpoints, e.g. Date objects, formatted format(breaks, fmt). fmt list, used arguments format. fmt function, take vector numbers (objects can used breaks) return character vector. may helpful use functions {scales} package, e.g. scales::label_comma().\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_midpoints.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Label chopped intervals by their midpoints — lbl_midpoints\",\"text\":\"\",\"code\":\"chop(1:10, c(2, 5, 8), lbl_midpoints()) #>  [1] 1.5 3.5 3.5 3.5 6.5 6.5 6.5 9   9   9   #> Levels: 1.5 3.5 6.5 9\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_seq.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Label chopped intervals in sequence — lbl_seq\",\"title\":\"Label chopped intervals in sequence — lbl_seq\",\"text\":\"lbl_seq() labels intervals sequentially, using numbers letters.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_seq.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Label chopped intervals in sequence — lbl_seq\",\"text\":\"\",\"code\":\"lbl_seq(start = \\\"a\\\")\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_seq.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Label chopped intervals in sequence — lbl_seq\",\"text\":\"start String. template sequence. See .\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_seq.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Label chopped intervals in sequence — lbl_seq\",\"text\":\"function creates vector labels.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_seq.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Label chopped intervals in sequence — lbl_seq\",\"text\":\"start shows first element sequence. must contain exactly one character set \\\"\\\", \\\"\\\", \\\"\\\", \\\"\\\" \\\"1\\\". later elements: \\\"\\\" replaced \\\"\\\", \\\"b\\\", \\\"c\\\", ... \\\"\\\" replaced \\\"\\\", \\\"B\\\", \\\"C\\\", ... \\\"\\\" replaced lower-case Roman numerals \\\"\\\", \\\"ii\\\", \\\"iii\\\", ... \\\"\\\" replaced upper-case Roman numerals \\\"\\\", \\\"II\\\", \\\"III\\\", ... \\\"1\\\" replaced numbers \\\"1\\\", \\\"2\\\", \\\"3\\\", ... characters retained -.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/lbl_seq.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Label chopped intervals in sequence — lbl_seq\",\"text\":\"\",\"code\":\"chop(1:10, c(2, 5, 8), lbl_seq()) #>  [1] a b b b c c c d d d #> Levels: a b c d  chop(1:10, c(2, 5, 8), lbl_seq(\\\"i.\\\")) #>  [1] i.   ii.  ii.  ii.  iii. iii. iii. iv.  iv.  iv.  #> Levels: i. ii. iii. iv.  chop(1:10, c(2, 5, 8), lbl_seq(\\\"(A)\\\")) #>  [1] (A) (B) (B) (B) (C) (C) (C) (D) (D) (D) #> Levels: (A) (B) (C) (D)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/non-standard-types.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Tips for chopping non-standard types — non-standard-types\",\"title\":\"Tips for chopping non-standard types — non-standard-types\",\"text\":\"Santoku can handle many non-standard types.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/non-standard-types.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"Tips for chopping non-standard types — non-standard-types\",\"text\":\"objects can compared using <, == etc. choppable. Objects converted numeric handled within R code, may slower. Character x breaks chopped warning. x breaks type, able cast type, usually using vctrs::vec_cast_common(). chopping operations make sense, example, chop_mean_sd() character vector. indexed objects stats::ts() objects, indices dropped result. get errors, try setting extend = FALSE (also file bug report). request support type, open issue Github.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/percent.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Simple percentage formatter — percent\",\"title\":\"Simple percentage formatter — percent\",\"text\":\"percent() formats x percentage. wider range formatters, consider scales package.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/percent.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Simple percentage formatter — percent\",\"text\":\"\",\"code\":\"percent(x)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/percent.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Simple percentage formatter — percent\",\"text\":\"x Numeric values.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/percent.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Simple percentage formatter — percent\",\"text\":\"x formatted percent.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/percent.html\",\"id\":\"ref-examples\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Examples\",\"title\":\"Simple percentage formatter — percent\",\"text\":\"\",\"code\":\"percent(0.5) #> [1] \\\"50%\\\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/santoku-cast.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Internal functions — santoku-cast\",\"title\":\"Internal functions — santoku-cast\",\"text\":\"Internal functions\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/santoku-cast.html\",\"id\":\"ref-usage\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Usage\",\"title\":\"Internal functions — santoku-cast\",\"text\":\"\",\"code\":\"# Default S3 method santoku_cast_common(x, y)  # S3 method for class 'double' santoku_cast_common(x, y)  # S3 method for class 'Date' santoku_cast_common(x, y)  # S3 method for class 'POSIXct' santoku_cast_common(x, y)  # S3 method for class 'ts' santoku_cast_common(x, y)  # S3 method for class 'zoo' santoku_cast_common(x, y)  # S3 method for class 'integer64' santoku_cast_common(x, y)  # S3 method for class 'hexmode' santoku_cast_common(x, y)  # S3 method for class 'octmode' santoku_cast_common(x, y)\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/santoku-cast.html\",\"id\":\"arguments\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Arguments\",\"title\":\"Internal functions — santoku-cast\",\"text\":\"x, y Vectors cast.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/santoku-cast.html\",\"id\":\"value\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Value\",\"title\":\"Internal functions — santoku-cast\",\"text\":\"list.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/santoku-package.html\",\"id\":null,\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"A versatile cutting tool for R: package overview and options — santoku-package\",\"title\":\"A versatile cutting tool for R: package overview and options — santoku-package\",\"text\":\"santoku tool cutting data intervals. provides function chop(), similar base R's cut() Hmisc::cut2(). chop(x, breaks) takes vector x returns factor length, coding interval element x falls .\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/santoku-package.html\",\"id\":\"details\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Details\",\"title\":\"A versatile cutting tool for R: package overview and options — santoku-package\",\"text\":\"advantages santoku: default, chop() always covers whole range data, get unexpected NA values. Unlike cut() cut2(), chop() can handle single values well intervals. example, chop(x, breaks = c(1, 2, 2, 3)) create separate factor level values exactly equal 2. Flexible easy labelling. Convenience functions creating quantile intervals, evenly-spaced intervals equal-sized groups. Convenience functions quickly tabulate chopped data. Can chop numbers, dates, date-times objects. advantages make santoku especially useful exploratory analysis, may know range data advance. get started, read vignette:   details, start documentation chop().\",\"code\":\"vignette(\\\"santoku\\\")\"},{\"path\":\"https://hughjonesd.github.io/santoku/reference/santoku-package.html\",\"id\":\"options\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Options\",\"title\":\"A versatile cutting tool for R: package overview and options — santoku-package\",\"text\":\"Santoku two options: options(\\\"santoku.infinity\\\") sets symbol infinity breaks. default NULL, case infinity symbol used platforms support , otherwise \\\"Inf\\\" used. options(\\\"santoku.warn_character\\\") warns try chop character vector. Set FALSE turn warning.\",\"code\":\"\"},{\"path\":[]},{\"path\":\"https://hughjonesd.github.io/santoku/reference/santoku-package.html\",\"id\":\"author\",\"dir\":\"Reference\",\"previous_headings\":\"\",\"what\":\"Author\",\"title\":\"A versatile cutting tool for R: package overview and options — santoku-package\",\"text\":\"Maintainer: David Hugh-Jones davidhughjones@gmail.com contributors: Daniel Possenriede possenriede@gmail.com [contributor]\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"santoku-120\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"santoku 1.2.0\",\"title\":\"santoku 1.2.0\",\"text\":\"New experimental lbl_date() lbl_datetime() functions pretty formatting dates date-times. Bugfix: extended breaks failing haven::labelled objects. raw argument lbl_* functions, deprecated since 0.9.0, now throws error.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"santoku-110\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"santoku 1.1.0\",\"title\":\"santoku 1.1.0\",\"text\":\"CRAN release: 2025-09-11 Core logic speeded using raw pointers. vibe-coded Claude Code. breaks, please file bug report. experimental chop_spikes() dissect() functions give common values x singleton intervals. Unicode platforms, infinity represented ∞ breaks. Set options(santoku.infinity = \\\"Inf\\\") use old behaviour. Singleton breaks labelled specially default chop_quantiles(..., raw = FALSE). means e.g. 10th 20th percentiles number, label still [10%, 20%]. multiple quantiles , santoku warns returns leftmost quantile interval. merge intervals, creating labels might different user asked . chop_quantiles() gains recalc_probs argument. recalc_probs = TRUE recalculates probabilities using ecdf(x), may give accurate interval labels. single = NULL documented explicitly lbl_* functions. Bugfix: brk_manual() longer warns close_end = TRUE (default).\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"santoku-100\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"santoku 1.0.0\",\"title\":\"santoku 1.0.0\",\"text\":\"CRAN release: 2024-06-04 santoku now considered stable. chop_quantiles() brk_quantiles() gain new weights argument, letting chop weighted quantiles using Hmisc::wtd.quantile(). brk_quantiles() may now return singleton breaks, producing accurate results x duplicate elements. deprecated functions removed, raw argument lbl_* functions now always gives deprecation warning.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"santoku-0100\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"santoku 0.10.0\",\"title\":\"santoku 0.10.0\",\"text\":\"CRAN release: 2023-10-12 List arguments fmt lbl_* functions taken arguments base::format. gives flexibility formatting, e.g., units breaks. chop_n() gains tail argument, deal last interval containing less n elements. Set tail = \\\"merge\\\" merge previous interval. guarantees intervals contain least n elements. chop_equally() may return fewer groups groups duplicate elements. now warn happens. Bugfix: chop_n() return intervals fewer n elements duplicate elements. new algorithm avoids , may slower case.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"santoku-091\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"santoku 0.9.1\",\"title\":\"santoku 0.9.1\",\"text\":\"CRAN release: 2023-03-08 endpoint_labels() methods gain unused ... argument satisfy R CMD CHECK.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"santoku-090\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"santoku 0.9.0\",\"title\":\"santoku 0.9.0\",\"text\":\"CRAN release: 2022-11-01\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"breaking-changes-0-9-0\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"Breaking changes\",\"title\":\"santoku 0.9.0\",\"text\":\"important changes close_end. close_end now TRUE default chop() fillet(). previous versions: Whereas now: close_end now always applied extend. example, previous versions: Whereas now: changed behaviour line user expectations. breaks names, used labels: Names can also used labels probs chop_quantiles() proportions chop_proportions(). new raw parameter chop(). replaces parameter raw lbl_* functions, now soft-deprecated. lbl_manual() deprecated. Just use vector argument labels instead. labels argument chop_quantiles() now needs explicitly named. expect last important breaking changes release version 1.0 mark package “stable”. cause problems , please file issue.\",\"code\":\"chop(1:2, 1:2) ## [1] [1, 2) {2}    ## Levels: [1, 2) {2} chop(1:2, 1:2) ## [1] [1, 2] [1, 2] ## Levels: [1, 2] chop(1:4, 2:3, close_end = TRUE) ## [1] [1, 2) [2, 3] [2, 3] (3, 4] ## Levels: [1, 2) [2, 3] (3, 4] chop(1:4, 2:3, close_end = TRUE) ## [1] [1, 2) [2, 3) [3, 4] [3, 4] ## Levels: [1, 2) [2, 3) [3, 4] chop(1:5, c(Low = 1, Mid = 2, High = 4)) ## [1] Low  Mid  Mid  High High ## Levels: Low Mid High\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"other-changes-0-9-0\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"Other changes\",\"title\":\"santoku 0.9.0\",\"text\":\"New chop_fn(), brk_fn() tab_fn() chop using arbitrary function. Added section non-standard objects vignette.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"santoku-080\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"santoku 0.8.0\",\"title\":\"santoku 0.8.0\",\"text\":\"CRAN release: 2022-06-08\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"breaking-changes-0-8-0\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"Breaking changes\",\"title\":\"santoku 0.8.0\",\"text\":\"lbl_endpoint() renamed lbl_endpoints(). old version trigger deprecation warning. lbl_endpoints() gains first, last single arguments like labelling functions.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"other-changes-0-8-0\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"Other changes\",\"title\":\"santoku 0.8.0\",\"text\":\"New chop_pretty(), brk_pretty() tab_pretty() functions use base::pretty() calculate attractive breakpoints. Thanks @davidhodge931. New chop_proportions(), brk_proportions() tab_proportions() functions chop x proportions range. chop_equally() now uses lbl_intervals(raw = TRUE) default, bringing line chop_evenly(), chop_width() chop_n(). New lbl_midpoints() function labels breaks midpoints. lbl_discrete() gains single argument. can now chop ts, xts::xts zoo::zoo objects. Date objects POSIXct breaks, vice versa bit64::integer64 doubles Bugfix: lbl_discrete() sometimes ugly label formatting.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"santoku-070\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"santoku 0.7.0\",\"title\":\"santoku 0.7.0\",\"text\":\"CRAN release: 2022-03-18\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"breaking-changes-0-7-0\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"Breaking changes\",\"title\":\"santoku 0.7.0\",\"text\":\"labelling functions, first last arguments now passed glue::glue(). Variables l r represent left right endpoints intervals. chop_mean_sd() now takes vector sds standard deviations, rather single maximum number sd standard deviations. Write e.g.  chop_mean_sd(sds = 1:3) rather chop_mean_sd(sd = 3). sd argument deprecated. groups argument chop_evenly(), deprecated 0.4.0, removed. brk_left() brk_right(), deprecated 0.4.0, removed. knife(), deprecated 0.4.0, removed. lbl_format(), questioning since 0.4.0, removed. Arguments lbl_dash() lbl_intervals() reordered consistency labelling functions.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"other-changes-0-7-0\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"Other changes\",\"title\":\"santoku 0.7.0\",\"text\":\"Character vectors chopped lexicographic order, optional warning. problems chopping vector type, file bug report. glue package become hard dependency. used many places format labels. new lbl_glue() function using glue package. Thanks @dpprdan. can now set labels = NULL return integer codes. Arguments first, last single can used lbl_intervals() lbl_dash(), override first last interval labels, label singleton intervals. lbl_dash() lbl_discrete() use unicode em-dash possible. brk_default() throws error breaks sorted.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"bugfixes-0-7-0\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"Bugfixes\",\"title\":\"santoku 0.7.0\",\"text\":\"Bugfix: tab() friends longer display x variable name. Bugfix: lbl_endpoint() erroring types breaks.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"santoku-060\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"santoku 0.6.0\",\"title\":\"santoku 0.6.0\",\"text\":\"CRAN release: 2021-11-04 New arguments first last lbl_dash() lbl_discrete() allow override first last interval labels. Fixes CRAN.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"santoku-050\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"santoku 0.5.0\",\"title\":\"santoku 0.5.0\",\"text\":\"CRAN release: 2020-08-27 sets left = FALSE default. Also works negative time intervals.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"santoku-041\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"santoku 0.4.1\",\"title\":\"santoku 0.4.1\",\"text\":\"CRAN release: 2020-06-16 Bugfix: chop(1:4, 1) erroring.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"santoku-040\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"santoku 0.4.0\",\"title\":\"santoku 0.4.0\",\"text\":\"CRAN release: 2020-06-09\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"interface-changes-0-4-0\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"Interface changes\",\"title\":\"santoku 0.4.0\",\"text\":\"new version interface changes. based user experience, designed make using chop() intuitive predictable. chop() two new arguments, left close_end. Using left = FALSE simpler intuitive wrapping breaks brk_right(). brk_left() brk_right() kept now, used wrap break functions. Using close_end simpler passing close_end brk_left() brk_right() (longer accept argument directly). left = TRUE default, except non-numeric objects chop_quantiles() chop_equally(), left = FALSE works better. close_end now FALSE default. prevents user surprises e.g. chop(3, 1:3) puts 3 different category chop(3, 1:4). close_end TRUE default chop_quantiles(), chop_n() similar functions. ensures e.g.  chop_quantiles(x, c(0, 1/3, 2/3, 1)) expect. groups argument chop_evenly() renamed groups intervals. make easier remember difference chop_evenly() chop_equally(). (Chop evenly n equal-width intervals, chop equally n equal-sized groups.) knife() deprecated keep interface slim focused. Use purrr::partial() instead.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"other-changes-0-4-0\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"Other changes\",\"title\":\"santoku 0.4.0\",\"text\":\"Date datetime (POSIXct) objects can now chopped. chop_width() accepts difftime, lubridate::period lubridate::duration objects chop_ functions work well. Many labelling functions new fmt argument. can string interpreted sprintf() format(), 1-argument formatting function break endpoints, e.g. scales::label_percent(). Experimental: lbl_discrete() discrete data integers () dates. new lbl_endpoint() function labelling intervals solely left right endpoint. brk_mean_sd() now accepts non-integer positive numbers. Add brk_equally() symmetry chop_equally(). Minor tweaks chop_deciles(). Bugfix: lbl_format() wasn’t accepting numeric formats, even raw = TRUE. Thanks Sharla Gelfand.\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"santoku-030\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"santoku 0.3.0\",\"title\":\"santoku 0.3.0\",\"text\":\"CRAN release: 2020-01-24 First CRAN release. Changed kut() kiru(). kiru() alternative spelling chop(), use tidyr package loaded. lbl_sequence() become lbl_manual(). lbl_letters() friends replaced lbl_seq(): replace lbl_letters() use lbl_seq() replace lbl_LETTERS() use lbl_seq(\\\"\\\") replace lbl_roman() use lbl_seq(\\\"\\\") replace lbl_ROMAN() use lbl_seq(\\\"\\\") replace lbl_numerals() use lbl_seq(\\\"1\\\") complex formatting use e.g. lbl_seq(\\\":\\\"), lbl_seq(\\\"()\\\")\",\"code\":\"\"},{\"path\":\"https://hughjonesd.github.io/santoku/news/index.html\",\"id\":\"santoku-020\",\"dir\":\"Changelog\",\"previous_headings\":\"\",\"what\":\"santoku 0.2.0\",\"title\":\"santoku 0.2.0\",\"text\":\"Added NEWS.md file track changes package. Default labels extend = NULL changed, [-Inf, ... ..., Inf] [min(x), ... ..., max(x)].\",\"code\":\"\"}]\n"
  },
  {
    "path": "docs/sitemap.xml",
    "content": "<urlset xmlns = 'http://www.sitemaps.org/schemas/sitemap/0.9'>\n<url><loc>https://hughjonesd.github.io/santoku/404.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/AGENTS.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/CLAUDE.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/LICENSE-text.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/LICENSE.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/TODO.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/articles/index.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/articles/santoku.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/articles/website-articles/performance.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/articles/whats-new-in-0-9-0.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/authors.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/index.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/news/index.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/breaks-class.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/brk-left-right.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/brk_default.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/brk_manual.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/brk_width-for-datetime.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/chop.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/chop_equally.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/chop_evenly.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/chop_fn.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/chop_mean_sd.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/chop_n.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/chop_pretty.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/chop_proportions.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/chop_quantiles.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/chop_spikes.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/chop_width.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/dissect.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/exactly.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/fillet.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/index.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/knife.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/lbl_dash.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/lbl_datetime.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/lbl_discrete.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/lbl_endpoints.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/lbl_format.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/lbl_glue.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/lbl_intervals.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/lbl_manual.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/lbl_midpoints.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/lbl_seq.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/non-standard-types.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/percent.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/santoku-cast.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/santoku-package.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/reference/sequence-labels.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/tutorials/00-visualintroduction.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/tutorials/01-chopping-dates.html</loc></url>\n<url><loc>https://hughjonesd.github.io/santoku/tutorials/index.html</loc></url>\n</urlset>\n\n"
  },
  {
    "path": "docs/tutorials/00-visualintroduction.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>A visual introduction to santoku • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"A visual introduction to santoku\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"active nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-tutorial\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-12\"><div class=\"page-header\">\n      <h1>A visual introduction to santoku</h1>\n    </div>\n  </main></div>\n\n<div class=\"row\">\n  <div id=\"tutorial\"></div>\n    <iframe width=\"100%\" height=\"600\" src=\"https://hughjonesd.github.io/visual-introduction.html\" frameborder=\"0\"></iframe>\n  </div>\n</div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></body></html>\n\n"
  },
  {
    "path": "docs/tutorials/00-visualintroduction.md",
    "content": "# A visual introduction to santoku\n"
  },
  {
    "path": "docs/tutorials/01-chopping-dates.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Chopping dates with santoku • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Chopping dates with santoku\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"active nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-tutorial\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-12\"><div class=\"page-header\">\n      <h1>Chopping dates with santoku</h1>\n    </div>\n  </main></div>\n\n<div class=\"row\">\n  <div id=\"tutorial\"></div>\n    <iframe width=\"100%\" height=\"600\" src=\"https://hughjonesd.github.io/chopping-dates-with-santoku.html\" frameborder=\"0\"></iframe>\n  </div>\n</div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></body></html>\n\n"
  },
  {
    "path": "docs/tutorials/01-chopping-dates.md",
    "content": "# Chopping dates with santoku\n"
  },
  {
    "path": "docs/tutorials/index.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><title>Tutorials • santoku</title><!-- favicons --><link rel=\"icon\" type=\"image/png\" sizes=\"96x96\" href=\"../favicon-96x96.png\"><link rel=\"icon\" type=\"”image/svg+xml”\" href=\"../favicon.svg\"><link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"../apple-touch-icon.png\"><link rel=\"icon\" sizes=\"any\" href=\"../favicon.ico\"><link rel=\"manifest\" href=\"../site.webmanifest\"><script src=\"../deps/jquery-3.6.0/jquery-3.6.0.min.js\"></script><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"><link href=\"../deps/bootstrap-5.3.1/bootstrap.min.css\" rel=\"stylesheet\"><script src=\"../deps/bootstrap-5.3.1/bootstrap.bundle.min.js\"></script><link href=\"../deps/font-awesome-6.5.2/css/all.min.css\" rel=\"stylesheet\"><link href=\"../deps/font-awesome-6.5.2/css/v4-shims.min.css\" rel=\"stylesheet\"><script src=\"../deps/headroom-0.11.0/headroom.min.js\"></script><script src=\"../deps/headroom-0.11.0/jQuery.headroom.min.js\"></script><script src=\"../deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js\"></script><script src=\"../deps/clipboard.js-2.0.11/clipboard.min.js\"></script><script src=\"../deps/search-1.0.0/autocomplete.jquery.min.js\"></script><script src=\"../deps/search-1.0.0/fuse.min.js\"></script><script src=\"../deps/search-1.0.0/mark.min.js\"></script><!-- pkgdown --><script src=\"../pkgdown.js\"></script><link href=\"../extra.css\" rel=\"stylesheet\"><meta property=\"og:title\" content=\"Tutorials\"><meta property=\"og:image\" content=\"https://hughjonesd.github.io/santoku/logo.png\"></head><body>\n    <a href=\"#main\" class=\"visually-hidden-focusable\">Skip to contents</a>\n\n\n    <nav class=\"navbar navbar-expand-lg fixed-top bg-primary\" data-bs-theme=\"dark\" aria-label=\"Site navigation\"><div class=\"container\">\n\n    <a class=\"navbar-brand me-2\" href=\"../index.html\">santoku</a>\n\n    <small class=\"nav-text text-muted me-auto\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" title=\"\">1.2.0</small>\n\n\n    <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbar\" aria-controls=\"navbar\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n      <span class=\"navbar-toggler-icon\"></span>\n    </button>\n\n    <div id=\"navbar\" class=\"collapse navbar-collapse ms-3\">\n      <ul class=\"navbar-nav me-auto\"><li class=\"nav-item\"><a class=\"nav-link\" href=\"../articles/santoku.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\"><li><a class=\"dropdown-item\" href=\"../articles/website-articles/performance.html\">Performance</a></li>\n    <li><a class=\"dropdown-item\" href=\"../articles/whats-new-in-0-9-0.html\">What's new in santoku 0.9.0</a></li>\n  </ul></li>\n<li class=\"nav-item dropdown\">\n  <button class=\"nav-link dropdown-toggle\" type=\"button\" id=\"dropdown-tutorials\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\" aria-haspopup=\"true\">Tutorials</button>\n  <ul class=\"dropdown-menu\" aria-labelledby=\"dropdown-tutorials\"><li><a class=\"dropdown-item\" href=\"../tutorials/00-visualintroduction.html\">A visual introduction to santoku</a></li>\n    <li><a class=\"dropdown-item\" href=\"../tutorials/01-chopping-dates.html\">Chopping dates with santoku</a></li>\n  </ul></li>\n<li class=\"nav-item\"><a class=\"nav-link\" href=\"../news/index.html\">Changelog</a></li>\n      </ul><ul class=\"navbar-nav\"><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\"></form></li>\n<li class=\"nav-item\"><a class=\"external-link nav-link\" href=\"https://github.com/hughjonesd/santoku/\" aria-label=\"GitHub\"><span class=\"fa fab fa-github fa-lg\"></span></a></li>\n      </ul></div>\n\n\n  </div>\n</nav><div class=\"container template-tutorial-index\">\n<div class=\"row\">\n  <main id=\"main\" class=\"col-md-9\"><div class=\"page-header\">\n      <img src=\"../logo.png\" class=\"logo\" alt=\"\"><h1>Tutorials</h1>\n    </div>\n\n    <ul><li><a href=\"00-visualintroduction.html\">A visual introduction to santoku</a></li>\n      <li><a href=\"01-chopping-dates.html\">Chopping dates with santoku</a></li>\n    </ul></main></div>\n\n\n    <footer><div class=\"pkgdown-footer-left\">\n  <p>Developed by David Hugh-Jones.</p>\n</div>\n\n<div class=\"pkgdown-footer-right\">\n  <p>Site built with <a href=\"https://pkgdown.r-lib.org/\" class=\"external-link\">pkgdown</a> 2.2.0.</p>\n</div>\n\n    </footer></div>\n\n\n\n\n\n  </body></html>\n\n"
  },
  {
    "path": "docs/tutorials/index.md",
    "content": "# Tutorials\n\n- [A visual introduction to\n  santoku](https://hughjonesd.github.io/santoku/tutorials/00-visualintroduction.md)\n- [Chopping dates with\n  santoku](https://hughjonesd.github.io/santoku/tutorials/01-chopping-dates.md)\n"
  },
  {
    "path": "man/breaks-class.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/breaks.R\n\\name{breaks-class}\n\\alias{breaks-class}\n\\alias{format.breaks}\n\\alias{print.breaks}\n\\alias{is.breaks}\n\\title{Class representing a set of intervals}\n\\usage{\n\\method{format}{breaks}(x, ...)\n\n\\method{print}{breaks}(x, ...)\n\nis.breaks(x, ...)\n}\n\\arguments{\n\\item{x}{A breaks object}\n\n\\item{...}{Unused}\n}\n\\description{\nClass representing a set of intervals\n}\n"
  },
  {
    "path": "man/brk_default.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/breaks.R\n\\name{brk_default}\n\\alias{brk_default}\n\\title{Create a standard set of breaks}\n\\usage{\nbrk_default(breaks)\n}\n\\arguments{\n\\item{breaks}{A numeric vector.}\n}\n\\value{\nA function which returns an object of class \\code{breaks}.\n}\n\\description{\nCreate a standard set of breaks\n}\n\\examples{\n\nchop(1:10, c(2, 5, 8))\nchop(1:10, brk_default(c(2, 5, 8)))\n\n}\n"
  },
  {
    "path": "man/brk_manual.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/breaks-misc.R\n\\name{brk_manual}\n\\alias{brk_manual}\n\\title{Create a \\code{breaks} object manually}\n\\usage{\nbrk_manual(breaks, left_vec)\n}\n\\arguments{\n\\item{breaks}{A vector, which must be sorted.}\n\n\\item{left_vec}{A logical vector, the same length as \\code{breaks}.\nSpecifies whether each break is left-closed or right-closed.}\n}\n\\value{\nA function which returns an object of class \\code{breaks}.\n}\n\\description{\nCreate a \\code{breaks} object manually\n}\n\\details{\nAll breaks must be closed on exactly one side, like \\verb{..., x) [x, ...}\n(left-closed) or \\verb{..., x) [x, ...} (right-closed).\n\nFor example, if \\code{breaks = 1:3} and \\code{left = c(TRUE, FALSE, TRUE)}, then the\nresulting intervals are \\preformatted{\nT        F       T\n[ 1,  2 ] ( 2, 3 )\n}\n\nSingleton breaks are created by repeating a number in \\code{breaks}. Singletons\nmust be closed on both sides, so if there is a repeated number\nat indices \\code{i}, \\code{i+1}, \\code{left[i]} \\emph{must} be \\code{TRUE} and \\code{left[i+1]} must be\n\\code{FALSE}.\n\n\\code{brk_manual()} ignores \\code{left} and \\code{close_end} arguments passed in\nfrom \\code{\\link[=chop]{chop()}}, since \\code{left_vec} sets these manually.\n\\code{extend} and \\code{drop} arguments are respected as usual.\n}\n\\examples{\nlbrks <- brk_manual(1:3, rep(TRUE, 3))\nchop(1:3, lbrks, extend = FALSE)\n\nrbrks <- brk_manual(1:3, rep(FALSE, 3))\nchop(1:3, rbrks, extend = FALSE)\n\nbrks_singleton <- brk_manual(\n      c(1,    2,    2,     3),\n      c(TRUE, TRUE, FALSE, TRUE))\n\nchop(1:3, brks_singleton, extend = FALSE)\n\n}\n"
  },
  {
    "path": "man/brk_width-for-datetime.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/breaks-by-width.R\n\\name{brk_width-for-datetime}\n\\alias{brk_width-for-datetime}\n\\alias{brk_width.Duration}\n\\title{Equal-width intervals for dates or datetimes}\n\\usage{\n\\method{brk_width}{Duration}(width, start)\n}\n\\arguments{\n\\item{width}{A scalar \\link{difftime}, \\link[lubridate:Period-class]{Period} or\n\\link[lubridate:Duration-class]{Duration} object.}\n\n\\item{start}{A scalar of class \\link[base:Dates]{Date} or \\link[=DateTimeClasses]{POSIXct}.\nCan be omitted.}\n}\n\\description{\n\\code{brk_width()} can be used with time interval classes from base R or the\n\\code{lubridate} package.\n}\n\\details{\nIf \\code{width} is a Period, \\code{\\link[lubridate:mplus]{lubridate::add_with_rollback()}}\nis used to calculate the widths. This can be useful for e.g. calendar months.\n}\n\\examples{\n\nif (requireNamespace(\"lubridate\")) {\n  year2001 <- as.Date(\"2001-01-01\") + 0:364\n  tab_width(year2001, months(1),\n        labels = lbl_discrete(\" to \", fmt = \"\\%e \\%b \\%y\"))\n}\n\n}\n"
  },
  {
    "path": "man/chop.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/chop.R, R/tab.R\n\\name{chop}\n\\alias{chop}\n\\alias{kiru}\n\\alias{tab}\n\\title{Cut data into intervals}\n\\usage{\nchop(\n  x,\n  breaks,\n  labels = lbl_intervals(),\n  extend = NULL,\n  left = TRUE,\n  close_end = TRUE,\n  raw = NULL,\n  drop = TRUE\n)\n\nkiru(\n  x,\n  breaks,\n  labels = lbl_intervals(),\n  extend = NULL,\n  left = TRUE,\n  close_end = TRUE,\n  raw = NULL,\n  drop = TRUE\n)\n\ntab(\n  x,\n  breaks,\n  labels = lbl_intervals(),\n  extend = NULL,\n  left = TRUE,\n  close_end = TRUE,\n  raw = NULL,\n  drop = TRUE\n)\n}\n\\arguments{\n\\item{x}{A vector.}\n\n\\item{breaks}{A numeric vector of cut-points, or a function to create\ncut-points from \\code{x}.}\n\n\\item{labels}{A character vector of labels or a function to create labels.}\n\n\\item{extend}{Logical. If \\code{TRUE}, always extend breaks to \\verb{+/-Inf}. If \\code{NULL},\nextend breaks to \\code{min(x)} and/or \\code{max(x)} only if necessary. If \\code{FALSE}, never\nextend.}\n\n\\item{left}{Logical. Left-closed or right-closed breaks?}\n\n\\item{close_end}{Logical. Close last break at right? (If \\code{left} is \\code{FALSE},\nclose first break at left?)}\n\n\\item{raw}{Logical. Use raw values in labels?}\n\n\\item{drop}{Logical. Drop unused levels from the result?}\n}\n\\value{\n\\code{chop()} returns a \\code{\\link[base:factor]{factor}} of the same length as \\code{x},\nrepresenting the intervals containing the value of \\code{x}.\n\n\\code{tab()} returns a contingency \\code{\\link[base:table]{table}}.\n}\n\\description{\n\\code{chop()} cuts \\code{x} into intervals. It returns a \\code{\\link[base:factor]{factor}} of\nthe same length as \\code{x}, representing which interval contains each element of \\code{x}.\n\\code{kiru()} is an alias for \\code{chop}.\n\\code{tab()} calls \\code{chop()} and returns a contingency \\code{\\link[base:table]{table}} from\nthe result.\n}\n\\details{\n\\code{x} may be a numeric vector, or more generally, any vector which can be\ncompared with \\code{<} and \\code{==} (see \\link[=groupGeneric]{Ops}). In particular\n\\link[base:Dates]{Date} and \\link[=DateTimeClasses]{date-time} objects are supported.\nCharacter vectors are supported with a warning.\n\\subsection{Breaks}{\n\n\\code{breaks} may be a vector or a function.\n\nIf it is a vector, \\code{breaks} gives the interval endpoints. Repeating a value\ncreates a \"singleton\" interval, which contains only that value.\nFor example \\code{breaks = c(1, 3, 3, 5)} creates 3 intervals:\n\\code{[1, 3)}, \\code{{3}} and \\code{(3, 5]}.\n\nIf \\code{breaks} is a function, it is called with the \\code{x}, \\code{extend}, \\code{left} and\n\\code{close_end} arguments, and should return an object of class \\code{breaks}.\nUse \\verb{brk_*} functions to create a variety of data-dependent breaks.\n\nNames of \\code{breaks} may be used for labels. See \"Labels\" below.\n}\n\n\\subsection{Options for breaks}{\n\nBy default, left-closed intervals are created. If \\code{left} is \\code{FALSE},\nright-closed intervals are created.\n\nIf \\code{close_end} is \\code{TRUE} the final break (or first break if \\code{left} is \\code{FALSE})\nwill be closed at both ends. This guarantees that all values \\code{x} with\n\\verb{min(breaks) <= x <= max(breaks)} are included in the intervals.\n\nBefore version 0.9.0, \\code{close_end} was \\code{FALSE} by default, and also behaved\ndifferently with respect to extended breaks: see \"Extending intervals\" below.\n\nUsing \\link[=lbl_intervals]{mathematical set notation}:\n\\itemize{\n\\item If \\code{left} is \\code{TRUE} and \\code{close_end} is \\code{TRUE}, breaks will look like\n\\code{[b1, b2), [b2, b3) ... [b_(n-1), b_n]}.\n\\item If \\code{left} is \\code{FALSE} and \\code{close_end} is \\code{TRUE}, breaks will look like\n\\code{[b1, b2], (b2, b3] ... (b_(n-1), b_n]}.\n\\item If \\code{left} is \\code{TRUE} and \\code{close_end} is \\code{FALSE}, all breaks will look like\n\\code{... [b1, b2) ...}.\n\\item If \\code{left} is \\code{FALSE} and \\code{close_end} is \\code{FALSE}, all breaks will look like\n\\code{... (b1, b2] ...}.\n}\n}\n\n\\subsection{Extending intervals}{\n\nIf \\code{extend} is \\code{TRUE}, intervals will be extended to \\code{[-Inf,\nmin(breaks))} and \\code{(max(breaks), Inf]}.\n\nIf \\code{extend} is \\code{NULL} (the default), intervals will be extended to\n\\code{[min(x), min(breaks))} and \\code{(max(breaks), max(x)]}, only if\nnecessary, i.e. only if elements of \\code{x} would be outside the unextended\nbreaks.\n\nIf \\code{extend} is \\code{FALSE}, intervals are never extended.\n\nNote that even when \\code{extend = TRUE}, extended intervals will be\ndropped from the factor levels if they contain no elements and \\code{drop = TRUE}.\n\n\\code{close_end} is only relevant if intervals are not extended;\nextended intervals are always closed on the outside. This is a change from\nprevious behaviour. Up to version 0.8.0, \\code{close_end} was applied to the\nlast user-specified interval, before any extended intervals were created.\n\nSince 1.1.0, infinity is represented as \\eqn{\\infty}{the infinity symbol}\nin breaks on unicode platforms. Set  \\code{options(santoku.infinity = \"Inf\")}\nto get the old behaviour.\n}\n\n\\subsection{Labels}{\n\n\\code{labels} may be a character vector. It should have the same length as the\n(possibly extended) number of intervals. Alternatively, \\code{labels} may be a\n\\verb{lbl_*} function such as \\code{\\link[=lbl_dash]{lbl_dash()}}.\n\nIf \\code{breaks} is a named vector, then names of \\code{breaks} will be\nused as labels for the interval starting at the corresponding element. This\noverrides the \\code{labels} argument (but unnamed breaks will still use \\code{labels}).\nThis feature is \\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\\strong{[Experimental]}}.\n\nIf \\code{labels} is \\code{NULL}, then integer codes will be returned instead of a\nfactor.\n\nIf \\code{raw} is \\code{TRUE}, labels will show the actual interval endpoints, usually\nnumbers. If \\code{raw} is \\code{FALSE} then labels may show other objects, such\nas quantiles for \\code{\\link[=chop_quantiles]{chop_quantiles()}} and friends, proportions of the range for\n\\code{\\link[=chop_proportions]{chop_proportions()}}, or standard deviations for \\code{\\link[=chop_mean_sd]{chop_mean_sd()}}.\n\nIf \\code{raw} is \\code{NULL} then \\verb{lbl_*} functions will use their default (usually\n\\code{FALSE}). Otherwise, the \\code{raw} argument to \\code{chop()} overrides \\code{raw} arguments\npassed into \\verb{lbl_*} functions directly.\n}\n\n\\subsection{Miscellaneous}{\n\n\\code{NA} values in \\code{x}, and values which are outside the extended endpoints,\nreturn \\code{NA}.\n\n\\code{kiru()} is a synonym for \\code{chop()}. If you load \\code{{tidyr}}, you can use it to\navoid confusion with \\code{tidyr::chop()}.\n\nNote that \\code{chop()}, like all of R, uses binary arithmetic. Thus, numbers may\nnot be exactly equal to what you think they should be. There is an example\nbelow.\n}\n}\n\\examples{\n\nchop(1:7, c(2, 4, 6))\n\nchop(1:7, c(2, 4, 6), extend = FALSE)\n\n# Repeat a number for a singleton break:\nchop(1:7, c(2, 4, 4, 6))\n\nchop(1:7, c(2, 4, 6), left = FALSE)\n\nchop(1:7, c(2, 4, 6), close_end = FALSE)\n\nchop(1:7, brk_quantiles(c(0.25, 0.75)))\n\n# A single break is fine if `extend` is not `FALSE`:\nchop(1:7, 4)\n\n# Floating point inaccuracy:\nchop(0.3/3, c(0, 0.1, 0.1, 1), labels = c(\"< 0.1\", \"0.1\", \"> 0.1\"))\n\n# -- Labels --\n\nchop(1:7, c(Lowest = 1, Low = 2, Mid = 4, High = 6))\n\nchop(1:7, c(2, 4, 6), labels = c(\"Lowest\", \"Low\", \"Mid\", \"High\"))\n\nchop(1:7, c(2, 4, 6), labels = lbl_dash())\n\n# Mixing names and other labels:\nchop(1:7, c(\"<2\" = 1, 2, 4, \">=6\" = 6), labels = lbl_dash())\n\n# -- Non-standard types --\n\nchop(as.Date(\"2001-01-01\") + 1:7, as.Date(\"2001-01-04\"))\n\nsuppressWarnings(chop(LETTERS[1:7], \"D\"))\n\n\ntab(1:10, c(2, 5, 8))\n\n}\n\\seealso{\n\\code{\\link[base:cut]{base::cut()}}, \\code{\\link{non-standard-types}} for chopping objects that\naren't numbers.\n\nOther chopping functions: \n\\code{\\link{chop_equally}()},\n\\code{\\link{chop_evenly}()},\n\\code{\\link{chop_fn}()},\n\\code{\\link{chop_mean_sd}()},\n\\code{\\link{chop_n}()},\n\\code{\\link{chop_proportions}()},\n\\code{\\link{chop_quantiles}()},\n\\code{\\link{chop_spikes}()},\n\\code{\\link{chop_width}()},\n\\code{\\link{fillet}()}\n}\n\\concept{chopping functions}\n"
  },
  {
    "path": "man/chop_equally.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/chop-by-group-size.R, R/breaks-by-group-size.R,\n%   R/tab.R\n\\name{chop_equally}\n\\alias{chop_equally}\n\\alias{brk_equally}\n\\alias{tab_equally}\n\\title{Chop equal-sized groups}\n\\usage{\nchop_equally(\n  x,\n  groups,\n  ...,\n  labels = lbl_intervals(),\n  left = is.numeric(x),\n  raw = TRUE\n)\n\nbrk_equally(groups)\n\ntab_equally(x, groups, ..., left = is.numeric(x), raw = TRUE)\n}\n\\arguments{\n\\item{x}{A vector.}\n\n\\item{groups}{Number of groups.}\n\n\\item{...}{Passed to \\code{\\link[=chop]{chop()}}.}\n\n\\item{labels}{A character vector of labels or a function to create labels.}\n\n\\item{left}{Logical. Left-closed or right-closed breaks?}\n\n\\item{raw}{Logical. Use raw values in labels?}\n}\n\\value{\n\\verb{chop_*} functions return a \\code{\\link[base:factor]{factor}} of the same length as \\code{x}.\n\n\\verb{brk_*} functions return a \\code{\\link{function}} to create \\code{breaks}.\n\n\\verb{tab_*} functions return a contingency \\code{\\link[base:table]{table}}.\n}\n\\description{\n\\code{chop_equally()} chops \\code{x} into groups with an equal number of elements.\n}\n\\details{\n\\code{chop_equally()} uses \\code{\\link[=brk_quantiles]{brk_quantiles()}} under the hood. If \\code{x} has duplicate\nelements, you may get fewer \\code{groups} than requested. If so, a warning will\nbe emitted. See the examples.\n}\n\\examples{\nchop_equally(1:10, 5)\n\n# You can't always guarantee equal-sized groups:\ndupes <- c(1, 1, 1, 2, 3, 4, 4, 4)\nquantile(dupes, 0:4/4)\nchop_equally(dupes, 4)\n# Or as many groups as you ask for:\nchop_equally(c(1, 1, 2, 2), 3)\n}\n\\seealso{\nOther chopping functions: \n\\code{\\link{chop}()},\n\\code{\\link{chop_evenly}()},\n\\code{\\link{chop_fn}()},\n\\code{\\link{chop_mean_sd}()},\n\\code{\\link{chop_n}()},\n\\code{\\link{chop_proportions}()},\n\\code{\\link{chop_quantiles}()},\n\\code{\\link{chop_spikes}()},\n\\code{\\link{chop_width}()},\n\\code{\\link{fillet}()}\n}\n\\concept{chopping functions}\n"
  },
  {
    "path": "man/chop_evenly.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/chop-by-width.R, R/breaks-by-width.R, R/tab.R\n\\name{chop_evenly}\n\\alias{chop_evenly}\n\\alias{brk_evenly}\n\\alias{tab_evenly}\n\\title{Chop into equal-width intervals}\n\\usage{\nchop_evenly(x, intervals, ...)\n\nbrk_evenly(intervals)\n\ntab_evenly(x, intervals, ...)\n}\n\\arguments{\n\\item{x}{A vector.}\n\n\\item{intervals}{Integer: number of intervals to create.}\n\n\\item{...}{Passed to \\code{\\link[=chop]{chop()}}.}\n}\n\\value{\n\\verb{chop_*} functions return a \\code{\\link[base:factor]{factor}} of the same length as \\code{x}.\n\n\\verb{brk_*} functions return a \\code{\\link{function}} to create \\code{breaks}.\n\n\\verb{tab_*} functions return a contingency \\code{\\link[base:table]{table}}.\n}\n\\description{\n\\code{chop_evenly()} chops \\code{x} into \\code{intervals} intervals of equal width.\n}\n\\examples{\nchop_evenly(0:10, 5)\n\n}\n\\seealso{\nOther chopping functions: \n\\code{\\link{chop}()},\n\\code{\\link{chop_equally}()},\n\\code{\\link{chop_fn}()},\n\\code{\\link{chop_mean_sd}()},\n\\code{\\link{chop_n}()},\n\\code{\\link{chop_proportions}()},\n\\code{\\link{chop_quantiles}()},\n\\code{\\link{chop_spikes}()},\n\\code{\\link{chop_width}()},\n\\code{\\link{fillet}()}\n}\n\\concept{chopping functions}\n"
  },
  {
    "path": "man/chop_fn.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/chop-misc.R, R/breaks-misc.R, R/tab.R\n\\name{chop_fn}\n\\alias{chop_fn}\n\\alias{brk_fn}\n\\alias{tab_fn}\n\\title{Chop using an existing function}\n\\usage{\nchop_fn(\n  x,\n  fn,\n  ...,\n  extend = NULL,\n  left = TRUE,\n  close_end = TRUE,\n  raw = NULL,\n  drop = TRUE\n)\n\nbrk_fn(fn, ...)\n\ntab_fn(\n  x,\n  fn,\n  ...,\n  extend = NULL,\n  left = TRUE,\n  close_end = TRUE,\n  raw = NULL,\n  drop = TRUE\n)\n}\n\\arguments{\n\\item{x}{A vector.}\n\n\\item{fn}{A function which returns a numeric vector of breaks.}\n\n\\item{...}{Further arguments to \\code{fn}}\n\n\\item{extend}{Logical. If \\code{TRUE}, always extend breaks to \\verb{+/-Inf}. If \\code{NULL},\nextend breaks to \\code{min(x)} and/or \\code{max(x)} only if necessary. If \\code{FALSE}, never\nextend.}\n\n\\item{left}{Logical. Left-closed or right-closed breaks?}\n\n\\item{close_end}{Logical. Close last break at right? (If \\code{left} is \\code{FALSE},\nclose first break at left?)}\n\n\\item{raw}{Logical. Use raw values in labels?}\n\n\\item{drop}{Logical. Drop unused levels from the result?}\n}\n\\value{\n\\verb{chop_*} functions return a \\code{\\link[base:factor]{factor}} of the same length as \\code{x}.\n\n\\verb{brk_*} functions return a \\code{\\link{function}} to create \\code{breaks}.\n\n\\verb{tab_*} functions return a contingency \\code{\\link[base:table]{table}}.\n}\n\\description{\n\\code{chop_fn()} is a convenience wrapper: \\code{chop_fn(x, foo, ...)}\nis the same as \\code{chop(x, foo(x, ...))}.\n}\n\\examples{\n\nif (requireNamespace(\"scales\")) {\n  chop_fn(rlnorm(10), scales::breaks_log(5))\n  # same as\n  # x <- rlnorm(10)\n  # chop(x, scales::breaks_log(5)(x))\n}\n\n}\n\\seealso{\nOther chopping functions: \n\\code{\\link{chop}()},\n\\code{\\link{chop_equally}()},\n\\code{\\link{chop_evenly}()},\n\\code{\\link{chop_mean_sd}()},\n\\code{\\link{chop_n}()},\n\\code{\\link{chop_proportions}()},\n\\code{\\link{chop_quantiles}()},\n\\code{\\link{chop_spikes}()},\n\\code{\\link{chop_width}()},\n\\code{\\link{fillet}()}\n}\n\\concept{chopping functions}\n"
  },
  {
    "path": "man/chop_mean_sd.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/chop-misc.R, R/breaks-misc.R, R/tab.R\n\\name{chop_mean_sd}\n\\alias{chop_mean_sd}\n\\alias{brk_mean_sd}\n\\alias{tab_mean_sd}\n\\title{Chop by standard deviations}\n\\usage{\nchop_mean_sd(x, sds = 1:3, ..., raw = FALSE, sd = deprecated())\n\nbrk_mean_sd(sds = 1:3, sd = deprecated())\n\ntab_mean_sd(x, sds = 1:3, ..., raw = FALSE)\n}\n\\arguments{\n\\item{x}{A vector.}\n\n\\item{sds}{Positive numeric vector of standard deviations.}\n\n\\item{...}{Passed to \\code{\\link[=chop]{chop()}}.}\n\n\\item{raw}{Logical. Use raw values in labels?}\n\n\\item{sd}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}}}\n}\n\\value{\n\\verb{chop_*} functions return a \\code{\\link[base:factor]{factor}} of the same length as \\code{x}.\n\n\\verb{brk_*} functions return a \\code{\\link{function}} to create \\code{breaks}.\n\n\\verb{tab_*} functions return a contingency \\code{\\link[base:table]{table}}.\n}\n\\description{\nIntervals are measured in standard deviations on either side of the\nmean.\n}\n\\details{\nIn version 0.7.0, these functions changed to specifying \\code{sds} as a vector.\nTo chop 1, 2 and 3 standard deviations around the mean, write\n\\code{chop_mean_sd(x, sds = 1:3)} instead of \\code{chop_mean_sd(x, sd = 3)}.\n}\n\\examples{\nchop_mean_sd(1:10)\n\nchop(1:10, brk_mean_sd())\n\ntab_mean_sd(1:10)\n\n}\n\\seealso{\nOther chopping functions: \n\\code{\\link{chop}()},\n\\code{\\link{chop_equally}()},\n\\code{\\link{chop_evenly}()},\n\\code{\\link{chop_fn}()},\n\\code{\\link{chop_n}()},\n\\code{\\link{chop_proportions}()},\n\\code{\\link{chop_quantiles}()},\n\\code{\\link{chop_spikes}()},\n\\code{\\link{chop_width}()},\n\\code{\\link{fillet}()}\n}\n\\concept{chopping functions}\n"
  },
  {
    "path": "man/chop_n.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/chop-by-group-size.R, R/breaks-by-group-size.R,\n%   R/tab.R\n\\name{chop_n}\n\\alias{chop_n}\n\\alias{brk_n}\n\\alias{tab_n}\n\\title{Chop into fixed-sized groups}\n\\usage{\nchop_n(x, n, ..., tail = \"split\")\n\nbrk_n(n, tail = \"split\")\n\ntab_n(x, n, ..., tail = \"split\")\n}\n\\arguments{\n\\item{x}{A vector.}\n\n\\item{n}{Integer. Number of elements in each interval.}\n\n\\item{...}{Passed to \\code{\\link[=chop]{chop()}}.}\n\n\\item{tail}{String. What to do if the final interval has fewer than \\code{n} elements?\n\\code{\"split\"} to keep it separate. \\code{\"merge\"} to merge it with the neighbouring\ninterval.}\n}\n\\value{\n\\verb{chop_*} functions return a \\code{\\link[base:factor]{factor}} of the same length as \\code{x}.\n\n\\verb{brk_*} functions return a \\code{\\link{function}} to create \\code{breaks}.\n\n\\verb{tab_*} functions return a contingency \\code{\\link[base:table]{table}}.\n}\n\\description{\n\\code{chop_n()} creates intervals containing a fixed number of elements.\n}\n\\details{\nThe algorithm guarantees that intervals contain no more than \\code{n} elements, so\nlong as there are no duplicates in \\code{x} and \\code{tail = \"split\"}. It also\nguarantees that intervals contain no fewer than \\code{n} elements, except possibly\nthe last interval (or first interval if \\code{left} is \\code{FALSE}).\n\nTo ensure that all intervals contain at least \\code{n} elements (so long as there\nare at least \\code{n} elements in \\code{x}!) set \\code{tail = \"merge\"}.\n\nIf \\code{tail = \"split\"} and there are intervals containing duplicates with more\nthan \\code{n} elements, a warning is given.\n}\n\\examples{\nchop_n(1:10, 5)\n\nchop_n(1:5, 2)\nchop_n(1:5, 2, tail = \"merge\")\n\n# too many duplicates\nx <- rep(1:2, each = 3)\nchop_n(x, 2)\n\ntab_n(1:10, 5)\n\n# fewer elements in one group\ntab_n(1:10, 4)\n\n}\n\\seealso{\nOther chopping functions: \n\\code{\\link{chop}()},\n\\code{\\link{chop_equally}()},\n\\code{\\link{chop_evenly}()},\n\\code{\\link{chop_fn}()},\n\\code{\\link{chop_mean_sd}()},\n\\code{\\link{chop_proportions}()},\n\\code{\\link{chop_quantiles}()},\n\\code{\\link{chop_spikes}()},\n\\code{\\link{chop_width}()},\n\\code{\\link{fillet}()}\n}\n\\concept{chopping functions}\n"
  },
  {
    "path": "man/chop_pretty.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/chop-misc.R, R/breaks-misc.R, R/tab.R\n\\name{chop_pretty}\n\\alias{chop_pretty}\n\\alias{brk_pretty}\n\\alias{tab_pretty}\n\\title{Chop using pretty breakpoints}\n\\usage{\nchop_pretty(x, n = 5, ...)\n\nbrk_pretty(n = 5, ...)\n\ntab_pretty(x, n = 5, ...)\n}\n\\arguments{\n\\item{x}{A vector.}\n\n\\item{n}{Positive integer passed to \\code{\\link[base:pretty]{base::pretty()}}. How many intervals to chop into?}\n\n\\item{...}{Passed to \\code{\\link[=chop]{chop()}} by \\code{chop_pretty()} and \\code{tab_pretty()}; passed\nto \\code{\\link[base:pretty]{base::pretty()}} by \\code{brk_pretty()}.}\n}\n\\value{\n\\verb{chop_*} functions return a \\code{\\link[base:factor]{factor}} of the same length as \\code{x}.\n\n\\verb{brk_*} functions return a \\code{\\link{function}} to create \\code{breaks}.\n\n\\verb{tab_*} functions return a contingency \\code{\\link[base:table]{table}}.\n}\n\\description{\n\\code{chop_pretty()} uses \\code{\\link[base:pretty]{base::pretty()}} to calculate breakpoints\nwhich are 1, 2 or 5 times a power of 10. These look nice in graphs.\n}\n\\details{\n\\code{\\link[base:pretty]{base::pretty()}} tries to return \\code{n+1} breakpoints, i.e. \\code{n} intervals, but\nnote that this is not guaranteed. There are methods for Date and POSIXct\nobjects.\n\nFor fine-grained control over \\code{\\link[base:pretty]{base::pretty()}} parameters, use\n\\code{chop(x, brk_pretty(...))}.\n}\n\\examples{\nchop_pretty(1:10)\n\nchop(1:10, brk_pretty(n = 5, high.u.bias = 0))\n\ntab_pretty(1:10)\n\n}\n"
  },
  {
    "path": "man/chop_proportions.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/chop-by-width.R, R/breaks-by-width.R, R/tab.R\n\\name{chop_proportions}\n\\alias{chop_proportions}\n\\alias{brk_proportions}\n\\alias{tab_proportions}\n\\title{Chop into proportions of the range of x}\n\\usage{\nchop_proportions(x, proportions, ..., raw = TRUE)\n\nbrk_proportions(proportions)\n\ntab_proportions(x, proportions, ..., raw = TRUE)\n}\n\\arguments{\n\\item{x}{A vector.}\n\n\\item{proportions}{Numeric vector between 0 and 1: proportions of x's range.\nIf \\code{proportions} has names, these will be used for labels.}\n\n\\item{...}{Passed to \\code{\\link[=chop]{chop()}}.}\n\n\\item{raw}{Logical. Use raw values in labels?}\n}\n\\value{\n\\verb{chop_*} functions return a \\code{\\link[base:factor]{factor}} of the same length as \\code{x}.\n\n\\verb{brk_*} functions return a \\code{\\link{function}} to create \\code{breaks}.\n\n\\verb{tab_*} functions return a contingency \\code{\\link[base:table]{table}}.\n}\n\\description{\n\\code{chop_proportions()} chops \\code{x} into \\code{proportions} of its range, excluding\ninfinite values.\n}\n\\details{\nBy default, labels show the raw numeric endpoints. To label intervals by\nthe proportions, use \\code{raw = FALSE}.\n}\n\\examples{\nchop_proportions(0:10, c(0.2, 0.8))\nchop_proportions(0:10, c(Low = 0, Mid = 0.2, High = 0.8))\n\n}\n\\seealso{\nOther chopping functions: \n\\code{\\link{chop}()},\n\\code{\\link{chop_equally}()},\n\\code{\\link{chop_evenly}()},\n\\code{\\link{chop_fn}()},\n\\code{\\link{chop_mean_sd}()},\n\\code{\\link{chop_n}()},\n\\code{\\link{chop_quantiles}()},\n\\code{\\link{chop_spikes}()},\n\\code{\\link{chop_width}()},\n\\code{\\link{fillet}()}\n}\n\\concept{chopping functions}\n"
  },
  {
    "path": "man/chop_quantiles.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/chop-by-group-size.R, R/breaks-by-group-size.R,\n%   R/tab.R\n\\name{chop_quantiles}\n\\alias{chop_quantiles}\n\\alias{chop_deciles}\n\\alias{brk_quantiles}\n\\alias{tab_quantiles}\n\\alias{tab_deciles}\n\\title{Chop by quantiles}\n\\usage{\nchop_quantiles(\n  x,\n  probs,\n  ...,\n  labels = if (raw) lbl_intervals() else lbl_intervals(single = NULL),\n  left = is.numeric(x),\n  raw = FALSE,\n  weights = NULL,\n  recalc_probs = FALSE\n)\n\nchop_deciles(x, ...)\n\nbrk_quantiles(probs, ..., weights = NULL, recalc_probs = FALSE)\n\ntab_quantiles(x, probs, ..., left = is.numeric(x), raw = FALSE)\n\ntab_deciles(x, ...)\n}\n\\arguments{\n\\item{x}{A vector.}\n\n\\item{probs}{A vector of probabilities for the quantiles. If \\code{probs} has\nnames, these will be used for labels.}\n\n\\item{...}{For \\code{chop_quantiles}, passed to \\code{\\link[=chop]{chop()}}. For \\code{brk_quantiles()},\npassed to \\code{\\link[stats:quantile]{stats::quantile()}} or \\code{\\link[Hmisc:wtd.stats]{Hmisc::wtd.quantile()}}.}\n\n\\item{labels}{A character vector of labels or a function to create labels.}\n\n\\item{left}{Logical. Left-closed or right-closed breaks?}\n\n\\item{raw}{Logical. Use raw values in labels?}\n\n\\item{weights}{\\code{NULL} or numeric vector of same length as \\code{x}. If not\n\\code{NULL}, \\code{\\link[Hmisc:wtd.stats]{Hmisc::wtd.quantile()}} is used to calculate weighted quantiles.}\n\n\\item{recalc_probs}{Logical. Recalculate probabilities of quantiles using\n\\code{\\link[stats:ecdf]{ecdf(x)}}? See below.}\n}\n\\value{\n\\verb{chop_*} functions return a \\code{\\link[base:factor]{factor}} of the same length as \\code{x}.\n\n\\verb{brk_*} functions return a \\code{\\link{function}} to create \\code{breaks}.\n\n\\verb{tab_*} functions return a contingency \\code{\\link[base:table]{table}}.\n}\n\\description{\n\\code{chop_quantiles()} chops data by quantiles.\n\\code{chop_deciles()} is a convenience function which chops into deciles.\n}\n\\details{\nFor non-numeric \\code{x}, \\code{left} is set to \\code{FALSE} by default. This works better\nfor calculating \"type 1\" quantiles, since they round down. See\n\\code{\\link[stats:quantile]{stats::quantile()}}.\n\nBy default, \\code{chop_quantiles()} shows the requested probabilities in the\nlabels. To show the numeric quantiles themselves, set \\code{raw = TRUE}.\n\nWhen \\code{x} contains duplicates, consecutive quantiles may be the same number. If\nso, interval labels may be misleading, and if \\code{recalc_probs = FALSE} a warning is\nemitted. Set \\code{recalc_probs = TRUE} to recalculate the probabilities of the quantiles\nusing the \\link[stats:ecdf]{empirical cumulative distribution function} of \\code{x}.\nDoing so may give you different labels from what you expect, and will\nremove any names from \\code{probs}, but it never changes the actual\nquantiles used for breaks. At present, \\code{recalc_probs = TRUE} is incompatible\nwith non-null \\code{weights}. See the example below.\n}\n\\examples{\nchop_quantiles(1:10, 1:3/4)\n\nchop_quantiles(1:10, c(Q1 = 0, Q2 = 0.25, Q3 = 0.5, Q4 = 0.75))\n\nchop(1:10, brk_quantiles(1:3/4))\n\nchop_deciles(1:10)\n\n# to label by the quantiles themselves:\nchop_quantiles(1:10, 1:3/4, raw = TRUE)\n\n# duplicate quantiles:\nx <- c(1, 1, 1, 2, 3)\nquantile(x, 1:5/5)\ntab_quantiles(x, 1:5/5)\ntab_quantiles(x, 1:5/5, recalc_probs = TRUE)\nset.seed(42)\ntab_quantiles(rnorm(100), probs = 1:3/4, raw = TRUE)\n\n}\n\\seealso{\nOther chopping functions: \n\\code{\\link{chop}()},\n\\code{\\link{chop_equally}()},\n\\code{\\link{chop_evenly}()},\n\\code{\\link{chop_fn}()},\n\\code{\\link{chop_mean_sd}()},\n\\code{\\link{chop_n}()},\n\\code{\\link{chop_proportions}()},\n\\code{\\link{chop_spikes}()},\n\\code{\\link{chop_width}()},\n\\code{\\link{fillet}()}\n}\n\\concept{chopping functions}\n"
  },
  {
    "path": "man/chop_spikes.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/chop-isolates.R, R/breaks.R, R/tab.R\n\\name{chop_spikes}\n\\alias{chop_spikes}\n\\alias{brk_spikes}\n\\alias{tab_spikes}\n\\title{Chop common values into singleton intervals}\n\\usage{\nchop_spikes(x, breaks, ..., n = NULL, prop = NULL)\n\nbrk_spikes(breaks, n = NULL, prop = NULL)\n\ntab_spikes(x, breaks, ..., n = NULL, prop = NULL)\n}\n\\arguments{\n\\item{x}{A vector.}\n\n\\item{breaks}{A numeric vector of cut-points or a call to a \\verb{brk_*} function.\nThe resulting \\code{\\link[=breaks-class]{breaks}} object will be modified to add\nsingleton breaks.}\n\n\\item{...}{Passed to \\code{\\link[=chop]{chop()}}.}\n\n\\item{n, prop}{Scalar. Provide either \\code{n}, a number of values, or \\code{prop},\na proportion of \\code{length(x)}. Values of \\code{x} which occur at least this\noften will get their own singleton break.}\n}\n\\value{\n\\verb{chop_*} functions return a \\code{\\link[base:factor]{factor}} of the same length as \\code{x}.\n\n\\verb{brk_*} functions return a \\code{\\link{function}} to create \\code{breaks}.\n\n\\verb{tab_*} functions return a contingency \\code{\\link[base:table]{table}}.\n}\n\\description{\n\\code{chop_spikes()} lets you chop common values of \\code{x} into their own\nsingleton intervals. This can help make unusual values visible.\n}\n\\details{\nThis function is \\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\\strong{[Experimental]}}.\n}\n\\examples{\nx <- c(1:4, rep(5, 5), 6:10)\nchop_spikes(x, c(2, 7), n = 5)\nchop_spikes(x, c(2, 7), prop = 0.25)\nchop_spikes(x, brk_width(5), n = 5)\n\nset.seed(42)\nx <- runif(40, 0, 10)\nx <- sample(x, 200, replace = TRUE)\ntab_spikes(x, brk_width(2, 0), prop = 0.05)\n}\n\\seealso{\n\\code{\\link[=dissect]{dissect()}} for a different approach.\n\nOther chopping functions: \n\\code{\\link{chop}()},\n\\code{\\link{chop_equally}()},\n\\code{\\link{chop_evenly}()},\n\\code{\\link{chop_fn}()},\n\\code{\\link{chop_mean_sd}()},\n\\code{\\link{chop_n}()},\n\\code{\\link{chop_proportions}()},\n\\code{\\link{chop_quantiles}()},\n\\code{\\link{chop_width}()},\n\\code{\\link{fillet}()}\n}\n\\concept{chopping functions}\n"
  },
  {
    "path": "man/chop_width.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/chop-by-width.R, R/breaks-by-width.R, R/tab.R\n\\name{chop_width}\n\\alias{chop_width}\n\\alias{brk_width}\n\\alias{brk_width.default}\n\\alias{tab_width}\n\\title{Chop into fixed-width intervals}\n\\usage{\nchop_width(x, width, start, ..., left = sign(width) > 0)\n\nbrk_width(width, start)\n\n\\method{brk_width}{default}(width, start)\n\ntab_width(x, width, start, ..., left = sign(width) > 0)\n}\n\\arguments{\n\\item{x}{A vector.}\n\n\\item{width}{Width of intervals.}\n\n\\item{start}{Starting point for intervals. By default the smallest\nfinite \\code{x} (largest if \\code{width} is negative).}\n\n\\item{...}{Passed to \\code{\\link[=chop]{chop()}}.}\n\n\\item{left}{Logical. Left-closed or right-closed breaks?}\n}\n\\value{\n\\verb{chop_*} functions return a \\code{\\link[base:factor]{factor}} of the same length as \\code{x}.\n\n\\verb{brk_*} functions return a \\code{\\link{function}} to create \\code{breaks}.\n\n\\verb{tab_*} functions return a contingency \\code{\\link[base:table]{table}}.\n}\n\\description{\n\\code{chop_width()} chops \\code{x} into intervals of fixed \\code{width}.\n}\n\\details{\nIf \\code{width} is negative, \\code{chop_width()} sets \\code{left = FALSE} and intervals will\ngo downwards from \\code{start}.\n}\n\\examples{\nchop_width(1:10, 2)\n\nchop_width(1:10, 2, start = 0)\n\nchop_width(1:9, -2)\n\nchop(1:10, brk_width(2, 0))\n\ntab_width(1:10, 2, start = 0)\n\n}\n\\seealso{\n\\link{brk_width-for-datetime}\n\nOther chopping functions: \n\\code{\\link{chop}()},\n\\code{\\link{chop_equally}()},\n\\code{\\link{chop_evenly}()},\n\\code{\\link{chop_fn}()},\n\\code{\\link{chop_mean_sd}()},\n\\code{\\link{chop_n}()},\n\\code{\\link{chop_proportions}()},\n\\code{\\link{chop_quantiles}()},\n\\code{\\link{chop_spikes}()},\n\\code{\\link{fillet}()}\n}\n\\concept{chopping functions}\n"
  },
  {
    "path": "man/dissect.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/chop-isolates.R, R/tab.R\n\\name{dissect}\n\\alias{dissect}\n\\alias{tab_dissect}\n\\title{Cut data into intervals, separating out common values}\n\\usage{\ndissect(\n  x,\n  breaks,\n  ...,\n  n = NULL,\n  prop = NULL,\n  spike_labels = \"{{{l}}}\",\n  exclude_spikes = FALSE\n)\n\ntab_dissect(x, breaks, ..., n = NULL, prop = NULL)\n}\n\\arguments{\n\\item{x, breaks, ...}{Passed to \\code{\\link[=chop]{chop()}}.}\n\n\\item{n, prop}{Scalar. Provide either \\code{n}, a number of values, or \\code{prop},\na proportion of \\code{length(x)}. Values of \\code{x} which occur at least this\noften will get their own singleton break.}\n\n\\item{spike_labels}{\\link[glue:glue]{Glue} string for spike labels. Use \\code{\"{l}\"}\nfor the spike value.}\n\n\\item{exclude_spikes}{Logical. Exclude spikes before chopping \\code{x}? This\ncan affect the location of data-dependent breaks.}\n}\n\\value{\n\\code{dissect()} returns the result of \\code{\\link[=chop]{chop()}}, but with common values put into\nseparate factor levels.\n\n\\code{tab_dissect()} returns a contingency \\link[base:table]{table()}.\n}\n\\description{\nSometimes it's useful to separate out common elements of \\code{x}.\n\\code{dissect()} chops \\code{x}, but puts common elements of \\code{x} (\"spikes\")\ninto separate categories.\n}\n\\details{\nUnlike \\code{\\link[=chop_spikes]{chop_spikes()}}, \\code{dissect()} doesn't break up\nintervals which contain a spike. As a result, unlike \\verb{chop_*} functions,\n\\code{dissect()} does not chop \\code{x} into disjoint intervals. See the examples.\n\nIf breaks are data-dependent, their labels may be misleading after common\nelements have been removed. See the example below. To get round this,\nset \\code{exclude_spikes} to \\code{TRUE}. Then breaks will be calculated after\nremoving spikes from the data.\n\nLevels of the result are ordered by the minimum element in each level. As\na result, if \\code{drop = FALSE}, empty levels will be placed last.\n\nThis function is \\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\\strong{[Experimental]}}.\n}\n\\examples{\nx <- c(2, 3, 3, 3, 4)\ndissect(x, c(2, 4), n = 3)\ndissect(x, brk_width(2), prop = 0.5)\n\nset.seed(42)\nx <- runif(40, 0, 10)\nx <- sample(x, 200, replace = TRUE)\n# Compare:\ntable(dissect(x, brk_width(2, 0), prop = 0.05))\n# Versus:\ntab_spikes(x, brk_width(2, 0), prop = 0.05)\n\n# Potentially confusing data-dependent breaks:\nset.seed(42)\nx <- rnorm(99)\nx[1:9] <- x[1]\ntab_quantiles(x, 1:2/3)\ntab_dissect(x, brk_quantiles(1:2/3), n = 9)\n# Calculate quantiles excluding spikes:\ntab_dissect(x, brk_quantiles(1:2/3), n = 9, exclude_spikes = TRUE)\n}\n\\seealso{\n\\code{\\link[=chop_spikes]{chop_spikes()}} for a different approach.\n}\n"
  },
  {
    "path": "man/exactly.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/utils.R\n\\name{exactly}\n\\alias{exactly}\n\\title{Define singleton intervals explicitly}\n\\usage{\nexactly(x)\n}\n\\arguments{\n\\item{x}{A numeric vector.}\n}\n\\value{\nThe same as \\code{rep(x, each = 2)}.\n}\n\\description{\n\\code{exactly()} duplicates its input.\nIt lets you define singleton intervals like this: \\code{chop(x, c(1, exactly(2), 3))}.\nThis is the same as \\code{chop(x, c(1, 2, 2, 3))} but conveys your intent more\nclearly.\n}\n\\examples{\nchop(1:10, c(2, exactly(5), 8))\n\n# same:\nchop(1:10, c(2, 5, 5, 8))\n}\n"
  },
  {
    "path": "man/fillet.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/chop.R\n\\name{fillet}\n\\alias{fillet}\n\\title{Chop data precisely (for programmers)}\n\\usage{\nfillet(\n  x,\n  breaks,\n  labels = lbl_intervals(),\n  left = TRUE,\n  close_end = TRUE,\n  raw = NULL\n)\n}\n\\arguments{\n\\item{x}{A vector.}\n\n\\item{breaks}{A numeric vector of cut-points, or a function to create\ncut-points from \\code{x}.}\n\n\\item{labels}{A character vector of labels or a function to create labels.}\n\n\\item{left}{Logical. Left-closed or right-closed breaks?}\n\n\\item{close_end}{Logical. Close last break at right? (If \\code{left} is \\code{FALSE},\nclose first break at left?)}\n\n\\item{raw}{Logical. Use raw values in labels?}\n}\n\\value{\n\\code{fillet()} returns a \\code{\\link[base:factor]{factor}} of the same length as\n\\code{x}, representing the intervals containing the value of \\code{x}.\n}\n\\description{\n\\code{fillet()} calls \\code{\\link[=chop]{chop()}} with \\code{extend = FALSE} and \\code{drop = FALSE}. This\nensures that you get only the \\code{breaks} and \\code{labels} you ask for. When\nprogramming, consider using \\code{fillet()} instead of \\code{chop()}.\n}\n\\examples{\nfillet(1:10, c(2, 5, 8))\n}\n\\seealso{\nOther chopping functions: \n\\code{\\link{chop}()},\n\\code{\\link{chop_equally}()},\n\\code{\\link{chop_evenly}()},\n\\code{\\link{chop_fn}()},\n\\code{\\link{chop_mean_sd}()},\n\\code{\\link{chop_n}()},\n\\code{\\link{chop_proportions}()},\n\\code{\\link{chop_quantiles}()},\n\\code{\\link{chop_spikes}()},\n\\code{\\link{chop_width}()}\n}\n\\concept{chopping functions}\n"
  },
  {
    "path": "man/lbl_dash.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/labels.R\n\\name{lbl_dash}\n\\alias{lbl_dash}\n\\title{Label chopped intervals like 1-4, 4-5, ...}\n\\usage{\nlbl_dash(\n  symbol = em_dash(),\n  fmt = NULL,\n  single = \"{l}\",\n  first = NULL,\n  last = NULL,\n  raw = deprecated()\n)\n}\n\\arguments{\n\\item{symbol}{String: symbol to use for the dash.}\n\n\\item{fmt}{String, list or function. A format for break endpoints.}\n\n\\item{single}{Glue string: label for singleton intervals. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details. If \\code{NULL}, singleton intervals will be labelled the same way\nas other intervals.}\n\n\\item{first}{Glue string: override label for the first category. Write e.g.\n\\code{first = \"<{r}\"} to create a label like \\code{\"<18\"}. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details.}\n\n\\item{last}{String: override label for the last category. Write e.g.\n\\code{last = \">{l}\"} to create a label like \\code{\">65\"}. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details.}\n\n\\item{raw}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}}. Throws an error.\nUse the \\code{raw} argument to \\code{\\link[=chop]{chop()}} instead.}\n}\n\\value{\nA function that creates a vector of labels.\n}\n\\description{\nThis label style is user-friendly, but doesn't distinguish between\nleft- and right-closed intervals. It's good for continuous data\nwhere you don't expect points to be exactly on the breaks.\n}\n\\details{\nIf you don't want unicode output, use \\code{lbl_dash(\"-\")}.\n}\n\\section{Formatting endpoints}{\n\n\nIf \\code{fmt} is not \\code{NULL} then it is used to format the endpoints.\n\\itemize{\n\\item If \\code{fmt} is a string, then numeric endpoints will be formatted by\n\\code{sprintf(fmt, breaks)}; other endpoints, e.g. \\link[base:Dates]{Date} objects,\nwill be formatted by \\code{format(breaks, fmt)}.\n\\item If \\code{fmt} is a list, then it will be used as arguments to \\link{format}.\n\\item If \\code{fmt} is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the \\code{{scales}} package, e.g. \\code{\\link[scales:label_number]{scales::label_comma()}}.\n}\n}\n\n\\examples{\nchop(1:10, c(2, 5, 8), lbl_dash())\n\nchop(1:10, c(2, 5, 8), lbl_dash(\" to \", fmt = \"\\%.1f\"))\n\nchop(1:10, c(2, 5, 8), lbl_dash(first = \"<{r}\"))\n\npretty <- function (x) prettyNum(x, big.mark = \",\", digits = 1)\nchop(runif(10) * 10000, c(3000, 7000), lbl_dash(\" to \", fmt = pretty))\n}\n\\seealso{\nOther labelling functions: \n\\code{\\link{lbl_date}()},\n\\code{\\link{lbl_discrete}()},\n\\code{\\link{lbl_endpoints}()},\n\\code{\\link{lbl_glue}()},\n\\code{\\link{lbl_intervals}()},\n\\code{\\link{lbl_manual}()},\n\\code{\\link{lbl_midpoints}()},\n\\code{\\link{lbl_seq}()}\n}\n\\concept{labelling functions}\n"
  },
  {
    "path": "man/lbl_datetime.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/labels-datetime.R\n\\name{lbl_date}\n\\alias{lbl_date}\n\\alias{lbl_datetime}\n\\title{Label dates and datetimes}\n\\usage{\nlbl_date(\n  fmt = \"\\%e \\%b \\%Y\",\n  symbol = \"-\",\n  unit = as.difftime(1, units = \"days\"),\n  single = \"{l}\",\n  first = NULL,\n  last = NULL\n)\n\nlbl_datetime(\n  fmt = \"\\%H:\\%M:\\%S \\%b \\%e \\%Y\",\n  symbol = \"-\",\n  unit = NULL,\n  single = \"{l}\",\n  first = NULL,\n  last = NULL\n)\n}\n\\arguments{\n\\item{fmt}{String, list or function. A format for break endpoints.}\n\n\\item{symbol}{String: separator to use for full ranges.}\n\n\\item{unit}{Optional interval unit for non-overlapping labels. If not \\code{NULL},\n.  endpoints are adjusted in the style of \\code{\\link[=lbl_discrete]{lbl_discrete()}}.}\n\n\\item{single}{Glue string: label for singleton intervals. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details. If \\code{NULL}, singleton intervals will be labelled the same way\nas other intervals.}\n\n\\item{first}{Glue string: override label for the first category. Write e.g.\n\\code{first = \"<{r}\"} to create a label like \\code{\"<18\"}. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details.}\n\n\\item{last}{String: override label for the last category. Write e.g.\n\\code{last = \">{l}\"} to create a label like \\code{\">65\"}. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details.}\n}\n\\value{\nA function that creates a vector of labels.\n}\n\\description{\n\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\\strong{[Experimental]}}\n\n\\code{lbl_date()} and \\code{lbl_datetime()} produce nice labels for dates\nand datetimes. Where possible ranges are simplified, like\nlike \"13-14 Jul 2026\" or \"11:15-12:15 1 Dec 2025\".\n}\n\\section{Formatting endpoints}{\n\n\nIf \\code{fmt} is not \\code{NULL} then it is used to format the endpoints.\n\\itemize{\n\\item If \\code{fmt} is a string, then numeric endpoints will be formatted by\n\\code{sprintf(fmt, breaks)}; other endpoints, e.g. \\link[base:Dates]{Date} objects,\nwill be formatted by \\code{format(breaks, fmt)}.\n\\item If \\code{fmt} is a list, then it will be used as arguments to \\link{format}.\n\\item If \\code{fmt} is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the \\code{{scales}} package, e.g. \\code{\\link[scales:label_number]{scales::label_comma()}}.\n}\n}\n\n\\examples{\nwinter <- as.Date(\"2025-12-01\") + 0:89\ntab(winter, as.Date(c(\"2025-12-25\", \"2026-01-06\")),\n    labels = lbl_date())\nnew_year <- as.POSIXct(\"2025-12-31 23:00\") + 0:120 * 60\nround_midnight <- as.POSIXct(c(\"2025-12-31 23:59\", \"2026-01-01 00:05\"))\ntab(new_year, round_midnight,\n    labels = lbl_datetime())\ntab(new_year, round_midnight,\n    labels = lbl_datetime(unit = as.difftime(1, units = \"mins\")))\n}\n\\seealso{\nOther labelling functions: \n\\code{\\link{lbl_dash}()},\n\\code{\\link{lbl_discrete}()},\n\\code{\\link{lbl_endpoints}()},\n\\code{\\link{lbl_glue}()},\n\\code{\\link{lbl_intervals}()},\n\\code{\\link{lbl_manual}()},\n\\code{\\link{lbl_midpoints}()},\n\\code{\\link{lbl_seq}()}\n}\n\\concept{labelling functions}\n"
  },
  {
    "path": "man/lbl_discrete.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/labels.R\n\\name{lbl_discrete}\n\\alias{lbl_discrete}\n\\title{Label discrete data}\n\\usage{\nlbl_discrete(\n  symbol = em_dash(),\n  unit = 1L,\n  fmt = NULL,\n  single = NULL,\n  first = NULL,\n  last = NULL\n)\n}\n\\arguments{\n\\item{symbol}{String: symbol to use for the dash.}\n\n\\item{unit}{Minimum difference between distinct values of data.\nFor integers, 1.}\n\n\\item{fmt}{String, list or function. A format for break endpoints.}\n\n\\item{single}{Glue string: label for singleton intervals. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details. If \\code{NULL}, singleton intervals will be labelled the same way\nas other intervals.}\n\n\\item{first}{Glue string: override label for the first category. Write e.g.\n\\code{first = \"<{r}\"} to create a label like \\code{\"<18\"}. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details.}\n\n\\item{last}{String: override label for the last category. Write e.g.\n\\code{last = \">{l}\"} to create a label like \\code{\">65\"}. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details.}\n}\n\\value{\nA function that creates a vector of labels.\n}\n\\description{\n\\code{lbl_discrete()} creates labels for discrete data, such as integers.\nFor example, breaks\n\\code{c(1, 3, 4, 6, 7)} are labelled: \\verb{\"1-2\", \"3\", \"4-5\", \"6-7\"}.\n}\n\\details{\nNo check is done that the data are discrete-valued. If they are not, then\nthese labels may be misleading. Here, discrete-valued means that if\n\\code{x < y}, then \\code{x <= y - unit}.\n\nBe aware that Date objects may have non-integer values. See\n\\link[base:Dates]{Date}.\n}\n\\section{Formatting endpoints}{\n\n\nIf \\code{fmt} is not \\code{NULL} then it is used to format the endpoints.\n\\itemize{\n\\item If \\code{fmt} is a string, then numeric endpoints will be formatted by\n\\code{sprintf(fmt, breaks)}; other endpoints, e.g. \\link[base:Dates]{Date} objects,\nwill be formatted by \\code{format(breaks, fmt)}.\n\\item If \\code{fmt} is a list, then it will be used as arguments to \\link{format}.\n\\item If \\code{fmt} is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the \\code{{scales}} package, e.g. \\code{\\link[scales:label_number]{scales::label_comma()}}.\n}\n}\n\n\\examples{\ntab(1:7, c(1, 3, 5), lbl_discrete())\n\ntab(1:7, c(3, 5), lbl_discrete(first = \"<= {r}\"))\n\ntab(1:7 * 1000, c(1, 3, 5) * 1000, lbl_discrete(unit = 1000))\n\n# Misleading labels for non-integer data\nchop(2.5, c(1, 3, 5), lbl_discrete())\n\n}\n\\seealso{\nOther labelling functions: \n\\code{\\link{lbl_dash}()},\n\\code{\\link{lbl_date}()},\n\\code{\\link{lbl_endpoints}()},\n\\code{\\link{lbl_glue}()},\n\\code{\\link{lbl_intervals}()},\n\\code{\\link{lbl_manual}()},\n\\code{\\link{lbl_midpoints}()},\n\\code{\\link{lbl_seq}()}\n}\n\\concept{labelling functions}\n"
  },
  {
    "path": "man/lbl_endpoints.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/labels-single.R\n\\name{lbl_endpoints}\n\\alias{lbl_endpoints}\n\\alias{lbl_endpoint}\n\\title{Label chopped intervals by their left or right endpoints}\n\\usage{\nlbl_endpoints(\n  left = TRUE,\n  fmt = NULL,\n  single = NULL,\n  first = NULL,\n  last = NULL,\n  raw = deprecated()\n)\n\nlbl_endpoint(fmt = NULL, raw = FALSE, left = TRUE)\n}\n\\arguments{\n\\item{left}{Flag. Use left endpoint or right endpoint?}\n\n\\item{fmt}{String, list or function. A format for break endpoints.}\n\n\\item{single}{Glue string: label for singleton intervals. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details. If \\code{NULL}, singleton intervals will be labelled the same way\nas other intervals.}\n\n\\item{first}{Glue string: override label for the first category. Write e.g.\n\\code{first = \"<{r}\"} to create a label like \\code{\"<18\"}. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details.}\n\n\\item{last}{String: override label for the last category. Write e.g.\n\\code{last = \">{l}\"} to create a label like \\code{\">65\"}. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details.}\n\n\\item{raw}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}}. Throws an error.\nUse the \\code{raw} argument to \\code{\\link[=chop]{chop()}} instead.}\n}\n\\value{\nA function that creates a vector of labels.\n}\n\\description{\nThis is useful when the left endpoint unambiguously indicates the\ninterval. In other cases it may give errors due to duplicate labels.\n}\n\\details{\n\\code{lbl_endpoint()} is \\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#defunct}{\\figure{lifecycle-defunct.svg}{options: alt='[Defunct]'}}}{\\strong{[Defunct]}} and gives an\nerror since santoku 1.0.0.\n}\n\\section{Formatting endpoints}{\n\n\nIf \\code{fmt} is not \\code{NULL} then it is used to format the endpoints.\n\\itemize{\n\\item If \\code{fmt} is a string, then numeric endpoints will be formatted by\n\\code{sprintf(fmt, breaks)}; other endpoints, e.g. \\link[base:Dates]{Date} objects,\nwill be formatted by \\code{format(breaks, fmt)}.\n\\item If \\code{fmt} is a list, then it will be used as arguments to \\link{format}.\n\\item If \\code{fmt} is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the \\code{{scales}} package, e.g. \\code{\\link[scales:label_number]{scales::label_comma()}}.\n}\n}\n\n\\examples{\nchop(1:10, c(2, 5, 8), lbl_endpoints(left = TRUE))\nchop(1:10, c(2, 5, 8), lbl_endpoints(left = FALSE))\nif (requireNamespace(\"lubridate\")) {\n  tab_width(\n          as.Date(\"2000-01-01\") + 0:365,\n         months(1),\n         labels = lbl_endpoints(fmt = \"\\%b\")\n       )\n}\n\n\\dontrun{\n  # This gives breaks `[1, 2) [2, 3) {3}` which lead to\n  # duplicate labels `\"2\", \"3\", \"3\"`:\n  chop(1:3, 1:3, lbl_endpoints(left = FALSE))\n}\n}\n\\seealso{\nOther labelling functions: \n\\code{\\link{lbl_dash}()},\n\\code{\\link{lbl_date}()},\n\\code{\\link{lbl_discrete}()},\n\\code{\\link{lbl_glue}()},\n\\code{\\link{lbl_intervals}()},\n\\code{\\link{lbl_manual}()},\n\\code{\\link{lbl_midpoints}()},\n\\code{\\link{lbl_seq}()}\n}\n\\concept{labelling functions}\n"
  },
  {
    "path": "man/lbl_glue.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/labels-glue.R\n\\name{lbl_glue}\n\\alias{lbl_glue}\n\\title{Label chopped intervals using the \\code{glue} package}\n\\usage{\nlbl_glue(\n  label,\n  fmt = NULL,\n  single = NULL,\n  first = NULL,\n  last = NULL,\n  raw = deprecated(),\n  ...\n)\n}\n\\arguments{\n\\item{label}{A glue string passed to \\code{\\link[glue:glue]{glue::glue()}}.}\n\n\\item{fmt}{String, list or function. A format for break endpoints.}\n\n\\item{single}{Glue string: label for singleton intervals. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details. If \\code{NULL}, singleton intervals will be labelled the same way\nas other intervals.}\n\n\\item{first}{Glue string: override label for the first category. Write e.g.\n\\code{first = \"<{r}\"} to create a label like \\code{\"<18\"}. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details.}\n\n\\item{last}{String: override label for the last category. Write e.g.\n\\code{last = \">{l}\"} to create a label like \\code{\">65\"}. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details.}\n\n\\item{raw}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}}. Throws an error.\nUse the \\code{raw} argument to \\code{\\link[=chop]{chop()}} instead.}\n\n\\item{...}{Further arguments passed to \\code{\\link[glue:glue]{glue::glue()}}.}\n}\n\\value{\nA function that creates a vector of labels.\n}\n\\description{\nUse \\code{\"{l}\"} and \\code{\"{r}\"} to show the left and right endpoints of the intervals.\n}\n\\details{\nThe following variables are available in the glue string:\n\\itemize{\n\\item \\code{l} is a character vector of left endpoints of intervals.\n\\item \\code{r} is a character vector of right endpoints of intervals.\n\\item \\code{l_closed} is a logical vector. Elements are \\code{TRUE} when the left\nendpoint is closed.\n\\item \\code{r_closed} is a logical vector, \\code{TRUE} when the right endpoint is closed.\n}\n\nEndpoints will be formatted by \\code{fmt} before being passed to \\code{glue()}.\n}\n\\section{Formatting endpoints}{\n\n\nIf \\code{fmt} is not \\code{NULL} then it is used to format the endpoints.\n\\itemize{\n\\item If \\code{fmt} is a string, then numeric endpoints will be formatted by\n\\code{sprintf(fmt, breaks)}; other endpoints, e.g. \\link[base:Dates]{Date} objects,\nwill be formatted by \\code{format(breaks, fmt)}.\n\\item If \\code{fmt} is a list, then it will be used as arguments to \\link{format}.\n\\item If \\code{fmt} is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the \\code{{scales}} package, e.g. \\code{\\link[scales:label_number]{scales::label_comma()}}.\n}\n}\n\n\\examples{\ntab(1:10, c(1, 3, 3, 7),\n    labels = lbl_glue(\"{l} to {r}\", single = \"Exactly {l}\"))\n\ntab(1:10 * 1000, c(1, 3, 5, 7) * 1000,\n    labels = lbl_glue(\"{l}-{r}\",\n                      fmt = function(x) prettyNum(x, big.mark=',')))\n\n# reproducing lbl_intervals():\ninterval_left <- \"{ifelse(l_closed, '[', '(')}\"\ninterval_right <- \"{ifelse(r_closed, ']', ')')}\"\nglue_string <- paste0(interval_left, \"{l}\", \", \", \"{r}\", interval_right)\ntab(1:10, c(1, 3, 3, 7), labels = lbl_glue(glue_string, single = \"{{{l}}}\"))\n\n}\n\\seealso{\nOther labelling functions: \n\\code{\\link{lbl_dash}()},\n\\code{\\link{lbl_date}()},\n\\code{\\link{lbl_discrete}()},\n\\code{\\link{lbl_endpoints}()},\n\\code{\\link{lbl_intervals}()},\n\\code{\\link{lbl_manual}()},\n\\code{\\link{lbl_midpoints}()},\n\\code{\\link{lbl_seq}()}\n}\n\\concept{labelling functions}\n"
  },
  {
    "path": "man/lbl_intervals.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/labels.R\n\\name{lbl_intervals}\n\\alias{lbl_intervals}\n\\title{Label chopped intervals using set notation}\n\\usage{\nlbl_intervals(\n  fmt = NULL,\n  single = \"{{{l}}}\",\n  first = NULL,\n  last = NULL,\n  raw = deprecated()\n)\n}\n\\arguments{\n\\item{fmt}{String, list or function. A format for break endpoints.}\n\n\\item{single}{Glue string: label for singleton intervals. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details. If \\code{NULL}, singleton intervals will be labelled the same way\nas other intervals.}\n\n\\item{first}{Glue string: override label for the first category. Write e.g.\n\\code{first = \"<{r}\"} to create a label like \\code{\"<18\"}. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details.}\n\n\\item{last}{String: override label for the last category. Write e.g.\n\\code{last = \">{l}\"} to create a label like \\code{\">65\"}. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details.}\n\n\\item{raw}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}}. Throws an error.\nUse the \\code{raw} argument to \\code{\\link[=chop]{chop()}} instead.}\n}\n\\value{\nA function that creates a vector of labels.\n}\n\\description{\nThese labels are the most exact, since they show you whether\nintervals are \"closed\" or \"open\", i.e. whether they include their endpoints.\n}\n\\details{\nMathematical set notation looks like this:\n\\itemize{\n\\item \\code{[a, b]}: all numbers \\code{x} where \\verb{a <= x <= b};\n\\item \\code{(a, b)}: all numbers where \\verb{a < x < b};\n\\item \\code{[a, b)}: all numbers where \\verb{a <= x < b};\n\\item \\code{(a, b]}: all numbers where \\verb{a < x <= b};\n\\item \\code{{a}}: just the number \\code{a} exactly.\n}\n}\n\\section{Formatting endpoints}{\n\n\nIf \\code{fmt} is not \\code{NULL} then it is used to format the endpoints.\n\\itemize{\n\\item If \\code{fmt} is a string, then numeric endpoints will be formatted by\n\\code{sprintf(fmt, breaks)}; other endpoints, e.g. \\link[base:Dates]{Date} objects,\nwill be formatted by \\code{format(breaks, fmt)}.\n\\item If \\code{fmt} is a list, then it will be used as arguments to \\link{format}.\n\\item If \\code{fmt} is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the \\code{{scales}} package, e.g. \\code{\\link[scales:label_number]{scales::label_comma()}}.\n}\n}\n\n\\examples{\n\ntab(-10:10, c(-3, 0, 0, 3),\n      labels = lbl_intervals())\n\ntab(-10:10, c(-3, 0, 0, 3),\n      labels = lbl_intervals(fmt = list(nsmall = 1)))\n\ntab_evenly(runif(20), 10,\n      labels = lbl_intervals(fmt = percent))\n\n}\n\\seealso{\nOther labelling functions: \n\\code{\\link{lbl_dash}()},\n\\code{\\link{lbl_date}()},\n\\code{\\link{lbl_discrete}()},\n\\code{\\link{lbl_endpoints}()},\n\\code{\\link{lbl_glue}()},\n\\code{\\link{lbl_manual}()},\n\\code{\\link{lbl_midpoints}()},\n\\code{\\link{lbl_seq}()}\n}\n\\concept{labelling functions}\n"
  },
  {
    "path": "man/lbl_manual.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/labels-single.R\n\\name{lbl_manual}\n\\alias{lbl_manual}\n\\title{Defunct: label chopped intervals in a user-defined sequence}\n\\usage{\nlbl_manual(sequence, fmt = \"\\%s\")\n}\n\\arguments{\n\\item{sequence}{A character vector of labels.}\n\n\\item{fmt}{String, list or function. A format for break endpoints.}\n}\n\\value{\nA function that creates a vector of labels.\n}\n\\description{\n\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#defunct}{\\figure{lifecycle-defunct.svg}{options: alt='[Defunct]'}}}{\\strong{[Defunct]}}\n}\n\\details{\n\\code{lbl_manual()} is defunct since santoku 1.0.0. It is little used and is not\nclosely related to the rest of the package. It also risks mislabelling\nintervals, e.g. if intervals are extended. Use of \\code{lbl_manual()} will give\nan error.\n}\n\\section{Formatting endpoints}{\n\n\nIf \\code{fmt} is not \\code{NULL} then it is used to format the endpoints.\n\\itemize{\n\\item If \\code{fmt} is a string, then numeric endpoints will be formatted by\n\\code{sprintf(fmt, breaks)}; other endpoints, e.g. \\link[base:Dates]{Date} objects,\nwill be formatted by \\code{format(breaks, fmt)}.\n\\item If \\code{fmt} is a list, then it will be used as arguments to \\link{format}.\n\\item If \\code{fmt} is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the \\code{{scales}} package, e.g. \\code{\\link[scales:label_number]{scales::label_comma()}}.\n}\n}\n\n\\examples{\n\\dontrun{\nchop(1:10, c(2, 5, 8), lbl_manual(c(\"w\", \"x\", \"y\", \"z\")))\n# ->\nchop(1:10, c(2, 5, 8), labels = c(\"w\", \"x\", \"y\", \"z\"))\n}\n}\n\\seealso{\nOther labelling functions: \n\\code{\\link{lbl_dash}()},\n\\code{\\link{lbl_date}()},\n\\code{\\link{lbl_discrete}()},\n\\code{\\link{lbl_endpoints}()},\n\\code{\\link{lbl_glue}()},\n\\code{\\link{lbl_intervals}()},\n\\code{\\link{lbl_midpoints}()},\n\\code{\\link{lbl_seq}()}\n}\n\\concept{labelling functions}\n\\keyword{internal}\n"
  },
  {
    "path": "man/lbl_midpoints.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/labels-single.R\n\\name{lbl_midpoints}\n\\alias{lbl_midpoints}\n\\title{Label chopped intervals by their midpoints}\n\\usage{\nlbl_midpoints(\n  fmt = NULL,\n  single = NULL,\n  first = NULL,\n  last = NULL,\n  raw = deprecated()\n)\n}\n\\arguments{\n\\item{fmt}{String, list or function. A format for break endpoints.}\n\n\\item{single}{Glue string: label for singleton intervals. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details. If \\code{NULL}, singleton intervals will be labelled the same way\nas other intervals.}\n\n\\item{first}{Glue string: override label for the first category. Write e.g.\n\\code{first = \"<{r}\"} to create a label like \\code{\"<18\"}. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details.}\n\n\\item{last}{String: override label for the last category. Write e.g.\n\\code{last = \">{l}\"} to create a label like \\code{\">65\"}. See \\code{\\link[=lbl_glue]{lbl_glue()}}\nfor details.}\n\n\\item{raw}{\\ifelse{html}{\\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\\strong{[Deprecated]}}. Throws an error.\nUse the \\code{raw} argument to \\code{\\link[=chop]{chop()}} instead.}\n}\n\\value{\nA function that creates a vector of labels.\n}\n\\description{\nThis uses the midpoint of each interval for\nits label.\n}\n\\section{Formatting endpoints}{\n\n\nIf \\code{fmt} is not \\code{NULL} then it is used to format the endpoints.\n\\itemize{\n\\item If \\code{fmt} is a string, then numeric endpoints will be formatted by\n\\code{sprintf(fmt, breaks)}; other endpoints, e.g. \\link[base:Dates]{Date} objects,\nwill be formatted by \\code{format(breaks, fmt)}.\n\\item If \\code{fmt} is a list, then it will be used as arguments to \\link{format}.\n\\item If \\code{fmt} is a function, it should take a vector of numbers (or other objects\nthat can be used as breaks) and return a character vector. It may be helpful\nto use functions from the \\code{{scales}} package, e.g. \\code{\\link[scales:label_number]{scales::label_comma()}}.\n}\n}\n\n\\examples{\nchop(1:10, c(2, 5, 8), lbl_midpoints())\n}\n\\seealso{\nOther labelling functions: \n\\code{\\link{lbl_dash}()},\n\\code{\\link{lbl_date}()},\n\\code{\\link{lbl_discrete}()},\n\\code{\\link{lbl_endpoints}()},\n\\code{\\link{lbl_glue}()},\n\\code{\\link{lbl_intervals}()},\n\\code{\\link{lbl_manual}()},\n\\code{\\link{lbl_seq}()}\n}\n\\concept{labelling functions}\n"
  },
  {
    "path": "man/lbl_seq.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/labels-single.R\n\\name{lbl_seq}\n\\alias{lbl_seq}\n\\title{Label chopped intervals in sequence}\n\\usage{\nlbl_seq(start = \"a\")\n}\n\\arguments{\n\\item{start}{String. A template for the sequence. See below.}\n}\n\\value{\nA function that creates a vector of labels.\n}\n\\description{\n\\code{lbl_seq()} labels intervals sequentially, using numbers or letters.\n}\n\\details{\n\\code{start} shows the first element of the sequence. It must contain exactly \\emph{one}\ncharacter out of the set \"a\", \"A\", \"i\", \"I\" or \"1\". For later elements:\n\\itemize{\n\\item \"a\" will be replaced by \"a\", \"b\", \"c\", ...\n\\item \"A\" will be replaced by \"A\", \"B\", \"C\", ...\n\\item \"i\" will be replaced by lower-case Roman numerals \"i\", \"ii\", \"iii\", ...\n\\item \"I\" will be replaced by upper-case Roman numerals \"I\", \"II\", \"III\", ...\n\\item \"1\" will be replaced by numbers \"1\", \"2\", \"3\", ...\n}\n\nOther characters will be retained as-is.\n}\n\\examples{\nchop(1:10, c(2, 5, 8), lbl_seq())\n\nchop(1:10, c(2, 5, 8), lbl_seq(\"i.\"))\n\nchop(1:10, c(2, 5, 8), lbl_seq(\"(A)\"))\n}\n\\seealso{\nOther labelling functions: \n\\code{\\link{lbl_dash}()},\n\\code{\\link{lbl_date}()},\n\\code{\\link{lbl_discrete}()},\n\\code{\\link{lbl_endpoints}()},\n\\code{\\link{lbl_glue}()},\n\\code{\\link{lbl_intervals}()},\n\\code{\\link{lbl_manual}()},\n\\code{\\link{lbl_midpoints}()}\n}\n\\concept{labelling functions}\n"
  },
  {
    "path": "man/non-standard-types.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/non-standard-types-doc.R\n\\name{non-standard-types}\n\\alias{non-standard-types}\n\\title{Tips for chopping non-standard types}\n\\description{\nSantoku can handle many non-standard types.\n}\n\\details{\n\\itemize{\n\\item If objects can be compared using \\code{<}, \\code{==} etc. then they should\nbe choppable.\n\\item Objects which can't be converted to numeric are handled within R code,\nwhich may be slower.\n\\item Character \\code{x} and \\code{breaks} are chopped with a warning.\n\\item If \\code{x} and \\code{breaks} are not the same type, they should be able to\nbe cast to the same type, usually using \\code{\\link[vctrs:vec_cast]{vctrs::vec_cast_common()}}.\n\\item Not all chopping operations make sense, for example, \\code{\\link[=chop_mean_sd]{chop_mean_sd()}}\non a character vector.\n\\item For indexed objects such as \\code{\\link[stats:ts]{stats::ts()}} objects, indices will be dropped\nfrom the result.\n\\item If you get errors, try setting \\code{extend = FALSE} (but also file a bug report).\n\\item To request support for a type, open an issue on Github.\n}\n}\n\\seealso{\nbrk-width-for-Datetime\n}\n"
  },
  {
    "path": "man/percent.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/utils.R\n\\name{percent}\n\\alias{percent}\n\\title{Simple percentage formatter}\n\\usage{\npercent(x)\n}\n\\arguments{\n\\item{x}{Numeric values.}\n}\n\\value{\n\\code{x} formatted as a percent.\n}\n\\description{\n\\code{percent()} formats \\code{x} as a percentage.\nFor a wider range of formatters, consider the \\href{https://cran.r-project.org/package=scales}{\\code{scales} package}.\n}\n\\examples{\npercent(0.5)\n}\n"
  },
  {
    "path": "man/santoku-cast.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/santoku-cast.R\n\\name{santoku-cast}\n\\alias{santoku-cast}\n\\alias{santoku_cast_common.default}\n\\alias{santoku_cast_common.double}\n\\alias{santoku_cast_common.Date}\n\\alias{santoku_cast_common.POSIXct}\n\\alias{santoku_cast_common.ts}\n\\alias{santoku_cast_common.zoo}\n\\alias{santoku_cast_common.integer64}\n\\alias{santoku_cast_common.hexmode}\n\\alias{santoku_cast_common.octmode}\n\\title{Internal functions}\n\\usage{\n\\method{santoku_cast_common}{default}(x, y)\n\n\\method{santoku_cast_common}{double}(x, y)\n\n\\method{santoku_cast_common}{Date}(x, y)\n\n\\method{santoku_cast_common}{POSIXct}(x, y)\n\n\\method{santoku_cast_common}{ts}(x, y)\n\n\\method{santoku_cast_common}{zoo}(x, y)\n\n\\method{santoku_cast_common}{integer64}(x, y)\n\n\\method{santoku_cast_common}{hexmode}(x, y)\n\n\\method{santoku_cast_common}{octmode}(x, y)\n}\n\\arguments{\n\\item{x, y}{Vectors to cast.}\n}\n\\value{\nA list.\n}\n\\description{\nInternal functions\n}\n\\keyword{Do}\n\\keyword{These}\n\\keyword{are}\n\\keyword{functions.}\n\\keyword{internal}\n\\keyword{not}\n\\keyword{use.}\n"
  },
  {
    "path": "man/santoku-package.Rd",
    "content": "% Generated by roxygen2: do not edit by hand\n% Please edit documentation in R/santoku-package.R\n\\docType{package}\n\\name{santoku-package}\n\\alias{santoku}\n\\alias{santoku-package}\n\\title{A versatile cutting tool for R: package overview and options}\n\\description{\nsantoku is a tool for cutting data into intervals. It provides\nthe function \\code{\\link[=chop]{chop()}}, which is similar to base R's \\code{\\link[=cut]{cut()}} or \\code{Hmisc::cut2()}.\n\\code{chop(x, breaks)} takes a vector \\code{x} and returns a factor of the\nsame length, coding which interval each element of \\code{x} falls into.\n}\n\\details{\nHere are some advantages of santoku:\n\\itemize{\n\\item By default, \\code{chop()} always covers the whole range of the data, so you\nwon't get unexpected \\code{NA} values.\n\\item Unlike \\code{cut()} or \\code{cut2()}, \\code{chop()} can handle single values as well as\nintervals. For example, \\code{chop(x, breaks = c(1, 2, 2, 3))} will create a\nseparate factor level for values exactly equal to 2.\n\\item Flexible and easy labelling.\n\\item Convenience functions for creating quantile intervals, evenly-spaced\nintervals or equal-sized groups.\n\\item Convenience functions to quickly tabulate chopped data.\n\\item Can chop numbers, dates, date-times and other objects.\n}\n\nThese advantages make santoku especially useful for exploratory analysis,\nwhere you may not know the range of your data in advance.\n\nTo get started, read the vignette:\n\n\\if{html}{\\out{<div class=\"sourceCode r\">}}\\preformatted{vignette(\"santoku\")\n}\\if{html}{\\out{</div>}}\n\nFor more details, start with the documentation for \\code{\\link[=chop]{chop()}}.\n}\n\\section{Options}{\nSantoku has two options:\n\\itemize{\n\\item \\code{options(\"santoku.infinity\")} sets the symbol for infinity in breaks. The default is\n\\code{NULL}, in which case the infinity symbol is used on platforms that support it, otherwise\n\\code{\"Inf\"} is used.\n\\item \\code{options(\"santoku.warn_character\")} warns if you try to chop a character vector. Set to\n\\code{FALSE} to turn off this warning.\n}\n}\n\n\\seealso{\nUseful links:\n\\itemize{\n  \\item \\url{https://github.com/hughjonesd/santoku}\n  \\item \\url{https://hughjonesd.github.io/santoku/}\n  \\item Report bugs at \\url{https://github.com/hughjonesd/santoku/issues}\n}\n\n}\n\\author{\n\\strong{Maintainer}: David Hugh-Jones \\email{davidhughjones@gmail.com}\n\nOther contributors:\n\\itemize{\n  \\item Daniel Possenriede \\email{possenriede@gmail.com} [contributor]\n}\n\n}\n"
  },
  {
    "path": "pkgdown/extra.css",
    "content": "pre code span.fu      {color: #F9EA6B;}  /* function */\npre code span.kw      {color: #F9EA6B;}  /* keyword */\npre code span.va      {color: #89b0dd;}  /* keyword */\npre code span.op      {color: white;}  /* ? */"
  },
  {
    "path": "release-process.R",
    "content": "\n# ensure version is correct, then:\n# run line by line (some commands require command line input)\ndevtools::check_win_devel()\ndevtools::check_win_release()\ndevtools::check_mac_release()\ndevtools::check()\ndevtools::spell_check()\nrevdepcheck::revdep_check()\n# make sure you've put comments in cran-comments.md\n\n# install the new version\n# IF YOU WANT TO KEEP WEBSITE ON THE CRAN VERSION:\n# do this on branch website-x.y.z. Then you can commit and push changes without\n# devtools complaining about uncommitted changes.\n# OTHERWISE, JUST DO THIS ON MASTER\npkgdown::build_site()\n\nmy_home <- \"~/hughjonesd.github.io/\"\nrmarkdown::render(\"vignettes/tutorials/visual-introduction.Rmd\",\n      output_dir = my_home)\nfile.copy(\"vignettes/tutorials/chopping-dates-with-santoku.Rmd\", my_home,\n            overwrite = TRUE)\nfile.copy(\"vignettes/tutorials/figures\", my_home, recursive = TRUE)\nwithr::with_dir(my_home,\n  rmarkdown::render(\"chopping-dates-with-santoku.Rmd\")\n)\n# but don't push yet! it affects what is seen from the website...\n# NB you may need to update the README on master, as this is part\n# of the package.\n\n# Now back to master:\ndevtools::release()\n\n# when it's accepted:\n# - merge website-x.y.z into master\n# - push hughjonesd.github.io\n# - usethis::use_github_release()\n"
  },
  {
    "path": "santoku.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: pdfLaTeX\n\nStripTrailingWhitespace: Yes\n\nBuildType: Package\nPackageUseDevtools: Yes\nPackageInstallArgs: --no-multiarch --with-keep.source\nPackageRoxygenize: rd,collate,namespace\n"
  },
  {
    "path": "src/.gitignore",
    "content": "*.o\n*.so\n*.dll\n"
  },
  {
    "path": "src/RcppExports.cpp",
    "content": "// Generated by using Rcpp::compileAttributes() -> do not edit by hand\n// Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393\n\n#include <Rcpp.h>\n\nusing namespace Rcpp;\n\n#ifdef RCPP_USE_GLOBAL_ROSTREAM\nRcpp::Rostream<true>&  Rcpp::Rcout = Rcpp::Rcpp_cout_get();\nRcpp::Rostream<false>& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get();\n#endif\n\n// categorize_impl\nIntegerVector categorize_impl(NumericVector x, NumericVector breaks, LogicalVector left);\nRcppExport SEXP _santoku_categorize_impl(SEXP xSEXP, SEXP breaksSEXP, SEXP leftSEXP) {\nBEGIN_RCPP\n    Rcpp::RObject rcpp_result_gen;\n    Rcpp::RNGScope rcpp_rngScope_gen;\n    Rcpp::traits::input_parameter< NumericVector >::type x(xSEXP);\n    Rcpp::traits::input_parameter< NumericVector >::type breaks(breaksSEXP);\n    Rcpp::traits::input_parameter< LogicalVector >::type left(leftSEXP);\n    rcpp_result_gen = Rcpp::wrap(categorize_impl(x, breaks, left));\n    return rcpp_result_gen;\nEND_RCPP\n}\n\nstatic const R_CallMethodDef CallEntries[] = {\n    {\"_santoku_categorize_impl\", (DL_FUNC) &_santoku_categorize_impl, 3},\n    {NULL, NULL, 0}\n};\n\nRcppExport void R_init_santoku(DllInfo *dll) {\n    R_registerRoutines(dll, NULL, CallEntries, NULL, NULL);\n    R_useDynamicSymbols(dll, FALSE);\n}\n"
  },
  {
    "path": "src/categorize.cpp",
    "content": "#include <Rcpp.h>\nusing namespace Rcpp;\n\n// [[Rcpp::export]]\nIntegerVector categorize_impl(NumericVector x, NumericVector breaks, LogicalVector left) {\n  int xs = x.size();\n  int bs = breaks.size();\n  if (left.size() != bs) Rcpp::stop(\"`left` of different size to `breaks`\");\n\n  IntegerVector codes(xs, NA_INTEGER);\n  \n  // Handle empty vectors\n  if (xs == 0) return codes;\n\n  // Use raw pointers for direct memory access - provides ~5-10% speedup\n  double* x_ptr = &x[0];\n  double* breaks_ptr = &breaks[0];\n  int* left_ptr = &left[0];\n  int* codes_ptr = &codes[0];\n\n  for (int i = 0; i < xs; ++i) {\n    double val = x_ptr[i];\n    for (int j = 0; j < bs - 1; ++j) {\n      if ((val > breaks_ptr[j] || (left_ptr[j] && val == breaks_ptr[j])) &&\n        (val < breaks_ptr[j + 1] || (! left_ptr[j + 1] && val == breaks_ptr[j + 1]))) {\n        codes_ptr[i] = j + 1;\n        break;\n      }\n    }\n  }\n\n  return codes;\n}\n"
  },
  {
    "path": "tests/testthat/test-Date-DateTime.R",
    "content": "\nd1 <- seq(as.Date(\"1975-10-27\"), as.Date(\"1975-11-27\"), by = \"day\")\n\ndb1 <- as.Date(c(\"1975-11-01\", \"1975-11-15\"))\n\ndt1 <- seq(as.POSIXct(\"2000-01-01 15:00\"), length = 20, by = \"1 min\")\n\ndtb1 <- dt1[c(5, 15)]\n\ntable_vals <- function (x) unclass(table(x))\n\n\ntest_that(\"Basic chop\", {\n  expect_silent(chop(d1, db1))\n  expect_silent(chop(dt1, dtb1))\n})\n\n\ntest_that(\"Chop with conversion\", {\n  lb <- lbl_seq()\n  withr::with_timezone(\"UTC\", {\n    expect_equal(chop(d1, db1, lb), chop(as.POSIXct(d1), db1, lb), ignore_attr = TRUE)\n    expect_equal(chop(d1, db1, lb), chop(d1, as.POSIXct(db1), lb), ignore_attr = TRUE)\n  })\n})\n\n\ntest_that(\"Basic breaks\", {\n  expect_silent(brk_res(brk_default(db1), d1, extend = FALSE))\n  expect_silent(brk_res(brk_default(db1), d1, extend = NULL))\n  expect_silent(brk_res(brk_default(db1), d1, extend = TRUE))\n\n  expect_silent(brk_res(brk_default(db1), d1, left = FALSE))\n  expect_silent(brk_res(brk_default(db1), d1, close_end = TRUE))\n  expect_silent(brk_res(brk_default(db1), d1, left = FALSE, close_end = TRUE))\n})\n\n\ntest_that(\"chop_equally\", {\n  expect_silent(res <- chop_equally(d1, groups = 4))\n  expect_equal(table_vals(res), rep(8, 4), ignore_attr = TRUE)\n\n  expect_silent(res2 <- chop_equally(dt1, groups = 4))\n  expect_equal(table_vals(res2), rep(5, 4), ignore_attr = TRUE)\n})\n\n\ntest_that(\"chop_n\", {\n  expect_silent(res <- chop_n(d1, 4))\n  expect_equal(table_vals(res), rep(4, 8), ignore_attr = TRUE)\n\n  expect_silent(res2 <- chop_n(dt1, 5))\n  expect_equal(table_vals(res2), rep(5, 4), ignore_attr = TRUE)\n})\n\n\ntest_that(\"chop_quantiles\", {\n  # `left = FALSE` works better with type 1 quantiles, which round down.\n  expect_silent(res1 <- chop_quantiles(d1, 0:4/4, left = FALSE))\n  expect_equal(table_vals(res1), rep(8, 4), ignore_attr = TRUE)\n\n  expect_silent(res2 <- chop_quantiles(dt1, 0:5/5, left = FALSE))\n  expect_equal(table_vals(res2), rep(4, 5), ignore_attr = TRUE)\n})\n\n\ntest_that(\"chop_mean_sd\", {\n  expect_silent(res <- chop_mean_sd(d1))\n  cmp <- cut(d1, mean(d1) + (-2:2) * sd(d1), right = FALSE)\n  expect_equal(table_vals(res), table_vals(cmp), ignore_attr = TRUE)\n\n  expect_silent(res2 <- chop_mean_sd(dt1))\n  cmp2 <- cut(dt1, mean(dt1) + (-2:2) * sd(dt1), right = FALSE)\n  expect_equal(table_vals(res2), table_vals(cmp2), ignore_attr = TRUE)\n\n  expect_silent(res3 <- chop_mean_sd(d1, c(1, 1.4)))\n  # the -10 and 10 capture values outside 1.4 sds:\n  cmp3 <- cut(d1,  mean(d1) + c(-10, -1.4, -1, 0, 1, 1.4, 10) * sd(d1), right = FALSE)\n  expect_equal(table_vals(res3), table_vals(cmp3), ignore_attr = TRUE)\n})\n\n\ntest_that(\"chop_pretty\", {\n  expect_silent(res <- chop_pretty(d1))\n  cmp <- chop(d1, base::pretty(d1))\n  expect_equal(\n    table_vals(res),\n    table_vals(cmp),\n    ignore_attr = TRUE\n  )\n})\n\n\ntest_that(\"chop_width: difftime\", {\n  difftime_w1 <- as.difftime(4, units = \"days\")\n\n  expect_silent(res1 <- chop_width(d1, width = difftime_w1))\n  expect_equal(table_vals(res1), rep(4, 8), ignore_attr = TRUE)\n\n  expect_silent(\n    res2 <- chop_width(d1, width = difftime_w1, start = as.Date(\"1975-11-01\"))\n  )\n  tv <- table_vals(res2)\n  expect_true(all(tv[c(-1, -length(tv))] == 4))\n\n  difftime_w2 <- as.difftime(5, units = \"mins\")\n\n  expect_silent(res3 <- chop_width(dt1, width = difftime_w2))\n  expect_equal(table_vals(res3), rep(5, 4), ignore_attr = TRUE)\n\n  expect_silent(\n    res4 <- chop_width(dt1, width = difftime_w2,\n          start = as.POSIXct(\"2000-01-01 15:10\"))\n  )\n  expect_equal(table_vals(res4), c(10, 5, 5), ignore_attr = TRUE)\n\n  expect_silent(\n    res5 <- chop_width(d1, width = as.difftime(-4, units = \"days\"))\n  )\n  expect_equal(table_vals(res5), rep(4, 8), ignore_attr = TRUE)\n\n  expect_silent(\n    res6 <- chop_width(d1, width = as.difftime(-4, units = \"days\"),\n          start = as.Date(\"1975-11-25\"))\n  )\n  tv <- table_vals(res6)\n  expect_true(all(tv[c(-1, -length(tv))] == 4))\n\n  expect_silent(\n    res7 <- chop_width(dt1, width = as.difftime(-5, units = \"mins\"))\n  )\n  expect_equal(table_vals(res7), rep(5, 4), ignore_attr = TRUE)\n\n  expect_silent(chop_width(d1, as.difftime(7, units = \"days\")))\n  expect_silent(chop_width(dt1, as.difftime(7, units = \"mins\")))\n})\n\n\ntest_that(\"chop_width: Duration\", {\n  skip_if_not_installed(\"lubridate\")\n  library(lubridate)\n\n  duration_w1 <- ddays(4)\n\n  expect_silent(res1 <- chop_width(d1, width = duration_w1))\n  expect_equal(table_vals(res1), rep(4, 8), ignore_attr = TRUE)\n\n  expect_silent(\n    res2 <- chop_width(d1, width = duration_w1, start = as.Date(\"1975-11-16\"))\n  )\n  expect_equal(table_vals(res2), c(20, 4, 4, 4), ignore_attr = TRUE)\n\n  duration_w2 <- dminutes(5)\n\n  expect_silent(res3 <- chop_width(dt1, width = duration_w2))\n  expect_equal(table_vals(res3), rep(5, 4), ignore_attr = TRUE)\n\n  expect_silent(\n    res4 <- chop_width(dt1, duration_w2, start = as.POSIXct(\"2000-01-01 15:10\"))\n  )\n  expect_equal(table_vals(res4), c(10, 5, 5), ignore_attr = TRUE)\n\n  expect_silent(chop_width(d1, ddays(7)))\n  expect_silent(chop_width(dt1, dminutes(7)))\n})\n\n\ntest_that(\"chop_width: Period\", {\n  skip_if_not_installed(\"lubridate\")\n  library(lubridate)\n\n  period_w1 <- days(8)\n\n  expect_silent(res1 <- chop_width(d1, width = period_w1))\n  expect_equal(table_vals(res1), rep(8, 4), ignore_attr = TRUE)\n\n  expect_silent(\n    res2 <- chop_width(d1, period_w1, start = as.Date(\"1975-11-12\"))\n  )\n  expect_equal(table_vals(res2), c(16, 8, 8), ignore_attr = TRUE)\n\n  period_w2 <- minutes(5)\n\n  expect_silent(res3 <- chop_width(dt1, width = period_w2))\n  expect_equal(table_vals(res3), rep(5, 4), ignore_attr = TRUE)\n\n  expect_silent(\n    res4 <- chop_width(dt1, period_w2, start = as.POSIXct(\"2000-01-01 15:07\"))\n  )\n  expect_equal(table_vals(res4), c(7, 5, 5, 3), ignore_attr = TRUE)\n\n  expect_silent(chop_width(d1, days(7)))\n  expect_silent(chop_width(dt1, minutes(7)))\n\n  # TODO: include tests that Period deals with quirks\n})\n\n\ntest_that(\"chop_width: Period quirks\", {\n  skip_if_not_installed(\"lubridate\")\n  library(lubridate)\n\n  noughties <- seq(as.Date(\"2000-01-01\"), as.Date(\"2009-12-31\"), by = \"day\")\n\n  res1 <- chop_width(noughties, years(1))\n  expect_equal(\n    table_vals(res1),\n    c(366, 365, 365, 365, 366, 365, 365, 365, 366, 365),\n    ignore_attr = TRUE\n  )\n\n  y2k <- seq(as.Date(\"2000-01-01\"), as.Date(\"2000-12-31\"), by = \"day\")\n  res2 <- chop_width(y2k, months(1))\n  expect_equal(\n    table_vals(res2),\n    c(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31),\n    ignore_attr = TRUE\n  )\n})\n\n\ntest_that(\"chop_evenly\", {\n  expect_silent(res1 <- chop_evenly(d1, 8))\n  expect_equal(table_vals(res1), rep(4, 8), ignore_attr = TRUE)\n\n  expect_silent(res2 <- chop_evenly(dt1, 4))\n  expect_equal(table_vals(res2), rep(5, 4), ignore_attr = TRUE)\n\n  expect_silent(chop_evenly(d1, 7))\n  expect_silent(chop_evenly(dt1, 7))\n})\n\n\ntest_that(\"brk_spikes\", {\n  d_reps <- c(rep(d1[3], 5), d1[-3])\n\n  expect_silent(\n    res <- chop(d_reps, brk_spikes(db1, n = 5))\n  )\n\n  expect_in(\"{1975-10-29}\", levels(res))\n  expect_equal(sum(res == \"{1975-10-29}\"), 5, ignore_attr = TRUE)\n})\n\n\ntest_that(\"chop timezones\", {\n  dt_z1 <- seq(as.POSIXct(\"2000-01-01 09:00:00\", tz = \"GMT\"),\n        by = \"hour\", length.out = 24)\n  # 8 hours behind. Hi Tom and Dan!\n  dtb_z2 <- as.POSIXct(\"2000-01-01 12:30:00\", tz = \"America/Los_Angeles\")\n\n  res1 <- chop(dt_z1, dtb_z2)\n  expect_equal(table_vals(res1), c(12, 12), ignore_attr = TRUE)\n  # we convert breaks to the timezone of x\n  expect_match(levels(res1), \"20:30\", fixed = TRUE)\n})\n\n\ntest_that(\"Date labels\", {\n  li <- lbl_intervals()\n  b <- brk_res(brk_default(db1), close_end = FALSE)\n  expect_equal(\n    li(b), \"[1975-11-01, 1975-11-15)\"\n  , ignore_attr = TRUE)\n\n  withr::local_options(santoku.infinity = \"Inf\")\n  b2 <- brk_res(brk_default(db1), x = as.Date(\"1975-01-01\"), extend = TRUE,\n                close_end = FALSE)\n  expect_equal(\n    li(b2), c(\"[-Inf, 1975-11-01)\", \"[1975-11-01, 1975-11-15)\", \"[1975-11-15, Inf]\")\n  , ignore_attr = TRUE)\n\n  expect_equal(\n    lbl_intervals(fmt = \"%y %m %d\")(b),\n    \"[75 11 01, 75 11 15)\"\n  , ignore_attr = TRUE)\n\n  expect_equal(\n    lbl_dash(\" to \")(b),\n    \"1975-11-01 to 1975-11-15\"\n  , ignore_attr = TRUE)\n\n  expect_equal(\n    lbl_dash(\" to \", fmt = \"%d/%m\")(b),\n    \"01/11 to 15/11\"\n  , ignore_attr = TRUE)\n})\n\n\ntest_that(\"POSIXct labels\", {\n  li <- lbl_intervals()\n  b <- brk_res(brk_default(dtb1), close_end = FALSE)\n  expect_equal(\n    li(b), \"[2000-01-01 15:04:00, 2000-01-01 15:14:00)\"\n  , ignore_attr = TRUE)\n\n  withr::local_options(santoku.infinity = \"Inf\")\n  b2 <- brk_res(brk_default(dtb1), x = as.POSIXct(\"2000-01-01 15:00:00\"), extend = TRUE)\n  expect_equal(\n    li(b2), c(\"[-Inf, 2000-01-01 15:04:00)\",\n              \"[2000-01-01 15:04:00, 2000-01-01 15:14:00)\",\n              \"[2000-01-01 15:14:00, Inf]\")\n  , ignore_attr = TRUE)\n\n  expect_equal(\n    lbl_intervals(fmt = \"%H:%M\")(b),\n    \"[15:04, 15:14)\"\n  , ignore_attr = TRUE)\n\n  expect_equal(\n    lbl_dash(\" to \")(b),\n    \"2000-01-01 15:04:00 to 2000-01-01 15:14:00\"\n  , ignore_attr = TRUE)\n\n  expect_equal(\n    lbl_dash(\" to \", fmt = \"%H.%M\")(b),\n    \"15.04 to 15.14\"\n  , ignore_attr = TRUE)\n})\n"
  },
  {
    "path": "tests/testthat/test-breaks.R",
    "content": "\n\ntest_that(\"brk_manual\", {\n  for (l in c(TRUE, FALSE)) for (r in c(TRUE, FALSE)) {\n    expect_silent(x <- brk_res(brk_manual(1:2, c(l, r))))\n    expect_s3_class(x, \"breaks\")\n  }\n\n  expect_error(brk_res(brk_manual(c(2, 2), c(TRUE, TRUE))))\n  expect_error(brk_res(brk_manual(c(2, 2), c(FALSE, TRUE))))\n  expect_error(brk_res(brk_manual(c(2, 2), c(FALSE, FALSE))))\n  expect_silent(brk_res(brk_manual(c(2, 2), c(TRUE, FALSE))))\n\n  expect_error(brk_res(brk_manual(1, c(TRUE, FALSE))))\n  expect_error(brk_res(brk_manual(1:2, c(TRUE))))\n  expect_error(brk_res(brk_manual(\"a\", TRUE)))\n  expect_error(brk_res(brk_manual(1, \"c\")))\n\n  expect_error(brk_res(brk_manual(c(1, NA), c(TRUE, TRUE))))\n  expect_error(brk_res(brk_manual(2:1, c(TRUE, TRUE))))\n\n  expect_error(brk_res(brk_manual(c(1, 2, 2, 2, 3), rep(TRUE, 5))),\n        regexp = \"equal\")\n\n  expect_warning(brk_res(brk_manual(1:3, rep(TRUE, 3)), left = FALSE))\n  expect_warning(brk_res(brk_manual(1:3, rep(TRUE, 3)), close_end = FALSE))\n})\n\n\ntest_that(\"brk_n\", {\n  for (i in 1:10) {\n    x <- rnorm(sample(10:20, 1L))\n    b <- sample(5L, 1L)\n    expect_true(all(tab(!!x, brk_n(!!b), drop = TRUE) <= !!b),\n          info = sprintf(\"length(x) %s b %s\", length(x), b))\n    # right-closed breaks\n    expect_true(all(tab(!!x, brk_n(!!b), drop = TRUE, left = FALSE) <= !!b),\n                info = sprintf(\"length(x) %s b %s left = FALSE\", length(x), b))\n  }\n\n  # test with duplicates in x\n  for (i in 1:10) {\n    x <- rnorm(10)\n    x <- sample(x, replace = TRUE)\n    b <- sample(5L, 1L)\n    tbl <- tab(x, brk_n(b), drop = TRUE)\n    # all but the last category should have size >= b\n    expect_true(all(tbl[-length(tbl)] >= b),\n          info = sprintf(\"length(x) %s b %s\", length(x), b))\n    # right-closed breaks\n    tbl <- tab(x, brk_n(b), drop = TRUE, left = FALSE)\n    expect_true(all(tbl[-1] >= b),\n          info = sprintf(\"length(x) %s b %s\", length(x), b))\n  }\n})\n\n\ntest_that(\"brk_n, tail = 'merge'\", {\n  x <- 1:5\n  res <- brk_res(brk_n(3, tail = \"merge\"), x = x)\n  expect_equal(as.vector(tab(x, res)), 5)\n\n  x <- 1:6\n  res <- brk_res(brk_n(3, tail = \"merge\"), x = x)\n  expect_equal(as.vector(tab(x, res)), c(3, 3))\n\n  x <- 1:7\n  res <- brk_res(brk_n(3, tail = \"merge\"), x = x)\n  expect_equal(as.vector(tab(x, res)), c(3, 4))\n\n  x <- c(1, 1, 1, 2, 2)\n  res <- brk_res(brk_n(3, tail = \"merge\"), x = x)\n  expect_equal(as.vector(tab(x, res)), 5)\n\n  x <- c(1, 1, 1, 2, 2, 2)\n  res <- brk_res(brk_n(3, tail = \"merge\"), x = x)\n  expect_equal(as.vector(tab(x, res)), c(3, 3))\n\n  x <- c(1, 1, 1, 2, 2, 2, 2)\n  res <- brk_res(brk_n(3, tail = \"merge\"), x = x)\n  expect_equal(as.vector(tab(x, res)), c(3, 4))\n})\n\n\ntest_that(\"bugfix: brk_n shouldn't error with too many non-unique values\", {\n  expect_error(\n    brk_res(brk_n(2), x = c(1, 1, 1, 1, 5, 5, 5, 5)),\n    regexp = NA\n  )\n})\n\n\ntest_that(\"bugfix: brk_n shouldn't take too few elems after non-unique values\", {\n  x <- c(1, 1, 1, 1, 2, 3, 4)\n  res <- brk_res(brk_n(3), x = x)\n  expect_equal(as.vector(tab(x, res)), c(4, 3))\n\n  x <- c(1, 2, 3, 3, 4, 5, 6)\n  res <- brk_res(brk_n(3), x = x)\n  expect_equal(as.vector(tab(x, res)), c(4, 3))\n\n  x <- c(1, 2, 3, 3, 4)\n  res <- brk_res(brk_n(2), x = x)\n  expect_equal(as.vector(tab(x, res)), c(2, 2, 1))\n})\n\n\ntest_that(\"brk_width\", {\n  b <- brk_res(brk_width(1), 0.5:1.5)\n  expect_equal(diff(as.vector(b)), 1)\n\n  width <- runif(1)\n  b <- brk_res(brk_width(width), 0.5:1.5)\n  bvec <- as.vector(b)\n  expect_equal(diff(bvec)[1], width)\n  expect_equal(bvec[1], 0.5)\n\n  b <- brk_res(brk_width(1), rep(NA, 2))\n  expect_identical(as.vector(b), c(-Inf, Inf))\n\n  b <- brk_res(brk_width(1), c(Inf, -Inf, NA))\n  expect_identical(as.vector(b), c(-Inf, Inf))\n\n  b <- brk_res(brk_width(1), c(NA, 2, 4, NA))\n  expect_equal(diff(as.vector(b))[1], 1)\n})\n\n\ntest_that(\"brk_width, negative width\", {\n  b <- brk_res(brk_width(-1), 0.5:1.5)\n  expect_equal(diff(as.vector(b)), 1)\n\n  width <- runif(1, min = -1, max = 0)\n  b <- brk_res(brk_width(width), 0.5:1.5)\n  bvec <- as.vector(b)\n  expect_equal(diff(bvec)[1], -width)\n  expect_equal(bvec[length(bvec)], 1.5)\n\n  b <- brk_res(brk_width(-2, start = 2.5), 0:4)\n  expect_identical(as.vector(b), c(-1.5, 0.5, 2.5))\n})\n\n\ntest_that(\"brk_evenly\", {\n  b <- brk_res(brk_evenly(5), 0:10)\n  expect_identical(as.vector(b), c(0, 2, 4, 6, 8, 10))\n})\n\n\ntest_that(\"brk_proportions\", {\n  b <- brk_res(brk_proportions(c(0.2, 0.8)), 0:10)\n  expect_identical(as.vector(b), c(2, 8))\n\n  expect_error(brk_proportions(c(0, 1, 2)))\n  expect_error(brk_proportions(c(-1, 0.5)))\n  expect_error(brk_proportions(c(0.5, NA)))\n})\n\n\ntest_that(\"brk_mean_sd\", {\n  x <- rnorm(100)\n  expect_silent(b <- brk_res(brk_mean_sd(1:3), x = x))\n  m <- mean(x)\n  sd <- sd(x)\n  sd_ints <- seq(m - 3 * sd, m + 3 * sd, sd)\n  expect_equal(as.numeric(b), sd_ints)\n\n  expect_silent(brk_res(brk_mean_sd(1:3), x = rep(NA, 2)))\n  expect_silent(brk_res(brk_mean_sd(1:3), x = rep(1, 3)))\n  expect_silent(brk_res(brk_mean_sd(1:3), x = 1))\n\n  lifecycle::expect_deprecated(res <- brk_res(brk_mean_sd(sd = 3)))\n  expect_equal(\n    res, brk_res(brk_mean_sd(1:3))\n  )\n})\n\n\ntest_that(\"brk_quantiles\", {\n  expect_silent(brk_res(brk_quantiles(1:3/4)))\n\n  x <- 1:10\n  brks <- brk_quantiles(1:3/4)(x, FALSE, TRUE, FALSE)\n  expect_equal(c(brks), quantile(x, 1:3/4), ignore_attr = TRUE)\n\n  expect_silent(brks <- brk_quantiles(numeric(0))(x, TRUE, TRUE, FALSE))\n  expect_equal(c(brks), c(-Inf, Inf))\n\n  x <- 1:10\n  brks <- brk_quantiles(1:3/4, weights = 1:10)(x, FALSE, TRUE, FALSE)\n  expect_equal(\n    c(brks),\n    Hmisc::wtd.quantile(x, weights = 1:10, probs = 1:3/4),\n    ignore_attr = TRUE\n  )\n})\n\n\ntest_that(\"brk_quantiles with duplicate quantiles\", {\n  x <- rep(1, 5)\n  expect_warning(brks <- brk_quantiles(1:3/4)(x, FALSE, TRUE, FALSE))\n  expect_equal(c(brks), c(1, 1))\n\n  x <- c(1, 1, 2, 3, 4)\n  expect_warning(brks <- brk_quantiles(0:5/5)(x, FALSE, TRUE, FALSE))\n  expect_equal(c(brks), c(1.0, 1.0, 1.6, 2.4, 3.2, 4.0))\n\n  x <- c(1, 1, 1, 2, 3)\n  expect_warning(brks <- brk_quantiles(0:5/5)(x, FALSE, TRUE, FALSE))\n  expect_equal(c(brks), c(1.0, 1.0, 1.4, 2.2, 3.0))\n\n  expect_silent(\n    brks <- brk_quantiles(0:5/5, recalc_probs = TRUE)(x, FALSE, TRUE, FALSE)\n  )\n  expect_equal(c(brks), c(1.0, 1.0, 1.4, 2.2, 3.0))\n})\n\n\ntest_that(\"brk_equally\", {\n  expect_silent(brk_res(brk_equally(5)))\n  expect_error(brk_equally(4.5))\n\n  brks <- brk_res(brk_equally(3))\n  expect_equal(brks, brk_res(brk_quantiles(0:3/3)))\n})\n\n\ntest_that(\"brk_equally warns when too few breaks created\", {\n  dupes <- rep(1, 4)\n  expect_warning(brk_res(brk_equally(4), x = dupes))\n})\n\n\ntest_that(\"brk_pretty\", {\n  expect_silent(brks <- brk_res(brk_pretty(5), x = 1:10))\n  expect_equal(brks, brk_res(brk_default(pretty(1:10)), x = 1:10))\n\n  expect_silent(brks2 <- brk_res(brk_pretty(5, high.u.bias = 0), x = 1:10))\n  expect_equal(\n    brks2,\n    brk_res(brk_default(pretty(1:10, high.u.bias = 0)), x = 1:10)\n  )\n})\n\n\ntest_that(\"brk_fn\", {\n  x <- 1:10\n  expect_silent(\n    brks <- brk_res(brk_fn(scales::breaks_extended(5)), x = x)\n  )\n  expect_equal(\n    brks,\n    brk_res(brk_default(scales::breaks_extended(5)(x)))\n  )\n\n  expect_silent(\n    brks2 <- brk_res(brk_fn(pretty, n = 10), x = x)\n  )\n  expect_equal(\n    brks2,\n    brk_res(brk_default(pretty(x, n = 10)), x = x)\n  )\n})\n\n\ntest_that(\"brk_spikes\", {\n  x <- c(rep(5, 5), 1:10)\n\n  expect_silent(\n    brks <- brk_res(brk_spikes(c(2, 8), n = 5), x = x)\n  )\n  expect_equal(\n    c(brks),\n    c(2, 5, 5, 8)\n  )\n\n  expect_silent(\n    brks2 <- brk_res(brk_spikes(c(2, 5, 8), n = 5), x = x)\n  )\n  expect_equal(\n    c(brks2),\n    c(2, 5, 5, 8)\n  )\n\n  expect_silent(\n    brks3 <- brk_res(brk_spikes(c(2, 5, 5, 8), n = 5), x = x)\n  )\n  expect_equal(\n    c(brks3),\n    c(2, 5, 5, 8)\n  )\n\n  x2 <- c(1, 1, 1, 2, 3, 3, 4, 4, 4, 4, 5, 6, 7, 8, 8, 8, 9)\n  expect_silent(\n    brks3.1 <- brk_res(brk_spikes(c(2, 8), n = 3), x = x2)\n  )\n  expect_equal(\n    c(brks3.1),\n    c(1, 1, 2, 4, 4, 8, 8)\n  )\n\n  expect_silent(\n    brks4 <- brk_res(brk_spikes(brk_width(5), n = 5), x = x)\n  )\n  expect_equal(\n    c(brks4),\n    c(1, 5, 5, 6, 11)\n  )\n\n  expect_silent(\n    brks5 <- brk_res(brk_spikes(c(2, 8), prop = 0.4), x = x)\n  )\n  expect_equal(\n    c(brks5),\n    c(2, 5, 5, 8)\n  )\n\n  expect_error(\n    brk_spikes(c(2, 8), n = 5, prop = 0.5)\n  )\n\n  expect_error(\n    brk_spikes(c(2, 8))\n  )\n})\n\n\ntest_that(\"printing\", {\n  b <- brk_res(brk_default(1:3))\n  expect_output(print(b))\n  expect_silent(format(b))\n  b_empty <- brk_res(brk_default(1))\n  expect_output(print(b_empty))\n})\n"
  },
  {
    "path": "tests/testthat/test-categorize.R",
    "content": "\ntest_that(\"brk_manual\", {\n  expect_silent(brk_res(brk_manual(1:3, c(TRUE, TRUE, TRUE))))\n  expect_silent(brk_res(brk_manual(c(1, 2, 2, 3), c(TRUE, TRUE, FALSE, TRUE))))\n  expect_silent(brk_res(brk_manual(c(-Inf, 1, Inf), rep(TRUE, 3))))\n\n  # singletons must have FALSE, TRUE\n  expect_error(brk_res(brk_manual(c(1, 2, 2, 3), c(TRUE, FALSE, FALSE, TRUE))))\n  # out of order:\n  expect_error(brk_res(brk_manual(c(0, 3, 1), c(TRUE, TRUE, TRUE))))\n})\n\n\ntest_that(\"categorize works\", {\n\n  x <- seq(0.5, 3.5, 0.5)\n\n  breaks <- brk_res(brk_manual(1:3, c(TRUE, TRUE, TRUE)))\n  r <- categorize(x, breaks)\n  expect_equal(r, c(NA, 1, 1, 2, 2, NA, NA))\n\n  breaks <- brk_res(brk_manual(1:3, c(TRUE, TRUE, FALSE)))\n  r <- categorize(x, breaks)\n  expect_equal(r, c(NA, 1, 1, 2, 2, 2, NA))\n\n  breaks <- brk_res(brk_manual(c(1, 2, 2, 3), c(TRUE, TRUE, FALSE, TRUE)))\n  r <- categorize(x, breaks)\n  expect_equal(r, c(NA, 1, 1, 2, 3, NA, NA))\n\n  x <- c(Inf, 1, -Inf, NA, NaN)\n  breaks <- brk_res(brk_manual(1:3, c(TRUE, TRUE, TRUE)))\n  r <- categorize(x, breaks)\n  expect_equal(r, c(NA, 1, NA, NA, NA))\n})\n\n\ntest_that(\"categorize_impl/categorize_non_numeric equivalence\", {\n  replicate(100, {\n    n <- 10\n    x <- rnorm(n) * 10\n\n    breaks_pop <- c(-Inf, -5:5, Inf)\n    b <- sort(sample(breaks_pop, n, replace = FALSE))\n    left <- sample(c(TRUE, FALSE), n, replace = TRUE)\n    x[c(3,5,7)] <- sample(breaks_pop, 3)\n\n    b[3] <- b[2]\n    b[8] <- b[7]\n    left[2:3] <- left[7:8] <- c(TRUE, FALSE)\n\n    ci <- categorize_impl(x, b, left)\n    cnn <- categorize_non_numeric(x, b, left)\n    expect_equal(ci, cnn)\n  })\n})\n"
  },
  {
    "path": "tests/testthat/test-chop.R",
    "content": "\ntest_that(\"basic functionality\", {\n  x <- 1:3\n  lbrks <- brk_manual(1:3, rep(TRUE, 3))\n  rbrks <- brk_manual(1:3, rep(FALSE, 3))\n  rc_brks <- brk_manual(1:3, c(TRUE, TRUE, FALSE))\n\n  expect_equal(\n    chop(x, lbrks, lbl_seq(\"1\"), extend = FALSE),\n    factor(c(1, 2, NA))\n  )\n  expect_equal(\n    chop(x, rbrks, lbl_seq(\"1\"), extend = FALSE),\n    factor(c(NA, 1, 2))\n  )\n  expect_equal(\n    chop(x, rc_brks, lbl_seq(\"1\"), extend = FALSE),\n    factor(c(1, 2, 2))\n  )\n})\n\n\ntest_that(\"NA, NaN and Inf\", {\n  y <- c(1:3, NA, NaN)\n  expect_equal(\n    chop(y, 1:3, lbl_seq(\"1\"), extend = FALSE, close_end = FALSE),\n    factor(c(1, 2, NA, NA, NA)),\n    ignore_attr = TRUE\n  )\n\n  x <- c(-Inf, 1, Inf)\n  r <- chop(x, 1:2, labels = letters[1:3])\n  expect_equal(\n    r,\n    factor(c(\"a\", \"b\", \"c\"), levels = letters[1:3], ordered = FALSE),\n    ignore_attr = TRUE\n  )\n\n  x <- c(-Inf, 1, Inf)\n  # if extend is NULL, we should ensure even Inf is included\n  r <- chop(x, -Inf, left = FALSE, labels = c(\"-Inf\", \"a\"), close_end = FALSE)\n  expect_equal(r, factor(c(\"-Inf\", \"a\", \"a\"), levels = c(\"-Inf\", \"a\")),\n               ignore_attr = TRUE)\n  r <- chop(x, Inf, labels = c(\"a\", \"Inf\"), close_end = FALSE)\n  expect_equal(r, factor(c(\"a\", \"a\", \"Inf\"), levels = c(\"a\", \"Inf\")),\n               ignore_attr = TRUE)\n\n  # otherwise, we respect close_end = FALSE\n  r <- chop(x, brk_default(c(-Inf, Inf)), labels = \"a\",\n        extend = FALSE, left = FALSE, close_end = FALSE)\n  expect_equal(r, factor(c(NA, \"a\", \"a\"), levels = c(\"a\")),\n               ignore_attr = TRUE)\n  r <- chop(x, c(-Inf, Inf), labels = \"a\", extend = FALSE, close_end = FALSE)\n  expect_equal(r, factor(c(\"a\", \"a\", NA), levels = c(\"a\")),\n               ignore_attr = TRUE)\n\n  all_na <- rep(NA_real_, 5)\n  expect_silent(chop(all_na, 1:2))\n  # not sure if this should be OK or not...\n  # expect_silent(chop_quantiles(all_na, c(.25, .75)))\n  all_na[1] <- NaN\n  expect_silent(chop(all_na, 1:2))\n})\n\n\ntest_that(\"singleton breaks\", {\n  expect_silent(chop(1:4, 2))\n  expect_silent(chop(1:4, 1))\n  expect_silent(chop(1:4, 4))\n  expect_silent(chop(1:4, 0))\n  expect_silent(chop(1:4, 5))\n  expect_silent(chop(1, 1))\n})\n\n\ntest_that(\"labels\", {\n  x <- seq(0.5, 2.5, 0.5)\n  expect_equal(\n          chop(x, 1:2, labels = letters[1:3]),\n          factor(c(\"a\", \"b\", \"b\", \"c\", \"c\"), levels = letters[1:3])\n        )\n  expect_error(chop(1:10, 3:4, labels = c(\"a\", \"a\", \"a\")))\n  expect_error(chop(1:10, 3:4, labels = c(\"a\", \"b\")))\n  expect_error(chop(1:10, 3:4, labels = c(\"a\", \"b\", \"c\", \"d\")))\n\n  expect_equal(\n          chop(x, 1:2, labels = NULL),\n          c(1, 2, 2, 3, 3)\n        )\n})\n\n\ntest_that(\"break names as labels\", {\n  expect_equal(\n    chop(1:4, c(Low = 1, High = 3, 4)),\n    factor(c(\"Low\", \"Low\", \"High\", \"High\"), levels = c(\"Low\", \"High\")),\n    ignore_attr = TRUE\n  )\n  expect_equal(\n    chop(1:5, c(Low = 1, Mid = 3, High = 4)),\n    factor(c(\"Low\", \"Low\", \"Mid\", \"High\", \"High\"),\n           levels = c(\"Low\", \"Mid\", \"High\")),\n    ignore_attr = TRUE\n  )\n  expect_equal(\n    chop(0:4, c(Low = 1, High = 3)),\n    factor(c(\"[0, 1)\", \"Low\", \"Low\", \"High\", \"High\"),\n           levels = c(\"[0, 1)\", \"Low\", \"High\")),\n    ignore_attr = TRUE\n  )\n  expect_equal(\n    chop(1:4, c(Low = 1, Mid = 2, 3, 4), labels = lbl_endpoints()),\n    factor(c(\"Low\", \"Mid\", \"3\", \"3\"), levels = c(\"Low\", \"Mid\", \"3\")),\n    ignore_attr = TRUE\n  )\n})\n\n\ntest_that(\"extend\", {\n  expect_equal(\n          chop(c(1, 4), 2:3, labels = lbl_seq(\"1\"), extend = TRUE),\n          factor(c(1, 3))\n        )\n  expect_equal(\n          chop(c(1, 4), 2:3, labels = lbl_seq(\"1\"), extend = FALSE),\n          factor(c(NA, NA))\n        )\n})\n\n\ntest_that(\"close_end\", {\n  res <- chop(1:4, 2:3, close_end = TRUE, drop = FALSE)\n  expect_equal(\n    levels(res),\n    c(\"[1, 2)\", \"[2, 3)\", \"[3, 4]\")\n  )\n\n  res <- chop(1:4, 2:3, close_end = FALSE, extend = FALSE, drop = FALSE)\n  expect_equal(\n    levels(res),\n    c(\"[2, 3)\")\n  )\n\n  res <- chop(1:4, 2:3, close_end = TRUE, extend = FALSE, drop = FALSE)\n  expect_equal(\n    levels(res),\n    c(\"[2, 3]\")\n  )\n})\n\n\ntest_that(\"raw\", {\n  x <- 1:10\n\n  expect_silent(\n    res <- chop(x, brk_quantiles(c(0.25, 0.75)), raw = TRUE)\n  )\n  expect_equal(\n    levels(res),\n    c(\"[1, 3.25)\", \"[3.25, 7.75)\", \"[7.75, 10]\")\n  )\n\n  expect_silent(\n    res <- chop(x, brk_quantiles(c(0.25, 0.75)), raw = FALSE)\n  )\n  expect_equal(\n    levels(res),\n    c(\"[0%, 25%)\", \"[25%, 75%)\", \"[75%, 100%]\")\n  )\n})\n\n\ntest_that(\"drop\", {\n  x <- c(1, 3)\n  expect_equal(\n          levels(chop(x, 1:3, labels = lbl_seq(\"1\"), extend = TRUE,\n            drop = TRUE)),\n          as.character(c(2, 4))\n        )\n  expect_equal(\n          levels(chop(x, 1:3, labels = lbl_seq(\"1\"), extend = TRUE,\n            drop = FALSE)),\n          as.character(1:4)\n        )\n})\n\n\ntest_that(\"chop_width\", {\n  x <- 1:10\n  expect_equal(\n    chop_width(x, 2, labels = lbl_seq(\"1\")),\n    factor(rep(1:5, each = 2))\n  )\n  expect_equal(\n    chop_width(x, 2, 0, labels = lbl_seq(\"1\")),\n    factor(c(1, rep(2:4, each = 2), 5, 5, 5))\n  )\n})\n\n\ntest_that(\"chop_evenly\", {\n  x <- 1:10\n  expect_equal(\n    chop_evenly(x, 2, labels = lbl_seq(\"1\")),\n    factor(rep(1:2, each = 5))\n  )\n  expect_error(r <- chop_evenly(x, groups = 2))\n})\n\n\ntest_that(\"chop_proportions\", {\n  expect_equal(\n    chop_proportions(0:10, c(0.2, 0.8), labels = lbl_seq(\"1\")),\n    factor(rep(1:3, c(2, 6, 3)))\n  )\n\n  expect_equal(\n    chop_proportions(0:10, c(Low = 0, Mid = 0.2, High = 0.8)),\n    factor(c(rep(\"Low\", 2), rep(\"Mid\", 6), rep(\"High\", 3)),\n           levels = c(\"Low\", \"Mid\", \"High\")),\n    ignore_attr = TRUE\n  )\n\n  expect_equal(\n    chop_proportions(0:10, c(0.2, 0.8), labels = lbl_intervals(), raw = FALSE),\n    factor(c(1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3),\n           labels = c(\"[0, 0.2)\", \"[0.2, 0.8)\", \"[0.8, 1]\"))\n  )\n})\n\n\ntest_that(\"chop_quantiles\", {\n  expect_equal(\n    chop_quantiles(1:6, c(.25, .5, .75), labels = lbl_seq(\"1\")),\n    as.factor(c(1, 1, 2, 3, 4, 4))\n  )\n\n  expect_equal(\n    chop_quantiles(1:6, c(Q1 = 0, Q2 = 0.25, Q3 = 0.5, Q4 = 0.75)),\n    factor(c(\"Q1\", \"Q1\", \"Q2\", \"Q3\", \"Q4\", \"Q4\"))\n  )\n\n  x <- c(1, 1, 1, 2, 3)\n  expect_equal(\n    chop_quantiles(x, 1:4/5, recalc_probs = TRUE),\n    factor(c(\"[0%, 60%]\", \"[0%, 60%]\", \"[0%, 60%]\", \"[60%, 80%)\", \"[80%, 100%]\"))\n  )\n\n  withr::local_options(lifecycle_verbosity = \"quiet\")\n  expect_equal(\n    chop_quantiles(1:6, c(.25, .5, .75), raw = TRUE),\n    factor(c(1, 1, 2, 3, 4, 4),\n           labels = c(\"[1, 2.25)\", \"[2.25, 3.5)\", \"[3.5, 4.75)\", \"[4.75, 6]\"))\n  )\n})\n\n\ntest_that(\"chop_equally\", {\n  x <- 1:6\n  expect_equal(\n    chop_equally(x, 2, labels = lbl_seq(\"1\")),\n    as.factor(rep(1:2, each = 3))\n  )\n\n  expect_equal(\n    chop_equally(x, 2, raw = FALSE),\n    factor(c(1, 1, 1, 2, 2, 2), labels = c(\"[0%, 50%)\", \"[50%, 100%]\"))\n  )\n\n  expect_equal(\n    chop_equally(x, 2, raw = TRUE),\n    factor(c(1, 1, 1, 2, 2, 2), labels = c(\"[1, 3.5)\", \"[3.5, 6]\"))\n  )\n\n  expect_warning(\n    chop_equally(c(1, 1, 1, 1), 4),\n    \"Fewer\"\n  )\n})\n\n\ntest_that(\"chop_deciles\", {\n  x <- rnorm(100)\n  expect_identical(\n    chop_quantiles(x, 0:10/10),\n    chop_deciles(x)\n  )\n})\n\n\ntest_that(\"chop_n\", {\n  expect_silent(res <- chop_n(rnorm(100), 10))\n  expect_equal(as.vector(table(res)), rep(10, 10))\n\n  # chop_n should give accurate answers even when left = FALSE\n  res <- chop_n(1:4, 2, left = FALSE)\n  expect_equal(as.vector(table(res)), rep(2, 2))\n\n  expect_warning(chop_n(rep(1:3, each = 3), 2))\n})\n\n\ntest_that(\"Bugfix: chop_n(tail = 'merge') works with n > length(x)\", {\n  expect_silent(\n    chop_n(1:3, 4, tail = \"merge\", extend = FALSE)\n  )\n})\n\n\ntest_that(\"chop_mean_sd\", {\n  x <- -1:1 # mean 0, sd 1\n  expect_silent(res <- chop_mean_sd(x))\n  expect_equal(as.vector(table(res)), c(1, 1, 1))\n  expect_silent(res2 <- chop_mean_sd(x, sds = 1:2))\n  expect_silent(chop_mean_sd(x, sds = c(1, 1.96)))\n\n  lifecycle::expect_deprecated(res3 <- chop_mean_sd(x, sd = 2))\n  expect_equal(res2, res3)\n\n  expect_equal(\n    chop_mean_sd(x, raw = TRUE),\n    factor(c(\"[-1, 0)\", \"[0, 1)\", \"[1, 2)\"),\n           levels = c(\"[-1, 0)\", \"[0, 1)\", \"[1, 2)\"))\n  )\n})\n\n\ntest_that(\"chop_pretty\", {\n  expect_silent(res <- chop_pretty(1:10))\n  expect_silent(res <- chop_pretty(1:10, 3))\n  expect_silent(res <- chop_pretty(1:10, 3))\n})\n\n\ntest_that(\"chop_fn\", {\n  expect_silent(res <- chop_fn(1:10, pretty))\n  expect_silent(res <- chop_fn(1:10, quantile, c(.2, .8)))\n  expect_equal(\n    chop_fn(1:5, median),\n    factor(c(\"[1, 3)\", \"[1, 3)\", \"[3, 5]\", \"[3, 5]\", \"[3, 5]\"))\n  )\n  expect_equal(\n    chop_fn(1:5, median, left = FALSE),\n    factor(c(\"[1, 3]\", \"[1, 3]\", \"[1, 3]\", \"(3, 5]\", \"(3, 5]\"),\n           levels = c(\"[1, 3]\", \"(3, 5]\")),\n    ignore_attr = TRUE\n  )\n})\n\n\ntest_that(\"chop_spikes\", {\n  x <- c(1:2, rep(3, 3), 4:5)\n\n  expect_silent(res <- chop_spikes(x, breaks = 2, n = 2))\n  expect_equal(\n    res,\n    factor(c(\"[1, 2)\", \"[2, 3)\", rep(\"{3}\", 3), rep(\"(3, 5]\", 2)),\n           levels = c(\"[1, 2)\", \"[2, 3)\", \"{3}\", \"(3, 5]\")),\n    ignore_attr = TRUE\n  )\n\n  expect_silent(res2 <- chop_spikes(x, breaks = 2, prop = 0.3))\n  expect_equal(res, res2)\n\n  expect_silent(res3 <- chop_spikes(x, breaks = brk_width(4), n = 2))\n  expect_equal(\n    res3,\n    factor(c(rep(\"[1, 3)\", 2), rep(\"{3}\", 3), rep(\"(3, 5]\", 2)),\n           levels = c(\"[1, 3)\", \"{3}\", \"(3, 5]\")),\n    ignore_attr = TRUE\n  )\n})\n\n\ntest_that(\"dissect\", {\n  x <- c(1:2, rep(3, 3), 4:6)\n\n  expect_silent(res <- dissect(x, breaks = c(2, 5), n = 2))\n  expect_equal(\n    res,\n    factor(c(\"[1, 2)\", \"[2, 5)\", rep(\"{3}\", 3), \"[2, 5)\", \"[5, 6]\", \"[5, 6]\"),\n           levels = c(\"[1, 2)\", \"[2, 5)\", \"{3}\", \"[5, 6]\")),\n    ignore_attr = TRUE\n  )\n\n  expect_silent(res2 <- dissect(x, breaks = c(2, 5), prop = 0.25))\n  expect_equal(res, res2)\n\n  x <- c(1, 2, 3, 4, 5, 5, 5, 5)\n  expect_silent(res3 <- dissect(x, breaks = brk_equally(2), n = 2,\n                                exclude_spikes = TRUE))\n  expect_equal(\n    res3,\n    factor(c(\"[0%, 50%)\", \"[0%, 50%)\", \"[50%, 100%]\", \"[50%, 100%]\",\n             rep(\"{5}\", 4)))\n  )\n})\n\n\ntest_that(\"fillet\", {\n  x <- -2:2\n  expect_silent(sole <- fillet(x, -1:1))\n  expect_identical(sole, chop(x, -1:1, extend = FALSE, drop = FALSE))\n})\n"
  },
  {
    "path": "tests/testthat/test-labels.R",
    "content": "\ntest_that(\"lbl_manual and lbl_endpoint are defunct\", {\n  lifecycle::expect_defunct(lbl_manual(letters))\n  lifecycle::expect_defunct(lbl_endpoint()(lbrk))\n})\n\n\ntest_that(\"lbl_seq\", {\n  brk <- brk_res(brk_manual(1:3, rep(TRUE, 3)))\n\n  expect_error(lbl_seq(\"b\"))\n  expect_error(lbl_seq(\"a1\"))\n  expect_error(lbl_seq(c(\"a\", \"b\")))\n\n  expect_equal(lbl_seq()(brk), c(\"a\", \"b\"))\n  expect_equal(lbl_seq(\"A\")(brk), c(\"A\", \"B\"))\n  expect_equal(lbl_seq(\"i\")(brk), c(\"i\", \"ii\"))\n  expect_equal(lbl_seq(\"I\")(brk), c(\"I\", \"II\"))\n  expect_equal(lbl_seq(\"1\")(brk), c(\"1\", \"2\"))\n\n  expect_equal(lbl_seq(\"(a)\")(brk), c(\"(a)\", \"(b)\"))\n  expect_equal(lbl_seq(\"i.\")(brk), c(\"i.\", \"ii.\"))\n  expect_equal(lbl_seq(\"I:\")(brk), c(\"I:\", \"II:\"))\n  expect_equal(lbl_seq(\"1)\")(brk), c(\"1)\", \"2)\"))\n\n  brk_many <- brk_res(brk_manual(1:28, rep(TRUE, 28)))\n  expect_error(lbl_seq(\"a\")(brk_many))\n  expect_error(lbl_seq(\"A)\")(brk_many))\n})\n\n\ntest_that(\"lbl_dash\", {\n  brk <- brk_res(brk_manual(1:3, rep(TRUE, 3)))\n  em_dash <- em_dash()\n  expect_equal(lbl_dash()(brk), paste0(1:2, em_dash, 2:3))\n  expect_equal(lbl_dash(\"/\")(brk), c(\"1/2\", \"2/3\"))\n})\n\n\ntest_that(\"lbl_dash arguments\", {\n  brk <- brk_res(brk_default(1:3), 1:2)\n  expect_equal(lbl_dash(\"-\", fmt = \"%.2f\")(brk), c(\"1.00-2.00\", \"2.00-3.00\"))\n\n  expect_equal(lbl_dash(\"-\", first = \"< 2\")(brk), c(\"< 2\", \"2-3\"))\n  expect_equal(lbl_dash(\"-\", last = \"> 2\")(brk), c(\"1-2\", \"> 2\"))\n\n  expect_equal(lbl_dash(\"-\", first = \"< {r}\")(brk), c(\"< 2\", \"2-3\"))\n  expect_equal(lbl_dash(\"-\", last = \"> {l}\")(brk), c(\"1-2\", \"> 2\"))\n\n  brackets <- function (x) paste0(\"(\", x, \")\")\n  expect_equal(\n    lbl_dash(\"-\", fmt = brackets)(brk),\n    c(\"(1)-(2)\", \"(2)-(3)\")\n  )\n\n  expect_equal(\n    lbl_dash(\"-\", fmt = list(width = 2))(brk),\n    c(\" 1- 2\", \" 2- 3\")\n  )\n\n  brk2 <- brk_res(brk_default(c(1, 2, 2, 3)), 1:2)\n  expect_equal(\n    lbl_dash(\"-\", single = \"Just {l}\")(brk2),\n    c(\"1-2\", \"Just 2\", \"2-3\")\n  )\n\n  qbrk <- brk_res(brk_quantiles(c(0, .5, 1)), x = 0:10)\n  expect_equal(lbl_dash(\"-\")(qbrk), c(\"0%-50%\", \"50%-100%\"))\n  expect_equal(\n    lbl_dash(\"-\", fmt = \"%.3f\")(qbrk),\n    c(\"0.000-0.500\", \"0.500-1.000\")\n  )\n\n  lifecycle::expect_defunct(lbl_dash(raw = TRUE))\n})\n\n\ntest_that(\"lbl_glue\", {\n  brk <- brk_res(brk_manual(1:3, rep(TRUE, 3)))\n  expect_equal(\n    lbl_glue(\"{l} to {r}\")(brk),\n    c(\"1 to 2\", \"2 to 3\")\n  )\n\n  expect_equal(\n    lbl_glue(\"{ifelse(l_closed, '[', '(')}{l},{r}{ifelse(r_closed, ']', ')')}\")(brk),\n    c(\"[1,2)\", \"[2,3)\")\n  )\n})\n\n\ntest_that(\"lbl_glue arguments\", {\n  brk <- brk_res(brk_manual(1:3, rep(TRUE, 3)))\n  expect_equal(\n    lbl_glue(\"{l} to {r}\", first = \"Up to {r}\", last = \"Beyond {l}\")(brk),\n    c(\"Up to 2\", \"Beyond 2\")\n  )\n\n  expect_equal(\n    lbl_glue(\"<{l} to {r}>\", fmt = \"%.1f\")(brk),\n    c(\"<1.0 to 2.0>\", \"<2.0 to 3.0>\")\n  )\n\n  expect_equal(\n    lbl_glue(\"{l} to {r}\", fmt = percent)(brk),\n    c(\"100% to 200%\", \"200% to 300%\")\n  )\n\n  expect_equal(\n    lbl_glue(\"{l}/{r}\", fmt = list(width = 2))(brk),\n    c(\" 1/ 2\", \" 2/ 3\")\n  )\n\n  brk2 <- brk_res(brk_manual(c(1,2,2,3), c(TRUE, TRUE, FALSE, TRUE)))\n  expect_equal(\n    lbl_glue(\"{l} to {r}\", single = \"{{{l}}}\")(brk2),\n    c(\"1 to 2\", \"{2}\", \"2 to 3\")\n  )\n\n  expect_equal(\n    lbl_glue(\"<l> to <r>\", single = \"{<l>}\", .open = \"<\", .close = \">\")(brk2),\n    c(\"1 to 2\", \"{2}\", \"2 to 3\")\n  )\n\n  expect_equal(\n    lbl_glue(\"{l} to {r}\")(brk2),\n    c(\"1 to 2\", \"2 to 2\", \"2 to 3\")\n  )\n\n  expect_equal(\n    lbl_glue(\"<{l} to {r}>\", fmt = '%.1f', single = \"|{sprintf('%.3f', as.numeric(l))}|\")(brk2),\n    c(\"<1.0 to 2.0>\", \"|2.000|\", \"<2.0 to 3.0>\")\n  )\n\n  qbrk <- brk_res(brk_quantiles(c(0, .5, 1)), x = 0:10)\n\n  lifecycle::expect_defunct(lbl_glue(\"{l} / {r}\", raw = TRUE))\n})\n\n\ntest_that(\"lbl_endpoints\", {\n  lbrk <- brk_res(brk_default(c(1, 3, 5)), extend = FALSE)\n  expect_equal(\n    lbl_endpoints()(lbrk),\n    c(\"1\", \"3\")\n  )\n  expect_equal(\n    lbl_endpoints(left = FALSE)(lbrk),\n    c(\"3\", \"5\")\n  )\n\n  dates <- as.Date(\"2000-01-01\") + c(3, 5)\n  dbrk <- brk_res(brk_default(dates),\n                  x = as.Date(\"2000-01-01\") + 1:10)\n  expect_equal(\n    lbl_endpoints()(dbrk),\n    as.character(dates[1])\n  )\n})\n\n\ntest_that(\"lbl_endpoints arguments\", {\n  lbrk <- brk_res(brk_default(c(1, 3, 5)), extend = FALSE)\n  expect_equal(\n    lbl_endpoints(fmt = \"%.2f\")(lbrk),\n    c(\"1.00\", \"3.00\")\n  )\n  expect_equal(\n    lbl_endpoints(fmt = percent)(lbrk),\n    c(\"100%\", \"300%\")\n  )\n  expect_equal(\n    lbl_endpoints(fmt = list(nsmall = 2, decimal.mark = \",\"))(lbrk),\n    c(\"1,00\", \"3,00\")\n  )\n})\n\n\ntest_that(\"lbl_midpoints\", {\n  lbrk <- brk_res(brk_manual(1:3, rep(TRUE, 3)))\n  expect_equal(lbl_midpoints()(lbrk), c(\"1.5\", \"2.5\"))\n\n\n  dates <- as.Date(\"2000-01-01\") + c(3, 5)\n  dbrk <- brk_res(brk_default(dates),\n                  x = as.Date(\"2000-01-01\") + 1:10)\n  expect_equal(\n    lbl_endpoints()(dbrk),\n    c(\"2000-01-04\")\n  )\n})\n\n\ntest_that(\"lbl_midpoints arguments\", {\n  lbrk <- brk_res(brk_manual(1:3, rep(TRUE, 3)))\n  expect_equal(lbl_midpoints(first = \"{r}\")(lbrk), c(\"2\", \"2.5\"))\n  expect_equal(lbl_midpoints(last = \"{l}\")(lbrk), c(\"1.5\", \"2\"))\n\n  sbrk <- brk_res(brk_manual(c(1, 2, 2, 3), c(TRUE, TRUE, FALSE, TRUE)))\n  expect_equal(lbl_midpoints(single = \"[{l}]\")(sbrk), c(\"1.5\", \"[2]\", \"2.5\"))\n\n  qbrk <- brk_res(brk_quantiles(c(0, 0.5, 1)), x = 0:10)\n  expect_equal(lbl_midpoints(fmt = percent)(qbrk), c(\"25%\", \"75%\"))\n  expect_equal(\n    lbl_midpoints(fmt = list(decimal.mark = \",\"))(qbrk),\n    c(\"0,25\", \"0,75\")\n  )\n\n  lifecycle::expect_defunct(lbl_midpoints(raw = TRUE))\n})\n\n\ntest_that(\"lbl_intervals\", {\n  lbrk <- brk_res(brk_manual(1:3, rep(TRUE, 3)))\n  rbrk <- brk_res(brk_manual(1:3, rep(FALSE, 3)))\n  expect_equal(lbl_intervals()(lbrk), c(\"[1, 2)\", \"[2, 3)\"))\n  expect_equal(lbl_intervals()(rbrk), c(\"(1, 2]\", \"(2, 3]\"))\n\n  lbrk <- brk_res(brk_default(1:3), close_end = TRUE)\n  expect_equal(lbl_intervals()(lbrk), c(\"[1, 2)\", \"[2, 3]\"))\n  rbrk <- brk_res(brk_default(1:3), close_end = TRUE, left = FALSE)\n  expect_equal(lbl_intervals()(rbrk), c(\"[1, 2]\", \"(2, 3]\"))\n\n  sbrk <- brk_res(brk_default(c(1, 2, 2, 3)))\n  expect_equal(lbl_intervals()(sbrk), c(\"[1, 2)\", \"{2}\", \"(2, 3]\"))\n\n  mbrk <- brk_res(brk_manual(1:4, c(FALSE, TRUE, FALSE, TRUE)))\n  expect_equal(lbl_intervals()(mbrk), c(\"(1, 2)\", \"[2, 3]\", \"(3, 4)\"))\n})\n\n\ntest_that(\"lbl_intervals arguments\", {\n  lbrk <- brk_res(brk_default(c(1, 2, 2, 3) + 0.5))\n  expect_equal(\n    lbl_intervals(fmt = \"%.2f\")(lbrk),\n    c(\"[1.50, 2.50)\", \"{2.50}\",  \"(2.50, 3.50]\")\n  )\n\n  expect_equal(\n    lbl_intervals(fmt = list(digits = 2))(lbrk),\n    c(\"[1.5, 2.5)\", \"{2.5}\",  \"(2.5, 3.5]\")\n  )\n\n  lbrk <- brk_res(brk_default(1:3 * 10000))\n  expect_equal(\n    lbl_intervals(fmt = \"%2g\")(lbrk),\n    c(\"[10000, 20000)\", \"[20000, 30000]\")\n  )\n\n  qbrk <- brk_res(brk_quantiles(c(0, 0.5, 1)), x = 0:10)\n  expect_equal(\n    lbl_intervals()(qbrk),\n    c(\"[0%, 50%)\", \"[50%, 100%]\")\n  )\n\n  expect_equal(\n    lbl_intervals(fmt = \"%.2f\")(qbrk),\n    c(\"[0.00, 0.50)\", \"[0.50, 1.00]\")\n  )\n  expect_equal(\n    lbl_intervals(fmt = percent)(qbrk),\n    c(\"[0%, 50%)\", \"[50%, 100%]\")\n  )\n  expect_equal(\n    lbl_intervals(fmt = list(digits = 2))(qbrk),\n    c(\"[0.0, 0.5)\", \"[0.5, 1.0]\")\n  )\n\n  lbrk <- brk_res(brk_default(c(1, 2, 2, 3)))\n  expect_equal(\n    lbl_intervals(first = \"< {r}\")(lbrk),\n    c(\"< 2\", \"{2}\", \"(2, 3]\")\n  )\n  expect_equal(\n    lbl_intervals(last = \"> {l}\")(lbrk),\n    c(\"[1, 2)\", \"{2}\", \"> 2\")\n  )\n  expect_equal(\n    lbl_intervals(single = \"[{l}]\")(lbrk),\n    c(\"[1, 2)\", \"[2]\", \"(2, 3]\")\n  )\n\n  lifecycle::expect_defunct(lbl_intervals(raw = TRUE))\n})\n\n\ntest_that(\"lbl_discrete\", {\n  lbrk <- brk_res(brk_manual(1:3, rep(TRUE, 3)))\n  rbrk <- brk_res(brk_manual(1:3, rep(FALSE, 3)))\n\n  expect_equal(lbl_discrete()(lbrk), c(\"1\", \"2\"))\n  expect_equal(lbl_discrete()(rbrk), c(\"2\", \"3\"))\n\n  lbrk2 <- brk_res(brk_manual(c(1, 3, 5), rep(TRUE, 3)))\n  em_dash <- em_dash()\n  expect_equal(lbl_discrete()(lbrk2), paste0(c(1, 3), em_dash, c(2, 4)))\n  expect_equal(lbl_discrete(\" to \")(lbrk2), c(\"1 to 2\", \"3 to 4\"))\n\n  lbrk3 <- brk_res(brk_default(c(1, 3, 3, 5)), close_end = TRUE)\n  expect_equal(lbl_discrete(\"-\")(lbrk3), c(\"1-2\", \"3\", \"4-5\"))\n\n  # break containing (1,2) which has no integer in it:\n  open_brk <- brk_res(brk_manual(1:3, c(FALSE, TRUE, FALSE)))\n  expect_warning(l <- lbl_discrete()(open_brk))\n  expect_equal(l[1], \"--\")\n})\n\n\ntest_that(\"lbl_discrete arguments\", {\n  lbrk <- brk_res(brk_default(c(1, 3, 5)))\n  expect_equal(\n    lbl_discrete(\"-\", fmt = \"(%s)\")(lbrk),\n    c(\"(1)-(2)\", \"(3)-(5)\")\n  )\n\n  brackets <- function (x) paste0(\"(\", x, \")\")\n  expect_equal(\n    lbl_discrete(\"-\", fmt = brackets)(lbrk),\n    c(\"(1)-(2)\", \"(3)-(5)\")\n  )\n\n  expect_equal(\n    lbl_discrete(\"-\", fmt = list(nsmall = 1))(lbrk),\n    c(\"1.0-2.0\", \"3.0-5.0\")\n  )\n\n  expect_equal(\n    lbl_discrete(\"-\", first = \"<= {r}\")(lbrk),\n    c(\"<= 2\", \"3-5\")\n  )\n\n  expect_equal(\n    lbl_discrete(\"-\", last = \">= {l}\")(lbrk),\n    c(\"1-2\", \">= 3\")\n  )\n\n  sbrk <- brk_res(brk_default(c(1, 3, 3, 6)))\n  expect_equal(\n    lbl_discrete(\"-\", single = \"[{l}]\")(sbrk),\n    c(\"1-2\", \"[3]\", \"4-6\")\n  )\n\n  brk1000 <- brk_res(brk_default(c(1, 3, 5) * 1000))\n  expect_equal(\n    lbl_discrete(\"-\", unit = 1000)(brk1000),\n    c(\"1000-2000\", \"3000-5000\")\n  )\n})\n\n\ntest_that(\"santoku.infinity\", {\n  withr::local_options(santoku.infinity = NULL)\n  brk12 <- brk_res(brk_default(1:2), extend = TRUE)\n\n  if (l10n_info()[[\"UTF-8\"]]) {\n    expect_match(format(brk12), \"\\u221e\")\n  } else {\n    expect_match(format(brk12), \"Inf\")\n  }\n\n  withr::with_options(list(santoku.infinity = \"oo\"), {\n    expect_match(format(brk12), \"oo\")\n  })\n})\n\ntest_that(\"bug: breaks labels don't produce duplicates\", {\n  brk <- brk_res(brk_default(c(1.333333335, 1.333333336, 1.333333337, 5)))\n  lbls <- lbl_intervals()(brk)\n  expect_equal(anyDuplicated(lbls), 0)\n  lbls <- lbl_dash()(brk)\n  expect_equal(anyDuplicated(lbls), 0)\n\n  brk <- brk_res(brk_quantiles(seq(0, 1, 0.0001)), x = rnorm(10000))\n  lbls <- lbl_intervals()(brk)\n  expect_equal(anyDuplicated(lbls), 0)\n  lbls <- lbl_dash()(brk)\n  expect_equal(anyDuplicated(lbls), 0)\n})\n\n\ntest_that(\"bug: lbl_endpoints() works with no format and non-standard breaks\", {\n  expect_error(\n    chop_quantiles(0:10, 0.5, labels = lbl_endpoints())\n    , NA)\n  expect_error(\n    chop_mean_sd(0:10, labels = lbl_endpoints())\n    , NA)\n})\n\n\ntest_that(\"lbl_date collapses shared date components\", {\n  withr::local_locale(c(LC_TIME = \"C\"))\n  brk_same_month <- brk_res(brk_default(as.Date(c(\"2000-01-13\", \"2000-01-15\"))))\n  expect_equal(\n    lbl_date(fmt = \"%d %b %Y\")(brk_same_month),\n    \"13-15 Jan 2000\"\n  )\n\n  brk_same_year <- brk_res(brk_default(as.Date(c(\"2000-01-13\", \"2000-02-15\"))))\n  expect_equal(\n    lbl_date(fmt = \"%d %b %Y\")(brk_same_year),\n    \"13 Jan - 15 Feb 2000\"\n  )\n\n  brk_diff_year <- brk_res(brk_default(as.Date(c(\"2000-01-13\", \"2001-01-15\"))))\n  expect_equal(\n    lbl_date(fmt = \"%d %b %Y\")(brk_diff_year),\n    \"13 Jan 2000 - 15 Jan 2001\"\n  )\n})\n\n\ntest_that(\"lbl_datetime collapses shared datetime components\", {\n  withr::local_locale(c(LC_TIME = \"C\"))\n  brk_same_day <- brk_res(brk_default(as.POSIXlt(c(\n    \"2000-01-12 11:15:00\",\n    \"2000-01-12 11:45:00\"\n  ), tz = \"UTC\")))\n\n  expect_equal(\n    lbl_datetime(fmt = \"%I.%M %b %d %Y\")(brk_same_day),\n    \"11.15-11.45 Jan 12 2000\"\n  )\n})\n\n\ntest_that(\"lbl_date can apply discrete non-overlapping labels\", {\n  withr::local_locale(c(LC_TIME = \"C\"))\n  brk <- brk_res(brk_default(as.Date(c(\"2000-01-13\", \"2000-01-15\", \"2000-01-17\"))))\n\n  expect_equal(\n    lbl_date(fmt = \"%d %b %Y\")(brk),\n    c(\"13-14 Jan 2000\", \"15-17 Jan 2000\")\n  )\n\n  expect_equal(\n    lbl_date(fmt = \"%d %b %Y\", unit = NULL)(brk),\n    c(\"13-15 Jan 2000\", \"15-17 Jan 2000\")\n  )\n})\n\n\ntest_that(\"lbl_datetime can apply discrete non-overlapping labels\", {\n  withr::local_locale(c(LC_TIME = \"C\"))\n  brk <- brk_res(brk_default(as.POSIXct(c(\n    \"2000-01-12 11:00:00\",\n    \"2000-01-12 12:00:00\",\n    \"2000-01-12 13:00:00\"\n  ), tz = \"UTC\")))\n\n  expect_equal(\n    lbl_datetime(fmt = \"%H:%M\", unit = as.difftime(1, units = \"mins\"))(brk),\n    c(\"11:00-11:59\", \"12:00-13:00\")\n  )\n\n  expect_equal(\n    lbl_datetime(fmt = \"%H:%M\")(brk),\n    c(\"11:00-12:00\", \"12:00-13:00\")\n  )\n})\n\n\ntest_that(\"lbl_date collapses shared greater components even when they are prefixes\", {\n  withr::local_locale(c(LC_TIME = \"C\"))\n  brk <- brk_res(brk_default(as.Date(c(\n    \"2026-05-01\", \"2026-05-15\", \"2026-05-29\", \"2026-06-13\"\n  ))))\n\n  expect_equal(\n    lbl_date(fmt = \"%b %e\", unit = as.difftime(1, units = \"days\"))(brk),\n    c(\"May  1-14\", \"May 15-28\", \"May 29 - Jun 13\")\n  )\n})\n\n\ntest_that(\"lbl_date collapses around first differing component\", {\n  withr::local_locale(c(LC_TIME = \"C\"))\n  brk <- brk_res(brk_default(as.Date(c(\"2006-05-13\", \"2006-05-14\"))))\n\n  expect_equal(\n    lbl_date(fmt = \"%d %b\", unit = NULL)(brk),\n    \"13-14 May\"\n  )\n\n  expect_equal(\n    lbl_date(fmt = \"%b %d, %Y\", unit = NULL)(brk),\n    \"May 13-14, 2006\"\n  )\n\n  brk <- brk_res(brk_default(as.Date(c(\"2006-05-13\", \"2006-06-14\"))))\n\n  expect_equal(\n    lbl_date(fmt = \"%b %d, %Y\", unit = NULL)(brk),\n    \"May 13 - Jun 14, 2006\"\n  )\n})\n\n\ntest_that(\"lbl_datetime keeps month when both day and time differ\", {\n  withr::local_locale(c(LC_TIME = \"C\"))\n  brk <- brk_res(brk_default(as.POSIXct(c(\n    \"2020-05-30 22:00:00\",\n    \"2020-05-31 02:00:00\"\n  ), tz = \"UTC\")))\n\n  expect_equal(\n    lbl_datetime(fmt = \"%H:%M %d %b\", unit = NULL)(brk),\n    \"22:00 30 May - 02:00 31 May\"\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-nonstandard.R",
    "content": "\n\ntest_that(\"character\", {\n  x <- LETTERS\n  br <- c(\"F\", \"M\")\n  expect_warning(\n    chop(x, br)\n  )\n\n  withr::local_options(santoku.warn_character = FALSE)\n\n  expect_silent(\n    chop(x, br)\n  )\n\n  # here, we think there should *always* be a warning\n  expect_warning(\n    chop(x, br, extend = TRUE)\n  )\n\n  expect_silent(\n    chop_equally(x, 13)\n  )\n\n  expect_silent(\n    chop_n(x, 13)\n  )\n})\n\n\ntest_that(\"ordered\", {\n  x <- ordered(1:10)\n  br <- ordered(c(5, 8), levels = levels(x))\n\n  expect_silent(\n    chop(x, br)\n  )\n\n  # here, we think there should *always* be a warning\n  expect_warning(\n    chop(x, br, extend = TRUE)\n  )\n\n  expect_silent(\n    chop_n(x, 5)\n  )\n\n  expect_silent(\n    chop_equally(x, groups = 2)\n  )\n})\n\n\ntest_that(\"hexmode\", {\n  x <- as.hexmode(1:10 + 10)\n  br <- as.hexmode(c(13, 15, 15, 18))\n\n  expect_silent(\n    chop(x, br, extend = FALSE)\n  )\n\n  expect_silent(\n    chop(x, br)\n  )\n\n  # here, there happens to be a warning as of 0.7.0.9000,\n  # but we'd be happy if we could represent +/- Inf as hexmode\n  suppressWarnings(expect_error(\n    chop(x, br, extend = TRUE),\n    regexp = NA\n  ))\n})\n\n\ntest_that(\"octmode\", {\n  x <- as.octmode(1:10 + 10)\n  br <- as.octmode(c(13, 15, 15, 18))\n\n  expect_silent(\n    chop(x, br, extend = FALSE)\n  )\n\n  expect_silent(\n    chop(x, br)\n  )\n\n  expect_silent(\n    chop(x, c(12, 15, 15, 18))\n  )\n\n  expect_silent(\n    chop(1:10 + 10, br)\n  )\n\n  suppressWarnings(expect_error(\n    chop(x, br, extend = TRUE),\n    regexp = NA\n  ))\n})\n\n\ntest_that(\"stat::ts\", {\n  x <- ts(1:10)\n  # note: we need to specify integer breaks\n  # vec_cast can't cope with ts(<integer>) and ts(<double>)\n  br <- c(5L, 8L)\n\n  expect_silent(\n    chop(x, br)\n  )\n\n  x <- ts(c(1.0, 3.0, 5.0))\n  br <- c(2.0, 4.0)\n  expect_silent(\n    chop(x, br)\n  )\n\n  expect_silent(\n    chop(x, br, extend = TRUE)\n  )\n\n  expect_silent(\n    chop_equally(x, groups = 3)\n  )\n\n  expect_silent(\n    chop_width(x, width = 2)\n  )\n\n  x <- ts(1:10)\n  br <- ts(c(5.0, 8.0))\n  expect_silent(\n    chop(x, br)\n  )\n})\n\n\ntest_that(\"zoo::zoo\", {\n  skip_if_not_installed(\"zoo\")\n\n  x <- zoo::zoo(1:10, 1:10)\n\n  expect_silent(\n    chop(x, c(3, 5, 5, 7))\n  )\n\n  suppressWarnings(expect_error(\n    # gives a warning but no error as of 0.7.0.9000\n    chop(x, c(3, 5, 5, 7), extend = TRUE),\n    regexp = NA\n  ))\n\n  expect_silent(\n    chop_width(x, 2)\n  )\n\n  expect_silent(\n    chop_equally(x, 2)\n  )\n})\n\n\ntest_that(\"xts::xts\", {\n  skip_if_not_installed(\"xts\")\n\n  x <- xts::xts(1:10, Sys.Date() + 1:10)\n\n  expect_silent(\n    chop(x, c(3, 5, 5, 7))\n  )\n\n  suppressWarnings(expect_error(\n    # gives a warning but no error as of 0.7.0.9000\n    chop(x, c(3, 5, 5, 7), extend = TRUE),\n    regexp = NA\n  ))\n\n  expect_silent(\n    chop_width(x, 2)\n  )\n\n  expect_silent(\n    chop_equally(x, 2)\n  )\n})\n\n\ntest_that(\"units::units\", {\n  skip_if_not_installed(\"units\")\n\n  x <- units::set_units(1:10, cm)\n  br <- units::set_units(c(3, 5, 5, 8), cm)\n  br_mm <- units::set_units(c(30, 50, 50, 80), mm)\n  expect_silent(\n    chop(x, br)\n  )\n\n  expect_silent(\n    chop(x, br, extend = TRUE)\n  )\n\n  expect_equal(\n    as.numeric(chop(x, br_mm)),\n    c(1, 1, 2, 2, 3, 4, 4, 5, 5, 5)\n  )\n\n  br_m2 <- units::set_units(c(3,5,5,8), m^2)\n  expect_error(\n    chop(x, br_m2)\n  )\n\n  expect_silent(\n    chopped <- chop_width(x, units::set_units(0.05, m))\n  )\n\n  expect_equal(\n    as.numeric(chopped), c(rep(1, 5), rep(2, 5))\n  )\n\n  start <- units::set_units(20, mm)\n  expect_silent(\n    chopped <- chop_width(x, units::set_units(0.05, m), start)\n  )\n\n  expect_equal(\n    as.numeric(chopped), c(1, rep(2, 5), rep(3, 4))\n  )\n\n  expect_silent(\n    chopped <- chop_evenly(x, intervals = 2)\n  )\n\n  expect_equal(\n    as.numeric(chopped), c(rep(1, 5), rep(2, 5))\n  )\n\n  expect_silent(\n    chop_equally(x, 5)\n  )\n\n  expect_silent(\n    chop_n(x, 3)\n  )\n\n  expect_silent(\n    chop(x, br, labels = lbl_discrete(unit = units::set_units(1, cm)))\n  )\n\n  # we don't support mixed units, since units doesn't support\n  # comparison operators on those\n})\n\n\ntest_that(\"package_version\", {\n  x <- as.package_version(c(\"0.5\", \"0.5.1\", \"1.0\", \"1.1.1\", \"1.2.0\"))\n  br <- as.package_version(c(\"0.7\", \"1.1\", \"1.2.0\"))\n\n  expect_silent(\n    chop(x, br)\n  )\n\n  expect_warning(\n    chop(x, br, extend = TRUE)\n  )\n})\n\n\ntest_that(\"difftime\", {\n  days <- as.Date(\"1970-01-01\") + 0:30\n  difftimes_d <- days[10:15] - days[12:7]\n  difftimes_h <- difftimes_d\n  units(difftimes_h) <- \"hours\"\n\n  expect_silent(\n    chop(difftimes_d, difftimes_d[c(3,5)])\n  )\n\n  expect_silent(\n    chop(difftimes_d, difftimes_h)\n  )\n\n  expect_silent(\n    chop(difftimes_d, difftimes_d[c(3,5)], extend = TRUE)\n  )\n})\n\n\ntest_that(\"bit64\", {\n  skip_if_not_installed(\"bit64\")\n\n  x64 <- bit64::as.integer64(1:10)\n  b64 <- bit64::as.integer64(c(3, 5, 5, 7))\n\n  expect_silent(\n    chop(x64, b64)\n  )\n\n  expect_silent(\n    chopped <- chop(x64, b64, extend = TRUE)\n  )\n  expect_equal(\n    as.numeric(chopped),\n    c(1, 1, 2, 2, 3, 4, 5, 5, 5, 5)\n  )\n\n  expect_silent(\n    chop(1:10, b64)\n  )\n\n  expect_silent(\n    chop(x64, as.integer(c(3, 5, 5, 7)))\n  )\n\n  expect_silent(\n    chop(x64, c(3, 5, 5, 7))\n  )\n\n  expect_silent(\n    chop(c(1, 3, 5, 7), b64)\n  )\n\n  expect_equal(\n    chop(x64, c(2.5, 7.5), labels = letters[1:3]),\n    factor(c(1, 1, 2, 2, 2, 2, 2, 3, 3, 3), labels = letters[1:3])\n  )\n\n  x64_big <- bit64::as.integer64(\"1000000000000000000\") + 1:10\n  b64_big <- bit64::as.integer64(\"1000000000000000000\") + c(3, 5, 5, 7)\n\n  expect_silent(\n    chop(x64_big, b64_big)\n  )\n\n  expect_warning(\n    chop(c(bit64::as.integer64(1), x64_big), 2.5)\n  )\n\n})\n\n\ntest_that(\"hms::hms\", {\n  skip_if_not_installed(\"hms\")\n\n  x <- hms::hms(minutes = 1:180)\n  br <- hms::hms(hours = 1:2)\n\n  expect_silent(\n    chopped <- chop(x, br)\n  )\n  expect_equal(\n    as.numeric(chopped),\n    rep(1:3, c(59, 60, 61)),\n    ignore_attr = TRUE\n  )\n\n  expect_silent(\n    chop(x, br, extend = TRUE)\n  )\n})\n\n\ntest_that(\"haven::labelled\", {\n  skip_if_not_installed(\"haven\")\n\n  x <- haven::labelled(as.double(1:10), c(\"Lo\" = 1, \"Hi\" = 10))\n  br <- haven::labelled(c(3, 5), c(\"Mid\" = 3, \"Mid2\" = 5))\n\n  expect_silent(\n    chop(x, c(2, 5, 5, 8))\n  )\n\n  expect_silent(\n    chop(x, br)\n  )\n\n  expect_silent(\n    chop(x, br, extend = TRUE)\n  )\n})\n\n\ntest_that(\"haven::labelled works with lbl_discrete() when breaks are extended\", {\n  skip_if_not_installed(\"haven\")\n\n  x <- haven::labelled(1:5)\n\n  expect_silent(\n    chop(x, 2:3, labels = lbl_discrete())\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-tab.R",
    "content": "test_that(\"tab\", {\n  expect_identical(\n    tab(1:5, c(2, 4), letters[1:3]),\n    table(x = c(\"a\", \"b\", \"b\", \"c\", \"c\"), useNA = \"ifany\", dnn = NULL)\n  )\n  expect_identical(\n    tab(1:5, c(2, 4), letters[1:3]),\n    table(x = chop(1:5, c(2, 4), letters[1:3], drop = FALSE), useNA = \"ifany\",\n            dnn = NULL)\n  )\n})\n\n\ntest_that(\"tab_n\", {\n  expect_identical(\n    tab_n(1:9, 3, lbl_seq()),\n    table(x = rep(c(\"a\", \"b\", \"c\"), 3), useNA = \"ifany\", dnn = NULL)\n  )\n})\n\n\ntest_that(\"tab_width\", {\n  expect_identical(\n    tab_width(0:7, 2),\n    table(x = c(rep(c(\"[0, 2)\", \"[2, 4)\", \"[4, 6)\", \"[6, 8]\"), 2)),\n            dnn = NULL)\n  )\n})\n\n\ntest_that(\"tab_evenly\", {\n  expect_identical(\n    tab_evenly(0:10, 5),\n    table(x = c(rep(c(\"[0, 2)\", \"[2, 4)\", \"[4, 6)\", \"[6, 8)\", \"[8, 10]\"), 2),\n      \"[8, 10]\"), dnn = NULL)\n  )\n})\n\n\ntest_that(\"tab_proportions\", {\n  expect_identical(\n    tab_proportions(0:10, c(0.2, 0.8)),\n    table(rep(c(\"[0, 2)\", \"[2, 8)\", \"[8, 10]\"), c(2, 6, 3)), dnn = NULL)\n  )\n})\n\n\ntest_that(\"tab_mean_sd\", {\n  expect_silent(\n    tb <- tab_mean_sd(rnorm(100), sds = 1:3, extend = TRUE, drop = FALSE)\n  )\n  expect_equal(length(tb), 8)\n})\n\n\ntest_that(\"tab_pretty\", {\n  expect_silent(\n    tb <- tab_pretty(1:9)\n  )\n  expect_equal(length(tb), 5)\n})\n\n\ntest_that(\"tab_quantiles\", {\n  expect_identical(\n    tab_quantiles(1:4, c(0, .25, .5, .75, 1)),\n    table(x = c(\"[0%, 25%)\", \"[25%, 50%)\", \"[50%, 75%)\", \"[75%, 100%]\"),\n          dnn = NULL)\n  )\n})\n\n\ntest_that(\"tab_deciles\", {\n  expect_identical(\n    tab_deciles(0:9),\n    table(x = c(\"[0%, 10%)\", \"[10%, 20%)\", \"[20%, 30%)\", \"[30%, 40%)\",\n                \"[40%, 50%)\", \"[50%, 60%)\", \"[60%, 70%)\", \"[70%, 80%)\",\n                \"[80%, 90%)\", \"[90%, 100%]\"),\n          dnn = NULL)\n  )\n})\n\n\ntest_that(\"tab_equally\", {\n  expect_identical(\n    tab_equally(1:4, 4),\n    table(x = c(\"[1, 1.75)\", \"[1.75, 2.5)\", \"[2.5, 3.25)\", \"[3.25, 4]\"),\n          dnn = NULL)\n  )\n})\n\n\ntest_that(\"tab_fn\", {\n  expect_equal(\n    tab_fn(1:5, median),\n    table(factor(c(rep(\"[1, 3)\", 2), rep(\"[3, 5]\", 3)))),\n    ignore_attr = TRUE\n  )\n})\n\n\ntest_that(\"tab_spikes\", {\n  expect_equal(\n    tab_spikes(c(1:5, rep(3, 2)), breaks = c(2, 4), n = 3),\n    table(factor(\n      c(\"[1, 2)\", \"[2, 3)\", rep(\"{3}\", 3), rep(\"[4, 5]\", 2)),\n      levels = c(\"[1, 2)\", \"[2, 3)\", \"{3}\", \"[4, 5]\")\n    )),\n    ignore_attr = TRUE\n  )\n})\n\n\ntest_that(\"tab_dissect\", {\n  expect_equal(\n    tab_dissect(c(1:5, rep(3, 2)), breaks = c(2, 4), n = 3),\n    table(factor(\n      c(\"[1, 2)\", \"[2, 4)\", rep(\"{3}\", 3), rep(\"[4, 5]\", 2)),\n      levels = c(\"[1, 2)\", \"[2, 4)\", \"{3}\", \"[4, 5]\")\n    )),\n    ignore_attr = TRUE\n  )\n})\n"
  },
  {
    "path": "tests/testthat/test-zzz-systematic.R",
    "content": "\ntest_that(\"systematic tests\", {\n  x_vals <- list(\n    ordinary = 4:1,\n    real     = 4:1 + 0.5,\n    NAs      = c(NA, 1:3),\n    all_NAs  = c(NA_real_, NA_real_, NA_real_),\n    inf      = c(-Inf, Inf, 1:3),\n    inf_lo   = c(-Inf, 1:3),\n    inf_hi   = c(Inf, 1:3),\n    \"NaN\"    = c(NaN, 1:3),\n    same     = rep(1, 3),\n    one      = 3,\n    none     = numeric(0),\n    char     = letters[1:3],\n    complex  = 1:3 + 1i,\n    Date     = as.Date(\"1950-01-01\") + 0:20,\n    POSIXct  = as.POSIXct(\"2000-01-01\") + 0:30\n  )\n  brk_funs <- list(\n    brk_evenly      = expression(brk_evenly(2)),\n    brk_proportions = expression(brk_proportions(c(0.25, 0.6))),\n    brk_manual      = expression(brk_manual(1:3, c(FALSE, TRUE, FALSE))),\n    brk_mean_sd     = expression(brk_mean_sd()),\n    brk_pretty      = expression(brk_pretty()),\n    brk_n           = expression(brk_n(5)),\n    brk_n_merge     = expression(brk_n(5, tail = \"merge\")),\n    brk_quantiles   = expression(brk_quantiles(1:3/4)),\n    brk_default     = expression(brk_default(1:3)),\n    brk_default2    = expression(brk_default(c(1, 2, 2, 3))),\n    brk_default_lo  = expression(brk_default(1)),\n    brk_default_hi  = expression(brk_default(5)),\n    brk_width       = expression(brk_width(1)),\n    brk_width2      = expression(brk_width(1, 0)),\n    brk_spikes  = expression(brk_spikes(1:3, n = 2)),\n    brk_w_difft_day = expression(brk_width(as.difftime(5, units = \"days\"))),\n    brk_w_difft_sec = expression(brk_width(as.difftime(5, units = \"secs\"))),\n    brk_def_Date    = expression(brk_default(as.Date(\"1950-01-05\") + c(0, 5))),\n    brk_def_POSIXct = expression(brk_default(as.POSIXct(\"2000-01-01\") + c(10, 20)))\n  )\n  lbl_funs <- list(\n    lbl_dash          = expression(lbl_dash()),\n    lbl_intervals     = expression(lbl_intervals()),\n    lbl_seq           = expression(lbl_seq(\"a\")),\n    lbl_endpoints     = expression(lbl_endpoints()),\n    lbl_midpoints     = expression(lbl_midpoints()),\n    lbl_date          = expression(lbl_date()),\n    lbl_datetime      = expression(lbl_datetime())\n  )\n\n  # how to investigate a failure:\n  # 1. Note the seed and row.\n  # 2. Manually run from here to END TEST DATA CREATION below\n  # 3. Look at test_df[row,] or test_df[test_df$row == row, ]\n  # 4. Go to the for loop below, set r to the row and seed to the seed\n  #    and run relevant lines.\n\n  test_df <- expand.grid(\n    x         = x_vals,\n    brk_fun   = names(brk_funs),\n    lbl_fun   = names(lbl_funs),\n    # we translate NA to NULL in chop(); doing this means we don't need a list():\n    extend    = c(TRUE, FALSE, NA),\n    left      = c(TRUE, FALSE),\n    close_end = c(TRUE, FALSE),\n    # ditto:\n    raw       = c(TRUE, FALSE, NA),\n    drop      = c(TRUE, FALSE),\n    stringsAsFactors = FALSE\n  )\n\n  # remove some pointless conditions:\n\n  skip_test <- function (cond) {\n    cond <- substitute(cond)\n    test_df <<- test_df[with(test_df, ! eval(cond)), ]\n  }\n\n  skip_test(! left & brk_fun == \"brk_manual\")\n  skip_test(! close_end & brk_fun == \"brk_manual\")\n\n  POSIXct_breaks <- c(\"brk_def_POSIXct\", \"brk_w_difft_sec\")\n  Date_breaks <- c(\"brk_def_Date\", \"brk_w_difft_day\")\n  skip_test(names(x) %in% c(\"Date\", \"POSIXct\")  &\n              ! brk_fun %in% c(Date_breaks, POSIXct_breaks))\n  skip_test(! names(x) %in% c(\"Date\", \"POSIXct\") &\n              brk_fun %in% c(Date_breaks, POSIXct_breaks))\n  # don't try to break dates by 1 second width (very slow!)\n  skip_test(names(x) != \"POSIXct\" & brk_fun == \"brk_w_difft_sec\")\n\n  skip_test(names(x) != \"Date\" & lbl_fun == \"lbl_date\")\n  skip_test(names(x) != \"POSIXct\" & lbl_fun == \"lbl_datetime\")\n\n  test_df$expect <- \"succeed\"\n  test_df$row <- seq_len(nrow(test_df))\n  # END TEST DATA CREATION\n\n  # some things should fail\n  should_fail <-   function (cond) test_df$expect[cond] <<- \"error\"\n  should_warn <-   function (cond) test_df$expect[cond] <<- \"warn\"\n  should_either <- function (cond) test_df$expect[cond] <<- \"either\"\n  dont_care <-     function (cond) test_df <<- test_df[! cond, ]\n\n  should_fail(names(test_df$x) == \"char\")\n\n  # but if we break by quantities, OK...\n  char_by_quantities <- names(test_df$x) == \"char\" &\n          test_df$brk_fun %in% c(\"brk_equally\", \"brk_quantiles\", \"brk_n\",\n                                 \"brk_n_merge\")\n  # so long as we aren't trying raw midpoints\n  raw <- ! is.na(test_df$raw) & test_df$raw\n  should_warn(char_by_quantities & !\n                (test_df$lbl_fun == \"lbl_midpoints\" & raw)\n  )\n  # ... or midpoints with brk_n()\n  should_fail(char_by_quantities & test_df$lbl_fun == \"lbl_midpoints\"\n              & test_df$brk_fun %in% c(\"brk_n\", \"brk_n_merge\"))\n\n  # brk_default_hi and _lo have a single break, so if you can't\n  # extend it, there are no possible intervals:\n  should_fail(with(test_df,\n          brk_fun %in% c(\"brk_default_hi\", \"brk_default_lo\") &\n          extend == FALSE\n        ))\n\n  # ditto when extend is NULL and there's no non-NA data\n  # here we have to fail even though with some data we'd be OK\n  should_fail(with(test_df,\n                    brk_fun %in% c(\"brk_default_hi\", \"brk_default_lo\") &\n                    names(x) %in% c(\"all_NAs\", \"none\") &\n                    is.na(extend)\n  ))\n\n  # raw endpoints get duplicated if multiple quantiles are infinite:\n  dont_care(with(test_df,\n                   names(x) %in% c(\"inf_lo\", \"inf_hi\") &\n                   brk_fun == \"brk_quantiles\" &\n                   lbl_fun == \"lbl_midpoints\" &\n                   raw == TRUE &\n                   extend == TRUE &\n                   close_end == FALSE\n                 ))\n  dont_care(with(test_df,\n                   names(x) == \"inf_lo\" &\n                   brk_fun == \"brk_quantiles\" &\n                   lbl_fun == \"lbl_endpoints\" &\n                   raw == TRUE &\n                   extend == TRUE &\n                   left == FALSE &\n                   close_end == FALSE\n                 ))\n\n  # lbl_endpoints() can create duplicates\n  # when you extend an open interval to add a singleton\n  # e.g. {1}, (1, 2]\n  dont_care(with(test_df,\n                   lbl_fun == \"lbl_endpoints\" &\n                   left == FALSE & is.na(extend)\n                 ))\n  dont_care(with(test_df,\n                   lbl_fun == \"lbl_endpoints\" &\n                   brk_fun %in% c(\"brk_default_lo\", \"brk_manual\") &\n                   left == TRUE & is.na(extend)\n                 ))\n\n  # quantiles here likely to create duplicate endpoints\n  dont_care(with(test_df,\n                 names(x) %in% c(\"one\", \"same\", \"char\") &\n                 lbl_fun == \"lbl_endpoints\" &\n                 brk_fun == \"brk_quantiles\" &\n                 extend == TRUE & raw == TRUE\n               ))\n\n  # brk_quantiles() should warn on duplicate quantiles\n  should_warn(with(test_df,\n                 names(x) %in% c(\"one\", \"same\") &\n                 brk_fun == \"brk_quantiles\"\n               ))\n\n  # brk_default has breaks 1,2,2,3\n  # with lbl_endpoints, this may create duplicate left endpoints\n  # ie the user asked for something we can't do\n  dont_care(with(test_df,\n          names(x) %in%\n            c(\"ordinary\", \"inf\", \"inf_lo\", \"inf_hi\", \"NaN\", \"NAs\") &\n          brk_fun == \"brk_default2\" &\n          lbl_fun == \"lbl_endpoints\"\n        ))\n  dont_care(with(test_df,\n          brk_fun == \"brk_default2\" &\n          lbl_fun == \"lbl_endpoints\" &\n          drop == FALSE\n        ))\n  dont_care(with(test_df,\n          brk_fun == \"brk_spikes\" &\n          lbl_fun == \"lbl_endpoints\" &\n          drop == FALSE\n        ))\n  dont_care(with(test_df,\n          brk_fun %in% c(\"brk_n\", \"brk_n_merge\") &\n          lbl_fun == \"lbl_endpoints\"\n        ))\n\n  # lbl_midpoints struggles with Inf for obvious reasons\n  dont_care(with(test_df,\n          names(x) %in% c(\"inf\", \"inf_lo\", \"inf_hi\") &\n          brk_fun %in% c(\"brk_n\", \"brk_n_merge\") &\n          lbl_fun == \"lbl_midpoints\"\n        ))\n\n  should_fail(names(test_df$x) == \"complex\")\n\n  # we sample the same 10000 rows every day\n  seed <- as.numeric(Sys.Date())\n  set.seed(seed)\n  test_everything <- isTRUE(as.logical(Sys.getenv(\"CI\"))) ||\n                              getOption(\"santoku.test_everything\", FALSE)\n\n  sample_rows <- if (test_everything) {\n                   seq_len(nrow(test_df))\n                 } else {\n                   sort(sample(nrow(test_df), 10000, replace = FALSE))\n                 }\n\n  for (r in sample_rows) {\n    # start manual debugging here with r and seed set\n    tdata <- test_df[r, ]\n    if (is.na(tdata$expect)) next\n\n    if (is.na(tdata$extend)) tdata$extend <- NULL\n    if (is.na(tdata$raw)) tdata$raw <- NULL\n\n    x <- tdata$x[[1]]\n    format_null <- function (x) if (is.null(x)) \"NULL\" else x\n    info <- sprintf(\n          \"seed: %s row: %s\n          command: chop(%s, %s, labels = %s, extend = %s, left = %s,\n                     close_end = %s, raw = %s, drop = %s)\",\n          seed, tdata$row, tdata$x, as.character(brk_funs[[tdata$brk_fun]]),\n          as.character(lbl_funs[[tdata$lbl_fun]]), format_null(tdata$extend),\n          tdata$left, tdata$close_end, format_null(tdata$raw), tdata$drop)\n\n    # NA means \"no error\":\n    regexp <- switch(tdata$expect, \"succeed\" = NA, NULL)\n    err_class <- switch(tdata$expect, \"warn\" = \"warning\", \"either\" = NULL, \"error\")\n    exp_fn <- if (tdata$expect == \"error\") expect_error else expect_condition\n    # suppressWarnings or we drown in them:\n\n    suppressWarnings(exp_fn(\n            chop(!!x,\n              breaks    = eval(brk_funs[[!!tdata$brk_fun]]),\n              labels    = eval(lbl_funs[[!!tdata$lbl_fun]]),\n              extend    = !!tdata$extend,\n              left      = !!tdata$left,\n              close_end = !!tdata$close_end,\n              raw       = !!tdata$raw,\n              drop      = !!tdata$drop\n            ),\n            regexp = regexp,\n            class  = err_class,\n            info   = info\n          ))\n  }\n})\n\n"
  },
  {
    "path": "tests/testthat.R",
    "content": "library(testthat)\nlibrary(santoku)\n\ntest_check(\"santoku\")\n"
  },
  {
    "path": "vignettes/.gitignore",
    "content": "*.html\n*.R\n"
  },
  {
    "path": "vignettes/santoku.Rmd",
    "content": "---\ntitle: \"Introduction to santoku\"\noutput: \n  rmarkdown::html_vignette:\n    toc: true\nvignette: >\n  %\\VignetteIndexEntry{Introduction to santoku}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n```{r, include = FALSE}\nset.seed(23479)\n\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\"\n)\n\noptions(digits = 4)\n```\n\n\n## Introduction\n\nSantoku is a package for cutting data into intervals. It provides `chop()`, \na replacement for base R's `cut()` function, as well as several convenience\nfunctions to cut different kinds of intervals.\n\nTo install santoku, run:\n\n``` r\ninstall.packages(\"santoku\")\n```\n\n## Basic usage\n\nUse `chop()` like `cut()`, to cut numeric data into intervals between a set of\n`breaks`.\n\n```{r}\nlibrary(santoku)\n\nx <- runif(10, 0, 10)\n(chopped <- chop(x, breaks = 0:10))\ndata.frame(x, chopped)\n```\n\n`chop()` returns a factor.\n\nIf data is beyond the limits of `breaks`, they will be extended automatically:\n\n```{r}\nchopped <- chop(x, breaks = 3:7)\ndata.frame(x, chopped)\n```\n\nTo chop a single number into a separate category, put the number twice in\n`breaks`:\n\n```{r}\nx_fives <- x\nx_fives[1:5] <- 5\nchopped <- chop(x_fives, c(2, 5, 5, 8))\ndata.frame(x_fives, chopped)\n```\n\n\nTo quickly produce a table of chopped data, use `tab()`:\n\n```{r}\ntab(1:10, c(2, 5, 8))\n```\n\n## Chopping by width and number of elements\n\nTo chop into fixed-width intervals, starting at the minimum value, use\n`chop_width()`:\n\n```{r}\nchopped <- chop_width(x, 2)\ndata.frame(x, chopped)\n```\n\nTo chop into a fixed number of intervals, each with the same width, \nuse `chop_evenly()`:\n\n```{r}\nchopped <- chop_evenly(x, intervals = 3)\ndata.frame(x, chopped)\n```\n\nTo chop into groups with a fixed number of elements, use `chop_n()`:\n\n```{r}\nchopped <- chop_n(x, 4)\ntable(chopped)\n```\n\n\nTo chop into a fixed number of groups, each with the same number of elements,\nuse `chop_equally()`:\n\n```{r}\nchopped <- chop_equally(x, groups = 5)\ntable(chopped)\n```\n\nTo chop data up by quantiles, use `chop_quantiles()`:\n\n```{r}\nchopped <- chop_quantiles(x, c(0.25, 0.5, 0.75))\ndata.frame(x, chopped)\n```\n\nTo chop data up by proportions of the data range, use `chop_proportions()`:\n\n```{r}\nchopped <- chop_proportions(x, c(0.25, 0.5, 0.75))\ndata.frame(x, chopped)\n```\n\nYou can think of these six functions as logically arranged in a table.\n\nTo chop into...                | Sizing intervals by...    |   \n:------------------------------|:--------------------------|:----------------------\n&nbsp;                         | number of elements:       | interval width:\na specific number of equal intervals... | `chop_equally()`   | `chop_evenly()`\nintervals of one specific size...          | `chop_n()`         | `chop_width()`\nintervals of different specific sizes...   | `chop_quantiles()` | `chop_proportions()`\n\n: Different ways to chop by size\n\n## Even more ways to chop\n\nTo chop data by standard deviations around the mean, use `chop_mean_sd()`:\n\n```{r}\nchopped <- chop_mean_sd(x)\ndata.frame(x, chopped)\n```\n\nTo chop data into attractive intervals, use `chop_pretty()`. This \nselects intervals which are a multiple of 2, 5 or 10. It's useful for producing\nbar plots.\n\n```{r}\nchopped <- chop_pretty(x)\ndata.frame(x, chopped)\n```\n\n\n## Isolating common values\n\nIn exploratory work, it's sometimes useful to find common values and\ntreat them differently. You can use `dissect()` to do this:\n\n```{r}\nx_spike <- rnorm(100)\nx_spike[1:50] <- x_spike[1]\n\nchopped <- dissect(x_spike, -3:3, prop = 0.1)\ntable(chopped)\n\n```\n\n`prop = 0.2` will put any unique value of `x` into its own separate\ncategory if it makes up at least 20% of the data.\n\nNote that unlike all the other `chop_*` functions, `dissect()`\ndoesn't always categorize `x` into ordered, connected intervals. \nTo remind you of this, it is named differently. If you want to create\nseparate intervals on the left and right of common elements, use\n`chop_spikes()`:\n\n```{r}\nchopped <- chop_spikes(x_spike, -3:3, prop = 0.1)\ntable(chopped)\n```\n\nCompare this to the table before. There are two intervals on either\nside of the common value, instead of one interval surrounding it.\n\n\n## Quick tables\n\n`tab_n()`, `tab_width()`, and friends act similarly to\n`tab()`, calling the related `chop_*` function and then `table()` on the result.\n\n```{r}\ntab_n(x, 4)\ntab_width(x, 2)\ntab_evenly(x, 5)\ntab_mean_sd(x)\n```\n\n\n## Specifying labels\n\nBy default, santoku labels intervals using mathematical notation:\n\n* `[0, 1]` means all numbers between 0 and 1 inclusive.\n* `(0, 1)` means all numbers _strictly_ between 0 and 1, not including the\n  endpoints.\n* `[0, 1)` means all numbers between 0 and 1, including 0 but not 1.\n* `(0, 1]` means all numbers between 0 and 1, including 1 but not 0.\n* `{0}` means just the number 0.\n\n\nTo override these labels, provide names to the `breaks` argument:\n\n```{r}\nchopped <- chop(x, c(Lowest = 1, Low = 2, Higher = 5, Highest = 8))\ndata.frame(x, chopped)\n```\n\nOr, you can specify factor labels with the `labels` argument:\n\n```{r}\nchopped <- chop(x, c(2, 5, 8), labels = c(\"Lowest\", \"Low\", \"Higher\", \"Highest\"))\ndata.frame(x, chopped)\n```\n\nYou need as many labels as there are intervals - one fewer than `length(breaks)`\nif your data doesn't extend beyond `breaks`, one more than `length(breaks)` if\nit does.\n\nTo label intervals with a dash, use `lbl_dash()`:\n\n```{r}\nchopped <- chop(x, c(2, 5, 8), labels = lbl_dash())\ndata.frame(x, chopped)\n```\n\nTo label integer data, use `lbl_discrete()`. It uses more informative right \nendpoints:\n\n```{r}\nchopped  <- chop(1:10, c(2, 5, 8), labels = lbl_discrete())\nchopped2 <- chop(1:10, c(2, 5, 8), labels = lbl_dash())\ndata.frame(x = 1:10, lbl_discrete = chopped, lbl_dash = chopped2)\n```\n\nYou can customize the first or last labels:\n\n```{r}\nchopped <- chop(x, c(2, 5, 8), labels = lbl_dash(first = \"< 2\", last = \"8+\"))\ndata.frame(x, chopped)\n```\n\n\nTo label intervals in order use `lbl_seq()`:\n\n```{r}\nchopped <- chop(x, c(2, 5, 8), labels = lbl_seq())\ndata.frame(x, chopped)\n```\n\nYou can use numerals or even roman numerals:\n\n```{r}\nchop(x, c(2, 5, 8), labels = lbl_seq(\"(1)\"))\nchop(x, c(2, 5, 8), labels = lbl_seq(\"i.\"))\n```\n\nOther labelling functions include:\n\n* `lbl_endpoints()` - use left endpoints as labels\n* `lbl_midpoints()` - use interval midpoints as labels\n* `lbl_glue()` - specify labels flexibly with the `{glue}` package\n\n## Specifying breaks\n\nBy default, `chop()` extends `breaks` if necessary. If you don't want\nthat, set `extend = FALSE`:\n\n```{r}\nchopped <- chop(x, c(3, 5, 7), extend = FALSE)\ndata.frame(x, chopped)\n```\n\nData outside the range of `breaks` will become `NA`.\n\nBy default, intervals are closed on the left, i.e. they include their left\nendpoints. If you want right-closed intervals, set `left = FALSE`:\n\n```{r}\ny <- 1:5\ndata.frame(\n        y = y, \n        left_closed = chop(y, 1:5), \n        right_closed = chop(y, 1:5, left = FALSE)\n      )\n```\n\nBy default, the last interval is closed on both ends.\nIf you want to keep the last interval open at the end, \nset `close_end = FALSE`:\n\n```{r}\ndata.frame(\n  y = y,\n  end_closed = chop(y, 1:5),\n  end_open   = chop(y, 1:5, close_end = FALSE)\n)\n\n```\n\n\n# Chopping dates, times and other vectors\n\nYou can chop many kinds of vectors with santoku, including Date objects...\n\n```{r}\ny2k <- as.Date(\"2000-01-01\") + 0:10 * 7\ndata.frame(\n  y2k = y2k,\n  chopped = chop(y2k, as.Date(c(\"2000-02-01\", \"2000-03-01\")))\n)\n```\n\n\n... and POSIXct (date-time) objects:\n\n```{r}\n# hours of the 2020 Crew Dragon flight:\ncrew_dragon <- seq(as.POSIXct(\"2020-05-30 18:00\", tz = \"GMT\"), \n                     length.out = 24, by = \"hours\")\nliftoff <- as.POSIXct(\"2020-05-30 15:22\", tz = \"America/New_York\")\ndock    <- as.POSIXct(\"2020-05-31 10:16\", tz = \"America/New_York\")\n\ndata.frame(\n  crew_dragon = crew_dragon,\n  chopped = chop(crew_dragon, c(liftoff, dock), \n                   labels = c(\"pre-flight\", \"flight\", \"docked\"))\n)\n\n```\n\nNote how santoku correctly handles the different timezones.\n\nYou can use `chop_width()` with objects from the `lubridate` package, \nto chop by irregular periods such as months:\n\n```{r}\nlibrary(lubridate)\ndata.frame(\n  y2k = y2k,\n  chopped = chop_width(y2k, months(1))\n)\n```\n\n\n`lbl_date()` produces nicely formatted dates:\n\n```{r}\ndata.frame(\n  y2k = y2k,\n  chopped = chop_width(y2k, days(28), labels = lbl_date())\n)\n```\n\nYou can also chop vectors with units, using the `units` package:\n\n```{r}\nlibrary(units)\n\nx <- set_units(1:10 * 10, cm)\nbr <- set_units(1:3, ft)\ndata.frame(\n  x = x,\n  chopped = chop(x, br)\n)\n```\n\nYou should be able to chop anything that has a comparison operator. You can\neven chop character data using lexical ordering. By default santoku emits a \nwarning in this case, to avoid accidentally misinterpreting results:\n\n```{r}\nchop(letters[1:10], c(\"d\", \"f\"))\n```\n\nIf you find a type of data that you can't chop, please \n[file an issue](https://github.com/hughjonesd/santoku/issues)."
  },
  {
    "path": "vignettes/tutorials/chopping-dates-with-santoku.Rmd",
    "content": "---\ntitle: \"Chopping dates and times with santoku\"\nauthor: \"David Hugh-Jones\"\ndate: \"`r Sys.Date()`\"\noutput:\n  xaringan::moon_reader:\n    css: [default, default-fonts]\n    chakra: libs/remark-latest.min.js\n    seal: false\n    lib_dir: libs\n    nature:\n      highlightStyle: tomorrow-night\n      highlightLines: true\n      countIncrementalSlides: false\n---\nclass: center, middle\n\n<style>\n.inverse {\n  background-color: #141417;\n}\n</style>\n\n# Chopping dates with santoku\n## David Hugh-Jones\n\n<img src=\"figures/logo.png\" style=\"width: 250px\" />\n\n```{r setup, include = FALSE}\nlibrary(ggplot2)\nlibrary(santoku)\nlibrary(lubridate)\n\noptions(htmltools.dir.version = FALSE)\nknitr::opts_chunk$set(\n        fig.height = 2,\n        fig.width  = 10,\n        dpi        = 144,\n        dev        = 'quartz_png',\n        fig.align  = \"center\",\n        out.width  = \"90%\",\n        dev.args   = \"transparent\"\n      )\ndate_plot <- function (dates, chopped) {\n  chopped_q <- rlang::enquo(chopped)\n  dfr <- data.frame(dates = dates, chopped = chopped)\n  dfr <- dplyr::rename(dfr, \"{{chopped}}\" := chopped) \n  \n  xscale <- if (inherits(dates, \"Date\")) {\n    scale_x_date(expand = expansion(mult = .15))\n  } else {\n    scale_x_datetime(expand = expansion(mult = .15))\n  }\n  # xscale <- NULL\n  # \n  ggplot(dfr, aes(x = dates, y = 1, color = {{chopped_q}})) + \n        geom_point(size = 4, shape = \"circle filled\", stroke = 2) +\n        theme_void() +\n        theme(\n          text                = element_text(colour = \"white\", size = 14),\n          legend.text         = element_text(colour = \"white\", size = 15),\n          axis.text.y         = element_blank(),\n          axis.text.x         = element_text(colour = \"white\", size = 14),\n          axis.line.x         = element_line(colour = \"yellow\"),\n          axis.ticks.length.x = unit(0.3, \"lines\"),\n          axis.ticks.x        = element_line(colour = \"yellow\"),\n          rect                = element_rect(fill = \"transparent\", colour = NA),\n          plot.margin         = unit(c(4, 4, 4, 4), \"mm\")\n        ) +\n        labs(y = \"\") +\n        xscale\n}\n\n```\n\n---\nclass: middle, center\n\n# Santoku is a package for chopping data.\n\n## It provides `chop()`, a replacement for `base::cut()`.\n\n---\nclass: middle, center\n\n# Santoku 0.4.0 can chop dates.\n\n<img src=\"figures/date.png\" style=\"width: 300px;\" />\n\n---\nclass: inverse, middle\n\n\n```{r, results = \"hide\"}\ny2k <- as.Date(\"2000-01-01\") + 0:365\ny2k_sample <- sample(y2k, 60)\nbrk_dates <- as.Date(c(\"2000-01-15\", \"2000-04-01\", \"2000-08-01\"))\n\nchopped <- chop(y2k_sample, brk_dates)\n```\n\n```{r, echo = FALSE}\ndate_plot(y2k_sample, chopped)\n```\n\n---\nclass: inverse, top\n\n# You can use the usual `chop` functions.\n\n```{r, results = \"hide\"}\nquartile <- chop_quantiles(y2k_sample, c(0.25, 0.75))\n```\n\n```{r, echo = FALSE}\ndate_plot(y2k_sample, quartile)\n```\n\n---\nclass: inverse\n\n# `lbl_date()` produces nice labels.\n\n```{r}\nx <- chop(y2k_sample, brk_dates, labels = lbl_date())\n\ntable(x)\n```\n\n\n---\nclass: inverse\n\n# `chop_width()` works.\n\n* It accepts `difftime`, `lubridate::Period` and `lubridate::Duration` widths.\n\n--\n\n  ```{r}\n  x <- chop_width(y2k, months(1), labels = lbl_endpoints(fmt = \"%b\"))\n         \n  table(x)\n  ```\n\n--\n\n* `Period` objects get the month right.\n\n---\nclass: center, middle\n\n# Chopping time works too.\n\n<img src=\"figures/thyme.jpg\" />\n\n---\nbackground-image: url(figures/crew-dragon.jpg)\nbackground-size: cover\nclass: inverse, middle\n\n<style>\n.hljs-tomorrow-night .hljs {\n  opacity: 0.98;\n}\n</style>\n\n\n\n```{r, results = \"hide\"}\ncrew_dragon <- as.POSIXct(c(\n                    liftoff = \"2020-05-30 15:22\", \n                    dock    = \"2020-05-31 10:16\"), \n                  tz = \"America/New_York\")\n\nuk_times <- seq(as.POSIXct(\"2020-05-30 18:00\", tz = \"GMT\"), \n              length.out = 24, by = \"hours\")\n\nstage <- chop(uk_times, crew_dragon, \n           labels = c(\"pre-flight\", \"flight\", \"docked\"))\n```\n\n\n```{r, echo = FALSE, dev.args = list(bg = rgb(.5, .5, .5, .4))}\ndate_plot(uk_times, stage)\n```\n\n---\nclass: inverse\n\n# `lbl_datetime()` labels datetimes.\n\n  ```{r}\n  x <- chop_width(uk_times, hours(4), \n                  labels = lbl_datetime(fmt = \"%H:%M %b %d\"))\n  table(x)\n  ```\n---\n\nclass: middle center\n\n# Happy chopping!\n\n<img src=\"figures/logo.png\" style=\"width: 250px\" />\n\n[CRAN](https://cran.r-project.org/package=santoku)\n\n[github](https://hughjonesd.github.io/santoku)"
  },
  {
    "path": "vignettes/tutorials/libs/Proj4Leaflet/proj4-compressed.js",
    "content": "!function(a){if(\"object\"==typeof exports)module.exports=a();else if(\"function\"==typeof define&&define.amd)define(a);else{var b;\"undefined\"!=typeof window?b=window:\"undefined\"!=typeof global?b=global:\"undefined\"!=typeof self&&(b=self),b.proj4=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error(\"Cannot find module '\"+g+\"'\")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){function Point(a,b,c){if(!(this instanceof Point))return new Point(a,b,c);if(Array.isArray(a))this.x=a[0],this.y=a[1],this.z=a[2]||0;else if(\"object\"==typeof a)this.x=a.x,this.y=a.y,this.z=a.z||0;else if(\"string\"==typeof a&&\"undefined\"==typeof b){var d=a.split(\",\");this.x=parseFloat(d[0],10),this.y=parseFloat(d[1],10),this.z=parseFloat(d[2],10)||0}else this.x=a,this.y=b,this.z=c||0;console.warn(\"proj4.Point will be removed in version 3, use proj4.toPoint\")}var d=a(\"mgrs\");Point.fromMGRS=function(a){return new Point(d.toPoint(a))},Point.prototype.toMGRS=function(a){return d.forward([this.x,this.y],a)},b.exports=Point},{mgrs:67}],2:[function(a,b,c){function Projection(a,b){if(!(this instanceof Projection))return new Projection(a);b=b||function(a){if(a)throw a};var c=d(a);if(\"object\"!=typeof c)return void b(a);var f=g(c),h=Projection.projections.get(f.projName);h?(e(this,f),e(this,h),this.init(),b(null,this)):b(a)}var d=a(\"./parseCode\"),e=a(\"./extend\"),f=a(\"./projections\"),g=a(\"./deriveConstants\");Projection.projections=f,Projection.projections.start(),b.exports=Projection},{\"./deriveConstants\":33,\"./extend\":34,\"./parseCode\":37,\"./projections\":39}],3:[function(a,b,c){b.exports=function(a,b,c){var d,e,f,g=c.x,h=c.y,i=c.z||0;for(f=0;3>f;f++)if(!b||2!==f||void 0!==c.z)switch(0===f?(d=g,e=\"x\"):1===f?(d=h,e=\"y\"):(d=i,e=\"z\"),a.axis[f]){case\"e\":c[e]=d;break;case\"w\":c[e]=-d;break;case\"n\":c[e]=d;break;case\"s\":c[e]=-d;break;case\"u\":void 0!==c[e]&&(c.z=d);break;case\"d\":void 0!==c[e]&&(c.z=-d);break;default:return null}return c}},{}],4:[function(a,b,c){var d=Math.PI/2,e=a(\"./sign\");b.exports=function(a){return Math.abs(a)<d?a:a-e(a)*Math.PI}},{\"./sign\":21}],5:[function(a,b,c){var d=2*Math.PI,e=3.14159265359,f=a(\"./sign\");b.exports=function(a){return Math.abs(a)<=e?a:a-f(a)*d}},{\"./sign\":21}],6:[function(a,b,c){b.exports=function(a){return Math.abs(a)>1&&(a=a>1?1:-1),Math.asin(a)}},{}],7:[function(a,b,c){b.exports=function(a){return 1-.25*a*(1+a/16*(3+1.25*a))}},{}],8:[function(a,b,c){b.exports=function(a){return.375*a*(1+.25*a*(1+.46875*a))}},{}],9:[function(a,b,c){b.exports=function(a){return.05859375*a*a*(1+.75*a)}},{}],10:[function(a,b,c){b.exports=function(a){return a*a*a*(35/3072)}},{}],11:[function(a,b,c){b.exports=function(a,b,c){var d=b*c;return a/Math.sqrt(1-d*d)}},{}],12:[function(a,b,c){b.exports=function(a,b,c,d,e){var f,g;f=a/b;for(var h=0;15>h;h++)if(g=(a-(b*f-c*Math.sin(2*f)+d*Math.sin(4*f)-e*Math.sin(6*f)))/(b-2*c*Math.cos(2*f)+4*d*Math.cos(4*f)-6*e*Math.cos(6*f)),f+=g,Math.abs(g)<=1e-10)return f;return NaN}},{}],13:[function(a,b,c){var d=Math.PI/2;b.exports=function(a,b){var c=1-(1-a*a)/(2*a)*Math.log((1-a)/(1+a));if(Math.abs(Math.abs(b)-c)<1e-6)return 0>b?-1*d:d;for(var e,f,g,h,i=Math.asin(.5*b),j=0;30>j;j++)if(f=Math.sin(i),g=Math.cos(i),h=a*f,e=Math.pow(1-h*h,2)/(2*g)*(b/(1-a*a)-f/(1-h*h)+.5/a*Math.log((1-h)/(1+h))),i+=e,Math.abs(e)<=1e-10)return i;return NaN}},{}],14:[function(a,b,c){b.exports=function(a,b,c,d,e){return a*e-b*Math.sin(2*e)+c*Math.sin(4*e)-d*Math.sin(6*e)}},{}],15:[function(a,b,c){b.exports=function(a,b,c){var d=a*b;return c/Math.sqrt(1-d*d)}},{}],16:[function(a,b,c){var d=Math.PI/2;b.exports=function(a,b){for(var c,e,f=.5*a,g=d-2*Math.atan(b),h=0;15>=h;h++)if(c=a*Math.sin(g),e=d-2*Math.atan(b*Math.pow((1-c)/(1+c),f))-g,g+=e,Math.abs(e)<=1e-10)return g;return-9999}},{}],17:[function(a,b,c){var d=1,e=.25,f=.046875,g=.01953125,h=.01068115234375,i=.75,j=.46875,k=.013020833333333334,l=.007120768229166667,m=.3645833333333333,n=.005696614583333333,o=.3076171875;b.exports=function(a){var b=[];b[0]=d-a*(e+a*(f+a*(g+a*h))),b[1]=a*(i-a*(f+a*(g+a*h)));var c=a*a;return b[2]=c*(j-a*(k+a*l)),c*=a,b[3]=c*(m-a*n),b[4]=c*a*o,b}},{}],18:[function(a,b,c){var d=a(\"./pj_mlfn\"),e=1e-10,f=20;b.exports=function(a,b,c){for(var g=1/(1-b),h=a,i=f;i;--i){var j=Math.sin(h),k=1-b*j*j;if(k=(d(h,j,Math.cos(h),c)-a)*(k*Math.sqrt(k))*g,h-=k,Math.abs(k)<e)return h}return h}},{\"./pj_mlfn\":19}],19:[function(a,b,c){b.exports=function(a,b,c,d){return c*=b,b*=b,d[0]*a-c*(d[1]+b*(d[2]+b*(d[3]+b*d[4])))}},{}],20:[function(a,b,c){b.exports=function(a,b){var c;return a>1e-7?(c=a*b,(1-a*a)*(b/(1-c*c)-.5/a*Math.log((1-c)/(1+c)))):2*b}},{}],21:[function(a,b,c){b.exports=function(a){return 0>a?-1:1}},{}],22:[function(a,b,c){b.exports=function(a,b){return Math.pow((1-a)/(1+a),b)}},{}],23:[function(a,b,c){b.exports=function(a){var b={x:a[0],y:a[1]};return a.length>2&&(b.z=a[2]),a.length>3&&(b.m=a[3]),b}},{}],24:[function(a,b,c){var d=Math.PI/2;b.exports=function(a,b,c){var e=a*c,f=.5*a;return e=Math.pow((1-e)/(1+e),f),Math.tan(.5*(d-b))/e}},{}],25:[function(a,b,c){c.wgs84={towgs84:\"0,0,0\",ellipse:\"WGS84\",datumName:\"WGS84\"},c.ch1903={towgs84:\"674.374,15.056,405.346\",ellipse:\"bessel\",datumName:\"swiss\"},c.ggrs87={towgs84:\"-199.87,74.79,246.62\",ellipse:\"GRS80\",datumName:\"Greek_Geodetic_Reference_System_1987\"},c.nad83={towgs84:\"0,0,0\",ellipse:\"GRS80\",datumName:\"North_American_Datum_1983\"},c.nad27={nadgrids:\"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat\",ellipse:\"clrk66\",datumName:\"North_American_Datum_1927\"},c.potsdam={towgs84:\"606.0,23.0,413.0\",ellipse:\"bessel\",datumName:\"Potsdam Rauenberg 1950 DHDN\"},c.carthage={towgs84:\"-263.0,6.0,431.0\",ellipse:\"clark80\",datumName:\"Carthage 1934 Tunisia\"},c.hermannskogel={towgs84:\"653.0,-212.0,449.0\",ellipse:\"bessel\",datumName:\"Hermannskogel\"},c.ire65={towgs84:\"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15\",ellipse:\"mod_airy\",datumName:\"Ireland 1965\"},c.rassadiran={towgs84:\"-133.63,-157.5,-158.62\",ellipse:\"intl\",datumName:\"Rassadiran\"},c.nzgd49={towgs84:\"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993\",ellipse:\"intl\",datumName:\"New Zealand Geodetic Datum 1949\"},c.osgb36={towgs84:\"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894\",ellipse:\"airy\",datumName:\"Airy 1830\"},c.s_jtsk={towgs84:\"589,76,480\",ellipse:\"bessel\",datumName:\"S-JTSK (Ferro)\"},c.beduaram={towgs84:\"-106,-87,188\",ellipse:\"clrk80\",datumName:\"Beduaram\"},c.gunung_segara={towgs84:\"-403,684,41\",ellipse:\"bessel\",datumName:\"Gunung Segara Jakarta\"},c.rnb72={towgs84:\"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1\",ellipse:\"intl\",datumName:\"Reseau National Belge 1972\"}},{}],26:[function(a,b,c){c.MERIT={a:6378137,rf:298.257,ellipseName:\"MERIT 1983\"},c.SGS85={a:6378136,rf:298.257,ellipseName:\"Soviet Geodetic System 85\"},c.GRS80={a:6378137,rf:298.257222101,ellipseName:\"GRS 1980(IUGG, 1980)\"},c.IAU76={a:6378140,rf:298.257,ellipseName:\"IAU 1976\"},c.airy={a:6377563.396,b:6356256.91,ellipseName:\"Airy 1830\"},c.APL4={a:6378137,rf:298.25,ellipseName:\"Appl. Physics. 1965\"},c.NWL9D={a:6378145,rf:298.25,ellipseName:\"Naval Weapons Lab., 1965\"},c.mod_airy={a:6377340.189,b:6356034.446,ellipseName:\"Modified Airy\"},c.andrae={a:6377104.43,rf:300,ellipseName:\"Andrae 1876 (Den., Iclnd.)\"},c.aust_SA={a:6378160,rf:298.25,ellipseName:\"Australian Natl & S. Amer. 1969\"},c.GRS67={a:6378160,rf:298.247167427,ellipseName:\"GRS 67(IUGG 1967)\"},c.bessel={a:6377397.155,rf:299.1528128,ellipseName:\"Bessel 1841\"},c.bess_nam={a:6377483.865,rf:299.1528128,ellipseName:\"Bessel 1841 (Namibia)\"},c.clrk66={a:6378206.4,b:6356583.8,ellipseName:\"Clarke 1866\"},c.clrk80={a:6378249.145,rf:293.4663,ellipseName:\"Clarke 1880 mod.\"},c.clrk58={a:6378293.645208759,rf:294.2606763692654,ellipseName:\"Clarke 1858\"},c.CPM={a:6375738.7,rf:334.29,ellipseName:\"Comm. des Poids et Mesures 1799\"},c.delmbr={a:6376428,rf:311.5,ellipseName:\"Delambre 1810 (Belgium)\"},c.engelis={a:6378136.05,rf:298.2566,ellipseName:\"Engelis 1985\"},c.evrst30={a:6377276.345,rf:300.8017,ellipseName:\"Everest 1830\"},c.evrst48={a:6377304.063,rf:300.8017,ellipseName:\"Everest 1948\"},c.evrst56={a:6377301.243,rf:300.8017,ellipseName:\"Everest 1956\"},c.evrst69={a:6377295.664,rf:300.8017,ellipseName:\"Everest 1969\"},c.evrstSS={a:6377298.556,rf:300.8017,ellipseName:\"Everest (Sabah & Sarawak)\"},c.fschr60={a:6378166,rf:298.3,ellipseName:\"Fischer (Mercury Datum) 1960\"},c.fschr60m={a:6378155,rf:298.3,ellipseName:\"Fischer 1960\"},c.fschr68={a:6378150,rf:298.3,ellipseName:\"Fischer 1968\"},c.helmert={a:6378200,rf:298.3,ellipseName:\"Helmert 1906\"},c.hough={a:6378270,rf:297,ellipseName:\"Hough\"},c.intl={a:6378388,rf:297,ellipseName:\"International 1909 (Hayford)\"},c.kaula={a:6378163,rf:298.24,ellipseName:\"Kaula 1961\"},c.lerch={a:6378139,rf:298.257,ellipseName:\"Lerch 1979\"},c.mprts={a:6397300,rf:191,ellipseName:\"Maupertius 1738\"},c.new_intl={a:6378157.5,b:6356772.2,ellipseName:\"New International 1967\"},c.plessis={a:6376523,rf:6355863,ellipseName:\"Plessis 1817 (France)\"},c.krass={a:6378245,rf:298.3,ellipseName:\"Krassovsky, 1942\"},c.SEasia={a:6378155,b:6356773.3205,ellipseName:\"Southeast Asia\"},c.walbeck={a:6376896,b:6355834.8467,ellipseName:\"Walbeck\"},c.WGS60={a:6378165,rf:298.3,ellipseName:\"WGS 60\"},c.WGS66={a:6378145,rf:298.25,ellipseName:\"WGS 66\"},c.WGS7={a:6378135,rf:298.26,ellipseName:\"WGS 72\"},c.WGS84={a:6378137,rf:298.257223563,ellipseName:\"WGS 84\"},c.sphere={a:6370997,b:6370997,ellipseName:\"Normal Sphere (r=6370997)\"}},{}],27:[function(a,b,c){c.greenwich=0,c.lisbon=-9.131906111111,c.paris=2.337229166667,c.bogota=-74.080916666667,c.madrid=-3.687938888889,c.rome=12.452333333333,c.bern=7.439583333333,c.jakarta=106.807719444444,c.ferro=-17.666666666667,c.brussels=4.367975,c.stockholm=18.058277777778,c.athens=23.7163375,c.oslo=10.722916666667},{}],28:[function(a,b,c){c.ft={to_meter:.3048},c[\"us-ft\"]={to_meter:1200/3937}},{}],29:[function(a,b,c){function d(a,b,c){var d;return Array.isArray(c)?(d=g(a,b,c),3===c.length?[d.x,d.y,d.z]:[d.x,d.y]):g(a,b,c)}function e(a){return a instanceof f?a:a.oProj?a.oProj:f(a)}function proj4(a,b,c){a=e(a);var f,g=!1;return\"undefined\"==typeof b?(b=a,a=h,g=!0):(\"undefined\"!=typeof b.x||Array.isArray(b))&&(c=b,b=a,a=h,g=!0),b=e(b),c?d(a,b,c):(f={forward:function(c){return d(a,b,c)},inverse:function(c){return d(b,a,c)}},g&&(f.oProj=b),f)}var f=a(\"./Proj\"),g=a(\"./transform\"),h=f(\"WGS84\");b.exports=proj4},{\"./Proj\":2,\"./transform\":65}],30:[function(a,b,c){var d=Math.PI/2,e=1,f=2,g=3,h=4,i=5,j=484813681109536e-20,k=1.0026,l=.3826834323650898,m=function(a){return this instanceof m?(this.datum_type=h,void(a&&(a.datumCode&&\"none\"===a.datumCode&&(this.datum_type=i),a.datum_params&&(this.datum_params=a.datum_params.map(parseFloat),(0!==this.datum_params[0]||0!==this.datum_params[1]||0!==this.datum_params[2])&&(this.datum_type=e),this.datum_params.length>3&&(0!==this.datum_params[3]||0!==this.datum_params[4]||0!==this.datum_params[5]||0!==this.datum_params[6])&&(this.datum_type=f,this.datum_params[3]*=j,this.datum_params[4]*=j,this.datum_params[5]*=j,this.datum_params[6]=this.datum_params[6]/1e6+1)),this.datum_type=a.grids?g:this.datum_type,this.a=a.a,this.b=a.b,this.es=a.es,this.ep2=a.ep2,this.datum_type===g&&(this.grids=a.grids)))):new m(a)};m.prototype={compare_datums:function(a){return this.datum_type!==a.datum_type?!1:this.a!==a.a||Math.abs(this.es-a.es)>5e-11?!1:this.datum_type===e?this.datum_params[0]===a.datum_params[0]&&this.datum_params[1]===a.datum_params[1]&&this.datum_params[2]===a.datum_params[2]:this.datum_type===f?this.datum_params[0]===a.datum_params[0]&&this.datum_params[1]===a.datum_params[1]&&this.datum_params[2]===a.datum_params[2]&&this.datum_params[3]===a.datum_params[3]&&this.datum_params[4]===a.datum_params[4]&&this.datum_params[5]===a.datum_params[5]&&this.datum_params[6]===a.datum_params[6]:this.datum_type===g||a.datum_type===g?this.nadgrids===a.nadgrids:!0},geodetic_to_geocentric:function(a){var b,c,e,f,g,h,i,j=a.x,k=a.y,l=a.z?a.z:0,m=0;if(-d>k&&k>-1.001*d)k=-d;else if(k>d&&1.001*d>k)k=d;else if(-d>k||k>d)return null;return j>Math.PI&&(j-=2*Math.PI),g=Math.sin(k),i=Math.cos(k),h=g*g,f=this.a/Math.sqrt(1-this.es*h),b=(f+l)*i*Math.cos(j),c=(f+l)*i*Math.sin(j),e=(f*(1-this.es)+l)*g,a.x=b,a.y=c,a.z=e,m},geocentric_to_geodetic:function(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t=1e-12,u=t*t,v=30,w=a.x,x=a.y,y=a.z?a.z:0;if(o=!1,b=Math.sqrt(w*w+x*x),c=Math.sqrt(w*w+x*x+y*y),b/this.a<t){if(o=!0,q=0,c/this.a<t)return r=d,void(s=-this.b)}else q=Math.atan2(x,w);e=y/c,f=b/c,g=1/Math.sqrt(1-this.es*(2-this.es)*f*f),j=f*(1-this.es)*g,k=e*g,p=0;do p++,i=this.a/Math.sqrt(1-this.es*k*k),s=b*j+y*k-i*(1-this.es*k*k),h=this.es*i/(i+s),g=1/Math.sqrt(1-h*(2-h)*f*f),l=f*(1-h)*g,m=e*g,n=m*j-l*k,j=l,k=m;while(n*n>u&&v>p);return r=Math.atan(m/Math.abs(l)),a.x=q,a.y=r,a.z=s,a},geocentric_to_geodetic_noniter:function(a){var b,c,e,f,g,h,i,j,m,n,o,p,q,r,s,t,u,v=a.x,w=a.y,x=a.z?a.z:0;if(v=parseFloat(v),w=parseFloat(w),x=parseFloat(x),u=!1,0!==v)b=Math.atan2(w,v);else if(w>0)b=d;else if(0>w)b=-d;else if(u=!0,b=0,x>0)c=d;else{if(!(0>x))return c=d,void(e=-this.b);c=-d}return g=v*v+w*w,f=Math.sqrt(g),h=x*k,j=Math.sqrt(h*h+g),n=h/j,p=f/j,o=n*n*n,i=x+this.b*this.ep2*o,t=f-this.a*this.es*p*p*p,m=Math.sqrt(i*i+t*t),q=i/m,r=t/m,s=this.a/Math.sqrt(1-this.es*q*q),e=r>=l?f/r-s:-l>=r?f/-r-s:x/q+s*(this.es-1),u===!1&&(c=Math.atan(q/r)),a.x=b,a.y=c,a.z=e,a},geocentric_to_wgs84:function(a){if(this.datum_type===e)a.x+=this.datum_params[0],a.y+=this.datum_params[1],a.z+=this.datum_params[2];else if(this.datum_type===f){var b=this.datum_params[0],c=this.datum_params[1],d=this.datum_params[2],g=this.datum_params[3],h=this.datum_params[4],i=this.datum_params[5],j=this.datum_params[6],k=j*(a.x-i*a.y+h*a.z)+b,l=j*(i*a.x+a.y-g*a.z)+c,m=j*(-h*a.x+g*a.y+a.z)+d;a.x=k,a.y=l,a.z=m}},geocentric_from_wgs84:function(a){if(this.datum_type===e)a.x-=this.datum_params[0],a.y-=this.datum_params[1],a.z-=this.datum_params[2];else if(this.datum_type===f){var b=this.datum_params[0],c=this.datum_params[1],d=this.datum_params[2],g=this.datum_params[3],h=this.datum_params[4],i=this.datum_params[5],j=this.datum_params[6],k=(a.x-b)/j,l=(a.y-c)/j,m=(a.z-d)/j;a.x=k+i*l-h*m,a.y=-i*k+l+g*m,a.z=h*k-g*l+m}}},b.exports=m},{}],31:[function(a,b,c){var d=1,e=2,f=3,g=5,h=6378137,i=.006694379990141316;b.exports=function(a,b,c){function j(a){return a===d||a===e}var k,l,m;if(a.compare_datums(b))return c;if(a.datum_type===g||b.datum_type===g)return c;var n=a.a,o=a.es,p=b.a,q=b.es,r=a.datum_type;if(r===f)if(0===this.apply_gridshift(a,0,c))a.a=h,a.es=i;else{if(!a.datum_params)return a.a=n,a.es=a.es,c;for(k=1,l=0,m=a.datum_params.length;m>l;l++)k*=a.datum_params[l];if(0===k)return a.a=n,a.es=a.es,c;r=a.datum_params.length>3?e:d}return b.datum_type===f&&(b.a=h,b.es=i),(a.es!==b.es||a.a!==b.a||j(r)||j(b.datum_type))&&(a.geodetic_to_geocentric(c),j(a.datum_type)&&a.geocentric_to_wgs84(c),j(b.datum_type)&&b.geocentric_from_wgs84(c),b.geocentric_to_geodetic(c)),b.datum_type===f&&this.apply_gridshift(b,1,c),a.a=n,a.es=o,b.a=p,b.es=q,c}},{}],32:[function(a,b,c){function d(a){var b=this;if(2===arguments.length){var c=arguments[1];\"string\"==typeof c?\"+\"===c.charAt(0)?d[a]=f(arguments[1]):d[a]=g(arguments[1]):d[a]=c}else if(1===arguments.length){if(Array.isArray(a))return a.map(function(a){Array.isArray(a)?d.apply(b,a):d(a)});if(\"string\"==typeof a){if(a in d)return d[a]}else\"EPSG\"in a?d[\"EPSG:\"+a.EPSG]=a:\"ESRI\"in a?d[\"ESRI:\"+a.ESRI]=a:\"IAU2000\"in a?d[\"IAU2000:\"+a.IAU2000]=a:console.log(a);return}}var e=a(\"./global\"),f=a(\"./projString\"),g=a(\"./wkt\");e(d),b.exports=d},{\"./global\":35,\"./projString\":38,\"./wkt\":66}],33:[function(a,b,c){var d=a(\"./constants/Datum\"),e=a(\"./constants/Ellipsoid\"),f=a(\"./extend\"),g=a(\"./datum\"),h=1e-10,i=.16666666666666666,j=.04722222222222222,k=.022156084656084655;b.exports=function(a){if(a.datumCode&&\"none\"!==a.datumCode){var b=d[a.datumCode];b&&(a.datum_params=b.towgs84?b.towgs84.split(\",\"):null,a.ellps=b.ellipse,a.datumName=b.datumName?b.datumName:a.datumCode)}if(!a.a){var c=e[a.ellps]?e[a.ellps]:e.WGS84;f(a,c)}return a.rf&&!a.b&&(a.b=(1-1/a.rf)*a.a),(0===a.rf||Math.abs(a.a-a.b)<h)&&(a.sphere=!0,a.b=a.a),a.a2=a.a*a.a,a.b2=a.b*a.b,a.es=(a.a2-a.b2)/a.a2,a.e=Math.sqrt(a.es),a.R_A&&(a.a*=1-a.es*(i+a.es*(j+a.es*k)),a.a2=a.a*a.a,a.b2=a.b*a.b,a.es=0),a.ep2=(a.a2-a.b2)/a.b2,a.k0||(a.k0=1),a.axis||(a.axis=\"enu\"),a.datum||(a.datum=g(a)),a}},{\"./constants/Datum\":25,\"./constants/Ellipsoid\":26,\"./datum\":30,\"./extend\":34}],34:[function(a,b,c){b.exports=function(a,b){a=a||{};var c,d;if(!b)return a;for(d in b)c=b[d],void 0!==c&&(a[d]=c);return a}},{}],35:[function(a,b,c){b.exports=function(a){a(\"EPSG:4326\",\"+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees\"),a(\"EPSG:4269\",\"+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees\"),a(\"EPSG:3857\",\"+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs\"),a.WGS84=a[\"EPSG:4326\"],a[\"EPSG:3785\"]=a[\"EPSG:3857\"],a.GOOGLE=a[\"EPSG:3857\"],a[\"EPSG:900913\"]=a[\"EPSG:3857\"],a[\"EPSG:102113\"]=a[\"EPSG:3857\"]}},{}],36:[function(a,b,c){var proj4=a(\"./core\");proj4.defaultDatum=\"WGS84\",proj4.Proj=a(\"./Proj\"),proj4.WGS84=new proj4.Proj(\"WGS84\"),proj4.Point=a(\"./Point\"),proj4.toPoint=a(\"./common/toPoint\"),proj4.defs=a(\"./defs\"),proj4.transform=a(\"./transform\"),proj4.mgrs=a(\"mgrs\"),proj4.version=a(\"../package.json\").version,a(\"./includedProjections\")(proj4),b.exports=proj4},{\"../package.json\":68,\"./Point\":1,\"./Proj\":2,\"./common/toPoint\":23,\"./core\":29,\"./defs\":32,\"./includedProjections\":\"hTEDpn\",\"./transform\":65,mgrs:67}],37:[function(a,b,c){function d(a){return\"string\"==typeof a}function e(a){return a in i}function f(a){var b=[\"GEOGCS\",\"GEOCCS\",\"PROJCS\",\"LOCAL_CS\"];return b.reduce(function(b,c){return b+1+a.indexOf(c)},0)}function g(a){return\"+\"===a[0]}function h(a){return d(a)?e(a)?i[a]:f(a)?j(a):g(a)?k(a):void 0:a}var i=a(\"./defs\"),j=a(\"./wkt\"),k=a(\"./projString\");b.exports=h},{\"./defs\":32,\"./projString\":38,\"./wkt\":66}],38:[function(a,b,c){var d=.017453292519943295,e=a(\"./constants/PrimeMeridian\"),f=a(\"./constants/units\");b.exports=function(a){var b={},c={};a.split(\"+\").map(function(a){return a.trim()}).filter(function(a){return a}).forEach(function(a){var b=a.split(\"=\");b.push(!0),c[b[0].toLowerCase()]=b[1]});var g,h,i,j={proj:\"projName\",datum:\"datumCode\",rf:function(a){b.rf=parseFloat(a)},lat_0:function(a){b.lat0=a*d},lat_1:function(a){b.lat1=a*d},lat_2:function(a){b.lat2=a*d},lat_ts:function(a){b.lat_ts=a*d},lon_0:function(a){b.long0=a*d},lon_1:function(a){b.long1=a*d},lon_2:function(a){b.long2=a*d},alpha:function(a){b.alpha=parseFloat(a)*d},lonc:function(a){b.longc=a*d},x_0:function(a){b.x0=parseFloat(a)},y_0:function(a){b.y0=parseFloat(a)},k_0:function(a){b.k0=parseFloat(a)},k:function(a){b.k0=parseFloat(a)},a:function(a){b.a=parseFloat(a)},b:function(a){b.b=parseFloat(a)},r_a:function(){b.R_A=!0},zone:function(a){b.zone=parseInt(a,10)},south:function(){b.utmSouth=!0},towgs84:function(a){b.datum_params=a.split(\",\").map(function(a){return parseFloat(a)})},to_meter:function(a){b.to_meter=parseFloat(a)},units:function(a){b.units=a,f[a]&&(b.to_meter=f[a].to_meter)},from_greenwich:function(a){b.from_greenwich=a*d},pm:function(a){b.from_greenwich=(e[a]?e[a]:parseFloat(a))*d},nadgrids:function(a){\"@null\"===a?b.datumCode=\"none\":b.nadgrids=a},axis:function(a){var c=\"ewnsud\";3===a.length&&-1!==c.indexOf(a.substr(0,1))&&-1!==c.indexOf(a.substr(1,1))&&-1!==c.indexOf(a.substr(2,1))&&(b.axis=a)}};for(g in c)h=c[g],g in j?(i=j[g],\"function\"==typeof i?i(h):b[i]=h):b[g]=h;return\"string\"==typeof b.datumCode&&\"WGS84\"!==b.datumCode&&(b.datumCode=b.datumCode.toLowerCase()),b}},{\"./constants/PrimeMeridian\":27,\"./constants/units\":28}],39:[function(a,b,c){function d(a,b){var c=g.length;return a.names?(g[c]=a,a.names.forEach(function(a){f[a.toLowerCase()]=c}),this):(console.log(b),!0)}var e=[a(\"./projections/merc\"),a(\"./projections/longlat\")],f={},g=[];c.add=d,c.get=function(a){if(!a)return!1;var b=a.toLowerCase();return\"undefined\"!=typeof f[b]&&g[f[b]]?g[f[b]]:void 0},c.start=function(){e.forEach(d)}},{\"./projections/longlat\":51,\"./projections/merc\":52}],40:[function(a,b,c){var d=1e-10,e=a(\"../common/msfnz\"),f=a(\"../common/qsfnz\"),g=a(\"../common/adjust_lon\"),h=a(\"../common/asinz\");c.init=function(){Math.abs(this.lat1+this.lat2)<d||(this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e3=Math.sqrt(this.es),this.sin_po=Math.sin(this.lat1),this.cos_po=Math.cos(this.lat1),this.t1=this.sin_po,this.con=this.sin_po,this.ms1=e(this.e3,this.sin_po,this.cos_po),this.qs1=f(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat2),this.cos_po=Math.cos(this.lat2),this.t2=this.sin_po,this.ms2=e(this.e3,this.sin_po,this.cos_po),this.qs2=f(this.e3,this.sin_po,this.cos_po),this.sin_po=Math.sin(this.lat0),this.cos_po=Math.cos(this.lat0),this.t3=this.sin_po,this.qs0=f(this.e3,this.sin_po,this.cos_po),Math.abs(this.lat1-this.lat2)>d?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},c.forward=function(a){var b=a.x,c=a.y;this.sin_phi=Math.sin(c),this.cos_phi=Math.cos(c);var d=f(this.e3,this.sin_phi,this.cos_phi),e=this.a*Math.sqrt(this.c-this.ns0*d)/this.ns0,h=this.ns0*g(b-this.long0),i=e*Math.sin(h)+this.x0,j=this.rh-e*Math.cos(h)+this.y0;return a.x=i,a.y=j,a},c.inverse=function(a){var b,c,d,e,f,h;return a.x-=this.x0,a.y=this.rh-a.y+this.y0,this.ns0>=0?(b=Math.sqrt(a.x*a.x+a.y*a.y),d=1):(b=-Math.sqrt(a.x*a.x+a.y*a.y),d=-1),e=0,0!==b&&(e=Math.atan2(d*a.x,d*a.y)),d=b*this.ns0/this.a,this.sphere?h=Math.asin((this.c-d*d)/(2*this.ns0)):(c=(this.c-d*d)/this.ns0,h=this.phi1z(this.e3,c)),f=g(e/this.ns0+this.long0),a.x=f,a.y=h,a},c.phi1z=function(a,b){var c,e,f,g,i,j=h(.5*b);if(d>a)return j;for(var k=a*a,l=1;25>=l;l++)if(c=Math.sin(j),e=Math.cos(j),f=a*c,g=1-f*f,i=.5*g*g/e*(b/(1-k)-c/g+.5/a*Math.log((1-f)/(1+f))),j+=i,Math.abs(i)<=1e-7)return j;return null},c.names=[\"Albers_Conic_Equal_Area\",\"Albers\",\"aea\"]},{\"../common/adjust_lon\":5,\"../common/asinz\":6,\"../common/msfnz\":15,\"../common/qsfnz\":20}],41:[function(a,b,c){var d=a(\"../common/adjust_lon\"),e=Math.PI/2,f=1e-10,g=a(\"../common/mlfn\"),h=a(\"../common/e0fn\"),i=a(\"../common/e1fn\"),j=a(\"../common/e2fn\"),k=a(\"../common/e3fn\"),l=a(\"../common/gN\"),m=a(\"../common/asinz\"),n=a(\"../common/imlfn\");c.init=function(){this.sin_p12=Math.sin(this.lat0),this.cos_p12=Math.cos(this.lat0)},c.forward=function(a){var b,c,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H=a.x,I=a.y,J=Math.sin(a.y),K=Math.cos(a.y),L=d(H-this.long0);return this.sphere?Math.abs(this.sin_p12-1)<=f?(a.x=this.x0+this.a*(e-I)*Math.sin(L),a.y=this.y0-this.a*(e-I)*Math.cos(L),a):Math.abs(this.sin_p12+1)<=f?(a.x=this.x0+this.a*(e+I)*Math.sin(L),a.y=this.y0+this.a*(e+I)*Math.cos(L),a):(B=this.sin_p12*J+this.cos_p12*K*Math.cos(L),z=Math.acos(B),A=z/Math.sin(z),a.x=this.x0+this.a*A*K*Math.sin(L),a.y=this.y0+this.a*A*(this.cos_p12*J-this.sin_p12*K*Math.cos(L)),a):(b=h(this.es),c=i(this.es),m=j(this.es),n=k(this.es),Math.abs(this.sin_p12-1)<=f?(o=this.a*g(b,c,m,n,e),p=this.a*g(b,c,m,n,I),a.x=this.x0+(o-p)*Math.sin(L),a.y=this.y0-(o-p)*Math.cos(L),a):Math.abs(this.sin_p12+1)<=f?(o=this.a*g(b,c,m,n,e),p=this.a*g(b,c,m,n,I),a.x=this.x0+(o+p)*Math.sin(L),a.y=this.y0+(o+p)*Math.cos(L),a):(q=J/K,r=l(this.a,this.e,this.sin_p12),s=l(this.a,this.e,J),t=Math.atan((1-this.es)*q+this.es*r*this.sin_p12/(s*K)),u=Math.atan2(Math.sin(L),this.cos_p12*Math.tan(t)-this.sin_p12*Math.cos(L)),C=0===u?Math.asin(this.cos_p12*Math.sin(t)-this.sin_p12*Math.cos(t)):Math.abs(Math.abs(u)-Math.PI)<=f?-Math.asin(this.cos_p12*Math.sin(t)-this.sin_p12*Math.cos(t)):Math.asin(Math.sin(L)*Math.cos(t)/Math.sin(u)),v=this.e*this.sin_p12/Math.sqrt(1-this.es),w=this.e*this.cos_p12*Math.cos(u)/Math.sqrt(1-this.es),x=v*w,y=w*w,D=C*C,E=D*C,F=E*C,G=F*C,z=r*C*(1-D*y*(1-y)/6+E/8*x*(1-2*y)+F/120*(y*(4-7*y)-3*v*v*(1-7*y))-G/48*x),a.x=this.x0+z*Math.sin(u),a.y=this.y0+z*Math.cos(u),a))},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I;if(this.sphere){if(b=Math.sqrt(a.x*a.x+a.y*a.y),b>2*e*this.a)return;return c=b/this.a,o=Math.sin(c),p=Math.cos(c),q=this.long0,Math.abs(b)<=f?r=this.lat0:(r=m(p*this.sin_p12+a.y*o*this.cos_p12/b),s=Math.abs(this.lat0)-e,q=d(Math.abs(s)<=f?this.lat0>=0?this.long0+Math.atan2(a.x,-a.y):this.long0-Math.atan2(-a.x,a.y):this.long0+Math.atan2(a.x*o,b*this.cos_p12*p-a.y*this.sin_p12*o))),a.x=q,a.y=r,a}return t=h(this.es),u=i(this.es),v=j(this.es),w=k(this.es),Math.abs(this.sin_p12-1)<=f?(x=this.a*g(t,u,v,w,e),b=Math.sqrt(a.x*a.x+a.y*a.y),y=x-b,r=n(y/this.a,t,u,v,w),q=d(this.long0+Math.atan2(a.x,-1*a.y)),a.x=q,a.y=r,a):Math.abs(this.sin_p12+1)<=f?(x=this.a*g(t,u,v,w,e),b=Math.sqrt(a.x*a.x+a.y*a.y),y=b-x,r=n(y/this.a,t,u,v,w),q=d(this.long0+Math.atan2(a.x,a.y)),a.x=q,a.y=r,a):(b=Math.sqrt(a.x*a.x+a.y*a.y),B=Math.atan2(a.x,a.y),z=l(this.a,this.e,this.sin_p12),C=Math.cos(B),D=this.e*this.cos_p12*C,E=-D*D/(1-this.es),F=3*this.es*(1-E)*this.sin_p12*this.cos_p12*C/(1-this.es),G=b/z,H=G-E*(1+E)*Math.pow(G,3)/6-F*(1+3*E)*Math.pow(G,4)/24,I=1-E*H*H/2-G*H*H*H/6,A=Math.asin(this.sin_p12*Math.cos(H)+this.cos_p12*Math.sin(H)*C),q=d(this.long0+Math.asin(Math.sin(B)*Math.sin(H)/Math.cos(A))),r=Math.atan((1-this.es*I*this.sin_p12/Math.sin(A))*Math.tan(A)/(1-this.es)),a.x=q,a.y=r,a)},c.names=[\"Azimuthal_Equidistant\",\"aeqd\"]},{\"../common/adjust_lon\":5,\"../common/asinz\":6,\"../common/e0fn\":7,\"../common/e1fn\":8,\"../common/e2fn\":9,\"../common/e3fn\":10,\"../common/gN\":11,\"../common/imlfn\":12,\"../common/mlfn\":14}],42:[function(a,b,c){var d=a(\"../common/mlfn\"),e=a(\"../common/e0fn\"),f=a(\"../common/e1fn\"),g=a(\"../common/e2fn\"),h=a(\"../common/e3fn\"),i=a(\"../common/gN\"),j=a(\"../common/adjust_lon\"),k=a(\"../common/adjust_lat\"),l=a(\"../common/imlfn\"),m=Math.PI/2,n=1e-10;c.init=function(){this.sphere||(this.e0=e(this.es),this.e1=f(this.es),this.e2=g(this.es),this.e3=h(this.es),this.ml0=this.a*d(this.e0,this.e1,this.e2,this.e3,this.lat0))},c.forward=function(a){var b,c,e=a.x,f=a.y;if(e=j(e-this.long0),this.sphere)b=this.a*Math.asin(Math.cos(f)*Math.sin(e)),c=this.a*(Math.atan2(Math.tan(f),Math.cos(e))-this.lat0);else{var g=Math.sin(f),h=Math.cos(f),k=i(this.a,this.e,g),l=Math.tan(f)*Math.tan(f),m=e*Math.cos(f),n=m*m,o=this.es*h*h/(1-this.es),p=this.a*d(this.e0,this.e1,this.e2,this.e3,f);b=k*m*(1-n*l*(1/6-(8-l+8*o)*n/120)),c=p-this.ml0+k*g/h*n*(.5+(5-l+6*o)*n/24)}return a.x=b+this.x0,a.y=c+this.y0,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,d=a.x/this.a,e=a.y/this.a;if(this.sphere){var f=e+this.lat0;b=Math.asin(Math.sin(f)*Math.cos(d)),c=Math.atan2(Math.tan(d),Math.cos(f))}else{var g=this.ml0/this.a+e,h=l(g,this.e0,this.e1,this.e2,this.e3);if(Math.abs(Math.abs(h)-m)<=n)return a.x=this.long0,a.y=m,0>e&&(a.y*=-1),a;var o=i(this.a,this.e,Math.sin(h)),p=o*o*o/this.a/this.a*(1-this.es),q=Math.pow(Math.tan(h),2),r=d*this.a/o,s=r*r;b=h-o*Math.tan(h)/p*r*r*(.5-(1+3*q)*r*r/24),c=r*(1-s*(q/3+(1+3*q)*q*s/15))/Math.cos(h)}return a.x=j(c+this.long0),a.y=k(b),a},c.names=[\"Cassini\",\"Cassini_Soldner\",\"cass\"]},{\"../common/adjust_lat\":4,\"../common/adjust_lon\":5,\"../common/e0fn\":7,\"../common/e1fn\":8,\"../common/e2fn\":9,\"../common/e3fn\":10,\"../common/gN\":11,\"../common/imlfn\":12,\"../common/mlfn\":14}],43:[function(a,b,c){var d=a(\"../common/adjust_lon\"),e=a(\"../common/qsfnz\"),f=a(\"../common/msfnz\"),g=a(\"../common/iqsfnz\");c.init=function(){this.sphere||(this.k0=f(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},c.forward=function(a){var b,c,f=a.x,g=a.y,h=d(f-this.long0);if(this.sphere)b=this.x0+this.a*h*Math.cos(this.lat_ts),c=this.y0+this.a*Math.sin(g)/Math.cos(this.lat_ts);else{var i=e(this.e,Math.sin(g));b=this.x0+this.a*this.k0*h,c=this.y0+this.a*i*.5/this.k0}return a.x=b,a.y=c,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c;return this.sphere?(b=d(this.long0+a.x/this.a/Math.cos(this.lat_ts)),c=Math.asin(a.y/this.a*Math.cos(this.lat_ts))):(c=g(this.e,2*a.y*this.k0/this.a),b=d(this.long0+a.x/(this.a*this.k0))),a.x=b,a.y=c,a},c.names=[\"cea\"]},{\"../common/adjust_lon\":5,\"../common/iqsfnz\":13,\"../common/msfnz\":15,\"../common/qsfnz\":20}],44:[function(a,b,c){var d=a(\"../common/adjust_lon\"),e=a(\"../common/adjust_lat\");c.init=function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||\"Equidistant Cylindrical (Plate Carre)\",this.rc=Math.cos(this.lat_ts)},c.forward=function(a){var b=a.x,c=a.y,f=d(b-this.long0),g=e(c-this.lat0);return a.x=this.x0+this.a*f*this.rc,a.y=this.y0+this.a*g,a},c.inverse=function(a){var b=a.x,c=a.y;return a.x=d(this.long0+(b-this.x0)/(this.a*this.rc)),a.y=e(this.lat0+(c-this.y0)/this.a),a},c.names=[\"Equirectangular\",\"Equidistant_Cylindrical\",\"eqc\"]},{\"../common/adjust_lat\":4,\"../common/adjust_lon\":5}],45:[function(a,b,c){var d=a(\"../common/e0fn\"),e=a(\"../common/e1fn\"),f=a(\"../common/e2fn\"),g=a(\"../common/e3fn\"),h=a(\"../common/msfnz\"),i=a(\"../common/mlfn\"),j=a(\"../common/adjust_lon\"),k=a(\"../common/adjust_lat\"),l=a(\"../common/imlfn\"),m=1e-10;c.init=function(){Math.abs(this.lat1+this.lat2)<m||(this.lat2=this.lat2||this.lat1,this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=d(this.es),this.e1=e(this.es),this.e2=f(this.es),this.e3=g(this.es),this.sinphi=Math.sin(this.lat1),this.cosphi=Math.cos(this.lat1),this.ms1=h(this.e,this.sinphi,this.cosphi),this.ml1=i(this.e0,this.e1,this.e2,this.e3,this.lat1),Math.abs(this.lat1-this.lat2)<m?this.ns=this.sinphi:(this.sinphi=Math.sin(this.lat2),this.cosphi=Math.cos(this.lat2),this.ms2=h(this.e,this.sinphi,this.cosphi),this.ml2=i(this.e0,this.e1,this.e2,this.e3,this.lat2),this.ns=(this.ms1-this.ms2)/(this.ml2-this.ml1)),this.g=this.ml1+this.ms1/this.ns,this.ml0=i(this.e0,this.e1,this.e2,this.e3,this.lat0),this.rh=this.a*(this.g-this.ml0))},c.forward=function(a){var b,c=a.x,d=a.y;if(this.sphere)b=this.a*(this.g-d);else{var e=i(this.e0,this.e1,this.e2,this.e3,d);b=this.a*(this.g-e)}var f=this.ns*j(c-this.long0),g=this.x0+b*Math.sin(f),h=this.y0+this.rh-b*Math.cos(f);return a.x=g,a.y=h,a},c.inverse=function(a){a.x-=this.x0,a.y=this.rh-a.y+this.y0;var b,c,d,e;this.ns>=0?(c=Math.sqrt(a.x*a.x+a.y*a.y),b=1):(c=-Math.sqrt(a.x*a.x+a.y*a.y),b=-1);var f=0;if(0!==c&&(f=Math.atan2(b*a.x,b*a.y)),this.sphere)return e=j(this.long0+f/this.ns),d=k(this.g-c/this.a),a.x=e,a.y=d,a;var g=this.g-c/this.a;return d=l(g,this.e0,this.e1,this.e2,this.e3),e=j(this.long0+f/this.ns),a.x=e,a.y=d,a},c.names=[\"Equidistant_Conic\",\"eqdc\"]},{\"../common/adjust_lat\":4,\"../common/adjust_lon\":5,\"../common/e0fn\":7,\"../common/e1fn\":8,\"../common/e2fn\":9,\"../common/e3fn\":10,\"../common/imlfn\":12,\"../common/mlfn\":14,\"../common/msfnz\":15}],46:[function(a,b,c){var d=Math.PI/4,e=a(\"../common/srat\"),f=Math.PI/2,g=20;c.init=function(){var a=Math.sin(this.lat0),b=Math.cos(this.lat0);b*=b,this.rc=Math.sqrt(1-this.es)/(1-this.es*a*a),this.C=Math.sqrt(1+this.es*b*b/(1-this.es)),this.phic0=Math.asin(a/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+d)/(Math.pow(Math.tan(.5*this.lat0+d),this.C)*e(this.e*a,this.ratexp))},c.forward=function(a){var b=a.x,c=a.y;return a.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*c+d),this.C)*e(this.e*Math.sin(c),this.ratexp))-f,a.x=this.C*b,a},c.inverse=function(a){for(var b=1e-14,c=a.x/this.C,h=a.y,i=Math.pow(Math.tan(.5*h+d)/this.K,1/this.C),j=g;j>0&&(h=2*Math.atan(i*e(this.e*Math.sin(a.y),-.5*this.e))-f,!(Math.abs(h-a.y)<b));--j)a.y=h;return j?(a.x=c,a.y=h,a):null},c.names=[\"gauss\"]},{\"../common/srat\":22}],47:[function(a,b,c){var d=a(\"../common/adjust_lon\"),e=1e-10,f=a(\"../common/asinz\");c.init=function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0),\nthis.infinity_dist=1e3*this.a,this.rc=1},c.forward=function(a){var b,c,f,g,h,i,j,k,l=a.x,m=a.y;return f=d(l-this.long0),b=Math.sin(m),c=Math.cos(m),g=Math.cos(f),i=this.sin_p14*b+this.cos_p14*c*g,h=1,i>0||Math.abs(i)<=e?(j=this.x0+this.a*h*c*Math.sin(f)/i,k=this.y0+this.a*h*(this.cos_p14*b-this.sin_p14*c*g)/i):(j=this.x0+this.infinity_dist*c*Math.sin(f),k=this.y0+this.infinity_dist*(this.cos_p14*b-this.sin_p14*c*g)),a.x=j,a.y=k,a},c.inverse=function(a){var b,c,e,g,h,i;return a.x=(a.x-this.x0)/this.a,a.y=(a.y-this.y0)/this.a,a.x/=this.k0,a.y/=this.k0,(b=Math.sqrt(a.x*a.x+a.y*a.y))?(g=Math.atan2(b,this.rc),c=Math.sin(g),e=Math.cos(g),i=f(e*this.sin_p14+a.y*c*this.cos_p14/b),h=Math.atan2(a.x*c,b*this.cos_p14*e-a.y*this.sin_p14*c),h=d(this.long0+h)):(i=this.phic0,h=0),a.x=h,a.y=i,a},c.names=[\"gnom\"]},{\"../common/adjust_lon\":5,\"../common/asinz\":6}],48:[function(a,b,c){var d=a(\"../common/adjust_lon\");c.init=function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},c.forward=function(a){var b,c,e,f,g,h,i,j=a.x,k=a.y,l=d(j-this.long0);return b=Math.pow((1+this.e*Math.sin(k))/(1-this.e*Math.sin(k)),this.alfa*this.e/2),c=2*(Math.atan(this.k*Math.pow(Math.tan(k/2+this.s45),this.alfa)/b)-this.s45),e=-l*this.alfa,f=Math.asin(Math.cos(this.ad)*Math.sin(c)+Math.sin(this.ad)*Math.cos(c)*Math.cos(e)),g=Math.asin(Math.cos(c)*Math.sin(e)/Math.cos(f)),h=this.n*g,i=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(f/2+this.s45),this.n),a.y=i*Math.cos(h)/1,a.x=i*Math.sin(h)/1,this.czech||(a.y*=-1,a.x*=-1),a},c.inverse=function(a){var b,c,d,e,f,g,h,i,j=a.x;a.x=a.y,a.y=j,this.czech||(a.y*=-1,a.x*=-1),g=Math.sqrt(a.x*a.x+a.y*a.y),f=Math.atan2(a.y,a.x),e=f/Math.sin(this.s0),d=2*(Math.atan(Math.pow(this.ro0/g,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),b=Math.asin(Math.cos(this.ad)*Math.sin(d)-Math.sin(this.ad)*Math.cos(d)*Math.cos(e)),c=Math.asin(Math.cos(d)*Math.sin(e)/Math.cos(b)),a.x=this.long0-c/this.alfa,h=b,i=0;var k=0;do a.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(b/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(h))/(1-this.e*Math.sin(h)),this.e/2))-this.s45),Math.abs(h-a.y)<1e-10&&(i=1),h=a.y,k+=1;while(0===i&&15>k);return k>=15?null:a},c.names=[\"Krovak\",\"krovak\"]},{\"../common/adjust_lon\":5}],49:[function(a,b,c){var d=Math.PI/2,e=Math.PI/4,f=1e-10,g=a(\"../common/qsfnz\"),h=a(\"../common/adjust_lon\");c.S_POLE=1,c.N_POLE=2,c.EQUIT=3,c.OBLIQ=4,c.init=function(){var a=Math.abs(this.lat0);if(Math.abs(a-d)<f?this.mode=this.lat0<0?this.S_POLE:this.N_POLE:Math.abs(a)<f?this.mode=this.EQUIT:this.mode=this.OBLIQ,this.es>0){var b;switch(this.qp=g(this.e,1),this.mmf=.5/(1-this.es),this.apa=this.authset(this.es),this.mode){case this.N_POLE:this.dd=1;break;case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),b=Math.sin(this.lat0),this.sinb1=g(this.e,b)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*b*b)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},c.forward=function(a){var b,c,i,j,k,l,m,n,o,p,q=a.x,r=a.y;if(q=h(q-this.long0),this.sphere){if(k=Math.sin(r),p=Math.cos(r),i=Math.cos(q),this.mode===this.OBLIQ||this.mode===this.EQUIT){if(c=this.mode===this.EQUIT?1+p*i:1+this.sinph0*k+this.cosph0*p*i,f>=c)return null;c=Math.sqrt(2/c),b=c*p*Math.sin(q),c*=this.mode===this.EQUIT?k:this.cosph0*k-this.sinph0*p*i}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(i=-i),Math.abs(r+this.phi0)<f)return null;c=e-.5*r,c=2*(this.mode===this.S_POLE?Math.cos(c):Math.sin(c)),b=c*Math.sin(q),c*=i}}else{switch(m=0,n=0,o=0,i=Math.cos(q),j=Math.sin(q),k=Math.sin(r),l=g(this.e,k),(this.mode===this.OBLIQ||this.mode===this.EQUIT)&&(m=l/this.qp,n=Math.sqrt(1-m*m)),this.mode){case this.OBLIQ:o=1+this.sinb1*m+this.cosb1*n*i;break;case this.EQUIT:o=1+n*i;break;case this.N_POLE:o=d+r,l=this.qp-l;break;case this.S_POLE:o=r-d,l=this.qp+l}if(Math.abs(o)<f)return null;switch(this.mode){case this.OBLIQ:case this.EQUIT:o=Math.sqrt(2/o),c=this.mode===this.OBLIQ?this.ymf*o*(this.cosb1*m-this.sinb1*n*i):(o=Math.sqrt(2/(1+n*i)))*m*this.ymf,b=this.xmf*o*n*j;break;case this.N_POLE:case this.S_POLE:l>=0?(b=(o=Math.sqrt(l))*j,c=i*(this.mode===this.S_POLE?o:-o)):b=c=0}}return a.x=this.a*b+this.x0,a.y=this.a*c+this.y0,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,e,g,i,j,k,l=a.x/this.a,m=a.y/this.a;if(this.sphere){var n,o=0,p=0;if(n=Math.sqrt(l*l+m*m),c=.5*n,c>1)return null;switch(c=2*Math.asin(c),(this.mode===this.OBLIQ||this.mode===this.EQUIT)&&(p=Math.sin(c),o=Math.cos(c)),this.mode){case this.EQUIT:c=Math.abs(n)<=f?0:Math.asin(m*p/n),l*=p,m=o*n;break;case this.OBLIQ:c=Math.abs(n)<=f?this.phi0:Math.asin(o*this.sinph0+m*p*this.cosph0/n),l*=p*this.cosph0,m=(o-Math.sin(c)*this.sinph0)*n;break;case this.N_POLE:m=-m,c=d-c;break;case this.S_POLE:c-=d}b=0!==m||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(l,m):0}else{if(k=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(l/=this.dd,m*=this.dd,j=Math.sqrt(l*l+m*m),f>j)return a.x=0,a.y=this.phi0,a;g=2*Math.asin(.5*j/this.rq),e=Math.cos(g),l*=g=Math.sin(g),this.mode===this.OBLIQ?(k=e*this.sinb1+m*g*this.cosb1/j,i=this.qp*k,m=j*this.cosb1*e-m*this.sinb1*g):(k=m*g/j,i=this.qp*k,m=j*e)}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(m=-m),i=l*l+m*m,!i)return a.x=0,a.y=this.phi0,a;k=1-i/this.qp,this.mode===this.S_POLE&&(k=-k)}b=Math.atan2(l,m),c=this.authlat(Math.asin(k),this.apa)}return a.x=h(this.long0+b),a.y=c,a},c.P00=.3333333333333333,c.P01=.17222222222222222,c.P02=.10257936507936508,c.P10=.06388888888888888,c.P11=.0664021164021164,c.P20=.016415012942191543,c.authset=function(a){var b,c=[];return c[0]=a*this.P00,b=a*a,c[0]+=b*this.P01,c[1]=b*this.P10,b*=a,c[0]+=b*this.P02,c[1]+=b*this.P11,c[2]=b*this.P20,c},c.authlat=function(a,b){var c=a+a;return a+b[0]*Math.sin(c)+b[1]*Math.sin(c+c)+b[2]*Math.sin(c+c+c)},c.names=[\"Lambert Azimuthal Equal Area\",\"Lambert_Azimuthal_Equal_Area\",\"laea\"]},{\"../common/adjust_lon\":5,\"../common/qsfnz\":20}],50:[function(a,b,c){var d=1e-10,e=a(\"../common/msfnz\"),f=a(\"../common/tsfnz\"),g=Math.PI/2,h=a(\"../common/sign\"),i=a(\"../common/adjust_lon\"),j=a(\"../common/phi2z\");c.init=function(){if(this.lat2||(this.lat2=this.lat1),this.k0||(this.k0=1),this.x0=this.x0||0,this.y0=this.y0||0,!(Math.abs(this.lat1+this.lat2)<d)){var a=this.b/this.a;this.e=Math.sqrt(1-a*a);var b=Math.sin(this.lat1),c=Math.cos(this.lat1),g=e(this.e,b,c),h=f(this.e,this.lat1,b),i=Math.sin(this.lat2),j=Math.cos(this.lat2),k=e(this.e,i,j),l=f(this.e,this.lat2,i),m=f(this.e,this.lat0,Math.sin(this.lat0));Math.abs(this.lat1-this.lat2)>d?this.ns=Math.log(g/k)/Math.log(h/l):this.ns=b,isNaN(this.ns)&&(this.ns=b),this.f0=g/(this.ns*Math.pow(h,this.ns)),this.rh=this.a*this.f0*Math.pow(m,this.ns),this.title||(this.title=\"Lambert Conformal Conic\")}},c.forward=function(a){var b=a.x,c=a.y;Math.abs(2*Math.abs(c)-Math.PI)<=d&&(c=h(c)*(g-2*d));var e,j,k=Math.abs(Math.abs(c)-g);if(k>d)e=f(this.e,c,Math.sin(c)),j=this.a*this.f0*Math.pow(e,this.ns);else{if(k=c*this.ns,0>=k)return null;j=0}var l=this.ns*i(b-this.long0);return a.x=this.k0*(j*Math.sin(l))+this.x0,a.y=this.k0*(this.rh-j*Math.cos(l))+this.y0,a},c.inverse=function(a){var b,c,d,e,f,h=(a.x-this.x0)/this.k0,k=this.rh-(a.y-this.y0)/this.k0;this.ns>0?(b=Math.sqrt(h*h+k*k),c=1):(b=-Math.sqrt(h*h+k*k),c=-1);var l=0;if(0!==b&&(l=Math.atan2(c*h,c*k)),0!==b||this.ns>0){if(c=1/this.ns,d=Math.pow(b/(this.a*this.f0),c),e=j(this.e,d),-9999===e)return null}else e=-g;return f=i(l/this.ns+this.long0),a.x=f,a.y=e,a},c.names=[\"Lambert Tangential Conformal Conic Projection\",\"Lambert_Conformal_Conic\",\"Lambert_Conformal_Conic_2SP\",\"lcc\"]},{\"../common/adjust_lon\":5,\"../common/msfnz\":15,\"../common/phi2z\":16,\"../common/sign\":21,\"../common/tsfnz\":24}],51:[function(a,b,c){function d(a){return a}c.init=function(){},c.forward=d,c.inverse=d,c.names=[\"longlat\",\"identity\"]},{}],52:[function(a,b,c){var d=a(\"../common/msfnz\"),e=Math.PI/2,f=1e-10,g=57.29577951308232,h=a(\"../common/adjust_lon\"),i=Math.PI/4,j=a(\"../common/tsfnz\"),k=a(\"../common/phi2z\");c.init=function(){var a=this.b/this.a;this.es=1-a*a,\"x0\"in this||(this.x0=0),\"y0\"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.sphere?this.k0=Math.cos(this.lat_ts):this.k0=d(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k?this.k0=this.k:this.k0=1)},c.forward=function(a){var b=a.x,c=a.y;if(c*g>90&&-90>c*g&&b*g>180&&-180>b*g)return null;var d,k;if(Math.abs(Math.abs(c)-e)<=f)return null;if(this.sphere)d=this.x0+this.a*this.k0*h(b-this.long0),k=this.y0+this.a*this.k0*Math.log(Math.tan(i+.5*c));else{var l=Math.sin(c),m=j(this.e,c,l);d=this.x0+this.a*this.k0*h(b-this.long0),k=this.y0-this.a*this.k0*Math.log(m)}return a.x=d,a.y=k,a},c.inverse=function(a){var b,c,d=a.x-this.x0,f=a.y-this.y0;if(this.sphere)c=e-2*Math.atan(Math.exp(-f/(this.a*this.k0)));else{var g=Math.exp(-f/(this.a*this.k0));if(c=k(this.e,g),-9999===c)return null}return b=h(this.long0+d/(this.a*this.k0)),a.x=b,a.y=c,a},c.names=[\"Mercator\",\"Popular Visualisation Pseudo Mercator\",\"Mercator_1SP\",\"Mercator_Auxiliary_Sphere\",\"merc\"]},{\"../common/adjust_lon\":5,\"../common/msfnz\":15,\"../common/phi2z\":16,\"../common/tsfnz\":24}],53:[function(a,b,c){var d=a(\"../common/adjust_lon\");c.init=function(){},c.forward=function(a){var b=a.x,c=a.y,e=d(b-this.long0),f=this.x0+this.a*e,g=this.y0+this.a*Math.log(Math.tan(Math.PI/4+c/2.5))*1.25;return a.x=f,a.y=g,a},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b=d(this.long0+a.x/this.a),c=2.5*(Math.atan(Math.exp(.8*a.y/this.a))-Math.PI/4);return a.x=b,a.y=c,a},c.names=[\"Miller_Cylindrical\",\"mill\"]},{\"../common/adjust_lon\":5}],54:[function(a,b,c){var d=a(\"../common/adjust_lon\"),e=1e-10;c.init=function(){},c.forward=function(a){for(var b=a.x,c=a.y,f=d(b-this.long0),g=c,h=Math.PI*Math.sin(c),i=0;!0;i++){var j=-(g+Math.sin(g)-h)/(1+Math.cos(g));if(g+=j,Math.abs(j)<e)break}g/=2,Math.PI/2-Math.abs(c)<e&&(f=0);var k=.900316316158*this.a*f*Math.cos(g)+this.x0,l=1.4142135623731*this.a*Math.sin(g)+this.y0;return a.x=k,a.y=l,a},c.inverse=function(a){var b,c;a.x-=this.x0,a.y-=this.y0,c=a.y/(1.4142135623731*this.a),Math.abs(c)>.999999999999&&(c=.999999999999),b=Math.asin(c);var e=d(this.long0+a.x/(.900316316158*this.a*Math.cos(b)));e<-Math.PI&&(e=-Math.PI),e>Math.PI&&(e=Math.PI),c=(2*b+Math.sin(2*b))/Math.PI,Math.abs(c)>1&&(c=1);var f=Math.asin(c);return a.x=e,a.y=f,a},c.names=[\"Mollweide\",\"moll\"]},{\"../common/adjust_lon\":5}],55:[function(a,b,c){var d=484813681109536e-20;c.iterations=1,c.init=function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},c.forward=function(a){var b,c=a.x,e=a.y,f=e-this.lat0,g=c-this.long0,h=f/d*1e-5,i=g,j=1,k=0;for(b=1;10>=b;b++)j*=h,k+=this.A[b]*j;var l,m,n=k,o=i,p=1,q=0,r=0,s=0;for(b=1;6>=b;b++)l=p*n-q*o,m=q*n+p*o,p=l,q=m,r=r+this.B_re[b]*p-this.B_im[b]*q,s=s+this.B_im[b]*p+this.B_re[b]*q;return a.x=s*this.a+this.x0,a.y=r*this.a+this.y0,a},c.inverse=function(a){var b,c,e,f=a.x,g=a.y,h=f-this.x0,i=g-this.y0,j=i/this.a,k=h/this.a,l=1,m=0,n=0,o=0;for(b=1;6>=b;b++)c=l*j-m*k,e=m*j+l*k,l=c,m=e,n=n+this.C_re[b]*l-this.C_im[b]*m,o=o+this.C_im[b]*l+this.C_re[b]*m;for(var p=0;p<this.iterations;p++){var q,r,s=n,t=o,u=j,v=k;for(b=2;6>=b;b++)q=s*n-t*o,r=t*n+s*o,s=q,t=r,u+=(b-1)*(this.B_re[b]*s-this.B_im[b]*t),v+=(b-1)*(this.B_im[b]*s+this.B_re[b]*t);s=1,t=0;var w=this.B_re[1],x=this.B_im[1];for(b=2;6>=b;b++)q=s*n-t*o,r=t*n+s*o,s=q,t=r,w+=b*(this.B_re[b]*s-this.B_im[b]*t),x+=b*(this.B_im[b]*s+this.B_re[b]*t);var y=w*w+x*x;n=(u*w+v*x)/y,o=(v*w-u*x)/y}var z=n,A=o,B=1,C=0;for(b=1;9>=b;b++)B*=z,C+=this.D[b]*B;var D=this.lat0+C*d*1e5,E=this.long0+A;return a.x=E,a.y=D,a},c.names=[\"New_Zealand_Map_Grid\",\"nzmg\"]},{}],56:[function(a,b,c){var d=a(\"../common/tsfnz\"),e=a(\"../common/adjust_lon\"),f=a(\"../common/phi2z\"),g=Math.PI/2,h=Math.PI/4,i=1e-10;c.init=function(){this.no_off=this.no_off||!1,this.no_rot=this.no_rot||!1,isNaN(this.k0)&&(this.k0=1);var a=Math.sin(this.lat0),b=Math.cos(this.lat0),c=this.e*a;this.bl=Math.sqrt(1+this.es/(1-this.es)*Math.pow(b,4)),this.al=this.a*this.bl*this.k0*Math.sqrt(1-this.es)/(1-c*c);var f=d(this.e,this.lat0,a),g=this.bl/b*Math.sqrt((1-this.es)/(1-c*c));1>g*g&&(g=1);var h,i;if(isNaN(this.longc)){var j=d(this.e,this.lat1,Math.sin(this.lat1)),k=d(this.e,this.lat2,Math.sin(this.lat2));this.lat0>=0?this.el=(g+Math.sqrt(g*g-1))*Math.pow(f,this.bl):this.el=(g-Math.sqrt(g*g-1))*Math.pow(f,this.bl);var l=Math.pow(j,this.bl),m=Math.pow(k,this.bl);h=this.el/l,i=.5*(h-1/h);var n=(this.el*this.el-m*l)/(this.el*this.el+m*l),o=(m-l)/(m+l),p=e(this.long1-this.long2);this.long0=.5*(this.long1+this.long2)-Math.atan(n*Math.tan(.5*this.bl*p)/o)/this.bl,this.long0=e(this.long0);var q=e(this.long1-this.long0);this.gamma0=Math.atan(Math.sin(this.bl*q)/i),this.alpha=Math.asin(g*Math.sin(this.gamma0))}else h=this.lat0>=0?g+Math.sqrt(g*g-1):g-Math.sqrt(g*g-1),this.el=h*Math.pow(f,this.bl),i=.5*(h-1/h),this.gamma0=Math.asin(Math.sin(this.alpha)/g),this.long0=this.longc-Math.asin(i*Math.tan(this.gamma0))/this.bl;this.no_off?this.uc=0:this.lat0>=0?this.uc=this.al/this.bl*Math.atan2(Math.sqrt(g*g-1),Math.cos(this.alpha)):this.uc=-1*this.al/this.bl*Math.atan2(Math.sqrt(g*g-1),Math.cos(this.alpha))},c.forward=function(a){var b,c,f,j=a.x,k=a.y,l=e(j-this.long0);if(Math.abs(Math.abs(k)-g)<=i)f=k>0?-1:1,c=this.al/this.bl*Math.log(Math.tan(h+f*this.gamma0*.5)),b=-1*f*g*this.al/this.bl;else{var m=d(this.e,k,Math.sin(k)),n=this.el/Math.pow(m,this.bl),o=.5*(n-1/n),p=.5*(n+1/n),q=Math.sin(this.bl*l),r=(o*Math.sin(this.gamma0)-q*Math.cos(this.gamma0))/p;c=Math.abs(Math.abs(r)-1)<=i?Number.POSITIVE_INFINITY:.5*this.al*Math.log((1-r)/(1+r))/this.bl,b=Math.abs(Math.cos(this.bl*l))<=i?this.al*this.bl*l:this.al*Math.atan2(o*Math.cos(this.gamma0)+q*Math.sin(this.gamma0),Math.cos(this.bl*l))/this.bl}return this.no_rot?(a.x=this.x0+b,a.y=this.y0+c):(b-=this.uc,a.x=this.x0+c*Math.cos(this.alpha)+b*Math.sin(this.alpha),a.y=this.y0+b*Math.cos(this.alpha)-c*Math.sin(this.alpha)),a},c.inverse=function(a){var b,c;this.no_rot?(c=a.y-this.y0,b=a.x-this.x0):(c=(a.x-this.x0)*Math.cos(this.alpha)-(a.y-this.y0)*Math.sin(this.alpha),b=(a.y-this.y0)*Math.cos(this.alpha)+(a.x-this.x0)*Math.sin(this.alpha),b+=this.uc);var d=Math.exp(-1*this.bl*c/this.al),h=.5*(d-1/d),j=.5*(d+1/d),k=Math.sin(this.bl*b/this.al),l=(k*Math.cos(this.gamma0)+h*Math.sin(this.gamma0))/j,m=Math.pow(this.el/Math.sqrt((1+l)/(1-l)),1/this.bl);return Math.abs(l-1)<i?(a.x=this.long0,a.y=g):Math.abs(l+1)<i?(a.x=this.long0,a.y=-1*g):(a.y=f(this.e,m),a.x=e(this.long0-Math.atan2(h*Math.cos(this.gamma0)-k*Math.sin(this.gamma0),Math.cos(this.bl*b/this.al))/this.bl)),a},c.names=[\"Hotine_Oblique_Mercator\",\"Hotine Oblique Mercator\",\"Hotine_Oblique_Mercator_Azimuth_Natural_Origin\",\"Hotine_Oblique_Mercator_Azimuth_Center\",\"omerc\"]},{\"../common/adjust_lon\":5,\"../common/phi2z\":16,\"../common/tsfnz\":24}],57:[function(a,b,c){var d=a(\"../common/e0fn\"),e=a(\"../common/e1fn\"),f=a(\"../common/e2fn\"),g=a(\"../common/e3fn\"),h=a(\"../common/adjust_lon\"),i=a(\"../common/adjust_lat\"),j=a(\"../common/mlfn\"),k=1e-10,l=a(\"../common/gN\"),m=20;c.init=function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=d(this.es),this.e1=e(this.es),this.e2=f(this.es),this.e3=g(this.es),this.ml0=this.a*j(this.e0,this.e1,this.e2,this.e3,this.lat0)},c.forward=function(a){var b,c,d,e=a.x,f=a.y,g=h(e-this.long0);if(d=g*Math.sin(f),this.sphere)Math.abs(f)<=k?(b=this.a*g,c=-1*this.a*this.lat0):(b=this.a*Math.sin(d)/Math.tan(f),c=this.a*(i(f-this.lat0)+(1-Math.cos(d))/Math.tan(f)));else if(Math.abs(f)<=k)b=this.a*g,c=-1*this.ml0;else{var m=l(this.a,this.e,Math.sin(f))/Math.tan(f);b=m*Math.sin(d),c=this.a*j(this.e0,this.e1,this.e2,this.e3,f)-this.ml0+m*(1-Math.cos(d))}return a.x=b+this.x0,a.y=c+this.y0,a},c.inverse=function(a){var b,c,d,e,f,g,i,l,n;if(d=a.x-this.x0,e=a.y-this.y0,this.sphere)if(Math.abs(e+this.a*this.lat0)<=k)b=h(d/this.a+this.long0),c=0;else{g=this.lat0+e/this.a,i=d*d/this.a/this.a+g*g,l=g;var o;for(f=m;f;--f)if(o=Math.tan(l),n=-1*(g*(l*o+1)-l-.5*(l*l+i)*o)/((l-g)/o-1),l+=n,Math.abs(n)<=k){c=l;break}b=h(this.long0+Math.asin(d*Math.tan(l)/this.a)/Math.sin(c))}else if(Math.abs(e+this.ml0)<=k)c=0,b=h(this.long0+d/this.a);else{g=(this.ml0+e)/this.a,i=d*d/this.a/this.a+g*g,l=g;var p,q,r,s,t;for(f=m;f;--f)if(t=this.e*Math.sin(l),p=Math.sqrt(1-t*t)*Math.tan(l),q=this.a*j(this.e0,this.e1,this.e2,this.e3,l),r=this.e0-2*this.e1*Math.cos(2*l)+4*this.e2*Math.cos(4*l)-6*this.e3*Math.cos(6*l),s=q/this.a,n=(g*(p*s+1)-s-.5*p*(s*s+i))/(this.es*Math.sin(2*l)*(s*s+i-2*g*s)/(4*p)+(g-s)*(p*r-2/Math.sin(2*l))-r),l-=n,Math.abs(n)<=k){c=l;break}p=Math.sqrt(1-this.es*Math.pow(Math.sin(c),2))*Math.tan(c),b=h(this.long0+Math.asin(d*p/this.a)/Math.sin(c))}return a.x=b,a.y=c,a},c.names=[\"Polyconic\",\"poly\"]},{\"../common/adjust_lat\":4,\"../common/adjust_lon\":5,\"../common/e0fn\":7,\"../common/e1fn\":8,\"../common/e2fn\":9,\"../common/e3fn\":10,\"../common/gN\":11,\"../common/mlfn\":14}],58:[function(a,b,c){var d=a(\"../common/adjust_lon\"),e=a(\"../common/adjust_lat\"),f=a(\"../common/pj_enfn\"),g=20,h=a(\"../common/pj_mlfn\"),i=a(\"../common/pj_inv_mlfn\"),j=Math.PI/2,k=1e-10,l=a(\"../common/asinz\");c.init=function(){this.sphere?(this.n=1,this.m=0,this.es=0,this.C_y=Math.sqrt((this.m+1)/this.n),this.C_x=this.C_y/(this.m+1)):this.en=f(this.es)},c.forward=function(a){var b,c,e=a.x,f=a.y;if(e=d(e-this.long0),this.sphere){if(this.m)for(var i=this.n*Math.sin(f),j=g;j;--j){var l=(this.m*f+Math.sin(f)-i)/(this.m+Math.cos(f));if(f-=l,Math.abs(l)<k)break}else f=1!==this.n?Math.asin(this.n*Math.sin(f)):f;b=this.a*this.C_x*e*(this.m+Math.cos(f)),c=this.a*this.C_y*f}else{var m=Math.sin(f),n=Math.cos(f);c=this.a*h(f,m,n,this.en),b=this.a*e*n/Math.sqrt(1-this.es*m*m)}return a.x=b,a.y=c,a},c.inverse=function(a){var b,c,f,g;return a.x-=this.x0,f=a.x/this.a,a.y-=this.y0,b=a.y/this.a,this.sphere?(b/=this.C_y,f/=this.C_x*(this.m+Math.cos(b)),this.m?b=l((this.m*b+Math.sin(b))/this.n):1!==this.n&&(b=l(Math.sin(b)/this.n)),f=d(f+this.long0),b=e(b)):(b=i(a.y/this.a,this.es,this.en),g=Math.abs(b),j>g?(g=Math.sin(b),c=this.long0+a.x*Math.sqrt(1-this.es*g*g)/(this.a*Math.cos(b)),f=d(c)):j>g-k&&(f=this.long0)),a.x=f,a.y=b,a},c.names=[\"Sinusoidal\",\"sinu\"]},{\"../common/adjust_lat\":4,\"../common/adjust_lon\":5,\"../common/asinz\":6,\"../common/pj_enfn\":17,\"../common/pj_inv_mlfn\":18,\"../common/pj_mlfn\":19}],59:[function(a,b,c){c.init=function(){var a=this.lat0;this.lambda0=this.long0;var b=Math.sin(a),c=this.a,d=this.rf,e=1/d,f=2*e-Math.pow(e,2),g=this.e=Math.sqrt(f);this.R=this.k0*c*Math.sqrt(1-f)/(1-f*Math.pow(b,2)),this.alpha=Math.sqrt(1+f/(1-f)*Math.pow(Math.cos(a),4)),this.b0=Math.asin(b/this.alpha);var h=Math.log(Math.tan(Math.PI/4+this.b0/2)),i=Math.log(Math.tan(Math.PI/4+a/2)),j=Math.log((1+g*b)/(1-g*b));this.K=h-this.alpha*i+this.alpha*g/2*j},c.forward=function(a){var b=Math.log(Math.tan(Math.PI/4-a.y/2)),c=this.e/2*Math.log((1+this.e*Math.sin(a.y))/(1-this.e*Math.sin(a.y))),d=-this.alpha*(b+c)+this.K,e=2*(Math.atan(Math.exp(d))-Math.PI/4),f=this.alpha*(a.x-this.lambda0),g=Math.atan(Math.sin(f)/(Math.sin(this.b0)*Math.tan(e)+Math.cos(this.b0)*Math.cos(f))),h=Math.asin(Math.cos(this.b0)*Math.sin(e)-Math.sin(this.b0)*Math.cos(e)*Math.cos(f));return a.y=this.R/2*Math.log((1+Math.sin(h))/(1-Math.sin(h)))+this.y0,a.x=this.R*g+this.x0,a},c.inverse=function(a){for(var b=a.x-this.x0,c=a.y-this.y0,d=b/this.R,e=2*(Math.atan(Math.exp(c/this.R))-Math.PI/4),f=Math.asin(Math.cos(this.b0)*Math.sin(e)+Math.sin(this.b0)*Math.cos(e)*Math.cos(d)),g=Math.atan(Math.sin(d)/(Math.cos(this.b0)*Math.cos(d)-Math.sin(this.b0)*Math.tan(e))),h=this.lambda0+g/this.alpha,i=0,j=f,k=-1e3,l=0;Math.abs(j-k)>1e-7;){if(++l>20)return;i=1/this.alpha*(Math.log(Math.tan(Math.PI/4+f/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(j))/2)),k=j,j=2*Math.atan(Math.exp(i))-Math.PI/2}return a.x=h,a.y=j,a},c.names=[\"somerc\"]},{}],60:[function(a,b,c){var d=Math.PI/2,e=1e-10,f=a(\"../common/sign\"),g=a(\"../common/msfnz\"),h=a(\"../common/tsfnz\"),i=a(\"../common/phi2z\"),j=a(\"../common/adjust_lon\");c.ssfn_=function(a,b,c){return b*=c,Math.tan(.5*(d+a))*Math.pow((1-b)/(1+b),.5*c)},c.init=function(){this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=e&&(this.k0=.5*(1+f(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=e&&(this.lat0>0?this.con=1:this.con=-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=e&&(this.k0=.5*this.cons*g(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/h(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=g(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-d,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},c.forward=function(a){var b,c,f,g,i,k,l=a.x,m=a.y,n=Math.sin(m),o=Math.cos(m),p=j(l-this.long0);return Math.abs(Math.abs(l-this.long0)-Math.PI)<=e&&Math.abs(m+this.lat0)<=e?(a.x=NaN,a.y=NaN,a):this.sphere?(b=2*this.k0/(1+this.sinlat0*n+this.coslat0*o*Math.cos(p)),a.x=this.a*b*o*Math.sin(p)+this.x0,a.y=this.a*b*(this.coslat0*n-this.sinlat0*o*Math.cos(p))+this.y0,a):(c=2*Math.atan(this.ssfn_(m,n,this.e))-d,g=Math.cos(c),f=Math.sin(c),Math.abs(this.coslat0)<=e?(i=h(this.e,m*this.con,this.con*n),k=2*this.a*this.k0*i/this.cons,a.x=this.x0+k*Math.sin(l-this.long0),a.y=this.y0-this.con*k*Math.cos(l-this.long0),a):(Math.abs(this.sinlat0)<e?(b=2*this.a*this.k0/(1+g*Math.cos(p)),a.y=b*f):(b=2*this.a*this.k0*this.ms1/(this.cosX0*(1+this.sinX0*f+this.cosX0*g*Math.cos(p))),a.y=b*(this.cosX0*f-this.sinX0*g*Math.cos(p))+this.y0),a.x=b*g*Math.sin(p)+this.x0,a))},c.inverse=function(a){a.x-=this.x0,a.y-=this.y0;var b,c,f,g,h,k=Math.sqrt(a.x*a.x+a.y*a.y);if(this.sphere){var l=2*Math.atan(k/(.5*this.a*this.k0));return b=this.long0,c=this.lat0,e>=k?(a.x=b,a.y=c,a):(c=Math.asin(Math.cos(l)*this.sinlat0+a.y*Math.sin(l)*this.coslat0/k),b=j(Math.abs(this.coslat0)<e?this.lat0>0?this.long0+Math.atan2(a.x,-1*a.y):this.long0+Math.atan2(a.x,a.y):this.long0+Math.atan2(a.x*Math.sin(l),k*this.coslat0*Math.cos(l)-a.y*this.sinlat0*Math.sin(l))),a.x=b,a.y=c,a)}if(Math.abs(this.coslat0)<=e){if(e>=k)return c=this.lat0,b=this.long0,a.x=b,a.y=c,a;a.x*=this.con,a.y*=this.con,f=k*this.cons/(2*this.a*this.k0),c=this.con*i(this.e,f),b=this.con*j(this.con*this.long0+Math.atan2(a.x,-1*a.y))}else g=2*Math.atan(k*this.cosX0/(2*this.a*this.k0*this.ms1)),b=this.long0,e>=k?h=this.X0:(h=Math.asin(Math.cos(g)*this.sinX0+a.y*Math.sin(g)*this.cosX0/k),b=j(this.long0+Math.atan2(a.x*Math.sin(g),k*this.cosX0*Math.cos(g)-a.y*this.sinX0*Math.sin(g)))),c=-1*i(this.e,Math.tan(.5*(d+h)));return a.x=b,a.y=c,a},c.names=[\"stere\",\"Stereographic_South_Pole\",\"Polar Stereographic (variant B)\"]},{\"../common/adjust_lon\":5,\"../common/msfnz\":15,\"../common/phi2z\":16,\"../common/sign\":21,\"../common/tsfnz\":24}],61:[function(a,b,c){var d=a(\"./gauss\"),e=a(\"../common/adjust_lon\");c.init=function(){d.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title=\"Oblique Stereographic Alternative\"))},c.forward=function(a){var b,c,f,g;return a.x=e(a.x-this.long0),d.forward.apply(this,[a]),b=Math.sin(a.y),c=Math.cos(a.y),f=Math.cos(a.x),g=this.k0*this.R2/(1+this.sinc0*b+this.cosc0*c*f),a.x=g*c*Math.sin(a.x),a.y=g*(this.cosc0*b-this.sinc0*c*f),a.x=this.a*a.x+this.x0,a.y=this.a*a.y+this.y0,a},c.inverse=function(a){var b,c,f,g,h;if(a.x=(a.x-this.x0)/this.a,a.y=(a.y-this.y0)/this.a,a.x/=this.k0,a.y/=this.k0,h=Math.sqrt(a.x*a.x+a.y*a.y)){var i=2*Math.atan2(h,this.R2);b=Math.sin(i),c=Math.cos(i),g=Math.asin(c*this.sinc0+a.y*b*this.cosc0/h),f=Math.atan2(a.x*b,h*this.cosc0*c-a.y*this.sinc0*b)}else g=this.phic0,f=0;return a.x=f,a.y=g,d.inverse.apply(this,[a]),a.x=e(a.x+this.long0),a},c.names=[\"Stereographic_North_Pole\",\"Oblique_Stereographic\",\"Polar_Stereographic\",\"sterea\",\"Oblique Stereographic Alternative\"]},{\"../common/adjust_lon\":5,\"./gauss\":46}],62:[function(a,b,c){var d=a(\"../common/e0fn\"),e=a(\"../common/e1fn\"),f=a(\"../common/e2fn\"),g=a(\"../common/e3fn\"),h=a(\"../common/mlfn\"),i=a(\"../common/adjust_lon\"),j=Math.PI/2,k=1e-10,l=a(\"../common/sign\"),m=a(\"../common/asinz\");c.init=function(){this.e0=d(this.es),this.e1=e(this.es),this.e2=f(this.es),this.e3=g(this.es),this.ml0=this.a*h(this.e0,this.e1,this.e2,this.e3,this.lat0)},c.forward=function(a){var b,c,d,e=a.x,f=a.y,g=i(e-this.long0),j=Math.sin(f),k=Math.cos(f);if(this.sphere){var l=k*Math.sin(g);if(Math.abs(Math.abs(l)-1)<1e-10)return 93;c=.5*this.a*this.k0*Math.log((1+l)/(1-l)),b=Math.acos(k*Math.cos(g)/Math.sqrt(1-l*l)),0>f&&(b=-b),d=this.a*this.k0*(b-this.lat0)}else{var m=k*g,n=Math.pow(m,2),o=this.ep2*Math.pow(k,2),p=Math.tan(f),q=Math.pow(p,2);b=1-this.es*Math.pow(j,2);var r=this.a/Math.sqrt(b),s=this.a*h(this.e0,this.e1,this.e2,this.e3,f);c=this.k0*r*m*(1+n/6*(1-q+o+n/20*(5-18*q+Math.pow(q,2)+72*o-58*this.ep2)))+this.x0,d=this.k0*(s-this.ml0+r*p*(n*(.5+n/24*(5-q+9*o+4*Math.pow(o,2)+n/30*(61-58*q+Math.pow(q,2)+600*o-330*this.ep2)))))+this.y0}return a.x=c,a.y=d,a},c.inverse=function(a){var b,c,d,e,f,g,h=6;if(this.sphere){var n=Math.exp(a.x/(this.a*this.k0)),o=.5*(n-1/n),p=this.lat0+a.y/(this.a*this.k0),q=Math.cos(p);b=Math.sqrt((1-q*q)/(1+o*o)),f=m(b),0>p&&(f=-f),g=0===o&&0===q?this.long0:i(Math.atan2(o,q)+this.long0)}else{var r=a.x-this.x0,s=a.y-this.y0;for(b=(this.ml0+s/this.k0)/this.a,c=b,e=0;!0&&(d=(b+this.e1*Math.sin(2*c)-this.e2*Math.sin(4*c)+this.e3*Math.sin(6*c))/this.e0-c,c+=d,!(Math.abs(d)<=k));e++)if(e>=h)return 95;if(Math.abs(c)<j){var t=Math.sin(c),u=Math.cos(c),v=Math.tan(c),w=this.ep2*Math.pow(u,2),x=Math.pow(w,2),y=Math.pow(v,2),z=Math.pow(y,2);b=1-this.es*Math.pow(t,2);var A=this.a/Math.sqrt(b),B=A*(1-this.es)/b,C=r/(A*this.k0),D=Math.pow(C,2);f=c-A*v*D/B*(.5-D/24*(5+3*y+10*w-4*x-9*this.ep2-D/30*(61+90*y+298*w+45*z-252*this.ep2-3*x))),g=i(this.long0+C*(1-D/6*(1+2*y+w-D/20*(5-2*w+28*y-3*x+8*this.ep2+24*z)))/u)}else f=j*l(s),g=this.long0}return a.x=g,a.y=f,a},c.names=[\"Transverse_Mercator\",\"Transverse Mercator\",\"tmerc\"]},{\"../common/adjust_lon\":5,\"../common/asinz\":6,\"../common/e0fn\":7,\"../common/e1fn\":8,\"../common/e2fn\":9,\"../common/e3fn\":10,\"../common/mlfn\":14,\"../common/sign\":21}],63:[function(a,b,c){var d=.017453292519943295,e=a(\"./tmerc\");c.dependsOn=\"tmerc\",c.init=function(){this.zone&&(this.lat0=0,this.long0=(6*Math.abs(this.zone)-183)*d,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,e.init.apply(this),this.forward=e.forward,this.inverse=e.inverse)},c.names=[\"Universal Transverse Mercator System\",\"utm\"]},{\"./tmerc\":62}],64:[function(a,b,c){var d=a(\"../common/adjust_lon\"),e=Math.PI/2,f=1e-10,g=a(\"../common/asinz\");c.init=function(){this.R=this.a},c.forward=function(a){var b,c,h=a.x,i=a.y,j=d(h-this.long0);Math.abs(i)<=f&&(b=this.x0+this.R*j,c=this.y0);var k=g(2*Math.abs(i/Math.PI));(Math.abs(j)<=f||Math.abs(Math.abs(i)-e)<=f)&&(b=this.x0,c=i>=0?this.y0+Math.PI*this.R*Math.tan(.5*k):this.y0+Math.PI*this.R*-Math.tan(.5*k));var l=.5*Math.abs(Math.PI/j-j/Math.PI),m=l*l,n=Math.sin(k),o=Math.cos(k),p=o/(n+o-1),q=p*p,r=p*(2/n-1),s=r*r,t=Math.PI*this.R*(l*(p-s)+Math.sqrt(m*(p-s)*(p-s)-(s+m)*(q-s)))/(s+m);0>j&&(t=-t),b=this.x0+t;var u=m+p;return t=Math.PI*this.R*(r*u-l*Math.sqrt((s+m)*(m+1)-u*u))/(s+m),c=i>=0?this.y0+t:this.y0-t,a.x=b,a.y=c,a},c.inverse=function(a){var b,c,e,g,h,i,j,k,l,m,n,o,p;return a.x-=this.x0,a.y-=this.y0,n=Math.PI*this.R,e=a.x/n,g=a.y/n,h=e*e+g*g,i=-Math.abs(g)*(1+h),j=i-2*g*g+e*e,k=-2*i+1+2*g*g+h*h,p=g*g/k+(2*j*j*j/k/k/k-9*i*j/k/k)/27,l=(i-j*j/3/k)/k,m=2*Math.sqrt(-l/3),n=3*p/l/m,Math.abs(n)>1&&(n=n>=0?1:-1),o=Math.acos(n)/3,c=a.y>=0?(-m*Math.cos(o+Math.PI/3)-j/3/k)*Math.PI:-(-m*Math.cos(o+Math.PI/3)-j/3/k)*Math.PI,b=Math.abs(e)<f?this.long0:d(this.long0+Math.PI*(h-1+Math.sqrt(1+2*(e*e-g*g)+h*h))/2/e),a.x=b,a.y=c,a},c.names=[\"Van_der_Grinten_I\",\"VanDerGrinten\",\"vandg\"]},{\"../common/adjust_lon\":5,\"../common/asinz\":6}],65:[function(a,b,c){var d=.017453292519943295,e=57.29577951308232,f=1,g=2,h=a(\"./datum_transform\"),i=a(\"./adjust_axis\"),j=a(\"./Proj\"),k=a(\"./common/toPoint\");b.exports=function l(a,b,c){function m(a,b){return(a.datum.datum_type===f||a.datum.datum_type===g)&&\"WGS84\"!==b.datumCode}var n;return Array.isArray(c)&&(c=k(c)),a.datum&&b.datum&&(m(a,b)||m(b,a))&&(n=new j(\"WGS84\"),l(a,n,c),a=n),\"enu\"!==a.axis&&i(a,!1,c),\"longlat\"===a.projName?(c.x*=d,c.y*=d):(a.to_meter&&(c.x*=a.to_meter,c.y*=a.to_meter),a.inverse(c)),a.from_greenwich&&(c.x+=a.from_greenwich),c=h(a.datum,b.datum,c),b.from_greenwich&&(c.x-=b.from_greenwich),\"longlat\"===b.projName?(c.x*=e,c.y*=e):(b.forward(c),b.to_meter&&(c.x/=b.to_meter,c.y/=b.to_meter)),\"enu\"!==b.axis&&i(b,!0,c),c}},{\"./Proj\":2,\"./adjust_axis\":3,\"./common/toPoint\":23,\"./datum_transform\":31}],66:[function(a,b,c){function d(a,b,c){a[b]=c.map(function(a){var b={};return e(a,b),b}).reduce(function(a,b){return j(a,b)},{})}function e(a,b){var c;return Array.isArray(a)?(c=a.shift(),\"PARAMETER\"===c&&(c=a.shift()),1===a.length?Array.isArray(a[0])?(b[c]={},e(a[0],b[c])):b[c]=a[0]:a.length?\"TOWGS84\"===c?b[c]=a:(b[c]={},[\"UNIT\",\"PRIMEM\",\"VERT_DATUM\"].indexOf(c)>-1?(b[c]={name:a[0].toLowerCase(),convert:a[1]},3===a.length&&(b[c].auth=a[2])):\"SPHEROID\"===c?(b[c]={name:a[0],a:a[1],rf:a[2]},4===a.length&&(b[c].auth=a[3])):[\"GEOGCS\",\"GEOCCS\",\"DATUM\",\"VERT_CS\",\"COMPD_CS\",\"LOCAL_CS\",\"FITTED_CS\",\"LOCAL_DATUM\"].indexOf(c)>-1?(a[0]=[\"name\",a[0]],d(b,c,a)):a.every(function(a){return Array.isArray(a)})?d(b,c,a):e(a,b[c])):b[c]=!0,void 0):void(b[a]=!0)}function f(a,b){var c=b[0],d=b[1];!(c in a)&&d in a&&(a[c]=a[d],3===b.length&&(a[c]=b[2](a[c])))}function g(a){return a*i}function h(a){function b(b){var c=a.to_meter||1;return parseFloat(b,10)*c}\"GEOGCS\"===a.type?a.projName=\"longlat\":\"LOCAL_CS\"===a.type?(a.projName=\"identity\",a.local=!0):\"object\"==typeof a.PROJECTION?a.projName=Object.keys(a.PROJECTION)[0]:a.projName=a.PROJECTION,a.UNIT&&(a.units=a.UNIT.name.toLowerCase(),\"metre\"===a.units&&(a.units=\"meter\"),\na.UNIT.convert&&(\"GEOGCS\"===a.type?a.DATUM&&a.DATUM.SPHEROID&&(a.to_meter=parseFloat(a.UNIT.convert,10)*a.DATUM.SPHEROID.a):a.to_meter=parseFloat(a.UNIT.convert,10))),a.GEOGCS&&(a.GEOGCS.DATUM?a.datumCode=a.GEOGCS.DATUM.name.toLowerCase():a.datumCode=a.GEOGCS.name.toLowerCase(),\"d_\"===a.datumCode.slice(0,2)&&(a.datumCode=a.datumCode.slice(2)),(\"new_zealand_geodetic_datum_1949\"===a.datumCode||\"new_zealand_1949\"===a.datumCode)&&(a.datumCode=\"nzgd49\"),\"wgs_1984\"===a.datumCode&&(\"Mercator_Auxiliary_Sphere\"===a.PROJECTION&&(a.sphere=!0),a.datumCode=\"wgs84\"),\"_ferro\"===a.datumCode.slice(-6)&&(a.datumCode=a.datumCode.slice(0,-6)),\"_jakarta\"===a.datumCode.slice(-8)&&(a.datumCode=a.datumCode.slice(0,-8)),~a.datumCode.indexOf(\"belge\")&&(a.datumCode=\"rnb72\"),a.GEOGCS.DATUM&&a.GEOGCS.DATUM.SPHEROID&&(a.ellps=a.GEOGCS.DATUM.SPHEROID.name.replace(\"_19\",\"\").replace(/[Cc]larke\\_18/,\"clrk\"),\"international\"===a.ellps.toLowerCase().slice(0,13)&&(a.ellps=\"intl\"),a.a=a.GEOGCS.DATUM.SPHEROID.a,a.rf=parseFloat(a.GEOGCS.DATUM.SPHEROID.rf,10)),~a.datumCode.indexOf(\"osgb_1936\")&&(a.datumCode=\"osgb36\")),a.b&&!isFinite(a.b)&&(a.b=a.a);var c=function(b){return f(a,b)},d=[[\"standard_parallel_1\",\"Standard_Parallel_1\"],[\"standard_parallel_2\",\"Standard_Parallel_2\"],[\"false_easting\",\"False_Easting\"],[\"false_northing\",\"False_Northing\"],[\"central_meridian\",\"Central_Meridian\"],[\"latitude_of_origin\",\"Latitude_Of_Origin\"],[\"latitude_of_origin\",\"Central_Parallel\"],[\"scale_factor\",\"Scale_Factor\"],[\"k0\",\"scale_factor\"],[\"latitude_of_center\",\"Latitude_of_center\"],[\"lat0\",\"latitude_of_center\",g],[\"longitude_of_center\",\"Longitude_Of_Center\"],[\"longc\",\"longitude_of_center\",g],[\"x0\",\"false_easting\",b],[\"y0\",\"false_northing\",b],[\"long0\",\"central_meridian\",g],[\"lat0\",\"latitude_of_origin\",g],[\"lat0\",\"standard_parallel_1\",g],[\"lat1\",\"standard_parallel_1\",g],[\"lat2\",\"standard_parallel_2\",g],[\"alpha\",\"azimuth\",g],[\"srsCode\",\"name\"]];d.forEach(c),a.long0||!a.longc||\"Albers_Conic_Equal_Area\"!==a.projName&&\"Lambert_Azimuthal_Equal_Area\"!==a.projName||(a.long0=a.longc),a.lat_ts||!a.lat1||\"Stereographic_South_Pole\"!==a.projName&&\"Polar Stereographic (variant B)\"!==a.projName||(a.lat0=g(a.lat1>0?90:-90),a.lat_ts=a.lat1)}var i=.017453292519943295,j=a(\"./extend\");b.exports=function(a,b){var c=JSON.parse((\",\"+a).replace(/\\s*\\,\\s*([A-Z_0-9]+?)(\\[)/g,',[\"$1\",').slice(1).replace(/\\s*\\,\\s*([A-Z_0-9]+?)\\]/g,',\"$1\"]').replace(/,\\[\"VERTCS\".+/,\"\")),d=c.shift(),f=c.shift();c.unshift([\"name\",f]),c.unshift([\"type\",d]),c.unshift(\"output\");var g={};return e(c,g),h(g.output),j(b,g.output)}},{\"./extend\":34}],67:[function(a,b,c){function d(a){return a*(Math.PI/180)}function e(a){return 180*(a/Math.PI)}function f(a){var b,c,e,f,g,i,j,k,l,m=a.lat,n=a.lon,o=6378137,p=.00669438,q=.9996,r=d(m),s=d(n);l=Math.floor((n+180)/6)+1,180===n&&(l=60),m>=56&&64>m&&n>=3&&12>n&&(l=32),m>=72&&84>m&&(n>=0&&9>n?l=31:n>=9&&21>n?l=33:n>=21&&33>n?l=35:n>=33&&42>n&&(l=37)),b=6*(l-1)-180+3,k=d(b),c=p/(1-p),e=o/Math.sqrt(1-p*Math.sin(r)*Math.sin(r)),f=Math.tan(r)*Math.tan(r),g=c*Math.cos(r)*Math.cos(r),i=Math.cos(r)*(s-k),j=o*((1-p/4-3*p*p/64-5*p*p*p/256)*r-(3*p/8+3*p*p/32+45*p*p*p/1024)*Math.sin(2*r)+(15*p*p/256+45*p*p*p/1024)*Math.sin(4*r)-35*p*p*p/3072*Math.sin(6*r));var t=q*e*(i+(1-f+g)*i*i*i/6+(5-18*f+f*f+72*g-58*c)*i*i*i*i*i/120)+5e5,u=q*(j+e*Math.tan(r)*(i*i/2+(5-f+9*g+4*g*g)*i*i*i*i/24+(61-58*f+f*f+600*g-330*c)*i*i*i*i*i*i/720));return 0>m&&(u+=1e7),{northing:Math.round(u),easting:Math.round(t),zoneNumber:l,zoneLetter:h(m)}}function g(a){var b=a.northing,c=a.easting,d=a.zoneLetter,f=a.zoneNumber;if(0>f||f>60)return null;var h,i,j,k,l,m,n,o,p,q,r=.9996,s=6378137,t=.00669438,u=(1-Math.sqrt(1-t))/(1+Math.sqrt(1-t)),v=c-5e5,w=b;\"N\">d&&(w-=1e7),o=6*(f-1)-180+3,h=t/(1-t),n=w/r,p=n/(s*(1-t/4-3*t*t/64-5*t*t*t/256)),q=p+(3*u/2-27*u*u*u/32)*Math.sin(2*p)+(21*u*u/16-55*u*u*u*u/32)*Math.sin(4*p)+151*u*u*u/96*Math.sin(6*p),i=s/Math.sqrt(1-t*Math.sin(q)*Math.sin(q)),j=Math.tan(q)*Math.tan(q),k=h*Math.cos(q)*Math.cos(q),l=s*(1-t)/Math.pow(1-t*Math.sin(q)*Math.sin(q),1.5),m=v/(i*r);var x=q-i*Math.tan(q)/l*(m*m/2-(5+3*j+10*k-4*k*k-9*h)*m*m*m*m/24+(61+90*j+298*k+45*j*j-252*h-3*k*k)*m*m*m*m*m*m/720);x=e(x);var y=(m-(1+2*j+k)*m*m*m/6+(5-2*k+28*j-3*k*k+8*h+24*j*j)*m*m*m*m*m/120)/Math.cos(q);y=o+e(y);var z;if(a.accuracy){var A=g({northing:a.northing+a.accuracy,easting:a.easting+a.accuracy,zoneLetter:a.zoneLetter,zoneNumber:a.zoneNumber});z={top:A.lat,right:A.lon,bottom:x,left:y}}else z={lat:x,lon:y};return z}function h(a){var b=\"Z\";return 84>=a&&a>=72?b=\"X\":72>a&&a>=64?b=\"W\":64>a&&a>=56?b=\"V\":56>a&&a>=48?b=\"U\":48>a&&a>=40?b=\"T\":40>a&&a>=32?b=\"S\":32>a&&a>=24?b=\"R\":24>a&&a>=16?b=\"Q\":16>a&&a>=8?b=\"P\":8>a&&a>=0?b=\"N\":0>a&&a>=-8?b=\"M\":-8>a&&a>=-16?b=\"L\":-16>a&&a>=-24?b=\"K\":-24>a&&a>=-32?b=\"J\":-32>a&&a>=-40?b=\"H\":-40>a&&a>=-48?b=\"G\":-48>a&&a>=-56?b=\"F\":-56>a&&a>=-64?b=\"E\":-64>a&&a>=-72?b=\"D\":-72>a&&a>=-80&&(b=\"C\"),b}function i(a,b){var c=\"00000\"+a.easting,d=\"00000\"+a.northing;return a.zoneNumber+a.zoneLetter+j(a.easting,a.northing,a.zoneNumber)+c.substr(c.length-5,b)+d.substr(d.length-5,b)}function j(a,b,c){var d=k(c),e=Math.floor(a/1e5),f=Math.floor(b/1e5)%20;return l(e,f,d)}function k(a){var b=a%q;return 0===b&&(b=q),b}function l(a,b,c){var d=c-1,e=r.charCodeAt(d),f=s.charCodeAt(d),g=e+a-1,h=f+b,i=!1;g>x&&(g=g-x+t-1,i=!0),(g===u||u>e&&g>u||(g>u||u>e)&&i)&&g++,(g===v||v>e&&g>v||(g>v||v>e)&&i)&&(g++,g===u&&g++),g>x&&(g=g-x+t-1),h>w?(h=h-w+t-1,i=!0):i=!1,(h===u||u>f&&h>u||(h>u||u>f)&&i)&&h++,(h===v||v>f&&h>v||(h>v||v>f)&&i)&&(h++,h===u&&h++),h>w&&(h=h-w+t-1);var j=String.fromCharCode(g)+String.fromCharCode(h);return j}function m(a){if(a&&0===a.length)throw\"MGRSPoint coverting from nothing\";for(var b,c=a.length,d=null,e=\"\",f=0;!/[A-Z]/.test(b=a.charAt(f));){if(f>=2)throw\"MGRSPoint bad conversion from: \"+a;e+=b,f++}var g=parseInt(e,10);if(0===f||f+3>c)throw\"MGRSPoint bad conversion from: \"+a;var h=a.charAt(f++);if(\"A\">=h||\"B\"===h||\"Y\"===h||h>=\"Z\"||\"I\"===h||\"O\"===h)throw\"MGRSPoint zone letter \"+h+\" not handled: \"+a;d=a.substring(f,f+=2);for(var i=k(g),j=n(d.charAt(0),i),l=o(d.charAt(1),i);l<p(h);)l+=2e6;var m=c-f;if(m%2!==0)throw\"MGRSPoint has to have an even number \\nof digits after the zone letter and two 100km letters - front \\nhalf for easting meters, second half for \\nnorthing meters\"+a;var q,r,s,t,u,v=m/2,w=0,x=0;return v>0&&(q=1e5/Math.pow(10,v),r=a.substring(f,f+v),w=parseFloat(r)*q,s=a.substring(f+v),x=parseFloat(s)*q),t=w+j,u=x+l,{easting:t,northing:u,zoneLetter:h,zoneNumber:g,accuracy:q}}function n(a,b){for(var c=r.charCodeAt(b-1),d=1e5,e=!1;c!==a.charCodeAt(0);){if(c++,c===u&&c++,c===v&&c++,c>x){if(e)throw\"Bad character: \"+a;c=t,e=!0}d+=1e5}return d}function o(a,b){if(a>\"V\")throw\"MGRSPoint given invalid Northing \"+a;for(var c=s.charCodeAt(b-1),d=0,e=!1;c!==a.charCodeAt(0);){if(c++,c===u&&c++,c===v&&c++,c>w){if(e)throw\"Bad character: \"+a;c=t,e=!0}d+=1e5}return d}function p(a){var b;switch(a){case\"C\":b=11e5;break;case\"D\":b=2e6;break;case\"E\":b=28e5;break;case\"F\":b=37e5;break;case\"G\":b=46e5;break;case\"H\":b=55e5;break;case\"J\":b=64e5;break;case\"K\":b=73e5;break;case\"L\":b=82e5;break;case\"M\":b=91e5;break;case\"N\":b=0;break;case\"P\":b=8e5;break;case\"Q\":b=17e5;break;case\"R\":b=26e5;break;case\"S\":b=35e5;break;case\"T\":b=44e5;break;case\"U\":b=53e5;break;case\"V\":b=62e5;break;case\"W\":b=7e6;break;case\"X\":b=79e5;break;default:b=-1}if(b>=0)return b;throw\"Invalid zone letter: \"+a}var q=6,r=\"AJSAJS\",s=\"AFAFAF\",t=65,u=73,v=79,w=86,x=90;c.forward=function(a,b){return b=b||5,i(f({lat:a[1],lon:a[0]}),b)},c.inverse=function(a){var b=g(m(a.toUpperCase()));return b.lat&&b.lon?[b.lon,b.lat,b.lon,b.lat]:[b.left,b.bottom,b.right,b.top]},c.toPoint=function(a){var b=g(m(a.toUpperCase()));return b.lat&&b.lon?[b.lon,b.lat]:[(b.left+b.right)/2,(b.top+b.bottom)/2]}},{}],68:[function(a,b,c){b.exports={name:\"proj4\",version:\"2.3.14\",description:\"Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.\",main:\"lib/index.js\",directories:{test:\"test\",doc:\"docs\"},scripts:{test:\"./node_modules/istanbul/lib/cli.js test ./node_modules/mocha/bin/_mocha test/test.js\"},repository:{type:\"git\",url:\"git://github.com/proj4js/proj4js.git\"},author:\"\",license:\"MIT\",jam:{main:\"dist/proj4.js\",include:[\"dist/proj4.js\",\"README.md\",\"AUTHORS\",\"LICENSE.md\"]},devDependencies:{\"grunt-cli\":\"~0.1.13\",grunt:\"~0.4.2\",\"grunt-contrib-connect\":\"~0.6.0\",\"grunt-contrib-jshint\":\"~0.8.0\",chai:\"~1.8.1\",mocha:\"~1.17.1\",\"grunt-mocha-phantomjs\":\"~0.4.0\",browserify:\"~12.0.1\",\"grunt-browserify\":\"~4.0.1\",\"grunt-contrib-uglify\":\"~0.11.1\",curl:\"git://github.com/cujojs/curl.git\",istanbul:\"~0.2.4\",tin:\"~0.4.0\"},dependencies:{mgrs:\"~0.0.2\"}}},{}],\"./includedProjections\":[function(a,b,c){b.exports=a(\"hTEDpn\")},{}],hTEDpn:[function(a,b,c){var d=[a(\"./lib/projections/tmerc\"),a(\"./lib/projections/utm\"),a(\"./lib/projections/sterea\"),a(\"./lib/projections/stere\"),a(\"./lib/projections/somerc\"),a(\"./lib/projections/omerc\"),a(\"./lib/projections/lcc\"),a(\"./lib/projections/krovak\"),a(\"./lib/projections/cass\"),a(\"./lib/projections/laea\"),a(\"./lib/projections/aea\"),a(\"./lib/projections/gnom\"),a(\"./lib/projections/cea\"),a(\"./lib/projections/eqc\"),a(\"./lib/projections/poly\"),a(\"./lib/projections/nzmg\"),a(\"./lib/projections/mill\"),a(\"./lib/projections/sinu\"),a(\"./lib/projections/moll\"),a(\"./lib/projections/eqdc\"),a(\"./lib/projections/vandg\"),a(\"./lib/projections/aeqd\")];b.exports=function(proj4){d.forEach(function(a){proj4.Proj.projections.add(a)})}},{\"./lib/projections/aea\":40,\"./lib/projections/aeqd\":41,\"./lib/projections/cass\":42,\"./lib/projections/cea\":43,\"./lib/projections/eqc\":44,\"./lib/projections/eqdc\":45,\"./lib/projections/gnom\":47,\"./lib/projections/krovak\":48,\"./lib/projections/laea\":49,\"./lib/projections/lcc\":50,\"./lib/projections/mill\":53,\"./lib/projections/moll\":54,\"./lib/projections/nzmg\":55,\"./lib/projections/omerc\":56,\"./lib/projections/poly\":57,\"./lib/projections/sinu\":58,\"./lib/projections/somerc\":59,\"./lib/projections/stere\":60,\"./lib/projections/sterea\":61,\"./lib/projections/tmerc\":62,\"./lib/projections/utm\":63,\"./lib/projections/vandg\":64}]},{},[36])(36)});"
  },
  {
    "path": "vignettes/tutorials/libs/Proj4Leaflet/proj4leaflet.js",
    "content": "(function (factory) {\r\n\tvar L, proj4;\r\n\tif (typeof define === 'function' && define.amd) {\r\n\t\t// AMD\r\n\t\tdefine(['leaflet', 'proj4'], factory);\r\n\t} else if (typeof module === 'object' && typeof module.exports === \"object\") {\r\n\t\t// Node/CommonJS\r\n\t\tL = require('leaflet');\r\n\t\tproj4 = require('proj4');\r\n\t\tmodule.exports = factory(L, proj4);\r\n\t} else {\r\n\t\t// Browser globals\r\n\t\tif (typeof window.L === 'undefined' || typeof window.proj4 === 'undefined')\r\n\t\t\tthrow 'Leaflet and proj4 must be loaded first';\r\n\t\tfactory(window.L, window.proj4);\r\n\t}\r\n}(function (L, proj4) {\r\n\tif (proj4.__esModule && proj4.default) {\r\n\t\t// If proj4 was bundled as an ES6 module, unwrap it to get\r\n\t\t// to the actual main proj4 object.\r\n\t\t// See discussion in https://github.com/kartena/Proj4Leaflet/pull/147\r\n\t\tproj4 = proj4.default;\r\n\t}\r\n \r\n\tL.Proj = {};\r\n\r\n\tL.Proj._isProj4Obj = function(a) {\r\n\t\treturn (typeof a.inverse !== 'undefined' &&\r\n\t\t\ttypeof a.forward !== 'undefined');\r\n\t};\r\n\r\n\tL.Proj.Projection = L.Class.extend({\r\n\t\tinitialize: function(code, def, bounds) {\r\n\t\t\tvar isP4 = L.Proj._isProj4Obj(code);\r\n\t\t\tthis._proj = isP4 ? code : this._projFromCodeDef(code, def);\r\n\t\t\tthis.bounds = isP4 ? def : bounds;\r\n\t\t},\r\n\r\n\t\tproject: function (latlng) {\r\n\t\t\tvar point = this._proj.forward([latlng.lng, latlng.lat]);\r\n\t\t\treturn new L.Point(point[0], point[1]);\r\n\t\t},\r\n\r\n\t\tunproject: function (point, unbounded) {\r\n\t\t\tvar point2 = this._proj.inverse([point.x, point.y]);\r\n\t\t\treturn new L.LatLng(point2[1], point2[0], unbounded);\r\n\t\t},\r\n\r\n\t\t_projFromCodeDef: function(code, def) {\r\n\t\t\tif (def) {\r\n\t\t\t\tproj4.defs(code, def);\r\n\t\t\t} else if (proj4.defs[code] === undefined) {\r\n\t\t\t\tvar urn = code.split(':');\r\n\t\t\t\tif (urn.length > 3) {\r\n\t\t\t\t\tcode = urn[urn.length - 3] + ':' + urn[urn.length - 1];\r\n\t\t\t\t}\r\n\t\t\t\tif (proj4.defs[code] === undefined) {\r\n\t\t\t\t\tthrow 'No projection definition for code ' + code;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn proj4(code);\r\n\t\t}\r\n\t});\r\n\r\n\tL.Proj.CRS = L.Class.extend({\r\n\t\tincludes: L.CRS,\r\n\r\n\t\toptions: {\r\n\t\t\ttransformation: new L.Transformation(1, 0, -1, 0)\r\n\t\t},\r\n\r\n\t\tinitialize: function(a, b, c) {\r\n\t\t\tvar code,\r\n\t\t\t    proj,\r\n\t\t\t    def,\r\n\t\t\t    options;\r\n\r\n\t\t\tif (L.Proj._isProj4Obj(a)) {\r\n\t\t\t\tproj = a;\r\n\t\t\t\tcode = proj.srsCode;\r\n\t\t\t\toptions = b || {};\r\n\r\n\t\t\t\tthis.projection = new L.Proj.Projection(proj, options.bounds);\r\n\t\t\t} else {\r\n\t\t\t\tcode = a;\r\n\t\t\t\tdef = b;\r\n\t\t\t\toptions = c || {};\r\n\t\t\t\tthis.projection = new L.Proj.Projection(code, def, options.bounds);\r\n\t\t\t}\r\n\r\n\t\t\tL.Util.setOptions(this, options);\r\n\t\t\tthis.code = code;\r\n\t\t\tthis.transformation = this.options.transformation;\r\n\r\n\t\t\tif (this.options.origin) {\r\n\t\t\t\tthis.transformation =\r\n\t\t\t\t\tnew L.Transformation(1, -this.options.origin[0],\r\n\t\t\t\t\t\t-1, this.options.origin[1]);\r\n\t\t\t}\r\n\r\n\t\t\tif (this.options.scales) {\r\n\t\t\t\tthis._scales = this.options.scales;\r\n\t\t\t} else if (this.options.resolutions) {\r\n\t\t\t\tthis._scales = [];\r\n\t\t\t\tfor (var i = this.options.resolutions.length - 1; i >= 0; i--) {\r\n\t\t\t\t\tif (this.options.resolutions[i]) {\r\n\t\t\t\t\t\tthis._scales[i] = 1 / this.options.resolutions[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.infinite = !this.options.bounds;\r\n\r\n\t\t},\r\n\r\n\t\tscale: function(zoom) {\r\n\t\t\tvar iZoom = Math.floor(zoom),\r\n\t\t\t\tbaseScale,\r\n\t\t\t\tnextScale,\r\n\t\t\t\tscaleDiff,\r\n\t\t\t\tzDiff;\r\n\t\t\tif (zoom === iZoom) {\r\n\t\t\t\treturn this._scales[zoom];\r\n\t\t\t} else {\r\n\t\t\t\t// Non-integer zoom, interpolate\r\n\t\t\t\tbaseScale = this._scales[iZoom];\r\n\t\t\t\tnextScale = this._scales[iZoom + 1];\r\n\t\t\t\tscaleDiff = nextScale - baseScale;\r\n\t\t\t\tzDiff = (zoom - iZoom);\r\n\t\t\t\treturn baseScale + scaleDiff * zDiff;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tzoom: function(scale) {\r\n\t\t\t// Find closest number in this._scales, down\r\n\t\t\tvar downScale = this._closestElement(this._scales, scale),\r\n\t\t\t\tdownZoom = this._scales.indexOf(downScale),\r\n\t\t\t\tnextScale,\r\n\t\t\t\tnextZoom,\r\n\t\t\t\tscaleDiff;\r\n\t\t\t// Check if scale is downScale => return array index\r\n\t\t\tif (scale === downScale) {\r\n\t\t\t\treturn downZoom;\r\n\t\t\t}\r\n\t\t\tif (downScale === undefined) {\r\n\t\t\t\treturn -Infinity;\r\n\t\t\t}\r\n\t\t\t// Interpolate\r\n\t\t\tnextZoom = downZoom + 1;\r\n\t\t\tnextScale = this._scales[nextZoom];\r\n\t\t\tif (nextScale === undefined) {\r\n\t\t\t\treturn Infinity;\r\n\t\t\t}\r\n\t\t\tscaleDiff = nextScale - downScale;\r\n\t\t\treturn (scale - downScale) / scaleDiff + downZoom;\r\n\t\t},\r\n\r\n\t\tdistance: L.CRS.Earth.distance,\r\n\r\n\t\tR: L.CRS.Earth.R,\r\n\r\n\t\t/* Get the closest lowest element in an array */\r\n\t\t_closestElement: function(array, element) {\r\n\t\t\tvar low;\r\n\t\t\tfor (var i = array.length; i--;) {\r\n\t\t\t\tif (array[i] <= element && (low === undefined || low < array[i])) {\r\n\t\t\t\t\tlow = array[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn low;\r\n\t\t}\r\n\t});\r\n\r\n\tL.Proj.GeoJSON = L.GeoJSON.extend({\r\n\t\tinitialize: function(geojson, options) {\r\n\t\t\tthis._callLevel = 0;\r\n\t\t\tL.GeoJSON.prototype.initialize.call(this, geojson, options);\r\n\t\t},\r\n\r\n\t\taddData: function(geojson) {\r\n\t\t\tvar crs;\r\n\r\n\t\t\tif (geojson) {\r\n\t\t\t\tif (geojson.crs && geojson.crs.type === 'name') {\r\n\t\t\t\t\tcrs = new L.Proj.CRS(geojson.crs.properties.name);\r\n\t\t\t\t} else if (geojson.crs && geojson.crs.type) {\r\n\t\t\t\t\tcrs = new L.Proj.CRS(geojson.crs.type + ':' + geojson.crs.properties.code);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (crs !== undefined) {\r\n\t\t\t\t\tthis.options.coordsToLatLng = function(coords) {\r\n\t\t\t\t\t\tvar point = L.point(coords[0], coords[1]);\r\n\t\t\t\t\t\treturn crs.projection.unproject(point);\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Base class' addData might call us recursively, but\r\n\t\t\t// CRS shouldn't be cleared in that case, since CRS applies\r\n\t\t\t// to the whole GeoJSON, inluding sub-features.\r\n\t\t\tthis._callLevel++;\r\n\t\t\ttry {\r\n\t\t\t\tL.GeoJSON.prototype.addData.call(this, geojson);\r\n\t\t\t} finally {\r\n\t\t\t\tthis._callLevel--;\r\n\t\t\t\tif (this._callLevel === 0) {\r\n\t\t\t\t\tdelete this.options.coordsToLatLng;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\tL.Proj.geoJson = function(geojson, options) {\r\n\t\treturn new L.Proj.GeoJSON(geojson, options);\r\n\t};\r\n\r\n\tL.Proj.ImageOverlay = L.ImageOverlay.extend({\r\n\t\tinitialize: function (url, bounds, options) {\r\n\t\t\tL.ImageOverlay.prototype.initialize.call(this, url, null, options);\r\n\t\t\tthis._projectedBounds = bounds;\r\n\t\t},\r\n\r\n\t\t// Danger ahead: Overriding internal methods in Leaflet.\r\n\t\t// Decided to do this rather than making a copy of L.ImageOverlay\r\n\t\t// and doing very tiny modifications to it.\r\n\t\t// Future will tell if this was wise or not.\r\n\t\t_animateZoom: function (event) {\r\n\t\t\tvar scale = this._map.getZoomScale(event.zoom);\r\n\t\t\tvar northWest = L.point(this._projectedBounds.min.x, this._projectedBounds.max.y);\r\n\t\t\tvar offset = this._projectedToNewLayerPoint(northWest, event.zoom, event.center);\r\n\r\n\t\t\tL.DomUtil.setTransform(this._image, offset, scale);\r\n\t\t},\r\n\r\n\t\t_reset: function () {\r\n\t\t\tvar zoom = this._map.getZoom();\r\n\t\t\tvar pixelOrigin = this._map.getPixelOrigin();\r\n\t\t\tvar bounds = L.bounds(\r\n\t\t\t\tthis._transform(this._projectedBounds.min, zoom)._subtract(pixelOrigin),\r\n\t\t\t\tthis._transform(this._projectedBounds.max, zoom)._subtract(pixelOrigin)\r\n\t\t\t);\r\n\t\t\tvar size = bounds.getSize();\r\n\r\n\t\t\tL.DomUtil.setPosition(this._image, bounds.min);\r\n\t\t\tthis._image.style.width = size.x + 'px';\r\n\t\t\tthis._image.style.height = size.y + 'px';\r\n\t\t},\r\n\r\n\t\t_projectedToNewLayerPoint: function (point, zoom, center) {\r\n\t\t\tvar viewHalf = this._map.getSize()._divideBy(2);\r\n\t\t\tvar newTopLeft = this._map.project(center, zoom)._subtract(viewHalf)._round();\r\n\t\t\tvar topLeft = newTopLeft.add(this._map._getMapPanePos());\r\n\r\n\t\t\treturn this._transform(point, zoom)._subtract(topLeft);\r\n\t\t},\r\n\r\n\t\t_transform: function (point, zoom) {\r\n\t\t\tvar crs = this._map.options.crs;\r\n\t\t\tvar transformation = crs.transformation;\r\n\t\t\tvar scale = crs.scale(zoom);\r\n\r\n\t\t\treturn transformation.transform(point, scale);\r\n\t\t}\r\n\t});\r\n\r\n\tL.Proj.imageOverlay = function (url, bounds, options) {\r\n\t\treturn new L.Proj.ImageOverlay(url, bounds, options);\r\n\t};\r\n\r\n\treturn L.Proj;\r\n}));\r\n"
  },
  {
    "path": "vignettes/tutorials/libs/crosstalk/css/crosstalk.css",
    "content": "/* Adjust margins outwards, so column contents line up with the edges of the\n   parent of container-fluid. */\n.container-fluid.crosstalk-bscols {\n  margin-left: -30px;\n  margin-right: -30px;\n  white-space: normal;\n}\n\n/* But don't adjust the margins outwards if we're directly under the body,\n   i.e. we were the top-level of something at the console. */\nbody > .container-fluid.crosstalk-bscols {\n  margin-left: auto;\n  margin-right: auto;\n}\n\n.crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column {\n  display: inline-block;\n  padding-right: 12px;\n  vertical-align: top;\n}\n\n@media only screen and (max-width:480px) {\n  .crosstalk-input-checkboxgroup .crosstalk-options-group .crosstalk-options-column {\n    display: block;\n    padding-right: inherit;\n  }\n}\n"
  },
  {
    "path": "vignettes/tutorials/libs/crosstalk/js/crosstalk.js",
    "content": "(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()({1:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Events = function () {\n  function Events() {\n    _classCallCheck(this, Events);\n\n    this._types = {};\n    this._seq = 0;\n  }\n\n  _createClass(Events, [{\n    key: \"on\",\n    value: function on(eventType, listener) {\n      var subs = this._types[eventType];\n      if (!subs) {\n        subs = this._types[eventType] = {};\n      }\n      var sub = \"sub\" + this._seq++;\n      subs[sub] = listener;\n      return sub;\n    }\n\n    // Returns false if no match, or string for sub name if matched\n\n  }, {\n    key: \"off\",\n    value: function off(eventType, listener) {\n      var subs = this._types[eventType];\n      if (typeof listener === \"function\") {\n        for (var key in subs) {\n          if (subs.hasOwnProperty(key)) {\n            if (subs[key] === listener) {\n              delete subs[key];\n              return key;\n            }\n          }\n        }\n        return false;\n      } else if (typeof listener === \"string\") {\n        if (subs && subs[listener]) {\n          delete subs[listener];\n          return listener;\n        }\n        return false;\n      } else {\n        throw new Error(\"Unexpected type for listener\");\n      }\n    }\n  }, {\n    key: \"trigger\",\n    value: function trigger(eventType, arg, thisObj) {\n      var subs = this._types[eventType];\n      for (var key in subs) {\n        if (subs.hasOwnProperty(key)) {\n          subs[key].call(thisObj, arg);\n        }\n      }\n    }\n  }]);\n\n  return Events;\n}();\n\nexports.default = Events;\n\n},{}],2:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.FilterHandle = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _events = require(\"./events\");\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _filterset = require(\"./filterset\");\n\nvar _filterset2 = _interopRequireDefault(_filterset);\n\nvar _group = require(\"./group\");\n\nvar _group2 = _interopRequireDefault(_group);\n\nvar _util = require(\"./util\");\n\nvar util = _interopRequireWildcard(_util);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction getFilterSet(group) {\n  var fsVar = group.var(\"filterset\");\n  var result = fsVar.get();\n  if (!result) {\n    result = new _filterset2.default();\n    fsVar.set(result);\n  }\n  return result;\n}\n\nvar id = 1;\nfunction nextId() {\n  return id++;\n}\n\n/**\n * Use this class to contribute to, and listen for changes to, the filter set\n * for the given group of widgets. Filter input controls should create one\n * `FilterHandle` and only call {@link FilterHandle#set}. Output widgets that\n * wish to displayed filtered data should create one `FilterHandle` and use\n * the {@link FilterHandle#filteredKeys} property and listen for change\n * events.\n *\n * If two (or more) `FilterHandle` instances in the same webpage share the\n * same group name, they will contribute to a single \"filter set\". Each\n * `FilterHandle` starts out with a `null` value, which means they take\n * nothing away from the set of data that should be shown. To make a\n * `FilterHandle` actually remove data from the filter set, set its value to\n * an array of keys which should be displayed. Crosstalk will aggregate the\n * various key arrays by finding their intersection; only keys that are\n * present in all non-null filter handles are considered part of the filter\n * set.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n *   null or undefined (or any other falsy value). This can be changed later\n *   via the {@link FilterHandle#setGroup} method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n *   the event object whenever an event is emitted.\n */\n\nvar FilterHandle = exports.FilterHandle = function () {\n  function FilterHandle(group, extraInfo) {\n    _classCallCheck(this, FilterHandle);\n\n    this._eventRelay = new _events2.default();\n    this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n    // Name of the group we're currently tracking, if any. Can change over time.\n    this._group = null;\n    // The filterSet that we're tracking, if any. Can change over time.\n    this._filterSet = null;\n    // The Var we're currently tracking, if any. Can change over time.\n    this._filterVar = null;\n    // The event handler subscription we currently have on var.on(\"change\").\n    this._varOnChangeSub = null;\n\n    this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n    this._id = \"filter\" + nextId();\n\n    this.setGroup(group);\n  }\n\n  /**\n   * Changes the Crosstalk group membership of this FilterHandle. If `set()` was\n   * previously called on this handle, switching groups will clear those keys\n   * from the old group's filter set. These keys will not be applied to the new\n   * group's filter set either. In other words, `setGroup()` effectively calls\n   * `clear()` before switching groups.\n   *\n   * @param {string} group - The name of the Crosstalk group, or null (or\n   *   undefined) to clear the group.\n   */\n\n\n  _createClass(FilterHandle, [{\n    key: \"setGroup\",\n    value: function setGroup(group) {\n      var _this = this;\n\n      // If group is unchanged, do nothing\n      if (this._group === group) return;\n      // Treat null, undefined, and other falsy values the same\n      if (!this._group && !group) return;\n\n      if (this._filterVar) {\n        this._filterVar.off(\"change\", this._varOnChangeSub);\n        this.clear();\n        this._varOnChangeSub = null;\n        this._filterVar = null;\n        this._filterSet = null;\n      }\n\n      this._group = group;\n\n      if (group) {\n        group = (0, _group2.default)(group);\n        this._filterSet = getFilterSet(group);\n        this._filterVar = (0, _group2.default)(group).var(\"filter\");\n        var sub = this._filterVar.on(\"change\", function (e) {\n          _this._eventRelay.trigger(\"change\", e, _this);\n        });\n        this._varOnChangeSub = sub;\n      }\n    }\n\n    /**\n     * Combine the given `extraInfo` (if any) with the handle's default\n     * `_extraInfo` (if any).\n     * @private\n     */\n\n  }, {\n    key: \"_mergeExtraInfo\",\n    value: function _mergeExtraInfo(extraInfo) {\n      return util.extend({}, this._extraInfo ? this._extraInfo : null, extraInfo ? extraInfo : null);\n    }\n\n    /**\n     * Close the handle. This clears this handle's contribution to the filter set,\n     * and unsubscribes all event listeners.\n     */\n\n  }, {\n    key: \"close\",\n    value: function close() {\n      this._emitter.removeAllListeners();\n      this.clear();\n      this.setGroup(null);\n    }\n\n    /**\n     * Clear this handle's contribution to the filter set.\n     *\n     * @param {Object} [extraInfo] - Extra properties to be included on the event\n     *   object that's passed to listeners (in addition to any options that were\n     *   passed into the `FilterHandle` constructor).\n     * \n     * @fires FilterHandle#change\n     */\n\n  }, {\n    key: \"clear\",\n    value: function clear(extraInfo) {\n      if (!this._filterSet) return;\n      this._filterSet.clear(this._id);\n      this._onChange(extraInfo);\n    }\n\n    /**\n     * Set this handle's contribution to the filter set. This array should consist\n     * of the keys of the rows that _should_ be displayed; any keys that are not\n     * present in the array will be considered _filtered out_. Note that multiple\n     * `FilterHandle` instances in the group may each contribute an array of keys,\n     * and only those keys that appear in _all_ of the arrays make it through the\n     * filter.\n     *\n     * @param {string[]} keys - Empty array, or array of keys. To clear the\n     *   filter, don't pass an empty array; instead, use the\n     *   {@link FilterHandle#clear} method.\n     * @param {Object} [extraInfo] - Extra properties to be included on the event\n     *   object that's passed to listeners (in addition to any options that were\n     *   passed into the `FilterHandle` constructor).\n     * \n     * @fires FilterHandle#change\n     */\n\n  }, {\n    key: \"set\",\n    value: function set(keys, extraInfo) {\n      if (!this._filterSet) return;\n      this._filterSet.update(this._id, keys);\n      this._onChange(extraInfo);\n    }\n\n    /**\n     * @return {string[]|null} - Either: 1) an array of keys that made it through\n     *   all of the `FilterHandle` instances, or, 2) `null`, which means no filter\n     *   is being applied (all data should be displayed).\n     */\n\n  }, {\n    key: \"on\",\n\n\n    /**\n     * Subscribe to events on this `FilterHandle`.\n     *\n     * @param {string} eventType - Indicates the type of events to listen to.\n     *   Currently, only `\"change\"` is supported.\n     * @param {FilterHandle~listener} listener - The callback function that\n     *   will be invoked when the event occurs.\n     * @return {string} - A token to pass to {@link FilterHandle#off} to cancel\n     *   this subscription.\n     */\n    value: function on(eventType, listener) {\n      return this._emitter.on(eventType, listener);\n    }\n\n    /**\n     * Cancel event subscriptions created by {@link FilterHandle#on}.\n     *\n     * @param {string} eventType - The type of event to unsubscribe.\n     * @param {string|FilterHandle~listener} listener - Either the callback\n     *   function previously passed into {@link FilterHandle#on}, or the\n     *   string that was returned from {@link FilterHandle#on}.\n     */\n\n  }, {\n    key: \"off\",\n    value: function off(eventType, listener) {\n      return this._emitter.off(eventType, listener);\n    }\n  }, {\n    key: \"_onChange\",\n    value: function _onChange(extraInfo) {\n      if (!this._filterSet) return;\n      this._filterVar.set(this._filterSet.value, this._mergeExtraInfo(extraInfo));\n    }\n\n    /**\n     * @callback FilterHandle~listener\n     * @param {Object} event - An object containing details of the event. For\n     *   `\"change\"` events, this includes the properties `value` (the new\n     *   value of the filter set, or `null` if no filter set is active),\n     *   `oldValue` (the previous value of the filter set), and `sender` (the\n     *   `FilterHandle` instance that made the change).\n     */\n\n  }, {\n    key: \"filteredKeys\",\n    get: function get() {\n      return this._filterSet ? this._filterSet.value : null;\n    }\n  }]);\n\n  return FilterHandle;\n}();\n\n/**\n * @event FilterHandle#change\n * @type {object}\n * @property {object} value - The new value of the filter set, or `null`\n *   if no filter set is active.\n * @property {object} oldValue - The previous value of the filter set.\n * @property {FilterHandle} sender - The `FilterHandle` instance that\n *   changed the value.\n */\n\n},{\"./events\":1,\"./filterset\":3,\"./group\":4,\"./util\":11}],3:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _util = require(\"./util\");\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction naturalComparator(a, b) {\n  if (a === b) {\n    return 0;\n  } else if (a < b) {\n    return -1;\n  } else if (a > b) {\n    return 1;\n  }\n}\n\n/**\n * @private\n */\n\nvar FilterSet = function () {\n  function FilterSet() {\n    _classCallCheck(this, FilterSet);\n\n    this.reset();\n  }\n\n  _createClass(FilterSet, [{\n    key: \"reset\",\n    value: function reset() {\n      // Key: handle ID, Value: array of selected keys, or null\n      this._handles = {};\n      // Key: key string, Value: count of handles that include it\n      this._keys = {};\n      this._value = null;\n      this._activeHandles = 0;\n    }\n  }, {\n    key: \"update\",\n    value: function update(handleId, keys) {\n      if (keys !== null) {\n        keys = keys.slice(0); // clone before sorting\n        keys.sort(naturalComparator);\n      }\n\n      var _diffSortedLists = (0, _util.diffSortedLists)(this._handles[handleId], keys),\n          added = _diffSortedLists.added,\n          removed = _diffSortedLists.removed;\n\n      this._handles[handleId] = keys;\n\n      for (var i = 0; i < added.length; i++) {\n        this._keys[added[i]] = (this._keys[added[i]] || 0) + 1;\n      }\n      for (var _i = 0; _i < removed.length; _i++) {\n        this._keys[removed[_i]]--;\n      }\n\n      this._updateValue(keys);\n    }\n\n    /**\n     * @param {string[]} keys Sorted array of strings that indicate\n     * a superset of possible keys.\n     * @private\n     */\n\n  }, {\n    key: \"_updateValue\",\n    value: function _updateValue() {\n      var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this._allKeys;\n\n      var handleCount = Object.keys(this._handles).length;\n      if (handleCount === 0) {\n        this._value = null;\n      } else {\n        this._value = [];\n        for (var i = 0; i < keys.length; i++) {\n          var count = this._keys[keys[i]];\n          if (count === handleCount) {\n            this._value.push(keys[i]);\n          }\n        }\n      }\n    }\n  }, {\n    key: \"clear\",\n    value: function clear(handleId) {\n      if (typeof this._handles[handleId] === \"undefined\") {\n        return;\n      }\n\n      var keys = this._handles[handleId];\n      if (!keys) {\n        keys = [];\n      }\n\n      for (var i = 0; i < keys.length; i++) {\n        this._keys[keys[i]]--;\n      }\n      delete this._handles[handleId];\n\n      this._updateValue();\n    }\n  }, {\n    key: \"value\",\n    get: function get() {\n      return this._value;\n    }\n  }, {\n    key: \"_allKeys\",\n    get: function get() {\n      var allKeys = Object.keys(this._keys);\n      allKeys.sort(naturalComparator);\n      return allKeys;\n    }\n  }]);\n\n  return FilterSet;\n}();\n\nexports.default = FilterSet;\n\n},{\"./util\":11}],4:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.default = group;\n\nvar _var2 = require(\"./var\");\n\nvar _var3 = _interopRequireDefault(_var2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// Use a global so that multiple copies of crosstalk.js can be loaded and still\n// have groups behave as singletons across all copies.\nglobal.__crosstalk_groups = global.__crosstalk_groups || {};\nvar groups = global.__crosstalk_groups;\n\nfunction group(groupName) {\n  if (groupName && typeof groupName === \"string\") {\n    if (!groups.hasOwnProperty(groupName)) {\n      groups[groupName] = new Group(groupName);\n    }\n    return groups[groupName];\n  } else if ((typeof groupName === \"undefined\" ? \"undefined\" : _typeof(groupName)) === \"object\" && groupName._vars && groupName.var) {\n    // Appears to already be a group object\n    return groupName;\n  } else if (Array.isArray(groupName) && groupName.length == 1 && typeof groupName[0] === \"string\") {\n    return group(groupName[0]);\n  } else {\n    throw new Error(\"Invalid groupName argument\");\n  }\n}\n\nvar Group = function () {\n  function Group(name) {\n    _classCallCheck(this, Group);\n\n    this.name = name;\n    this._vars = {};\n  }\n\n  _createClass(Group, [{\n    key: \"var\",\n    value: function _var(name) {\n      if (!name || typeof name !== \"string\") {\n        throw new Error(\"Invalid var name\");\n      }\n\n      if (!this._vars.hasOwnProperty(name)) this._vars[name] = new _var3.default(this, name);\n      return this._vars[name];\n    }\n  }, {\n    key: \"has\",\n    value: function has(name) {\n      if (!name || typeof name !== \"string\") {\n        throw new Error(\"Invalid var name\");\n      }\n\n      return this._vars.hasOwnProperty(name);\n    }\n  }]);\n\n  return Group;\n}();\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./var\":12}],5:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _group = require(\"./group\");\n\nvar _group2 = _interopRequireDefault(_group);\n\nvar _selection = require(\"./selection\");\n\nvar _filter = require(\"./filter\");\n\nvar _input = require(\"./input\");\n\nrequire(\"./input_selectize\");\n\nrequire(\"./input_checkboxgroup\");\n\nrequire(\"./input_slider\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar defaultGroup = (0, _group2.default)(\"default\");\n\nfunction var_(name) {\n  return defaultGroup.var(name);\n}\n\nfunction has(name) {\n  return defaultGroup.has(name);\n}\n\nif (global.Shiny) {\n  global.Shiny.addCustomMessageHandler(\"update-client-value\", function (message) {\n    if (typeof message.group === \"string\") {\n      (0, _group2.default)(message.group).var(message.name).set(message.value);\n    } else {\n      var_(message.name).set(message.value);\n    }\n  });\n}\n\nvar crosstalk = {\n  group: _group2.default,\n  var: var_,\n  has: has,\n  SelectionHandle: _selection.SelectionHandle,\n  FilterHandle: _filter.FilterHandle,\n  bind: _input.bind\n};\n\n/**\n * @namespace crosstalk\n */\nexports.default = crosstalk;\n\nglobal.crosstalk = crosstalk;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./filter\":2,\"./group\":4,\"./input\":6,\"./input_checkboxgroup\":7,\"./input_selectize\":8,\"./input_slider\":9,\"./selection\":10}],6:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.register = register;\nexports.bind = bind;\nvar $ = global.jQuery;\n\nvar bindings = {};\n\nfunction register(reg) {\n  bindings[reg.className] = reg;\n  if (global.document && global.document.readyState !== \"complete\") {\n    $(function () {\n      bind();\n    });\n  } else if (global.document) {\n    setTimeout(bind, 100);\n  }\n}\n\nfunction bind() {\n  Object.keys(bindings).forEach(function (className) {\n    var binding = bindings[className];\n    $(\".\" + binding.className).not(\".crosstalk-input-bound\").each(function (i, el) {\n      bindInstance(binding, el);\n    });\n  });\n}\n\n// Escape jQuery identifier\nfunction $escape(val) {\n  return val.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n}\n\nfunction bindEl(el) {\n  var $el = $(el);\n  Object.keys(bindings).forEach(function (className) {\n    if ($el.hasClass(className) && !$el.hasClass(\"crosstalk-input-bound\")) {\n      var binding = bindings[className];\n      bindInstance(binding, el);\n    }\n  });\n}\n\nfunction bindInstance(binding, el) {\n  var jsonEl = $(el).find(\"script[type='application/json'][data-for='\" + $escape(el.id) + \"']\");\n  var data = JSON.parse(jsonEl[0].innerText);\n\n  var instance = binding.factory(el, data);\n  $(el).data(\"crosstalk-instance\", instance);\n  $(el).addClass(\"crosstalk-input-bound\");\n}\n\nif (global.Shiny) {\n  var inputBinding = new global.Shiny.InputBinding();\n  var _$ = global.jQuery;\n  _$.extend(inputBinding, {\n    find: function find(scope) {\n      return _$(scope).find(\".crosstalk-input\");\n    },\n    initialize: function initialize(el) {\n      if (!_$(el).hasClass(\"crosstalk-input-bound\")) {\n        bindEl(el);\n      }\n    },\n    getId: function getId(el) {\n      return el.id;\n    },\n    getValue: function getValue(el) {},\n    setValue: function setValue(el, value) {},\n    receiveMessage: function receiveMessage(el, data) {},\n    subscribe: function subscribe(el, callback) {\n      _$(el).data(\"crosstalk-instance\").resume();\n    },\n    unsubscribe: function unsubscribe(el) {\n      _$(el).data(\"crosstalk-instance\").suspend();\n    }\n  });\n  global.Shiny.inputBindings.register(inputBinding, \"crosstalk.inputBinding\");\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],7:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nvar _input = require(\"./input\");\n\nvar input = _interopRequireWildcard(_input);\n\nvar _filter = require(\"./filter\");\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar $ = global.jQuery;\n\ninput.register({\n  className: \"crosstalk-input-checkboxgroup\",\n\n  factory: function factory(el, data) {\n    /*\n     * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n     * group: \"ct-groupname\"\n     */\n    var ctHandle = new _filter.FilterHandle(data.group);\n\n    var lastKnownKeys = void 0;\n    var $el = $(el);\n    $el.on(\"change\", \"input[type='checkbox']\", function () {\n      var checked = $el.find(\"input[type='checkbox']:checked\");\n      if (checked.length === 0) {\n        lastKnownKeys = null;\n        ctHandle.clear();\n      } else {\n        var keys = {};\n        checked.each(function () {\n          data.map[this.value].forEach(function (key) {\n            keys[key] = true;\n          });\n        });\n        var keyArray = Object.keys(keys);\n        keyArray.sort();\n        lastKnownKeys = keyArray;\n        ctHandle.set(keyArray);\n      }\n    });\n\n    return {\n      suspend: function suspend() {\n        ctHandle.clear();\n      },\n      resume: function resume() {\n        if (lastKnownKeys) ctHandle.set(lastKnownKeys);\n      }\n    };\n  }\n});\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./filter\":2,\"./input\":6}],8:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nvar _input = require(\"./input\");\n\nvar input = _interopRequireWildcard(_input);\n\nvar _util = require(\"./util\");\n\nvar util = _interopRequireWildcard(_util);\n\nvar _filter = require(\"./filter\");\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar $ = global.jQuery;\n\ninput.register({\n  className: \"crosstalk-input-select\",\n\n  factory: function factory(el, data) {\n    /*\n     * items: {value: [...], label: [...]}\n     * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n     * group: \"ct-groupname\"\n     */\n\n    var first = [{ value: \"\", label: \"(All)\" }];\n    var items = util.dataframeToD3(data.items);\n    var opts = {\n      options: first.concat(items),\n      valueField: \"value\",\n      labelField: \"label\",\n      searchField: \"label\"\n    };\n\n    var select = $(el).find(\"select\")[0];\n\n    var selectize = $(select).selectize(opts)[0].selectize;\n\n    var ctHandle = new _filter.FilterHandle(data.group);\n\n    var lastKnownKeys = void 0;\n    selectize.on(\"change\", function () {\n      if (selectize.items.length === 0) {\n        lastKnownKeys = null;\n        ctHandle.clear();\n      } else {\n        var keys = {};\n        selectize.items.forEach(function (group) {\n          data.map[group].forEach(function (key) {\n            keys[key] = true;\n          });\n        });\n        var keyArray = Object.keys(keys);\n        keyArray.sort();\n        lastKnownKeys = keyArray;\n        ctHandle.set(keyArray);\n      }\n    });\n\n    return {\n      suspend: function suspend() {\n        ctHandle.clear();\n      },\n      resume: function resume() {\n        if (lastKnownKeys) ctHandle.set(lastKnownKeys);\n      }\n    };\n  }\n});\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./filter\":2,\"./input\":6,\"./util\":11}],9:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _input = require(\"./input\");\n\nvar input = _interopRequireWildcard(_input);\n\nvar _filter = require(\"./filter\");\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nvar $ = global.jQuery;\nvar strftime = global.strftime;\n\ninput.register({\n  className: \"crosstalk-input-slider\",\n\n  factory: function factory(el, data) {\n    /*\n     * map: {\"groupA\": [\"keyA\", \"keyB\", ...], ...}\n     * group: \"ct-groupname\"\n     */\n    var ctHandle = new _filter.FilterHandle(data.group);\n\n    var opts = {};\n    var $el = $(el).find(\"input\");\n    var dataType = $el.data(\"data-type\");\n    var timeFormat = $el.data(\"time-format\");\n    var round = $el.data(\"round\");\n    var timeFormatter = void 0;\n\n    // Set up formatting functions\n    if (dataType === \"date\") {\n      timeFormatter = strftime.utc();\n      opts.prettify = function (num) {\n        return timeFormatter(timeFormat, new Date(num));\n      };\n    } else if (dataType === \"datetime\") {\n      var timezone = $el.data(\"timezone\");\n      if (timezone) timeFormatter = strftime.timezone(timezone);else timeFormatter = strftime;\n\n      opts.prettify = function (num) {\n        return timeFormatter(timeFormat, new Date(num));\n      };\n    } else if (dataType === \"number\") {\n      if (typeof round !== \"undefined\") opts.prettify = function (num) {\n        var factor = Math.pow(10, round);\n        return Math.round(num * factor) / factor;\n      };\n    }\n\n    $el.ionRangeSlider(opts);\n\n    function getValue() {\n      var result = $el.data(\"ionRangeSlider\").result;\n\n      // Function for converting numeric value from slider to appropriate type.\n      var convert = void 0;\n      var dataType = $el.data(\"data-type\");\n      if (dataType === \"date\") {\n        convert = function convert(val) {\n          return formatDateUTC(new Date(+val));\n        };\n      } else if (dataType === \"datetime\") {\n        convert = function convert(val) {\n          // Convert ms to s\n          return +val / 1000;\n        };\n      } else {\n        convert = function convert(val) {\n          return +val;\n        };\n      }\n\n      if ($el.data(\"ionRangeSlider\").options.type === \"double\") {\n        return [convert(result.from), convert(result.to)];\n      } else {\n        return convert(result.from);\n      }\n    }\n\n    var lastKnownKeys = null;\n\n    $el.on(\"change.crosstalkSliderInput\", function (event) {\n      if (!$el.data(\"updating\") && !$el.data(\"animating\")) {\n        var _getValue = getValue(),\n            _getValue2 = _slicedToArray(_getValue, 2),\n            from = _getValue2[0],\n            to = _getValue2[1];\n\n        var keys = [];\n        for (var i = 0; i < data.values.length; i++) {\n          var val = data.values[i];\n          if (val >= from && val <= to) {\n            keys.push(data.keys[i]);\n          }\n        }\n        keys.sort();\n        ctHandle.set(keys);\n        lastKnownKeys = keys;\n      }\n    });\n\n    // let $el = $(el);\n    // $el.on(\"change\", \"input[type=\"checkbox\"]\", function() {\n    //   let checked = $el.find(\"input[type=\"checkbox\"]:checked\");\n    //   if (checked.length === 0) {\n    //     ctHandle.clear();\n    //   } else {\n    //     let keys = {};\n    //     checked.each(function() {\n    //       data.map[this.value].forEach(function(key) {\n    //         keys[key] = true;\n    //       });\n    //     });\n    //     let keyArray = Object.keys(keys);\n    //     keyArray.sort();\n    //     ctHandle.set(keyArray);\n    //   }\n    // });\n\n    return {\n      suspend: function suspend() {\n        ctHandle.clear();\n      },\n      resume: function resume() {\n        if (lastKnownKeys) ctHandle.set(lastKnownKeys);\n      }\n    };\n  }\n});\n\n// Convert a number to a string with leading zeros\nfunction padZeros(n, digits) {\n  var str = n.toString();\n  while (str.length < digits) {\n    str = \"0\" + str;\n  }return str;\n}\n\n// Given a Date object, return a string in yyyy-mm-dd format, using the\n// UTC date. This may be a day off from the date in the local time zone.\nfunction formatDateUTC(date) {\n  if (date instanceof Date) {\n    return date.getUTCFullYear() + \"-\" + padZeros(date.getUTCMonth() + 1, 2) + \"-\" + padZeros(date.getUTCDate(), 2);\n  } else {\n    return null;\n  }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./filter\":2,\"./input\":6}],10:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.SelectionHandle = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _events = require(\"./events\");\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _group = require(\"./group\");\n\nvar _group2 = _interopRequireDefault(_group);\n\nvar _util = require(\"./util\");\n\nvar util = _interopRequireWildcard(_util);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Use this class to read and write (and listen for changes to) the selection\n * for a Crosstalk group. This is intended to be used for linked brushing.\n *\n * If two (or more) `SelectionHandle` instances in the same webpage share the\n * same group name, they will share the same state. Setting the selection using\n * one `SelectionHandle` instance will result in the `value` property instantly\n * changing across the others, and `\"change\"` event listeners on all instances\n * (including the one that initiated the sending) will fire.\n *\n * @param {string} [group] - The name of the Crosstalk group, or if none,\n *   null or undefined (or any other falsy value). This can be changed later\n *   via the [SelectionHandle#setGroup](#setGroup) method.\n * @param {Object} [extraInfo] - An object whose properties will be copied to\n *   the event object whenever an event is emitted.\n */\nvar SelectionHandle = exports.SelectionHandle = function () {\n  function SelectionHandle() {\n    var group = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n    var extraInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n    _classCallCheck(this, SelectionHandle);\n\n    this._eventRelay = new _events2.default();\n    this._emitter = new util.SubscriptionTracker(this._eventRelay);\n\n    // Name of the group we're currently tracking, if any. Can change over time.\n    this._group = null;\n    // The Var we're currently tracking, if any. Can change over time.\n    this._var = null;\n    // The event handler subscription we currently have on var.on(\"change\").\n    this._varOnChangeSub = null;\n\n    this._extraInfo = util.extend({ sender: this }, extraInfo);\n\n    this.setGroup(group);\n  }\n\n  /**\n   * Changes the Crosstalk group membership of this SelectionHandle. The group\n   * being switched away from (if any) will not have its selection value\n   * modified as a result of calling `setGroup`, even if this handle was the\n   * most recent handle to set the selection of the group.\n   *\n   * The group being switched to (if any) will also not have its selection value\n   * modified as a result of calling `setGroup`. If you want to set the\n   * selection value of the new group, call `set` explicitly.\n   *\n   * @param {string} group - The name of the Crosstalk group, or null (or\n   *   undefined) to clear the group.\n   */\n\n\n  _createClass(SelectionHandle, [{\n    key: \"setGroup\",\n    value: function setGroup(group) {\n      var _this = this;\n\n      // If group is unchanged, do nothing\n      if (this._group === group) return;\n      // Treat null, undefined, and other falsy values the same\n      if (!this._group && !group) return;\n\n      if (this._var) {\n        this._var.off(\"change\", this._varOnChangeSub);\n        this._var = null;\n        this._varOnChangeSub = null;\n      }\n\n      this._group = group;\n\n      if (group) {\n        this._var = (0, _group2.default)(group).var(\"selection\");\n        var sub = this._var.on(\"change\", function (e) {\n          _this._eventRelay.trigger(\"change\", e, _this);\n        });\n        this._varOnChangeSub = sub;\n      }\n    }\n\n    /**\n     * Retrieves the current selection for the group represented by this\n     * `SelectionHandle`.\n     *\n     * - If no selection is active, then this value will be falsy.\n     * - If a selection is active, but no data points are selected, then this\n     *   value will be an empty array.\n     * - If a selection is active, and data points are selected, then the keys\n     *   of the selected data points will be present in the array.\n     */\n\n  }, {\n    key: \"_mergeExtraInfo\",\n\n\n    /**\n     * Combines the given `extraInfo` (if any) with the handle's default\n     * `_extraInfo` (if any).\n     * @private\n     */\n    value: function _mergeExtraInfo(extraInfo) {\n      // Important incidental effect: shallow clone is returned\n      return util.extend({}, this._extraInfo ? this._extraInfo : null, extraInfo ? extraInfo : null);\n    }\n\n    /**\n     * Overwrites the current selection for the group, and raises the `\"change\"`\n     * event among all of the group's '`SelectionHandle` instances (including\n     * this one).\n     *\n     * @fires SelectionHandle#change\n     * @param {string[]} selectedKeys - Falsy, empty array, or array of keys (see\n     *   {@link SelectionHandle#value}).\n     * @param {Object} [extraInfo] - Extra properties to be included on the event\n     *   object that's passed to listeners (in addition to any options that were\n     *   passed into the `SelectionHandle` constructor).\n     */\n\n  }, {\n    key: \"set\",\n    value: function set(selectedKeys, extraInfo) {\n      if (this._var) this._var.set(selectedKeys, this._mergeExtraInfo(extraInfo));\n    }\n\n    /**\n     * Overwrites the current selection for the group, and raises the `\"change\"`\n     * event among all of the group's '`SelectionHandle` instances (including\n     * this one).\n     *\n     * @fires SelectionHandle#change\n     * @param {Object} [extraInfo] - Extra properties to be included on the event\n     *   object that's passed to listeners (in addition to any that were passed\n     *   into the `SelectionHandle` constructor).\n     */\n\n  }, {\n    key: \"clear\",\n    value: function clear(extraInfo) {\n      if (this._var) this.set(void 0, this._mergeExtraInfo(extraInfo));\n    }\n\n    /**\n     * Subscribes to events on this `SelectionHandle`.\n     *\n     * @param {string} eventType - Indicates the type of events to listen to.\n     *   Currently, only `\"change\"` is supported.\n     * @param {SelectionHandle~listener} listener - The callback function that\n     *   will be invoked when the event occurs.\n     * @return {string} - A token to pass to {@link SelectionHandle#off} to cancel\n     *   this subscription.\n     */\n\n  }, {\n    key: \"on\",\n    value: function on(eventType, listener) {\n      return this._emitter.on(eventType, listener);\n    }\n\n    /**\n     * Cancels event subscriptions created by {@link SelectionHandle#on}.\n     *\n     * @param {string} eventType - The type of event to unsubscribe.\n     * @param {string|SelectionHandle~listener} listener - Either the callback\n     *   function previously passed into {@link SelectionHandle#on}, or the\n     *   string that was returned from {@link SelectionHandle#on}.\n     */\n\n  }, {\n    key: \"off\",\n    value: function off(eventType, listener) {\n      return this._emitter.off(eventType, listener);\n    }\n\n    /**\n     * Shuts down the `SelectionHandle` object.\n     *\n     * Removes all event listeners that were added through this handle.\n     */\n\n  }, {\n    key: \"close\",\n    value: function close() {\n      this._emitter.removeAllListeners();\n      this.setGroup(null);\n    }\n  }, {\n    key: \"value\",\n    get: function get() {\n      return this._var ? this._var.get() : null;\n    }\n  }]);\n\n  return SelectionHandle;\n}();\n\n/**\n * @callback SelectionHandle~listener\n * @param {Object} event - An object containing details of the event. For\n *   `\"change\"` events, this includes the properties `value` (the new\n *   value of the selection, or `undefined` if no selection is active),\n *   `oldValue` (the previous value of the selection), and `sender` (the\n *   `SelectionHandle` instance that made the change).\n */\n\n/**\n * @event SelectionHandle#change\n * @type {object}\n * @property {object} value - The new value of the selection, or `undefined`\n *   if no selection is active.\n * @property {object} oldValue - The previous value of the selection.\n * @property {SelectionHandle} sender - The `SelectionHandle` instance that\n *   changed the value.\n */\n\n},{\"./events\":1,\"./group\":4,\"./util\":11}],11:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nexports.extend = extend;\nexports.checkSorted = checkSorted;\nexports.diffSortedLists = diffSortedLists;\nexports.dataframeToD3 = dataframeToD3;\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction extend(target) {\n  for (var _len = arguments.length, sources = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    sources[_key - 1] = arguments[_key];\n  }\n\n  for (var i = 0; i < sources.length; i++) {\n    var src = sources[i];\n    if (typeof src === \"undefined\" || src === null) continue;\n\n    for (var key in src) {\n      if (src.hasOwnProperty(key)) {\n        target[key] = src[key];\n      }\n    }\n  }\n  return target;\n}\n\nfunction checkSorted(list) {\n  for (var i = 1; i < list.length; i++) {\n    if (list[i] <= list[i - 1]) {\n      throw new Error(\"List is not sorted or contains duplicate\");\n    }\n  }\n}\n\nfunction diffSortedLists(a, b) {\n  var i_a = 0;\n  var i_b = 0;\n\n  if (!a) a = [];\n  if (!b) b = [];\n\n  var a_only = [];\n  var b_only = [];\n\n  checkSorted(a);\n  checkSorted(b);\n\n  while (i_a < a.length && i_b < b.length) {\n    if (a[i_a] === b[i_b]) {\n      i_a++;\n      i_b++;\n    } else if (a[i_a] < b[i_b]) {\n      a_only.push(a[i_a++]);\n    } else {\n      b_only.push(b[i_b++]);\n    }\n  }\n\n  if (i_a < a.length) a_only = a_only.concat(a.slice(i_a));\n  if (i_b < b.length) b_only = b_only.concat(b.slice(i_b));\n  return {\n    removed: a_only,\n    added: b_only\n  };\n}\n\n// Convert from wide: { colA: [1,2,3], colB: [4,5,6], ... }\n// to long: [ {colA: 1, colB: 4}, {colA: 2, colB: 5}, ... ]\nfunction dataframeToD3(df) {\n  var names = [];\n  var length = void 0;\n  for (var name in df) {\n    if (df.hasOwnProperty(name)) names.push(name);\n    if (_typeof(df[name]) !== \"object\" || typeof df[name].length === \"undefined\") {\n      throw new Error(\"All fields must be arrays\");\n    } else if (typeof length !== \"undefined\" && length !== df[name].length) {\n      throw new Error(\"All fields must be arrays of the same length\");\n    }\n    length = df[name].length;\n  }\n  var results = [];\n  var item = void 0;\n  for (var row = 0; row < length; row++) {\n    item = {};\n    for (var col = 0; col < names.length; col++) {\n      item[names[col]] = df[names[col]][row];\n    }\n    results.push(item);\n  }\n  return results;\n}\n\n/**\n * Keeps track of all event listener additions/removals and lets all active\n * listeners be removed with a single operation.\n *\n * @private\n */\n\nvar SubscriptionTracker = exports.SubscriptionTracker = function () {\n  function SubscriptionTracker(emitter) {\n    _classCallCheck(this, SubscriptionTracker);\n\n    this._emitter = emitter;\n    this._subs = {};\n  }\n\n  _createClass(SubscriptionTracker, [{\n    key: \"on\",\n    value: function on(eventType, listener) {\n      var sub = this._emitter.on(eventType, listener);\n      this._subs[sub] = eventType;\n      return sub;\n    }\n  }, {\n    key: \"off\",\n    value: function off(eventType, listener) {\n      var sub = this._emitter.off(eventType, listener);\n      if (sub) {\n        delete this._subs[sub];\n      }\n      return sub;\n    }\n  }, {\n    key: \"removeAllListeners\",\n    value: function removeAllListeners() {\n      var _this = this;\n\n      var current_subs = this._subs;\n      this._subs = {};\n      Object.keys(current_subs).forEach(function (sub) {\n        _this._emitter.off(current_subs[sub], sub);\n      });\n    }\n  }]);\n\n  return SubscriptionTracker;\n}();\n\n},{}],12:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _events = require(\"./events\");\n\nvar _events2 = _interopRequireDefault(_events);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Var = function () {\n  function Var(group, name, /*optional*/value) {\n    _classCallCheck(this, Var);\n\n    this._group = group;\n    this._name = name;\n    this._value = value;\n    this._events = new _events2.default();\n  }\n\n  _createClass(Var, [{\n    key: \"get\",\n    value: function get() {\n      return this._value;\n    }\n  }, {\n    key: \"set\",\n    value: function set(value, /*optional*/event) {\n      if (this._value === value) {\n        // Do nothing; the value hasn't changed\n        return;\n      }\n      var oldValue = this._value;\n      this._value = value;\n      // Alert JavaScript listeners that the value has changed\n      var evt = {};\n      if (event && (typeof event === \"undefined\" ? \"undefined\" : _typeof(event)) === \"object\") {\n        for (var k in event) {\n          if (event.hasOwnProperty(k)) evt[k] = event[k];\n        }\n      }\n      evt.oldValue = oldValue;\n      evt.value = value;\n      this._events.trigger(\"change\", evt, this);\n\n      // TODO: Make this extensible, to let arbitrary back-ends know that\n      // something has changed\n      if (global.Shiny && global.Shiny.onInputChange) {\n        global.Shiny.onInputChange(\".clientValue-\" + (this._group.name !== null ? this._group.name + \"-\" : \"\") + this._name, typeof value === \"undefined\" ? null : value);\n      }\n    }\n  }, {\n    key: \"on\",\n    value: function on(eventType, listener) {\n      return this._events.on(eventType, listener);\n    }\n  }, {\n    key: \"off\",\n    value: function off(eventType, listener) {\n      return this._events.off(eventType, listener);\n    }\n  }]);\n\n  return Var;\n}();\n\nexports.default = Var;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{\"./events\":1}]},{},[5])\n//# sourceMappingURL=crosstalk.js.map\n"
  },
  {
    "path": "vignettes/tutorials/libs/datatables-binding/datatables.js",
    "content": "(function() {\n\n// some helper functions: using a global object DTWidget so that it can be used\n// in JS() code, e.g. datatable(options = list(foo = JS('code'))); unlike R's\n// dynamic scoping, when 'code' is eval()'ed, JavaScript does not know objects\n// from the \"parent frame\", e.g. JS('DTWidget') will not work unless it was made\n// a global object\nvar DTWidget = {};\n\n// 123456666.7890 -> 123,456,666.7890\nvar markInterval = function(d, digits, interval, mark, decMark, precision) {\n  x = precision ? d.toPrecision(digits) : d.toFixed(digits);\n  if (!/^-?[\\d.]+$/.test(x)) return x;\n  var xv = x.split('.');\n  if (xv.length > 2) return x;  // should have at most one decimal point\n  xv[0] = xv[0].replace(new RegExp('\\\\B(?=(\\\\d{' + interval + '})+(?!\\\\d))', 'g'), mark);\n  return xv.join(decMark);\n};\n\nDTWidget.formatCurrency = function(data, currency, digits, interval, mark, decMark, before) {\n  var d = parseFloat(data);\n  if (isNaN(d)) return '';\n  var res = markInterval(d, digits, interval, mark, decMark);\n  res = before ? (/^-/.test(res) ? '-' + currency + res.replace(/^-/, '') : currency + res) :\n    res + currency;\n  return res;\n};\n\nDTWidget.formatString = function(data, prefix, suffix) {\n  var d = data;\n  if (d === null) return '';\n  return prefix + d + suffix;\n};\n\nDTWidget.formatPercentage = function(data, digits, interval, mark, decMark) {\n  var d = parseFloat(data);\n  if (isNaN(d)) return '';\n  return markInterval(d * 100, digits, interval, mark, decMark) + '%';\n};\n\nDTWidget.formatRound = function(data, digits, interval, mark, decMark) {\n  var d = parseFloat(data);\n  if (isNaN(d)) return '';\n  return markInterval(d, digits, interval, mark, decMark);\n};\n\nDTWidget.formatSignif = function(data, digits, interval, mark, decMark) {\n  var d = parseFloat(data);\n  if (isNaN(d)) return '';\n  return markInterval(d, digits, interval, mark, decMark, true);\n};\n\nDTWidget.formatDate = function(data, method, params) {\n  var d = data;\n  if (d === null) return '';\n  // (new Date('2015-10-28')).toDateString() may return 2015-10-27 because the\n  // actual time created could be like 'Tue Oct 27 2015 19:00:00 GMT-0500 (CDT)',\n  // i.e. the date-only string is treated as UTC time instead of local time\n  if ((method === 'toDateString' || method === 'toLocaleDateString') && /^\\d{4,}\\D\\d{2}\\D\\d{2}$/.test(d)) {\n    d = d.split(/\\D/);\n    d = new Date(d[0], d[1] - 1, d[2]);\n  } else {\n    d = new Date(d);\n  }\n  return d[method].apply(d, params);\n};\n\nwindow.DTWidget = DTWidget;\n\nvar transposeArray2D = function(a) {\n  return a.length === 0 ? a : HTMLWidgets.transposeArray2D(a);\n};\n\nvar crosstalkPluginsInstalled = false;\n\nfunction maybeInstallCrosstalkPlugins() {\n  if (crosstalkPluginsInstalled)\n    return;\n  crosstalkPluginsInstalled = true;\n\n  $.fn.dataTable.ext.afnFiltering.push(\n    function(oSettings, aData, iDataIndex) {\n      var ctfilter = oSettings.nTable.ctfilter;\n      if (ctfilter && !ctfilter[iDataIndex])\n        return false;\n\n      var ctselect = oSettings.nTable.ctselect;\n      if (ctselect && !ctselect[iDataIndex])\n        return false;\n\n      return true;\n    }\n  );\n}\n\nHTMLWidgets.widget({\n  name: \"datatables\",\n  type: \"output\",\n  renderOnNullValue: true,\n  initialize: function(el, width, height) {\n    $(el).html('&nbsp;');\n    return {\n      data: null,\n      ctfilterHandle: new crosstalk.FilterHandle(),\n      ctfilterSubscription: null,\n      ctselectHandle: new crosstalk.SelectionHandle(),\n      ctselectSubscription: null\n    };\n  },\n  renderValue: function(el, data, instance) {\n    if (el.offsetWidth === 0 || el.offsetHeight === 0) {\n      instance.data = data;\n      return;\n    }\n    instance.data = null;\n    var $el = $(el);\n    $el.empty();\n\n    if (data === null) {\n      $el.append('&nbsp;');\n      // clear previous Shiny inputs (if any)\n      for (var i in instance.clearInputs) instance.clearInputs[i]();\n      instance.clearInputs = {};\n      return;\n    }\n\n    var crosstalkOptions = data.crosstalkOptions;\n    if (!crosstalkOptions) crosstalkOptions = {\n      'key': null, 'group': null\n    };\n    if (crosstalkOptions.group) {\n      maybeInstallCrosstalkPlugins();\n      instance.ctfilterHandle.setGroup(crosstalkOptions.group);\n      instance.ctselectHandle.setGroup(crosstalkOptions.group);\n    }\n\n    // If we are in a flexdashboard scroll layout then we:\n    //  (a) Always want to use pagination (otherwise we'll have\n    //      a \"double scroll bar\" effect on the phone); and\n    //  (b) Never want to fill the container (we want the pagination\n    //      level to determine the size of the container)\n    if (window.FlexDashboard && !window.FlexDashboard.isFillPage()) {\n      data.options.bPaginate = true;\n      data.fillContainer = false;\n    }\n\n    // if we are in the viewer then we always want to fillContainer and\n    // and autoHideNavigation (unless the user has explicitly set these)\n    if (window.HTMLWidgets.viewerMode) {\n      if (!data.hasOwnProperty(\"fillContainer\"))\n        data.fillContainer = true;\n      if (!data.hasOwnProperty(\"autoHideNavigation\"))\n        data.autoHideNavigation = true;\n    }\n\n    // propagate fillContainer to instance (so we have it in resize)\n    instance.fillContainer = data.fillContainer;\n\n    var cells = data.data;\n\n    if (cells instanceof Array) cells = transposeArray2D(cells);\n\n    $el.append(data.container);\n    var $table = $el.find('table');\n    if (data.class) $table.addClass(data.class);\n    if (data.caption) $table.prepend(data.caption);\n\n    if (!data.selection) data.selection = {\n      mode: 'none', selected: null, target: 'row'\n    };\n    if (HTMLWidgets.shinyMode && data.selection.mode !== 'none' &&\n        data.selection.target === 'row+column') {\n      if ($table.children('tfoot').length === 0) {\n        $table.append($('<tfoot>'));\n        $table.find('thead tr').clone().appendTo($table.find('tfoot'));\n      }\n    }\n\n    // column filters\n    var filterRow;\n    switch (data.filter) {\n      case 'top':\n        $table.children('thead').append(data.filterHTML);\n        filterRow = $table.find('thead tr:last td');\n        break;\n      case 'bottom':\n        if ($table.children('tfoot').length === 0) {\n          $table.append($('<tfoot>'));\n        }\n        $table.children('tfoot').prepend(data.filterHTML);\n        filterRow = $table.find('tfoot tr:first td');\n        break;\n    }\n\n    var options = { searchDelay: 1000 };\n    if (cells !== null) $.extend(options, {\n      data: cells\n    });\n\n    // options for fillContainer\n    var bootstrapActive = typeof($.fn.popover) != 'undefined';\n    if (instance.fillContainer) {\n\n      // force scrollX/scrollY and turn off autoWidth\n      options.scrollX = true;\n      options.scrollY = \"100px\"; // can be any value, we'll adjust below\n\n      // if we aren't paginating then move around the info/filter controls\n      // to save space at the bottom and rephrase the info callback\n      if (data.options.bPaginate === false) {\n\n        // we know how to do this cleanly for bootstrap, not so much\n        // for other themes/layouts\n        if (bootstrapActive) {\n          options.dom = \"<'row'<'col-sm-4'i><'col-sm-8'f>>\" +\n                        \"<'row'<'col-sm-12'tr>>\";\n        }\n\n        options.fnInfoCallback = function(oSettings, iStart, iEnd,\n                                           iMax, iTotal, sPre) {\n          return Number(iTotal).toLocaleString() + \" records\";\n        };\n      }\n    }\n\n    // auto hide navigation if requested\n    if (data.autoHideNavigation === true) {\n      if (bootstrapActive && data.options.bPaginate !== false) {\n        // strip all nav if length >= cells\n        if ((cells instanceof Array) && data.options.iDisplayLength >= cells.length)\n          options.dom = \"<'row'<'col-sm-12'tr>>\";\n        // alternatively lean things out for flexdashboard mobile portrait\n        else if (window.FlexDashboard && window.FlexDashboard.isMobilePhone())\n          options.dom = \"<'row'<'col-sm-12'f>>\" +\n                        \"<'row'<'col-sm-12'tr>>\"  +\n                        \"<'row'<'col-sm-12'p>>\";\n      }\n    }\n\n    $.extend(true, options, data.options || {});\n\n    var searchCols = options.searchCols;\n    if (searchCols) {\n      searchCols = searchCols.map(function(x) {\n        return x === null ? '' : x.search;\n      });\n      // FIXME: this means I don't respect the escapeRegex setting\n      delete options.searchCols;\n    }\n\n    // server-side processing?\n    var server = options.serverSide === true;\n\n    // use the dataSrc function to pre-process JSON data returned from R\n    var DT_rows_all = [], DT_rows_current = [];\n    if (server && HTMLWidgets.shinyMode && typeof options.ajax === 'object' &&\n        /^session\\/[\\da-z]+\\/dataobj/.test(options.ajax.url) && !options.ajax.dataSrc) {\n      options.ajax.dataSrc = function(json) {\n        DT_rows_all = $.makeArray(json.DT_rows_all);\n        DT_rows_current = $.makeArray(json.DT_rows_current);\n        var data = json.data;\n        if (!colReorderEnabled()) return data;\n        var table = $table.DataTable(), order = table.colReorder.order(), flag = true, i, j, row;\n        for (i = 0; i < order.length; ++i) if (order[i] !== i) flag = false;\n        if (flag) return data;\n        for (i = 0; i < data.length; ++i) {\n          row = data[i].slice();\n          for (j = 0; j < order.length; ++j) data[i][j] = row[order[j]];\n        }\n        return data;\n      };\n    }\n\n    var thiz = this;\n    if (instance.fillContainer) $table.on('init.dt', function(e) {\n      thiz.fillAvailableHeight(el, $(el).innerHeight());\n    });\n    // If the page contains serveral datatables and one of which enables colReorder,\n    // the table.colReorder.order() function will exist but throws error when called.\n    // So it seems like the only way to know if colReorder is enabled or not is to\n    // check the options.\n    var colReorderEnabled = function() { return \"colReorder\" in options; };\n    var table = $table.DataTable(options);\n    $el.data('datatable', table);\n\n    // Unregister previous Crosstalk event subscriptions, if they exist\n    if (instance.ctfilterSubscription) {\n      instance.ctfilterHandle.off(\"change\", instance.ctfilterSubscription);\n      instance.ctfilterSubscription = null;\n    }\n    if (instance.ctselectSubscription) {\n      instance.ctselectHandle.off(\"change\", instance.ctselectSubscription);\n      instance.ctselectSubscription = null;\n    }\n\n    if (!crosstalkOptions.group) {\n      $table[0].ctfilter = null;\n      $table[0].ctselect = null;\n    } else {\n      var key = crosstalkOptions.key;\n      function keysToMatches(keys) {\n        if (!keys) {\n          return null;\n        } else {\n          var selectedKeys = {};\n          for (var i = 0; i < keys.length; i++) {\n            selectedKeys[keys[i]] = true;\n          }\n          var matches = {};\n          for (var j = 0; j < key.length; j++) {\n            if (selectedKeys[key[j]])\n              matches[j] = true;\n          }\n          return matches;\n        }\n      }\n\n      function applyCrosstalkFilter(e) {\n        $table[0].ctfilter = keysToMatches(e.value);\n        table.draw();\n      }\n      instance.ctfilterSubscription = instance.ctfilterHandle.on(\"change\", applyCrosstalkFilter);\n      applyCrosstalkFilter({value: instance.ctfilterHandle.filteredKeys});\n\n      function applyCrosstalkSelection(e) {\n        if (e.sender !== instance.ctselectHandle) {\n          table\n            .rows('.' + selClass, {search: 'applied'})\n            .nodes()\n            .to$()\n            .removeClass(selClass);\n          if (selectedRows)\n            changeInput('rows_selected', selectedRows(), void 0, true);\n        }\n\n        if (e.sender !== instance.ctselectHandle && e.value && e.value.length) {\n          var matches = keysToMatches(e.value);\n\n          // persistent selection with plotly (& leaflet)\n          var ctOpts = crosstalk.var(\"plotlyCrosstalkOpts\").get() || {};\n          if (ctOpts.persistent === true) {\n            var matches = $.extend(matches, $table[0].ctselect);\n          }\n\n          $table[0].ctselect = matches;\n          table.draw();\n        } else {\n          if ($table[0].ctselect) {\n            $table[0].ctselect = null;\n            table.draw();\n          }\n        }\n      }\n      instance.ctselectSubscription = instance.ctselectHandle.on(\"change\", applyCrosstalkSelection);\n      // TODO: This next line doesn't seem to work when renderDataTable is used\n      applyCrosstalkSelection({value: instance.ctselectHandle.value});\n    }\n\n    var inArray = function(val, array) {\n      return $.inArray(val, $.makeArray(array)) > -1;\n    };\n\n    // encode + to %2B when searching in the table on server side, because\n    // shiny::parseQueryString() treats + as spaces, and DataTables does not\n    // encode + to %2B (or % to %25) when sending the request\n    var encode_plus = function(x) {\n      return server ? x.replace(/%/g, '%25').replace(/\\+/g, '%2B') : x;\n    };\n\n    // search the i-th column\n    var searchColumn = function(i, value) {\n      var regex = false, ci = true;\n      if (options.search) {\n        regex = options.search.regex,\n        ci = options.search.caseInsensitive !== false;\n      }\n      return table.column(i).search(encode_plus(value), regex, !regex, ci);\n    };\n\n    if (data.filter !== 'none') {\n\n      filterRow.each(function(i, td) {\n\n        var $td = $(td), type = $td.data('type'), filter;\n        var $input = $td.children('div').first().children('input');\n        $input.prop('disabled', !table.settings()[0].aoColumns[i].bSearchable || type === 'disabled');\n        $input.on('input blur', function() {\n          $input.next('span').toggle(Boolean($input.val()));\n        });\n        // Bootstrap sets pointer-events to none and we won't be able to click\n        // the clear button\n        $input.next('span').css('pointer-events', 'auto').hide().click(function() {\n          $(this).hide().prev('input').val('').trigger('input').focus();\n        });\n        var searchCol;  // search string for this column\n        if (searchCols && searchCols[i]) {\n          searchCol = searchCols[i];\n          $input.val(searchCol).trigger('input');\n        }\n        var $x = $td.children('div').last();\n\n        // remove the overflow: hidden attribute of the scrollHead\n        // (otherwise the scrolling table body obscures the filters)\n        // The workaround and the discussion from\n        // https://github.com/rstudio/DT/issues/554#issuecomment-518007347\n        // Otherwise the filter selection will not be anchored to the values\n        // when the columns number is many and scrollX is enabled.\n        var scrollHead = $(el).find('.dataTables_scrollHead,.dataTables_scrollFoot');\n        var cssOverflowHead = scrollHead.css('overflow');\n        var scrollBody = $(el).find('.dataTables_scrollBody');\n        var cssOverflowBody = scrollBody.css('overflow');\n        var scrollTable = $(el).find('.dataTables_scroll');\n        var cssOverflowTable = scrollTable.css('overflow');\n        if (cssOverflowHead === 'hidden') {\n          $x.on('show hide', function(e) {\n            if (e.type === 'show') {\n              scrollHead.css('overflow', 'visible');\n              scrollBody.css('overflow', 'visible');\n              scrollTable.css('overflow-x', 'scroll');\n            } else {\n              scrollHead.css('overflow', cssOverflowHead);\n              scrollBody.css('overflow', cssOverflowBody);\n              scrollTable.css('overflow-x', cssOverflowTable);\n            }\n          });\n          $x.css('z-index', 25);\n        }\n\n        if (inArray(type, ['factor', 'logical'])) {\n          $input.on({\n            click: function() {\n              $input.parent().hide(); $x.show().trigger('show'); filter[0].selectize.focus();\n            },\n            input: function() {\n              if ($input.val() === '') filter[0].selectize.setValue([]);\n            }\n          });\n          var $input2 = $x.children('select');\n          filter = $input2.selectize({\n            options: $input2.data('options').map(function(v, i) {\n              return ({text: v, value: v});\n            }),\n            plugins: ['remove_button'],\n            hideSelected: true,\n            onChange: function(value) {\n              if (value === null) value = []; // compatibility with jQuery 3.0\n              $input.val(value.length ? JSON.stringify(value) : '');\n              if (value.length) $input.trigger('input');\n              $input.attr('title', $input.val());\n              if (server) {\n                table.column(i).search(value.length ? encode_plus(JSON.stringify(value)) : '').draw();\n                return;\n              }\n              // turn off filter if nothing selected\n              $td.data('filter', value.length > 0);\n              table.draw();  // redraw table, and filters will be applied\n            }\n          });\n          if (searchCol) filter[0].selectize.setValue(JSON.parse(searchCol));\n          filter[0].selectize.on('blur', function() {\n            $x.hide().trigger('hide'); $input.parent().show(); $input.trigger('blur');\n          });\n          filter.next('div').css('margin-bottom', 'auto');\n        } else if (type === 'character') {\n          var fun = function() {\n            searchColumn(i, $input.val()).draw();\n          };\n          if (server) {\n            fun = $.fn.dataTable.util.throttle(fun, options.searchDelay);\n          }\n          $input.on('input', fun);\n        } else if (inArray(type, ['number', 'integer', 'date', 'time'])) {\n          var $x0 = $x;\n          $x = $x0.children('div').first();\n          $x0.css({\n            'background-color': '#fff',\n            'border': '1px #ddd solid',\n            'border-radius': '4px',\n            'padding': '20px 20px 10px 20px'\n          });\n          var $spans = $x0.children('span').css({\n            'margin-top': '10px',\n            'white-space': 'nowrap'\n          });\n          var $span1 = $spans.first(), $span2 = $spans.last();\n          var r1 = +$x.data('min'), r2 = +$x.data('max');\n          // when the numbers are too small or have many decimal places, the\n          // slider may have numeric precision problems (#150)\n          var scale = Math.pow(10, Math.max(0, +$x.data('scale') || 0));\n          r1 = Math.round(r1 * scale); r2 = Math.round(r2 * scale);\n          var scaleBack = function(x, scale) {\n            if (scale === 1) return x;\n            var d = Math.round(Math.log(scale) / Math.log(10));\n            // to avoid problems like 3.423/100 -> 0.034230000000000003\n            return (x / scale).toFixed(d);\n          };\n          $input.on({\n            focus: function() {\n              $x0.show().trigger('show');\n              // first, make sure the slider div leaves at least 20px between\n              // the two (slider value) span's\n              $x0.width(Math.max(160, $span1.outerWidth() + $span2.outerWidth() + 20));\n              // then, if the input is really wide, make the slider the same\n              // width as the input\n              if ($x0.outerWidth() < $input.outerWidth()) {\n                $x0.outerWidth($input.outerWidth());\n              }\n              // make sure the slider div does not reach beyond the right margin\n              if ($(window).width() < $x0.offset().left + $x0.width()) {\n                $x0.offset({\n                  'left': $input.offset().left + $input.outerWidth() - $x0.outerWidth()\n                });\n              }\n            },\n            blur: function() {\n              $x0.hide().trigger('hide');\n            },\n            input: function() {\n              if ($input.val() === '') filter.val([r1, r2]);\n            },\n            change: function() {\n              var v = $input.val().replace(/\\s/g, '');\n              if (v === '') return;\n              v = v.split('...');\n              if (v.length !== 2) {\n                $input.parent().addClass('has-error');\n                return;\n              }\n              if (v[0] === '') v[0] = r1;\n              if (v[1] === '') v[1] = r2;\n              $input.parent().removeClass('has-error');\n              // treat date as UTC time at midnight\n              var strTime = function(x) {\n                var s = type === 'date' ? 'T00:00:00Z' : '';\n                var t = new Date(x + s).getTime();\n                // add 10 minutes to date since it does not hurt the date, and\n                // it helps avoid the tricky floating point arithmetic problems,\n                // e.g. sometimes the date may be a few milliseconds earlier\n                // than the midnight due to precision problems in noUiSlider\n                return type === 'date' ? t + 3600000 : t;\n              };\n              if (inArray(type, ['date', 'time'])) {\n                v[0] = strTime(v[0]);\n                v[1] = strTime(v[1]);\n              }\n              if (v[0] != r1) v[0] *= scale;\n              if (v[1] != r2) v[1] *= scale;\n              filter.val(v);\n            }\n          });\n          var formatDate = function(d, isoFmt) {\n            d = scaleBack(d, scale);\n            if (type === 'number') return d;\n            if (type === 'integer') return parseInt(d);\n            var x = new Date(+d);\n            var fmt = ('filterDateFmt' in data) ? data.filterDateFmt[i] : undefined;\n            if (fmt !== undefined && isoFmt === false) return x[fmt.method].apply(x, fmt.params);\n            if (type === 'date') {\n              var pad0 = function(x) {\n                return ('0' + x).substr(-2, 2);\n              };\n              return x.getUTCFullYear() + '-' + pad0(1 + x.getUTCMonth())\n                      + '-' + pad0(x.getUTCDate());\n            } else {\n              return x.toISOString();\n            }\n          };\n          var opts = type === 'date' ? { step: 60 * 60 * 1000 } :\n                     type === 'integer' ? { step: 1 } : {};\n          filter = $x.noUiSlider($.extend({\n            start: [r1, r2],\n            range: {min: r1, max: r2},\n            connect: true\n          }, opts));\n          if (scale > 1) (function() {\n            var t1 = r1, t2 = r2;\n            var val = filter.val();\n            while (val[0] > r1 || val[1] < r2) {\n              if (val[0] > r1) {\n                t1 -= val[0] - r1;\n              }\n              if (val[1] < r2) {\n                t2 += r2 - val[1];\n              }\n              filter = $x.noUiSlider($.extend({\n                start: [t1, t2],\n                range: {min: t1, max: t2},\n                connect: true\n              }, opts), true);\n              val = filter.val();\n            }\n            r1  = t1; r2 = t2;\n          })();\n          var updateSliderText = function(v1, v2) {\n            $span1.text(formatDate(v1, false)); $span2.text(formatDate(v2, false));\n          };\n          updateSliderText(r1, r2);\n          var updateSlider = function(e) {\n            var val = filter.val();\n            // turn off filter if in full range\n            $td.data('filter', val[0] > r1 || val[1] < r2);\n            var v1 = formatDate(val[0]), v2 = formatDate(val[1]), ival;\n            if ($td.data('filter')) {\n              ival = v1 + ' ... ' + v2;\n              $input.attr('title', ival).val(ival).trigger('input');\n            } else {\n              $input.attr('title', '').val('');\n            }\n            updateSliderText(val[0], val[1]);\n            if (e.type === 'slide') return;  // no searching when sliding only\n            if (server) {\n              table.column(i).search($td.data('filter') ? ival : '').draw();\n              return;\n            }\n            table.draw();\n          };\n          filter.on({\n            set: updateSlider,\n            slide: updateSlider\n          });\n        }\n\n        // server-side processing will be handled by R (or whatever server\n        // language you use); the following code is only needed for client-side\n        // processing\n        if (server) {\n          // if a search string has been pre-set, search now\n          if (searchCol) searchColumn(i, searchCol).draw();\n          return;\n        }\n\n        var customFilter = function(settings, data, dataIndex) {\n          // there is no way to attach a search function to a specific table,\n          // and we need to make sure a global search function is not applied to\n          // all tables (i.e. a range filter in a previous table should not be\n          // applied to the current table); we use the settings object to\n          // determine if we want to perform searching on the current table,\n          // since settings.sTableId will be different to different tables\n          if (table.settings()[0] !== settings) return true;\n          // no filter on this column or no need to filter this column\n          if (typeof filter === 'undefined' || !$td.data('filter')) return true;\n\n          var r = filter.val(), v, r0, r1;\n          var i_data = function(i) {\n            if (!colReorderEnabled()) return i;\n            var order = table.colReorder.order(), k;\n            for (k = 0; k < order.length; ++k) if (order[k] === i) return k;\n            return i; // in theory it will never be here...\n          }\n          v = data[i_data(i)];\n          if (type === 'number' || type === 'integer') {\n            v = parseFloat(v);\n            // how to handle NaN? currently exclude these rows\n            if (isNaN(v)) return(false);\n            r0 = parseFloat(scaleBack(r[0], scale))\n            r1 = parseFloat(scaleBack(r[1], scale));\n            if (v >= r0 && v <= r1) return true;\n          } else if (type === 'date' || type === 'time') {\n            v = new Date(v);\n            r0 = new Date(r[0] / scale); r1 = new Date(r[1] / scale);\n            if (v >= r0 && v <= r1) return true;\n          } else if (type === 'factor') {\n            if (r.length === 0 || inArray(v, r)) return true;\n          } else if (type === 'logical') {\n            if (r.length === 0) return true;\n            if (inArray(v === '' ? 'na' : v, r)) return true;\n          }\n          return false;\n        };\n\n        $.fn.dataTable.ext.search.push(customFilter);\n\n        // search for the preset search strings if it is non-empty\n        if (searchCol) {\n          if (inArray(type, ['factor', 'logical'])) {\n            filter[0].selectize.setValue(JSON.parse(searchCol));\n          } else if (type === 'character') {\n            $input.trigger('input');\n          } else if (inArray(type, ['number', 'integer', 'date', 'time'])) {\n            $input.trigger('change');\n          }\n        }\n\n      });\n\n    }\n\n    // highlight search keywords\n    var highlight = function() {\n      var body = $(table.table().body());\n      // removing the old highlighting first\n      body.unhighlight();\n\n      // don't highlight the \"not found\" row, so we get the rows using the api\n      if (table.rows({ filter: 'applied' }).data().length === 0) return;\n      // highlight global search keywords\n      body.highlight($.trim(table.search()).split(/\\s+/));\n      // then highlight keywords from individual column filters\n      if (filterRow) filterRow.each(function(i, td) {\n        var $td = $(td), type = $td.data('type');\n        if (type !== 'character') return;\n        var $input = $td.children('div').first().children('input');\n        var column = table.column(i).nodes().to$(),\n            val = $.trim($input.val());\n        if (type !== 'character' || val === '') return;\n        column.highlight(val.split(/\\s+/));\n      });\n    };\n\n    if (options.searchHighlight) {\n      table\n      .on('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth', highlight)\n      .on('destroy', function() {\n        // remove event handler\n        table.off('draw.dt.dth column-visibility.dt.dth column-reorder.dt.dth');\n      });\n\n      // Set the option for escaping regex characters in our search string.  This will be used\n      // for all future matching.\n      jQuery.fn.highlight.options.escapeRegex = (!options.search || !options.search.regex);\n\n      // initial highlight for state saved conditions and initial states\n      highlight();\n    }\n\n    // run the callback function on the table instance\n    if (typeof data.callback === 'function') data.callback(table);\n\n    // double click to edit the cell, row, column, or all cells\n    if (data.editable) table.on('dblclick.dt', 'tbody td', function(e) {\n      // only bring up the editor when the cell itself is dbclicked, and ignore\n      // other dbclick events bubbled up (e.g. from the <input>)\n      if (e.target !== this) return;\n      var target = [], immediate = false;\n      switch (data.editable.target) {\n        case 'cell':\n          target = [this];\n          immediate = true;  // edit will take effect immediately\n          break;\n        case 'row':\n          target = table.cells(table.cell(this).index().row, '*').nodes();\n          break;\n        case 'column':\n          target = table.cells('*', table.cell(this).index().column).nodes();\n          break;\n        case 'all':\n          target = table.cells().nodes();\n          break;\n        default:\n          throw 'The editable parameter must be \"cell\", \"row\", \"column\", or \"all\"';\n      }\n      var disableCols = data.editable.disable ? data.editable.disable.columns : null;\n      for (var i = 0; i < target.length; i++) {\n        (function(cell, current) {\n          var $cell = $(cell), html = $cell.html();\n          var _cell = table.cell(cell), value = _cell.data();\n          var $input = $('<input type=\"text\">'), changed = false;\n          if (!immediate) {\n            $cell.data('input', $input).data('html', html);\n            $input.attr('title', 'Hit Ctrl+Enter to finish editing, or Esc to cancel');\n          }\n          $input.val(value);\n          if (inArray(_cell.index().column, disableCols)) {\n            $input.attr('readonly', '').css('filter', 'invert(25%)');\n          }\n          $cell.empty().append($input);\n          if (cell === current) $input.focus();\n          $input.css('width', '100%');\n\n          if (immediate) $input.on('change', function() {\n            changed = true;\n            var valueNew = $input.val();\n            if (valueNew != value) {\n              _cell.data(valueNew);\n              if (HTMLWidgets.shinyMode) {\n                changeInput('cell_edit', [cellInfo(cell)], 'DT.cellInfo', null, {priority: \"event\"});\n              }\n              // for server-side processing, users have to call replaceData() to update the table\n              if (!server) table.draw(false);\n            } else {\n              $cell.html(html);\n            }\n            $input.remove();\n          }).on('blur', function() {\n            if (!changed) $input.trigger('change');\n          }).on('keyup', function(e) {\n            // hit Escape to cancel editing\n            if (e.keyCode === 27) $input.trigger('blur');\n          });\n\n          // bulk edit (row, column, or all)\n          if (!immediate) $input.on('keyup', function(e) {\n            var removeInput = function($cell, restore) {\n              $cell.data('input').remove();\n              if (restore) $cell.html($cell.data('html'));\n            }\n            if (e.keyCode === 27) {\n              for (var i = 0; i < target.length; i++) {\n                removeInput($(target[i]), true);\n              }\n            } else if (e.keyCode === 13 && e.ctrlKey) {\n              // Ctrl + Enter\n              var cell, $cell, _cell, cellData = [];\n              for (var i = 0; i < target.length; i++) {\n                cell = target[i]; $cell = $(cell); _cell = table.cell(cell);\n                _cell.data($cell.data('input').val());\n                HTMLWidgets.shinyMode && cellData.push(cellInfo(cell));\n                removeInput($cell, false);\n              }\n              if (HTMLWidgets.shinyMode) {\n                changeInput('cell_edit', cellData, 'DT.cellInfo', null, {priority: \"event\"});\n              }\n              if (!server) table.draw(false);\n            }\n          });\n        })(target[i], this);\n      }\n    });\n\n    // interaction with shiny\n    if (!HTMLWidgets.shinyMode && !crosstalkOptions.group) return;\n\n    var methods = {};\n    var shinyData = {};\n\n    methods.updateCaption = function(caption) {\n      if (!caption) return;\n      $table.children('caption').replaceWith(caption);\n    }\n\n    // register clear functions to remove input values when the table is removed\n    instance.clearInputs = {};\n\n    var changeInput = function(id, value, type, noCrosstalk, opts) {\n      var event = id;\n      id = el.id + '_' + id;\n      if (type) id = id + ':' + type;\n      // do not update if the new value is the same as old value\n      if (event !== 'cell_edit' && shinyData.hasOwnProperty(id) && shinyData[id] === JSON.stringify(value))\n        return;\n      shinyData[id] = JSON.stringify(value);\n      if (HTMLWidgets.shinyMode && Shiny.setInputValue) {\n        Shiny.setInputValue(id, value, opts);\n        if (!instance.clearInputs[id]) instance.clearInputs[id] = function() {\n          Shiny.setInputValue(id, null);\n        }\n      }\n\n      // HACK\n      if (event === \"rows_selected\" && !noCrosstalk) {\n        if (crosstalkOptions.group) {\n          var keys = crosstalkOptions.key;\n          var selectedKeys = null;\n          if (value) {\n            selectedKeys = [];\n            for (var i = 0; i < value.length; i++) {\n              // The value array's contents use 1-based row numbers, so we must\n              // convert to 0-based before indexing into the keys array.\n              selectedKeys.push(keys[value[i] - 1]);\n            }\n          }\n          instance.ctselectHandle.set(selectedKeys);\n        }\n      }\n    };\n\n    var addOne = function(x) {\n      return x.map(function(i) { return 1 + i; });\n    };\n\n    var unique = function(x) {\n      var ux = [];\n      $.each(x, function(i, el){\n        if ($.inArray(el, ux) === -1) ux.push(el);\n      });\n      return ux;\n    }\n\n    // change the row index of a cell\n    var tweakCellIndex = function(cell) {\n      var info = cell.index();\n      // some cell may not be valid. e.g, #759\n      // when using the RowGroup extension, datatables will\n      // generate the row label and the cells are not part of\n      // the data thus contain no row/col info\n      if (info === undefined)\n        return {row: null, col: null};\n      if (server) {\n        info.row = DT_rows_current[info.row];\n      } else {\n        info.row += 1;\n      }\n      return {row: info.row, col: info.column};\n    }\n\n    // a flag to indicates if select extension is initialized or not\n    var flagSelectExt = table.settings()[0]._select !== undefined;\n    // the Select extension should only be used in the client mode and\n    // when the selection.mode is set to none\n    if (data.selection.mode === 'none' && !server && flagSelectExt) {\n      var updateRowsSelected = function() {\n        var rows = table.rows({selected: true});\n        var selected = [];\n        $.each(rows.indexes().toArray(), function(i, v) {\n          selected.push(v + 1);\n        });\n        changeInput('rows_selected', selected);\n      }\n      var updateColsSelected = function() {\n        var columns = table.columns({selected: true});\n        changeInput('columns_selected', columns.indexes().toArray());\n      }\n      var updateCellsSelected = function() {\n        var cells = table.cells({selected: true});\n        var selected = [];\n        cells.every(function() {\n          var row = this.index().row;\n          var col = this.index().column;\n          selected = selected.concat([[row + 1, col]]);\n        });\n        changeInput('cells_selected', transposeArray2D(selected), 'shiny.matrix');\n      }\n      table.on('select deselect', function(e, dt, type, indexes) {\n        updateRowsSelected();\n        updateColsSelected();\n        updateCellsSelected();\n      })\n    }\n\n    var selMode = data.selection.mode, selTarget = data.selection.target;\n    if (inArray(selMode, ['single', 'multiple'])) {\n      var selClass = inArray(data.style, ['bootstrap', 'bootstrap4']) ? 'active' : 'selected';\n      var selected = data.selection.selected, selected1, selected2;\n      // selected1: row indices; selected2: column indices\n      if (selected === null) {\n        selected1 = selected2 = [];\n      } else if (selTarget === 'row') {\n        selected1 = $.makeArray(selected);\n      } else if (selTarget === 'column') {\n        selected2 = $.makeArray(selected);\n      } else if (selTarget === 'row+column') {\n        selected1 = $.makeArray(selected.rows);\n        selected2 = $.makeArray(selected.cols);\n      }\n\n      // After users reorder the rows or filter the table, we cannot use the table index\n      // directly. Instead, we need this function to find out the rows between the two clicks.\n      // If user filter the table again between the start click and the end click, the behavior\n      // would be undefined, but it should not be a problem.\n      var shiftSelRowsIndex = function(start, end) {\n        var indexes = server ? DT_rows_all : table.rows({ search: 'applied' }).indexes().toArray();\n        start = indexes.indexOf(start); end = indexes.indexOf(end);\n        // if start is larger than end, we need to swap\n        if (start > end) {\n          var tmp = end; end = start; start = tmp;\n        }\n        return indexes.slice(start, end + 1);\n      }\n\n      var serverRowIndex = function(clientRowIndex) {\n        return server ? DT_rows_current[clientRowIndex] : clientRowIndex + 1;\n      }\n\n      // row, column, or cell selection\n      var lastClickedRow;\n      if (inArray(selTarget, ['row', 'row+column'])) {\n        var selectedRows = function() {\n          var rows = table.rows('.' + selClass);\n          var idx = rows.indexes().toArray();\n          if (!server) return addOne(idx);\n          idx = idx.map(function(i) {\n            return DT_rows_current[i];\n          });\n          selected1 = selMode === 'multiple' ? unique(selected1.concat(idx)) : idx;\n          return selected1;\n        }\n        table.on('mousedown.dt', 'tbody tr', function(e) {\n          var $this = $(this), thisRow = table.row(this);\n          if (selMode === 'multiple') {\n            if (e.shiftKey && lastClickedRow !== undefined) {\n              // select or de-select depends on the last clicked row's status\n              var flagSel = !$this.hasClass(selClass);\n              var crtClickedRow = serverRowIndex(thisRow.index());\n              if (server) {\n                var rowsIndex = shiftSelRowsIndex(lastClickedRow, crtClickedRow);\n                // update current page's selClass\n                rowsIndex.map(function(i) {\n                  var rowIndex = DT_rows_current.indexOf(i);\n                  if (rowIndex >= 0) {\n                    var row = table.row(rowIndex).nodes().to$();\n                    var flagRowSel = !row.hasClass(selClass);\n                    if (flagSel === flagRowSel) row.toggleClass(selClass);\n                  }\n                });\n                // update selected1\n                if (flagSel) {\n                  selected1 = unique(selected1.concat(rowsIndex));\n                } else {\n                  selected1 = selected1.filter(function(index) {\n                    return !inArray(index, rowsIndex);\n                  });\n                }\n              } else {\n                // js starts from 0\n                shiftSelRowsIndex(lastClickedRow - 1, crtClickedRow - 1).map(function(value) {\n                  var row = table.row(value).nodes().to$();\n                  var flagRowSel = !row.hasClass(selClass);\n                  if (flagSel === flagRowSel) row.toggleClass(selClass);\n                });\n              }\n              e.preventDefault();\n            } else {\n              $this.toggleClass(selClass);\n            }\n          } else {\n            if ($this.hasClass(selClass)) {\n              $this.removeClass(selClass);\n            } else {\n              table.$('tr.' + selClass).removeClass(selClass);\n              $this.addClass(selClass);\n            }\n          }\n          if (server && !$this.hasClass(selClass)) {\n            var id = DT_rows_current[thisRow.index()];\n            // remove id from selected1 since its class .selected has been removed\n            if (inArray(id, selected1)) selected1.splice($.inArray(id, selected1), 1);\n          }\n          changeInput('rows_selected', selectedRows());\n          changeInput('row_last_clicked', serverRowIndex(thisRow.index()));\n          lastClickedRow = serverRowIndex(thisRow.index());\n        });\n        changeInput('rows_selected', selected1);\n        var selectRows = function() {\n          table.$('tr.' + selClass).removeClass(selClass);\n          if (selected1.length === 0) return;\n          if (server) {\n            table.rows({page: 'current'}).every(function() {\n              if (inArray(DT_rows_current[this.index()], selected1)) {\n                $(this.node()).addClass(selClass);\n              }\n            });\n          } else {\n            var selected0 = selected1.map(function(i) { return i - 1; });\n            $(table.rows(selected0).nodes()).addClass(selClass);\n          }\n        }\n        selectRows();  // in case users have specified pre-selected rows\n        // restore selected rows after the table is redrawn (e.g. sort/search/page);\n        // client-side tables will preserve the selections automatically; for\n        // server-side tables, we have to *real* row indices are in `selected1`\n        if (server) table.on('draw.dt', selectRows);\n        methods.selectRows = function(selected) {\n          selected1 = $.makeArray(selected);\n          selectRows();\n          changeInput('rows_selected', selected1);\n        }\n      }\n\n      if (inArray(selTarget, ['column', 'row+column'])) {\n        if (selTarget === 'row+column') {\n          $(table.columns().footer()).css('cursor', 'pointer');\n        }\n        var callback = function() {\n          var colIdx = selTarget === 'column' ? table.cell(this).index().column :\n              $.inArray(this, table.columns().footer()),\n              thisCol = $(table.column(colIdx).nodes());\n          if (colIdx === -1) return;\n          if (thisCol.hasClass(selClass)) {\n            thisCol.removeClass(selClass);\n            selected2.splice($.inArray(colIdx, selected2), 1);\n          } else {\n            if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass);\n            thisCol.addClass(selClass);\n            selected2 = selMode === 'single' ? [colIdx] : unique(selected2.concat([colIdx]));\n          }\n          changeInput('columns_selected', selected2);\n        }\n        if (selTarget === 'column') {\n          $(table.table().body()).on('click.dt', 'td', callback);\n        } else {\n          $(table.table().footer()).on('click.dt', 'tr th', callback);\n        }\n        changeInput('columns_selected', selected2);\n        var selectCols = function() {\n          table.columns().nodes().flatten().to$().removeClass(selClass);\n          if (selected2.length > 0)\n            table.columns(selected2).nodes().flatten().to$().addClass(selClass);\n        }\n        selectCols();  // in case users have specified pre-selected columns\n        if (server) table.on('draw.dt', selectCols);\n        methods.selectColumns = function(selected) {\n          selected2 = $.makeArray(selected);\n          selectCols();\n          changeInput('columns_selected', selected2);\n        }\n      }\n\n      if (selTarget === 'cell') {\n        var selected3;\n        if (selected === null) {\n          selected3 = [];\n        } else {\n          selected3 = selected;\n        }\n        var findIndex = function(ij) {\n          for (var i = 0; i < selected3.length; i++) {\n            if (ij[0] === selected3[i][0] && ij[1] === selected3[i][1]) return i;\n          }\n          return -1;\n        }\n        table.on('click.dt', 'tbody td', function() {\n          var $this = $(this), info = tweakCellIndex(table.cell(this));\n          if ($this.hasClass(selClass)) {\n            $this.removeClass(selClass);\n            selected3.splice(findIndex([info.row, info.col]), 1);\n          } else {\n            if (selMode === 'single') $(table.cells().nodes()).removeClass(selClass);\n            $this.addClass(selClass);\n            selected3 = selMode === 'single' ? [[info.row, info.col]] :\n              unique(selected3.concat([[info.row, info.col]]));\n          }\n          changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix');\n        });\n        changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix');\n        var selectCells = function() {\n          table.$('td.' + selClass).removeClass(selClass);\n          if (selected3.length === 0) return;\n          if (server) {\n            table.cells({page: 'current'}).every(function() {\n              var info = tweakCellIndex(this);\n              if (findIndex([info.row, info.col], selected3) > -1)\n                $(this.node()).addClass(selClass);\n            });\n          } else {\n            selected3.map(function(ij) {\n              $(table.cell(ij[0] - 1, ij[1]).node()).addClass(selClass);\n            });\n          }\n        };\n        selectCells();  // in case users have specified pre-selected columns\n        if (server) table.on('draw.dt', selectCells);\n        methods.selectCells = function(selected) {\n          selected3 = selected ? selected : [];\n          selectCells();\n          changeInput('cells_selected', transposeArray2D(selected3), 'shiny.matrix');\n        }\n      }\n    }\n\n    // expose some table info to Shiny\n    var updateTableInfo = function(e, settings) {\n      // TODO: is anyone interested in the page info?\n      // changeInput('page_info', table.page.info());\n      var updateRowInfo = function(id, modifier) {\n        var idx;\n        if (server) {\n          idx = modifier.page === 'current' ? DT_rows_current : DT_rows_all;\n        } else {\n          var rows = table.rows($.extend({\n            search: 'applied',\n            page: 'all'\n          }, modifier));\n          idx = addOne(rows.indexes().toArray());\n        }\n        changeInput('rows' + '_' + id, idx);\n      };\n      updateRowInfo('current', {page: 'current'});\n      updateRowInfo('all', {});\n    }\n    table.on('draw.dt', updateTableInfo);\n    updateTableInfo();\n\n    // state info\n    table.on('draw.dt column-visibility.dt', function() {\n      changeInput('state', table.state());\n    });\n    changeInput('state', table.state());\n\n    // search info\n    var updateSearchInfo = function() {\n      changeInput('search', table.search());\n      if (filterRow) changeInput('search_columns', filterRow.toArray().map(function(td) {\n        return $(td).find('input').first().val();\n      }));\n    }\n    table.on('draw.dt', updateSearchInfo);\n    updateSearchInfo();\n\n    var cellInfo = function(thiz) {\n      var info = tweakCellIndex(table.cell(thiz));\n      info.value = table.cell(thiz).data();\n      return info;\n    }\n    // the current cell clicked on\n    table.on('click.dt', 'tbody td', function() {\n      changeInput('cell_clicked', cellInfo(this));\n    })\n    changeInput('cell_clicked', {});\n\n    // do not trigger table selection when clicking on links unless they have classes\n    table.on('click.dt', 'tbody td a', function(e) {\n      if (this.className === '') e.stopPropagation();\n    });\n\n    methods.addRow = function(data, rowname) {\n      var data0 = table.row(0).data(), n = data0.length, d = n - data.length;\n      if (d === 1) {\n        data = rowname.concat(data)\n      } else if (d !== 0) {\n        console.log(data);\n        console.log(data0);\n        throw 'New data must be of the same length as current data (' + n + ')';\n      };\n      table.row.add(data).draw();\n    }\n\n    methods.updateSearch = function(keywords) {\n      if (keywords.global !== null)\n        $(table.table().container()).find('input[type=search]').first()\n             .val(keywords.global).trigger('input');\n      var columns = keywords.columns;\n      if (!filterRow || columns === null) return;\n      filterRow.toArray().map(function(td, i) {\n        var v = typeof columns === 'string' ? columns : columns[i];\n        if (typeof v === 'undefined') {\n          console.log('The search keyword for column ' + i + ' is undefined')\n          return;\n        }\n        $(td).find('input').first().val(v);\n        searchColumn(i, v);\n      });\n      table.draw();\n    }\n\n    methods.hideCols = function(hide, reset) {\n      if (reset) table.columns().visible(true, false);\n      table.columns(hide).visible(false);\n    }\n\n    methods.showCols = function(show, reset) {\n      if (reset) table.columns().visible(false, false);\n      table.columns(show).visible(true);\n    }\n\n    methods.colReorder = function(order, origOrder) {\n      table.colReorder.order(order, origOrder);\n    }\n\n    methods.selectPage = function(page) {\n      if (table.page.info().pages < page || page < 1) {\n        throw 'Selected page is out of range';\n      };\n      table.page(page - 1).draw(false);\n    }\n\n    methods.reloadData = function(resetPaging, clearSelection) {\n      // empty selections first if necessary\n      if (methods.selectRows && inArray('row', clearSelection)) methods.selectRows([]);\n      if (methods.selectColumns && inArray('column', clearSelection)) methods.selectColumns([]);\n      if (methods.selectCells && inArray('cell', clearSelection)) methods.selectCells([]);\n      table.ajax.reload(null, resetPaging);\n    }\n\n    table.shinyMethods = methods;\n  },\n  resize: function(el, width, height, instance) {\n    if (instance.data) this.renderValue(el, instance.data, instance);\n\n    // dynamically adjust height if fillContainer = TRUE\n    if (instance.fillContainer)\n      this.fillAvailableHeight(el, height);\n\n    this.adjustWidth(el);\n  },\n\n  // dynamically set the scroll body to fill available height\n  // (used with fillContainer = TRUE)\n  fillAvailableHeight: function(el, availableHeight) {\n\n    // see how much of the table is occupied by header/footer elements\n    // and use that to compute a target scroll body height\n    var dtWrapper = $(el).find('div.dataTables_wrapper');\n    var dtScrollBody = $(el).find($('div.dataTables_scrollBody'));\n    var framingHeight = dtWrapper.innerHeight() - dtScrollBody.innerHeight();\n    var scrollBodyHeight = availableHeight - framingHeight;\n\n    // set the height\n    dtScrollBody.height(scrollBodyHeight + 'px');\n  },\n\n  // adjust the width of columns; remove the hard-coded widths on table and the\n  // scroll header when scrollX/Y are enabled\n  adjustWidth: function(el) {\n    var $el = $(el), table = $el.data('datatable');\n    if (table) table.columns.adjust();\n    $el.find('.dataTables_scrollHeadInner').css('width', '')\n        .children('table').css('margin-left', '');\n  }\n});\n\n  if (!HTMLWidgets.shinyMode) return;\n\n  Shiny.addCustomMessageHandler('datatable-calls', function(data) {\n    var id = data.id;\n    var el = document.getElementById(id);\n    var table = el ? $(el).data('datatable') : null;\n    if (!table) {\n      console.log(\"Couldn't find table with id \" + id);\n      return;\n    }\n\n    var methods = table.shinyMethods, call = data.call;\n    if (methods[call.method]) {\n      methods[call.method].apply(table, call.args);\n    } else {\n      console.log(\"Unknown method \" + call.method);\n    }\n  });\n\n})();\n"
  },
  {
    "path": "vignettes/tutorials/libs/datatables-css/datatables-crosstalk.css",
    "content": ".dt-crosstalk-fade {\n  opacity: 0.2;\n}\n\nhtml body div.DTS div.dataTables_scrollBody {\n  background: none;\n}\n\n\n/*\nFix https://github.com/rstudio/DT/issues/563\nIf the `table.display` is set to \"block\" (e.g., pkgdown), the browser will display\ndatatable objects strangely. The search panel and the page buttons will still be\nin full-width but the table body will be \"compact\" and shorter.\nIn therory, having this attributes will affect `dom=\"t\"`\nwith `display: block` users. But in reality, there should be no one.\nWe may remove the below lines in the future if the upstream agree to have this there.\nSee https://github.com/DataTables/DataTablesSrc/issues/160\n*/\n\ntable.dataTable {\n  display: table;\n}\n"
  },
  {
    "path": "vignettes/tutorials/libs/dt-core/css/jquery.dataTables.extra.css",
    "content": "/* Selected rows/cells */\ntable.dataTable tr.selected td, table.dataTable td.selected {\n  background-color: #b0bed9 !important;\n}\n/* In case of scrollX/Y or FixedHeader */\n.dataTables_scrollBody .dataTables_sizing {\n  visibility: hidden;\n}\n\n/* The datatables' theme CSS file doesn't define\nthe color but with white background. It leads to an issue that\nwhen the HTML's body color is set to 'white', the user can't\nsee the text since the background is white. One case happens in the\nRStudio's IDE when inline viewing the DT table inside an Rmd file,\nif the IDE theme is set to \"Cobalt\".\n\nSee https://github.com/rstudio/DT/issues/447 for more info\n\nThis fixes should have little side-effects because all the other elements\nof the default theme use the #333 font color.\n\nTODO: The upstream may use relative colors for both the table background\nand the color. It means the table can display well without this patch\nthen. At that time, we need to remove the below CSS attributes.\n*/\ndiv.datatables {\n  color: #333;\n}\n"
  },
  {
    "path": "vignettes/tutorials/libs/header-attrs/header-attrs.js",
    "content": "// 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"
  },
  {
    "path": "vignettes/tutorials/libs/htmlwidgets/htmlwidgets.js",
    "content": "(function() {\n  // If window.HTMLWidgets is already defined, then use it; otherwise create a\n  // new object. This allows preceding code to set options that affect the\n  // initialization process (though none currently exist).\n  window.HTMLWidgets = window.HTMLWidgets || {};\n\n  // See if we're running in a viewer pane. If not, we're in a web browser.\n  var viewerMode = window.HTMLWidgets.viewerMode =\n      /\\bviewer_pane=1\\b/.test(window.location);\n\n  // See if we're running in Shiny mode. If not, it's a static document.\n  // Note that static widgets can appear in both Shiny and static modes, but\n  // obviously, Shiny widgets can only appear in Shiny apps/documents.\n  var shinyMode = window.HTMLWidgets.shinyMode =\n      typeof(window.Shiny) !== \"undefined\" && !!window.Shiny.outputBindings;\n\n  // We can't count on jQuery being available, so we implement our own\n  // version if necessary.\n  function querySelectorAll(scope, selector) {\n    if (typeof(jQuery) !== \"undefined\" && scope instanceof jQuery) {\n      return scope.find(selector);\n    }\n    if (scope.querySelectorAll) {\n      return scope.querySelectorAll(selector);\n    }\n  }\n\n  function asArray(value) {\n    if (value === null)\n      return [];\n    if ($.isArray(value))\n      return value;\n    return [value];\n  }\n\n  // Implement jQuery's extend\n  function extend(target /*, ... */) {\n    if (arguments.length == 1) {\n      return target;\n    }\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var prop in source) {\n        if (source.hasOwnProperty(prop)) {\n          target[prop] = source[prop];\n        }\n      }\n    }\n    return target;\n  }\n\n  // IE8 doesn't support Array.forEach.\n  function forEach(values, callback, thisArg) {\n    if (values.forEach) {\n      values.forEach(callback, thisArg);\n    } else {\n      for (var i = 0; i < values.length; i++) {\n        callback.call(thisArg, values[i], i, values);\n      }\n    }\n  }\n\n  // Replaces the specified method with the return value of funcSource.\n  //\n  // Note that funcSource should not BE the new method, it should be a function\n  // that RETURNS the new method. funcSource receives a single argument that is\n  // the overridden method, it can be called from the new method. The overridden\n  // method can be called like a regular function, it has the target permanently\n  // bound to it so \"this\" will work correctly.\n  function overrideMethod(target, methodName, funcSource) {\n    var superFunc = target[methodName] || function() {};\n    var superFuncBound = function() {\n      return superFunc.apply(target, arguments);\n    };\n    target[methodName] = funcSource(superFuncBound);\n  }\n\n  // Add a method to delegator that, when invoked, calls\n  // delegatee.methodName. If there is no such method on\n  // the delegatee, but there was one on delegator before\n  // delegateMethod was called, then the original version\n  // is invoked instead.\n  // For example:\n  //\n  // var a = {\n  //   method1: function() { console.log('a1'); }\n  //   method2: function() { console.log('a2'); }\n  // };\n  // var b = {\n  //   method1: function() { console.log('b1'); }\n  // };\n  // delegateMethod(a, b, \"method1\");\n  // delegateMethod(a, b, \"method2\");\n  // a.method1();\n  // a.method2();\n  //\n  // The output would be \"b1\", \"a2\".\n  function delegateMethod(delegator, delegatee, methodName) {\n    var inherited = delegator[methodName];\n    delegator[methodName] = function() {\n      var target = delegatee;\n      var method = delegatee[methodName];\n\n      // The method doesn't exist on the delegatee. Instead,\n      // call the method on the delegator, if it exists.\n      if (!method) {\n        target = delegator;\n        method = inherited;\n      }\n\n      if (method) {\n        return method.apply(target, arguments);\n      }\n    };\n  }\n\n  // Implement a vague facsimilie of jQuery's data method\n  function elementData(el, name, value) {\n    if (arguments.length == 2) {\n      return el[\"htmlwidget_data_\" + name];\n    } else if (arguments.length == 3) {\n      el[\"htmlwidget_data_\" + name] = value;\n      return el;\n    } else {\n      throw new Error(\"Wrong number of arguments for elementData: \" +\n        arguments.length);\n    }\n  }\n\n  // http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\n  function escapeRegExp(str) {\n    return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n  }\n\n  function hasClass(el, className) {\n    var re = new RegExp(\"\\\\b\" + escapeRegExp(className) + \"\\\\b\");\n    return re.test(el.className);\n  }\n\n  // elements - array (or array-like object) of HTML elements\n  // className - class name to test for\n  // include - if true, only return elements with given className;\n  //   if false, only return elements *without* given className\n  function filterByClass(elements, className, include) {\n    var results = [];\n    for (var i = 0; i < elements.length; i++) {\n      if (hasClass(elements[i], className) == include)\n        results.push(elements[i]);\n    }\n    return results;\n  }\n\n  function on(obj, eventName, func) {\n    if (obj.addEventListener) {\n      obj.addEventListener(eventName, func, false);\n    } else if (obj.attachEvent) {\n      obj.attachEvent(eventName, func);\n    }\n  }\n\n  function off(obj, eventName, func) {\n    if (obj.removeEventListener)\n      obj.removeEventListener(eventName, func, false);\n    else if (obj.detachEvent) {\n      obj.detachEvent(eventName, func);\n    }\n  }\n\n  // Translate array of values to top/right/bottom/left, as usual with\n  // the \"padding\" CSS property\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/padding\n  function unpackPadding(value) {\n    if (typeof(value) === \"number\")\n      value = [value];\n    if (value.length === 1) {\n      return {top: value[0], right: value[0], bottom: value[0], left: value[0]};\n    }\n    if (value.length === 2) {\n      return {top: value[0], right: value[1], bottom: value[0], left: value[1]};\n    }\n    if (value.length === 3) {\n      return {top: value[0], right: value[1], bottom: value[2], left: value[1]};\n    }\n    if (value.length === 4) {\n      return {top: value[0], right: value[1], bottom: value[2], left: value[3]};\n    }\n  }\n\n  // Convert an unpacked padding object to a CSS value\n  function paddingToCss(paddingObj) {\n    return paddingObj.top + \"px \" + paddingObj.right + \"px \" + paddingObj.bottom + \"px \" + paddingObj.left + \"px\";\n  }\n\n  // Makes a number suitable for CSS\n  function px(x) {\n    if (typeof(x) === \"number\")\n      return x + \"px\";\n    else\n      return x;\n  }\n\n  // Retrieves runtime widget sizing information for an element.\n  // The return value is either null, or an object with fill, padding,\n  // defaultWidth, defaultHeight fields.\n  function sizingPolicy(el) {\n    var sizingEl = document.querySelector(\"script[data-for='\" + el.id + \"'][type='application/htmlwidget-sizing']\");\n    if (!sizingEl)\n      return null;\n    var sp = JSON.parse(sizingEl.textContent || sizingEl.text || \"{}\");\n    if (viewerMode) {\n      return sp.viewer;\n    } else {\n      return sp.browser;\n    }\n  }\n\n  // @param tasks Array of strings (or falsy value, in which case no-op).\n  //   Each element must be a valid JavaScript expression that yields a\n  //   function. Or, can be an array of objects with \"code\" and \"data\"\n  //   properties; in this case, the \"code\" property should be a string\n  //   of JS that's an expr that yields a function, and \"data\" should be\n  //   an object that will be added as an additional argument when that\n  //   function is called.\n  // @param target The object that will be \"this\" for each function\n  //   execution.\n  // @param args Array of arguments to be passed to the functions. (The\n  //   same arguments will be passed to all functions.)\n  function evalAndRun(tasks, target, args) {\n    if (tasks) {\n      forEach(tasks, function(task) {\n        var theseArgs = args;\n        if (typeof(task) === \"object\") {\n          theseArgs = theseArgs.concat([task.data]);\n          task = task.code;\n        }\n        var taskFunc = tryEval(task);\n        if (typeof(taskFunc) !== \"function\") {\n          throw new Error(\"Task must be a function! Source:\\n\" + task);\n        }\n        taskFunc.apply(target, theseArgs);\n      });\n    }\n  }\n\n  // Attempt eval() both with and without enclosing in parentheses.\n  // Note that enclosing coerces a function declaration into\n  // an expression that eval() can parse\n  // (otherwise, a SyntaxError is thrown)\n  function tryEval(code) {\n    var result = null;\n    try {\n      result = eval(code);\n    } catch(error) {\n      if (!error instanceof SyntaxError) {\n        throw error;\n      }\n      try {\n        result = eval(\"(\" + code + \")\");\n      } catch(e) {\n        if (e instanceof SyntaxError) {\n          throw error;\n        } else {\n          throw e;\n        }\n      }\n    }\n    return result;\n  }\n\n  function initSizing(el) {\n    var sizing = sizingPolicy(el);\n    if (!sizing)\n      return;\n\n    var cel = document.getElementById(\"htmlwidget_container\");\n    if (!cel)\n      return;\n\n    if (typeof(sizing.padding) !== \"undefined\") {\n      document.body.style.margin = \"0\";\n      document.body.style.padding = paddingToCss(unpackPadding(sizing.padding));\n    }\n\n    if (sizing.fill) {\n      document.body.style.overflow = \"hidden\";\n      document.body.style.width = \"100%\";\n      document.body.style.height = \"100%\";\n      document.documentElement.style.width = \"100%\";\n      document.documentElement.style.height = \"100%\";\n      if (cel) {\n        cel.style.position = \"absolute\";\n        var pad = unpackPadding(sizing.padding);\n        cel.style.top = pad.top + \"px\";\n        cel.style.right = pad.right + \"px\";\n        cel.style.bottom = pad.bottom + \"px\";\n        cel.style.left = pad.left + \"px\";\n        el.style.width = \"100%\";\n        el.style.height = \"100%\";\n      }\n\n      return {\n        getWidth: function() { return cel.offsetWidth; },\n        getHeight: function() { return cel.offsetHeight; }\n      };\n\n    } else {\n      el.style.width = px(sizing.width);\n      el.style.height = px(sizing.height);\n\n      return {\n        getWidth: function() { return el.offsetWidth; },\n        getHeight: function() { return el.offsetHeight; }\n      };\n    }\n  }\n\n  // Default implementations for methods\n  var defaults = {\n    find: function(scope) {\n      return querySelectorAll(scope, \".\" + this.name);\n    },\n    renderError: function(el, err) {\n      var $el = $(el);\n\n      this.clearError(el);\n\n      // Add all these error classes, as Shiny does\n      var errClass = \"shiny-output-error\";\n      if (err.type !== null) {\n        // use the classes of the error condition as CSS class names\n        errClass = errClass + \" \" + $.map(asArray(err.type), function(type) {\n          return errClass + \"-\" + type;\n        }).join(\" \");\n      }\n      errClass = errClass + \" htmlwidgets-error\";\n\n      // Is el inline or block? If inline or inline-block, just display:none it\n      // and add an inline error.\n      var display = $el.css(\"display\");\n      $el.data(\"restore-display-mode\", display);\n\n      if (display === \"inline\" || display === \"inline-block\") {\n        $el.hide();\n        if (err.message !== \"\") {\n          var errorSpan = $(\"<span>\").addClass(errClass);\n          errorSpan.text(err.message);\n          $el.after(errorSpan);\n        }\n      } else if (display === \"block\") {\n        // If block, add an error just after the el, set visibility:none on the\n        // el, and position the error to be on top of the el.\n        // Mark it with a unique ID and CSS class so we can remove it later.\n        $el.css(\"visibility\", \"hidden\");\n        if (err.message !== \"\") {\n          var errorDiv = $(\"<div>\").addClass(errClass).css(\"position\", \"absolute\")\n            .css(\"top\", el.offsetTop)\n            .css(\"left\", el.offsetLeft)\n            // setting width can push out the page size, forcing otherwise\n            // unnecessary scrollbars to appear and making it impossible for\n            // the element to shrink; so use max-width instead\n            .css(\"maxWidth\", el.offsetWidth)\n            .css(\"height\", el.offsetHeight);\n          errorDiv.text(err.message);\n          $el.after(errorDiv);\n\n          // Really dumb way to keep the size/position of the error in sync with\n          // the parent element as the window is resized or whatever.\n          var intId = setInterval(function() {\n            if (!errorDiv[0].parentElement) {\n              clearInterval(intId);\n              return;\n            }\n            errorDiv\n              .css(\"top\", el.offsetTop)\n              .css(\"left\", el.offsetLeft)\n              .css(\"maxWidth\", el.offsetWidth)\n              .css(\"height\", el.offsetHeight);\n          }, 500);\n        }\n      }\n    },\n    clearError: function(el) {\n      var $el = $(el);\n      var display = $el.data(\"restore-display-mode\");\n      $el.data(\"restore-display-mode\", null);\n\n      if (display === \"inline\" || display === \"inline-block\") {\n        if (display)\n          $el.css(\"display\", display);\n        $(el.nextSibling).filter(\".htmlwidgets-error\").remove();\n      } else if (display === \"block\"){\n        $el.css(\"visibility\", \"inherit\");\n        $(el.nextSibling).filter(\".htmlwidgets-error\").remove();\n      }\n    },\n    sizing: {}\n  };\n\n  // Called by widget bindings to register a new type of widget. The definition\n  // object can contain the following properties:\n  // - name (required) - A string indicating the binding name, which will be\n  //   used by default as the CSS classname to look for.\n  // - initialize (optional) - A function(el) that will be called once per\n  //   widget element; if a value is returned, it will be passed as the third\n  //   value to renderValue.\n  // - renderValue (required) - A function(el, data, initValue) that will be\n  //   called with data. Static contexts will cause this to be called once per\n  //   element; Shiny apps will cause this to be called multiple times per\n  //   element, as the data changes.\n  window.HTMLWidgets.widget = function(definition) {\n    if (!definition.name) {\n      throw new Error(\"Widget must have a name\");\n    }\n    if (!definition.type) {\n      throw new Error(\"Widget must have a type\");\n    }\n    // Currently we only support output widgets\n    if (definition.type !== \"output\") {\n      throw new Error(\"Unrecognized widget type '\" + definition.type + \"'\");\n    }\n    // TODO: Verify that .name is a valid CSS classname\n\n    // Support new-style instance-bound definitions. Old-style class-bound\n    // definitions have one widget \"object\" per widget per type/class of\n    // widget; the renderValue and resize methods on such widget objects\n    // take el and instance arguments, because the widget object can't\n    // store them. New-style instance-bound definitions have one widget\n    // object per widget instance; the definition that's passed in doesn't\n    // provide renderValue or resize methods at all, just the single method\n    //   factory(el, width, height)\n    // which returns an object that has renderValue(x) and resize(w, h).\n    // This enables a far more natural programming style for the widget\n    // author, who can store per-instance state using either OO-style\n    // instance fields or functional-style closure variables (I guess this\n    // is in contrast to what can only be called C-style pseudo-OO which is\n    // what we required before).\n    if (definition.factory) {\n      definition = createLegacyDefinitionAdapter(definition);\n    }\n\n    if (!definition.renderValue) {\n      throw new Error(\"Widget must have a renderValue function\");\n    }\n\n    // For static rendering (non-Shiny), use a simple widget registration\n    // scheme. We also use this scheme for Shiny apps/documents that also\n    // contain static widgets.\n    window.HTMLWidgets.widgets = window.HTMLWidgets.widgets || [];\n    // Merge defaults into the definition; don't mutate the original definition.\n    var staticBinding = extend({}, defaults, definition);\n    overrideMethod(staticBinding, \"find\", function(superfunc) {\n      return function(scope) {\n        var results = superfunc(scope);\n        // Filter out Shiny outputs, we only want the static kind\n        return filterByClass(results, \"html-widget-output\", false);\n      };\n    });\n    window.HTMLWidgets.widgets.push(staticBinding);\n\n    if (shinyMode) {\n      // Shiny is running. Register the definition with an output binding.\n      // The definition itself will not be the output binding, instead\n      // we will make an output binding object that delegates to the\n      // definition. This is because we foolishly used the same method\n      // name (renderValue) for htmlwidgets definition and Shiny bindings\n      // but they actually have quite different semantics (the Shiny\n      // bindings receive data that includes lots of metadata that it\n      // strips off before calling htmlwidgets renderValue). We can't\n      // just ignore the difference because in some widgets it's helpful\n      // to call this.renderValue() from inside of resize(), and if\n      // we're not delegating, then that call will go to the Shiny\n      // version instead of the htmlwidgets version.\n\n      // Merge defaults with definition, without mutating either.\n      var bindingDef = extend({}, defaults, definition);\n\n      // This object will be our actual Shiny binding.\n      var shinyBinding = new Shiny.OutputBinding();\n\n      // With a few exceptions, we'll want to simply use the bindingDef's\n      // version of methods if they are available, otherwise fall back to\n      // Shiny's defaults. NOTE: If Shiny's output bindings gain additional\n      // methods in the future, and we want them to be overrideable by\n      // HTMLWidget binding definitions, then we'll need to add them to this\n      // list.\n      delegateMethod(shinyBinding, bindingDef, \"getId\");\n      delegateMethod(shinyBinding, bindingDef, \"onValueChange\");\n      delegateMethod(shinyBinding, bindingDef, \"onValueError\");\n      delegateMethod(shinyBinding, bindingDef, \"renderError\");\n      delegateMethod(shinyBinding, bindingDef, \"clearError\");\n      delegateMethod(shinyBinding, bindingDef, \"showProgress\");\n\n      // The find, renderValue, and resize are handled differently, because we\n      // want to actually decorate the behavior of the bindingDef methods.\n\n      shinyBinding.find = function(scope) {\n        var results = bindingDef.find(scope);\n\n        // Only return elements that are Shiny outputs, not static ones\n        var dynamicResults = results.filter(\".html-widget-output\");\n\n        // It's possible that whatever caused Shiny to think there might be\n        // new dynamic outputs, also caused there to be new static outputs.\n        // Since there might be lots of different htmlwidgets bindings, we\n        // schedule execution for later--no need to staticRender multiple\n        // times.\n        if (results.length !== dynamicResults.length)\n          scheduleStaticRender();\n\n        return dynamicResults;\n      };\n\n      // Wrap renderValue to handle initialization, which unfortunately isn't\n      // supported natively by Shiny at the time of this writing.\n\n      shinyBinding.renderValue = function(el, data) {\n        Shiny.renderDependencies(data.deps);\n        // Resolve strings marked as javascript literals to objects\n        if (!(data.evals instanceof Array)) data.evals = [data.evals];\n        for (var i = 0; data.evals && i < data.evals.length; i++) {\n          window.HTMLWidgets.evaluateStringMember(data.x, data.evals[i]);\n        }\n        if (!bindingDef.renderOnNullValue) {\n          if (data.x === null) {\n            el.style.visibility = \"hidden\";\n            return;\n          } else {\n            el.style.visibility = \"inherit\";\n          }\n        }\n        if (!elementData(el, \"initialized\")) {\n          initSizing(el);\n\n          elementData(el, \"initialized\", true);\n          if (bindingDef.initialize) {\n            var result = bindingDef.initialize(el, el.offsetWidth,\n              el.offsetHeight);\n            elementData(el, \"init_result\", result);\n          }\n        }\n        bindingDef.renderValue(el, data.x, elementData(el, \"init_result\"));\n        evalAndRun(data.jsHooks.render, elementData(el, \"init_result\"), [el, data.x]);\n      };\n\n      // Only override resize if bindingDef implements it\n      if (bindingDef.resize) {\n        shinyBinding.resize = function(el, width, height) {\n          // Shiny can call resize before initialize/renderValue have been\n          // called, which doesn't make sense for widgets.\n          if (elementData(el, \"initialized\")) {\n            bindingDef.resize(el, width, height, elementData(el, \"init_result\"));\n          }\n        };\n      }\n\n      Shiny.outputBindings.register(shinyBinding, bindingDef.name);\n    }\n  };\n\n  var scheduleStaticRenderTimerId = null;\n  function scheduleStaticRender() {\n    if (!scheduleStaticRenderTimerId) {\n      scheduleStaticRenderTimerId = setTimeout(function() {\n        scheduleStaticRenderTimerId = null;\n        window.HTMLWidgets.staticRender();\n      }, 1);\n    }\n  }\n\n  // Render static widgets after the document finishes loading\n  // Statically render all elements that are of this widget's class\n  window.HTMLWidgets.staticRender = function() {\n    var bindings = window.HTMLWidgets.widgets || [];\n    forEach(bindings, function(binding) {\n      var matches = binding.find(document.documentElement);\n      forEach(matches, function(el) {\n        var sizeObj = initSizing(el, binding);\n\n        if (hasClass(el, \"html-widget-static-bound\"))\n          return;\n        el.className = el.className + \" html-widget-static-bound\";\n\n        var initResult;\n        if (binding.initialize) {\n          initResult = binding.initialize(el,\n            sizeObj ? sizeObj.getWidth() : el.offsetWidth,\n            sizeObj ? sizeObj.getHeight() : el.offsetHeight\n          );\n          elementData(el, \"init_result\", initResult);\n        }\n\n        if (binding.resize) {\n          var lastSize = {\n            w: sizeObj ? sizeObj.getWidth() : el.offsetWidth,\n            h: sizeObj ? sizeObj.getHeight() : el.offsetHeight\n          };\n          var resizeHandler = function(e) {\n            var size = {\n              w: sizeObj ? sizeObj.getWidth() : el.offsetWidth,\n              h: sizeObj ? sizeObj.getHeight() : el.offsetHeight\n            };\n            if (size.w === 0 && size.h === 0)\n              return;\n            if (size.w === lastSize.w && size.h === lastSize.h)\n              return;\n            lastSize = size;\n            binding.resize(el, size.w, size.h, initResult);\n          };\n\n          on(window, \"resize\", resizeHandler);\n\n          // This is needed for cases where we're running in a Shiny\n          // app, but the widget itself is not a Shiny output, but\n          // rather a simple static widget. One example of this is\n          // an rmarkdown document that has runtime:shiny and widget\n          // that isn't in a render function. Shiny only knows to\n          // call resize handlers for Shiny outputs, not for static\n          // widgets, so we do it ourselves.\n          if (window.jQuery) {\n            window.jQuery(document).on(\n              \"shown.htmlwidgets shown.bs.tab.htmlwidgets shown.bs.collapse.htmlwidgets\",\n              resizeHandler\n            );\n            window.jQuery(document).on(\n              \"hidden.htmlwidgets hidden.bs.tab.htmlwidgets hidden.bs.collapse.htmlwidgets\",\n              resizeHandler\n            );\n          }\n\n          // This is needed for the specific case of ioslides, which\n          // flips slides between display:none and display:block.\n          // Ideally we would not have to have ioslide-specific code\n          // here, but rather have ioslides raise a generic event,\n          // but the rmarkdown package just went to CRAN so the\n          // window to getting that fixed may be long.\n          if (window.addEventListener) {\n            // It's OK to limit this to window.addEventListener\n            // browsers because ioslides itself only supports\n            // such browsers.\n            on(document, \"slideenter\", resizeHandler);\n            on(document, \"slideleave\", resizeHandler);\n          }\n        }\n\n        var scriptData = document.querySelector(\"script[data-for='\" + el.id + \"'][type='application/json']\");\n        if (scriptData) {\n          var data = JSON.parse(scriptData.textContent || scriptData.text);\n          // Resolve strings marked as javascript literals to objects\n          if (!(data.evals instanceof Array)) data.evals = [data.evals];\n          for (var k = 0; data.evals && k < data.evals.length; k++) {\n            window.HTMLWidgets.evaluateStringMember(data.x, data.evals[k]);\n          }\n          binding.renderValue(el, data.x, initResult);\n          evalAndRun(data.jsHooks.render, initResult, [el, data.x]);\n        }\n      });\n    });\n\n    invokePostRenderHandlers();\n  }\n\n\n  function has_jQuery3() {\n    if (!window.jQuery) {\n      return false;\n    }\n    var $version = window.jQuery.fn.jquery;\n    var $major_version = parseInt($version.split(\".\")[0]);\n    return $major_version >= 3;\n  }\n\n  /*\n  / Shiny 1.4 bumped jQuery from 1.x to 3.x which means jQuery's\n  / on-ready handler (i.e., $(fn)) is now asyncronous (i.e., it now\n  / really means $(setTimeout(fn)).\n  / https://jquery.com/upgrade-guide/3.0/#breaking-change-document-ready-handlers-are-now-asynchronous\n  /\n  / Since Shiny uses $() to schedule initShiny, shiny>=1.4 calls initShiny\n  / one tick later than it did before, which means staticRender() is\n  / called renderValue() earlier than (advanced) widget authors might be expecting.\n  / https://github.com/rstudio/shiny/issues/2630\n  /\n  / For a concrete example, leaflet has some methods (e.g., updateBounds)\n  / which reference Shiny methods registered in initShiny (e.g., setInputValue).\n  / Since leaflet is privy to this life-cycle, it knows to use setTimeout() to\n  / delay execution of those methods (until Shiny methods are ready)\n  / https://github.com/rstudio/leaflet/blob/18ec981/javascript/src/index.js#L266-L268\n  /\n  / Ideally widget authors wouldn't need to use this setTimeout() hack that\n  / leaflet uses to call Shiny methods on a staticRender(). In the long run,\n  / the logic initShiny should be broken up so that method registration happens\n  / right away, but binding happens later.\n  */\n  function maybeStaticRenderLater() {\n    if (shinyMode && has_jQuery3()) {\n      window.jQuery(window.HTMLWidgets.staticRender);\n    } else {\n      window.HTMLWidgets.staticRender();\n    }\n  }\n\n  if (document.addEventListener) {\n    document.addEventListener(\"DOMContentLoaded\", function() {\n      document.removeEventListener(\"DOMContentLoaded\", arguments.callee, false);\n      maybeStaticRenderLater();\n    }, false);\n  } else if (document.attachEvent) {\n    document.attachEvent(\"onreadystatechange\", function() {\n      if (document.readyState === \"complete\") {\n        document.detachEvent(\"onreadystatechange\", arguments.callee);\n        maybeStaticRenderLater();\n      }\n    });\n  }\n\n\n  window.HTMLWidgets.getAttachmentUrl = function(depname, key) {\n    // If no key, default to the first item\n    if (typeof(key) === \"undefined\")\n      key = 1;\n\n    var link = document.getElementById(depname + \"-\" + key + \"-attachment\");\n    if (!link) {\n      throw new Error(\"Attachment \" + depname + \"/\" + key + \" not found in document\");\n    }\n    return link.getAttribute(\"href\");\n  };\n\n  window.HTMLWidgets.dataframeToD3 = function(df) {\n    var names = [];\n    var length;\n    for (var name in df) {\n        if (df.hasOwnProperty(name))\n            names.push(name);\n        if (typeof(df[name]) !== \"object\" || typeof(df[name].length) === \"undefined\") {\n            throw new Error(\"All fields must be arrays\");\n        } else if (typeof(length) !== \"undefined\" && length !== df[name].length) {\n            throw new Error(\"All fields must be arrays of the same length\");\n        }\n        length = df[name].length;\n    }\n    var results = [];\n    var item;\n    for (var row = 0; row < length; row++) {\n        item = {};\n        for (var col = 0; col < names.length; col++) {\n            item[names[col]] = df[names[col]][row];\n        }\n        results.push(item);\n    }\n    return results;\n  };\n\n  window.HTMLWidgets.transposeArray2D = function(array) {\n      if (array.length === 0) return array;\n      var newArray = array[0].map(function(col, i) {\n          return array.map(function(row) {\n              return row[i]\n          })\n      });\n      return newArray;\n  };\n  // Split value at splitChar, but allow splitChar to be escaped\n  // using escapeChar. Any other characters escaped by escapeChar\n  // will be included as usual (including escapeChar itself).\n  function splitWithEscape(value, splitChar, escapeChar) {\n    var results = [];\n    var escapeMode = false;\n    var currentResult = \"\";\n    for (var pos = 0; pos < value.length; pos++) {\n      if (!escapeMode) {\n        if (value[pos] === splitChar) {\n          results.push(currentResult);\n          currentResult = \"\";\n        } else if (value[pos] === escapeChar) {\n          escapeMode = true;\n        } else {\n          currentResult += value[pos];\n        }\n      } else {\n        currentResult += value[pos];\n        escapeMode = false;\n      }\n    }\n    if (currentResult !== \"\") {\n      results.push(currentResult);\n    }\n    return results;\n  }\n  // Function authored by Yihui/JJ Allaire\n  window.HTMLWidgets.evaluateStringMember = function(o, member) {\n    var parts = splitWithEscape(member, '.', '\\\\');\n    for (var i = 0, l = parts.length; i < l; i++) {\n      var part = parts[i];\n      // part may be a character or 'numeric' member name\n      if (o !== null && typeof o === \"object\" && part in o) {\n        if (i == (l - 1)) { // if we are at the end of the line then evalulate\n          if (typeof o[part] === \"string\")\n            o[part] = tryEval(o[part]);\n        } else { // otherwise continue to next embedded object\n          o = o[part];\n        }\n      }\n    }\n  };\n\n  // Retrieve the HTMLWidget instance (i.e. the return value of an\n  // HTMLWidget binding's initialize() or factory() function)\n  // associated with an element, or null if none.\n  window.HTMLWidgets.getInstance = function(el) {\n    return elementData(el, \"init_result\");\n  };\n\n  // Finds the first element in the scope that matches the selector,\n  // and returns the HTMLWidget instance (i.e. the return value of\n  // an HTMLWidget binding's initialize() or factory() function)\n  // associated with that element, if any. If no element matches the\n  // selector, or the first matching element has no HTMLWidget\n  // instance associated with it, then null is returned.\n  //\n  // The scope argument is optional, and defaults to window.document.\n  window.HTMLWidgets.find = function(scope, selector) {\n    if (arguments.length == 1) {\n      selector = scope;\n      scope = document;\n    }\n\n    var el = scope.querySelector(selector);\n    if (el === null) {\n      return null;\n    } else {\n      return window.HTMLWidgets.getInstance(el);\n    }\n  };\n\n  // Finds all elements in the scope that match the selector, and\n  // returns the HTMLWidget instances (i.e. the return values of\n  // an HTMLWidget binding's initialize() or factory() function)\n  // associated with the elements, in an array. If elements that\n  // match the selector don't have an associated HTMLWidget\n  // instance, the returned array will contain nulls.\n  //\n  // The scope argument is optional, and defaults to window.document.\n  window.HTMLWidgets.findAll = function(scope, selector) {\n    if (arguments.length == 1) {\n      selector = scope;\n      scope = document;\n    }\n\n    var nodes = scope.querySelectorAll(selector);\n    var results = [];\n    for (var i = 0; i < nodes.length; i++) {\n      results.push(window.HTMLWidgets.getInstance(nodes[i]));\n    }\n    return results;\n  };\n\n  var postRenderHandlers = [];\n  function invokePostRenderHandlers() {\n    while (postRenderHandlers.length) {\n      var handler = postRenderHandlers.shift();\n      if (handler) {\n        handler();\n      }\n    }\n  }\n\n  // Register the given callback function to be invoked after the\n  // next time static widgets are rendered.\n  window.HTMLWidgets.addPostRenderHandler = function(callback) {\n    postRenderHandlers.push(callback);\n  };\n\n  // Takes a new-style instance-bound definition, and returns an\n  // old-style class-bound definition. This saves us from having\n  // to rewrite all the logic in this file to accomodate both\n  // types of definitions.\n  function createLegacyDefinitionAdapter(defn) {\n    var result = {\n      name: defn.name,\n      type: defn.type,\n      initialize: function(el, width, height) {\n        return defn.factory(el, width, height);\n      },\n      renderValue: function(el, x, instance) {\n        return instance.renderValue(x);\n      },\n      resize: function(el, width, height, instance) {\n        return instance.resize(width, height);\n      }\n    };\n\n    if (defn.find)\n      result.find = defn.find;\n    if (defn.renderError)\n      result.renderError = defn.renderError;\n    if (defn.clearError)\n      result.clearError = defn.clearError;\n\n    return result;\n  }\n})();\n\n"
  },
  {
    "path": "vignettes/tutorials/libs/leaflet/leaflet.css",
    "content": "/* required styles */\r\n\r\n.leaflet-pane,\r\n.leaflet-tile,\r\n.leaflet-marker-icon,\r\n.leaflet-marker-shadow,\r\n.leaflet-tile-container,\r\n.leaflet-pane > svg,\r\n.leaflet-pane > canvas,\r\n.leaflet-zoom-box,\r\n.leaflet-image-layer,\r\n.leaflet-layer {\r\n\tposition: absolute;\r\n\tleft: 0;\r\n\ttop: 0;\r\n\t}\r\n.leaflet-container {\r\n\toverflow: hidden;\r\n\t}\r\n.leaflet-tile,\r\n.leaflet-marker-icon,\r\n.leaflet-marker-shadow {\r\n\t-webkit-user-select: none;\r\n\t   -moz-user-select: none;\r\n\t        user-select: none;\r\n\t  -webkit-user-drag: none;\r\n\t}\r\n/* Safari renders non-retina tile on retina better with this, but Chrome is worse */\r\n.leaflet-safari .leaflet-tile {\r\n\timage-rendering: -webkit-optimize-contrast;\r\n\t}\r\n/* hack that prevents hw layers \"stretching\" when loading new tiles */\r\n.leaflet-safari .leaflet-tile-container {\r\n\twidth: 1600px;\r\n\theight: 1600px;\r\n\t-webkit-transform-origin: 0 0;\r\n\t}\r\n.leaflet-marker-icon,\r\n.leaflet-marker-shadow {\r\n\tdisplay: block;\r\n\t}\r\n/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */\r\n/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */\r\n.leaflet-container .leaflet-overlay-pane svg,\r\n.leaflet-container .leaflet-marker-pane img,\r\n.leaflet-container .leaflet-shadow-pane img,\r\n.leaflet-container .leaflet-tile-pane img,\r\n.leaflet-container img.leaflet-image-layer {\r\n\tmax-width: none !important;\r\n\tmax-height: none !important;\r\n\t}\r\n\r\n.leaflet-container.leaflet-touch-zoom {\r\n\t-ms-touch-action: pan-x pan-y;\r\n\ttouch-action: pan-x pan-y;\r\n\t}\r\n.leaflet-container.leaflet-touch-drag {\r\n\t-ms-touch-action: pinch-zoom;\r\n\t/* Fallback for FF which doesn't support pinch-zoom */\r\n\ttouch-action: none;\r\n\ttouch-action: pinch-zoom;\r\n}\r\n.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {\r\n\t-ms-touch-action: none;\r\n\ttouch-action: none;\r\n}\r\n.leaflet-container {\r\n\t-webkit-tap-highlight-color: transparent;\r\n}\r\n.leaflet-container a {\r\n\t-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);\r\n}\r\n.leaflet-tile {\r\n\tfilter: inherit;\r\n\tvisibility: hidden;\r\n\t}\r\n.leaflet-tile-loaded {\r\n\tvisibility: inherit;\r\n\t}\r\n.leaflet-zoom-box {\r\n\twidth: 0;\r\n\theight: 0;\r\n\t-moz-box-sizing: border-box;\r\n\t     box-sizing: border-box;\r\n\tz-index: 800;\r\n\t}\r\n/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */\r\n.leaflet-overlay-pane svg {\r\n\t-moz-user-select: none;\r\n\t}\r\n\r\n.leaflet-pane         { z-index: 400; }\r\n\r\n.leaflet-tile-pane    { z-index: 200; }\r\n.leaflet-overlay-pane { z-index: 400; }\r\n.leaflet-shadow-pane  { z-index: 500; }\r\n.leaflet-marker-pane  { z-index: 600; }\r\n.leaflet-tooltip-pane   { z-index: 650; }\r\n.leaflet-popup-pane   { z-index: 700; }\r\n\r\n.leaflet-map-pane canvas { z-index: 100; }\r\n.leaflet-map-pane svg    { z-index: 200; }\r\n\r\n.leaflet-vml-shape {\r\n\twidth: 1px;\r\n\theight: 1px;\r\n\t}\r\n.lvml {\r\n\tbehavior: url(#default#VML);\r\n\tdisplay: inline-block;\r\n\tposition: absolute;\r\n\t}\r\n\r\n\r\n/* control positioning */\r\n\r\n.leaflet-control {\r\n\tposition: relative;\r\n\tz-index: 800;\r\n\tpointer-events: visiblePainted; /* IE 9-10 doesn't have auto */\r\n\tpointer-events: auto;\r\n\t}\r\n.leaflet-top,\r\n.leaflet-bottom {\r\n\tposition: absolute;\r\n\tz-index: 1000;\r\n\tpointer-events: none;\r\n\t}\r\n.leaflet-top {\r\n\ttop: 0;\r\n\t}\r\n.leaflet-right {\r\n\tright: 0;\r\n\t}\r\n.leaflet-bottom {\r\n\tbottom: 0;\r\n\t}\r\n.leaflet-left {\r\n\tleft: 0;\r\n\t}\r\n.leaflet-control {\r\n\tfloat: left;\r\n\tclear: both;\r\n\t}\r\n.leaflet-right .leaflet-control {\r\n\tfloat: right;\r\n\t}\r\n.leaflet-top .leaflet-control {\r\n\tmargin-top: 10px;\r\n\t}\r\n.leaflet-bottom .leaflet-control {\r\n\tmargin-bottom: 10px;\r\n\t}\r\n.leaflet-left .leaflet-control {\r\n\tmargin-left: 10px;\r\n\t}\r\n.leaflet-right .leaflet-control {\r\n\tmargin-right: 10px;\r\n\t}\r\n\r\n\r\n/* zoom and fade animations */\r\n\r\n.leaflet-fade-anim .leaflet-tile {\r\n\twill-change: opacity;\r\n\t}\r\n.leaflet-fade-anim .leaflet-popup {\r\n\topacity: 0;\r\n\t-webkit-transition: opacity 0.2s linear;\r\n\t   -moz-transition: opacity 0.2s linear;\r\n\t     -o-transition: opacity 0.2s linear;\r\n\t        transition: opacity 0.2s linear;\r\n\t}\r\n.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {\r\n\topacity: 1;\r\n\t}\r\n.leaflet-zoom-animated {\r\n\t-webkit-transform-origin: 0 0;\r\n\t    -ms-transform-origin: 0 0;\r\n\t        transform-origin: 0 0;\r\n\t}\r\n.leaflet-zoom-anim .leaflet-zoom-animated {\r\n\twill-change: transform;\r\n\t}\r\n.leaflet-zoom-anim .leaflet-zoom-animated {\r\n\t-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);\r\n\t   -moz-transition:    -moz-transform 0.25s cubic-bezier(0,0,0.25,1);\r\n\t     -o-transition:      -o-transform 0.25s cubic-bezier(0,0,0.25,1);\r\n\t        transition:         transform 0.25s cubic-bezier(0,0,0.25,1);\r\n\t}\r\n.leaflet-zoom-anim .leaflet-tile,\r\n.leaflet-pan-anim .leaflet-tile {\r\n\t-webkit-transition: none;\r\n\t   -moz-transition: none;\r\n\t     -o-transition: none;\r\n\t        transition: none;\r\n\t}\r\n\r\n.leaflet-zoom-anim .leaflet-zoom-hide {\r\n\tvisibility: hidden;\r\n\t}\r\n\r\n\r\n/* cursors */\r\n\r\n.leaflet-interactive {\r\n\tcursor: pointer;\r\n\t}\r\n.leaflet-grab {\r\n\tcursor: -webkit-grab;\r\n\tcursor:    -moz-grab;\r\n\t}\r\n.leaflet-crosshair,\r\n.leaflet-crosshair .leaflet-interactive {\r\n\tcursor: crosshair;\r\n\t}\r\n.leaflet-popup-pane,\r\n.leaflet-control {\r\n\tcursor: auto;\r\n\t}\r\n.leaflet-dragging .leaflet-grab,\r\n.leaflet-dragging .leaflet-grab .leaflet-interactive,\r\n.leaflet-dragging .leaflet-marker-draggable {\r\n\tcursor: move;\r\n\tcursor: -webkit-grabbing;\r\n\tcursor:    -moz-grabbing;\r\n\t}\r\n\r\n/* marker & overlays interactivity */\r\n.leaflet-marker-icon,\r\n.leaflet-marker-shadow,\r\n.leaflet-image-layer,\r\n.leaflet-pane > svg path,\r\n.leaflet-tile-container {\r\n\tpointer-events: none;\r\n\t}\r\n\r\n.leaflet-marker-icon.leaflet-interactive,\r\n.leaflet-image-layer.leaflet-interactive,\r\n.leaflet-pane > svg path.leaflet-interactive {\r\n\tpointer-events: visiblePainted; /* IE 9-10 doesn't have auto */\r\n\tpointer-events: auto;\r\n\t}\r\n\r\n/* visual tweaks */\r\n\r\n.leaflet-container {\r\n\tbackground: #ddd;\r\n\toutline: 0;\r\n\t}\r\n.leaflet-container a {\r\n\tcolor: #0078A8;\r\n\t}\r\n.leaflet-container a.leaflet-active {\r\n\toutline: 2px solid orange;\r\n\t}\r\n.leaflet-zoom-box {\r\n\tborder: 2px dotted #38f;\r\n\tbackground: rgba(255,255,255,0.5);\r\n\t}\r\n\r\n\r\n/* general typography */\r\n.leaflet-container {\r\n\tfont: 12px/1.5 \"Helvetica Neue\", Arial, Helvetica, sans-serif;\r\n\t}\r\n\r\n\r\n/* general toolbar styles */\r\n\r\n.leaflet-bar {\r\n\tbox-shadow: 0 1px 5px rgba(0,0,0,0.65);\r\n\tborder-radius: 4px;\r\n\t}\r\n.leaflet-bar a,\r\n.leaflet-bar a:hover {\r\n\tbackground-color: #fff;\r\n\tborder-bottom: 1px solid #ccc;\r\n\twidth: 26px;\r\n\theight: 26px;\r\n\tline-height: 26px;\r\n\tdisplay: block;\r\n\ttext-align: center;\r\n\ttext-decoration: none;\r\n\tcolor: black;\r\n\t}\r\n.leaflet-bar a,\r\n.leaflet-control-layers-toggle {\r\n\tbackground-position: 50% 50%;\r\n\tbackground-repeat: no-repeat;\r\n\tdisplay: block;\r\n\t}\r\n.leaflet-bar a:hover {\r\n\tbackground-color: #f4f4f4;\r\n\t}\r\n.leaflet-bar a:first-child {\r\n\tborder-top-left-radius: 4px;\r\n\tborder-top-right-radius: 4px;\r\n\t}\r\n.leaflet-bar a:last-child {\r\n\tborder-bottom-left-radius: 4px;\r\n\tborder-bottom-right-radius: 4px;\r\n\tborder-bottom: none;\r\n\t}\r\n.leaflet-bar a.leaflet-disabled {\r\n\tcursor: default;\r\n\tbackground-color: #f4f4f4;\r\n\tcolor: #bbb;\r\n\t}\r\n\r\n.leaflet-touch .leaflet-bar a {\r\n\twidth: 30px;\r\n\theight: 30px;\r\n\tline-height: 30px;\r\n\t}\r\n.leaflet-touch .leaflet-bar a:first-child {\r\n\tborder-top-left-radius: 2px;\r\n\tborder-top-right-radius: 2px;\r\n\t}\r\n.leaflet-touch .leaflet-bar a:last-child {\r\n\tborder-bottom-left-radius: 2px;\r\n\tborder-bottom-right-radius: 2px;\r\n\t}\r\n\r\n/* zoom control */\r\n\r\n.leaflet-control-zoom-in,\r\n.leaflet-control-zoom-out {\r\n\tfont: bold 18px 'Lucida Console', Monaco, monospace;\r\n\ttext-indent: 1px;\r\n\t}\r\n\r\n.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out  {\r\n\tfont-size: 22px;\r\n\t}\r\n\r\n\r\n/* layers control */\r\n\r\n.leaflet-control-layers {\r\n\tbox-shadow: 0 1px 5px rgba(0,0,0,0.4);\r\n\tbackground: #fff;\r\n\tborder-radius: 5px;\r\n\t}\r\n.leaflet-control-layers-toggle {\r\n\tbackground-image: url(images/layers.png);\r\n\twidth: 36px;\r\n\theight: 36px;\r\n\t}\r\n.leaflet-retina .leaflet-control-layers-toggle {\r\n\tbackground-image: url(images/layers-2x.png);\r\n\tbackground-size: 26px 26px;\r\n\t}\r\n.leaflet-touch .leaflet-control-layers-toggle {\r\n\twidth: 44px;\r\n\theight: 44px;\r\n\t}\r\n.leaflet-control-layers .leaflet-control-layers-list,\r\n.leaflet-control-layers-expanded .leaflet-control-layers-toggle {\r\n\tdisplay: none;\r\n\t}\r\n.leaflet-control-layers-expanded .leaflet-control-layers-list {\r\n\tdisplay: block;\r\n\tposition: relative;\r\n\t}\r\n.leaflet-control-layers-expanded {\r\n\tpadding: 6px 10px 6px 6px;\r\n\tcolor: #333;\r\n\tbackground: #fff;\r\n\t}\r\n.leaflet-control-layers-scrollbar {\r\n\toverflow-y: scroll;\r\n\toverflow-x: hidden;\r\n\tpadding-right: 5px;\r\n\t}\r\n.leaflet-control-layers-selector {\r\n\tmargin-top: 2px;\r\n\tposition: relative;\r\n\ttop: 1px;\r\n\t}\r\n.leaflet-control-layers label {\r\n\tdisplay: block;\r\n\t}\r\n.leaflet-control-layers-separator {\r\n\theight: 0;\r\n\tborder-top: 1px solid #ddd;\r\n\tmargin: 5px -10px 5px -6px;\r\n\t}\r\n\r\n/* Default icon URLs */\r\n.leaflet-default-icon-path {\r\n\tbackground-image: url(images/marker-icon.png);\r\n\t}\r\n\r\n\r\n/* attribution and scale controls */\r\n\r\n.leaflet-container .leaflet-control-attribution {\r\n\tbackground: #fff;\r\n\tbackground: rgba(255, 255, 255, 0.7);\r\n\tmargin: 0;\r\n\t}\r\n.leaflet-control-attribution,\r\n.leaflet-control-scale-line {\r\n\tpadding: 0 5px;\r\n\tcolor: #333;\r\n\t}\r\n.leaflet-control-attribution a {\r\n\ttext-decoration: none;\r\n\t}\r\n.leaflet-control-attribution a:hover {\r\n\ttext-decoration: underline;\r\n\t}\r\n.leaflet-container .leaflet-control-attribution,\r\n.leaflet-container .leaflet-control-scale {\r\n\tfont-size: 11px;\r\n\t}\r\n.leaflet-left .leaflet-control-scale {\r\n\tmargin-left: 5px;\r\n\t}\r\n.leaflet-bottom .leaflet-control-scale {\r\n\tmargin-bottom: 5px;\r\n\t}\r\n.leaflet-control-scale-line {\r\n\tborder: 2px solid #777;\r\n\tborder-top: none;\r\n\tline-height: 1.1;\r\n\tpadding: 2px 5px 1px;\r\n\tfont-size: 11px;\r\n\twhite-space: nowrap;\r\n\toverflow: hidden;\r\n\t-moz-box-sizing: border-box;\r\n\t     box-sizing: border-box;\r\n\r\n\tbackground: #fff;\r\n\tbackground: rgba(255, 255, 255, 0.5);\r\n\t}\r\n.leaflet-control-scale-line:not(:first-child) {\r\n\tborder-top: 2px solid #777;\r\n\tborder-bottom: none;\r\n\tmargin-top: -2px;\r\n\t}\r\n.leaflet-control-scale-line:not(:first-child):not(:last-child) {\r\n\tborder-bottom: 2px solid #777;\r\n\t}\r\n\r\n.leaflet-touch .leaflet-control-attribution,\r\n.leaflet-touch .leaflet-control-layers,\r\n.leaflet-touch .leaflet-bar {\r\n\tbox-shadow: none;\r\n\t}\r\n.leaflet-touch .leaflet-control-layers,\r\n.leaflet-touch .leaflet-bar {\r\n\tborder: 2px solid rgba(0,0,0,0.2);\r\n\tbackground-clip: padding-box;\r\n\t}\r\n\r\n\r\n/* popup */\r\n\r\n.leaflet-popup {\r\n\tposition: absolute;\r\n\ttext-align: center;\r\n\tmargin-bottom: 20px;\r\n\t}\r\n.leaflet-popup-content-wrapper {\r\n\tpadding: 1px;\r\n\ttext-align: left;\r\n\tborder-radius: 12px;\r\n\t}\r\n.leaflet-popup-content {\r\n\tmargin: 13px 19px;\r\n\tline-height: 1.4;\r\n\t}\r\n.leaflet-popup-content p {\r\n\tmargin: 18px 0;\r\n\t}\r\n.leaflet-popup-tip-container {\r\n\twidth: 40px;\r\n\theight: 20px;\r\n\tposition: absolute;\r\n\tleft: 50%;\r\n\tmargin-left: -20px;\r\n\toverflow: hidden;\r\n\tpointer-events: none;\r\n\t}\r\n.leaflet-popup-tip {\r\n\twidth: 17px;\r\n\theight: 17px;\r\n\tpadding: 1px;\r\n\r\n\tmargin: -10px auto 0;\r\n\r\n\t-webkit-transform: rotate(45deg);\r\n\t   -moz-transform: rotate(45deg);\r\n\t    -ms-transform: rotate(45deg);\r\n\t     -o-transform: rotate(45deg);\r\n\t        transform: rotate(45deg);\r\n\t}\r\n.leaflet-popup-content-wrapper,\r\n.leaflet-popup-tip {\r\n\tbackground: white;\r\n\tcolor: #333;\r\n\tbox-shadow: 0 3px 14px rgba(0,0,0,0.4);\r\n\t}\r\n.leaflet-container a.leaflet-popup-close-button {\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\tright: 0;\r\n\tpadding: 4px 4px 0 0;\r\n\tborder: none;\r\n\ttext-align: center;\r\n\twidth: 18px;\r\n\theight: 14px;\r\n\tfont: 16px/14px Tahoma, Verdana, sans-serif;\r\n\tcolor: #c3c3c3;\r\n\ttext-decoration: none;\r\n\tfont-weight: bold;\r\n\tbackground: transparent;\r\n\t}\r\n.leaflet-container a.leaflet-popup-close-button:hover {\r\n\tcolor: #999;\r\n\t}\r\n.leaflet-popup-scrolled {\r\n\toverflow: auto;\r\n\tborder-bottom: 1px solid #ddd;\r\n\tborder-top: 1px solid #ddd;\r\n\t}\r\n\r\n.leaflet-oldie .leaflet-popup-content-wrapper {\r\n\tzoom: 1;\r\n\t}\r\n.leaflet-oldie .leaflet-popup-tip {\r\n\twidth: 24px;\r\n\tmargin: 0 auto;\r\n\r\n\t-ms-filter: \"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)\";\r\n\tfilter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);\r\n\t}\r\n.leaflet-oldie .leaflet-popup-tip-container {\r\n\tmargin-top: -1px;\r\n\t}\r\n\r\n.leaflet-oldie .leaflet-control-zoom,\r\n.leaflet-oldie .leaflet-control-layers,\r\n.leaflet-oldie .leaflet-popup-content-wrapper,\r\n.leaflet-oldie .leaflet-popup-tip {\r\n\tborder: 1px solid #999;\r\n\t}\r\n\r\n\r\n/* div icon */\r\n\r\n.leaflet-div-icon {\r\n\tbackground: #fff;\r\n\tborder: 1px solid #666;\r\n\t}\r\n\r\n\r\n/* Tooltip */\r\n/* Base styles for the element that has a tooltip */\r\n.leaflet-tooltip {\r\n\tposition: absolute;\r\n\tpadding: 6px;\r\n\tbackground-color: #fff;\r\n\tborder: 1px solid #fff;\r\n\tborder-radius: 3px;\r\n\tcolor: #222;\r\n\twhite-space: nowrap;\r\n\t-webkit-user-select: none;\r\n\t-moz-user-select: none;\r\n\t-ms-user-select: none;\r\n\tuser-select: none;\r\n\tpointer-events: none;\r\n\tbox-shadow: 0 1px 3px rgba(0,0,0,0.4);\r\n\t}\r\n.leaflet-tooltip.leaflet-clickable {\r\n\tcursor: pointer;\r\n\tpointer-events: auto;\r\n\t}\r\n.leaflet-tooltip-top:before,\r\n.leaflet-tooltip-bottom:before,\r\n.leaflet-tooltip-left:before,\r\n.leaflet-tooltip-right:before {\r\n\tposition: absolute;\r\n\tpointer-events: none;\r\n\tborder: 6px solid transparent;\r\n\tbackground: transparent;\r\n\tcontent: \"\";\r\n\t}\r\n\r\n/* Directions */\r\n\r\n.leaflet-tooltip-bottom {\r\n\tmargin-top: 6px;\r\n}\r\n.leaflet-tooltip-top {\r\n\tmargin-top: -6px;\r\n}\r\n.leaflet-tooltip-bottom:before,\r\n.leaflet-tooltip-top:before {\r\n\tleft: 50%;\r\n\tmargin-left: -6px;\r\n\t}\r\n.leaflet-tooltip-top:before {\r\n\tbottom: 0;\r\n\tmargin-bottom: -12px;\r\n\tborder-top-color: #fff;\r\n\t}\r\n.leaflet-tooltip-bottom:before {\r\n\ttop: 0;\r\n\tmargin-top: -12px;\r\n\tmargin-left: -6px;\r\n\tborder-bottom-color: #fff;\r\n\t}\r\n.leaflet-tooltip-left {\r\n\tmargin-left: -6px;\r\n}\r\n.leaflet-tooltip-right {\r\n\tmargin-left: 6px;\r\n}\r\n.leaflet-tooltip-left:before,\r\n.leaflet-tooltip-right:before {\r\n\ttop: 50%;\r\n\tmargin-top: -6px;\r\n\t}\r\n.leaflet-tooltip-left:before {\r\n\tright: 0;\r\n\tmargin-right: -12px;\r\n\tborder-left-color: #fff;\r\n\t}\r\n.leaflet-tooltip-right:before {\r\n\tleft: 0;\r\n\tmargin-left: -12px;\r\n\tborder-right-color: #fff;\r\n\t}\r\n"
  },
  {
    "path": "vignettes/tutorials/libs/leaflet/leaflet.js",
    "content": "/* @preserve\n * Leaflet 1.3.1+Detached: ba6f97fff8647e724e4dfe66d2ed7da11f908989.ba6f97f, a JS library for interactive maps. http://leafletjs.com\n * (c) 2010-2017 Vladimir Agafonkin, (c) 2010-2011 CloudMade\n */\n!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?i(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],i):i(t.L={})}(this,function(t){\"use strict\";function i(t){var i,e,n,o;for(e=1,n=arguments.length;e<n;e++){o=arguments[e];for(i in o)t[i]=o[i]}return t}function e(t,i){var e=Array.prototype.slice;if(t.bind)return t.bind.apply(t,e.call(arguments,1));var n=e.call(arguments,2);return function(){return t.apply(i,n.length?n.concat(e.call(arguments)):arguments)}}function n(t){return t._leaflet_id=t._leaflet_id||++ti,t._leaflet_id}function o(t,i,e){var n,o,s,r;return r=function(){n=!1,o&&(s.apply(e,o),o=!1)},s=function(){n?o=arguments:(t.apply(e,arguments),setTimeout(r,i),n=!0)}}function s(t,i,e){var n=i[1],o=i[0],s=n-o;return t===n&&e?t:((t-o)%s+s)%s+o}function r(){return!1}function a(t,i){var e=Math.pow(10,void 0===i?6:i);return Math.round(t*e)/e}function h(t){return t.trim?t.trim():t.replace(/^\\s+|\\s+$/g,\"\")}function u(t){return h(t).split(/\\s+/)}function l(t,i){t.hasOwnProperty(\"options\")||(t.options=t.options?Qt(t.options):{});for(var e in i)t.options[e]=i[e];return t.options}function c(t,i,e){var n=[];for(var o in t)n.push(encodeURIComponent(e?o.toUpperCase():o)+\"=\"+encodeURIComponent(t[o]));return(i&&-1!==i.indexOf(\"?\")?\"&\":\"?\")+n.join(\"&\")}function _(t,i){return t.replace(ii,function(t,e){var n=i[e];if(void 0===n)throw new Error(\"No value provided for variable \"+t);return\"function\"==typeof n&&(n=n(i)),n})}function d(t,i){for(var e=0;e<t.length;e++)if(t[e]===i)return e;return-1}function p(t){return window[\"webkit\"+t]||window[\"moz\"+t]||window[\"ms\"+t]}function m(t){var i=+new Date,e=Math.max(0,16-(i-oi));return oi=i+e,window.setTimeout(t,e)}function f(t,i,n){if(!n||si!==m)return si.call(window,e(t,i));t.call(i)}function g(t){t&&ri.call(window,t)}function v(){}function y(t){if(\"undefined\"!=typeof L&&L&&L.Mixin){t=ei(t)?t:[t];for(var i=0;i<t.length;i++)t[i]===L.Mixin.Events&&console.warn(\"Deprecated include of L.Mixin.Events: this property will be removed in future releases, please inherit from L.Evented instead.\",(new Error).stack)}}function x(t,i,e){this.x=e?Math.round(t):t,this.y=e?Math.round(i):i}function w(t,i,e){return t instanceof x?t:ei(t)?new x(t[0],t[1]):void 0===t||null===t?t:\"object\"==typeof t&&\"x\"in t&&\"y\"in t?new x(t.x,t.y):new x(t,i,e)}function P(t,i){if(t)for(var e=i?[t,i]:t,n=0,o=e.length;n<o;n++)this.extend(e[n])}function b(t,i){return!t||t instanceof P?t:new P(t,i)}function T(t,i){if(t)for(var e=i?[t,i]:t,n=0,o=e.length;n<o;n++)this.extend(e[n])}function z(t,i){return t instanceof T?t:new T(t,i)}function M(t,i,e){if(isNaN(t)||isNaN(i))throw new Error(\"Invalid LatLng object: (\"+t+\", \"+i+\")\");this.lat=+t,this.lng=+i,void 0!==e&&(this.alt=+e)}function C(t,i,e){return t instanceof M?t:ei(t)&&\"object\"!=typeof t[0]?3===t.length?new M(t[0],t[1],t[2]):2===t.length?new M(t[0],t[1]):null:void 0===t||null===t?t:\"object\"==typeof t&&\"lat\"in t?new M(t.lat,\"lng\"in t?t.lng:t.lon,t.alt):void 0===i?null:new M(t,i,e)}function Z(t,i,e,n){if(ei(t))return this._a=t[0],this._b=t[1],this._c=t[2],void(this._d=t[3]);this._a=t,this._b=i,this._c=e,this._d=n}function S(t,i,e,n){return new Z(t,i,e,n)}function E(t){return document.createElementNS(\"http://www.w3.org/2000/svg\",t)}function k(t,i){var e,n,o,s,r,a,h=\"\";for(e=0,o=t.length;e<o;e++){for(n=0,s=(r=t[e]).length;n<s;n++)a=r[n],h+=(n?\"L\":\"M\")+a.x+\" \"+a.y;h+=i?Xi?\"z\":\"x\":\"\"}return h||\"M0 0\"}function A(t){return navigator.userAgent.toLowerCase().indexOf(t)>=0}function I(t,i,e,n){return\"touchstart\"===i?O(t,e,n):\"touchmove\"===i?W(t,e,n):\"touchend\"===i&&H(t,e,n),this}function B(t,i,e){var n=t[\"_leaflet_\"+i+e];return\"touchstart\"===i?t.removeEventListener(Qi,n,!1):\"touchmove\"===i?t.removeEventListener(te,n,!1):\"touchend\"===i&&(t.removeEventListener(ie,n,!1),t.removeEventListener(ee,n,!1)),this}function O(t,i,n){var o=e(function(t){if(\"mouse\"!==t.pointerType&&t.MSPOINTER_TYPE_MOUSE&&t.pointerType!==t.MSPOINTER_TYPE_MOUSE){if(!(ne.indexOf(t.target.tagName)<0))return;$(t)}j(t,i)});t[\"_leaflet_touchstart\"+n]=o,t.addEventListener(Qi,o,!1),se||(document.documentElement.addEventListener(Qi,R,!0),document.documentElement.addEventListener(te,D,!0),document.documentElement.addEventListener(ie,N,!0),document.documentElement.addEventListener(ee,N,!0),se=!0)}function R(t){oe[t.pointerId]=t,re++}function D(t){oe[t.pointerId]&&(oe[t.pointerId]=t)}function N(t){delete oe[t.pointerId],re--}function j(t,i){t.touches=[];for(var e in oe)t.touches.push(oe[e]);t.changedTouches=[t],i(t)}function W(t,i,e){var n=function(t){(t.pointerType!==t.MSPOINTER_TYPE_MOUSE&&\"mouse\"!==t.pointerType||0!==t.buttons)&&j(t,i)};t[\"_leaflet_touchmove\"+e]=n,t.addEventListener(te,n,!1)}function H(t,i,e){var n=function(t){j(t,i)};t[\"_leaflet_touchend\"+e]=n,t.addEventListener(ie,n,!1),t.addEventListener(ee,n,!1)}function F(t,i,e){function n(t){var i;if(Ui){if(!Pi||\"mouse\"===t.pointerType)return;i=re}else i=t.touches.length;if(!(i>1)){var e=Date.now(),n=e-(s||e);r=t.touches?t.touches[0]:t,a=n>0&&n<=h,s=e}}function o(t){if(a&&!r.cancelBubble){if(Ui){if(!Pi||\"mouse\"===t.pointerType)return;var e,n,o={};for(n in r)e=r[n],o[n]=e&&e.bind?e.bind(r):e;r=o}r.type=\"dblclick\",i(r),s=null}}var s,r,a=!1,h=250;return t[ue+ae+e]=n,t[ue+he+e]=o,t[ue+\"dblclick\"+e]=i,t.addEventListener(ae,n,!1),t.addEventListener(he,o,!1),t.addEventListener(\"dblclick\",i,!1),this}function U(t,i){var e=t[ue+ae+i],n=t[ue+he+i],o=t[ue+\"dblclick\"+i];return t.removeEventListener(ae,e,!1),t.removeEventListener(he,n,!1),Pi||t.removeEventListener(\"dblclick\",o,!1),this}function V(t,i,e,n){if(\"object\"==typeof i)for(var o in i)G(t,o,i[o],e);else for(var s=0,r=(i=u(i)).length;s<r;s++)G(t,i[s],e,n);return this}function q(t,i,e,n){if(\"object\"==typeof i)for(var o in i)K(t,o,i[o],e);else if(i)for(var s=0,r=(i=u(i)).length;s<r;s++)K(t,i[s],e,n);else{for(var a in t[le])K(t,a,t[le][a]);delete t[le]}return this}function G(t,i,e,o){var s=i+n(e)+(o?\"_\"+n(o):\"\");if(t[le]&&t[le][s])return this;var r=function(i){return e.call(o||t,i||window.event)},a=r;Ui&&0===i.indexOf(\"touch\")?I(t,i,r,s):!Vi||\"dblclick\"!==i||!F||Ui&&Si?\"addEventListener\"in t?\"mousewheel\"===i?t.addEventListener(\"onwheel\"in t?\"wheel\":\"mousewheel\",r,!1):\"mouseenter\"===i||\"mouseleave\"===i?(r=function(i){i=i||window.event,ot(t,i)&&a(i)},t.addEventListener(\"mouseenter\"===i?\"mouseover\":\"mouseout\",r,!1)):(\"click\"===i&&Ti&&(r=function(t){st(t,a)}),t.addEventListener(i,r,!1)):\"attachEvent\"in t&&t.attachEvent(\"on\"+i,r):F(t,r,s),t[le]=t[le]||{},t[le][s]=r}function K(t,i,e,o){var s=i+n(e)+(o?\"_\"+n(o):\"\"),r=t[le]&&t[le][s];if(!r)return this;Ui&&0===i.indexOf(\"touch\")?B(t,i,s):!Vi||\"dblclick\"!==i||!U||Ui&&Si?\"removeEventListener\"in t?\"mousewheel\"===i?t.removeEventListener(\"onwheel\"in t?\"wheel\":\"mousewheel\",r,!1):t.removeEventListener(\"mouseenter\"===i?\"mouseover\":\"mouseleave\"===i?\"mouseout\":i,r,!1):\"detachEvent\"in t&&t.detachEvent(\"on\"+i,r):U(t,s),t[le][s]=null}function Y(t){return t.stopPropagation?t.stopPropagation():t.originalEvent?t.originalEvent._stopped=!0:t.cancelBubble=!0,nt(t),this}function X(t){return G(t,\"mousewheel\",Y),this}function J(t){return V(t,\"mousedown touchstart dblclick\",Y),G(t,\"click\",et),this}function $(t){return t.preventDefault?t.preventDefault():t.returnValue=!1,this}function Q(t){return $(t),Y(t),this}function tt(t,i){if(!i)return new x(t.clientX,t.clientY);var e=i.getBoundingClientRect(),n=e.width/i.offsetWidth||1,o=e.height/i.offsetHeight||1;return new x(t.clientX/n-e.left-i.clientLeft,t.clientY/o-e.top-i.clientTop)}function it(t){return Pi?t.wheelDeltaY/2:t.deltaY&&0===t.deltaMode?-t.deltaY/ce:t.deltaY&&1===t.deltaMode?20*-t.deltaY:t.deltaY&&2===t.deltaMode?60*-t.deltaY:t.deltaX||t.deltaZ?0:t.wheelDelta?(t.wheelDeltaY||t.wheelDelta)/2:t.detail&&Math.abs(t.detail)<32765?20*-t.detail:t.detail?t.detail/-32765*60:0}function et(t){_e[t.type]=!0}function nt(t){var i=_e[t.type];return _e[t.type]=!1,i}function ot(t,i){var e=i.relatedTarget;if(!e)return!0;try{for(;e&&e!==t;)e=e.parentNode}catch(t){return!1}return e!==t}function st(t,i){var e=t.timeStamp||t.originalEvent&&t.originalEvent.timeStamp,n=pi&&e-pi;n&&n>100&&n<500||t.target._simulatedClick&&!t._simulated?Q(t):(pi=e,i(t))}function rt(t){return\"string\"==typeof t?document.getElementById(t):t}function at(t,i){var e=t.style[i]||t.currentStyle&&t.currentStyle[i];if((!e||\"auto\"===e)&&document.defaultView){var n=document.defaultView.getComputedStyle(t,null);e=n?n[i]:null}return\"auto\"===e?null:e}function ht(t,i,e){var n=document.createElement(t);return n.className=i||\"\",e&&e.appendChild(n),n}function ut(t){var i=t.parentNode;i&&i.removeChild(t)}function lt(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function ct(t){var i=t.parentNode;i.lastChild!==t&&i.appendChild(t)}function _t(t){var i=t.parentNode;i.firstChild!==t&&i.insertBefore(t,i.firstChild)}function dt(t,i){if(void 0!==t.classList)return t.classList.contains(i);var e=gt(t);return e.length>0&&new RegExp(\"(^|\\\\s)\"+i+\"(\\\\s|$)\").test(e)}function pt(t,i){if(void 0!==t.classList)for(var e=u(i),n=0,o=e.length;n<o;n++)t.classList.add(e[n]);else if(!dt(t,i)){var s=gt(t);ft(t,(s?s+\" \":\"\")+i)}}function mt(t,i){void 0!==t.classList?t.classList.remove(i):ft(t,h((\" \"+gt(t)+\" \").replace(\" \"+i+\" \",\" \")))}function ft(t,i){void 0===t.className.baseVal?t.className=i:t.className.baseVal=i}function gt(t){return void 0===t.className.baseVal?t.className:t.className.baseVal}function vt(t,i){\"opacity\"in t.style?t.style.opacity=i:\"filter\"in t.style&&yt(t,i)}function yt(t,i){var e=!1,n=\"DXImageTransform.Microsoft.Alpha\";try{e=t.filters.item(n)}catch(t){if(1===i)return}i=Math.round(100*i),e?(e.Enabled=100!==i,e.Opacity=i):t.style.filter+=\" progid:\"+n+\"(opacity=\"+i+\")\"}function xt(t){for(var i=document.documentElement.style,e=0;e<t.length;e++)if(t[e]in i)return t[e];return!1}function wt(t,i,e){var n=i||new x(0,0);t.style[pe]=(Oi?\"translate(\"+n.x+\"px,\"+n.y+\"px)\":\"translate3d(\"+n.x+\"px,\"+n.y+\"px,0)\")+(e?\" scale(\"+e+\")\":\"\")}function Lt(t,i){t._leaflet_pos=i,Ni?wt(t,i):(t.style.left=i.x+\"px\",t.style.top=i.y+\"px\")}function Pt(t){return t._leaflet_pos||new x(0,0)}function bt(){V(window,\"dragstart\",$)}function Tt(){q(window,\"dragstart\",$)}function zt(t){for(;-1===t.tabIndex;)t=t.parentNode;t.style&&(Mt(),ve=t,ye=t.style.outline,t.style.outline=\"none\",V(window,\"keydown\",Mt))}function Mt(){ve&&(ve.style.outline=ye,ve=void 0,ye=void 0,q(window,\"keydown\",Mt))}function Ct(t,i){if(!i||!t.length)return t.slice();var e=i*i;return t=kt(t,e),t=St(t,e)}function Zt(t,i,e){return Math.sqrt(Rt(t,i,e,!0))}function St(t,i){var e=t.length,n=new(typeof Uint8Array!=void 0+\"\"?Uint8Array:Array)(e);n[0]=n[e-1]=1,Et(t,n,i,0,e-1);var o,s=[];for(o=0;o<e;o++)n[o]&&s.push(t[o]);return s}function Et(t,i,e,n,o){var s,r,a,h=0;for(r=n+1;r<=o-1;r++)(a=Rt(t[r],t[n],t[o],!0))>h&&(s=r,h=a);h>e&&(i[s]=1,Et(t,i,e,n,s),Et(t,i,e,s,o))}function kt(t,i){for(var e=[t[0]],n=1,o=0,s=t.length;n<s;n++)Ot(t[n],t[o])>i&&(e.push(t[n]),o=n);return o<s-1&&e.push(t[s-1]),e}function At(t,i,e,n,o){var s,r,a,h=n?Se:Bt(t,e),u=Bt(i,e);for(Se=u;;){if(!(h|u))return[t,i];if(h&u)return!1;a=Bt(r=It(t,i,s=h||u,e,o),e),s===h?(t=r,h=a):(i=r,u=a)}}function It(t,i,e,n,o){var s,r,a=i.x-t.x,h=i.y-t.y,u=n.min,l=n.max;return 8&e?(s=t.x+a*(l.y-t.y)/h,r=l.y):4&e?(s=t.x+a*(u.y-t.y)/h,r=u.y):2&e?(s=l.x,r=t.y+h*(l.x-t.x)/a):1&e&&(s=u.x,r=t.y+h*(u.x-t.x)/a),new x(s,r,o)}function Bt(t,i){var e=0;return t.x<i.min.x?e|=1:t.x>i.max.x&&(e|=2),t.y<i.min.y?e|=4:t.y>i.max.y&&(e|=8),e}function Ot(t,i){var e=i.x-t.x,n=i.y-t.y;return e*e+n*n}function Rt(t,i,e,n){var o,s=i.x,r=i.y,a=e.x-s,h=e.y-r,u=a*a+h*h;return u>0&&((o=((t.x-s)*a+(t.y-r)*h)/u)>1?(s=e.x,r=e.y):o>0&&(s+=a*o,r+=h*o)),a=t.x-s,h=t.y-r,n?a*a+h*h:new x(s,r)}function Dt(t){return!ei(t[0])||\"object\"!=typeof t[0][0]&&void 0!==t[0][0]}function Nt(t){return console.warn(\"Deprecated use of _flat, please use L.LineUtil.isFlat instead.\"),Dt(t)}function jt(t,i,e){var n,o,s,r,a,h,u,l,c,_=[1,4,2,8];for(o=0,u=t.length;o<u;o++)t[o]._code=Bt(t[o],i);for(r=0;r<4;r++){for(l=_[r],n=[],o=0,s=(u=t.length)-1;o<u;s=o++)a=t[o],h=t[s],a._code&l?h._code&l||((c=It(h,a,l,i,e))._code=Bt(c,i),n.push(c)):(h._code&l&&((c=It(h,a,l,i,e))._code=Bt(c,i),n.push(c)),n.push(a));t=n}return t}function Wt(t,i){var e,n,o,s,r=\"Feature\"===t.type?t.geometry:t,a=r?r.coordinates:null,h=[],u=i&&i.pointToLayer,l=i&&i.coordsToLatLng||Ht;if(!a&&!r)return null;switch(r.type){case\"Point\":return e=l(a),u?u(t,e):new Xe(e);case\"MultiPoint\":for(o=0,s=a.length;o<s;o++)e=l(a[o]),h.push(u?u(t,e):new Xe(e));return new qe(h);case\"LineString\":case\"MultiLineString\":return n=Ft(a,\"LineString\"===r.type?0:1,l),new tn(n,i);case\"Polygon\":case\"MultiPolygon\":return n=Ft(a,\"Polygon\"===r.type?1:2,l),new en(n,i);case\"GeometryCollection\":for(o=0,s=r.geometries.length;o<s;o++){var c=Wt({geometry:r.geometries[o],type:\"Feature\",properties:t.properties},i);c&&h.push(c)}return new qe(h);default:throw new Error(\"Invalid GeoJSON object.\")}}function Ht(t){return new M(t[1],t[0],t[2])}function Ft(t,i,e){for(var n,o=[],s=0,r=t.length;s<r;s++)n=i?Ft(t[s],i-1,e):(e||Ht)(t[s]),o.push(n);return o}function Ut(t,i){return i=\"number\"==typeof i?i:6,void 0!==t.alt?[a(t.lng,i),a(t.lat,i),a(t.alt,i)]:[a(t.lng,i),a(t.lat,i)]}function Vt(t,i,e,n){for(var o=[],s=0,r=t.length;s<r;s++)o.push(i?Vt(t[s],i-1,e,n):Ut(t[s],n));return!i&&e&&o.push(o[0]),o}function qt(t,e){return t.feature?i({},t.feature,{geometry:e}):Gt(e)}function Gt(t){return\"Feature\"===t.type||\"FeatureCollection\"===t.type?t:{type:\"Feature\",properties:{},geometry:t}}function Kt(t,i){return new nn(t,i)}function Yt(t,i){return new dn(t,i)}function Xt(t){return Yi?new fn(t):null}function Jt(t){return Xi||Ji?new xn(t):null}var $t=Object.freeze;Object.freeze=function(t){return t};var Qt=Object.create||function(){function t(){}return function(i){return t.prototype=i,new t}}(),ti=0,ii=/\\{ *([\\w_-]+) *\\}/g,ei=Array.isArray||function(t){return\"[object Array]\"===Object.prototype.toString.call(t)},ni=\"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=\",oi=0,si=window.requestAnimationFrame||p(\"RequestAnimationFrame\")||m,ri=window.cancelAnimationFrame||p(\"CancelAnimationFrame\")||p(\"CancelRequestAnimationFrame\")||function(t){window.clearTimeout(t)},ai=(Object.freeze||Object)({freeze:$t,extend:i,create:Qt,bind:e,lastId:ti,stamp:n,throttle:o,wrapNum:s,falseFn:r,formatNum:a,trim:h,splitWords:u,setOptions:l,getParamString:c,template:_,isArray:ei,indexOf:d,emptyImageUrl:ni,requestFn:si,cancelFn:ri,requestAnimFrame:f,cancelAnimFrame:g});v.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this.callInitHooks()},n=e.__super__=this.prototype,o=Qt(n);o.constructor=e,e.prototype=o;for(var s in this)this.hasOwnProperty(s)&&\"prototype\"!==s&&\"__super__\"!==s&&(e[s]=this[s]);return t.statics&&(i(e,t.statics),delete t.statics),t.includes&&(y(t.includes),i.apply(null,[o].concat(t.includes)),delete t.includes),o.options&&(t.options=i(Qt(o.options),t.options)),i(o,t),o._initHooks=[],o.callInitHooks=function(){if(!this._initHooksCalled){n.callInitHooks&&n.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,i=o._initHooks.length;t<i;t++)o._initHooks[t].call(this)}},e},v.include=function(t){return i(this.prototype,t),this},v.mergeOptions=function(t){return i(this.prototype.options,t),this},v.addInitHook=function(t){var i=Array.prototype.slice.call(arguments,1),e=\"function\"==typeof t?t:function(){this[t].apply(this,i)};return this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(e),this};var hi={on:function(t,i,e){if(\"object\"==typeof t)for(var n in t)this._on(n,t[n],i);else for(var o=0,s=(t=u(t)).length;o<s;o++)this._on(t[o],i,e);return this},off:function(t,i,e){if(t)if(\"object\"==typeof t)for(var n in t)this._off(n,t[n],i);else for(var o=0,s=(t=u(t)).length;o<s;o++)this._off(t[o],i,e);else delete this._events;return this},_on:function(t,i,e){this._events=this._events||{};var n=this._events[t];n||(n=[],this._events[t]=n),e===this&&(e=void 0);for(var o={fn:i,ctx:e},s=n,r=0,a=s.length;r<a;r++)if(s[r].fn===i&&s[r].ctx===e)return;s.push(o)},_off:function(t,i,e){var n,o,s;if(this._events&&(n=this._events[t]))if(i){if(e===this&&(e=void 0),n)for(o=0,s=n.length;o<s;o++){var a=n[o];if(a.ctx===e&&a.fn===i)return a.fn=r,this._firingCount&&(this._events[t]=n=n.slice()),void n.splice(o,1)}}else{for(o=0,s=n.length;o<s;o++)n[o].fn=r;delete this._events[t]}},fire:function(t,e,n){if(!this.listens(t,n))return this;var o=i({},e,{type:t,target:this,sourceTarget:e&&e.sourceTarget||this});if(this._events){var s=this._events[t];if(s){this._firingCount=this._firingCount+1||1;for(var r=0,a=s.length;r<a;r++){var h=s[r];h.fn.call(h.ctx||this,o)}this._firingCount--}}return n&&this._propagateEvent(o),this},listens:function(t,i){var e=this._events&&this._events[t];if(e&&e.length)return!0;if(i)for(var n in this._eventParents)if(this._eventParents[n].listens(t,i))return!0;return!1},once:function(t,i,n){if(\"object\"==typeof t){for(var o in t)this.once(o,t[o],i);return this}var s=e(function(){this.off(t,i,n).off(t,s,n)},this);return this.on(t,i,n).on(t,s,n)},addEventParent:function(t){return this._eventParents=this._eventParents||{},this._eventParents[n(t)]=t,this},removeEventParent:function(t){return this._eventParents&&delete this._eventParents[n(t)],this},_propagateEvent:function(t){for(var e in this._eventParents)this._eventParents[e].fire(t.type,i({layer:t.target,propagatedFrom:t.target},t),!0)}};hi.addEventListener=hi.on,hi.removeEventListener=hi.clearAllEventListeners=hi.off,hi.addOneTimeEventListener=hi.once,hi.fireEvent=hi.fire,hi.hasEventListeners=hi.listens;var ui=v.extend(hi),li=Math.trunc||function(t){return t>0?Math.floor(t):Math.ceil(t)};x.prototype={clone:function(){return new x(this.x,this.y)},add:function(t){return this.clone()._add(w(t))},_add:function(t){return this.x+=t.x,this.y+=t.y,this},subtract:function(t){return this.clone()._subtract(w(t))},_subtract:function(t){return this.x-=t.x,this.y-=t.y,this},divideBy:function(t){return this.clone()._divideBy(t)},_divideBy:function(t){return this.x/=t,this.y/=t,this},multiplyBy:function(t){return this.clone()._multiplyBy(t)},_multiplyBy:function(t){return this.x*=t,this.y*=t,this},scaleBy:function(t){return new x(this.x*t.x,this.y*t.y)},unscaleBy:function(t){return new x(this.x/t.x,this.y/t.y)},round:function(){return this.clone()._round()},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},floor:function(){return this.clone()._floor()},_floor:function(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this},ceil:function(){return this.clone()._ceil()},_ceil:function(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this},trunc:function(){return this.clone()._trunc()},_trunc:function(){return this.x=li(this.x),this.y=li(this.y),this},distanceTo:function(t){var i=(t=w(t)).x-this.x,e=t.y-this.y;return Math.sqrt(i*i+e*e)},equals:function(t){return(t=w(t)).x===this.x&&t.y===this.y},contains:function(t){return t=w(t),Math.abs(t.x)<=Math.abs(this.x)&&Math.abs(t.y)<=Math.abs(this.y)},toString:function(){return\"Point(\"+a(this.x)+\", \"+a(this.y)+\")\"}},P.prototype={extend:function(t){return t=w(t),this.min||this.max?(this.min.x=Math.min(t.x,this.min.x),this.max.x=Math.max(t.x,this.max.x),this.min.y=Math.min(t.y,this.min.y),this.max.y=Math.max(t.y,this.max.y)):(this.min=t.clone(),this.max=t.clone()),this},getCenter:function(t){return new x((this.min.x+this.max.x)/2,(this.min.y+this.max.y)/2,t)},getBottomLeft:function(){return new x(this.min.x,this.max.y)},getTopRight:function(){return new x(this.max.x,this.min.y)},getTopLeft:function(){return this.min},getBottomRight:function(){return this.max},getSize:function(){return this.max.subtract(this.min)},contains:function(t){var i,e;return(t=\"number\"==typeof t[0]||t instanceof x?w(t):b(t))instanceof P?(i=t.min,e=t.max):i=e=t,i.x>=this.min.x&&e.x<=this.max.x&&i.y>=this.min.y&&e.y<=this.max.y},intersects:function(t){t=b(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>=i.x&&n.x<=e.x,r=o.y>=i.y&&n.y<=e.y;return s&&r},overlaps:function(t){t=b(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>i.x&&n.x<e.x,r=o.y>i.y&&n.y<e.y;return s&&r},isValid:function(){return!(!this.min||!this.max)}},T.prototype={extend:function(t){var i,e,n=this._southWest,o=this._northEast;if(t instanceof M)i=t,e=t;else{if(!(t instanceof T))return t?this.extend(C(t)||z(t)):this;if(i=t._southWest,e=t._northEast,!i||!e)return this}return n||o?(n.lat=Math.min(i.lat,n.lat),n.lng=Math.min(i.lng,n.lng),o.lat=Math.max(e.lat,o.lat),o.lng=Math.max(e.lng,o.lng)):(this._southWest=new M(i.lat,i.lng),this._northEast=new M(e.lat,e.lng)),this},pad:function(t){var i=this._southWest,e=this._northEast,n=Math.abs(i.lat-e.lat)*t,o=Math.abs(i.lng-e.lng)*t;return new T(new M(i.lat-n,i.lng-o),new M(e.lat+n,e.lng+o))},getCenter:function(){return new M((this._southWest.lat+this._northEast.lat)/2,(this._southWest.lng+this._northEast.lng)/2)},getSouthWest:function(){return this._southWest},getNorthEast:function(){return this._northEast},getNorthWest:function(){return new M(this.getNorth(),this.getWest())},getSouthEast:function(){return new M(this.getSouth(),this.getEast())},getWest:function(){return this._southWest.lng},getSouth:function(){return this._southWest.lat},getEast:function(){return this._northEast.lng},getNorth:function(){return this._northEast.lat},contains:function(t){t=\"number\"==typeof t[0]||t instanceof M||\"lat\"in t?C(t):z(t);var i,e,n=this._southWest,o=this._northEast;return t instanceof T?(i=t.getSouthWest(),e=t.getNorthEast()):i=e=t,i.lat>=n.lat&&e.lat<=o.lat&&i.lng>=n.lng&&e.lng<=o.lng},intersects:function(t){t=z(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>=i.lat&&n.lat<=e.lat,r=o.lng>=i.lng&&n.lng<=e.lng;return s&&r},overlaps:function(t){t=z(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>i.lat&&n.lat<e.lat,r=o.lng>i.lng&&n.lng<e.lng;return s&&r},toBBoxString:function(){return[this.getWest(),this.getSouth(),this.getEast(),this.getNorth()].join(\",\")},equals:function(t,i){return!!t&&(t=z(t),this._southWest.equals(t.getSouthWest(),i)&&this._northEast.equals(t.getNorthEast(),i))},isValid:function(){return!(!this._southWest||!this._northEast)}},M.prototype={equals:function(t,i){return!!t&&(t=C(t),Math.max(Math.abs(this.lat-t.lat),Math.abs(this.lng-t.lng))<=(void 0===i?1e-9:i))},toString:function(t){return\"LatLng(\"+a(this.lat,t)+\", \"+a(this.lng,t)+\")\"},distanceTo:function(t){return _i.distance(this,C(t))},wrap:function(){return _i.wrapLatLng(this)},toBounds:function(t){var i=180*t/40075017,e=i/Math.cos(Math.PI/180*this.lat);return z([this.lat-i,this.lng-e],[this.lat+i,this.lng+e])},clone:function(){return new M(this.lat,this.lng,this.alt)}};var ci={latLngToPoint:function(t,i){var e=this.projection.project(t),n=this.scale(i);return this.transformation._transform(e,n)},pointToLatLng:function(t,i){var e=this.scale(i),n=this.transformation.untransform(t,e);return this.projection.unproject(n)},project:function(t){return this.projection.project(t)},unproject:function(t){return this.projection.unproject(t)},scale:function(t){return 256*Math.pow(2,t)},zoom:function(t){return Math.log(t/256)/Math.LN2},getProjectedBounds:function(t){if(this.infinite)return null;var i=this.projection.bounds,e=this.scale(t);return new P(this.transformation.transform(i.min,e),this.transformation.transform(i.max,e))},infinite:!1,wrapLatLng:function(t){var i=this.wrapLng?s(t.lng,this.wrapLng,!0):t.lng;return new M(this.wrapLat?s(t.lat,this.wrapLat,!0):t.lat,i,t.alt)},wrapLatLngBounds:function(t){var i=t.getCenter(),e=this.wrapLatLng(i),n=i.lat-e.lat,o=i.lng-e.lng;if(0===n&&0===o)return t;var s=t.getSouthWest(),r=t.getNorthEast();return new T(new M(s.lat-n,s.lng-o),new M(r.lat-n,r.lng-o))}},_i=i({},ci,{wrapLng:[-180,180],R:6371e3,distance:function(t,i){var e=Math.PI/180,n=t.lat*e,o=i.lat*e,s=Math.sin((i.lat-t.lat)*e/2),r=Math.sin((i.lng-t.lng)*e/2),a=s*s+Math.cos(n)*Math.cos(o)*r*r,h=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));return this.R*h}}),di={R:6378137,MAX_LATITUDE:85.0511287798,project:function(t){var i=Math.PI/180,e=this.MAX_LATITUDE,n=Math.max(Math.min(e,t.lat),-e),o=Math.sin(n*i);return new x(this.R*t.lng*i,this.R*Math.log((1+o)/(1-o))/2)},unproject:function(t){var i=180/Math.PI;return new M((2*Math.atan(Math.exp(t.y/this.R))-Math.PI/2)*i,t.x*i/this.R)},bounds:function(){var t=6378137*Math.PI;return new P([-t,-t],[t,t])}()};Z.prototype={transform:function(t,i){return this._transform(t.clone(),i)},_transform:function(t,i){return i=i||1,t.x=i*(this._a*t.x+this._b),t.y=i*(this._c*t.y+this._d),t},untransform:function(t,i){return i=i||1,new x((t.x/i-this._b)/this._a,(t.y/i-this._d)/this._c)}};var pi,mi,fi,gi,vi=i({},_i,{code:\"EPSG:3857\",projection:di,transformation:function(){var t=.5/(Math.PI*di.R);return S(t,.5,-t,.5)}()}),yi=i({},vi,{code:\"EPSG:900913\"}),xi=document.documentElement.style,wi=\"ActiveXObject\"in window,Li=wi&&!document.addEventListener,Pi=\"msLaunchUri\"in navigator&&!(\"documentMode\"in document),bi=A(\"webkit\"),Ti=A(\"android\"),zi=A(\"android 2\")||A(\"android 3\"),Mi=parseInt(/WebKit\\/([0-9]+)|$/.exec(navigator.userAgent)[1],10),Ci=Ti&&A(\"Google\")&&Mi<537&&!(\"AudioNode\"in window),Zi=!!window.opera,Si=A(\"chrome\"),Ei=A(\"gecko\")&&!bi&&!Zi&&!wi,ki=!Si&&A(\"safari\"),Ai=A(\"phantom\"),Ii=\"OTransition\"in xi,Bi=0===navigator.platform.indexOf(\"Win\"),Oi=wi&&\"transition\"in xi,Ri=\"WebKitCSSMatrix\"in window&&\"m11\"in new window.WebKitCSSMatrix&&!zi,Di=\"MozPerspective\"in xi,Ni=!window.L_DISABLE_3D&&(Oi||Ri||Di)&&!Ii&&!Ai,ji=\"undefined\"!=typeof orientation||A(\"mobile\"),Wi=ji&&bi,Hi=ji&&Ri,Fi=!window.PointerEvent&&window.MSPointerEvent,Ui=!(!window.PointerEvent&&!Fi),Vi=!window.L_NO_TOUCH&&(Ui||\"ontouchstart\"in window||window.DocumentTouch&&document instanceof window.DocumentTouch),qi=ji&&Zi,Gi=ji&&Ei,Ki=(window.devicePixelRatio||window.screen.deviceXDPI/window.screen.logicalXDPI)>1,Yi=!!document.createElement(\"canvas\").getContext,Xi=!(!document.createElementNS||!E(\"svg\").createSVGRect),Ji=!Xi&&function(){try{var t=document.createElement(\"div\");t.innerHTML='<v:shape adj=\"1\"/>';var i=t.firstChild;return i.style.behavior=\"url(#default#VML)\",i&&\"object\"==typeof i.adj}catch(t){return!1}}(),$i=(Object.freeze||Object)({ie:wi,ielt9:Li,edge:Pi,webkit:bi,android:Ti,android23:zi,androidStock:Ci,opera:Zi,chrome:Si,gecko:Ei,safari:ki,phantom:Ai,opera12:Ii,win:Bi,ie3d:Oi,webkit3d:Ri,gecko3d:Di,any3d:Ni,mobile:ji,mobileWebkit:Wi,mobileWebkit3d:Hi,msPointer:Fi,pointer:Ui,touch:Vi,mobileOpera:qi,mobileGecko:Gi,retina:Ki,canvas:Yi,svg:Xi,vml:Ji}),Qi=Fi?\"MSPointerDown\":\"pointerdown\",te=Fi?\"MSPointerMove\":\"pointermove\",ie=Fi?\"MSPointerUp\":\"pointerup\",ee=Fi?\"MSPointerCancel\":\"pointercancel\",ne=[\"INPUT\",\"SELECT\",\"OPTION\"],oe={},se=!1,re=0,ae=Fi?\"MSPointerDown\":Ui?\"pointerdown\":\"touchstart\",he=Fi?\"MSPointerUp\":Ui?\"pointerup\":\"touchend\",ue=\"_leaflet_\",le=\"_leaflet_events\",ce=Bi&&Si?2*window.devicePixelRatio:Ei?window.devicePixelRatio:1,_e={},de=(Object.freeze||Object)({on:V,off:q,stopPropagation:Y,disableScrollPropagation:X,disableClickPropagation:J,preventDefault:$,stop:Q,getMousePosition:tt,getWheelDelta:it,fakeStop:et,skipped:nt,isExternalTarget:ot,addListener:V,removeListener:q}),pe=xt([\"transform\",\"WebkitTransform\",\"OTransform\",\"MozTransform\",\"msTransform\"]),me=xt([\"webkitTransition\",\"transition\",\"OTransition\",\"MozTransition\",\"msTransition\"]),fe=\"webkitTransition\"===me||\"OTransition\"===me?me+\"End\":\"transitionend\";if(\"onselectstart\"in document)mi=function(){V(window,\"selectstart\",$)},fi=function(){q(window,\"selectstart\",$)};else{var ge=xt([\"userSelect\",\"WebkitUserSelect\",\"OUserSelect\",\"MozUserSelect\",\"msUserSelect\"]);mi=function(){if(ge){var t=document.documentElement.style;gi=t[ge],t[ge]=\"none\"}},fi=function(){ge&&(document.documentElement.style[ge]=gi,gi=void 0)}}var ve,ye,xe=(Object.freeze||Object)({TRANSFORM:pe,TRANSITION:me,TRANSITION_END:fe,get:rt,getStyle:at,create:ht,remove:ut,empty:lt,toFront:ct,toBack:_t,hasClass:dt,addClass:pt,removeClass:mt,setClass:ft,getClass:gt,setOpacity:vt,testProp:xt,setTransform:wt,setPosition:Lt,getPosition:Pt,disableTextSelection:mi,enableTextSelection:fi,disableImageDrag:bt,enableImageDrag:Tt,preventOutline:zt,restoreOutline:Mt}),we=ui.extend({run:function(t,i,e,n){this.stop(),this._el=t,this._inProgress=!0,this._duration=e||.25,this._easeOutPower=1/Math.max(n||.5,.2),this._startPos=Pt(t),this._offset=i.subtract(this._startPos),this._startTime=+new Date,this.fire(\"start\"),this._animate()},stop:function(){this._inProgress&&(this._step(!0),this._complete())},_animate:function(){this._animId=f(this._animate,this),this._step()},_step:function(t){var i=+new Date-this._startTime,e=1e3*this._duration;i<e?this._runFrame(this._easeOut(i/e),t):(this._runFrame(1),this._complete())},_runFrame:function(t,i){var e=this._startPos.add(this._offset.multiplyBy(t));i&&e._round(),Lt(this._el,e),this.fire(\"step\")},_complete:function(){g(this._animId),this._inProgress=!1,this.fire(\"end\")},_easeOut:function(t){return 1-Math.pow(1-t,this._easeOutPower)}}),Le=ui.extend({options:{crs:vi,center:void 0,zoom:void 0,minZoom:void 0,maxZoom:void 0,layers:[],maxBounds:void 0,renderer:void 0,zoomAnimation:!0,zoomAnimationThreshold:4,fadeAnimation:!0,markerZoomAnimation:!0,transform3DLimit:8388608,zoomSnap:1,zoomDelta:1,trackResize:!0},initialize:function(t,i){i=l(this,i),this._initContainer(t),this._initLayout(),this._onResize=e(this._onResize,this),this._initEvents(),i.maxBounds&&this.setMaxBounds(i.maxBounds),void 0!==i.zoom&&(this._zoom=this._limitZoom(i.zoom)),i.center&&void 0!==i.zoom&&this.setView(C(i.center),i.zoom,{reset:!0}),this._handlers=[],this._layers={},this._zoomBoundLayers={},this._sizeChanged=!0,this.callInitHooks(),this._zoomAnimated=me&&Ni&&!qi&&this.options.zoomAnimation,this._zoomAnimated&&(this._createAnimProxy(),V(this._proxy,fe,this._catchTransitionEnd,this)),this._addLayers(this.options.layers)},setView:function(t,e,n){return e=void 0===e?this._zoom:this._limitZoom(e),t=this._limitCenter(C(t),e,this.options.maxBounds),n=n||{},this._stop(),this._loaded&&!n.reset&&!0!==n&&(void 0!==n.animate&&(n.zoom=i({animate:n.animate},n.zoom),n.pan=i({animate:n.animate,duration:n.duration},n.pan)),this._zoom!==e?this._tryAnimatedZoom&&this._tryAnimatedZoom(t,e,n.zoom):this._tryAnimatedPan(t,n.pan))?(clearTimeout(this._sizeTimer),this):(this._resetView(t,e),this)},setZoom:function(t,i){return this._loaded?this.setView(this.getCenter(),t,{zoom:i}):(this._zoom=t,this)},zoomIn:function(t,i){return t=t||(Ni?this.options.zoomDelta:1),this.setZoom(this._zoom+t,i)},zoomOut:function(t,i){return t=t||(Ni?this.options.zoomDelta:1),this.setZoom(this._zoom-t,i)},setZoomAround:function(t,i,e){var n=this.getZoomScale(i),o=this.getSize().divideBy(2),s=(t instanceof x?t:this.latLngToContainerPoint(t)).subtract(o).multiplyBy(1-1/n),r=this.containerPointToLatLng(o.add(s));return this.setView(r,i,{zoom:e})},_getBoundsCenterZoom:function(t,i){i=i||{},t=t.getBounds?t.getBounds():z(t);var e=w(i.paddingTopLeft||i.padding||[0,0]),n=w(i.paddingBottomRight||i.padding||[0,0]),o=this.getBoundsZoom(t,!1,e.add(n));if((o=\"number\"==typeof i.maxZoom?Math.min(i.maxZoom,o):o)===1/0)return{center:t.getCenter(),zoom:o};var s=n.subtract(e).divideBy(2),r=this.project(t.getSouthWest(),o),a=this.project(t.getNorthEast(),o);return{center:this.unproject(r.add(a).divideBy(2).add(s),o),zoom:o}},fitBounds:function(t,i){if(!(t=z(t)).isValid())throw new Error(\"Bounds are not valid.\");var e=this._getBoundsCenterZoom(t,i);return this.setView(e.center,e.zoom,i)},fitWorld:function(t){return this.fitBounds([[-90,-180],[90,180]],t)},panTo:function(t,i){return this.setView(t,this._zoom,{pan:i})},panBy:function(t,i){if(t=w(t).round(),i=i||{},!t.x&&!t.y)return this.fire(\"moveend\");if(!0!==i.animate&&!this.getSize().contains(t))return this._resetView(this.unproject(this.project(this.getCenter()).add(t)),this.getZoom()),this;if(this._panAnim||(this._panAnim=new we,this._panAnim.on({step:this._onPanTransitionStep,end:this._onPanTransitionEnd},this)),i.noMoveStart||this.fire(\"movestart\"),!1!==i.animate){pt(this._mapPane,\"leaflet-pan-anim\");var e=this._getMapPanePos().subtract(t).round();this._panAnim.run(this._mapPane,e,i.duration||.25,i.easeLinearity)}else this._rawPanBy(t),this.fire(\"move\").fire(\"moveend\");return this},flyTo:function(t,i,e){function n(t){var i=(g*g-m*m+(t?-1:1)*x*x*v*v)/(2*(t?g:m)*x*v),e=Math.sqrt(i*i+1)-i;return e<1e-9?-18:Math.log(e)}function o(t){return(Math.exp(t)-Math.exp(-t))/2}function s(t){return(Math.exp(t)+Math.exp(-t))/2}function r(t){return o(t)/s(t)}function a(t){return m*(s(w)/s(w+y*t))}function h(t){return m*(s(w)*r(w+y*t)-o(w))/x}function u(t){return 1-Math.pow(1-t,1.5)}function l(){var e=(Date.now()-L)/b,n=u(e)*P;e<=1?(this._flyToFrame=f(l,this),this._move(this.unproject(c.add(_.subtract(c).multiplyBy(h(n)/v)),p),this.getScaleZoom(m/a(n),p),{flyTo:!0})):this._move(t,i)._moveEnd(!0)}if(!1===(e=e||{}).animate||!Ni)return this.setView(t,i,e);this._stop();var c=this.project(this.getCenter()),_=this.project(t),d=this.getSize(),p=this._zoom;t=C(t),i=void 0===i?p:i;var m=Math.max(d.x,d.y),g=m*this.getZoomScale(p,i),v=_.distanceTo(c)||1,y=1.42,x=y*y,w=n(0),L=Date.now(),P=(n(1)-w)/y,b=e.duration?1e3*e.duration:1e3*P*.8;return this._moveStart(!0,e.noMoveStart),l.call(this),this},flyToBounds:function(t,i){var e=this._getBoundsCenterZoom(t,i);return this.flyTo(e.center,e.zoom,i)},setMaxBounds:function(t){return(t=z(t)).isValid()?(this.options.maxBounds&&this.off(\"moveend\",this._panInsideMaxBounds),this.options.maxBounds=t,this._loaded&&this._panInsideMaxBounds(),this.on(\"moveend\",this._panInsideMaxBounds)):(this.options.maxBounds=null,this.off(\"moveend\",this._panInsideMaxBounds))},setMinZoom:function(t){var i=this.options.minZoom;return this.options.minZoom=t,this._loaded&&i!==t&&(this.fire(\"zoomlevelschange\"),this.getZoom()<this.options.minZoom)?this.setZoom(t):this},setMaxZoom:function(t){var i=this.options.maxZoom;return this.options.maxZoom=t,this._loaded&&i!==t&&(this.fire(\"zoomlevelschange\"),this.getZoom()>this.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,i){this._enforcingBounds=!0;var e=this.getCenter(),n=this._limitCenter(e,this._zoom,z(t));return e.equals(n)||this.panTo(n,i),this._enforcingBounds=!1,this},invalidateSize:function(t){if(!this._loaded)return this;t=i({animate:!1,pan:!0},!0===t?{animate:!0}:t);var n=this.getSize();this._sizeChanged=!0,this._lastCenter=null;var o=this.getSize(),s=n.divideBy(2).round(),r=o.divideBy(2).round(),a=s.subtract(r);return a.x||a.y?(t.animate&&t.pan?this.panBy(a):(t.pan&&this._rawPanBy(a),this.fire(\"move\"),t.debounceMoveend?(clearTimeout(this._sizeTimer),this._sizeTimer=setTimeout(e(this.fire,this,\"moveend\"),200)):this.fire(\"moveend\")),this.fire(\"resize\",{oldSize:n,newSize:o})):this},stop:function(){return this.setZoom(this._limitZoom(this._zoom)),this.options.zoomSnap||this.fire(\"viewreset\"),this._stop()},locate:function(t){if(t=this._locateOptions=i({timeout:1e4,watch:!1},t),!(\"geolocation\"in navigator))return this._handleGeolocationError({code:0,message:\"Geolocation not supported.\"}),this;var n=e(this._handleGeolocationResponse,this),o=e(this._handleGeolocationError,this);return t.watch?this._locationWatchId=navigator.geolocation.watchPosition(n,o,t):navigator.geolocation.getCurrentPosition(n,o,t),this},stopLocate:function(){return navigator.geolocation&&navigator.geolocation.clearWatch&&navigator.geolocation.clearWatch(this._locationWatchId),this._locateOptions&&(this._locateOptions.setView=!1),this},_handleGeolocationError:function(t){var i=t.code,e=t.message||(1===i?\"permission denied\":2===i?\"position unavailable\":\"timeout\");this._locateOptions.setView&&!this._loaded&&this.fitWorld(),this.fire(\"locationerror\",{code:i,message:\"Geolocation error: \"+e+\".\"})},_handleGeolocationResponse:function(t){var i=new M(t.coords.latitude,t.coords.longitude),e=i.toBounds(t.coords.accuracy),n=this._locateOptions;if(n.setView){var o=this.getBoundsZoom(e);this.setView(i,n.maxZoom?Math.min(o,n.maxZoom):o)}var s={latlng:i,bounds:e,timestamp:t.timestamp};for(var r in t.coords)\"number\"==typeof t.coords[r]&&(s[r]=t.coords[r]);this.fire(\"locationfound\",s)},addHandler:function(t,i){if(!i)return this;var e=this[t]=new i(this);return this._handlers.push(e),this.options[t]&&e.enable(),this},remove:function(){if(this._initEvents(!0),this._containerId!==this._container._leaflet_id)throw new Error(\"Map container is being reused by another instance\");try{delete this._container._leaflet_id,delete this._containerId}catch(t){this._container._leaflet_id=void 0,this._containerId=void 0}void 0!==this._locationWatchId&&this.stopLocate(),this._stop(),ut(this._mapPane),this._clearControlPos&&this._clearControlPos(),this._clearHandlers(),this._loaded&&this.fire(\"unload\");var t;for(t in this._layers)this._layers[t].remove();for(t in this._panes)ut(this._panes[t]);return this._layers=[],this._panes=[],delete this._mapPane,delete this._renderer,this},createPane:function(t,i){var e=ht(\"div\",\"leaflet-pane\"+(t?\" leaflet-\"+t.replace(\"Pane\",\"\")+\"-pane\":\"\"),i||this._mapPane);return t&&(this._panes[t]=e),e},getCenter:function(){return this._checkIfLoaded(),this._lastCenter&&!this._moved()?this._lastCenter:this.layerPointToLatLng(this._getCenterLayerPoint())},getZoom:function(){return this._zoom},getBounds:function(){var t=this.getPixelBounds();return new T(this.unproject(t.getBottomLeft()),this.unproject(t.getTopRight()))},getMinZoom:function(){return void 0===this.options.minZoom?this._layersMinZoom||0:this.options.minZoom},getMaxZoom:function(){return void 0===this.options.maxZoom?void 0===this._layersMaxZoom?1/0:this._layersMaxZoom:this.options.maxZoom},getBoundsZoom:function(t,i,e){t=z(t),e=w(e||[0,0]);var n=this.getZoom()||0,o=this.getMinZoom(),s=this.getMaxZoom(),r=t.getNorthWest(),a=t.getSouthEast(),h=this.getSize().subtract(e),u=b(this.project(a,n),this.project(r,n)).getSize(),l=Ni?this.options.zoomSnap:1,c=h.x/u.x,_=h.y/u.y,d=i?Math.max(c,_):Math.min(c,_);return n=this.getScaleZoom(d,n),l&&(n=Math.round(n/(l/100))*(l/100),n=i?Math.ceil(n/l)*l:Math.floor(n/l)*l),Math.max(o,Math.min(s,n))},getSize:function(){return this._size&&!this._sizeChanged||(this._size=new x(this._container.clientWidth||0,this._container.clientHeight||0),this._sizeChanged=!1),this._size.clone()},getPixelBounds:function(t,i){var e=this._getTopLeftPoint(t,i);return new P(e,e.add(this.getSize()))},getPixelOrigin:function(){return this._checkIfLoaded(),this._pixelOrigin},getPixelWorldBounds:function(t){return this.options.crs.getProjectedBounds(void 0===t?this.getZoom():t)},getPane:function(t){return\"string\"==typeof t?this._panes[t]:t},getPanes:function(){return this._panes},getContainer:function(){return this._container},getZoomScale:function(t,i){var e=this.options.crs;return i=void 0===i?this._zoom:i,e.scale(t)/e.scale(i)},getScaleZoom:function(t,i){var e=this.options.crs;i=void 0===i?this._zoom:i;var n=e.zoom(t*e.scale(i));return isNaN(n)?1/0:n},project:function(t,i){return i=void 0===i?this._zoom:i,this.options.crs.latLngToPoint(C(t),i)},unproject:function(t,i){return i=void 0===i?this._zoom:i,this.options.crs.pointToLatLng(w(t),i)},layerPointToLatLng:function(t){var i=w(t).add(this.getPixelOrigin());return this.unproject(i)},latLngToLayerPoint:function(t){return this.project(C(t))._round()._subtract(this.getPixelOrigin())},wrapLatLng:function(t){return this.options.crs.wrapLatLng(C(t))},wrapLatLngBounds:function(t){return this.options.crs.wrapLatLngBounds(z(t))},distance:function(t,i){return this.options.crs.distance(C(t),C(i))},containerPointToLayerPoint:function(t){return w(t).subtract(this._getMapPanePos())},layerPointToContainerPoint:function(t){return w(t).add(this._getMapPanePos())},containerPointToLatLng:function(t){var i=this.containerPointToLayerPoint(w(t));return this.layerPointToLatLng(i)},latLngToContainerPoint:function(t){return this.layerPointToContainerPoint(this.latLngToLayerPoint(C(t)))},mouseEventToContainerPoint:function(t){return tt(t,this._container)},mouseEventToLayerPoint:function(t){return this.containerPointToLayerPoint(this.mouseEventToContainerPoint(t))},mouseEventToLatLng:function(t){return this.layerPointToLatLng(this.mouseEventToLayerPoint(t))},_initContainer:function(t){var i=this._container=rt(t);if(!i)throw new Error(\"Map container not found.\");if(i._leaflet_id)throw new Error(\"Map container is already initialized.\");V(i,\"scroll\",this._onScroll,this),this._containerId=n(i)},_initLayout:function(){var t=this._container;this._fadeAnimated=this.options.fadeAnimation&&Ni,pt(t,\"leaflet-container\"+(Vi?\" leaflet-touch\":\"\")+(Ki?\" leaflet-retina\":\"\")+(Li?\" leaflet-oldie\":\"\")+(ki?\" leaflet-safari\":\"\")+(this._fadeAnimated?\" leaflet-fade-anim\":\"\"));var i=at(t,\"position\");\"absolute\"!==i&&\"relative\"!==i&&\"fixed\"!==i&&(t.style.position=\"relative\"),this._initPanes(),this._initControlPos&&this._initControlPos()},_initPanes:function(){var t=this._panes={};this._paneRenderers={},this._mapPane=this.createPane(\"mapPane\",this._container),Lt(this._mapPane,new x(0,0)),this.createPane(\"tilePane\"),this.createPane(\"shadowPane\"),this.createPane(\"overlayPane\"),this.createPane(\"markerPane\"),this.createPane(\"tooltipPane\"),this.createPane(\"popupPane\"),this.options.markerZoomAnimation||(pt(t.markerPane,\"leaflet-zoom-hide\"),pt(t.shadowPane,\"leaflet-zoom-hide\"))},_resetView:function(t,i){Lt(this._mapPane,new x(0,0));var e=!this._loaded;this._loaded=!0,i=this._limitZoom(i),this.fire(\"viewprereset\");var n=this._zoom!==i;this._moveStart(n,!1)._move(t,i)._moveEnd(n),this.fire(\"viewreset\"),e&&this.fire(\"load\")},_moveStart:function(t,i){return t&&this.fire(\"zoomstart\"),i||this.fire(\"movestart\"),this},_move:function(t,i,e){void 0===i&&(i=this._zoom);var n=this._zoom!==i;return this._zoom=i,this._lastCenter=t,this._pixelOrigin=this._getNewPixelOrigin(t),(n||e&&e.pinch)&&this.fire(\"zoom\",e),this.fire(\"move\",e)},_moveEnd:function(t){return t&&this.fire(\"zoomend\"),this.fire(\"moveend\")},_stop:function(){return g(this._flyToFrame),this._panAnim&&this._panAnim.stop(),this},_rawPanBy:function(t){Lt(this._mapPane,this._getMapPanePos().subtract(t))},_getZoomSpan:function(){return this.getMaxZoom()-this.getMinZoom()},_panInsideMaxBounds:function(){this._enforcingBounds||this.panInsideBounds(this.options.maxBounds)},_checkIfLoaded:function(){if(!this._loaded)throw new Error(\"Set map center and zoom first.\")},_initEvents:function(t){this._targets={},this._targets[n(this._container)]=this;var i=t?q:V;i(this._container,\"click dblclick mousedown mouseup mouseover mouseout mousemove contextmenu keypress\",this._handleDOMEvent,this),this.options.trackResize&&i(window,\"resize\",this._onResize,this),Ni&&this.options.transform3DLimit&&(t?this.off:this.on).call(this,\"moveend\",this._onMoveEnd)},_onResize:function(){g(this._resizeRequest),this._resizeRequest=f(function(){this.invalidateSize({debounceMoveend:!0})},this)},_onScroll:function(){this._container.scrollTop=0,this._container.scrollLeft=0},_onMoveEnd:function(){var t=this._getMapPanePos();Math.max(Math.abs(t.x),Math.abs(t.y))>=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,i){for(var e,o=[],s=\"mouseout\"===i||\"mouseover\"===i,r=t.target||t.srcElement,a=!1;r;){if((e=this._targets[n(r)])&&(\"click\"===i||\"preclick\"===i)&&!t._simulated&&this._draggableMoved(e)){a=!0;break}if(e&&e.listens(i,!0)){if(s&&!ot(r,t))break;if(o.push(e),s)break}if(r===this._container)break;r=r.parentNode}return o.length||a||s||!ot(r,t)||(o=[this]),o},_handleDOMEvent:function(t){if(this._loaded&&!nt(t)){var i=t.type;\"mousedown\"!==i&&\"keypress\"!==i||zt(t.target||t.srcElement),this._fireDOMEvent(t,i)}},_mouseEvents:[\"click\",\"dblclick\",\"mouseover\",\"mouseout\",\"contextmenu\"],_fireDOMEvent:function(t,e,n){if(\"click\"===t.type){var o=i({},t);o.type=\"preclick\",this._fireDOMEvent(o,o.type,n)}if(!t._stopped&&(n=(n||[]).concat(this._findEventTargets(t,e))).length){var s=n[0];\"contextmenu\"===e&&s.listens(e,!0)&&$(t);var r={originalEvent:t};if(\"keypress\"!==t.type){var a=s.getLatLng&&(!s._radius||s._radius<=10);r.containerPoint=a?this.latLngToContainerPoint(s.getLatLng()):this.mouseEventToContainerPoint(t),r.layerPoint=this.containerPointToLayerPoint(r.containerPoint),r.latlng=a?s.getLatLng():this.layerPointToLatLng(r.layerPoint)}for(var h=0;h<n.length;h++)if(n[h].fire(e,r,!0),r.originalEvent._stopped||!1===n[h].options.bubblingMouseEvents&&-1!==d(this._mouseEvents,e))return}},_draggableMoved:function(t){return(t=t.dragging&&t.dragging.enabled()?t:this).dragging&&t.dragging.moved()||this.boxZoom&&this.boxZoom.moved()},_clearHandlers:function(){for(var t=0,i=this._handlers.length;t<i;t++)this._handlers[t].disable()},whenReady:function(t,i){return this._loaded?t.call(i||this,{target:this}):this.on(\"load\",t,i),this},_getMapPanePos:function(){return Pt(this._mapPane)||new x(0,0)},_moved:function(){var t=this._getMapPanePos();return t&&!t.equals([0,0])},_getTopLeftPoint:function(t,i){return(t&&void 0!==i?this._getNewPixelOrigin(t,i):this.getPixelOrigin()).subtract(this._getMapPanePos())},_getNewPixelOrigin:function(t,i){var e=this.getSize()._divideBy(2);return this.project(t,i)._subtract(e)._add(this._getMapPanePos())._round()},_latLngToNewLayerPoint:function(t,i,e){var n=this._getNewPixelOrigin(e,i);return this.project(t,i)._subtract(n)},_latLngBoundsToNewLayerBounds:function(t,i,e){var n=this._getNewPixelOrigin(e,i);return b([this.project(t.getSouthWest(),i)._subtract(n),this.project(t.getNorthWest(),i)._subtract(n),this.project(t.getSouthEast(),i)._subtract(n),this.project(t.getNorthEast(),i)._subtract(n)])},_getCenterLayerPoint:function(){return this.containerPointToLayerPoint(this.getSize()._divideBy(2))},_getCenterOffset:function(t){return this.latLngToLayerPoint(t).subtract(this._getCenterLayerPoint())},_limitCenter:function(t,i,e){if(!e)return t;var n=this.project(t,i),o=this.getSize().divideBy(2),s=new P(n.subtract(o),n.add(o)),r=this._getBoundsOffset(s,e,i);return r.round().equals([0,0])?t:this.unproject(n.add(r),i)},_limitOffset:function(t,i){if(!i)return t;var e=this.getPixelBounds(),n=new P(e.min.add(t),e.max.add(t));return t.add(this._getBoundsOffset(n,i))},_getBoundsOffset:function(t,i,e){var n=b(this.project(i.getNorthEast(),e),this.project(i.getSouthWest(),e)),o=n.min.subtract(t.min),s=n.max.subtract(t.max);return new x(this._rebound(o.x,-s.x),this._rebound(o.y,-s.y))},_rebound:function(t,i){return t+i>0?Math.round(t-i)/2:Math.max(0,Math.ceil(t))-Math.max(0,Math.floor(i))},_limitZoom:function(t){var i=this.getMinZoom(),e=this.getMaxZoom(),n=Ni?this.options.zoomSnap:1;return n&&(t=Math.round(t/n)*n),Math.max(i,Math.min(e,t))},_onPanTransitionStep:function(){this.fire(\"move\")},_onPanTransitionEnd:function(){mt(this._mapPane,\"leaflet-pan-anim\"),this.fire(\"moveend\")},_tryAnimatedPan:function(t,i){var e=this._getCenterOffset(t)._trunc();return!(!0!==(i&&i.animate)&&!this.getSize().contains(e))&&(this.panBy(e,i),!0)},_createAnimProxy:function(){var t=this._proxy=ht(\"div\",\"leaflet-proxy leaflet-zoom-animated\");this._panes.mapPane.appendChild(t),this.on(\"zoomanim\",function(t){var i=pe,e=this._proxy.style[i];wt(this._proxy,this.project(t.center,t.zoom),this.getZoomScale(t.zoom,1)),e===this._proxy.style[i]&&this._animatingZoom&&this._onZoomTransitionEnd()},this),this.on(\"load moveend\",function(){var t=this.getCenter(),i=this.getZoom();wt(this._proxy,this.project(t,i),this.getZoomScale(i,1))},this),this._on(\"unload\",this._destroyAnimProxy,this)},_destroyAnimProxy:function(){ut(this._proxy),delete this._proxy},_catchTransitionEnd:function(t){this._animatingZoom&&t.propertyName.indexOf(\"transform\")>=0&&this._onZoomTransitionEnd()},_nothingToAnimate:function(){return!this._container.getElementsByClassName(\"leaflet-zoom-animated\").length},_tryAnimatedZoom:function(t,i,e){if(this._animatingZoom)return!0;if(e=e||{},!this._zoomAnimated||!1===e.animate||this._nothingToAnimate()||Math.abs(i-this._zoom)>this.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(i),o=this._getCenterOffset(t)._divideBy(1-1/n);return!(!0!==e.animate&&!this.getSize().contains(o))&&(f(function(){this._moveStart(!0,!1)._animateZoom(t,i,!0)},this),!0)},_animateZoom:function(t,i,n,o){this._mapPane&&(n&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=i,pt(this._mapPane,\"leaflet-zoom-anim\")),this.fire(\"zoomanim\",{center:t,zoom:i,noUpdate:o}),setTimeout(e(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&mt(this._mapPane,\"leaflet-zoom-anim\"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom),f(function(){this._moveEnd(!0)},this))}}),Pe=v.extend({options:{position:\"topright\"},initialize:function(t){l(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var i=this._map;return i&&i.removeControl(this),this.options.position=t,i&&i.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var i=this._container=this.onAdd(t),e=this.getPosition(),n=t._controlCorners[e];return pt(i,\"leaflet-control\"),-1!==e.indexOf(\"bottom\")?n.insertBefore(i,n.firstChild):n.appendChild(i),this},remove:function(){return this._map?(ut(this._container),this.onRemove&&this.onRemove(this._map),this._map=null,this):this},_refocusOnMap:function(t){this._map&&t&&t.screenX>0&&t.screenY>0&&this._map.getContainer().focus()}}),be=function(t){return new Pe(t)};Le.include({addControl:function(t){return t.addTo(this),this},removeControl:function(t){return t.remove(),this},_initControlPos:function(){function t(t,o){var s=e+t+\" \"+e+o;i[t+o]=ht(\"div\",s,n)}var i=this._controlCorners={},e=\"leaflet-\",n=this._controlContainer=ht(\"div\",e+\"control-container\",this._container);t(\"top\",\"left\"),t(\"top\",\"right\"),t(\"bottom\",\"left\"),t(\"bottom\",\"right\")},_clearControlPos:function(){for(var t in this._controlCorners)ut(this._controlCorners[t]);ut(this._controlContainer),delete this._controlCorners,delete this._controlContainer}});var Te=Pe.extend({options:{collapsed:!0,position:\"topright\",autoZIndex:!0,hideSingleBase:!1,sortLayers:!1,sortFunction:function(t,i,e,n){return e<n?-1:n<e?1:0}},initialize:function(t,i,e){l(this,e),this._layerControlInputs=[],this._layers=[],this._lastZIndex=0,this._handlingClick=!1;for(var n in t)this._addLayer(t[n],n);for(n in i)this._addLayer(i[n],n,!0)},onAdd:function(t){this._initLayout(),this._update(),this._map=t,t.on(\"zoomend\",this._checkDisabledLayers,this);for(var i=0;i<this._layers.length;i++)this._layers[i].layer.on(\"add remove\",this._onLayerChange,this);return this._container},addTo:function(t){return Pe.prototype.addTo.call(this,t),this._expandIfNotCollapsed()},onRemove:function(){this._map.off(\"zoomend\",this._checkDisabledLayers,this);for(var t=0;t<this._layers.length;t++)this._layers[t].layer.off(\"add remove\",this._onLayerChange,this)},addBaseLayer:function(t,i){return this._addLayer(t,i),this._map?this._update():this},addOverlay:function(t,i){return this._addLayer(t,i,!0),this._map?this._update():this},removeLayer:function(t){t.off(\"add remove\",this._onLayerChange,this);var i=this._getLayer(n(t));return i&&this._layers.splice(this._layers.indexOf(i),1),this._map?this._update():this},expand:function(){pt(this._container,\"leaflet-control-layers-expanded\"),this._form.style.height=null;var t=this._map.getSize().y-(this._container.offsetTop+50);return t<this._form.clientHeight?(pt(this._form,\"leaflet-control-layers-scrollbar\"),this._form.style.height=t+\"px\"):mt(this._form,\"leaflet-control-layers-scrollbar\"),this._checkDisabledLayers(),this},collapse:function(){return mt(this._container,\"leaflet-control-layers-expanded\"),this},_initLayout:function(){var t=\"leaflet-control-layers\",i=this._container=ht(\"div\",t),e=this.options.collapsed;i.setAttribute(\"aria-haspopup\",!0),J(i),X(i);var n=this._form=ht(\"form\",t+\"-list\");e&&(this._map.on(\"click\",this.collapse,this),Ti||V(i,{mouseenter:this.expand,mouseleave:this.collapse},this));var o=this._layersLink=ht(\"a\",t+\"-toggle\",i);o.href=\"#\",o.title=\"Layers\",Vi?(V(o,\"click\",Q),V(o,\"click\",this.expand,this)):V(o,\"focus\",this.expand,this),e||this.expand(),this._baseLayersList=ht(\"div\",t+\"-base\",n),this._separator=ht(\"div\",t+\"-separator\",n),this._overlaysList=ht(\"div\",t+\"-overlays\",n),i.appendChild(n)},_getLayer:function(t){for(var i=0;i<this._layers.length;i++)if(this._layers[i]&&n(this._layers[i].layer)===t)return this._layers[i]},_addLayer:function(t,i,n){this._map&&t.on(\"add remove\",this._onLayerChange,this),this._layers.push({layer:t,name:i,overlay:n}),this.options.sortLayers&&this._layers.sort(e(function(t,i){return this.options.sortFunction(t.layer,i.layer,t.name,i.name)},this)),this.options.autoZIndex&&t.setZIndex&&(this._lastZIndex++,t.setZIndex(this._lastZIndex)),this._expandIfNotCollapsed()},_update:function(){if(!this._container)return this;lt(this._baseLayersList),lt(this._overlaysList),this._layerControlInputs=[];var t,i,e,n,o=0;for(e=0;e<this._layers.length;e++)n=this._layers[e],this._addItem(n),i=i||n.overlay,t=t||!n.overlay,o+=n.overlay?0:1;return this.options.hideSingleBase&&(t=t&&o>1,this._baseLayersList.style.display=t?\"\":\"none\"),this._separator.style.display=i&&t?\"\":\"none\",this},_onLayerChange:function(t){this._handlingClick||this._update();var i=this._getLayer(n(t.target)),e=i.overlay?\"add\"===t.type?\"overlayadd\":\"overlayremove\":\"add\"===t.type?\"baselayerchange\":null;e&&this._map.fire(e,i)},_createRadioElement:function(t,i){var e='<input type=\"radio\" class=\"leaflet-control-layers-selector\" name=\"'+t+'\"'+(i?' checked=\"checked\"':\"\")+\"/>\",n=document.createElement(\"div\");return n.innerHTML=e,n.firstChild},_addItem:function(t){var i,e=document.createElement(\"label\"),o=this._map.hasLayer(t.layer);t.overlay?((i=document.createElement(\"input\")).type=\"checkbox\",i.className=\"leaflet-control-layers-selector\",i.defaultChecked=o):i=this._createRadioElement(\"leaflet-base-layers\",o),this._layerControlInputs.push(i),i.layerId=n(t.layer),V(i,\"click\",this._onInputClick,this);var s=document.createElement(\"span\");s.innerHTML=\" \"+t.name;var r=document.createElement(\"div\");return e.appendChild(r),r.appendChild(i),r.appendChild(s),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(e),this._checkDisabledLayers(),e},_onInputClick:function(){var t,i,e=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=e.length-1;s>=0;s--)t=e[s],i=this._getLayer(t.layerId).layer,t.checked?n.push(i):t.checked||o.push(i);for(s=0;s<o.length;s++)this._map.hasLayer(o[s])&&this._map.removeLayer(o[s]);for(s=0;s<n.length;s++)this._map.hasLayer(n[s])||this._map.addLayer(n[s]);this._handlingClick=!1,this._refocusOnMap()},_checkDisabledLayers:function(){for(var t,i,e=this._layerControlInputs,n=this._map.getZoom(),o=e.length-1;o>=0;o--)t=e[o],i=this._getLayer(t.layerId).layer,t.disabled=void 0!==i.options.minZoom&&n<i.options.minZoom||void 0!==i.options.maxZoom&&n>i.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}}),ze=Pe.extend({options:{position:\"topleft\",zoomInText:\"+\",zoomInTitle:\"Zoom in\",zoomOutText:\"&#x2212;\",zoomOutTitle:\"Zoom out\"},onAdd:function(t){var i=\"leaflet-control-zoom\",e=ht(\"div\",i+\" leaflet-bar\"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,i+\"-in\",e,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,i+\"-out\",e,this._zoomOut),this._updateDisabled(),t.on(\"zoomend zoomlevelschange\",this._updateDisabled,this),e},onRemove:function(t){t.off(\"zoomend zoomlevelschange\",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoom<this._map.getMaxZoom()&&this._map.zoomIn(this._map.options.zoomDelta*(t.shiftKey?3:1))},_zoomOut:function(t){!this._disabled&&this._map._zoom>this._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,i,e,n,o){var s=ht(\"a\",e,n);return s.innerHTML=t,s.href=\"#\",s.title=i,s.setAttribute(\"role\",\"button\"),s.setAttribute(\"aria-label\",i),J(s),V(s,\"click\",Q),V(s,\"click\",o,this),V(s,\"click\",this._refocusOnMap,this),s},_updateDisabled:function(){var t=this._map,i=\"leaflet-disabled\";mt(this._zoomInButton,i),mt(this._zoomOutButton,i),(this._disabled||t._zoom===t.getMinZoom())&&pt(this._zoomOutButton,i),(this._disabled||t._zoom===t.getMaxZoom())&&pt(this._zoomInButton,i)}});Le.mergeOptions({zoomControl:!0}),Le.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new ze,this.addControl(this.zoomControl))});var Me=Pe.extend({options:{position:\"bottomleft\",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var i=ht(\"div\",\"leaflet-control-scale\"),e=this.options;return this._addScales(e,\"leaflet-control-scale-line\",i),t.on(e.updateWhenIdle?\"moveend\":\"move\",this._update,this),t.whenReady(this._update,this),i},onRemove:function(t){t.off(this.options.updateWhenIdle?\"moveend\":\"move\",this._update,this)},_addScales:function(t,i,e){t.metric&&(this._mScale=ht(\"div\",i,e)),t.imperial&&(this._iScale=ht(\"div\",i,e))},_update:function(){var t=this._map,i=t.getSize().y/2,e=t.distance(t.containerPointToLatLng([0,i]),t.containerPointToLatLng([this.options.maxWidth,i]));this._updateScales(e)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var i=this._getRoundNum(t),e=i<1e3?i+\" m\":i/1e3+\" km\";this._updateScale(this._mScale,e,i/t)},_updateImperial:function(t){var i,e,n,o=3.2808399*t;o>5280?(i=o/5280,e=this._getRoundNum(i),this._updateScale(this._iScale,e+\" mi\",e/i)):(n=this._getRoundNum(o),this._updateScale(this._iScale,n+\" ft\",n/o))},_updateScale:function(t,i,e){t.style.width=Math.round(this.options.maxWidth*e)+\"px\",t.innerHTML=i},_getRoundNum:function(t){var i=Math.pow(10,(Math.floor(t)+\"\").length-1),e=t/i;return e=e>=10?10:e>=5?5:e>=3?3:e>=2?2:1,i*e}}),Ce=Pe.extend({options:{position:\"bottomright\",prefix:'<a href=\"http://leafletjs.com\" title=\"A JS library for interactive maps\">Leaflet</a>'},initialize:function(t){l(this,t),this._attributions={}},onAdd:function(t){t.attributionControl=this,this._container=ht(\"div\",\"leaflet-control-attribution\"),J(this._container);for(var i in t._layers)t._layers[i].getAttribution&&this.addAttribution(t._layers[i].getAttribution());return this._update(),this._container},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t?(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update(),this):this},removeAttribution:function(t){return t?(this._attributions[t]&&(this._attributions[t]--,this._update()),this):this},_update:function(){if(this._map){var t=[];for(var i in this._attributions)this._attributions[i]&&t.push(i);var e=[];this.options.prefix&&e.push(this.options.prefix),t.length&&e.push(t.join(\", \")),this._container.innerHTML=e.join(\" | \")}}});Le.mergeOptions({attributionControl:!0}),Le.addInitHook(function(){this.options.attributionControl&&(new Ce).addTo(this)});Pe.Layers=Te,Pe.Zoom=ze,Pe.Scale=Me,Pe.Attribution=Ce,be.layers=function(t,i,e){return new Te(t,i,e)},be.zoom=function(t){return new ze(t)},be.scale=function(t){return new Me(t)},be.attribution=function(t){return new Ce(t)};var Ze=v.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled?this:(this._enabled=!0,this.addHooks(),this)},disable:function(){return this._enabled?(this._enabled=!1,this.removeHooks(),this):this},enabled:function(){return!!this._enabled}});Ze.addTo=function(t,i){return t.addHandler(i,this),this};var Se,Ee={Events:hi},ke=Vi?\"touchstart mousedown\":\"mousedown\",Ae={mousedown:\"mouseup\",touchstart:\"touchend\",pointerdown:\"touchend\",MSPointerDown:\"touchend\"},Ie={mousedown:\"mousemove\",touchstart:\"touchmove\",pointerdown:\"touchmove\",MSPointerDown:\"touchmove\"},Be=ui.extend({options:{clickTolerance:3},initialize:function(t,i,e,n){l(this,n),this._element=t,this._dragStartTarget=i||t,this._preventOutline=e},enable:function(){this._enabled||(V(this._dragStartTarget,ke,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(Be._dragging===this&&this.finishDrag(),q(this._dragStartTarget,ke,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){if(!t._simulated&&this._enabled&&(this._moved=!1,!dt(this._element,\"leaflet-zoom-anim\")&&!(Be._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||(Be._dragging=this,this._preventOutline&&zt(this._element),bt(),mi(),this._moving)))){this.fire(\"down\");var i=t.touches?t.touches[0]:t;this._startPoint=new x(i.clientX,i.clientY),V(document,Ie[t.type],this._onMove,this),V(document,Ae[t.type],this._onUp,this)}},_onMove:function(t){if(!t._simulated&&this._enabled)if(t.touches&&t.touches.length>1)this._moved=!0;else{var i=t.touches&&1===t.touches.length?t.touches[0]:t,e=new x(i.clientX,i.clientY).subtract(this._startPoint);(e.x||e.y)&&(Math.abs(e.x)+Math.abs(e.y)<this.options.clickTolerance||($(t),this._moved||(this.fire(\"dragstart\"),this._moved=!0,this._startPos=Pt(this._element).subtract(e),pt(document.body,\"leaflet-dragging\"),this._lastTarget=t.target||t.srcElement,window.SVGElementInstance&&this._lastTarget instanceof SVGElementInstance&&(this._lastTarget=this._lastTarget.correspondingUseElement),pt(this._lastTarget,\"leaflet-drag-target\")),this._newPos=this._startPos.add(e),this._moving=!0,g(this._animRequest),this._lastEvent=t,this._animRequest=f(this._updatePosition,this,!0)))}},_updatePosition:function(){var t={originalEvent:this._lastEvent};this.fire(\"predrag\",t),Lt(this._element,this._newPos),this.fire(\"drag\",t)},_onUp:function(t){!t._simulated&&this._enabled&&this.finishDrag()},finishDrag:function(){mt(document.body,\"leaflet-dragging\"),this._lastTarget&&(mt(this._lastTarget,\"leaflet-drag-target\"),this._lastTarget=null);for(var t in Ie)q(document,Ie[t],this._onMove,this),q(document,Ae[t],this._onUp,this);Tt(),fi(),this._moved&&this._moving&&(g(this._animRequest),this.fire(\"dragend\",{distance:this._newPos.distanceTo(this._startPos)})),this._moving=!1,Be._dragging=!1}}),Oe=(Object.freeze||Object)({simplify:Ct,pointToSegmentDistance:Zt,closestPointOnSegment:function(t,i,e){return Rt(t,i,e)},clipSegment:At,_getEdgeIntersection:It,_getBitCode:Bt,_sqClosestPointOnSegment:Rt,isFlat:Dt,_flat:Nt}),Re=(Object.freeze||Object)({clipPolygon:jt}),De={project:function(t){return new x(t.lng,t.lat)},unproject:function(t){return new M(t.y,t.x)},bounds:new P([-180,-90],[180,90])},Ne={R:6378137,R_MINOR:6356752.314245179,bounds:new P([-20037508.34279,-15496570.73972],[20037508.34279,18764656.23138]),project:function(t){var i=Math.PI/180,e=this.R,n=t.lat*i,o=this.R_MINOR/e,s=Math.sqrt(1-o*o),r=s*Math.sin(n),a=Math.tan(Math.PI/4-n/2)/Math.pow((1-r)/(1+r),s/2);return n=-e*Math.log(Math.max(a,1e-10)),new x(t.lng*i*e,n)},unproject:function(t){for(var i,e=180/Math.PI,n=this.R,o=this.R_MINOR/n,s=Math.sqrt(1-o*o),r=Math.exp(-t.y/n),a=Math.PI/2-2*Math.atan(r),h=0,u=.1;h<15&&Math.abs(u)>1e-7;h++)i=s*Math.sin(a),i=Math.pow((1-i)/(1+i),s/2),a+=u=Math.PI/2-2*Math.atan(r*i)-a;return new M(a*e,t.x*e/n)}},je=(Object.freeze||Object)({LonLat:De,Mercator:Ne,SphericalMercator:di}),We=i({},_i,{code:\"EPSG:3395\",projection:Ne,transformation:function(){var t=.5/(Math.PI*Ne.R);return S(t,.5,-t,.5)}()}),He=i({},_i,{code:\"EPSG:4326\",projection:De,transformation:S(1/180,1,-1/180,.5)}),Fe=i({},ci,{projection:De,transformation:S(1,0,-1,0),scale:function(t){return Math.pow(2,t)},zoom:function(t){return Math.log(t)/Math.LN2},distance:function(t,i){var e=i.lng-t.lng,n=i.lat-t.lat;return Math.sqrt(e*e+n*n)},infinite:!0});ci.Earth=_i,ci.EPSG3395=We,ci.EPSG3857=vi,ci.EPSG900913=yi,ci.EPSG4326=He,ci.Simple=Fe;var Ue=ui.extend({options:{pane:\"overlayPane\",attribution:null,bubblingMouseEvents:!0},addTo:function(t){return t.addLayer(this),this},remove:function(){return this.removeFrom(this._map||this._mapToAdd)},removeFrom:function(t){return t&&t.removeLayer(this),this},getPane:function(t){return this._map.getPane(t?this.options[t]||t:this.options.pane)},addInteractiveTarget:function(t){return this._map._targets[n(t)]=this,this},removeInteractiveTarget:function(t){return delete this._map._targets[n(t)],this},getAttribution:function(){return this.options.attribution},_layerAdd:function(t){var i=t.target;if(i.hasLayer(this)){if(this._map=i,this._zoomAnimated=i._zoomAnimated,this.getEvents){var e=this.getEvents();i.on(e,this),this.once(\"remove\",function(){i.off(e,this)},this)}this.onAdd(i),this.getAttribution&&i.attributionControl&&i.attributionControl.addAttribution(this.getAttribution()),this.fire(\"add\"),i.fire(\"layeradd\",{layer:this})}}});Le.include({addLayer:function(t){if(!t._layerAdd)throw new Error(\"The provided object is not a Layer.\");var i=n(t);return this._layers[i]?this:(this._layers[i]=t,t._mapToAdd=this,t.beforeAdd&&t.beforeAdd(this),this.whenReady(t._layerAdd,t),this)},removeLayer:function(t){var i=n(t);return this._layers[i]?(this._loaded&&t.onRemove(this),t.getAttribution&&this.attributionControl&&this.attributionControl.removeAttribution(t.getAttribution()),delete this._layers[i],this._loaded&&(this.fire(\"layerremove\",{layer:t}),t.fire(\"remove\")),t._map=t._mapToAdd=null,this):this},hasLayer:function(t){return!!t&&n(t)in this._layers},eachLayer:function(t,i){for(var e in this._layers)t.call(i,this._layers[e]);return this},_addLayers:function(t){for(var i=0,e=(t=t?ei(t)?t:[t]:[]).length;i<e;i++)this.addLayer(t[i])},_addZoomLimit:function(t){!isNaN(t.options.maxZoom)&&isNaN(t.options.minZoom)||(this._zoomBoundLayers[n(t)]=t,this._updateZoomLevels())},_removeZoomLimit:function(t){var i=n(t);this._zoomBoundLayers[i]&&(delete this._zoomBoundLayers[i],this._updateZoomLevels())},_updateZoomLevels:function(){var t=1/0,i=-1/0,e=this._getZoomSpan();for(var n in this._zoomBoundLayers){var o=this._zoomBoundLayers[n].options;t=void 0===o.minZoom?t:Math.min(t,o.minZoom),i=void 0===o.maxZoom?i:Math.max(i,o.maxZoom)}this._layersMaxZoom=i===-1/0?void 0:i,this._layersMinZoom=t===1/0?void 0:t,e!==this._getZoomSpan()&&this.fire(\"zoomlevelschange\"),void 0===this.options.maxZoom&&this._layersMaxZoom&&this.getZoom()>this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()<this._layersMinZoom&&this.setZoom(this._layersMinZoom)}});var Ve=Ue.extend({initialize:function(t,i){l(this,i),this._layers={};var e,n;if(t)for(e=0,n=t.length;e<n;e++)this.addLayer(t[e])},addLayer:function(t){var i=this.getLayerId(t);return this._layers[i]=t,this._map&&this._map.addLayer(t),this},removeLayer:function(t){var i=t in this._layers?t:this.getLayerId(t);return this._map&&this._layers[i]&&this._map.removeLayer(this._layers[i]),delete this._layers[i],this},hasLayer:function(t){return!!t&&(t in this._layers||this.getLayerId(t)in this._layers)},clearLayers:function(){return this.eachLayer(this.removeLayer,this)},invoke:function(t){var i,e,n=Array.prototype.slice.call(arguments,1);for(i in this._layers)(e=this._layers[i])[t]&&e[t].apply(e,n);return this},onAdd:function(t){this.eachLayer(t.addLayer,t)},onRemove:function(t){this.eachLayer(t.removeLayer,t)},eachLayer:function(t,i){for(var e in this._layers)t.call(i,this._layers[e]);return this},getLayer:function(t){return this._layers[t]},getLayers:function(){var t=[];return this.eachLayer(t.push,t),t},setZIndex:function(t){return this.invoke(\"setZIndex\",t)},getLayerId:function(t){return n(t)}}),qe=Ve.extend({addLayer:function(t){return this.hasLayer(t)?this:(t.addEventParent(this),Ve.prototype.addLayer.call(this,t),this.fire(\"layeradd\",{layer:t}))},removeLayer:function(t){return this.hasLayer(t)?(t in this._layers&&(t=this._layers[t]),t.removeEventParent(this),Ve.prototype.removeLayer.call(this,t),this.fire(\"layerremove\",{layer:t})):this},setStyle:function(t){return this.invoke(\"setStyle\",t)},bringToFront:function(){return this.invoke(\"bringToFront\")},bringToBack:function(){return this.invoke(\"bringToBack\")},getBounds:function(){var t=new T;for(var i in this._layers){var e=this._layers[i];t.extend(e.getBounds?e.getBounds():e.getLatLng())}return t}}),Ge=v.extend({options:{popupAnchor:[0,0],tooltipAnchor:[0,0]},initialize:function(t){l(this,t)},createIcon:function(t){return this._createIcon(\"icon\",t)},createShadow:function(t){return this._createIcon(\"shadow\",t)},_createIcon:function(t,i){var e=this._getIconUrl(t);if(!e){if(\"icon\"===t)throw new Error(\"iconUrl not set in Icon options (see the docs).\");return null}var n=this._createImg(e,i&&\"IMG\"===i.tagName?i:null);return this._setIconStyles(n,t),n},_setIconStyles:function(t,i){var e=this.options,n=e[i+\"Size\"];\"number\"==typeof n&&(n=[n,n]);var o=w(n),s=w(\"shadow\"===i&&e.shadowAnchor||e.iconAnchor||o&&o.divideBy(2,!0));t.className=\"leaflet-marker-\"+i+\" \"+(e.className||\"\"),s&&(t.style.marginLeft=-s.x+\"px\",t.style.marginTop=-s.y+\"px\"),o&&(t.style.width=o.x+\"px\",t.style.height=o.y+\"px\")},_createImg:function(t,i){return i=i||document.createElement(\"img\"),i.src=t,i},_getIconUrl:function(t){return Ki&&this.options[t+\"RetinaUrl\"]||this.options[t+\"Url\"]}}),Ke=Ge.extend({options:{iconUrl:\"marker-icon.png\",iconRetinaUrl:\"marker-icon-2x.png\",shadowUrl:\"marker-shadow.png\",iconSize:[25,41],iconAnchor:[12,41],popupAnchor:[1,-34],tooltipAnchor:[16,-28],shadowSize:[41,41]},_getIconUrl:function(t){return Ke.imagePath||(Ke.imagePath=this._detectIconPath()),(this.options.imagePath||Ke.imagePath)+Ge.prototype._getIconUrl.call(this,t)},_detectIconPath:function(){var t=ht(\"div\",\"leaflet-default-icon-path\",document.body),i=at(t,\"background-image\")||at(t,\"backgroundImage\");return document.body.removeChild(t),i=null===i||0!==i.indexOf(\"url\")?\"\":i.replace(/^url\\([\"']?/,\"\").replace(/marker-icon\\.png[\"']?\\)$/,\"\")}}),Ye=Ze.extend({initialize:function(t){this._marker=t},addHooks:function(){var t=this._marker._icon;this._draggable||(this._draggable=new Be(t,t,!0)),this._draggable.on({dragstart:this._onDragStart,predrag:this._onPreDrag,drag:this._onDrag,dragend:this._onDragEnd},this).enable(),pt(t,\"leaflet-marker-draggable\")},removeHooks:function(){this._draggable.off({dragstart:this._onDragStart,predrag:this._onPreDrag,drag:this._onDrag,dragend:this._onDragEnd},this).disable(),this._marker._icon&&mt(this._marker._icon,\"leaflet-marker-draggable\")},moved:function(){return this._draggable&&this._draggable._moved},_adjustPan:function(t){var i=this._marker,e=i._map,n=this._marker.options.autoPanSpeed,o=this._marker.options.autoPanPadding,s=L.DomUtil.getPosition(i._icon),r=e.getPixelBounds(),a=e.getPixelOrigin(),h=b(r.min._subtract(a).add(o),r.max._subtract(a).subtract(o));if(!h.contains(s)){var u=w((Math.max(h.max.x,s.x)-h.max.x)/(r.max.x-h.max.x)-(Math.min(h.min.x,s.x)-h.min.x)/(r.min.x-h.min.x),(Math.max(h.max.y,s.y)-h.max.y)/(r.max.y-h.max.y)-(Math.min(h.min.y,s.y)-h.min.y)/(r.min.y-h.min.y)).multiplyBy(n);e.panBy(u,{animate:!1}),this._draggable._newPos._add(u),this._draggable._startPos._add(u),L.DomUtil.setPosition(i._icon,this._draggable._newPos),this._onDrag(t),this._panRequest=f(this._adjustPan.bind(this,t))}},_onDragStart:function(){this._oldLatLng=this._marker.getLatLng(),this._marker.closePopup().fire(\"movestart\").fire(\"dragstart\")},_onPreDrag:function(t){this._marker.options.autoPan&&(g(this._panRequest),this._panRequest=f(this._adjustPan.bind(this,t)))},_onDrag:function(t){var i=this._marker,e=i._shadow,n=Pt(i._icon),o=i._map.layerPointToLatLng(n);e&&Lt(e,n),i._latlng=o,t.latlng=o,t.oldLatLng=this._oldLatLng,i.fire(\"move\",t).fire(\"drag\",t)},_onDragEnd:function(t){g(this._panRequest),delete this._oldLatLng,this._marker.fire(\"moveend\").fire(\"dragend\",t)}}),Xe=Ue.extend({options:{icon:new Ke,interactive:!0,draggable:!1,autoPan:!1,autoPanPadding:[50,50],autoPanSpeed:10,keyboard:!0,title:\"\",alt:\"\",zIndexOffset:0,opacity:1,riseOnHover:!1,riseOffset:250,pane:\"markerPane\",bubblingMouseEvents:!1},initialize:function(t,i){l(this,i),this._latlng=C(t)},onAdd:function(t){this._zoomAnimated=this._zoomAnimated&&t.options.markerZoomAnimation,this._zoomAnimated&&t.on(\"zoomanim\",this._animateZoom,this),this._initIcon(),this.update()},onRemove:function(t){this.dragging&&this.dragging.enabled()&&(this.options.draggable=!0,this.dragging.removeHooks()),delete this.dragging,this._zoomAnimated&&t.off(\"zoomanim\",this._animateZoom,this),this._removeIcon(),this._removeShadow()},getEvents:function(){return{zoom:this.update,viewreset:this.update}},getLatLng:function(){return this._latlng},setLatLng:function(t){var i=this._latlng;return this._latlng=C(t),this.update(),this.fire(\"move\",{oldLatLng:i,latlng:this._latlng})},setZIndexOffset:function(t){return this.options.zIndexOffset=t,this.update()},setIcon:function(t){return this.options.icon=t,this._map&&(this._initIcon(),this.update()),this._popup&&this.bindPopup(this._popup,this._popup.options),this},getElement:function(){return this._icon},update:function(){if(this._icon&&this._map){var t=this._map.latLngToLayerPoint(this._latlng).round();this._setPos(t)}return this},_initIcon:function(){var t=this.options,i=\"leaflet-zoom-\"+(this._zoomAnimated?\"animated\":\"hide\"),e=t.icon.createIcon(this._icon),n=!1;e!==this._icon&&(this._icon&&this._removeIcon(),n=!0,t.title&&(e.title=t.title),\"IMG\"===e.tagName&&(e.alt=t.alt||\"\")),pt(e,i),t.keyboard&&(e.tabIndex=\"0\"),this._icon=e,t.riseOnHover&&this.on({mouseover:this._bringToFront,mouseout:this._resetZIndex});var o=t.icon.createShadow(this._shadow),s=!1;o!==this._shadow&&(this._removeShadow(),s=!0),o&&(pt(o,i),o.alt=\"\"),this._shadow=o,t.opacity<1&&this._updateOpacity(),n&&this.getPane().appendChild(this._icon),this._initInteraction(),o&&s&&this.getPane(\"shadowPane\").appendChild(this._shadow)},_removeIcon:function(){this.options.riseOnHover&&this.off({mouseover:this._bringToFront,mouseout:this._resetZIndex}),ut(this._icon),this.removeInteractiveTarget(this._icon),this._icon=null},_removeShadow:function(){this._shadow&&ut(this._shadow),this._shadow=null},_setPos:function(t){Lt(this._icon,t),this._shadow&&Lt(this._shadow,t),this._zIndex=t.y+this.options.zIndexOffset,this._resetZIndex()},_updateZIndex:function(t){this._icon.style.zIndex=this._zIndex+t},_animateZoom:function(t){var i=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPos(i)},_initInteraction:function(){if(this.options.interactive&&(pt(this._icon,\"leaflet-interactive\"),this.addInteractiveTarget(this._icon),Ye)){var t=this.options.draggable;this.dragging&&(t=this.dragging.enabled(),this.dragging.disable()),this.dragging=new Ye(this),t&&this.dragging.enable()}},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},_updateOpacity:function(){var t=this.options.opacity;vt(this._icon,t),this._shadow&&vt(this._shadow,t)},_bringToFront:function(){this._updateZIndex(this.options.riseOffset)},_resetZIndex:function(){this._updateZIndex(0)},_getPopupAnchor:function(){return this.options.icon.options.popupAnchor},_getTooltipAnchor:function(){return this.options.icon.options.tooltipAnchor}}),Je=Ue.extend({options:{stroke:!0,color:\"#3388ff\",weight:3,opacity:1,lineCap:\"round\",lineJoin:\"round\",dashArray:null,dashOffset:null,fill:!1,fillColor:null,fillOpacity:.2,fillRule:\"evenodd\",interactive:!0,bubblingMouseEvents:!0},beforeAdd:function(t){this._renderer=t.getRenderer(this)},onAdd:function(){this._renderer._initPath(this),this._reset(),this._renderer._addPath(this)},onRemove:function(){this._renderer._removePath(this)},redraw:function(){return this._map&&this._renderer._updatePath(this),this},setStyle:function(t){return l(this,t),this._renderer&&this._renderer._updateStyle(this),this},bringToFront:function(){return this._renderer&&this._renderer._bringToFront(this),this},bringToBack:function(){return this._renderer&&this._renderer._bringToBack(this),this},getElement:function(){return this._path},_reset:function(){this._project(),this._update()},_clickTolerance:function(){return(this.options.stroke?this.options.weight/2:0)+this._renderer.options.tolerance}}),$e=Je.extend({options:{fill:!0,radius:10},initialize:function(t,i){l(this,i),this._latlng=C(t),this._radius=this.options.radius},setLatLng:function(t){return this._latlng=C(t),this.redraw(),this.fire(\"move\",{latlng:this._latlng})},getLatLng:function(){return this._latlng},setRadius:function(t){return this.options.radius=this._radius=t,this.redraw()},getRadius:function(){return this._radius},setStyle:function(t){var i=t&&t.radius||this._radius;return Je.prototype.setStyle.call(this,t),this.setRadius(i),this},_project:function(){this._point=this._map.latLngToLayerPoint(this._latlng),this._updateBounds()},_updateBounds:function(){var t=this._radius,i=this._radiusY||t,e=this._clickTolerance(),n=[t+e,i+e];this._pxBounds=new P(this._point.subtract(n),this._point.add(n))},_update:function(){this._map&&this._updatePath()},_updatePath:function(){this._renderer._updateCircle(this)},_empty:function(){return this._radius&&!this._renderer._bounds.intersects(this._pxBounds)},_containsPoint:function(t){return t.distanceTo(this._point)<=this._radius+this._clickTolerance()}}),Qe=$e.extend({initialize:function(t,e,n){if(\"number\"==typeof e&&(e=i({},n,{radius:e})),l(this,e),this._latlng=C(t),isNaN(this.options.radius))throw new Error(\"Circle radius cannot be NaN\");this._mRadius=this.options.radius},setRadius:function(t){return this._mRadius=t,this.redraw()},getRadius:function(){return this._mRadius},getBounds:function(){var t=[this._radius,this._radiusY||this._radius];return new T(this._map.layerPointToLatLng(this._point.subtract(t)),this._map.layerPointToLatLng(this._point.add(t)))},setStyle:Je.prototype.setStyle,_project:function(){var t=this._latlng.lng,i=this._latlng.lat,e=this._map,n=e.options.crs;if(n.distance===_i.distance){var o=Math.PI/180,s=this._mRadius/_i.R/o,r=e.project([i+s,t]),a=e.project([i-s,t]),h=r.add(a).divideBy(2),u=e.unproject(h).lat,l=Math.acos((Math.cos(s*o)-Math.sin(i*o)*Math.sin(u*o))/(Math.cos(i*o)*Math.cos(u*o)))/o;(isNaN(l)||0===l)&&(l=s/Math.cos(Math.PI/180*i)),this._point=h.subtract(e.getPixelOrigin()),this._radius=isNaN(l)?0:h.x-e.project([u,t-l]).x,this._radiusY=h.y-r.y}else{var c=n.unproject(n.project(this._latlng).subtract([this._mRadius,0]));this._point=e.latLngToLayerPoint(this._latlng),this._radius=this._point.x-e.latLngToLayerPoint(c).x}this._updateBounds()}}),tn=Je.extend({options:{smoothFactor:1,noClip:!1},initialize:function(t,i){l(this,i),this._setLatLngs(t)},getLatLngs:function(){return this._latlngs},setLatLngs:function(t){return this._setLatLngs(t),this.redraw()},isEmpty:function(){return!this._latlngs.length},closestLayerPoint:function(t){for(var i,e,n=1/0,o=null,s=Rt,r=0,a=this._parts.length;r<a;r++)for(var h=this._parts[r],u=1,l=h.length;u<l;u++){var c=s(t,i=h[u-1],e=h[u],!0);c<n&&(n=c,o=s(t,i,e))}return o&&(o.distance=Math.sqrt(n)),o},getCenter:function(){if(!this._map)throw new Error(\"Must add layer to map before using getCenter()\");var t,i,e,n,o,s,r,a=this._rings[0],h=a.length;if(!h)return null;for(t=0,i=0;t<h-1;t++)i+=a[t].distanceTo(a[t+1])/2;if(0===i)return this._map.layerPointToLatLng(a[0]);for(t=0,n=0;t<h-1;t++)if(o=a[t],s=a[t+1],e=o.distanceTo(s),(n+=e)>i)return r=(n-i)/e,this._map.layerPointToLatLng([s.x-r*(s.x-o.x),s.y-r*(s.y-o.y)])},getBounds:function(){return this._bounds},addLatLng:function(t,i){return i=i||this._defaultShape(),t=C(t),i.push(t),this._bounds.extend(t),this.redraw()},_setLatLngs:function(t){this._bounds=new T,this._latlngs=this._convertLatLngs(t)},_defaultShape:function(){return Dt(this._latlngs)?this._latlngs:this._latlngs[0]},_convertLatLngs:function(t){for(var i=[],e=Dt(t),n=0,o=t.length;n<o;n++)e?(i[n]=C(t[n]),this._bounds.extend(i[n])):i[n]=this._convertLatLngs(t[n]);return i},_project:function(){var t=new P;this._rings=[],this._projectLatlngs(this._latlngs,this._rings,t);var i=this._clickTolerance(),e=new x(i,i);this._bounds.isValid()&&t.isValid()&&(t.min._subtract(e),t.max._add(e),this._pxBounds=t)},_projectLatlngs:function(t,i,e){var n,o,s=t[0]instanceof M,r=t.length;if(s){for(o=[],n=0;n<r;n++)o[n]=this._map.latLngToLayerPoint(t[n]),e.extend(o[n]);i.push(o)}else for(n=0;n<r;n++)this._projectLatlngs(t[n],i,e)},_clipPoints:function(){var t=this._renderer._bounds;if(this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else{var i,e,n,o,s,r,a,h=this._parts;for(i=0,n=0,o=this._rings.length;i<o;i++)for(e=0,s=(a=this._rings[i]).length;e<s-1;e++)(r=At(a[e],a[e+1],t,e,!0))&&(h[n]=h[n]||[],h[n].push(r[0]),r[1]===a[e+1]&&e!==s-2||(h[n].push(r[1]),n++))}},_simplifyPoints:function(){for(var t=this._parts,i=this.options.smoothFactor,e=0,n=t.length;e<n;e++)t[e]=Ct(t[e],i)},_update:function(){this._map&&(this._clipPoints(),this._simplifyPoints(),this._updatePath())},_updatePath:function(){this._renderer._updatePoly(this)},_containsPoint:function(t,i){var e,n,o,s,r,a,h=this._clickTolerance();if(!this._pxBounds||!this._pxBounds.contains(t))return!1;for(e=0,s=this._parts.length;e<s;e++)for(n=0,o=(r=(a=this._parts[e]).length)-1;n<r;o=n++)if((i||0!==n)&&Zt(t,a[o],a[n])<=h)return!0;return!1}});tn._flat=Nt;var en=tn.extend({options:{fill:!0},isEmpty:function(){return!this._latlngs.length||!this._latlngs[0].length},getCenter:function(){if(!this._map)throw new Error(\"Must add layer to map before using getCenter()\");var t,i,e,n,o,s,r,a,h,u=this._rings[0],l=u.length;if(!l)return null;for(s=r=a=0,t=0,i=l-1;t<l;i=t++)e=u[t],n=u[i],o=e.y*n.x-n.y*e.x,r+=(e.x+n.x)*o,a+=(e.y+n.y)*o,s+=3*o;return h=0===s?u[0]:[r/s,a/s],this._map.layerPointToLatLng(h)},_convertLatLngs:function(t){var i=tn.prototype._convertLatLngs.call(this,t),e=i.length;return e>=2&&i[0]instanceof M&&i[0].equals(i[e-1])&&i.pop(),i},_setLatLngs:function(t){tn.prototype._setLatLngs.call(this,t),Dt(this._latlngs)&&(this._latlngs=[this._latlngs])},_defaultShape:function(){return Dt(this._latlngs[0])?this._latlngs[0]:this._latlngs[0][0]},_clipPoints:function(){var t=this._renderer._bounds,i=this.options.weight,e=new x(i,i);if(t=new P(t.min.subtract(e),t.max.add(e)),this._parts=[],this._pxBounds&&this._pxBounds.intersects(t))if(this.options.noClip)this._parts=this._rings;else for(var n,o=0,s=this._rings.length;o<s;o++)(n=jt(this._rings[o],t,!0)).length&&this._parts.push(n)},_updatePath:function(){this._renderer._updatePoly(this,!0)},_containsPoint:function(t){var i,e,n,o,s,r,a,h,u=!1;if(!this._pxBounds.contains(t))return!1;for(o=0,a=this._parts.length;o<a;o++)for(s=0,r=(h=(i=this._parts[o]).length)-1;s<h;r=s++)e=i[s],n=i[r],e.y>t.y!=n.y>t.y&&t.x<(n.x-e.x)*(t.y-e.y)/(n.y-e.y)+e.x&&(u=!u);return u||tn.prototype._containsPoint.call(this,t,!0)}}),nn=qe.extend({initialize:function(t,i){l(this,i),this._layers={},t&&this.addData(t)},addData:function(t){var i,e,n,o=ei(t)?t:t.features;if(o){for(i=0,e=o.length;i<e;i++)((n=o[i]).geometries||n.geometry||n.features||n.coordinates)&&this.addData(n);return this}var s=this.options;if(s.filter&&!s.filter(t))return this;var r=Wt(t,s);return r?(r.feature=Gt(t),r.defaultOptions=r.options,this.resetStyle(r),s.onEachFeature&&s.onEachFeature(t,r),this.addLayer(r)):this},resetStyle:function(t){return t.options=i({},t.defaultOptions),this._setLayerStyle(t,this.options.style),this},setStyle:function(t){return this.eachLayer(function(i){this._setLayerStyle(i,t)},this)},_setLayerStyle:function(t,i){\"function\"==typeof i&&(i=i(t.feature)),t.setStyle&&t.setStyle(i)}}),on={toGeoJSON:function(t){return qt(this,{type:\"Point\",coordinates:Ut(this.getLatLng(),t)})}};Xe.include(on),Qe.include(on),$e.include(on),tn.include({toGeoJSON:function(t){var i=!Dt(this._latlngs),e=Vt(this._latlngs,i?1:0,!1,t);return qt(this,{type:(i?\"Multi\":\"\")+\"LineString\",coordinates:e})}}),en.include({toGeoJSON:function(t){var i=!Dt(this._latlngs),e=i&&!Dt(this._latlngs[0]),n=Vt(this._latlngs,e?2:i?1:0,!0,t);return i||(n=[n]),qt(this,{type:(e?\"Multi\":\"\")+\"Polygon\",coordinates:n})}}),Ve.include({toMultiPoint:function(t){var i=[];return this.eachLayer(function(e){i.push(e.toGeoJSON(t).geometry.coordinates)}),qt(this,{type:\"MultiPoint\",coordinates:i})},toGeoJSON:function(t){var i=this.feature&&this.feature.geometry&&this.feature.geometry.type;if(\"MultiPoint\"===i)return this.toMultiPoint(t);var e=\"GeometryCollection\"===i,n=[];return this.eachLayer(function(i){if(i.toGeoJSON){var o=i.toGeoJSON(t);if(e)n.push(o.geometry);else{var s=Gt(o);\"FeatureCollection\"===s.type?n.push.apply(n,s.features):n.push(s)}}}),e?qt(this,{geometries:n,type:\"GeometryCollection\"}):{type:\"FeatureCollection\",features:n}}});var sn=Kt,rn=Ue.extend({options:{opacity:1,alt:\"\",interactive:!1,crossOrigin:!1,errorOverlayUrl:\"\",zIndex:1,className:\"\"},initialize:function(t,i,e){this._url=t,this._bounds=z(i),l(this,e)},onAdd:function(){this._image||(this._initImage(),this.options.opacity<1&&this._updateOpacity()),this.options.interactive&&(pt(this._image,\"leaflet-interactive\"),this.addInteractiveTarget(this._image)),this.getPane().appendChild(this._image),this._reset()},onRemove:function(){ut(this._image),this.options.interactive&&this.removeInteractiveTarget(this._image)},setOpacity:function(t){return this.options.opacity=t,this._image&&this._updateOpacity(),this},setStyle:function(t){return t.opacity&&this.setOpacity(t.opacity),this},bringToFront:function(){return this._map&&ct(this._image),this},bringToBack:function(){return this._map&&_t(this._image),this},setUrl:function(t){return this._url=t,this._image&&(this._image.src=t),this},setBounds:function(t){return this._bounds=z(t),this._map&&this._reset(),this},getEvents:function(){var t={zoom:this._reset,viewreset:this._reset};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},getBounds:function(){return this._bounds},getElement:function(){return this._image},_initImage:function(){var t=\"IMG\"===this._url.tagName,i=this._image=t?this._url:ht(\"img\");pt(i,\"leaflet-image-layer\"),this._zoomAnimated&&pt(i,\"leaflet-zoom-animated\"),this.options.className&&pt(i,this.options.className),i.onselectstart=r,i.onmousemove=r,i.onload=e(this.fire,this,\"load\"),i.onerror=e(this._overlayOnError,this,\"error\"),this.options.crossOrigin&&(i.crossOrigin=\"\"),this.options.zIndex&&this._updateZIndex(),t?this._url=i.src:(i.src=this._url,i.alt=this.options.alt)},_animateZoom:function(t){var i=this._map.getZoomScale(t.zoom),e=this._map._latLngBoundsToNewLayerBounds(this._bounds,t.zoom,t.center).min;wt(this._image,e,i)},_reset:function(){var t=this._image,i=new P(this._map.latLngToLayerPoint(this._bounds.getNorthWest()),this._map.latLngToLayerPoint(this._bounds.getSouthEast())),e=i.getSize();Lt(t,i.min),t.style.width=e.x+\"px\",t.style.height=e.y+\"px\"},_updateOpacity:function(){vt(this._image,this.options.opacity)},_updateZIndex:function(){this._image&&void 0!==this.options.zIndex&&null!==this.options.zIndex&&(this._image.style.zIndex=this.options.zIndex)},_overlayOnError:function(){this.fire(\"error\");var t=this.options.errorOverlayUrl;t&&this._url!==t&&(this._url=t,this._image.src=t)}}),an=rn.extend({options:{autoplay:!0,loop:!0},_initImage:function(){var t=\"VIDEO\"===this._url.tagName,i=this._image=t?this._url:ht(\"video\");if(pt(i,\"leaflet-image-layer\"),this._zoomAnimated&&pt(i,\"leaflet-zoom-animated\"),i.onselectstart=r,i.onmousemove=r,i.onloadeddata=e(this.fire,this,\"load\"),t){for(var n=i.getElementsByTagName(\"source\"),o=[],s=0;s<n.length;s++)o.push(n[s].src);this._url=n.length>0?o:[i.src]}else{ei(this._url)||(this._url=[this._url]),i.autoplay=!!this.options.autoplay,i.loop=!!this.options.loop;for(var a=0;a<this._url.length;a++){var h=ht(\"source\");h.src=this._url[a],i.appendChild(h)}}}}),hn=Ue.extend({options:{offset:[0,7],className:\"\",pane:\"popupPane\"},initialize:function(t,i){l(this,t),this._source=i},onAdd:function(t){this._zoomAnimated=t._zoomAnimated,this._container||this._initLayout(),t._fadeAnimated&&vt(this._container,0),clearTimeout(this._removeTimeout),this.getPane().appendChild(this._container),this.update(),t._fadeAnimated&&vt(this._container,1),this.bringToFront()},onRemove:function(t){t._fadeAnimated?(vt(this._container,0),this._removeTimeout=setTimeout(e(ut,void 0,this._container),200)):ut(this._container)},getLatLng:function(){return this._latlng},setLatLng:function(t){return this._latlng=C(t),this._map&&(this._updatePosition(),this._adjustPan()),this},getContent:function(){return this._content},setContent:function(t){return this._content=t,this.update(),this},getElement:function(){return this._container},update:function(){this._map&&(this._container.style.visibility=\"hidden\",this._updateContent(),this._updateLayout(),this._updatePosition(),this._container.style.visibility=\"\",this._adjustPan())},getEvents:function(){var t={zoom:this._updatePosition,viewreset:this._updatePosition};return this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},isOpen:function(){return!!this._map&&this._map.hasLayer(this)},bringToFront:function(){return this._map&&ct(this._container),this},bringToBack:function(){return this._map&&_t(this._container),this},_updateContent:function(){if(this._content){var t=this._contentNode,i=\"function\"==typeof this._content?this._content(this._source||this):this._content;if(\"string\"==typeof i)t.innerHTML=i;else{for(;t.hasChildNodes();)t.removeChild(t.firstChild);t.appendChild(i)}this.fire(\"contentupdate\")}},_updatePosition:function(){if(this._map){var t=this._map.latLngToLayerPoint(this._latlng),i=w(this.options.offset),e=this._getAnchor();this._zoomAnimated?Lt(this._container,t.add(e)):i=i.add(t).add(e);var n=this._containerBottom=-i.y,o=this._containerLeft=-Math.round(this._containerWidth/2)+i.x;this._container.style.bottom=n+\"px\",this._container.style.left=o+\"px\"}},_getAnchor:function(){return[0,0]}}),un=hn.extend({options:{maxWidth:300,minWidth:50,maxHeight:null,autoPan:!0,autoPanPaddingTopLeft:null,autoPanPaddingBottomRight:null,autoPanPadding:[5,5],keepInView:!1,closeButton:!0,autoClose:!0,closeOnEscapeKey:!0,className:\"\"},openOn:function(t){return t.openPopup(this),this},onAdd:function(t){hn.prototype.onAdd.call(this,t),t.fire(\"popupopen\",{popup:this}),this._source&&(this._source.fire(\"popupopen\",{popup:this},!0),this._source instanceof Je||this._source.on(\"preclick\",Y))},onRemove:function(t){hn.prototype.onRemove.call(this,t),t.fire(\"popupclose\",{popup:this}),this._source&&(this._source.fire(\"popupclose\",{popup:this},!0),this._source instanceof Je||this._source.off(\"preclick\",Y))},getEvents:function(){var t=hn.prototype.getEvents.call(this);return(void 0!==this.options.closeOnClick?this.options.closeOnClick:this._map.options.closePopupOnClick)&&(t.preclick=this._close),this.options.keepInView&&(t.moveend=this._adjustPan),t},_close:function(){this._map&&this._map.closePopup(this)},_initLayout:function(){var t=\"leaflet-popup\",i=this._container=ht(\"div\",t+\" \"+(this.options.className||\"\")+\" leaflet-zoom-animated\"),e=this._wrapper=ht(\"div\",t+\"-content-wrapper\",i);if(this._contentNode=ht(\"div\",t+\"-content\",e),J(e),X(this._contentNode),V(e,\"contextmenu\",Y),this._tipContainer=ht(\"div\",t+\"-tip-container\",i),this._tip=ht(\"div\",t+\"-tip\",this._tipContainer),this.options.closeButton){var n=this._closeButton=ht(\"a\",t+\"-close-button\",i);n.href=\"#close\",n.innerHTML=\"&#215;\",V(n,\"click\",this._onCloseButtonClick,this)}},_updateLayout:function(){var t=this._contentNode,i=t.style;i.width=\"\",i.whiteSpace=\"nowrap\";var e=t.offsetWidth;e=Math.min(e,this.options.maxWidth),e=Math.max(e,this.options.minWidth),i.width=e+1+\"px\",i.whiteSpace=\"\",i.height=\"\";var n=t.offsetHeight,o=this.options.maxHeight;o&&n>o?(i.height=o+\"px\",pt(t,\"leaflet-popup-scrolled\")):mt(t,\"leaflet-popup-scrolled\"),this._containerWidth=this._container.offsetWidth},_animateZoom:function(t){var i=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center),e=this._getAnchor();Lt(this._container,i.add(e))},_adjustPan:function(){if(!(!this.options.autoPan||this._map._panAnim&&this._map._panAnim._inProgress)){var t=this._map,i=parseInt(at(this._container,\"marginBottom\"),10)||0,e=this._container.offsetHeight+i,n=this._containerWidth,o=new x(this._containerLeft,-e-this._containerBottom);o._add(Pt(this._container));var s=t.layerPointToContainerPoint(o),r=w(this.options.autoPanPadding),a=w(this.options.autoPanPaddingTopLeft||r),h=w(this.options.autoPanPaddingBottomRight||r),u=t.getSize(),l=0,c=0;s.x+n+h.x>u.x&&(l=s.x+n-u.x+h.x),s.x-l-a.x<0&&(l=s.x-a.x),s.y+e+h.y>u.y&&(c=s.y+e-u.y+h.y),s.y-c-a.y<0&&(c=s.y-a.y),(l||c)&&t.fire(\"autopanstart\").panBy([l,c])}},_onCloseButtonClick:function(t){this._close(),Q(t)},_getAnchor:function(){return w(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});Le.mergeOptions({closePopupOnClick:!0}),Le.include({openPopup:function(t,i,e){return t instanceof un||(t=new un(e).setContent(t)),i&&t.setLatLng(i),this.hasLayer(t)?this:(this._popup&&this._popup.options.autoClose&&this.closePopup(),this._popup=t,this.addLayer(t))},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&this.removeLayer(t),this}}),Ue.include({bindPopup:function(t,i){return t instanceof un?(l(t,i),this._popup=t,t._source=this):(this._popup&&!i||(this._popup=new un(i,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t,i){if(t instanceof Ue||(i=t,t=this),t instanceof qe)for(var e in this._layers){t=this._layers[e];break}return i||(i=t.getCenter?t.getCenter():t.getLatLng()),this._popup&&this._map&&(this._popup._source=t,this._popup.update(),this._map.openPopup(this._popup,i)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(t){return this._popup&&(this._popup._map?this.closePopup():this.openPopup(t)),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var i=t.layer||t.target;this._popup&&this._map&&(Q(t),i instanceof Je?this.openPopup(t.layer||t.target,t.latlng):this._map.hasLayer(this._popup)&&this._popup._source===i?this.closePopup():this.openPopup(i,t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}});var ln=hn.extend({options:{pane:\"tooltipPane\",offset:[0,0],direction:\"auto\",permanent:!1,sticky:!1,interactive:!1,opacity:.9},onAdd:function(t){hn.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire(\"tooltipopen\",{tooltip:this}),this._source&&this._source.fire(\"tooltipopen\",{tooltip:this},!0)},onRemove:function(t){hn.prototype.onRemove.call(this,t),t.fire(\"tooltipclose\",{tooltip:this}),this._source&&this._source.fire(\"tooltipclose\",{tooltip:this},!0)},getEvents:function(){var t=hn.prototype.getEvents.call(this);return Vi&&!this.options.permanent&&(t.preclick=this._close),t},_close:function(){this._map&&this._map.closeTooltip(this)},_initLayout:function(){var t=\"leaflet-tooltip \"+(this.options.className||\"\")+\" leaflet-zoom-\"+(this._zoomAnimated?\"animated\":\"hide\");this._contentNode=this._container=ht(\"div\",t)},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var i=this._map,e=this._container,n=i.latLngToContainerPoint(i.getCenter()),o=i.layerPointToContainerPoint(t),s=this.options.direction,r=e.offsetWidth,a=e.offsetHeight,h=w(this.options.offset),u=this._getAnchor();\"top\"===s?t=t.add(w(-r/2+h.x,-a+h.y+u.y,!0)):\"bottom\"===s?t=t.subtract(w(r/2-h.x,-h.y,!0)):\"center\"===s?t=t.subtract(w(r/2+h.x,a/2-u.y+h.y,!0)):\"right\"===s||\"auto\"===s&&o.x<n.x?(s=\"right\",t=t.add(w(h.x+u.x,u.y-a/2+h.y,!0))):(s=\"left\",t=t.subtract(w(r+u.x-h.x,a/2-u.y-h.y,!0))),mt(e,\"leaflet-tooltip-right\"),mt(e,\"leaflet-tooltip-left\"),mt(e,\"leaflet-tooltip-top\"),mt(e,\"leaflet-tooltip-bottom\"),pt(e,\"leaflet-tooltip-\"+s),Lt(e,t)},_updatePosition:function(){var t=this._map.latLngToLayerPoint(this._latlng);this._setPosition(t)},setOpacity:function(t){this.options.opacity=t,this._container&&vt(this._container,t)},_animateZoom:function(t){var i=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center);this._setPosition(i)},_getAnchor:function(){return w(this._source&&this._source._getTooltipAnchor&&!this.options.sticky?this._source._getTooltipAnchor():[0,0])}});Le.include({openTooltip:function(t,i,e){return t instanceof ln||(t=new ln(e).setContent(t)),i&&t.setLatLng(i),this.hasLayer(t)?this:this.addLayer(t)},closeTooltip:function(t){return t&&this.removeLayer(t),this}}),Ue.include({bindTooltip:function(t,i){return t instanceof ln?(l(t,i),this._tooltip=t,t._source=this):(this._tooltip&&!i||(this._tooltip=new ln(i,this)),this._tooltip.setContent(t)),this._initTooltipInteractions(),this._tooltip.options.permanent&&this._map&&this._map.hasLayer(this)&&this.openTooltip(),this},unbindTooltip:function(){return this._tooltip&&(this._initTooltipInteractions(!0),this.closeTooltip(),this._tooltip=null),this},_initTooltipInteractions:function(t){if(t||!this._tooltipHandlersAdded){var i=t?\"off\":\"on\",e={remove:this.closeTooltip,move:this._moveTooltip};this._tooltip.options.permanent?e.add=this._openTooltip:(e.mouseover=this._openTooltip,e.mouseout=this.closeTooltip,this._tooltip.options.sticky&&(e.mousemove=this._moveTooltip),Vi&&(e.click=this._openTooltip)),this[i](e),this._tooltipHandlersAdded=!t}},openTooltip:function(t,i){if(t instanceof Ue||(i=t,t=this),t instanceof qe)for(var e in this._layers){t=this._layers[e];break}return i||(i=t.getCenter?t.getCenter():t.getLatLng()),this._tooltip&&this._map&&(this._tooltip._source=t,this._tooltip.update(),this._map.openTooltip(this._tooltip,i),this._tooltip.options.interactive&&this._tooltip._container&&(pt(this._tooltip._container,\"leaflet-clickable\"),this.addInteractiveTarget(this._tooltip._container))),this},closeTooltip:function(){return this._tooltip&&(this._tooltip._close(),this._tooltip.options.interactive&&this._tooltip._container&&(mt(this._tooltip._container,\"leaflet-clickable\"),this.removeInteractiveTarget(this._tooltip._container))),this},toggleTooltip:function(t){return this._tooltip&&(this._tooltip._map?this.closeTooltip():this.openTooltip(t)),this},isTooltipOpen:function(){return this._tooltip.isOpen()},setTooltipContent:function(t){return this._tooltip&&this._tooltip.setContent(t),this},getTooltip:function(){return this._tooltip},_openTooltip:function(t){var i=t.layer||t.target;this._tooltip&&this._map&&this.openTooltip(i,this._tooltip.options.sticky?t.latlng:void 0)},_moveTooltip:function(t){var i,e,n=t.latlng;this._tooltip.options.sticky&&t.originalEvent&&(i=this._map.mouseEventToContainerPoint(t.originalEvent),e=this._map.containerPointToLayerPoint(i),n=this._map.layerPointToLatLng(e)),this._tooltip.setLatLng(n)}});var cn=Ge.extend({options:{iconSize:[12,12],html:!1,bgPos:null,className:\"leaflet-div-icon\"},createIcon:function(t){var i=t&&\"DIV\"===t.tagName?t:document.createElement(\"div\"),e=this.options;if(i.innerHTML=!1!==e.html?e.html:\"\",e.bgPos){var n=w(e.bgPos);i.style.backgroundPosition=-n.x+\"px \"+-n.y+\"px\"}return this._setIconStyles(i,\"icon\"),i},createShadow:function(){return null}});Ge.Default=Ke;var _n=Ue.extend({options:{tileSize:256,opacity:1,updateWhenIdle:ji,updateWhenZooming:!0,updateInterval:200,zIndex:1,bounds:null,minZoom:0,maxZoom:void 0,maxNativeZoom:void 0,minNativeZoom:void 0,noWrap:!1,pane:\"tilePane\",className:\"\",keepBuffer:2},initialize:function(t){l(this,t)},onAdd:function(){this._initContainer(),this._levels={},this._tiles={},this._resetView(),this._update()},beforeAdd:function(t){t._addZoomLimit(this)},onRemove:function(t){this._removeAllTiles(),ut(this._container),t._removeZoomLimit(this),this._container=null,this._tileZoom=void 0},bringToFront:function(){return this._map&&(ct(this._container),this._setAutoZIndex(Math.max)),this},bringToBack:function(){return this._map&&(_t(this._container),this._setAutoZIndex(Math.min)),this},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},isLoading:function(){return this._loading},redraw:function(){return this._map&&(this._removeAllTiles(),this._update()),this},getEvents:function(){var t={viewprereset:this._invalidateAll,viewreset:this._resetView,zoom:this._resetView,moveend:this._onMoveEnd};return this.options.updateWhenIdle||(this._onMove||(this._onMove=o(this._onMoveEnd,this.options.updateInterval,this)),t.move=this._onMove),this._zoomAnimated&&(t.zoomanim=this._animateZoom),t},createTile:function(){return document.createElement(\"div\")},getTileSize:function(){var t=this.options.tileSize;return t instanceof x?t:new x(t,t)},_updateZIndex:function(){this._container&&void 0!==this.options.zIndex&&null!==this.options.zIndex&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t){for(var i,e=this.getPane().children,n=-t(-1/0,1/0),o=0,s=e.length;o<s;o++)i=e[o].style.zIndex,e[o]!==this._container&&i&&(n=t(n,+i));isFinite(n)&&(this.options.zIndex=n+t(-1,1),this._updateZIndex())},_updateOpacity:function(){if(this._map&&!Li){vt(this._container,this.options.opacity);var t=+new Date,i=!1,e=!1;for(var n in this._tiles){var o=this._tiles[n];if(o.current&&o.loaded){var s=Math.min(1,(t-o.loaded)/200);vt(o.el,s),s<1?i=!0:(o.active?e=!0:this._onOpaqueTile(o),o.active=!0)}}e&&!this._noPrune&&this._pruneTiles(),i&&(g(this._fadeFrame),this._fadeFrame=f(this._updateOpacity,this))}},_onOpaqueTile:r,_initContainer:function(){this._container||(this._container=ht(\"div\",\"leaflet-layer \"+(this.options.className||\"\")),this._updateZIndex(),this.options.opacity<1&&this._updateOpacity(),this.getPane().appendChild(this._container))},_updateLevels:function(){var t=this._tileZoom,i=this.options.maxZoom;if(void 0!==t){for(var e in this._levels)this._levels[e].el.children.length||e===t?(this._levels[e].el.style.zIndex=i-Math.abs(t-e),this._onUpdateLevel(e)):(ut(this._levels[e].el),this._removeTilesAtZoom(e),this._onRemoveLevel(e),delete this._levels[e]);var n=this._levels[t],o=this._map;return n||((n=this._levels[t]={}).el=ht(\"div\",\"leaflet-tile-container leaflet-zoom-animated\",this._container),n.el.style.zIndex=i,n.origin=o.project(o.unproject(o.getPixelOrigin()),t).round(),n.zoom=t,this._setZoomTransform(n,o.getCenter(),o.getZoom()),n.el.offsetWidth,this._onCreateLevel(n)),this._level=n,n}},_onUpdateLevel:r,_onRemoveLevel:r,_onCreateLevel:r,_pruneTiles:function(){if(this._map){var t,i,e=this._map.getZoom();if(e>this.options.maxZoom||e<this.options.minZoom)this._removeAllTiles();else{for(t in this._tiles)(i=this._tiles[t]).retain=i.current;for(t in this._tiles)if((i=this._tiles[t]).current&&!i.active){var n=i.coords;this._retainParent(n.x,n.y,n.z,n.z-5)||this._retainChildren(n.x,n.y,n.z,n.z+2)}for(t in this._tiles)this._tiles[t].retain||this._removeTile(t)}}},_removeTilesAtZoom:function(t){for(var i in this._tiles)this._tiles[i].coords.z===t&&this._removeTile(i)},_removeAllTiles:function(){for(var t in this._tiles)this._removeTile(t)},_invalidateAll:function(){for(var t in this._levels)ut(this._levels[t].el),this._onRemoveLevel(t),delete this._levels[t];this._removeAllTiles(),this._tileZoom=void 0},_retainParent:function(t,i,e,n){var o=Math.floor(t/2),s=Math.floor(i/2),r=e-1,a=new x(+o,+s);a.z=+r;var h=this._tileCoordsToKey(a),u=this._tiles[h];return u&&u.active?(u.retain=!0,!0):(u&&u.loaded&&(u.retain=!0),r>n&&this._retainParent(o,s,r,n))},_retainChildren:function(t,i,e,n){for(var o=2*t;o<2*t+2;o++)for(var s=2*i;s<2*i+2;s++){var r=new x(o,s);r.z=e+1;var a=this._tileCoordsToKey(r),h=this._tiles[a];h&&h.active?h.retain=!0:(h&&h.loaded&&(h.retain=!0),e+1<n&&this._retainChildren(o,s,e+1,n))}},_resetView:function(t){var i=t&&(t.pinch||t.flyTo);this._setView(this._map.getCenter(),this._map.getZoom(),i,i)},_animateZoom:function(t){this._setView(t.center,t.zoom,!0,t.noUpdate)},_clampZoom:function(t){var i=this.options;return void 0!==i.minNativeZoom&&t<i.minNativeZoom?i.minNativeZoom:void 0!==i.maxNativeZoom&&i.maxNativeZoom<t?i.maxNativeZoom:t},_setView:function(t,i,e,n){var o=this._clampZoom(Math.round(i));(void 0!==this.options.maxZoom&&o>this.options.maxZoom||void 0!==this.options.minZoom&&o<this.options.minZoom)&&(o=void 0);var s=this.options.updateWhenZooming&&o!==this._tileZoom;n&&!s||(this._tileZoom=o,this._abortLoading&&this._abortLoading(),this._updateLevels(),this._resetGrid(),void 0!==o&&this._update(t),e||this._pruneTiles(),this._noPrune=!!e),this._setZoomTransforms(t,i)},_setZoomTransforms:function(t,i){for(var e in this._levels)this._setZoomTransform(this._levels[e],t,i)},_setZoomTransform:function(t,i,e){var n=this._map.getZoomScale(e,t.zoom),o=t.origin.multiplyBy(n).subtract(this._map._getNewPixelOrigin(i,e)).round();Ni?wt(t.el,o,n):Lt(t.el,o)},_resetGrid:function(){var t=this._map,i=t.options.crs,e=this._tileSize=this.getTileSize(),n=this._tileZoom,o=this._map.getPixelWorldBounds(this._tileZoom);o&&(this._globalTileRange=this._pxBoundsToTileRange(o)),this._wrapX=i.wrapLng&&!this.options.noWrap&&[Math.floor(t.project([0,i.wrapLng[0]],n).x/e.x),Math.ceil(t.project([0,i.wrapLng[1]],n).x/e.y)],this._wrapY=i.wrapLat&&!this.options.noWrap&&[Math.floor(t.project([i.wrapLat[0],0],n).y/e.x),Math.ceil(t.project([i.wrapLat[1],0],n).y/e.y)]},_onMoveEnd:function(){this._map&&!this._map._animatingZoom&&this._update()},_getTiledPixelBounds:function(t){var i=this._map,e=i._animatingZoom?Math.max(i._animateToZoom,i.getZoom()):i.getZoom(),n=i.getZoomScale(e,this._tileZoom),o=i.project(t,this._tileZoom).floor(),s=i.getSize().divideBy(2*n);return new P(o.subtract(s),o.add(s))},_update:function(t){var i=this._map;if(i){var e=this._clampZoom(i.getZoom());if(void 0===t&&(t=i.getCenter()),void 0!==this._tileZoom){var n=this._getTiledPixelBounds(t),o=this._pxBoundsToTileRange(n),s=o.getCenter(),r=[],a=this.options.keepBuffer,h=new P(o.getBottomLeft().subtract([a,-a]),o.getTopRight().add([a,-a]));if(!(isFinite(o.min.x)&&isFinite(o.min.y)&&isFinite(o.max.x)&&isFinite(o.max.y)))throw new Error(\"Attempted to load an infinite number of tiles\");for(var u in this._tiles){var l=this._tiles[u].coords;l.z===this._tileZoom&&h.contains(new x(l.x,l.y))||(this._tiles[u].current=!1)}if(Math.abs(e-this._tileZoom)>1)this._setView(t,e);else{for(var c=o.min.y;c<=o.max.y;c++)for(var _=o.min.x;_<=o.max.x;_++){var d=new x(_,c);if(d.z=this._tileZoom,this._isValidTile(d)){var p=this._tiles[this._tileCoordsToKey(d)];p?p.current=!0:r.push(d)}}if(r.sort(function(t,i){return t.distanceTo(s)-i.distanceTo(s)}),0!==r.length){this._loading||(this._loading=!0,this.fire(\"loading\"));var m=document.createDocumentFragment();for(_=0;_<r.length;_++)this._addTile(r[_],m);this._level.el.appendChild(m)}}}}},_isValidTile:function(t){var i=this._map.options.crs;if(!i.infinite){var e=this._globalTileRange;if(!i.wrapLng&&(t.x<e.min.x||t.x>e.max.x)||!i.wrapLat&&(t.y<e.min.y||t.y>e.max.y))return!1}if(!this.options.bounds)return!0;var n=this._tileCoordsToBounds(t);return z(this.options.bounds).overlaps(n)},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var i=this._map,e=this.getTileSize(),n=t.scaleBy(e),o=n.add(e);return[i.unproject(n,t.z),i.unproject(o,t.z)]},_tileCoordsToBounds:function(t){var i=this._tileCoordsToNwSe(t),e=new T(i[0],i[1]);return this.options.noWrap||(e=this._map.wrapLatLngBounds(e)),e},_tileCoordsToKey:function(t){return t.x+\":\"+t.y+\":\"+t.z},_keyToTileCoords:function(t){var i=t.split(\":\"),e=new x(+i[0],+i[1]);return e.z=+i[2],e},_removeTile:function(t){var i=this._tiles[t];i&&(Ci||i.el.setAttribute(\"src\",ni),ut(i.el),delete this._tiles[t],this.fire(\"tileunload\",{tile:i.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){pt(t,\"leaflet-tile\");var i=this.getTileSize();t.style.width=i.x+\"px\",t.style.height=i.y+\"px\",t.onselectstart=r,t.onmousemove=r,Li&&this.options.opacity<1&&vt(t,this.options.opacity),Ti&&!zi&&(t.style.WebkitBackfaceVisibility=\"hidden\")},_addTile:function(t,i){var n=this._getTilePos(t),o=this._tileCoordsToKey(t),s=this.createTile(this._wrapCoords(t),e(this._tileReady,this,t));this._initTile(s),this.createTile.length<2&&f(e(this._tileReady,this,t,null,s)),Lt(s,n),this._tiles[o]={el:s,coords:t,current:!0},i.appendChild(s),this.fire(\"tileloadstart\",{tile:s,coords:t})},_tileReady:function(t,i,n){if(this._map){i&&this.fire(\"tileerror\",{error:i,tile:n,coords:t});var o=this._tileCoordsToKey(t);(n=this._tiles[o])&&(n.loaded=+new Date,this._map._fadeAnimated?(vt(n.el,0),g(this._fadeFrame),this._fadeFrame=f(this._updateOpacity,this)):(n.active=!0,this._pruneTiles()),i||(pt(n.el,\"leaflet-tile-loaded\"),this.fire(\"tileload\",{tile:n.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire(\"load\"),Li||!this._map._fadeAnimated?f(this._pruneTiles,this):setTimeout(e(this._pruneTiles,this),250)))}},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var i=new x(this._wrapX?s(t.x,this._wrapX):t.x,this._wrapY?s(t.y,this._wrapY):t.y);return i.z=t.z,i},_pxBoundsToTileRange:function(t){var i=this.getTileSize();return new P(t.min.unscaleBy(i).floor(),t.max.unscaleBy(i).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}}),dn=_n.extend({options:{minZoom:0,maxZoom:18,subdomains:\"abc\",errorTileUrl:\"\",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1},initialize:function(t,i){this._url=t,(i=l(this,i)).detectRetina&&Ki&&i.maxZoom>0&&(i.tileSize=Math.floor(i.tileSize/2),i.zoomReverse?(i.zoomOffset--,i.minZoom++):(i.zoomOffset++,i.maxZoom--),i.minZoom=Math.max(0,i.minZoom)),\"string\"==typeof i.subdomains&&(i.subdomains=i.subdomains.split(\"\")),Ti||this.on(\"tileunload\",this._onTileRemove)},setUrl:function(t,i){return this._url=t,i||this.redraw(),this},createTile:function(t,i){var n=document.createElement(\"img\");return V(n,\"load\",e(this._tileOnLoad,this,i,n)),V(n,\"error\",e(this._tileOnError,this,i,n)),this.options.crossOrigin&&(n.crossOrigin=\"\"),n.alt=\"\",n.setAttribute(\"role\",\"presentation\"),n.src=this.getTileUrl(t),n},getTileUrl:function(t){var e={r:Ki?\"@2x\":\"\",s:this._getSubdomain(t),x:t.x,y:t.y,z:this._getZoomForUrl()};if(this._map&&!this._map.options.crs.infinite){var n=this._globalTileRange.max.y-t.y;this.options.tms&&(e.y=n),e[\"-y\"]=n}return _(this._url,i(e,this.options))},_tileOnLoad:function(t,i){Li?setTimeout(e(t,this,null,i),0):t(null,i)},_tileOnError:function(t,i,e){var n=this.options.errorTileUrl;n&&i.getAttribute(\"src\")!==n&&(i.src=n),t(e,i)},_onTileRemove:function(t){t.tile.onload=null},_getZoomForUrl:function(){var t=this._tileZoom,i=this.options.maxZoom,e=this.options.zoomReverse,n=this.options.zoomOffset;return e&&(t=i-t),t+n},_getSubdomain:function(t){var i=Math.abs(t.x+t.y)%this.options.subdomains.length;return this.options.subdomains[i]},_abortLoading:function(){var t,i;for(t in this._tiles)this._tiles[t].coords.z!==this._tileZoom&&((i=this._tiles[t].el).onload=r,i.onerror=r,i.complete||(i.src=ni,ut(i),delete this._tiles[t]))}}),pn=dn.extend({defaultWmsParams:{service:\"WMS\",request:\"GetMap\",layers:\"\",styles:\"\",format:\"image/jpeg\",transparent:!1,version:\"1.1.1\"},options:{crs:null,uppercase:!1},initialize:function(t,e){this._url=t;var n=i({},this.defaultWmsParams);for(var o in e)o in this.options||(n[o]=e[o]);var s=(e=l(this,e)).detectRetina&&Ki?2:1,r=this.getTileSize();n.width=r.x*s,n.height=r.y*s,this.wmsParams=n},onAdd:function(t){this._crs=this.options.crs||t.options.crs,this._wmsVersion=parseFloat(this.wmsParams.version);var i=this._wmsVersion>=1.3?\"crs\":\"srs\";this.wmsParams[i]=this._crs.code,dn.prototype.onAdd.call(this,t)},getTileUrl:function(t){var i=this._tileCoordsToNwSe(t),e=this._crs,n=b(e.project(i[0]),e.project(i[1])),o=n.min,s=n.max,r=(this._wmsVersion>=1.3&&this._crs===He?[o.y,o.x,s.y,s.x]:[o.x,o.y,s.x,s.y]).join(\",\"),a=L.TileLayer.prototype.getTileUrl.call(this,t);return a+c(this.wmsParams,a,this.options.uppercase)+(this.options.uppercase?\"&BBOX=\":\"&bbox=\")+r},setParams:function(t,e){return i(this.wmsParams,t),e||this.redraw(),this}});dn.WMS=pn,Yt.wms=function(t,i){return new pn(t,i)};var mn=Ue.extend({options:{padding:.1,tolerance:0},initialize:function(t){l(this,t),n(this),this._layers=this._layers||{}},onAdd:function(){this._container||(this._initContainer(),this._zoomAnimated&&pt(this._container,\"leaflet-zoom-animated\")),this.getPane().appendChild(this._container),this._update(),this.on(\"update\",this._updatePaths,this)},onRemove:function(){this.off(\"update\",this._updatePaths,this),this._destroyContainer()},getEvents:function(){var t={viewreset:this._reset,zoom:this._onZoom,moveend:this._update,zoomend:this._onZoomEnd};return this._zoomAnimated&&(t.zoomanim=this._onAnimZoom),t},_onAnimZoom:function(t){this._updateTransform(t.center,t.zoom)},_onZoom:function(){this._updateTransform(this._map.getCenter(),this._map.getZoom())},_updateTransform:function(t,i){var e=this._map.getZoomScale(i,this._zoom),n=Pt(this._container),o=this._map.getSize().multiplyBy(.5+this.options.padding),s=this._map.project(this._center,i),r=this._map.project(t,i).subtract(s),a=o.multiplyBy(-e).add(n).add(o).subtract(r);Ni?wt(this._container,a,e):Lt(this._container,a)},_reset:function(){this._update(),this._updateTransform(this._center,this._zoom);for(var t in this._layers)this._layers[t]._reset()},_onZoomEnd:function(){for(var t in this._layers)this._layers[t]._project()},_updatePaths:function(){for(var t in this._layers)this._layers[t]._update()},_update:function(){var t=this.options.padding,i=this._map.getSize(),e=this._map.containerPointToLayerPoint(i.multiplyBy(-t)).round();this._bounds=new P(e,e.add(i.multiplyBy(1+2*t)).round()),this._center=this._map.getCenter(),this._zoom=this._map.getZoom()}}),fn=mn.extend({getEvents:function(){var t=mn.prototype.getEvents.call(this);return t.viewprereset=this._onViewPreReset,t},_onViewPreReset:function(){this._postponeUpdatePaths=!0},onAdd:function(){mn.prototype.onAdd.call(this),this._draw()},_initContainer:function(){var t=this._container=document.createElement(\"canvas\");V(t,\"mousemove\",o(this._onMouseMove,32,this),this),V(t,\"click dblclick mousedown mouseup contextmenu\",this._onClick,this),V(t,\"mouseout\",this._handleMouseOut,this),this._ctx=t.getContext(\"2d\")},_destroyContainer:function(){delete this._ctx,ut(this._container),q(this._container),delete this._container},_updatePaths:function(){if(!this._postponeUpdatePaths){this._redrawBounds=null;for(var t in this._layers)this._layers[t]._update();this._redraw()}},_update:function(){if(!this._map._animatingZoom||!this._bounds){this._drawnLayers={},mn.prototype._update.call(this);var t=this._bounds,i=this._container,e=t.getSize(),n=Ki?2:1;Lt(i,t.min),i.width=n*e.x,i.height=n*e.y,i.style.width=e.x+\"px\",i.style.height=e.y+\"px\",Ki&&this._ctx.scale(2,2),this._ctx.translate(-t.min.x,-t.min.y),this.fire(\"update\")}},_reset:function(){mn.prototype._reset.call(this),this._postponeUpdatePaths&&(this._postponeUpdatePaths=!1,this._updatePaths())},_initPath:function(t){this._updateDashArray(t),this._layers[n(t)]=t;var i=t._order={layer:t,prev:this._drawLast,next:null};this._drawLast&&(this._drawLast.next=i),this._drawLast=i,this._drawFirst=this._drawFirst||this._drawLast},_addPath:function(t){this._requestRedraw(t)},_removePath:function(t){var i=t._order,e=i.next,n=i.prev;e?e.prev=n:this._drawLast=n,n?n.next=e:this._drawFirst=e,delete t._order,delete this._layers[L.stamp(t)],this._requestRedraw(t)},_updatePath:function(t){this._extendRedrawBounds(t),t._project(),t._update(),this._requestRedraw(t)},_updateStyle:function(t){this._updateDashArray(t),this._requestRedraw(t)},_updateDashArray:function(t){if(t.options.dashArray){var i,e=t.options.dashArray.split(\",\"),n=[];for(i=0;i<e.length;i++)n.push(Number(e[i]));t.options._dashArray=n}},_requestRedraw:function(t){this._map&&(this._extendRedrawBounds(t),this._redrawRequest=this._redrawRequest||f(this._redraw,this))},_extendRedrawBounds:function(t){if(t._pxBounds){var i=(t.options.weight||0)+1;this._redrawBounds=this._redrawBounds||new P,this._redrawBounds.extend(t._pxBounds.min.subtract([i,i])),this._redrawBounds.extend(t._pxBounds.max.add([i,i]))}},_redraw:function(){this._redrawRequest=null,this._redrawBounds&&(this._redrawBounds.min._floor(),this._redrawBounds.max._ceil()),this._clear(),this._draw(),this._redrawBounds=null},_clear:function(){var t=this._redrawBounds;if(t){var i=t.getSize();this._ctx.clearRect(t.min.x,t.min.y,i.x,i.y)}else this._ctx.clearRect(0,0,this._container.width,this._container.height)},_draw:function(){var t,i=this._redrawBounds;if(this._ctx.save(),i){var e=i.getSize();this._ctx.beginPath(),this._ctx.rect(i.min.x,i.min.y,e.x,e.y),this._ctx.clip()}this._drawing=!0;for(var n=this._drawFirst;n;n=n.next)t=n.layer,(!i||t._pxBounds&&t._pxBounds.intersects(i))&&t._updatePath();this._drawing=!1,this._ctx.restore()},_updatePoly:function(t,i){if(this._drawing){var e,n,o,s,r=t._parts,a=r.length,h=this._ctx;if(a){for(this._drawnLayers[t._leaflet_id]=t,h.beginPath(),e=0;e<a;e++){for(n=0,o=r[e].length;n<o;n++)s=r[e][n],h[n?\"lineTo\":\"moveTo\"](s.x,s.y);i&&h.closePath()}this._fillStroke(h,t)}}},_updateCircle:function(t){if(this._drawing&&!t._empty()){var i=t._point,e=this._ctx,n=Math.max(Math.round(t._radius),1),o=(Math.max(Math.round(t._radiusY),1)||n)/n;this._drawnLayers[t._leaflet_id]=t,1!==o&&(e.save(),e.scale(1,o)),e.beginPath(),e.arc(i.x,i.y/o,n,0,2*Math.PI,!1),1!==o&&e.restore(),this._fillStroke(e,t)}},_fillStroke:function(t,i){var e=i.options;e.fill&&(t.globalAlpha=e.fillOpacity,t.fillStyle=e.fillColor||e.color,t.fill(e.fillRule||\"evenodd\")),e.stroke&&0!==e.weight&&(t.setLineDash&&t.setLineDash(i.options&&i.options._dashArray||[]),t.globalAlpha=e.opacity,t.lineWidth=e.weight,t.strokeStyle=e.color,t.lineCap=e.lineCap,t.lineJoin=e.lineJoin,t.stroke())},_onClick:function(t){for(var i,e,n=this._map.mouseEventToLayerPoint(t),o=this._drawFirst;o;o=o.next)(i=o.layer).options.interactive&&i._containsPoint(n)&&!this._map._draggableMoved(i)&&(e=i);e&&(et(t),this._fireEvent([e],t))},_onMouseMove:function(t){if(this._map&&!this._map.dragging.moving()&&!this._map._animatingZoom){var i=this._map.mouseEventToLayerPoint(t);this._handleMouseHover(t,i)}},_handleMouseOut:function(t){var i=this._hoveredLayer;i&&(mt(this._container,\"leaflet-interactive\"),this._fireEvent([i],t,\"mouseout\"),this._hoveredLayer=null)},_handleMouseHover:function(t,i){for(var e,n,o=this._drawFirst;o;o=o.next)(e=o.layer).options.interactive&&e._containsPoint(i)&&(n=e);n!==this._hoveredLayer&&(this._handleMouseOut(t),n&&(pt(this._container,\"leaflet-interactive\"),this._fireEvent([n],t,\"mouseover\"),this._hoveredLayer=n)),this._hoveredLayer&&this._fireEvent([this._hoveredLayer],t)},_fireEvent:function(t,i,e){this._map._fireDOMEvent(i,e||i.type,t)},_bringToFront:function(t){var i=t._order,e=i.next,n=i.prev;e&&(e.prev=n,n?n.next=e:e&&(this._drawFirst=e),i.prev=this._drawLast,this._drawLast.next=i,i.next=null,this._drawLast=i,this._requestRedraw(t))},_bringToBack:function(t){var i=t._order,e=i.next,n=i.prev;n&&(n.next=e,e?e.prev=n:n&&(this._drawLast=n),i.prev=null,i.next=this._drawFirst,this._drawFirst.prev=i,this._drawFirst=i,this._requestRedraw(t))}}),gn=function(){try{return document.namespaces.add(\"lvml\",\"urn:schemas-microsoft-com:vml\"),function(t){return document.createElement(\"<lvml:\"+t+' class=\"lvml\">')}}catch(t){return function(t){return document.createElement(\"<\"+t+' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"lvml\">')}}}(),vn={_initContainer:function(){this._container=ht(\"div\",\"leaflet-vml-container\")},_update:function(){this._map._animatingZoom||(mn.prototype._update.call(this),this.fire(\"update\"))},_initPath:function(t){var i=t._container=gn(\"shape\");pt(i,\"leaflet-vml-shape \"+(this.options.className||\"\")),i.coordsize=\"1 1\",t._path=gn(\"path\"),i.appendChild(t._path),this._updateStyle(t),this._layers[n(t)]=t},_addPath:function(t){var i=t._container;this._container.appendChild(i),t.options.interactive&&t.addInteractiveTarget(i)},_removePath:function(t){var i=t._container;ut(i),t.removeInteractiveTarget(i),delete this._layers[n(t)]},_updateStyle:function(t){var i=t._stroke,e=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(i||(i=t._stroke=gn(\"stroke\")),o.appendChild(i),i.weight=n.weight+\"px\",i.color=n.color,i.opacity=n.opacity,n.dashArray?i.dashStyle=ei(n.dashArray)?n.dashArray.join(\" \"):n.dashArray.replace(/( *, *)/g,\" \"):i.dashStyle=\"\",i.endcap=n.lineCap.replace(\"butt\",\"flat\"),i.joinstyle=n.lineJoin):i&&(o.removeChild(i),t._stroke=null),n.fill?(e||(e=t._fill=gn(\"fill\")),o.appendChild(e),e.color=n.fillColor||n.color,e.opacity=n.fillOpacity):e&&(o.removeChild(e),t._fill=null)},_updateCircle:function(t){var i=t._point.round(),e=Math.round(t._radius),n=Math.round(t._radiusY||e);this._setPath(t,t._empty()?\"M0 0\":\"AL \"+i.x+\",\"+i.y+\" \"+e+\",\"+n+\" 0,23592600\")},_setPath:function(t,i){t._path.v=i},_bringToFront:function(t){ct(t._container)},_bringToBack:function(t){_t(t._container)}},yn=Ji?gn:E,xn=mn.extend({getEvents:function(){var t=mn.prototype.getEvents.call(this);return t.zoomstart=this._onZoomStart,t},_initContainer:function(){this._container=yn(\"svg\"),this._container.setAttribute(\"pointer-events\",\"none\"),this._rootGroup=yn(\"g\"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){ut(this._container),q(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_onZoomStart:function(){this._update()},_update:function(){if(!this._map._animatingZoom||!this._bounds){mn.prototype._update.call(this);var t=this._bounds,i=t.getSize(),e=this._container;this._svgSize&&this._svgSize.equals(i)||(this._svgSize=i,e.setAttribute(\"width\",i.x),e.setAttribute(\"height\",i.y)),Lt(e,t.min),e.setAttribute(\"viewBox\",[t.min.x,t.min.y,i.x,i.y].join(\" \")),this.fire(\"update\")}},_initPath:function(t){var i=t._path=yn(\"path\");t.options.className&&pt(i,t.options.className),t.options.interactive&&pt(i,\"leaflet-interactive\"),this._updateStyle(t),this._layers[n(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){ut(t._path),t.removeInteractiveTarget(t._path),delete this._layers[n(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var i=t._path,e=t.options;i&&(e.stroke?(i.setAttribute(\"stroke\",e.color),i.setAttribute(\"stroke-opacity\",e.opacity),i.setAttribute(\"stroke-width\",e.weight),i.setAttribute(\"stroke-linecap\",e.lineCap),i.setAttribute(\"stroke-linejoin\",e.lineJoin),e.dashArray?i.setAttribute(\"stroke-dasharray\",e.dashArray):i.removeAttribute(\"stroke-dasharray\"),e.dashOffset?i.setAttribute(\"stroke-dashoffset\",e.dashOffset):i.removeAttribute(\"stroke-dashoffset\")):i.setAttribute(\"stroke\",\"none\"),e.fill?(i.setAttribute(\"fill\",e.fillColor||e.color),i.setAttribute(\"fill-opacity\",e.fillOpacity),i.setAttribute(\"fill-rule\",e.fillRule||\"evenodd\")):i.setAttribute(\"fill\",\"none\"))},_updatePoly:function(t,i){this._setPath(t,k(t._parts,i))},_updateCircle:function(t){var i=t._point,e=Math.max(Math.round(t._radius),1),n=\"a\"+e+\",\"+(Math.max(Math.round(t._radiusY),1)||e)+\" 0 1,0 \",o=t._empty()?\"M0 0\":\"M\"+(i.x-e)+\",\"+i.y+n+2*e+\",0 \"+n+2*-e+\",0 \";this._setPath(t,o)},_setPath:function(t,i){t._path.setAttribute(\"d\",i)},_bringToFront:function(t){ct(t._path)},_bringToBack:function(t){_t(t._path)}});Ji&&xn.include(vn),Le.include({getRenderer:function(t){var i=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer;return i||(i=this._renderer=this.options.preferCanvas&&Xt()||Jt()),this.hasLayer(i)||this.addLayer(i),i},_getPaneRenderer:function(t){if(\"overlayPane\"===t||void 0===t)return!1;var i=this._paneRenderers[t];return void 0===i&&(i=xn&&Jt({pane:t})||fn&&Xt({pane:t}),this._paneRenderers[t]=i),i}});var wn=en.extend({initialize:function(t,i){en.prototype.initialize.call(this,this._boundsToLatLngs(t),i)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return t=z(t),[t.getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});xn.create=yn,xn.pointsToPath=k,nn.geometryToLayer=Wt,nn.coordsToLatLng=Ht,nn.coordsToLatLngs=Ft,nn.latLngToCoords=Ut,nn.latLngsToCoords=Vt,nn.getFeature=qt,nn.asFeature=Gt,Le.mergeOptions({boxZoom:!0});var Ln=Ze.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on(\"unload\",this._destroy,this)},addHooks:function(){V(this._container,\"mousedown\",this._onMouseDown,this)},removeHooks:function(){q(this._container,\"mousedown\",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){ut(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),mi(),bt(),this._startPoint=this._map.mouseEventToContainerPoint(t),V(document,{contextmenu:Q,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=ht(\"div\",\"leaflet-zoom-box\",this._container),pt(this._container,\"leaflet-crosshair\"),this._map.fire(\"boxzoomstart\")),this._point=this._map.mouseEventToContainerPoint(t);var i=new P(this._point,this._startPoint),e=i.getSize();Lt(this._box,i.min),this._box.style.width=e.x+\"px\",this._box.style.height=e.y+\"px\"},_finish:function(){this._moved&&(ut(this._box),mt(this._container,\"leaflet-crosshair\")),fi(),Tt(),q(document,{contextmenu:Q,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){if((1===t.which||1===t.button)&&(this._finish(),this._moved)){this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(e(this._resetState,this),0);var i=new T(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point));this._map.fitBounds(i).fire(\"boxzoomend\",{boxZoomBounds:i})}},_onKeyDown:function(t){27===t.keyCode&&this._finish()}});Le.addInitHook(\"addHandler\",\"boxZoom\",Ln),Le.mergeOptions({doubleClickZoom:!0});var Pn=Ze.extend({addHooks:function(){this._map.on(\"dblclick\",this._onDoubleClick,this)},removeHooks:function(){this._map.off(\"dblclick\",this._onDoubleClick,this)},_onDoubleClick:function(t){var i=this._map,e=i.getZoom(),n=i.options.zoomDelta,o=t.originalEvent.shiftKey?e-n:e+n;\"center\"===i.options.doubleClickZoom?i.setZoom(o):i.setZoomAround(t.containerPoint,o)}});Le.addInitHook(\"addHandler\",\"doubleClickZoom\",Pn),Le.mergeOptions({dragging:!0,inertia:!zi,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});var bn=Ze.extend({addHooks:function(){if(!this._draggable){var t=this._map;this._draggable=new Be(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on(\"predrag\",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on(\"predrag\",this._onPreDragWrap,this),t.on(\"zoomend\",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))}pt(this._map._container,\"leaflet-grab leaflet-touch-drag\"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){mt(this._map._container,\"leaflet-grab\"),mt(this._map._container,\"leaflet-touch-drag\"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t=this._map;if(t._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity){var i=z(this._map.options.maxBounds);this._offsetLimit=b(this._map.latLngToContainerPoint(i.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(i.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))}else this._offsetLimit=null;t.fire(\"movestart\").fire(\"dragstart\"),t.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){if(this._map.options.inertia){var i=this._lastTime=+new Date,e=this._lastPos=this._draggable._absPos||this._draggable._newPos;this._positions.push(e),this._times.push(i),this._prunePositions(i)}this._map.fire(\"move\",t).fire(\"drag\",t)},_prunePositions:function(t){for(;this._positions.length>1&&t-this._times[0]>50;)this._positions.shift(),this._times.shift()},_onZoomEnd:function(){var t=this._map.getSize().divideBy(2),i=this._map.latLngToLayerPoint([0,0]);this._initialWorldOffset=i.subtract(t).x,this._worldWidth=this._map.getPixelWorldBounds().getSize().x},_viscousLimit:function(t,i){return t-(t-i)*this._viscosity},_onPreDragLimit:function(){if(this._viscosity&&this._offsetLimit){var t=this._draggable._newPos.subtract(this._draggable._startPos),i=this._offsetLimit;t.x<i.min.x&&(t.x=this._viscousLimit(t.x,i.min.x)),t.y<i.min.y&&(t.y=this._viscousLimit(t.y,i.min.y)),t.x>i.max.x&&(t.x=this._viscousLimit(t.x,i.max.x)),t.y>i.max.y&&(t.y=this._viscousLimit(t.y,i.max.y)),this._draggable._newPos=this._draggable._startPos.add(t)}},_onPreDragWrap:function(){var t=this._worldWidth,i=Math.round(t/2),e=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-i+e)%t+i-e,s=(n+i+e)%t-i-e,r=Math.abs(o+e)<Math.abs(s+e)?o:s;this._draggable._absPos=this._draggable._newPos.clone(),this._draggable._newPos.x=r},_onDragEnd:function(t){var i=this._map,e=i.options,n=!e.inertia||this._times.length<2;if(i.fire(\"dragend\",t),n)i.fire(\"moveend\");else{this._prunePositions(+new Date);var o=this._lastPos.subtract(this._positions[0]),s=(this._lastTime-this._times[0])/1e3,r=e.easeLinearity,a=o.multiplyBy(r/s),h=a.distanceTo([0,0]),u=Math.min(e.inertiaMaxSpeed,h),l=a.multiplyBy(u/h),c=u/(e.inertiaDeceleration*r),_=l.multiplyBy(-c/2).round();_.x||_.y?(_=i._limitOffset(_,i.options.maxBounds),f(function(){i.panBy(_,{duration:c,easeLinearity:r,noMoveStart:!0,animate:!0})})):i.fire(\"moveend\")}}});Le.addInitHook(\"addHandler\",\"dragging\",bn),Le.mergeOptions({keyboard:!0,keyboardPanDelta:80});var Tn=Ze.extend({keyCodes:{left:[37],right:[39],down:[40],up:[38],zoomIn:[187,107,61,171],zoomOut:[189,109,54,173]},initialize:function(t){this._map=t,this._setPanDelta(t.options.keyboardPanDelta),this._setZoomDelta(t.options.zoomDelta)},addHooks:function(){var t=this._map._container;t.tabIndex<=0&&(t.tabIndex=\"0\"),V(t,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.on({focus:this._addHooks,blur:this._removeHooks},this)},removeHooks:function(){this._removeHooks(),q(this._map._container,{focus:this._onFocus,blur:this._onBlur,mousedown:this._onMouseDown},this),this._map.off({focus:this._addHooks,blur:this._removeHooks},this)},_onMouseDown:function(){if(!this._focused){var t=document.body,i=document.documentElement,e=t.scrollTop||i.scrollTop,n=t.scrollLeft||i.scrollLeft;this._map._container.focus(),window.scrollTo(n,e)}},_onFocus:function(){this._focused=!0,this._map.fire(\"focus\")},_onBlur:function(){this._focused=!1,this._map.fire(\"blur\")},_setPanDelta:function(t){var i,e,n=this._panKeys={},o=this.keyCodes;for(i=0,e=o.left.length;i<e;i++)n[o.left[i]]=[-1*t,0];for(i=0,e=o.right.length;i<e;i++)n[o.right[i]]=[t,0];for(i=0,e=o.down.length;i<e;i++)n[o.down[i]]=[0,t];for(i=0,e=o.up.length;i<e;i++)n[o.up[i]]=[0,-1*t]},_setZoomDelta:function(t){var i,e,n=this._zoomKeys={},o=this.keyCodes;for(i=0,e=o.zoomIn.length;i<e;i++)n[o.zoomIn[i]]=t;for(i=0,e=o.zoomOut.length;i<e;i++)n[o.zoomOut[i]]=-t},_addHooks:function(){V(document,\"keydown\",this._onKeyDown,this)},_removeHooks:function(){q(document,\"keydown\",this._onKeyDown,this)},_onKeyDown:function(t){if(!(t.altKey||t.ctrlKey||t.metaKey)){var i,e=t.keyCode,n=this._map;if(e in this._panKeys){if(n._panAnim&&n._panAnim._inProgress)return;i=this._panKeys[e],t.shiftKey&&(i=w(i).multiplyBy(3)),n.panBy(i),n.options.maxBounds&&n.panInsideBounds(n.options.maxBounds)}else if(e in this._zoomKeys)n.setZoom(n.getZoom()+(t.shiftKey?3:1)*this._zoomKeys[e]);else{if(27!==e||!n._popup||!n._popup.options.closeOnEscapeKey)return;n.closePopup()}Q(t)}}});Le.addInitHook(\"addHandler\",\"keyboard\",Tn),Le.mergeOptions({scrollWheelZoom:!0,wheelDebounceTime:40,wheelPxPerZoomLevel:60});var zn=Ze.extend({addHooks:function(){V(this._map._container,\"mousewheel\",this._onWheelScroll,this),this._delta=0},removeHooks:function(){q(this._map._container,\"mousewheel\",this._onWheelScroll,this)},_onWheelScroll:function(t){var i=it(t),n=this._map.options.wheelDebounceTime;this._delta+=i,this._lastMousePos=this._map.mouseEventToContainerPoint(t),this._startTime||(this._startTime=+new Date);var o=Math.max(n-(+new Date-this._startTime),0);clearTimeout(this._timer),this._timer=setTimeout(e(this._performZoom,this),o),Q(t)},_performZoom:function(){var t=this._map,i=t.getZoom(),e=this._map.options.zoomSnap||0;t._stop();var n=this._delta/(4*this._map.options.wheelPxPerZoomLevel),o=4*Math.log(2/(1+Math.exp(-Math.abs(n))))/Math.LN2,s=e?Math.ceil(o/e)*e:o,r=t._limitZoom(i+(this._delta>0?s:-s))-i;this._delta=0,this._startTime=null,r&&(\"center\"===t.options.scrollWheelZoom?t.setZoom(i+r):t.setZoomAround(this._lastMousePos,i+r))}});Le.addInitHook(\"addHandler\",\"scrollWheelZoom\",zn),Le.mergeOptions({tap:!0,tapTolerance:15});var Mn=Ze.extend({addHooks:function(){V(this._map._container,\"touchstart\",this._onDown,this)},removeHooks:function(){q(this._map._container,\"touchstart\",this._onDown,this)},_onDown:function(t){if(t.touches){if($(t),this._fireClick=!0,t.touches.length>1)return this._fireClick=!1,void clearTimeout(this._holdTimeout);var i=t.touches[0],n=i.target;this._startPos=this._newPos=new x(i.clientX,i.clientY),n.tagName&&\"a\"===n.tagName.toLowerCase()&&pt(n,\"leaflet-active\"),this._holdTimeout=setTimeout(e(function(){this._isTapValid()&&(this._fireClick=!1,this._onUp(),this._simulateEvent(\"contextmenu\",i))},this),1e3),this._simulateEvent(\"mousedown\",i),V(document,{touchmove:this._onMove,touchend:this._onUp},this)}},_onUp:function(t){if(clearTimeout(this._holdTimeout),q(document,{touchmove:this._onMove,touchend:this._onUp},this),this._fireClick&&t&&t.changedTouches){var i=t.changedTouches[0],e=i.target;e&&e.tagName&&\"a\"===e.tagName.toLowerCase()&&mt(e,\"leaflet-active\"),this._simulateEvent(\"mouseup\",i),this._isTapValid()&&this._simulateEvent(\"click\",i)}},_isTapValid:function(){return this._newPos.distanceTo(this._startPos)<=this._map.options.tapTolerance},_onMove:function(t){var i=t.touches[0];this._newPos=new x(i.clientX,i.clientY),this._simulateEvent(\"mousemove\",i)},_simulateEvent:function(t,i){var e=document.createEvent(\"MouseEvents\");e._simulated=!0,i.target._simulatedClick=!0,e.initMouseEvent(t,!0,!0,window,1,i.screenX,i.screenY,i.clientX,i.clientY,!1,!1,!1,!1,0,null),i.target.dispatchEvent(e)}});Vi&&!Ui&&Le.addInitHook(\"addHandler\",\"tap\",Mn),Le.mergeOptions({touchZoom:Vi&&!zi,bounceAtZoomLimits:!0});var Cn=Ze.extend({addHooks:function(){pt(this._map._container,\"leaflet-touch-zoom\"),V(this._map._container,\"touchstart\",this._onTouchStart,this)},removeHooks:function(){mt(this._map._container,\"leaflet-touch-zoom\"),q(this._map._container,\"touchstart\",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var e=i.mouseEventToContainerPoint(t.touches[0]),n=i.mouseEventToContainerPoint(t.touches[1]);this._centerPoint=i.getSize()._divideBy(2),this._startLatLng=i.containerPointToLatLng(this._centerPoint),\"center\"!==i.options.touchZoom&&(this._pinchStartLatLng=i.containerPointToLatLng(e.add(n)._divideBy(2))),this._startDist=e.distanceTo(n),this._startZoom=i.getZoom(),this._moved=!1,this._zooming=!0,i._stop(),V(document,\"touchmove\",this._onTouchMove,this),V(document,\"touchend\",this._onTouchEnd,this),$(t)}},_onTouchMove:function(t){if(t.touches&&2===t.touches.length&&this._zooming){var i=this._map,n=i.mouseEventToContainerPoint(t.touches[0]),o=i.mouseEventToContainerPoint(t.touches[1]),s=n.distanceTo(o)/this._startDist;if(this._zoom=i.getScaleZoom(s,this._startZoom),!i.options.bounceAtZoomLimits&&(this._zoom<i.getMinZoom()&&s<1||this._zoom>i.getMaxZoom()&&s>1)&&(this._zoom=i._limitZoom(this._zoom)),\"center\"===i.options.touchZoom){if(this._center=this._startLatLng,1===s)return}else{var r=n._add(o)._divideBy(2)._subtract(this._centerPoint);if(1===s&&0===r.x&&0===r.y)return;this._center=i.unproject(i.project(this._pinchStartLatLng,this._zoom).subtract(r),this._zoom)}this._moved||(i._moveStart(!0,!1),this._moved=!0),g(this._animRequest);var a=e(i._move,i,this._center,this._zoom,{pinch:!0,round:!1});this._animRequest=f(a,this,!0),$(t)}},_onTouchEnd:function(){this._moved&&this._zooming?(this._zooming=!1,g(this._animRequest),q(document,\"touchmove\",this._onTouchMove),q(document,\"touchend\",this._onTouchEnd),this._map.options.zoomAnimation?this._map._animateZoom(this._center,this._map._limitZoom(this._zoom),!0,this._map.options.zoomSnap):this._map._resetView(this._center,this._map._limitZoom(this._zoom))):this._zooming=!1}});Le.addInitHook(\"addHandler\",\"touchZoom\",Cn),Le.BoxZoom=Ln,Le.DoubleClickZoom=Pn,Le.Drag=bn,Le.Keyboard=Tn,Le.ScrollWheelZoom=zn,Le.Tap=Mn,Le.TouchZoom=Cn;var Zn=window.L;window.L=t,Object.freeze=$t,t.version=\"1.3.1+HEAD.ba6f97f\",t.noConflict=function(){return window.L=Zn,this},t.Control=Pe,t.control=be,t.Browser=$i,t.Evented=ui,t.Mixin=Ee,t.Util=ai,t.Class=v,t.Handler=Ze,t.extend=i,t.bind=e,t.stamp=n,t.setOptions=l,t.DomEvent=de,t.DomUtil=xe,t.PosAnimation=we,t.Draggable=Be,t.LineUtil=Oe,t.PolyUtil=Re,t.Point=x,t.point=w,t.Bounds=P,t.bounds=b,t.Transformation=Z,t.transformation=S,t.Projection=je,t.LatLng=M,t.latLng=C,t.LatLngBounds=T,t.latLngBounds=z,t.CRS=ci,t.GeoJSON=nn,t.geoJSON=Kt,t.geoJson=sn,t.Layer=Ue,t.LayerGroup=Ve,t.layerGroup=function(t,i){return new Ve(t,i)},t.FeatureGroup=qe,t.featureGroup=function(t){return new qe(t)},t.ImageOverlay=rn,t.imageOverlay=function(t,i,e){return new rn(t,i,e)},t.VideoOverlay=an,t.videoOverlay=function(t,i,e){return new an(t,i,e)},t.DivOverlay=hn,t.Popup=un,t.popup=function(t,i){return new un(t,i)},t.Tooltip=ln,t.tooltip=function(t,i){return new ln(t,i)},t.Icon=Ge,t.icon=function(t){return new Ge(t)},t.DivIcon=cn,t.divIcon=function(t){return new cn(t)},t.Marker=Xe,t.marker=function(t,i){return new Xe(t,i)},t.TileLayer=dn,t.tileLayer=Yt,t.GridLayer=_n,t.gridLayer=function(t){return new _n(t)},t.SVG=xn,t.svg=Jt,t.Renderer=mn,t.Canvas=fn,t.canvas=Xt,t.Path=Je,t.CircleMarker=$e,t.circleMarker=function(t,i){return new $e(t,i)},t.Circle=Qe,t.circle=function(t,i,e){return new Qe(t,i,e)},t.Polyline=tn,t.polyline=function(t,i){return new tn(t,i)},t.Polygon=en,t.polygon=function(t,i){return new en(t,i)},t.Rectangle=wn,t.rectangle=function(t,i){return new wn(t,i)},t.Map=Le,t.map=function(t,i){return new Le(t,i)}});"
  },
  {
    "path": "vignettes/tutorials/libs/leaflet-binding/leaflet.js",
    "content": "(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _util = require(\"./util\");\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ClusterLayerStore = function () {\n  function ClusterLayerStore(group) {\n    _classCallCheck(this, ClusterLayerStore);\n\n    this._layers = {};\n    this._group = group;\n  }\n\n  _createClass(ClusterLayerStore, [{\n    key: \"add\",\n    value: function add(layer, id) {\n      if (typeof id !== \"undefined\" && id !== null) {\n        if (this._layers[id]) {\n          this._group.removeLayer(this._layers[id]);\n        }\n        this._layers[id] = layer;\n      }\n      this._group.addLayer(layer);\n    }\n  }, {\n    key: \"remove\",\n    value: function remove(id) {\n      if (typeof id === \"undefined\" || id === null) {\n        return;\n      }\n\n      id = (0, _util.asArray)(id);\n      for (var i = 0; i < id.length; i++) {\n        if (this._layers[id[i]]) {\n          this._group.removeLayer(this._layers[id[i]]);\n          delete this._layers[id[i]];\n        }\n      }\n    }\n  }, {\n    key: \"clear\",\n    value: function clear() {\n      this._layers = {};\n      this._group.clearLayers();\n    }\n  }]);\n\n  return ClusterLayerStore;\n}();\n\nexports.default = ClusterLayerStore;\n\n\n},{\"./util\":17}],2:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ControlStore = function () {\n  function ControlStore(map) {\n    _classCallCheck(this, ControlStore);\n\n    this._controlsNoId = [];\n    this._controlsById = {};\n    this._map = map;\n  }\n\n  _createClass(ControlStore, [{\n    key: \"add\",\n    value: function add(control, id, html) {\n      if (typeof id !== \"undefined\" && id !== null) {\n        if (this._controlsById[id]) {\n          this._map.removeControl(this._controlsById[id]);\n        }\n        this._controlsById[id] = control;\n      } else {\n        this._controlsNoId.push(control);\n      }\n      this._map.addControl(control);\n    }\n  }, {\n    key: \"get\",\n    value: function get(id) {\n      var control = null;\n      if (this._controlsById[id]) {\n        control = this._controlsById[id];\n      }\n      return control;\n    }\n  }, {\n    key: \"remove\",\n    value: function remove(id) {\n      if (this._controlsById[id]) {\n        var control = this._controlsById[id];\n        this._map.removeControl(control);\n        delete this._controlsById[id];\n      }\n    }\n  }, {\n    key: \"clear\",\n    value: function clear() {\n      for (var i = 0; i < this._controlsNoId.length; i++) {\n        var control = this._controlsNoId[i];\n        this._map.removeControl(control);\n      }\n      this._controlsNoId = [];\n\n      for (var key in this._controlsById) {\n        var _control = this._controlsById[key];\n        this._map.removeControl(_control);\n      }\n      this._controlsById = {};\n    }\n  }]);\n\n  return ControlStore;\n}();\n\nexports.default = ControlStore;\n\n\n},{}],3:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getCRS = getCRS;\n\nvar _leaflet = require(\"./global/leaflet\");\n\nvar _leaflet2 = _interopRequireDefault(_leaflet);\n\nvar _proj4leaflet = require(\"./global/proj4leaflet\");\n\nvar _proj4leaflet2 = _interopRequireDefault(_proj4leaflet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Helper function to instanciate a ICRS instance.\nfunction getCRS(crsOptions) {\n  var crs = _leaflet2.default.CRS.EPSG3857; // Default Spherical Mercator\n\n  switch (crsOptions.crsClass) {\n    case \"L.CRS.EPSG3857\":\n      crs = _leaflet2.default.CRS.EPSG3857;\n      break;\n    case \"L.CRS.EPSG4326\":\n      crs = _leaflet2.default.CRS.EPSG4326;\n      break;\n    case \"L.CRS.EPSG3395\":\n      crs = _leaflet2.default.CRS.EPSG3395;\n      break;\n    case \"L.CRS.Simple\":\n      crs = _leaflet2.default.CRS.Simple;\n      break;\n    case \"L.Proj.CRS\":\n      if (crsOptions.options && crsOptions.options.bounds) {\n        crsOptions.options.bounds = _leaflet2.default.bounds(crsOptions.options.bounds);\n      }\n      if (crsOptions.options && crsOptions.options.transformation) {\n        crsOptions.options.transformation = new _leaflet2.default.Transformation(crsOptions.options.transformation[0], crsOptions.options.transformation[1], crsOptions.options.transformation[2], crsOptions.options.transformation[3]);\n      }\n      crs = new _proj4leaflet2.default.CRS(crsOptions.code, crsOptions.proj4def, crsOptions.options);\n      break;\n    case \"L.Proj.CRS.TMS\":\n      if (crsOptions.options && crsOptions.options.bounds) {\n        crsOptions.options.bounds = _leaflet2.default.bounds(crsOptions.options.bounds);\n      }\n      if (crsOptions.options && crsOptions.options.transformation) {\n        crsOptions.options.transformation = _leaflet2.default.Transformation(crsOptions.options.transformation[0], crsOptions.options.transformation[1], crsOptions.options.transformation[2], crsOptions.options.transformation[3]);\n      }\n      // L.Proj.CRS.TMS is deprecated as of Leaflet 1.x, fall back to L.Proj.CRS\n      //crs = new Proj4Leaflet.CRS.TMS(crsOptions.code, crsOptions.proj4def, crsOptions.projectedBounds, crsOptions.options);\n      crs = new _proj4leaflet2.default.CRS(crsOptions.code, crsOptions.proj4def, crsOptions.options);\n      break;\n  }\n  return crs;\n}\n\n\n},{\"./global/leaflet\":10,\"./global/proj4leaflet\":11}],4:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _util = require(\"./util\");\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar DataFrame = function () {\n  function DataFrame() {\n    _classCallCheck(this, DataFrame);\n\n    this.columns = [];\n    this.colnames = [];\n    this.colstrict = [];\n\n    this.effectiveLength = 0;\n    this.colindices = {};\n  }\n\n  _createClass(DataFrame, [{\n    key: \"_updateCachedProperties\",\n    value: function _updateCachedProperties() {\n      var _this = this;\n\n      this.effectiveLength = 0;\n      this.colindices = {};\n\n      this.columns.forEach(function (column, i) {\n        _this.effectiveLength = Math.max(_this.effectiveLength, column.length);\n        _this.colindices[_this.colnames[i]] = i;\n      });\n    }\n  }, {\n    key: \"_colIndex\",\n    value: function _colIndex(colname) {\n      var index = this.colindices[colname];\n      if (typeof index === \"undefined\") return -1;\n      return index;\n    }\n  }, {\n    key: \"col\",\n    value: function col(name, values, strict) {\n      if (typeof name !== \"string\") throw new Error(\"Invalid column name \\\"\" + name + \"\\\"\");\n\n      var index = this._colIndex(name);\n\n      if (arguments.length === 1) {\n        if (index < 0) return null;else return (0, _util.recycle)(this.columns[index], this.effectiveLength);\n      }\n\n      if (index < 0) {\n        index = this.colnames.length;\n        this.colnames.push(name);\n      }\n      this.columns[index] = (0, _util.asArray)(values);\n      this.colstrict[index] = !!strict;\n\n      // TODO: Validate strictness (ensure lengths match up with other stricts)\n\n      this._updateCachedProperties();\n\n      return this;\n    }\n  }, {\n    key: \"cbind\",\n    value: function cbind(obj, strict) {\n      var _this2 = this;\n\n      Object.keys(obj).forEach(function (name) {\n        var coldata = obj[name];\n        _this2.col(name, coldata);\n      });\n      return this;\n    }\n  }, {\n    key: \"get\",\n    value: function get(row, col, missingOK) {\n      var _this3 = this;\n\n      if (row > this.effectiveLength) throw new Error(\"Row argument was out of bounds: \" + row + \" > \" + this.effectiveLength);\n\n      var colIndex = -1;\n      if (typeof col === \"undefined\") {\n        var rowData = {};\n        this.colnames.forEach(function (name, i) {\n          rowData[name] = _this3.columns[i][row % _this3.columns[i].length];\n        });\n        return rowData;\n      } else if (typeof col === \"string\") {\n        colIndex = this._colIndex(col);\n      } else if (typeof col === \"number\") {\n        colIndex = col;\n      }\n      if (colIndex < 0 || colIndex > this.columns.length) {\n        if (missingOK) return void 0;else throw new Error(\"Unknown column index: \" + col);\n      }\n\n      return this.columns[colIndex][row % this.columns[colIndex].length];\n    }\n  }, {\n    key: \"nrow\",\n    value: function nrow() {\n      return this.effectiveLength;\n    }\n  }]);\n\n  return DataFrame;\n}();\n\nexports.default = DataFrame;\n\n\n},{\"./util\":17}],5:[function(require,module,exports){\n\"use strict\";\n\nvar _leaflet = require(\"./global/leaflet\");\n\nvar _leaflet2 = _interopRequireDefault(_leaflet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// In RMarkdown's self-contained mode, we don't have a way to carry around the\n// images that Leaflet needs but doesn't load into the page. Instead, we'll set\n// data URIs for the default marker, and let any others be loaded via CDN.\nif (typeof _leaflet2.default.Icon.Default.imagePath === \"undefined\") {\n  // if in a local file, support http\n  switch (window.location.protocol) {\n    case \"http:\":\n      // don't force http site to be done with https\n      _leaflet2.default.Icon.Default.imagePath = \"http://cdn.leafletjs.com/leaflet/v1.3.1/images/\";\n      break;\n    default:\n      // file\n      // https\n      // otherwise use https as it works on files and https\n      _leaflet2.default.Icon.Default.imagePath = \"https://unpkg.com/leaflet@1.3.1/dist/images/\";\n      break;\n  }\n  // don't know how to make this dataURI work since\n  //  will be appended to Defaul.imagePath above\n  /*\n  if (L.Browser.retina) {\n    L.Icon.Default.prototype.options.iconUrl = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAABSCAYAAAAWy4frAAAPiElEQVR42t1bCVCU5xkmbabtZJJOO+l0mhgT0yQe0WXZgz2570NB8I6J6UzaTBoORRFEruVGDhWUPRAQRFFREDnVxCtEBRb24DBNE3Waaatpkmluo4m+fd9v999olGVBDu3OPLj+//s+7/W93/f9//6/EwA4/T9g3AlFOUeeUGR2uMqzOyJk2R2x0qyOAmnmkS3SrCPrZJlHlsqzjypcs49OX1Jf//P7KhD885A0u10my2ovQscvybI6wEF8ivI7pFntAV6qkw9PWSBK1bEnZRltm2WZ7R8h4FbI0VG33GPgXXgCAra+A4EIn8KT4JH/FigoiJ/IIz6TZbVVKLLan5u0QESqlkckWW3p0sy2bxDAgZwO13TDytoB+NPe9+zild2DEFGuB7/NpzDodriF55o0o7XIRXXoNxMaiCSj9VU09C8EENxyj0C4thterh2EV+veuwOr6s7Dy3ssoO93k3llzxBE6PTgkXcMOF7EJ9KMtqjR9JFDQnNV9b+QqlqqEECQZ7TBgu1nYdXuIXgVneSwYtcgRFb1Q1iFGULLzRCsM90GOrZghxkiKvthec0grLpFlxCu6cKh1w6cHUSbctPhx8YlEElu4+NSVfNpBBACtpyGlbsGmBOElRhMBDofgk4GobOjQXC5CRZiUC/VDtn4qLrBJZ3A2cNg+nE4P31PgSDBbImq5UNJejMQFqi7cCicZ3iZBTAAQVoTBI4DKKCVGBDHH6nrBRlWxWr7sljVIhlTIDLVoRkS1eH/SNIPgzyzFRZV9NnG++LqQcyoGQLQgfFEIFYpcueAzc6SSiMOtTYgH9CXr+WpTbxRBeKlqn9UktZkRoACZ5PlO81YgfMM4RX9EKAxTSjCdvTjELPYW17dD8rsdiBfEBclSY2POxQIHnlIknroEAJk6U2wpMLISF/aNQShWAV/tWlSEIK2VqBNsr200gRyGmLokyS18cTdFtA7AnFNbcxAACGMrQtDLAjqBT+1cVJBNsk2+bBQ1wOcX5K0xs12A8GyzXRNafgeAYFb3mEkrBI4I/mWGUeNQI1lyp2PoO9j4aDKcH4Ebe0E8g3xgyylcc6wgbimNjSSoFtWK1sTqLRh2BM+SOgIfDGLJL8IG3ZZjUX/ViyvGYLFOwdZn/ljYI7yzsee4TjcsV/IR3FqQ+tdAxEnNSjFyQeBEK7pgRVodEnVIPhsNzqEYK0ZluFsRnq3YjH22KJyA6z4yTmSpZ5zlH8RTvWkt1CrB85PYUqjzx2BuG6sPyfeeAA8sjtwphhiCFSbwXub0S7ISPiOAZvO4h048xSfBM+cDpDieCZOggSz6JHdBv5FJ3CN6LPJR1QMgO9204h2aALgdDxzjlp4kw8YaHKyBSJJPigWb6wHQiRmbxkKL0QDXkhgD94YxGKsGskTQkvfxVnlIHBcBNfkegziwB3HAnHDuGynRXcp/utXZhrRHiWM5CPLjbdwHVDYAhFt3J8rTtoPbpktSDrE4INZ8iw12kUYEpPs4kozeOW0A3EQIovbYcfxITj798vwxbfX4Or1H8B46ROo7fwbvKY9bpNzy2hmiSOOyMrBEe2RT5x/7tjHxCFK2l/4YyBJ+95HQABmibKzEJvRs9RgF4FqE5MleGS3AumLN+6D4lYjfIeOD/e5eROg7sz7oEg7wHRk6Y3Yi/2MJwT7bCS75BvJBuGsSvqID1ggaHyeaAMeQERgyajBg3BG8SgxDAsvJFxUOcBkg7d0Ml3XjfuhCyvg6Ofix1+Al6qB6fpueotxsckFh5A92+QbydHw4vymGJxEG+rWiRL3goJWcSwvwbPECO5bDcMiRGNmchS4a1I9kP62DhOM9tPad4npEhaUdTPOsPJ+u7bJN85PpaqJ6YoT6xKcRIl1pQjwxIukxXhyIY57N1Swh7DyASbrm38MSHdRUStc+/4GjOUTV32acbhlNjNO6pWR7FPTk6xX3lGmK0ys0zrhn0Zhwh7wK3ibnVyg6we3LQa7WFQxyGSpiqRbe/o8jPXTe+EK4xDjECHOxdYRYc8++UhyfgXHma5w/Z5mJ+H63T3ChN3Y6O/guMcxj8NGicLDgYyQ3CKcnsUbMBuoa7j48ZgD+erqdczqbsYTpulj3LSu2POBfCQ58pn0EH1OwoTafwvX1+JV2VmIxEwHlJlBsdkwLHy2mZjcgjI9kJ4Ynbh6/Xu4l09YfhPjCsSJg7hpIbbng/92M5Mjn0kPcdlJGF/7JQJCSrsgAseeHzoqL+4bFnSe5EJKzgHpeaTsg3v9rCrtYFz+hScZdzAGYs8HX84H9Jn0KAYnQfyuIQT4Y5mo0akiMhQeDh44tEguXGcE0iP845MvxxzEjRs3QZ5Ux3hCtnUxbqq6PR/8cRdAcuSz1YfzGEhNm2BdDfjkvw0LcTYKokCK+oaFAolIjiDFBYl02/oujDmQC1c+ZxzC+BoIp2t35HXHPrDnA/lIcuQz6SKOOAnWVqsRbHscjidDNf0gRWF7CNX2M1l3VTOQbmpd55gDqT01xDhkmBTiJMhGsB+isdrPbGe6wrU15RjIzkQEyHB3GqYbYCAiSeHwCMBmI7mAYiwt6grX7QT9h5dHHcQ/P/sKlEm7GYd37lHGGaLut2tbirD5iT6TriCuKsVJsLrCwyWuih2Yj/unMC2VFlfsgr5hodxsZHIEZVoTkP787APw7TXHZy/ac/25rJ3pSpP24tRrZnyeW012bbtZbS9AefKZ+b6mMtjJS6V6GP/zOR3wK+pkQn7bzHbJCCRDsqFlBpz+djHCV7a2wMUr/x0xiM++ugprq45bnFhbhdNoF+MKLOt32C75SvqIb7xUO3/Fdr/8uMqDLmsqwU3VipH2QzA2k3hTr11ICnqZHMn7F+HCFIfZQQ5JfDVUvW1mzv708/V316FV/wF4Je9hsgSv3GOMYz71Jg6bkezS0CN5N1WLhSOussW2jResrnzNZXUFm5PnW0nl2CciVLQHebHBJh9U0g1S3GYQD4eQjH2QWH0C0utw15DXAEIybD0nxoUsYPMZmz4N59HYE+K0SzyC2Mo3bIHw4zTT+Kt33ESAX/FZCMWovUtMIMzvHRFKJA9G+VAGvJ7IPsKGC3HdDYI4qnwzhJQZmQ5l2AODcMSWb6mJ6fgWn+H4bsxbWzX9tmt2l9Xl7fzYcpwJGhl5MI5XESoL8kaGKB9XWww8xOoYIXBrD3hvOgnK9BbEYdypHsctSBcGYLbJ+FMvbupz2AanJ01uAPLVJab88B03H1xidKH8WB0TCCq1KNEM4YgRDm7FRlys+m8L6G6gJLmPkpuqxhJU0st8JF8FMeV+dwTipFL9zDlGewmB1wYdzJh/qRlccntHDcqevBCv6NBZ3xIz+CGP5xYTKIoMIMZzo+UTIAK3WRKgULUB+egcrTs/7A06XpQ20Tlai+O4mm0DKLuSAgPwkWgqIcOkkC+BOBRdVlcC+ciL0kUNG4jodd3vnKM13yHAK/8UBG6nTBrBOUc/pfDBRZJ88cg9DuQbL1rzxdw3yx61exPbOUazi4Rd8VqYMhBIwyunF5yz9VMCUV6vxQ+ECJcH8s05SlMy4t145xi1jAkjfIu7GIESxzYPSacC1Gfkg3fhGbD6ddMlVvuCQz/0oHAfKclSmiAAK0JN75zdC/Oy9JMKanKyTxBvOGAJJEbd4fAvVrxo9UukxMfZwbu4hwWiKDLCXCSfTNAUTba9Cs5x1SD4OBwIm4qjNQOkKE1uBH+aQkssVZmbqZ8UCLAvyS5BnLDf2hvaE6P+MZQfpYngsuBd2A1+W7EqBUZ4MUM/KXAvMjGbHvm23gCXaI1yTD9Po7KezWBJB8EXp0ACD0s+J6NnQkGzJGdPlFDHBdI+5t/Z+dGaQC4bHpvOgg+uznJcIGereiYUykIjs+WW22mrBi9WLbqnJx9wlugkIlHifvBGcgLNKLPQ4ESA+pCzI4jfwy2Ajff8CAduWzy4rLjnnWEGqFdmpfdMCKgaZEOZc5qrxg3nWM28cXmohhetPcqqsn4veG02MczDmWVmWs+4wjmr18YvWFfLBVI3bk8HubxZ5spVRZHTyQzJsSovoPHxhAKrQdyKrFNcED/wo8pnjuvzWrgHayJyIY5bz2ITw1ycJp9P7R4X8LDCHK/L2l0sEH60tmrcHzzjRet4tM9hVck+xQzKNxnGLRDqO+KUZZ7gqnHdZY1mxoQ8QUfjlYwI1taCBy5YBKrKcynd9wTqNwufEfhrqq17Ko16wh4FpPFK45ZtKDNOgnshZjDfAH9M7r4nyPONjEua/hZXjav8NzTTJvThTF6UppJtF+JqwA2NE15U6eFZdGgsmJvRyziUeBXIX7PT2huazRP+lKkgavszeM18jW0oVcfBrYCqYoRnN3aPGlw1iMM17ai1Gtqvnd/Q/H5SnvvF7f12ljkcz0psUmWBpSoz0LnRgKpBugq6L8CuxSkQde6kPcAsWqN7Ao1+yzaUacdAsckI0jwDPJPU5TBmbOxi/UW64pQOrjc+5/1V/dtJfRIbrw0KWFVWV+Hw6GNDZE6aHp7e0OUQ5qTrmY48rw/4sRWW3ojSpk36I+Wzo7Y/7hyl+ZJtXVI7WJ+45hrgacz29A32QTISrCDpiJLbuWp8Oiuh8jGYiof8eTHqDEtVKkCGmZVZqzI9scsuSIZkZXTfKnYHt8NNmLK3FaQxpb9GJz5jVcHMclWhrD+VeHfQsJLkWqohTGrlqnFZ9LrukSl97YIXpU5kVcHMSvDKTppnhNmY8WkJXXcFnSMZSY6e3cO1ruKxU/7+CGUSnbnCti4bWjHbOAvlGOApdPrJ9beDjtE5khFsaOaq8dHzMaW/vC/e6KGMWm4flYMku4cNnVmpPej8udtA1aBzrll47RGjs/aG+vX75tUkyihl1lKVZnDFrIuy+2AaOv9EvAX0nY7ROZeEJq4aF+g3zPvqHStejOYvlvGuA1FmNxtCM1P18AcMgjALv9MxYWaX9WcBktWuuu9eFqPM4mbvAzbEEg5h9tHpLIOtP+g7HeMnNHLVeG/JkvF7YWxc33jDqqy0ZhoEKovzM1P0DPSdjtFvG5ZVXLP0vn19z3KrVTvIHF3fYHHeCvruHN/AbdNN3PO69+17iLgzjrRux8El/SwIMg0M9P3HG9HqsPv+hUrrJXEvczj+AAbRx+AcX88F0v1AvBnKAnlTG8Rln5/6LuLHW5/zorT+D0wg1qq8y5xfu88CSyCnH5h3dW/ZGXve8uOMZRWP0no8cIFY7+YfswURrT36QL09ffsMppHYegW/P7CBWHvlMOGBe5/9jtdjY7R8wkTb+R9meZA6n2oJWAAAAABJRU5ErkJggg==\";\n  } else {\n    L.Icon.Default.prototype.options.iconUrl = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAGmklEQVRYw7VXeUyTZxjvNnfELFuyIzOabermMZEeQC/OclkO49CpOHXOLJl/CAURuYbQi3KLgEhbrhZ1aDwmaoGqKII6odATmH/scDFbdC7LvFqOCc+e95s2VG50X/LLm/f4/Z7neY/ne18aANCmAr5E/xZf1uDOkTcGcWR6hl9247tT5U7Y6SNvWsKT63P58qbfeLJG8M5qcgTknrvvrdDbsT7Ml+tv82X6vVxJE33aRmgSyYtcWVMqX97Yv2JvW39UhRE2HuyBL+t+gK1116ly06EeWFNlAmHxlQE0OMiV6mQCScusKRlhS3QLeVJdl1+23h5dY4FNB3thrbYboqptEFlphTC1hSpJnbRvxP4NWgsE5Jyz86QNNi/5qSUTGuFk1gu54tN9wuK2wc3o+Wc13RCmsoBwEqzGcZsxsvCSy/9wJKf7UWf1mEY8JWfewc67UUoDbDjQC+FqK4QqLVMGGR9d2wurKzqBk3nqIT/9zLxRRjgZ9bqQgub+DdoeCC03Q8j+0QhFhBHR/eP3U/zCln7Uu+hihJ1+bBNffLIvmkyP0gpBZWYXhKussK6mBz5HT6M1Nqpcp+mBCPXosYQfrekGvrjewd59/GvKCE7TbK/04/ZV5QZYVWmDwH1mF3xa2Q3ra3DBC5vBT1oP7PTj4C0+CcL8c7C2CtejqhuCnuIQHaKHzvcRfZpnylFfXsYJx3pNLwhKzRAwAhEqG0SpusBHfAKkxw3w4627MPhoCH798z7s0ZnBJ/MEJbZSbXPhER2ih7p2ok/zSj2cEJDd4CAe+5WYnBCgR2uruyEw6zRoW6/DWJ/OeAP8pd/BGtzOZKpG8oke0SX6GMmRk6GFlyAc59K32OTEinILRJRchah8HQwND8N435Z9Z0FY1EqtxUg+0SO6RJ/mmXz4VuS+DpxXC3gXmZwIL7dBSH4zKE50wESf8qwVgrP1EIlTO5JP9Igu0aexdh28F1lmAEGJGfh7jE6ElyM5Rw/FDcYJjWhbeiBYoYNIpc2FT/SILivp0F1ipDWk4BIEo2VuodEJUifhbiltnNBIXPUFCMpthtAyqws/BPlEF/VbaIxErdxPphsU7rcCp8DohC+GvBIPJS/tW2jtvTmmAeuNO8BNOYQeG8G/2OzCJ3q+soYB5i6NhMaKr17FSal7GIHheuV3uSCY8qYVuEm1cOzqdWr7ku/R0BDoTT+DT+ohCM6/CCvKLKO4RI+dXPeAuaMqksaKrZ7L3FE5FIFbkIceeOZ2OcHO6wIhTkNo0ffgjRGxEqogXHYUPHfWAC/lADpwGcLRY3aeK4/oRGCKYcZXPVoeX/kelVYY8dUGf8V5EBRbgJXT5QIPhP9ePJi428JKOiEYhYXFBqou2Guh+p/mEB1/RfMw6rY7cxcjTrneI1FrDyuzUSRm9miwEJx8E/gUmqlyvHGkneiwErR21F3tNOK5Tf0yXaT+O7DgCvALTUBXdM4YhC/IawPU+2PduqMvuaR6eoxSwUk75ggqsYJ7VicsnwGIkZBSXKOUww73WGXyqP+J2/b9c+gi1YAg/xpwck3gJuucNrh5JvDPvQr0WFXf0piyt8f8/WI0hV4pRxxkQZdJDfDJNOAmM0Ag8jyT6hz0WGXWuP94Yh2jcfjmXAGvHCMslRimDHYuHuDsy2QtHuIavznhbYURq5R57KpzBBRZKPJi8eQg48h4j8SDdowifdIrEVdU+gbO6QNvRRt4ZBthUaZhUnjlYObNagV3keoeru3rU7rcuceqU1mJBxy+BWZYlNEBH+0eH4vRiB+OYybU2hnblYlTvkHinM4m54YnxSyaZYSF6R3jwgP7udKLGIX6r/lbNa9N6y5MFynjWDtrHd75ZvTYAPO/6RgF0k76mQla3FGq7dO+cH8sKn0Vo7nDllwAhqwLPkxrHwWmHJOo+AKJ4rab5OgrM7rVu8eWb2Pu0Dh4eDgXoOfvp7Y7QeqknRmvcTBEyq9m/HQQSCSz6LHq3z0yzsNySRfMS253wl2KyRDbcZPcfJKjZmSEOjcxyi+Y8dUOtsIEH6R2wNykdqrkYJ0RV92H0W58pkfQk7cKevsLK10Py8SdMGfXNXATY+pPbyJR/ET6n9nIfztNtZYRV9XniQu9IA2vOVgy4ir7GCLVmmd+zjkH0eAF9Po6K61pmCXHxU5rHMYd1ftc3owjwRSVRzLjKvqZEty6cRUD7jGqiOdu5HG6MdHjNcNYGqfDm5YRzLBBCCDl/2bk8a8gdbqcfwECu62Fg/HrggAAAABJRU5ErkJggg==\";\n  }\n  */\n}\n\n\n},{\"./global/leaflet\":10}],6:[function(require,module,exports){\n\"use strict\";\n\nvar _leaflet = require(\"./global/leaflet\");\n\nvar _leaflet2 = _interopRequireDefault(_leaflet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// add texxtsize, textOnly, and style\n_leaflet2.default.Tooltip.prototype.options.textsize = \"10px\";\n_leaflet2.default.Tooltip.prototype.options.textOnly = false;\n_leaflet2.default.Tooltip.prototype.options.style = null;\n\n// copy original layout to not completely stomp it.\nvar initLayoutOriginal = _leaflet2.default.Tooltip.prototype._initLayout;\n\n_leaflet2.default.Tooltip.prototype._initLayout = function () {\n  initLayoutOriginal.call(this);\n  this._container.style.fontSize = this.options.textsize;\n\n  if (this.options.textOnly) {\n    _leaflet2.default.DomUtil.addClass(this._container, \"leaflet-tooltip-text-only\");\n  }\n\n  if (this.options.style) {\n    for (var property in this.options.style) {\n      this._container.style[property] = this.options.style[property];\n    }\n  }\n};\n\n\n},{\"./global/leaflet\":10}],7:[function(require,module,exports){\n\"use strict\";\n\nvar _leaflet = require(\"./global/leaflet\");\n\nvar _leaflet2 = _interopRequireDefault(_leaflet);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar protocolRegex = /^\\/\\//;\nvar upgrade_protocol = function upgrade_protocol(urlTemplate) {\n  if (protocolRegex.test(urlTemplate)) {\n    if (window.location.protocol === \"file:\") {\n      // if in a local file, support http\n      // http should auto upgrade if necessary\n      urlTemplate = \"http:\" + urlTemplate;\n    }\n  }\n  return urlTemplate;\n};\n\nvar originalLTileLayerInitialize = _leaflet2.default.TileLayer.prototype.initialize;\n_leaflet2.default.TileLayer.prototype.initialize = function (urlTemplate, options) {\n  urlTemplate = upgrade_protocol(urlTemplate);\n  originalLTileLayerInitialize.call(this, urlTemplate, options);\n};\n\nvar originalLTileLayerWMSInitialize = _leaflet2.default.TileLayer.WMS.prototype.initialize;\n_leaflet2.default.TileLayer.WMS.prototype.initialize = function (urlTemplate, options) {\n  urlTemplate = upgrade_protocol(urlTemplate);\n  originalLTileLayerWMSInitialize.call(this, urlTemplate, options);\n};\n\n\n},{\"./global/leaflet\":10}],8:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = global.HTMLWidgets;\n\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],9:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = global.jQuery;\n\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],10:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = global.L;\n\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],11:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = global.L.Proj;\n\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],12:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = global.Shiny;\n\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],13:[function(require,module,exports){\n\"use strict\";\n\nvar _jquery = require(\"./global/jquery\");\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _leaflet = require(\"./global/leaflet\");\n\nvar _leaflet2 = _interopRequireDefault(_leaflet);\n\nvar _shiny = require(\"./global/shiny\");\n\nvar _shiny2 = _interopRequireDefault(_shiny);\n\nvar _htmlwidgets = require(\"./global/htmlwidgets\");\n\nvar _htmlwidgets2 = _interopRequireDefault(_htmlwidgets);\n\nvar _util = require(\"./util\");\n\nvar _crs_utils = require(\"./crs_utils\");\n\nvar _controlStore = require(\"./control-store\");\n\nvar _controlStore2 = _interopRequireDefault(_controlStore);\n\nvar _layerManager = require(\"./layer-manager\");\n\nvar _layerManager2 = _interopRequireDefault(_layerManager);\n\nvar _methods = require(\"./methods\");\n\nvar _methods2 = _interopRequireDefault(_methods);\n\nrequire(\"./fixup-default-icon\");\n\nrequire(\"./fixup-default-tooltip\");\n\nrequire(\"./fixup-url-protocol\");\n\nvar _dataframe = require(\"./dataframe\");\n\nvar _dataframe2 = _interopRequireDefault(_dataframe);\n\nvar _clusterLayerStore = require(\"./cluster-layer-store\");\n\nvar _clusterLayerStore2 = _interopRequireDefault(_clusterLayerStore);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nwindow.LeafletWidget = {};\nwindow.LeafletWidget.utils = {};\nvar methods = window.LeafletWidget.methods = _jquery2.default.extend({}, _methods2.default);\nwindow.LeafletWidget.DataFrame = _dataframe2.default;\nwindow.LeafletWidget.ClusterLayerStore = _clusterLayerStore2.default;\nwindow.LeafletWidget.utils.getCRS = _crs_utils.getCRS;\n\n// Send updated bounds back to app. Takes a leaflet event object as input.\nfunction updateBounds(map) {\n  var id = map.getContainer().id;\n  var bounds = map.getBounds();\n\n  _shiny2.default.onInputChange(id + \"_bounds\", {\n    north: bounds.getNorthEast().lat,\n    east: bounds.getNorthEast().lng,\n    south: bounds.getSouthWest().lat,\n    west: bounds.getSouthWest().lng\n  });\n  _shiny2.default.onInputChange(id + \"_center\", {\n    lng: map.getCenter().lng,\n    lat: map.getCenter().lat\n  });\n  _shiny2.default.onInputChange(id + \"_zoom\", map.getZoom());\n}\n\nfunction preventUnintendedZoomOnScroll(map) {\n  // Prevent unwanted scroll capturing. Similar in purpose to\n  // https://github.com/CliffCloud/Leaflet.Sleep but with a\n  // different set of heuristics.\n\n  // The basic idea is that when a mousewheel/DOMMouseScroll\n  // event is seen, we disable scroll wheel zooming until the\n  // user moves their mouse cursor or clicks on the map. This\n  // is slightly trickier than just listening for mousemove,\n  // because mousemove is fired when the page is scrolled,\n  // even if the user did not physically move the mouse. We\n  // handle this by examining the mousemove event's screenX\n  // and screenY properties; if they change, we know it's a\n  // \"true\" move.\n\n  // lastScreen can never be null, but its x and y can.\n  var lastScreen = { x: null, y: null };\n  (0, _jquery2.default)(document).on(\"mousewheel DOMMouseScroll\", \"*\", function (e) {\n    // Disable zooming (until the mouse moves or click)\n    map.scrollWheelZoom.disable();\n    // Any mousemove events at this screen position will be ignored.\n    lastScreen = { x: e.originalEvent.screenX, y: e.originalEvent.screenY };\n  });\n  (0, _jquery2.default)(document).on(\"mousemove\", \"*\", function (e) {\n    // Did the mouse really move?\n    if (lastScreen.x !== null && e.screenX !== lastScreen.x || e.screenY !== lastScreen.y) {\n      // It really moved. Enable zooming.\n      map.scrollWheelZoom.enable();\n      lastScreen = { x: null, y: null };\n    }\n  });\n  (0, _jquery2.default)(document).on(\"mousedown\", \".leaflet\", function (e) {\n    // Clicking always enables zooming.\n    map.scrollWheelZoom.enable();\n    lastScreen = { x: null, y: null };\n  });\n}\n\n_htmlwidgets2.default.widget({\n\n  name: \"leaflet\",\n  type: \"output\",\n  factory: function factory(el, width, height) {\n\n    var map = null;\n\n    return {\n\n      // we need to store our map in our returned object.\n      getMap: function getMap() {\n        return map;\n      },\n\n      renderValue: function renderValue(data) {\n\n        // Create an appropriate CRS Object if specified\n\n        if (data && data.options && data.options.crs) {\n          data.options.crs = (0, _crs_utils.getCRS)(data.options.crs);\n        }\n\n        // As per https://github.com/rstudio/leaflet/pull/294#discussion_r79584810\n        if (map) {\n          map.remove();\n          map = function () {\n            return;\n          }(); // undefine map\n        }\n\n        if (data.options.mapFactory && typeof data.options.mapFactory === \"function\") {\n          map = data.options.mapFactory(el, data.options);\n        } else {\n          map = _leaflet2.default.map(el, data.options);\n        }\n\n        preventUnintendedZoomOnScroll(map);\n\n        // Store some state in the map object\n        map.leafletr = {\n          // Has the map ever rendered successfully?\n          hasRendered: false,\n          // Data to be rendered when resize is called with area != 0\n          pendingRenderData: null\n        };\n\n        // Check if the map is rendered statically (no output binding)\n        if (_htmlwidgets2.default.shinyMode && /\\bshiny-bound-output\\b/.test(el.className)) {\n\n          map.id = el.id;\n\n          // Store the map on the element so we can find it later by ID\n          (0, _jquery2.default)(el).data(\"leaflet-map\", map);\n\n          // When the map is clicked, send the coordinates back to the app\n          map.on(\"click\", function (e) {\n            _shiny2.default.onInputChange(map.id + \"_click\", {\n              lat: e.latlng.lat,\n              lng: e.latlng.lng,\n              \".nonce\": Math.random() // Force reactivity if lat/lng hasn't changed\n            });\n          });\n\n          var groupTimerId = null;\n\n          map.on(\"moveend\", function (e) {\n            updateBounds(e.target);\n          }).on(\"layeradd layerremove\", function (e) {\n            // If the layer that's coming or going is a group we created, tell\n            // the server.\n            if (map.layerManager.getGroupNameFromLayerGroup(e.layer)) {\n              // But to avoid chattiness, coalesce events\n              if (groupTimerId) {\n                clearTimeout(groupTimerId);\n                groupTimerId = null;\n              }\n              groupTimerId = setTimeout(function () {\n                groupTimerId = null;\n                _shiny2.default.onInputChange(map.id + \"_groups\", map.layerManager.getVisibleGroups());\n              }, 100);\n            }\n          });\n        }\n        this.doRenderValue(data, map);\n      },\n      doRenderValue: function doRenderValue(data, map) {\n        // Leaflet does not behave well when you set up a bunch of layers when\n        // the map is not visible (width/height == 0). Popups get misaligned\n        // relative to their owning markers, and the fitBounds calculations\n        // are off. Therefore we wait until the map is actually showing to\n        // render the value (we rely on the resize() callback being invoked\n        // at the appropriate time).\n        //\n        // There may be an issue with leafletProxy() calls being made while\n        // the map is not being viewed--not sure what the right solution is\n        // there.\n        if (el.offsetWidth === 0 || el.offsetHeight === 0) {\n          map.leafletr.pendingRenderData = data;\n          return;\n        }\n        map.leafletr.pendingRenderData = null;\n\n        // Merge data options into defaults\n        var options = _jquery2.default.extend({ zoomToLimits: \"always\" }, data.options);\n\n        if (!map.layerManager) {\n          map.controls = new _controlStore2.default(map);\n          map.layerManager = new _layerManager2.default(map);\n        } else {\n          map.controls.clear();\n          map.layerManager.clear();\n        }\n\n        var explicitView = false;\n        if (data.setView) {\n          explicitView = true;\n          map.setView.apply(map, data.setView);\n        }\n        if (data.fitBounds) {\n          explicitView = true;\n          methods.fitBounds.apply(map, data.fitBounds);\n        }\n        if (data.flyTo) {\n          if (!explicitView && !map.leafletr.hasRendered) {\n            // must be done to give a initial starting point\n            map.fitWorld();\n          }\n          explicitView = true;\n          map.flyTo.apply(map, data.flyTo);\n        }\n        if (data.flyToBounds) {\n          if (!explicitView && !map.leafletr.hasRendered) {\n            // must be done to give a initial starting point\n            map.fitWorld();\n          }\n          explicitView = true;\n          methods.flyToBounds.apply(map, data.flyToBounds);\n        }\n        if (data.options.center) {\n          explicitView = true;\n        }\n\n        // Returns true if the zoomToLimits option says that the map should be\n        // zoomed to map elements.\n        function needsZoom() {\n          return options.zoomToLimits === \"always\" || options.zoomToLimits === \"first\" && !map.leafletr.hasRendered;\n        }\n\n        if (!explicitView && needsZoom() && !map.getZoom()) {\n          if (data.limits && !_jquery2.default.isEmptyObject(data.limits)) {\n            // Use the natural limits of what's being drawn on the map\n            // If the size of the bounding box is 0, leaflet gets all weird\n            var pad = 0.006;\n            if (data.limits.lat[0] === data.limits.lat[1]) {\n              data.limits.lat[0] = data.limits.lat[0] - pad;\n              data.limits.lat[1] = data.limits.lat[1] + pad;\n            }\n            if (data.limits.lng[0] === data.limits.lng[1]) {\n              data.limits.lng[0] = data.limits.lng[0] - pad;\n              data.limits.lng[1] = data.limits.lng[1] + pad;\n            }\n            map.fitBounds([[data.limits.lat[0], data.limits.lng[0]], [data.limits.lat[1], data.limits.lng[1]]]);\n          } else {\n            map.fitWorld();\n          }\n        }\n\n        for (var i = 0; data.calls && i < data.calls.length; i++) {\n          var call = data.calls[i];\n          if (methods[call.method]) methods[call.method].apply(map, call.args);else (0, _util.log)(\"Unknown method \" + call.method);\n        }\n\n        map.leafletr.hasRendered = true;\n\n        if (_htmlwidgets2.default.shinyMode) {\n          setTimeout(function () {\n            updateBounds(map);\n          }, 1);\n        }\n      },\n      resize: function resize(width, height) {\n        if (map) {\n          map.invalidateSize();\n          if (map.leafletr.pendingRenderData) {\n            this.doRenderValue(map.leafletr.pendingRenderData, map);\n          }\n        }\n      }\n    };\n  }\n});\n\nif (_htmlwidgets2.default.shinyMode) {\n  _shiny2.default.addCustomMessageHandler(\"leaflet-calls\", function (data) {\n    var id = data.id;\n    var el = document.getElementById(id);\n    var map = el ? (0, _jquery2.default)(el).data(\"leaflet-map\") : null;\n    if (!map) {\n      (0, _util.log)(\"Couldn't find map with id \" + id);\n      return;\n    }\n\n    for (var i = 0; i < data.calls.length; i++) {\n      var call = data.calls[i];\n      if (call.dependencies) {\n        _shiny2.default.renderDependencies(call.dependencies);\n      }\n      if (methods[call.method]) methods[call.method].apply(map, call.args);else (0, _util.log)(\"Unknown method \" + call.method);\n    }\n  });\n}\n\n\n},{\"./cluster-layer-store\":1,\"./control-store\":2,\"./crs_utils\":3,\"./dataframe\":4,\"./fixup-default-icon\":5,\"./fixup-default-tooltip\":6,\"./fixup-url-protocol\":7,\"./global/htmlwidgets\":8,\"./global/jquery\":9,\"./global/leaflet\":10,\"./global/shiny\":12,\"./layer-manager\":14,\"./methods\":15,\"./util\":17}],14:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _jquery = require(\"./global/jquery\");\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _leaflet = require(\"./global/leaflet\");\n\nvar _leaflet2 = _interopRequireDefault(_leaflet);\n\nvar _util = require(\"./util\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar LayerManager = function () {\n  function LayerManager(map) {\n    _classCallCheck(this, LayerManager);\n\n    this._map = map;\n\n    // BEGIN layer indices\n\n    // {<groupname>: {<stamp>: layer}}\n    this._byGroup = {};\n    // {<categoryName>: {<stamp>: layer}}\n    this._byCategory = {};\n    // {<categoryName_layerId>: layer}\n    this._byLayerId = {};\n    // {<stamp>: {\n    //             \"group\": <groupname>,\n    //             \"layerId\": <layerId>,\n    //             \"category\": <category>,\n    //             \"container\": <container>\n    //           }\n    // }\n    this._byStamp = {};\n    // {<crosstalkGroupName>: {<key>: [<stamp>, <stamp>, ...], ...}}\n    this._byCrosstalkGroup = {};\n\n    // END layer indices\n\n    // {<categoryName>: L.layerGroup}\n    this._categoryContainers = {};\n    // {<groupName>: L.layerGroup}\n    this._groupContainers = {};\n  }\n\n  _createClass(LayerManager, [{\n    key: \"addLayer\",\n    value: function addLayer(layer, category, layerId, group, ctGroup, ctKey) {\n      var _this = this;\n\n      // Was a group provided?\n      var hasId = typeof layerId === \"string\";\n      var grouped = typeof group === \"string\";\n\n      var stamp = _leaflet2.default.Util.stamp(layer) + \"\";\n\n      // This will be the default layer group to add the layer to.\n      // We may overwrite this let before using it (i.e. if a group is assigned).\n      // This one liner creates the _categoryContainers[category] entry if it\n      // doesn't already exist.\n      var container = this._categoryContainers[category] = this._categoryContainers[category] || _leaflet2.default.layerGroup().addTo(this._map);\n\n      var oldLayer = null;\n      if (hasId) {\n        // First, remove any layer with the same category and layerId\n        var prefixedLayerId = this._layerIdKey(category, layerId);\n        oldLayer = this._byLayerId[prefixedLayerId];\n        if (oldLayer) {\n          this._removeLayer(oldLayer);\n        }\n\n        // Update layerId index\n        this._byLayerId[prefixedLayerId] = layer;\n      }\n\n      // Update group index\n      if (grouped) {\n        this._byGroup[group] = this._byGroup[group] || {};\n        this._byGroup[group][stamp] = layer;\n\n        // Since a group is assigned, don't add the layer to the category's layer\n        // group; instead, use the group's layer group.\n        // This one liner creates the _groupContainers[group] entry if it doesn't\n        // already exist.\n        container = this.getLayerGroup(group, true);\n      }\n\n      // Update category index\n      this._byCategory[category] = this._byCategory[category] || {};\n      this._byCategory[category][stamp] = layer;\n\n      // Update stamp index\n      var layerInfo = this._byStamp[stamp] = {\n        layer: layer,\n        group: group,\n        ctGroup: ctGroup,\n        ctKey: ctKey,\n        layerId: layerId,\n        category: category,\n        container: container,\n        hidden: false\n      };\n\n      // Update crosstalk group index\n      if (ctGroup) {\n        if (layer.setStyle) {\n          // Need to save this info so we know what to set opacity to later\n          layer.options.origOpacity = typeof layer.options.opacity !== \"undefined\" ? layer.options.opacity : 0.5;\n          layer.options.origFillOpacity = typeof layer.options.fillOpacity !== \"undefined\" ? layer.options.fillOpacity : 0.2;\n        }\n\n        var ctg = this._byCrosstalkGroup[ctGroup];\n        if (!ctg) {\n          ctg = this._byCrosstalkGroup[ctGroup] = {};\n          var crosstalk = global.crosstalk;\n\n          var handleFilter = function handleFilter(e) {\n            if (!e.value) {\n              var groupKeys = Object.keys(ctg);\n              for (var i = 0; i < groupKeys.length; i++) {\n                var key = groupKeys[i];\n                var _layerInfo = _this._byStamp[ctg[key]];\n                _this._setVisibility(_layerInfo, true);\n              }\n            } else {\n              var selectedKeys = {};\n              for (var _i = 0; _i < e.value.length; _i++) {\n                selectedKeys[e.value[_i]] = true;\n              }\n              var _groupKeys = Object.keys(ctg);\n              for (var _i2 = 0; _i2 < _groupKeys.length; _i2++) {\n                var _key = _groupKeys[_i2];\n                var _layerInfo2 = _this._byStamp[ctg[_key]];\n                _this._setVisibility(_layerInfo2, selectedKeys[_groupKeys[_i2]]);\n              }\n            }\n          };\n          var filterHandle = new crosstalk.FilterHandle(ctGroup);\n          filterHandle.on(\"change\", handleFilter);\n\n          var handleSelection = function handleSelection(e) {\n            if (!e.value || !e.value.length) {\n              var groupKeys = Object.keys(ctg);\n              for (var i = 0; i < groupKeys.length; i++) {\n                var key = groupKeys[i];\n                var _layerInfo3 = _this._byStamp[ctg[key]];\n                _this._setOpacity(_layerInfo3, 1.0);\n              }\n            } else {\n              var selectedKeys = {};\n              for (var _i3 = 0; _i3 < e.value.length; _i3++) {\n                selectedKeys[e.value[_i3]] = true;\n              }\n              var _groupKeys2 = Object.keys(ctg);\n              for (var _i4 = 0; _i4 < _groupKeys2.length; _i4++) {\n                var _key2 = _groupKeys2[_i4];\n                var _layerInfo4 = _this._byStamp[ctg[_key2]];\n                _this._setOpacity(_layerInfo4, selectedKeys[_groupKeys2[_i4]] ? 1.0 : 0.2);\n              }\n            }\n          };\n          var selHandle = new crosstalk.SelectionHandle(ctGroup);\n          selHandle.on(\"change\", handleSelection);\n\n          setTimeout(function () {\n            handleFilter({ value: filterHandle.filteredKeys });\n            handleSelection({ value: selHandle.value });\n          }, 100);\n        }\n\n        if (!ctg[ctKey]) ctg[ctKey] = [];\n        ctg[ctKey].push(stamp);\n      }\n\n      // Add to container\n      if (!layerInfo.hidden) container.addLayer(layer);\n\n      return oldLayer;\n    }\n  }, {\n    key: \"brush\",\n    value: function brush(bounds, extraInfo) {\n      var _this2 = this;\n\n      /* eslint-disable no-console */\n\n      // For each Crosstalk group...\n      Object.keys(this._byCrosstalkGroup).forEach(function (ctGroupName) {\n        var ctg = _this2._byCrosstalkGroup[ctGroupName];\n        var selection = [];\n        // ...iterate over each Crosstalk key (each of which may have multiple\n        // layers)...\n        Object.keys(ctg).forEach(function (ctKey) {\n          // ...and for each layer...\n          ctg[ctKey].forEach(function (stamp) {\n            var layerInfo = _this2._byStamp[stamp];\n            // ...if it's something with a point...\n            if (layerInfo.layer.getLatLng) {\n              // ... and it's inside the selection bounds...\n              // TODO: Use pixel containment, not lat/lng containment\n              if (bounds.contains(layerInfo.layer.getLatLng())) {\n                // ...add the key to the selection.\n                selection.push(ctKey);\n              }\n            }\n          });\n        });\n        new global.crosstalk.SelectionHandle(ctGroupName).set(selection, extraInfo);\n      });\n    }\n  }, {\n    key: \"unbrush\",\n    value: function unbrush(extraInfo) {\n      Object.keys(this._byCrosstalkGroup).forEach(function (ctGroupName) {\n        new global.crosstalk.SelectionHandle(ctGroupName).clear(extraInfo);\n      });\n    }\n  }, {\n    key: \"_setVisibility\",\n    value: function _setVisibility(layerInfo, visible) {\n      if (layerInfo.hidden ^ visible) {\n        return;\n      } else if (visible) {\n        layerInfo.container.addLayer(layerInfo.layer);\n        layerInfo.hidden = false;\n      } else {\n        layerInfo.container.removeLayer(layerInfo.layer);\n        layerInfo.hidden = true;\n      }\n    }\n  }, {\n    key: \"_setOpacity\",\n    value: function _setOpacity(layerInfo, opacity) {\n      if (layerInfo.layer.setOpacity) {\n        layerInfo.layer.setOpacity(opacity);\n      } else if (layerInfo.layer.setStyle) {\n        layerInfo.layer.setStyle({\n          opacity: opacity * layerInfo.layer.options.origOpacity,\n          fillOpacity: opacity * layerInfo.layer.options.origFillOpacity\n        });\n      }\n    }\n  }, {\n    key: \"getLayer\",\n    value: function getLayer(category, layerId) {\n      return this._byLayerId[this._layerIdKey(category, layerId)];\n    }\n  }, {\n    key: \"removeLayer\",\n    value: function removeLayer(category, layerIds) {\n      var _this3 = this;\n\n      // Find layer info\n      _jquery2.default.each((0, _util.asArray)(layerIds), function (i, layerId) {\n        var layer = _this3._byLayerId[_this3._layerIdKey(category, layerId)];\n        if (layer) {\n          _this3._removeLayer(layer);\n        }\n      });\n    }\n  }, {\n    key: \"clearLayers\",\n    value: function clearLayers(category) {\n      var _this4 = this;\n\n      // Find all layers in _byCategory[category]\n      var catTable = this._byCategory[category];\n      if (!catTable) {\n        return false;\n      }\n\n      // Remove all layers. Make copy of keys to avoid mutating the collection\n      // behind the iterator you're accessing.\n      var stamps = [];\n      _jquery2.default.each(catTable, function (k, v) {\n        stamps.push(k);\n      });\n      _jquery2.default.each(stamps, function (i, stamp) {\n        _this4._removeLayer(stamp);\n      });\n    }\n  }, {\n    key: \"getLayerGroup\",\n    value: function getLayerGroup(group, ensureExists) {\n      var g = this._groupContainers[group];\n      if (ensureExists && !g) {\n        this._byGroup[group] = this._byGroup[group] || {};\n        g = this._groupContainers[group] = _leaflet2.default.featureGroup();\n        g.groupname = group;\n        g.addTo(this._map);\n      }\n      return g;\n    }\n  }, {\n    key: \"getGroupNameFromLayerGroup\",\n    value: function getGroupNameFromLayerGroup(layerGroup) {\n      return layerGroup.groupname;\n    }\n  }, {\n    key: \"getVisibleGroups\",\n    value: function getVisibleGroups() {\n      var _this5 = this;\n\n      var result = [];\n      _jquery2.default.each(this._groupContainers, function (k, v) {\n        if (_this5._map.hasLayer(v)) {\n          result.push(k);\n        }\n      });\n      return result;\n    }\n  }, {\n    key: \"getAllGroupNames\",\n    value: function getAllGroupNames() {\n      var result = [];\n      _jquery2.default.each(this._groupContainers, function (k, v) {\n        result.push(k);\n      });\n      return result;\n    }\n  }, {\n    key: \"clearGroup\",\n    value: function clearGroup(group) {\n      var _this6 = this;\n\n      // Find all layers in _byGroup[group]\n      var groupTable = this._byGroup[group];\n      if (!groupTable) {\n        return false;\n      }\n\n      // Remove all layers. Make copy of keys to avoid mutating the collection\n      // behind the iterator you're accessing.\n      var stamps = [];\n      _jquery2.default.each(groupTable, function (k, v) {\n        stamps.push(k);\n      });\n      _jquery2.default.each(stamps, function (i, stamp) {\n        _this6._removeLayer(stamp);\n      });\n    }\n  }, {\n    key: \"clear\",\n    value: function clear() {\n      function clearLayerGroup(key, layerGroup) {\n        layerGroup.clearLayers();\n      }\n      // Clear all indices and layerGroups\n      this._byGroup = {};\n      this._byCategory = {};\n      this._byLayerId = {};\n      this._byStamp = {};\n      this._byCrosstalkGroup = {};\n      _jquery2.default.each(this._categoryContainers, clearLayerGroup);\n      this._categoryContainers = {};\n      _jquery2.default.each(this._groupContainers, clearLayerGroup);\n      this._groupContainers = {};\n    }\n  }, {\n    key: \"_removeLayer\",\n    value: function _removeLayer(layer) {\n      var stamp = void 0;\n      if (typeof layer === \"string\") {\n        stamp = layer;\n      } else {\n        stamp = _leaflet2.default.Util.stamp(layer);\n      }\n\n      var layerInfo = this._byStamp[stamp];\n      if (!layerInfo) {\n        return false;\n      }\n\n      layerInfo.container.removeLayer(stamp);\n      if (typeof layerInfo.group === \"string\") {\n        delete this._byGroup[layerInfo.group][stamp];\n      }\n      if (typeof layerInfo.layerId === \"string\") {\n        delete this._byLayerId[this._layerIdKey(layerInfo.category, layerInfo.layerId)];\n      }\n      delete this._byCategory[layerInfo.category][stamp];\n      delete this._byStamp[stamp];\n      if (layerInfo.ctGroup) {\n        var ctGroup = this._byCrosstalkGroup[layerInfo.ctGroup];\n        var layersForKey = ctGroup[layerInfo.ctKey];\n        var idx = layersForKey ? layersForKey.indexOf(stamp) : -1;\n        if (idx >= 0) {\n          if (layersForKey.length === 1) {\n            delete ctGroup[layerInfo.ctKey];\n          } else {\n            layersForKey.splice(idx, 1);\n          }\n        }\n      }\n    }\n  }, {\n    key: \"_layerIdKey\",\n    value: function _layerIdKey(category, layerId) {\n      return category + \"\\n\" + layerId;\n    }\n  }]);\n\n  return LayerManager;\n}();\n\nexports.default = LayerManager;\n\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./global/jquery\":9,\"./global/leaflet\":10,\"./util\":17}],15:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _jquery = require(\"./global/jquery\");\n\nvar _jquery2 = _interopRequireDefault(_jquery);\n\nvar _leaflet = require(\"./global/leaflet\");\n\nvar _leaflet2 = _interopRequireDefault(_leaflet);\n\nvar _shiny = require(\"./global/shiny\");\n\nvar _shiny2 = _interopRequireDefault(_shiny);\n\nvar _htmlwidgets = require(\"./global/htmlwidgets\");\n\nvar _htmlwidgets2 = _interopRequireDefault(_htmlwidgets);\n\nvar _util = require(\"./util\");\n\nvar _crs_utils = require(\"./crs_utils\");\n\nvar _dataframe = require(\"./dataframe\");\n\nvar _dataframe2 = _interopRequireDefault(_dataframe);\n\nvar _clusterLayerStore = require(\"./cluster-layer-store\");\n\nvar _clusterLayerStore2 = _interopRequireDefault(_clusterLayerStore);\n\nvar _mipmapper = require(\"./mipmapper\");\n\nvar _mipmapper2 = _interopRequireDefault(_mipmapper);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar methods = {};\nexports.default = methods;\n\n\nfunction mouseHandler(mapId, layerId, group, eventName, extraInfo) {\n  return function (e) {\n    if (!_htmlwidgets2.default.shinyMode) return;\n\n    var latLng = e.target.getLatLng ? e.target.getLatLng() : e.latlng;\n    if (latLng) {\n      // retrieve only lat, lon values to remove prototype\n      //   and extra parameters added by 3rd party modules\n      // these objects are for json serialization, not javascript\n      var latLngVal = _leaflet2.default.latLng(latLng); // make sure it has consistent shape\n      latLng = { lat: latLngVal.lat, lng: latLngVal.lng };\n    }\n    var eventInfo = _jquery2.default.extend({\n      id: layerId,\n      \".nonce\": Math.random() // force reactivity\n    }, group !== null ? { group: group } : null, latLng, extraInfo);\n\n    _shiny2.default.onInputChange(mapId + \"_\" + eventName, eventInfo);\n  };\n}\n\nmethods.mouseHandler = mouseHandler;\n\nmethods.clearGroup = function (group) {\n  var _this = this;\n\n  _jquery2.default.each((0, _util.asArray)(group), function (i, v) {\n    _this.layerManager.clearGroup(v);\n  });\n};\n\nmethods.setView = function (center, zoom, options) {\n  this.setView(center, zoom, options);\n};\n\nmethods.fitBounds = function (lat1, lng1, lat2, lng2, options) {\n  this.fitBounds([[lat1, lng1], [lat2, lng2]], options);\n};\n\nmethods.flyTo = function (center, zoom, options) {\n  this.flyTo(center, zoom, options);\n};\n\nmethods.flyToBounds = function (lat1, lng1, lat2, lng2, options) {\n  this.flyToBounds([[lat1, lng1], [lat2, lng2]], options);\n};\n\nmethods.setMaxBounds = function (lat1, lng1, lat2, lng2) {\n  this.setMaxBounds([[lat1, lng1], [lat2, lng2]]);\n};\n\nmethods.addPopups = function (lat, lng, popup, layerId, group, options) {\n  var _this2 = this;\n\n  var df = new _dataframe2.default().col(\"lat\", lat).col(\"lng\", lng).col(\"popup\", popup).col(\"layerId\", layerId).col(\"group\", group).cbind(options);\n\n  var _loop = function _loop(i) {\n    if (_jquery2.default.isNumeric(df.get(i, \"lat\")) && _jquery2.default.isNumeric(df.get(i, \"lng\"))) {\n      (function () {\n        var popup = _leaflet2.default.popup(df.get(i)).setLatLng([df.get(i, \"lat\"), df.get(i, \"lng\")]).setContent(df.get(i, \"popup\"));\n        var thisId = df.get(i, \"layerId\");\n        var thisGroup = df.get(i, \"group\");\n        this.layerManager.addLayer(popup, \"popup\", thisId, thisGroup);\n      }).call(_this2);\n    }\n  };\n\n  for (var i = 0; i < df.nrow(); i++) {\n    _loop(i);\n  }\n};\n\nmethods.removePopup = function (layerId) {\n  this.layerManager.removeLayer(\"popup\", layerId);\n};\n\nmethods.clearPopups = function () {\n  this.layerManager.clearLayers(\"popup\");\n};\n\nmethods.addTiles = function (urlTemplate, layerId, group, options) {\n  this.layerManager.addLayer(_leaflet2.default.tileLayer(urlTemplate, options), \"tile\", layerId, group);\n};\n\nmethods.removeTiles = function (layerId) {\n  this.layerManager.removeLayer(\"tile\", layerId);\n};\n\nmethods.clearTiles = function () {\n  this.layerManager.clearLayers(\"tile\");\n};\n\nmethods.addWMSTiles = function (baseUrl, layerId, group, options) {\n  if (options && options.crs) {\n    options.crs = (0, _crs_utils.getCRS)(options.crs);\n  }\n  this.layerManager.addLayer(_leaflet2.default.tileLayer.wms(baseUrl, options), \"tile\", layerId, group);\n};\n\n// Given:\n//   {data: [\"a\", \"b\", \"c\"], index: [0, 1, 0, 2]}\n// returns:\n//   [\"a\", \"b\", \"a\", \"c\"]\nfunction unpackStrings(iconset) {\n  if (!iconset) {\n    return iconset;\n  }\n  if (typeof iconset.index === \"undefined\") {\n    return iconset;\n  }\n\n  iconset.data = (0, _util.asArray)(iconset.data);\n  iconset.index = (0, _util.asArray)(iconset.index);\n\n  return _jquery2.default.map(iconset.index, function (e, i) {\n    return iconset.data[e];\n  });\n}\n\nfunction addMarkers(map, df, group, clusterOptions, clusterId, markerFunc) {\n  (function () {\n    var _this3 = this;\n\n    var clusterGroup = this.layerManager.getLayer(\"cluster\", clusterId),\n        cluster = clusterOptions !== null;\n    if (cluster && !clusterGroup) {\n      clusterGroup = _leaflet2.default.markerClusterGroup.layerSupport(clusterOptions);\n      if (clusterOptions.freezeAtZoom) {\n        var freezeAtZoom = clusterOptions.freezeAtZoom;\n        delete clusterOptions.freezeAtZoom;\n        clusterGroup.freezeAtZoom(freezeAtZoom);\n      }\n      clusterGroup.clusterLayerStore = new _clusterLayerStore2.default(clusterGroup);\n    }\n    var extraInfo = cluster ? { clusterId: clusterId } : {};\n\n    var _loop2 = function _loop2(i) {\n      if (_jquery2.default.isNumeric(df.get(i, \"lat\")) && _jquery2.default.isNumeric(df.get(i, \"lng\"))) {\n        (function () {\n          var marker = markerFunc(df, i);\n          var thisId = df.get(i, \"layerId\");\n          var thisGroup = cluster ? null : df.get(i, \"group\");\n          if (cluster) {\n            clusterGroup.clusterLayerStore.add(marker, thisId);\n          } else {\n            this.layerManager.addLayer(marker, \"marker\", thisId, thisGroup, df.get(i, \"ctGroup\", true), df.get(i, \"ctKey\", true));\n          }\n          var popup = df.get(i, \"popup\");\n          var popupOptions = df.get(i, \"popupOptions\");\n          if (popup !== null) {\n            if (popupOptions !== null) {\n              marker.bindPopup(popup, popupOptions);\n            } else {\n              marker.bindPopup(popup);\n            }\n          }\n          var label = df.get(i, \"label\");\n          var labelOptions = df.get(i, \"labelOptions\");\n          if (label !== null) {\n            if (labelOptions !== null) {\n              if (labelOptions.permanent) {\n                marker.bindTooltip(label, labelOptions).openTooltip();\n              } else {\n                marker.bindTooltip(label, labelOptions);\n              }\n            } else {\n              marker.bindTooltip(label);\n            }\n          }\n          marker.on(\"click\", mouseHandler(this.id, thisId, thisGroup, \"marker_click\", extraInfo), this);\n          marker.on(\"mouseover\", mouseHandler(this.id, thisId, thisGroup, \"marker_mouseover\", extraInfo), this);\n          marker.on(\"mouseout\", mouseHandler(this.id, thisId, thisGroup, \"marker_mouseout\", extraInfo), this);\n          marker.on(\"dragend\", mouseHandler(this.id, thisId, thisGroup, \"marker_dragend\", extraInfo), this);\n        }).call(_this3);\n      }\n    };\n\n    for (var i = 0; i < df.nrow(); i++) {\n      _loop2(i);\n    }\n\n    if (cluster) {\n      this.layerManager.addLayer(clusterGroup, \"cluster\", clusterId, group);\n    }\n  }).call(map);\n}\n\nmethods.addGenericMarkers = addMarkers;\n\nmethods.addMarkers = function (lat, lng, icon, layerId, group, options, popup, popupOptions, clusterOptions, clusterId, label, labelOptions, crosstalkOptions) {\n  var icondf = void 0;\n  var getIcon = void 0;\n\n  if (icon) {\n    // Unpack icons\n    icon.iconUrl = unpackStrings(icon.iconUrl);\n    icon.iconRetinaUrl = unpackStrings(icon.iconRetinaUrl);\n    icon.shadowUrl = unpackStrings(icon.shadowUrl);\n    icon.shadowRetinaUrl = unpackStrings(icon.shadowRetinaUrl);\n\n    // This cbinds the icon URLs and any other icon options; they're all\n    // present on the icon object.\n    icondf = new _dataframe2.default().cbind(icon);\n\n    // Constructs an icon from a specified row of the icon dataframe.\n    getIcon = function getIcon(i) {\n      var opts = icondf.get(i);\n      if (!opts.iconUrl) {\n        return new _leaflet2.default.Icon.Default();\n      }\n\n      // Composite options (like points or sizes) are passed from R with each\n      // individual component as its own option. We need to combine them now\n      // into their composite form.\n      if (opts.iconWidth) {\n        opts.iconSize = [opts.iconWidth, opts.iconHeight];\n      }\n      if (opts.shadowWidth) {\n        opts.shadowSize = [opts.shadowWidth, opts.shadowHeight];\n      }\n      if (opts.iconAnchorX) {\n        opts.iconAnchor = [opts.iconAnchorX, opts.iconAnchorY];\n      }\n      if (opts.shadowAnchorX) {\n        opts.shadowAnchor = [opts.shadowAnchorX, opts.shadowAnchorY];\n      }\n      if (opts.popupAnchorX) {\n        opts.popupAnchor = [opts.popupAnchorX, opts.popupAnchorY];\n      }\n\n      return new _leaflet2.default.Icon(opts);\n    };\n  }\n\n  if (!(_jquery2.default.isEmptyObject(lat) || _jquery2.default.isEmptyObject(lng)) || _jquery2.default.isNumeric(lat) && _jquery2.default.isNumeric(lng)) {\n\n    var df = new _dataframe2.default().col(\"lat\", lat).col(\"lng\", lng).col(\"layerId\", layerId).col(\"group\", group).col(\"popup\", popup).col(\"popupOptions\", popupOptions).col(\"label\", label).col(\"labelOptions\", labelOptions).cbind(options).cbind(crosstalkOptions || {});\n\n    if (icon) icondf.effectiveLength = df.nrow();\n\n    addMarkers(this, df, group, clusterOptions, clusterId, function (df, i) {\n      var options = df.get(i);\n      if (icon) options.icon = getIcon(i);\n      return _leaflet2.default.marker([df.get(i, \"lat\"), df.get(i, \"lng\")], options);\n    });\n  }\n};\n\nmethods.addAwesomeMarkers = function (lat, lng, icon, layerId, group, options, popup, popupOptions, clusterOptions, clusterId, label, labelOptions, crosstalkOptions) {\n  var icondf = void 0;\n  var getIcon = void 0;\n  if (icon) {\n\n    // This cbinds the icon URLs and any other icon options; they're all\n    // present on the icon object.\n    icondf = new _dataframe2.default().cbind(icon);\n\n    // Constructs an icon from a specified row of the icon dataframe.\n    getIcon = function getIcon(i) {\n      var opts = icondf.get(i);\n      if (!opts) {\n        return new _leaflet2.default.AwesomeMarkers.icon();\n      }\n\n      if (opts.squareMarker) {\n        opts.className = \"awesome-marker awesome-marker-square\";\n      }\n      return new _leaflet2.default.AwesomeMarkers.icon(opts);\n    };\n  }\n\n  if (!(_jquery2.default.isEmptyObject(lat) || _jquery2.default.isEmptyObject(lng)) || _jquery2.default.isNumeric(lat) && _jquery2.default.isNumeric(lng)) {\n\n    var df = new _dataframe2.default().col(\"lat\", lat).col(\"lng\", lng).col(\"layerId\", layerId).col(\"group\", group).col(\"popup\", popup).col(\"popupOptions\", popupOptions).col(\"label\", label).col(\"labelOptions\", labelOptions).cbind(options).cbind(crosstalkOptions || {});\n\n    if (icon) icondf.effectiveLength = df.nrow();\n\n    addMarkers(this, df, group, clusterOptions, clusterId, function (df, i) {\n      var options = df.get(i);\n      if (icon) options.icon = getIcon(i);\n      return _leaflet2.default.marker([df.get(i, \"lat\"), df.get(i, \"lng\")], options);\n    });\n  }\n};\n\nfunction addLayers(map, category, df, layerFunc) {\n  var _loop3 = function _loop3(i) {\n    (function () {\n      var layer = layerFunc(df, i);\n      if (!_jquery2.default.isEmptyObject(layer)) {\n        var thisId = df.get(i, \"layerId\");\n        var thisGroup = df.get(i, \"group\");\n        this.layerManager.addLayer(layer, category, thisId, thisGroup, df.get(i, \"ctGroup\", true), df.get(i, \"ctKey\", true));\n        if (layer.bindPopup) {\n          var popup = df.get(i, \"popup\");\n          var popupOptions = df.get(i, \"popupOptions\");\n          if (popup !== null) {\n            if (popupOptions !== null) {\n              layer.bindPopup(popup, popupOptions);\n            } else {\n              layer.bindPopup(popup);\n            }\n          }\n        }\n        if (layer.bindTooltip) {\n          var label = df.get(i, \"label\");\n          var labelOptions = df.get(i, \"labelOptions\");\n          if (label !== null) {\n            if (labelOptions !== null) {\n              layer.bindTooltip(label, labelOptions);\n            } else {\n              layer.bindTooltip(label);\n            }\n          }\n        }\n        layer.on(\"click\", mouseHandler(this.id, thisId, thisGroup, category + \"_click\"), this);\n        layer.on(\"mouseover\", mouseHandler(this.id, thisId, thisGroup, category + \"_mouseover\"), this);\n        layer.on(\"mouseout\", mouseHandler(this.id, thisId, thisGroup, category + \"_mouseout\"), this);\n        var highlightStyle = df.get(i, \"highlightOptions\");\n\n        if (!_jquery2.default.isEmptyObject(highlightStyle)) {\n\n          var defaultStyle = {};\n          _jquery2.default.each(highlightStyle, function (k, v) {\n            if (k != \"bringToFront\" && k != \"sendToBack\") {\n              if (df.get(i, k)) {\n                defaultStyle[k] = df.get(i, k);\n              }\n            }\n          });\n\n          layer.on(\"mouseover\", function (e) {\n            this.setStyle(highlightStyle);\n            if (highlightStyle.bringToFront) {\n              this.bringToFront();\n            }\n          });\n          layer.on(\"mouseout\", function (e) {\n            this.setStyle(defaultStyle);\n            if (highlightStyle.sendToBack) {\n              this.bringToBack();\n            }\n          });\n        }\n      }\n    }).call(map);\n  };\n\n  for (var i = 0; i < df.nrow(); i++) {\n    _loop3(i);\n  }\n}\n\nmethods.addGenericLayers = addLayers;\n\nmethods.addCircles = function (lat, lng, radius, layerId, group, options, popup, popupOptions, label, labelOptions, highlightOptions, crosstalkOptions) {\n  if (!(_jquery2.default.isEmptyObject(lat) || _jquery2.default.isEmptyObject(lng)) || _jquery2.default.isNumeric(lat) && _jquery2.default.isNumeric(lng)) {\n    var df = new _dataframe2.default().col(\"lat\", lat).col(\"lng\", lng).col(\"radius\", radius).col(\"layerId\", layerId).col(\"group\", group).col(\"popup\", popup).col(\"popupOptions\", popupOptions).col(\"label\", label).col(\"labelOptions\", labelOptions).col(\"highlightOptions\", highlightOptions).cbind(options).cbind(crosstalkOptions || {});\n\n    addLayers(this, \"shape\", df, function (df, i) {\n      if (_jquery2.default.isNumeric(df.get(i, \"lat\")) && _jquery2.default.isNumeric(df.get(i, \"lng\")) && _jquery2.default.isNumeric(df.get(i, \"radius\"))) {\n        return _leaflet2.default.circle([df.get(i, \"lat\"), df.get(i, \"lng\")], df.get(i, \"radius\"), df.get(i));\n      } else {\n        return null;\n      }\n    });\n  }\n};\n\nmethods.addCircleMarkers = function (lat, lng, radius, layerId, group, options, clusterOptions, clusterId, popup, popupOptions, label, labelOptions, crosstalkOptions) {\n  if (!(_jquery2.default.isEmptyObject(lat) || _jquery2.default.isEmptyObject(lng)) || _jquery2.default.isNumeric(lat) && _jquery2.default.isNumeric(lng)) {\n    var df = new _dataframe2.default().col(\"lat\", lat).col(\"lng\", lng).col(\"radius\", radius).col(\"layerId\", layerId).col(\"group\", group).col(\"popup\", popup).col(\"popupOptions\", popupOptions).col(\"label\", label).col(\"labelOptions\", labelOptions).cbind(crosstalkOptions || {}).cbind(options);\n\n    addMarkers(this, df, group, clusterOptions, clusterId, function (df, i) {\n      return _leaflet2.default.circleMarker([df.get(i, \"lat\"), df.get(i, \"lng\")], df.get(i));\n    });\n  }\n};\n\n/*\n * @param lat Array of arrays of latitude coordinates for polylines\n * @param lng Array of arrays of longitude coordinates for polylines\n */\nmethods.addPolylines = function (polygons, layerId, group, options, popup, popupOptions, label, labelOptions, highlightOptions) {\n  if (polygons.length > 0) {\n    var df = new _dataframe2.default().col(\"shapes\", polygons).col(\"layerId\", layerId).col(\"group\", group).col(\"popup\", popup).col(\"popupOptions\", popupOptions).col(\"label\", label).col(\"labelOptions\", labelOptions).col(\"highlightOptions\", highlightOptions).cbind(options);\n\n    addLayers(this, \"shape\", df, function (df, i) {\n      var shapes = df.get(i, \"shapes\");\n      shapes = shapes.map(function (shape) {\n        return _htmlwidgets2.default.dataframeToD3(shape[0]);\n      });\n      if (shapes.length > 1) {\n        return _leaflet2.default.polyline(shapes, df.get(i));\n      } else {\n        return _leaflet2.default.polyline(shapes[0], df.get(i));\n      }\n    });\n  }\n};\n\nmethods.removeMarker = function (layerId) {\n  this.layerManager.removeLayer(\"marker\", layerId);\n};\n\nmethods.clearMarkers = function () {\n  this.layerManager.clearLayers(\"marker\");\n};\n\nmethods.removeMarkerCluster = function (layerId) {\n  this.layerManager.removeLayer(\"cluster\", layerId);\n};\n\nmethods.removeMarkerFromCluster = function (layerId, clusterId) {\n  var cluster = this.layerManager.getLayer(\"cluster\", clusterId);\n  if (!cluster) return;\n  cluster.clusterLayerStore.remove(layerId);\n};\n\nmethods.clearMarkerClusters = function () {\n  this.layerManager.clearLayers(\"cluster\");\n};\n\nmethods.removeShape = function (layerId) {\n  this.layerManager.removeLayer(\"shape\", layerId);\n};\n\nmethods.clearShapes = function () {\n  this.layerManager.clearLayers(\"shape\");\n};\n\nmethods.addRectangles = function (lat1, lng1, lat2, lng2, layerId, group, options, popup, popupOptions, label, labelOptions, highlightOptions) {\n  var df = new _dataframe2.default().col(\"lat1\", lat1).col(\"lng1\", lng1).col(\"lat2\", lat2).col(\"lng2\", lng2).col(\"layerId\", layerId).col(\"group\", group).col(\"popup\", popup).col(\"popupOptions\", popupOptions).col(\"label\", label).col(\"labelOptions\", labelOptions).col(\"highlightOptions\", highlightOptions).cbind(options);\n\n  addLayers(this, \"shape\", df, function (df, i) {\n    if (_jquery2.default.isNumeric(df.get(i, \"lat1\")) && _jquery2.default.isNumeric(df.get(i, \"lng1\")) && _jquery2.default.isNumeric(df.get(i, \"lat2\")) && _jquery2.default.isNumeric(df.get(i, \"lng2\"))) {\n      return _leaflet2.default.rectangle([[df.get(i, \"lat1\"), df.get(i, \"lng1\")], [df.get(i, \"lat2\"), df.get(i, \"lng2\")]], df.get(i));\n    } else {\n      return null;\n    }\n  });\n};\n\n/*\n * @param lat Array of arrays of latitude coordinates for polygons\n * @param lng Array of arrays of longitude coordinates for polygons\n */\nmethods.addPolygons = function (polygons, layerId, group, options, popup, popupOptions, label, labelOptions, highlightOptions) {\n  if (polygons.length > 0) {\n    var df = new _dataframe2.default().col(\"shapes\", polygons).col(\"layerId\", layerId).col(\"group\", group).col(\"popup\", popup).col(\"popupOptions\", popupOptions).col(\"label\", label).col(\"labelOptions\", labelOptions).col(\"highlightOptions\", highlightOptions).cbind(options);\n\n    addLayers(this, \"shape\", df, function (df, i) {\n      // This code used to use L.multiPolygon, but that caused\n      // double-click on a multipolygon to fail to zoom in on the\n      // map. Surprisingly, putting all the rings in a single\n      // polygon seems to still work; complicated multipolygons\n      // are still rendered correctly.\n      var shapes = df.get(i, \"shapes\").map(function (polygon) {\n        return polygon.map(_htmlwidgets2.default.dataframeToD3);\n      }).reduce(function (acc, val) {\n        return acc.concat(val);\n      }, []);\n      return _leaflet2.default.polygon(shapes, df.get(i));\n    });\n  }\n};\n\nmethods.addGeoJSON = function (data, layerId, group, style) {\n  // This time, self is actually needed because the callbacks below need\n  // to access both the inner and outer senses of \"this\"\n  var self = this;\n  if (typeof data === \"string\") {\n    data = JSON.parse(data);\n  }\n\n  var globalStyle = _jquery2.default.extend({}, style, data.style || {});\n\n  var gjlayer = _leaflet2.default.geoJson(data, {\n    style: function style(feature) {\n      if (feature.style || feature.properties.style) {\n        return _jquery2.default.extend({}, globalStyle, feature.style, feature.properties.style);\n      } else {\n        return globalStyle;\n      }\n    },\n    onEachFeature: function onEachFeature(feature, layer) {\n      var extraInfo = {\n        featureId: feature.id,\n        properties: feature.properties\n      };\n      var popup = feature.properties ? feature.properties.popup : null;\n      if (typeof popup !== \"undefined\" && popup !== null) layer.bindPopup(popup);\n      layer.on(\"click\", mouseHandler(self.id, layerId, group, \"geojson_click\", extraInfo), this);\n      layer.on(\"mouseover\", mouseHandler(self.id, layerId, group, \"geojson_mouseover\", extraInfo), this);\n      layer.on(\"mouseout\", mouseHandler(self.id, layerId, group, \"geojson_mouseout\", extraInfo), this);\n    }\n  });\n  this.layerManager.addLayer(gjlayer, \"geojson\", layerId, group);\n};\n\nmethods.removeGeoJSON = function (layerId) {\n  this.layerManager.removeLayer(\"geojson\", layerId);\n};\n\nmethods.clearGeoJSON = function () {\n  this.layerManager.clearLayers(\"geojson\");\n};\n\nmethods.addTopoJSON = function (data, layerId, group, style) {\n  // This time, self is actually needed because the callbacks below need\n  // to access both the inner and outer senses of \"this\"\n  var self = this;\n  if (typeof data === \"string\") {\n    data = JSON.parse(data);\n  }\n\n  var globalStyle = _jquery2.default.extend({}, style, data.style || {});\n\n  var gjlayer = _leaflet2.default.geoJson(null, {\n    style: function style(feature) {\n      if (feature.style || feature.properties.style) {\n        return _jquery2.default.extend({}, globalStyle, feature.style, feature.properties.style);\n      } else {\n        return globalStyle;\n      }\n    },\n    onEachFeature: function onEachFeature(feature, layer) {\n      var extraInfo = {\n        featureId: feature.id,\n        properties: feature.properties\n      };\n      var popup = feature.properties.popup;\n      if (typeof popup !== \"undefined\" && popup !== null) layer.bindPopup(popup);\n      layer.on(\"click\", mouseHandler(self.id, layerId, group, \"topojson_click\", extraInfo), this);\n      layer.on(\"mouseover\", mouseHandler(self.id, layerId, group, \"topojson_mouseover\", extraInfo), this);\n      layer.on(\"mouseout\", mouseHandler(self.id, layerId, group, \"topojson_mouseout\", extraInfo), this);\n    }\n  });\n  global.omnivore.topojson.parse(data, null, gjlayer);\n  this.layerManager.addLayer(gjlayer, \"topojson\", layerId, group);\n};\n\nmethods.removeTopoJSON = function (layerId) {\n  this.layerManager.removeLayer(\"topojson\", layerId);\n};\n\nmethods.clearTopoJSON = function () {\n  this.layerManager.clearLayers(\"topojson\");\n};\n\nmethods.addControl = function (html, position, layerId, classes) {\n  function onAdd(map) {\n    var div = _leaflet2.default.DomUtil.create(\"div\", classes);\n    if (typeof layerId !== \"undefined\" && layerId !== null) {\n      div.setAttribute(\"id\", layerId);\n    }\n    this._div = div;\n\n    // It's possible for window.Shiny to be true but Shiny.initializeInputs to\n    // not be, when a static leaflet widget is included as part of the shiny\n    // UI directly (not through leafletOutput or uiOutput). In this case we\n    // don't do the normal Shiny stuff as that will all happen when Shiny\n    // itself loads and binds the entire doc.\n\n    if (window.Shiny && _shiny2.default.initializeInputs) {\n      _shiny2.default.renderHtml(html, this._div);\n      _shiny2.default.initializeInputs(this._div);\n      _shiny2.default.bindAll(this._div);\n    } else {\n      this._div.innerHTML = html;\n    }\n\n    return this._div;\n  }\n  function onRemove(map) {\n    if (window.Shiny && _shiny2.default.unbindAll) {\n      _shiny2.default.unbindAll(this._div);\n    }\n  }\n  var Control = _leaflet2.default.Control.extend({\n    options: { position: position },\n    onAdd: onAdd,\n    onRemove: onRemove\n  });\n  this.controls.add(new Control(), layerId, html);\n};\n\nmethods.addCustomControl = function (control, layerId) {\n  this.controls.add(control, layerId);\n};\n\nmethods.removeControl = function (layerId) {\n  this.controls.remove(layerId);\n};\n\nmethods.getControl = function (layerId) {\n  this.controls.get(layerId);\n};\n\nmethods.clearControls = function () {\n  this.controls.clear();\n};\n\nmethods.addLegend = function (options) {\n  var legend = _leaflet2.default.control({ position: options.position });\n  var gradSpan = void 0;\n\n  legend.onAdd = function (map) {\n    var div = _leaflet2.default.DomUtil.create(\"div\", options.className),\n        colors = options.colors,\n        labels = options.labels,\n        legendHTML = \"\";\n    if (options.type === \"numeric\") {\n      // # Formatting constants.\n      var singleBinHeight = 20; // The distance between tick marks, in px\n      var vMargin = 8; // If 1st tick mark starts at top of gradient, how\n      // many extra px are needed for the top half of the\n      // 1st label? (ditto for last tick mark/label)\n      var tickWidth = 4; // How wide should tick marks be, in px?\n      var labelPadding = 6; // How much distance to reserve for tick mark?\n      // (Must be >= tickWidth)\n\n      // # Derived formatting parameters.\n\n      // What's the height of a single bin, in percentage (of gradient height)?\n      // It might not just be 1/(n-1), if the gradient extends past the tick\n      // marks (which can be the case for pretty cut points).\n      var singleBinPct = (options.extra.p_n - options.extra.p_1) / (labels.length - 1);\n      // Each bin is `singleBinHeight` high. How tall is the gradient?\n      var totalHeight = 1 / singleBinPct * singleBinHeight + 1;\n      // How far should the first tick be shifted down, relative to the top\n      // of the gradient?\n      var tickOffset = singleBinHeight / singleBinPct * options.extra.p_1;\n\n      gradSpan = (0, _jquery2.default)(\"<span/>\").css({\n        \"background\": \"linear-gradient(\" + colors + \")\",\n        \"opacity\": options.opacity,\n        \"height\": totalHeight + \"px\",\n        \"width\": \"18px\",\n        \"display\": \"block\",\n        \"margin-top\": vMargin + \"px\"\n      });\n      var leftDiv = (0, _jquery2.default)(\"<div/>\").css(\"float\", \"left\"),\n          rightDiv = (0, _jquery2.default)(\"<div/>\").css(\"float\", \"left\");\n      leftDiv.append(gradSpan);\n      (0, _jquery2.default)(div).append(leftDiv).append(rightDiv).append((0, _jquery2.default)(\"<br>\"));\n\n      // Have to attach the div to the body at this early point, so that the\n      // svg text getComputedTextLength() actually works, below.\n      document.body.appendChild(div);\n\n      var ns = \"http://www.w3.org/2000/svg\";\n      var svg = document.createElementNS(ns, \"svg\");\n      rightDiv.append(svg);\n      var g = document.createElementNS(ns, \"g\");\n      (0, _jquery2.default)(g).attr(\"transform\", \"translate(0, \" + vMargin + \")\");\n      svg.appendChild(g);\n\n      // max label width needed to set width of svg, and right-justify text\n      var maxLblWidth = 0;\n\n      // Create tick marks and labels\n      _jquery2.default.each(labels, function (i, label) {\n        var y = tickOffset + i * singleBinHeight + 0.5;\n\n        var thisLabel = document.createElementNS(ns, \"text\");\n        (0, _jquery2.default)(thisLabel).text(labels[i]).attr(\"y\", y).attr(\"dx\", labelPadding).attr(\"dy\", \"0.5ex\");\n        g.appendChild(thisLabel);\n        maxLblWidth = Math.max(maxLblWidth, thisLabel.getComputedTextLength());\n\n        var thisTick = document.createElementNS(ns, \"line\");\n        (0, _jquery2.default)(thisTick).attr(\"x1\", 0).attr(\"x2\", tickWidth).attr(\"y1\", y).attr(\"y2\", y).attr(\"stroke-width\", 1);\n        g.appendChild(thisTick);\n      });\n\n      // Now that we know the max label width, we can right-justify\n      (0, _jquery2.default)(svg).find(\"text\").attr(\"dx\", labelPadding + maxLblWidth).attr(\"text-anchor\", \"end\");\n      // Final size for <svg>\n      (0, _jquery2.default)(svg).css({\n        width: maxLblWidth + labelPadding + \"px\",\n        height: totalHeight + vMargin * 2 + \"px\"\n      });\n\n      if (options.na_color && _jquery2.default.inArray(options.na_label, labels) < 0) {\n        (0, _jquery2.default)(div).append(\"<div><i style=\\\"\" + \"background:\" + options.na_color + \";opacity:\" + options.opacity + \";margin-right:\" + labelPadding + \"px\" + \";\\\"></i>\" + options.na_label + \"</div>\");\n      }\n    } else {\n      if (options.na_color && _jquery2.default.inArray(options.na_label, labels) < 0) {\n        colors.push(options.na_color);\n        labels.push(options.na_label);\n      }\n      for (var i = 0; i < colors.length; i++) {\n        legendHTML += \"<i style=\\\"background:\" + colors[i] + \";opacity:\" + options.opacity + \"\\\"></i> \" + labels[i] + \"<br>\";\n      }\n      div.innerHTML = legendHTML;\n    }\n    if (options.title) (0, _jquery2.default)(div).prepend(\"<div style=\\\"margin-bottom:3px\\\"><strong>\" + options.title + \"</strong></div>\");\n    return div;\n  };\n\n  if (options.group) {\n    // Auto generate a layerID if not provided\n    if (!options.layerId) {\n      options.layerId = _leaflet2.default.Util.stamp(legend);\n    }\n\n    var map = this;\n    map.on(\"overlayadd\", function (e) {\n      if (e.name === options.group) {\n        map.controls.add(legend, options.layerId);\n      }\n    });\n    map.on(\"overlayremove\", function (e) {\n      if (e.name === options.group) {\n        map.controls.remove(options.layerId);\n      }\n    });\n    map.on(\"groupadd\", function (e) {\n      if (e.name === options.group) {\n        map.controls.add(legend, options.layerId);\n      }\n    });\n    map.on(\"groupremove\", function (e) {\n      if (e.name === options.group) {\n        map.controls.remove(options.layerId);\n      }\n    });\n  }\n\n  this.controls.add(legend, options.layerId);\n};\n\nmethods.addLayersControl = function (baseGroups, overlayGroups, options) {\n  var _this4 = this;\n\n  // Only allow one layers control at a time\n  methods.removeLayersControl.call(this);\n\n  var firstLayer = true;\n  var base = {};\n  _jquery2.default.each((0, _util.asArray)(baseGroups), function (i, g) {\n    var layer = _this4.layerManager.getLayerGroup(g, true);\n    if (layer) {\n      base[g] = layer;\n\n      // Check if >1 base layers are visible; if so, hide all but the first one\n      if (_this4.hasLayer(layer)) {\n        if (firstLayer) {\n          firstLayer = false;\n        } else {\n          _this4.removeLayer(layer);\n        }\n      }\n    }\n  });\n  var overlay = {};\n  _jquery2.default.each((0, _util.asArray)(overlayGroups), function (i, g) {\n    var layer = _this4.layerManager.getLayerGroup(g, true);\n    if (layer) {\n      overlay[g] = layer;\n    }\n  });\n\n  this.currentLayersControl = _leaflet2.default.control.layers(base, overlay, options);\n  this.addControl(this.currentLayersControl);\n};\n\nmethods.removeLayersControl = function () {\n  if (this.currentLayersControl) {\n    this.removeControl(this.currentLayersControl);\n    this.currentLayersControl = null;\n  }\n};\n\nmethods.addScaleBar = function (options) {\n\n  // Only allow one scale bar at a time\n  methods.removeScaleBar.call(this);\n\n  var scaleBar = _leaflet2.default.control.scale(options).addTo(this);\n  this.currentScaleBar = scaleBar;\n};\n\nmethods.removeScaleBar = function () {\n  if (this.currentScaleBar) {\n    this.currentScaleBar.remove();\n    this.currentScaleBar = null;\n  }\n};\n\nmethods.hideGroup = function (group) {\n  var _this5 = this;\n\n  _jquery2.default.each((0, _util.asArray)(group), function (i, g) {\n    var layer = _this5.layerManager.getLayerGroup(g, true);\n    if (layer) {\n      _this5.removeLayer(layer);\n    }\n  });\n};\n\nmethods.showGroup = function (group) {\n  var _this6 = this;\n\n  _jquery2.default.each((0, _util.asArray)(group), function (i, g) {\n    var layer = _this6.layerManager.getLayerGroup(g, true);\n    if (layer) {\n      _this6.addLayer(layer);\n    }\n  });\n};\n\nfunction setupShowHideGroupsOnZoom(map) {\n  if (map.leafletr._hasInitializedShowHideGroups) {\n    return;\n  }\n  map.leafletr._hasInitializedShowHideGroups = true;\n\n  function setVisibility(layer, visible, group) {\n    if (visible !== map.hasLayer(layer)) {\n      if (visible) {\n        map.addLayer(layer);\n        map.fire(\"groupadd\", { \"name\": group, \"layer\": layer });\n      } else {\n        map.removeLayer(layer);\n        map.fire(\"groupremove\", { \"name\": group, \"layer\": layer });\n      }\n    }\n  }\n\n  function showHideGroupsOnZoom() {\n    if (!map.layerManager) return;\n\n    var zoom = map.getZoom();\n    map.layerManager.getAllGroupNames().forEach(function (group) {\n      var layer = map.layerManager.getLayerGroup(group, false);\n      if (layer && typeof layer.zoomLevels !== \"undefined\") {\n        setVisibility(layer, layer.zoomLevels === true || layer.zoomLevels.indexOf(zoom) >= 0, group);\n      }\n    });\n  }\n\n  map.showHideGroupsOnZoom = showHideGroupsOnZoom;\n  map.on(\"zoomend\", showHideGroupsOnZoom);\n}\n\nmethods.setGroupOptions = function (group, options) {\n  var _this7 = this;\n\n  _jquery2.default.each((0, _util.asArray)(group), function (i, g) {\n    var layer = _this7.layerManager.getLayerGroup(g, true);\n    // This slightly tortured check is because 0 is a valid value for zoomLevels\n    if (typeof options.zoomLevels !== \"undefined\" && options.zoomLevels !== null) {\n      layer.zoomLevels = (0, _util.asArray)(options.zoomLevels);\n    }\n  });\n\n  setupShowHideGroupsOnZoom(this);\n  this.showHideGroupsOnZoom();\n};\n\nmethods.addRasterImage = function (uri, bounds, opacity, attribution, layerId, group) {\n  // uri is a data URI containing an image. We want to paint this image as a\n  // layer at (top-left) bounds[0] to (bottom-right) bounds[1].\n\n  // We can't simply use ImageOverlay, as it uses bilinear scaling which looks\n  // awful as you zoom in (and sometimes shifts positions or disappears).\n  // Instead, we'll use a TileLayer.Canvas to draw pieces of the image.\n\n  // First, some helper functions.\n\n  // degree2tile converts latitude, longitude, and zoom to x and y tile\n  // numbers. The tile numbers returned can be non-integral, as there's no\n  // reason to expect that the lat/lng inputs are exactly on the border of two\n  // tiles.\n  //\n  // We'll use this to convert the bounds we got from the server, into coords\n  // in tile-space at a given zoom level. Note that once we do the conversion,\n  // we don't to do any more trigonometry to convert between pixel coordinates\n  // and tile coordinates; the source image pixel coords, destination canvas\n  // pixel coords, and tile coords all can be scaled linearly.\n  function degree2tile(lat, lng, zoom) {\n    // See http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames\n    var latRad = lat * Math.PI / 180;\n    var n = Math.pow(2, zoom);\n    var x = (lng + 180) / 360 * n;\n    var y = (1 - Math.log(Math.tan(latRad) + 1 / Math.cos(latRad)) / Math.PI) / 2 * n;\n    return { x: x, y: y };\n  }\n\n  // Given a range [from,to) and either one or two numbers, returns true if\n  // there is any overlap between [x,x1) and the range--or if x1 is omitted,\n  // then returns true if x is within [from,to).\n  function overlap(from, to, x, /* optional */x1) {\n    if (arguments.length == 3) x1 = x;\n    return x < to && x1 >= from;\n  }\n\n  function getCanvasSmoothingProperty(ctx) {\n    var candidates = [\"imageSmoothingEnabled\", \"mozImageSmoothingEnabled\", \"webkitImageSmoothingEnabled\", \"msImageSmoothingEnabled\"];\n    for (var i = 0; i < candidates.length; i++) {\n      if (typeof ctx[candidates[i]] !== \"undefined\") {\n        return candidates[i];\n      }\n    }\n    return null;\n  }\n\n  // Our general strategy is to:\n  // 1. Load the data URI in an Image() object, so we can get its pixel\n  //    dimensions and the underlying image data. (We could have done this\n  //    by not encoding as PNG at all but just send an array of RGBA values\n  //    from the server, but that would inflate the JSON too much.)\n  // 2. Create a hidden canvas that we use just to extract the image data\n  //    from the Image (using Context2D.getImageData()).\n  // 3. Create a TileLayer.Canvas and add it to the map.\n\n  // We want to synchronously create and attach the TileLayer.Canvas (so an\n  // immediate call to clearRasters() will be respected, for example), but\n  // Image loads its data asynchronously. Fortunately we can resolve this\n  // by putting TileLayer.Canvas into async mode, which will let us create\n  // and attach the layer but have it wait until the image is loaded before\n  // it actually draws anything.\n\n  // These are the variables that we will populate once the image is loaded.\n  var imgData = null; // 1d row-major array, four [0-255] integers per pixel\n  var imgDataMipMapper = null;\n  var w = null; // image width in pixels\n  var h = null; // image height in pixels\n\n  // We'll use this array to store callbacks that need to be invoked once\n  // imgData, w, and h have been resolved.\n  var imgDataCallbacks = [];\n\n  // Consumers of imgData, w, and h can call this to be notified when data\n  // is available.\n  function getImageData(callback) {\n    if (imgData != null) {\n      // Must not invoke the callback immediately; it's too confusing and\n      // fragile to have a function invoke the callback *either* immediately\n      // or in the future. Better to be consistent here.\n      setTimeout(function () {\n        callback(imgData, w, h, imgDataMipMapper);\n      }, 0);\n    } else {\n      imgDataCallbacks.push(callback);\n    }\n  }\n\n  var img = new Image();\n  img.onload = function () {\n    // Save size\n    w = img.width;\n    h = img.height;\n\n    // Create a dummy canvas to extract the image data\n    var imgDataCanvas = document.createElement(\"canvas\");\n    imgDataCanvas.width = w;\n    imgDataCanvas.height = h;\n    imgDataCanvas.style.display = \"none\";\n    document.body.appendChild(imgDataCanvas);\n\n    var imgDataCtx = imgDataCanvas.getContext(\"2d\");\n    imgDataCtx.drawImage(img, 0, 0);\n\n    // Save the image data.\n    imgData = imgDataCtx.getImageData(0, 0, w, h).data;\n    imgDataMipMapper = new _mipmapper2.default(img);\n\n    // Done with the canvas, remove it from the page so it can be gc'd.\n    document.body.removeChild(imgDataCanvas);\n\n    // Alert any getImageData callers who are waiting.\n    for (var i = 0; i < imgDataCallbacks.length; i++) {\n      imgDataCallbacks[i](imgData, w, h, imgDataMipMapper);\n    }\n    imgDataCallbacks = [];\n  };\n  img.src = uri;\n\n  var canvasTiles = _leaflet2.default.gridLayer({\n    opacity: opacity,\n    attribution: attribution,\n    detectRetina: true,\n    async: true\n  });\n\n  // NOTE: The done() function MUST NOT be invoked until after the current\n  // tick; done() looks in Leaflet's tile cache for the current tile, and\n  // since it's still being constructed, it won't be found.\n  canvasTiles.createTile = function (tilePoint, done) {\n    var zoom = tilePoint.z;\n    var canvas = _leaflet2.default.DomUtil.create(\"canvas\");\n    var error = void 0;\n\n    // setup tile width and height according to the options\n    var size = this.getTileSize();\n    canvas.width = size.x;\n    canvas.height = size.y;\n\n    getImageData(function (imgData, w, h, mipmapper) {\n      try {\n        // The Context2D we'll being drawing onto. It's always 256x256.\n        var ctx = canvas.getContext(\"2d\");\n\n        // Convert our image data's top-left and bottom-right locations into\n        // x/y tile coordinates. This is essentially doing a spherical mercator\n        // projection, then multiplying by 2^zoom.\n        var topLeft = degree2tile(bounds[0][0], bounds[0][1], zoom);\n        var bottomRight = degree2tile(bounds[1][0], bounds[1][1], zoom);\n        // The size of the image in x/y tile coordinates.\n        var extent = { x: bottomRight.x - topLeft.x, y: bottomRight.y - topLeft.y };\n\n        // Short circuit if tile is totally disjoint from image.\n        if (!overlap(tilePoint.x, tilePoint.x + 1, topLeft.x, bottomRight.x)) return;\n        if (!overlap(tilePoint.y, tilePoint.y + 1, topLeft.y, bottomRight.y)) return;\n\n        // The linear resolution of the tile we're drawing is always 256px per tile unit.\n        // If the linear resolution (in either direction) of the image is less than 256px\n        // per tile unit, then use nearest neighbor; otherwise, use the canvas's built-in\n        // scaling.\n        var imgRes = {\n          x: w / extent.x,\n          y: h / extent.y\n        };\n\n        // We can do the actual drawing in one of three ways:\n        // - Call drawImage(). This is easy and fast, and results in smooth\n        //   interpolation (bilinear?). This is what we want when we are\n        //   reducing the image from its native size.\n        // - Call drawImage() with imageSmoothingEnabled=false. This is easy\n        //   and fast and gives us nearest-neighbor interpolation, which is what\n        //   we want when enlarging the image. However, it's unsupported on many\n        //   browsers (including QtWebkit).\n        // - Do a manual nearest-neighbor interpolation. This is what we'll fall\n        //   back to when enlarging, and imageSmoothingEnabled isn't supported.\n        //   In theory it's slower, but still pretty fast on my machine, and the\n        //   results look the same AFAICT.\n\n        // Is imageSmoothingEnabled supported? If so, we can let canvas do\n        // nearest-neighbor interpolation for us.\n        var smoothingProperty = getCanvasSmoothingProperty(ctx);\n\n        if (smoothingProperty || imgRes.x >= 256 && imgRes.y >= 256) {\n          // Use built-in scaling\n\n          // Turn off anti-aliasing if necessary\n          if (smoothingProperty) {\n            ctx[smoothingProperty] = imgRes.x >= 256 && imgRes.y >= 256;\n          }\n\n          // Don't necessarily draw with the full-size image; if we're\n          // downscaling, use the mipmapper to get a pre-downscaled image\n          // (see comments on Mipmapper class for why this matters).\n          mipmapper.getBySize(extent.x * 256, extent.y * 256, function (mip) {\n            // It's possible that the image will go off the edge of the canvas--\n            // that's OK, the canvas should clip appropriately.\n            ctx.drawImage(mip,\n            // Convert abs tile coords to rel tile coords, then *256 to convert\n            // to rel pixel coords\n            (topLeft.x - tilePoint.x) * 256, (topLeft.y - tilePoint.y) * 256,\n            // Always draw the whole thing and let canvas clip; so we can just\n            // convert from size in tile coords straight to pixels\n            extent.x * 256, extent.y * 256);\n          });\n        } else {\n          // Use manual nearest-neighbor interpolation\n\n          // Calculate the source image pixel coordinates that correspond with\n          // the top-left and bottom-right of this tile. (If the source image\n          // only partially overlaps the tile, we use max/min to limit the\n          // sourceStart/End to only reflect the overlapping portion.)\n          var sourceStart = {\n            x: Math.max(0, Math.floor((tilePoint.x - topLeft.x) * imgRes.x)),\n            y: Math.max(0, Math.floor((tilePoint.y - topLeft.y) * imgRes.y))\n          };\n          var sourceEnd = {\n            x: Math.min(w, Math.ceil((tilePoint.x + 1 - topLeft.x) * imgRes.x)),\n            y: Math.min(h, Math.ceil((tilePoint.y + 1 - topLeft.y) * imgRes.y))\n          };\n\n          // The size, in dest pixels, that each source pixel should occupy.\n          // This might be greater or less than 1 (e.g. if x and y resolution\n          // are very different).\n          var pixelSize = {\n            x: 256 / imgRes.x,\n            y: 256 / imgRes.y\n          };\n\n          // For each pixel in the source image that overlaps the tile...\n          for (var row = sourceStart.y; row < sourceEnd.y; row++) {\n            for (var col = sourceStart.x; col < sourceEnd.x; col++) {\n              // ...extract the pixel data...\n              var i = (row * w + col) * 4;\n              var r = imgData[i];\n              var g = imgData[i + 1];\n              var b = imgData[i + 2];\n              var a = imgData[i + 3];\n              ctx.fillStyle = \"rgba(\" + [r, g, b, a / 255].join(\",\") + \")\";\n\n              // ...calculate the corresponding pixel coord in the dest image\n              // where it should be drawn...\n              var pixelPos = {\n                x: (col / imgRes.x + topLeft.x - tilePoint.x) * 256,\n                y: (row / imgRes.y + topLeft.y - tilePoint.y) * 256\n              };\n\n              // ...and draw a rectangle there.\n              ctx.fillRect(Math.round(pixelPos.x), Math.round(pixelPos.y),\n              // Looks crazy, but this is necessary to prevent rounding from\n              // causing overlap between this rect and its neighbors. The\n              // minuend is the location of the next pixel, while the\n              // subtrahend is the position of the current pixel (to turn an\n              // absolute coordinate to a width/height). Yes, I had to look\n              // up minuend and subtrahend.\n              Math.round(pixelPos.x + pixelSize.x) - Math.round(pixelPos.x), Math.round(pixelPos.y + pixelSize.y) - Math.round(pixelPos.y));\n            }\n          }\n        }\n      } catch (e) {\n        error = e;\n      } finally {\n        done(error, canvas);\n      }\n    });\n    return canvas;\n  };\n\n  this.layerManager.addLayer(canvasTiles, \"image\", layerId, group);\n};\n\nmethods.removeImage = function (layerId) {\n  this.layerManager.removeLayer(\"image\", layerId);\n};\n\nmethods.clearImages = function () {\n  this.layerManager.clearLayers(\"image\");\n};\n\nmethods.addMeasure = function (options) {\n  // if a measureControl already exists, then remove it and\n  //   replace with a new one\n  methods.removeMeasure.call(this);\n  this.measureControl = _leaflet2.default.control.measure(options);\n  this.addControl(this.measureControl);\n};\n\nmethods.removeMeasure = function () {\n  if (this.measureControl) {\n    this.removeControl(this.measureControl);\n    this.measureControl = null;\n  }\n};\n\nmethods.addSelect = function (ctGroup) {\n  var _this8 = this;\n\n  methods.removeSelect.call(this);\n\n  this._selectButton = _leaflet2.default.easyButton({\n    states: [{\n      stateName: \"select-inactive\",\n      icon: \"ion-qr-scanner\",\n      title: \"Make a selection\",\n      onClick: function onClick(btn, map) {\n        btn.state(\"select-active\");\n        _this8._locationFilter = new _leaflet2.default.LocationFilter2();\n\n        if (ctGroup) {\n          var selectionHandle = new global.crosstalk.SelectionHandle(ctGroup);\n          selectionHandle.on(\"change\", function (e) {\n            if (e.sender !== selectionHandle) {\n              if (_this8._locationFilter) {\n                _this8._locationFilter.disable();\n                btn.state(\"select-inactive\");\n              }\n            }\n          });\n          var handler = function handler(e) {\n            _this8.layerManager.brush(_this8._locationFilter.getBounds(), { sender: selectionHandle });\n          };\n          _this8._locationFilter.on(\"enabled\", handler);\n          _this8._locationFilter.on(\"change\", handler);\n          _this8._locationFilter.on(\"disabled\", function () {\n            selectionHandle.close();\n            _this8._locationFilter = null;\n          });\n        }\n\n        _this8._locationFilter.addTo(map);\n      }\n    }, {\n      stateName: \"select-active\",\n      icon: \"ion-close-round\",\n      title: \"Dismiss selection\",\n      onClick: function onClick(btn, map) {\n        btn.state(\"select-inactive\");\n        _this8._locationFilter.disable();\n        // If explicitly dismissed, clear the crosstalk selections\n        _this8.layerManager.unbrush();\n      }\n    }]\n  });\n\n  this._selectButton.addTo(this);\n};\n\nmethods.removeSelect = function () {\n  if (this._locationFilter) {\n    this._locationFilter.disable();\n  }\n\n  if (this._selectButton) {\n    this.removeControl(this._selectButton);\n    this._selectButton = null;\n  }\n};\n\nmethods.createMapPane = function (name, zIndex) {\n  this.createPane(name);\n  this.getPane(name).style.zIndex = zIndex;\n};\n\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"./cluster-layer-store\":1,\"./crs_utils\":3,\"./dataframe\":4,\"./global/htmlwidgets\":8,\"./global/jquery\":9,\"./global/leaflet\":10,\"./global/shiny\":12,\"./mipmapper\":16,\"./util\":17}],16:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// This class simulates a mipmap, which shrinks images by powers of two. This\n// stepwise reduction results in \"pixel-perfect downscaling\" (where every\n// pixel of the original image has some contribution to the downscaled image)\n// as opposed to a single-step downscaling which will discard a lot of data\n// (and with sparse images at small scales can give very surprising results).\nvar Mipmapper = function () {\n  function Mipmapper(img) {\n    _classCallCheck(this, Mipmapper);\n\n    this._layers = [img];\n  }\n\n  // The various functions on this class take a callback function BUT MAY OR MAY\n  // NOT actually behave asynchronously.\n\n\n  _createClass(Mipmapper, [{\n    key: \"getBySize\",\n    value: function getBySize(desiredWidth, desiredHeight, callback) {\n      var _this = this;\n\n      var i = 0;\n      var lastImg = this._layers[0];\n      var testNext = function testNext() {\n        _this.getByIndex(i, function (img) {\n          // If current image is invalid (i.e. too small to be rendered) or\n          // it's smaller than what we wanted, return the last known good image.\n          if (!img || img.width < desiredWidth || img.height < desiredHeight) {\n            callback(lastImg);\n            return;\n          } else {\n            lastImg = img;\n            i++;\n            testNext();\n            return;\n          }\n        });\n      };\n      testNext();\n    }\n  }, {\n    key: \"getByIndex\",\n    value: function getByIndex(i, callback) {\n      var _this2 = this;\n\n      if (this._layers[i]) {\n        callback(this._layers[i]);\n        return;\n      }\n\n      this.getByIndex(i - 1, function (prevImg) {\n        if (!prevImg) {\n          // prevImg could not be calculated (too small, possibly)\n          callback(null);\n          return;\n        }\n        if (prevImg.width < 2 || prevImg.height < 2) {\n          // Can't reduce this image any further\n          callback(null);\n          return;\n        }\n        // If reduce ever becomes truly asynchronous, we should stuff a promise or\n        // something into this._layers[i] before calling this.reduce(), to prevent\n        // redundant reduce operations from happening.\n        _this2.reduce(prevImg, function (reducedImg) {\n          _this2._layers[i] = reducedImg;\n          callback(reducedImg);\n          return;\n        });\n      });\n    }\n  }, {\n    key: \"reduce\",\n    value: function reduce(img, callback) {\n      var imgDataCanvas = document.createElement(\"canvas\");\n      imgDataCanvas.width = Math.ceil(img.width / 2);\n      imgDataCanvas.height = Math.ceil(img.height / 2);\n      imgDataCanvas.style.display = \"none\";\n      document.body.appendChild(imgDataCanvas);\n      try {\n        var imgDataCtx = imgDataCanvas.getContext(\"2d\");\n        imgDataCtx.drawImage(img, 0, 0, img.width / 2, img.height / 2);\n        callback(imgDataCanvas);\n      } finally {\n        document.body.removeChild(imgDataCanvas);\n      }\n    }\n  }]);\n\n  return Mipmapper;\n}();\n\nexports.default = Mipmapper;\n\n\n},{}],17:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.log = log;\nexports.recycle = recycle;\nexports.asArray = asArray;\nfunction log(message) {\n  /* eslint-disable no-console */\n  if (console && console.log) console.log(message);\n  /* eslint-enable no-console */\n}\n\nfunction recycle(values, length, inPlace) {\n  if (length === 0 && !inPlace) return [];\n\n  if (!(values instanceof Array)) {\n    if (inPlace) {\n      throw new Error(\"Can't do in-place recycling of a non-Array value\");\n    }\n    values = [values];\n  }\n  if (typeof length === \"undefined\") length = values.length;\n\n  var dest = inPlace ? values : [];\n  var origLength = values.length;\n  while (dest.length < length) {\n    dest.push(values[dest.length % origLength]);\n  }\n  if (dest.length > length) {\n    dest.splice(length, dest.length - length);\n  }\n  return dest;\n}\n\nfunction asArray(value) {\n  if (value instanceof Array) return value;else return [value];\n}\n\n\n},{}]},{},[13]);\n"
  },
  {
    "path": "vignettes/tutorials/libs/leafletfix/leafletfix.css",
    "content": "/* Work around CSS properties introduced on img by bootstrap */\nimg.leaflet-tile {\n  padding: 0;\n  margin: 0;\n  border-radius: 0;\n  border: none;\n}\n.info {\n  padding: 6px 8px;\n  font: 14px/16px Arial, Helvetica, sans-serif;\n  background: white;\n  background: rgba(255,255,255,0.8);\n  box-shadow: 0 0 15px rgba(0,0,0,0.2);\n  border-radius: 5px;\n}\n.legend {\n  line-height: 18px;\n  color: #555;\n}\n.legend svg text {\n  fill: #555;\n}\n.legend svg line {\n  stroke: #555;\n}\n.legend i {\n  width: 18px;\n  height: 18px;\n  margin-right: 4px;\n  opacity: 0.7;\n  display: inline-block;\n  vertical-align: top;\n  /*For IE 7*/\n  zoom: 1;\n  *display: inline;\n}\n"
  },
  {
    "path": "vignettes/tutorials/libs/remark-css/default-fonts.css",
    "content": "@import url(https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz);\n@import url(https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic);\n@import url(https://fonts.googleapis.com/css?family=Source+Code+Pro:400,700);\n\nbody { font-family: 'Droid Serif', 'Palatino Linotype', 'Book Antiqua', Palatino, 'Microsoft YaHei', 'Songti SC', serif; }\nh1, h2, h3 {\n  font-family: 'Yanone Kaffeesatz';\n  font-weight: normal;\n}\n.remark-code, .remark-inline-code { font-family: 'Source Code Pro', 'Lucida Console', Monaco, monospace; }\n"
  },
  {
    "path": "vignettes/tutorials/libs/remark-css/default.css",
    "content": "a, a > code {\n  color: rgb(249, 38, 114);\n  text-decoration: none;\n}\n.footnote {\n  position: absolute;\n  bottom: 3em;\n  padding-right: 4em;\n  font-size: 90%;\n}\n.remark-code-line-highlighted     { background-color: #ffff88; }\n\n.inverse {\n  background-color: #272822;\n  color: #d6d6d6;\n  text-shadow: 0 0 20px #333;\n}\n.inverse h1, .inverse h2, .inverse h3 {\n  color: #f3f3f3;\n}\n/* Two-column layout */\n.left-column {\n  color: #777;\n  width: 20%;\n  height: 92%;\n  float: left;\n}\n.left-column h2:last-of-type, .left-column h3:last-child {\n  color: #000;\n}\n.right-column {\n  width: 75%;\n  float: right;\n  padding-top: 1em;\n}\n.pull-left {\n  float: left;\n  width: 47%;\n}\n.pull-right {\n  float: right;\n  width: 47%;\n}\n.pull-right + * {\n  clear: both;\n}\nimg, video, iframe {\n  max-width: 100%;\n}\nblockquote {\n  border-left: solid 5px lightgray;\n  padding-left: 1em;\n}\n.remark-slide table {\n  margin: auto;\n  border-top: 1px solid #666;\n  border-bottom: 1px solid #666;\n}\n.remark-slide table thead th { border-bottom: 1px solid #ddd; }\nth, td { padding: 5px; }\n.remark-slide thead, .remark-slide tfoot, .remark-slide tr:nth-child(even) { background: #eee }\n\n@page { margin: 0; }\n@media print {\n  .remark-slide-scaler {\n    width: 100% !important;\n    height: 100% !important;\n    transform: scale(1) !important;\n    top: 0 !important;\n    left: 0 !important;\n  }\n}\n"
  },
  {
    "path": "vignettes/tutorials/libs/rstudio_leaflet/rstudio_leaflet.css",
    "content": ".leaflet-tooltip.leaflet-tooltip-text-only,\n.leaflet-tooltip.leaflet-tooltip-text-only:before,\n.leaflet-tooltip.leaflet-tooltip-text-only:after {\n  background: none;\n  border: none;\n  box-shadow: none;\n}\n\n.leaflet-tooltip.leaflet-tooltip-text-only.leaflet-tooltip-left {\n  margin-left: 5px;\n}\n\n.leaflet-tooltip.leaflet-tooltip-text-only.leaflet-tooltip-right {\n  margin-left: -5px;\n}\n\n.leaflet-tooltip:after {\n  border-right: 6px solid transparent;\n  /* right: -16px; */\n}\n\n.leaflet-popup-pane .leaflet-popup-tip-container {\n  /* when the tooltip container is clicked, it is closed */\n  pointer-events: all;\n  /* tooltips should display the \"hand\" icon, just like .leaflet-interactive*/\n  cursor: pointer;\n}\n\n/* have the widget be displayed in the right 'layer' */\n.leaflet-map-pane {\n  z-index: auto;\n}\n"
  },
  {
    "path": "vignettes/tutorials/rsconnect/documents/visual-introduction.Rmd/rpubs.com/rpubs/Document.dcf",
    "content": "name: Document\ntitle:\nusername:\naccount: rpubs\nserver: rpubs.com\nhostUrl: rpubs.com\nappId: https://api.rpubs.com/api/v1/document/568397/6e2cfea2d8974518a125d297212bc2c9\nbundleId: https://api.rpubs.com/api/v1/document/568397/6e2cfea2d8974518a125d297212bc2c9\nurl: http://rpubs.com/publish/claim/568397/c7fe036631f54a90a7ccfbf2b5346502\nwhen: 1579889939.35125\n"
  },
  {
    "path": "vignettes/tutorials/rsconnect/documents/visual-introduction.Rmd/rpubs.com/rpubs/Publish Document.dcf",
    "content": "name: Publish Document\ntitle:\nusername:\naccount: rpubs\nserver: rpubs.com\nhostUrl: rpubs.com\nappId: https://api.rpubs.com/api/v1/document/524972/4358130cc0594724b5a1e67641b2d30e\nbundleId: https://api.rpubs.com/api/v1/document/524972/4358130cc0594724b5a1e67641b2d30e\nurl: http://rpubs.com/dash2/524972\n<<<<<<< HEAD\nwhen: 1567609881.87213\n=======\nwhen: 1567609742.60495\n>>>>>>> 1076cd437de7a4afd95e6b51a393a9141be60f5f\n"
  },
  {
    "path": "vignettes/tutorials/visual-intro-styles.css",
    "content": ".reveal section img {\n  background: none;\n  border: none;\n  box-shadow: none;\n}\n\n.smallfont section p{\n   font-size: 0.4em;\n}"
  },
  {
    "path": "vignettes/tutorials/visual-introduction.Rmd",
    "content": "---\ntitle: \"santoku - a visual introduction\"\nauthor: \"David Hugh-Jones\"\ndate: \"`r Sys.Date()`\"\noutput: \n  revealjs::revealjs_presentation:\n    md_extensions: +raw_html\n    transition: none\n    css: visual-intro-styles.css\n    theme: serif\n    reveal_options:\n      slideNumber: true\n      hash: true\n      navigationMode: linear\n---\n\n```{r setup, include=FALSE}\n\nknitr::opts_chunk$set(echo = FALSE, fig.height = 4, fig.width = 7)\n\nlibrary(santoku)\n\nrequireNamespace(\"png\", quietly = TRUE)\nrequireNamespace(\"here\", quietly = TRUE)\nrequireNamespace(\"scales\", quietly = TRUE)\nrequireNamespace(\"plotrix\", quietly = TRUE)\n\nfish <- png::readPNG(here::here(\"man\", \"figures\", \"fish.png\"))\nfish <- fish[150:800, , ]\nfish_alpha <- fish[, , 4]\nfish_red   <- fish[, , 1]\nfish_raster <- as.raster(fish)\nfish_x <- ncol(fish)\nfish_y <- nrow(fish)\n\nsuppressWarnings({\n  # image is \"upside down\", so max and min are correct here\n  fish_bottom <- apply(fish_alpha, 2, function (x) max(which(x > 0.8)))\n  fish_top <- apply(fish_alpha, 2, function (x) min(which(x > 0.8)))\n})\nfish_bottom[is.infinite(fish_bottom)] <- NA\nfish_top[is.infinite(fish_top)] <- NA\nfish_top <- fish_y - fish_top\nfish_bottom <- fish_y - fish_bottom\n\npts <- cbind(\n        sample(nrow(fish), 1000, replace = TRUE),\n        round(rbeta(1000, 1, .5) * ncol(fish))\n      )\npts <- pts[fish_alpha[pts] > 0.9 & fish_red[pts] > 0.7,] # matrix subsetting; points within the fish!\npts <- as.data.frame(pts)\nnames(pts) <- c(\"y\", \"x\")\npts <- pts[, c(\"x\", \"y\")]\npts$y <- fish_y - pts$y\n\npts <- rbind(pts, data.frame(x = 500, y = seq(200, 350, 10)))\npts <- rbind(pts, data.frame(x = 70, y = 250))\nx <- pts$x # done later, for show\n\npalette(c(\"coral4\", \"darkgreen\", \"darkred\", \"darkgoldenrod3\", \"bisque4\",\n      \"darkorange3\", \"darkkhaki\", \"salmon4\"))\nNA_col <- \"grey\"\nline_col <- \"black\"\n\nplot_the_fish <- function (cols = \"peachpuff4\") {\n  par(mar = c(2, 0, 0, 0))\n  par(bg = \"transparent\")\n  plot(c(1, fish_x), c(1, fish_y), type = 'n', axes = FALSE, xlab = \"\", \n        ylab = \"\")\n  rasterImage(fish_raster, 1, 1, fish_x, fish_y)\n  cols <- scales::alpha(cols, 0.75)\n  points(pts$x, pts$y, col = cols, pch = 19, cex = 0.5)\n  axis(1, seq(0, fish_x, 100), cex.axis = 0.7)\n}\n\n\ndemo_chop <- function (breaks, labels = lbl_intervals(), extend = NULL, \n      ..., close_end = TRUE, left = TRUE, \n      lines = TRUE, swoosh = FALSE, lty = 1, cex_labels = 0.7,\n      skip_lines = numeric(0)) {\n  chopped <- chop(pts$x, breaks, labels = labels, \n          extend = extend, left = left, close_end = close_end, ...)\n  if (is.numeric(breaks)) breaks <- brk_default(breaks)\n  breaks <- breaks(pts$x, extend = extend, left = left, close_end = close_end)\n  \n  breaks_r <- round(c(breaks[is.finite(breaks)]))\n  breaks_r <- breaks_r[breaks_r > 0 & breaks_r <= fish_x]\n  \n  chopped_cols <- palette()[chopped]\n  chopped_cols[is.na(chopped)] <- NA_col\n  plot_the_fish(cols = chopped_cols)\n  \n  if (is.function(labels)) labels <- labels(breaks)\n  label_breaks <- c(breaks)\n  label_breaks[label_breaks == -Inf] <- 0\n  label_breaks[label_breaks == Inf] <- fish_x\n  midpoints <- (label_breaks[-1] + label_breaks[-length(label_breaks)])/2\n  y <- if (any(diff(midpoints) < 150)) 20 else 50\n  plotrix::boxed.labels(midpoints, rep_len(c(50, y), length(midpoints)), \n        labels, cex = cex_labels, bg = \"white\", border = FALSE, xpad = 1.1, ypad = 1.5)\n\n  breaks_r <- setdiff(breaks_r, skip_lines)\n  if (lines) {\n    segments(\n          x0 = breaks_r,\n          y0 = fish_bottom[breaks_r], \n          y1 = fish_top[breaks_r], \n          lwd = 1, lty = 1, col = if (swoosh) \"black\" else line_col\n        )\n    segments(\n          x0 = breaks_r,\n          y0 = 65, \n          y1 = 800, \n          lwd = 1, lty = 2, col = if (swoosh) \"black\" else line_col\n        )\n    if (swoosh) {\n      left <- attr(breaks, \"left\")\n      left <- left[is.finite(c(breaks)) & breaks > 0 & breaks <= fish_x]\n      cols <- palette()[seq_len(nlevels(chopped) )]\n      if (! is.null(extend) && ! extend) cols <- c(NA_col, cols, NA_col)\n      # there are n colours, one per interval and `length(left)` lines.\n      # hopefully n = length(left) - 1\n      # left-closed lines get the colour of their right interval\n      line_col <- seq_along(left)\n      line_col[!left] <- line_col[!left] - 1\n      # assuming the first line is left-closed and the last line is right-closed\n      col <- cols[line_col]\n  \n      for (smooth in 1:5) {\n        alpha <-  0.5 - 0.1 * smooth\n        segments(\n                x0 = breaks_r + 4 * smooth * ifelse(left, 1, -1),\n                y0 = fish_bottom[breaks_r], \n                y1 = fish_top[breaks_r], \n                lwd = 4, col = scales::alpha(col, alpha)\n              )\n      }\n    }\n  }\n}\n\n```\n\n## Santoku\n\nA Japanese kitchen knife.\n\n![chopping skills](https://media.giphy.com/media/ywSHsUF8TSdXHvDydU/giphy.gif)\n\n## {santoku}\n\nAn R package for cutting data.\n\n![santoku logo](../../man/figures/logo.png)\n\n\n## Some data\n\n```{r, echo = TRUE}\nhead(pts)\nx <- pts$x\n```\n\n\n## Some data\n\n```{r, echo = TRUE}\nplot_the_fish()\n```\n\n\n## `chop()`\n\n`chop()` is a replacement for base R's `cut()` function.\n\n\n## `chop()`\n\n```{r, echo = TRUE, eval = FALSE}\nchop(x, c(300, 600, 900))\n```\n\n```{r}\ndemo_chop(c(300, 600, 900))\n```\n\n\n## `extend = FALSE`\n\n```{r, echo = TRUE, eval = FALSE}\nchop(x, c(300, 600, 900), extend = FALSE)\n```\n\n```{r}\ndemo_chop(c(300, 600, 900), extend = FALSE)\nlegend(\"bottomright\", \"NA\", col = NA_col, pch = 19, bty = \"n\", cex = 2)\n```\n\n\n## Chopping by a single value\n\n```{r, echo = TRUE, eval = FALSE}\nchop(x, c(300, 500, 500, 800))\n```\n\n```{r}\ndemo_chop(c(300, 500, 500, 800), skip_lines = 500)\n#arrows(x0 = 500, y0 =600, y1 = fish_top[500] + 40, lwd = 2, length = 0.1)\nsegments(x0 = c(495, 505), y0 = 65, y1 = 800, \n      lty = 2, col = line_col)\nsegments(x0 = c(495, 505), y0 = fish_bottom[500], y1 = fish_top[500], \n      lty = 1, col = line_col)\n```\n\n## `chop_width()`\n\nChops fixed-width intervals\n\n```{r, echo = TRUE, eval = FALSE}\nchop_width(x, width = 200)\n```\n\n```{r}\ndemo_chop(brk_width(width = 200))\n```\n\n\n## `chop_evenly()`\n\nChops `intervals` equal-width intervals\n\n```{r, echo = TRUE, eval = FALSE}\nchop_evenly(x, intervals = 5)\n```\n\n```{r}\ndemo_chop(brk_evenly(intervals = 5))\n```\n\n\n## `chop_proportions()`\n\nChops intervals by proportions of the data range\n\n```{r, echo = TRUE, eval = FALSE}\nchop_proportions(x, proportions = c(0.2, 0.8))\n```\n\n```{r}\ndemo_chop(brk_proportions(proportions = c(0.2, 0.8)))\n```\n\n\n## `chop_equally()`\n\nChops intervals with an equal *number of elements*\n\n```{r, echo = TRUE, eval = FALSE}\nchop_equally(x, groups = 5)\n```\n\n```{r}\ndemo_chop(brk_quantiles(1:4/5))\n```\n\n## `chop_n()`\n\nChops intervals with a *fixed* number of elements\n\n```{r, echo = TRUE, eval = FALSE}\nchop_n(x, 50)\n```\n\n```{r}\n# close_end avoids a singleton interval at the end\ndemo_chop(brk_n(50), close_end = TRUE)\n```\n\n\n## `chop_quantiles()`\n\n```{r, echo = TRUE, eval = FALSE}\nchop_quantiles(x, c(0.2, 0.8))\n```\n\n```{r}\ndemo_chop(brk_quantiles(c(0.2, 0.8)))\n```\n\n\n## Summary\n\nChop by: / Size means:  | number of elements | width\n------------------------|--------------------|----------------\nFixed size              | `chop_n()`         | `chop_width()`\nFixed no. of groups     | `chop_equally()`   | `chop_evenly()`\nSpecific sizes          | `chop_quantiles()` | `chop_proportions()`\n\n\n## `chop_mean_sd()`\n\n```{r, echo = TRUE, eval = FALSE}\nchop_mean_sd(x)\n```\n\n```{r}\ndemo_chop(brk_mean_sd())\n```\n\n\n\n## Quick tables {.smallfont}\n\n```{r, echo = TRUE}\ntab(x, c(300, 600, 900))\ntab_mean_sd(x)\n```\n\n## Changing labels\n\nYou need one more labels than breaks:\n\n```{r, echo = TRUE, eval = FALSE}\nchop(x, c(300, 600, 900), labels = LETTERS[1:4])\n```\n\n```{r}\ndemo_chop(c(300, 600, 900), labels = LETTERS[1:4], cex_labels = 1)\n```\n\n\n## Changing labels\n\nNot sure how many intervals you will have? \n\nUse a `lbl_*` function.\n\n```{r, echo = TRUE, eval = FALSE}\nchop_width(x, 200, labels = lbl_seq())\n```\n\n\n```{r}\ndemo_chop(brk_width(200), labels = lbl_seq(), cex_labels = 1)\n```\n\n## Changing labels\n\nNot sure how many intervals you will have? \n\nUse a `lbl_*` function.\n\n```{r, echo = TRUE, eval = FALSE}\nchop_width(x, 200, labels = lbl_seq(\"(i)\"))\n```\n\n\n```{r}\ndemo_chop(brk_width(200), labels = lbl_seq(\"(i)\"), cex_labels = 1)\n```\n\n## Changing labels\n\nNot sure how many intervals you will have? \n\nUse a `lbl_*` function.\n\n```{r, echo = TRUE, eval = FALSE}\nchop_width(x, 200, labels = lbl_dash())\n```\n\n\n```{r}\ndemo_chop(brk_width(200), labels = lbl_dash(), cex_labels = 0.8)\n```\n\n## Left-closed and right-closed\n\nBreaks are closed on the left by default.\n\n```{r, echo = TRUE, eval = FALSE}\nchop(x, c(200, 500, 800))\n```\n\n```{r}\ndemo_chop(c(200, 500, 800), left = TRUE, swoosh = TRUE)\n```\n\n\n## Left-closed and right-closed\n\nFor right-closed breaks use `left = FALSE`:\n\n```{r, echo = TRUE, eval = FALSE}\nchop(x, c(200, 500, 800), left = FALSE)\n```\n\n```{r}\ndemo_chop(c(200, 500, 800), left = FALSE, swoosh = TRUE)\n```\n\n## Errors\n\n![chopping fail](https://media.giphy.com/media/2zom27Xqp7PVe/giphy.gif)\n\n## Errors \n\n<div style=\"text-align: left;\">\n<small>Sometimes it's impossible to create the breaks you want.</small>\n```{r, echo = TRUE}\nchop_quantiles(c(-Inf, Inf), c(0.25, 0.75))\n```\n\n<small>When the problem comes from the data (`x`), santoku will try to carry on\n(e.g. by returning a single interval).</small>\n\n<small>When the problem comes from other parameters, e.g. `breaks` or `extend`,\nsantoku will give an error.</small>\n```{r, echo = TRUE, error = TRUE}\nchop_quantiles(1:5, c(0.25, NA))\n```\n</div>\n\n## Happy chopping!\n\nhttps://hughjonesd.github.io/santoku\n\n```{r, echo = TRUE, eval = FALSE}\ndevtools::install_github(\"hughjonesd/santoku\")\n```\n\n![Chopping](https://media.giphy.com/media/ceQ6oQNVCVbgY/giphy.gif)"
  },
  {
    "path": "vignettes/website-articles/performance.Rmd",
    "content": "---\ntitle: \"Performance\"\nauthor: \"David Hugh-Jones\"\ndate: \"`r Sys.Date()`\"\noutput: rmarkdown::html_vignette\nvignette: >\n  %\\VignetteIndexEntry{Performance}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n\n```{r setup, include = FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\",\n  cache = FALSE\n)\nrequireNamespace(\"bench\", quietly = TRUE)\nrequireNamespace(\"Hmisc\", quietly = TRUE)\nlibrary(santoku)\nlibrary(ggplot2)\ntheme_set(theme_light())\n```\n\n\n## Speed\n\nThe core of santoku is written in C++. It is reasonably fast:\n\n\n```{r basic}\n\npackageVersion(\"santoku\")\nset.seed(27101975)\n\nmb <- bench::mark(min_iterations = 100, check = FALSE,\n        santoku::chop(rnorm(1e5), -2:2),\n        base::cut(rnorm(1e5), -2:2),\n        Hmisc::cut2(rnorm(1e5), -2:2)\n      )\nmb\n```\n\n\n```{r, fig.width = 7, fig.height = 6}\nautoplot(mb, type = \"violin\")\n```\n\n\n## Many breaks\n\n\n```{r many-breaks}\n\nmany_breaks <- seq(-2, 2, 0.001)\n\nmb_breaks <- bench::mark(min_iterations = 100, check = FALSE,\n        santoku::chop(rnorm(1e4), many_breaks),\n        base::cut(rnorm(1e4), many_breaks),\n        Hmisc::cut2(rnorm(1e4), many_breaks)\n      )\n\nmb_breaks\n```\n\n\n```{r, fig.width = 7, fig.height = 6}\nautoplot(mb_breaks, type = \"violin\")\n```\n\n\n## Various chops\n\n```{r various-chops}\n\nx <- c(rnorm(9e4), sample(-2:2, 1e4, replace = TRUE))\n\nmb_various <- bench::mark(min_iterations = 100, check = FALSE,\n        chop(x, -2:2),\n        chop_equally(x, groups = 20),\n        chop_n(x, n = 2e4),\n        chop_quantiles(x, c(0.05, 0.25, 0.5, 0.75, 0.95)),\n        chop_evenly(x, intervals = 20),\n        chop_width(x, width = 0.25),\n        chop_proportions(x, proportions = c(0.05, 0.25, 0.5, 0.75, 0.95)),\n        chop_mean_sd(x, sds = 1:4),\n        chop_fn(x, scales::breaks_extended(10)),\n        chop_pretty(x, n = 10),\n        chop_spikes(x, -2:2, prop = 0.01),\n        dissect(x, -2:2, prop = 0.01)\n      )\n      \nmb_various\n```\n\n\n```{r, fig.width = 7, fig.height = 6}\nautoplot(mb_various, type = \"violin\")\n```\n"
  },
  {
    "path": "vignettes/website-articles/performance_cache/html/__packages",
    "content": "base\n"
  },
  {
    "path": "vignettes/whats-new-in-0-9-0.Rmd",
    "content": "---\ntitle: \"What's new in santoku 0.9.0\"\noutput: rmarkdown::html_vignette\nvignette: >\n  %\\VignetteIndexEntry{What's new in santoku 0.9.0}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n```{r, include = FALSE}\nknitr::opts_chunk$set(\n  collapse = TRUE,\n  comment = \"#>\"\n)\nset.seed(42)\n```\n\n\nSantoku 0.9.0 has a few changes.\n\n## You can use break names for labels\n\nOn the command line, sometimes you'd like to quickly add labels to your breaks.\nNow, you can do this simply by adding names to the `breaks` vector:\n\n```{r}\nlibrary(santoku)\n\nchop(1:5, c(1,3,5))\n\nchop(1:5, c(Low = 1, High = 3, 5))\n```\n\nBreak names override the `labels` argument, but you can still use this for\nunnamed breaks:\n\n```{r}\n\nages <- sample(12:80, 20)\ntab(ages, \n      c(\"Under 16\" = 0, 16, 25, 35, 45, 55, \"65 and over\" = 65), \n      labels = lbl_discrete()\n    )\n\n```\n\nNames can also be used for labels in `chop_quantiles()` and\n`chop_proportions()`:\n\n```{r}\nx <- rnorm(10)\nchopped <- chop_quantiles(x, \n                            c(\"Lower tail\" = 0, 0.025, \"Upper tail\" = 0.975)\n                          )\ndata.frame(x, chopped)\n```\n\nThis feature is experimental for now. \n\n\n## `close_end` works differently\n\nThe `close_end` parameter is used to right-close the last break. This used to be\napplied before breaks were extended to cover items beyond the explicitly given\nbreaks. We think this was confusing for users. So now, `close_end` is applied\nonly after the breaks have been extended - i.e. to the very last break.\n\nIn 0.8.0:\n\n```r\nchop(1:4, 2:3, close_end = TRUE)\n#> [1] [1, 2) [2, 3] [2, 3] (3, 4]\n#> Levels: [1, 2) [2, 3] (3, 4]\n```\n\nNotice how the central break `[2, 3]` is right-closed. (The extended break `[3, 4]`\nis right-closed too, because extended breaks are always closed at the \"outer\"\nend.)\n\nIn 0.9.0:\n\n```r\nchop(1:4, 2:3, close_end = TRUE)\n#> [1] [1, 2) [2, 3) [3, 4] [3, 4]\n#> Levels: [1, 2) [2, 3) [3, 4]\n```\n\nNow, `close_end` is applied to the final, extended break `[3, 4]`, not to the \nexplicit break `[2, 3)`.\n\n\n## `close_end` is `TRUE` by default\n\nWe think that for exploratory work, users typically want to include all the \ndata between the lowest and highest break, inclusive. So,\n`close_end` is now `TRUE` by default. \n\nIn 0.8.0:\n\n```r\nchop(1:3, 2:3)\n#> [1] [1, 2) [2, 3) {3}   \n#> Levels: [1, 2) [2, 3) {3}\n```\n\nIn 0.9.0:\n\n```r\nchop(1:3, 2:3)\n#> [1] [1, 2) [2, 3] [2, 3]\n#> Levels: [1, 2) [2, 3]\n```\n\n## New `raw` parameter for `chop()`\n\n`lbl_*` functions have a `raw` parameter to use the raw interval endpoints in \nlabels, rather than e.g. percentiles or standard deviations. We've moved this\ninto the main `chop()` function. This makes it easier to use:\n\n```{r}\n\nchop_mean_sd(x)\n\nchop_mean_sd(x, raw = TRUE)\n```\n\nThe `raw` parameter to `lbl_*` functions is deprecated.\n\n\n## Other changes\n\nThe NEWS file lists other changes, including a new `chop_fn()` function\nwhich creates breaks using any arbitrary function.\n\n\n## Feedback\n\nWe expect this to be the last release before 1.0, when we'll stabilize the\ninterface and move santoku from \"experimental\" to \"stable\". So, if you\nhave problems or suggestions regarding any of these changes, please \n[file an issue](https://github.com/hughjonesd/santoku/issues).\n\n"
  }
]