New Upstream Snapshot - r-cran-rex

Ready changes

Summary

Merged new upstream version: 1.2.1+git20220111.1.6f437eb (was: 1.2.1).

Resulting package

Built on 2022-11-03T15:37 (took 10m29s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-snapshots r-cran-rex

Diff

diff --git a/DESCRIPTION b/DESCRIPTION
index 2f66897..fa8cd68 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,7 +1,7 @@
 Type: Package
 Package: rex
 Title: Friendly Regular Expressions
-Version: 1.2.1
+Version: 1.2.1.9000
 Authors@R: c(
     person("Kevin", "Ushey", , "kevinushey@gmail.com", role = c("aut", "cre")),
     person("Jim", "Hester", , "james.f.hester@gmail.com", role = "aut"),
@@ -10,9 +10,8 @@ Authors@R: c(
 Description: A friendly interface for the construction of regular
     expressions.
 License: MIT + file LICENSE
-URL: https://github.com/kevinushey/rex
-BugReports: https://github.com/kevinushey/rex/issues
-Imports: lazyeval
+URL: https://rex.r-lib.org, https://github.com/r-lib/rex
+BugReports: https://github.com/r-lib/rex/issues
 Suggests: covr, dplyr, ggplot2, Hmisc, knitr, magrittr, rmarkdown,
         roxygen2, rvest, stringr, testthat
 VignetteBuilder: knitr
@@ -21,11 +20,10 @@ RoxygenNote: 7.1.2
 Collate: 'aaa.R' 'utils.R' 'escape.R' 'capture.R' 'character_class.R'
         'counts.R' 'lookarounds.R' 'match.R' 'or.R' 'rex-mode.R'
         'rex.R' 'shortcuts.R' 'wildcards.R' 'zzz.R'
+Config/Needs/website: r-lib/pkgdown, tidyverse/tidytemplate
 NeedsCompilation: no
-Packaged: 2021-11-24 20:51:05 UTC; jhester
+Packaged: 2022-11-03 15:32:03 UTC; root
 Author: Kevin Ushey [aut, cre],
   Jim Hester [aut],
   Robert Krzyzanowski [aut]
 Maintainer: Kevin Ushey <kevinushey@gmail.com>
-Repository: CRAN
-Date/Publication: 2021-11-26 16:11:02 UTC
diff --git a/MD5 b/MD5
deleted file mode 100644
index e72ce8d..0000000
--- a/MD5
+++ /dev/null
@@ -1,63 +0,0 @@
-bf6ef069d9a9e23dd0b250a2ee35d6b1 *DESCRIPTION
-a066f78ea5d786ee1d559efc84241161 *LICENSE
-35e553593e5b206e3de15ef50c2514d8 *NAMESPACE
-d77ff0e4ed7654530bc148ecd8deae3d *NEWS.md
-5c321a12d9ecfa525ca2fb20725f3f17 *R/aaa.R
-ec593dc645555c4a6b8303a2190acd5b *R/capture.R
-39f4c60efe6d71c5b3eb3ec8d19f3873 *R/character_class.R
-ac49ea725b7298bf9cbfb957341e215a *R/counts.R
-a5c75daa0b7a85e6df7f1b023230af9c *R/escape.R
-0805f960aa334f4cf3220ebb97183ce8 *R/lookarounds.R
-ceb51d4dc8e4b7c4cd36d3a6cc6da0a8 *R/match.R
-e0085ac9fb1905afeb5f6849e70c3eb3 *R/or.R
-22e4556e954fd76e09fb434394514ac9 *R/rex-mode.R
-a6345e1ede16ebad3955b322bda94034 *R/rex.R
-7f338bfcf826a74fb4e32a5b553f8e99 *R/shortcuts.R
-725830bf45b73cc2ee5d08b38c18e939 *R/utils.R
-ae5f05556325f5ab268341b2de50c377 *R/wildcards.R
-327190f3e3d9de6d7eae71473496d663 *R/zzz.R
-ea5c2b0ccd20339e50c71428b006162f *README.md
-66d71d6592ab75eb2271dfc86b12850b *build/vignette.rds
-8f339c4646ec8aeccf2029cacf53129d *inst/doc/log_parsing.R
-61a3f707a54d90058e63960c002ecadf *inst/doc/log_parsing.Rmd
-125010d04d2d945d09a0f3066b74715e *inst/doc/log_parsing.html
-995550bebe38f30293dc19b2768161a6 *inst/doc/url_parsing.R
-7017037945ac2d5910a5bc761b9131f5 *inst/doc/url_parsing.Rmd
-fcbc1ae11c44b5695dedb66c33ca9fa9 *inst/doc/url_parsing.html
-ecf7fa080f23298c2d3e7cef8c603da2 *man/as.regex.Rd
-f427b6b38f063c09e0f75ebc17d30a0a *man/capture.Rd
-19df5324229976c453e6d2bb2e08cdf3 *man/character_class.Rd
-464b0ae52a588e856d320d9a5bc3e954 *man/character_class_escape.Rd
-fd5360afbe9e7c0cbc2612436c169021 *man/counts.Rd
-c4d49be8d7113417ec8306dac065e6fa *man/escape.Rd
-e745591ce9b515f28a1aabed85955439 *man/group.Rd
-f5c37a2f60dcb197e747a26239848722 *man/lookarounds.Rd
-d242a683a47d866549478abf470435cc *man/not.Rd
-909461098daa02755e0f61946da61eb9 *man/or.Rd
-b63c3a9301a9affebd4e8e803a652c4e *man/re_matches.Rd
-15d803fd77b75dfd021442768bea5b58 *man/re_substitutes.Rd
-d4251542543cbc53aa3e0a894ad4a55f *man/regex.Rd
-a2f005243efa94175ef55c8b7265b689 *man/register_shortcuts.Rd
-0c99247115be1ea28221b7cfbb3e8c06 *man/rex.Rd
-8aed86b57e383e0529aac57cf289e00e *man/rex_mode.Rd
-450c21811f32f83ba347b1e75127b2f3 *man/shortcuts.Rd
-096b2359fc32e8d7c2ab884861c30045 *man/single_shortcuts.Rd
-437aff061caa575b8fdf734ed1f01d5e *man/wildcards.Rd
-ab1b350e9f314cd19cad3a33f3d15d22 *tests/testthat.R
-8460417b6ecacce6923c11f0cc00e7c4 *tests/testthat/test-aaa.R
-fd21760f84c5daa4219d2d489f8680cb *tests/testthat/test-capture.R
-2f5c3ae1786a65720984644017da675a *tests/testthat/test-character_class.R
-e1834bf930896391d347787d6ce61d25 *tests/testthat/test-common.R
-b48591daf94a3a31c4f1274a703af6b8 *tests/testthat/test-counts.R
-634147c66c0fce93a13b5d99a9ffc5f7 *tests/testthat/test-escape.R
-b2353c062e208fe39c66b21bf2e46bc9 *tests/testthat/test-lookarounds.R
-7b1a951319321a17f7c972365471306b *tests/testthat/test-match.R
-2954762867e70d58745fdac2d23df348 *tests/testthat/test-or.R
-90482fba54455f93d8cb2370246688d9 *tests/testthat/test-print.R
-217ef7f57c6eba4353c876656a86736f *tests/testthat/test-rex_mode.R
-472bc0c571d28a35dede6d62b34d73cd *tests/testthat/test-shortcuts.R
-ab9274947f4a6b7e133cdec30b5341c7 *tests/testthat/test-wildcards.R
-959347e409b042544213f8fae02d991b *vignettes/NASA.txt
-61a3f707a54d90058e63960c002ecadf *vignettes/log_parsing.Rmd
-9838c708dc0669c5a14d59cb412cd5cd *vignettes/stackoverflow.R
-7017037945ac2d5910a5bc761b9131f5 *vignettes/url_parsing.Rmd
diff --git a/NEWS.md b/NEWS.md
index 133b976..eedeed9 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,5 @@
+## Rex (development version)
+
 ## Rex Version 1.2.1 ##
 
 * Kevin Ushey is now the maintainer
diff --git a/R/counts.R b/R/counts.R
index 66e4574..48ed3ba 100644
--- a/R/counts.R
+++ b/R/counts.R
@@ -35,6 +35,6 @@ register(at_least)
 
 #' @describeIn counts \code{x} must occur at most \code{n} times.
 at_most <- function(x, n, type = c("greedy", "lazy", "possessive")) {
-  add_type(between(x, "", n), type)
+  add_type(between(x, 0, n), type)
 }
 register(at_most)
diff --git a/R/rex.R b/R/rex.R
index 12b12d6..804b8f0 100644
--- a/R/rex.R
+++ b/R/rex.R
@@ -11,18 +11,18 @@ NULL
 #' @param env environment to evaluate the rex expression in.
 #' @aliases rex_
 rex <- function(..., env = parent.frame()) {
-  args <- lazyeval::lazy_dots(...)
-  rex_(args, env)
+  args <- as.list(substitute(list(...))[-1])
+  rex_(args, env = env)
 }
 
 #' @export
 rex_ <- function(args, env = parent.frame()) {
+  args <- Filter(function(x) !identical(x, quote(expr = )), args)
 
-  args <- lazyeval::as.lazy_dots(args, env)
+  eval_env <- list2env(as.list(.rex$env), parent = env)
+  evaled <- lapply(args, eval, envir = eval_env)
 
-  # this needs the as.list because eval only looks at the enclos if envir is
-  # not an environment
-  regex(p(escape(lazyeval::lazy_eval(args, as.list(.rex$env)))))
+  p(escape(evaled))
 }
 
 #' @describeIn regex coerce regex object to a character
diff --git a/README.md b/README.md
index 6c9a544..608527a 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,9 @@
 # Rex
 
 <!-- badges: start -->
-[![codecov.io](https://codecov.io/github/kevinushey/rex/coverage.svg?branch=master)](https://codecov.io/github/kevinushey/rex?branch=master)
+[![Codecov test coverage](https://codecov.io/gh/kevinushey/rex/branch/master/graph/badge.svg)](https://app.codecov.io/gh/kevinushey/rex?branch=main)
 [![Lifecycle: stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html)
+[![R-CMD-check](https://github.com/kevinushey/rex/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/kevinushey/rex/actions/workflows/R-CMD-check.yaml)
 <!-- badges: end -->
 
 ### Friendly Regular Expressions
diff --git a/build/vignette.rds b/build/vignette.rds
index 7ef05b6..f494b68 100644
Binary files a/build/vignette.rds and b/build/vignette.rds differ
diff --git a/debian/changelog b/debian/changelog
index 6cbf012..e1ba1b1 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+r-cran-rex (1.2.1+git20220111.1.6f437eb-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Thu, 03 Nov 2022 15:32:14 -0000
+
 r-cran-rex (1.2.1-1) unstable; urgency=medium
 
   * New upstream version
diff --git a/inst/doc/log_parsing.html b/inst/doc/log_parsing.html
index 982b324..0429a52 100644
--- a/inst/doc/log_parsing.html
+++ b/inst/doc/log_parsing.html
@@ -12,11 +12,23 @@
 
 <meta name="author" content="Jim Hester" />
 
-<meta name="date" content="2021-11-24" />
+<meta name="date" content="2022-11-03" />
 
 <title>Server Log Parsing</title>
 
-<script src="data:application/javascript;base64,Ly8gUGFuZG9jIDIuOSBhZGRzIGF0dHJpYnV0ZXMgb24gYm90aCBoZWFkZXIgYW5kIGRpdi4gV2UgcmVtb3ZlIHRoZSBmb3JtZXIgKHRvCi8vIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgYmVoYXZpb3Igb2YgUGFuZG9jIDwgMi44KS4KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKGUpIHsKICB2YXIgaHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJkaXYuc2VjdGlvbltjbGFzcyo9J2xldmVsJ10gPiA6Zmlyc3QtY2hpbGQiKTsKICB2YXIgaSwgaCwgYTsKICBmb3IgKGkgPSAwOyBpIDwgaHMubGVuZ3RoOyBpKyspIHsKICAgIGggPSBoc1tpXTsKICAgIGlmICghL15oWzEtNl0kL2kudGVzdChoLnRhZ05hbWUpKSBjb250aW51ZTsgIC8vIGl0IHNob3VsZCBiZSBhIGhlYWRlciBoMS1oNgogICAgYSA9IGguYXR0cmlidXRlczsKICAgIHdoaWxlIChhLmxlbmd0aCA+IDApIGgucmVtb3ZlQXR0cmlidXRlKGFbMF0ubmFtZSk7CiAgfQp9KTsK"></script>
+<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to
+// be compatible with the behavior of Pandoc < 2.8).
+document.addEventListener('DOMContentLoaded', function(e) {
+  var hs = document.querySelectorAll("div.section[class*='level'] > :first-child");
+  var i, h, a;
+  for (i = 0; i < hs.length; i++) {
+    h = hs[i];
+    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6
+    a = h.attributes;
+    while (a.length > 0) h.removeAttribute(a[0].name);
+  }
+});
+</script>
 
 <style type="text/css">
   code{white-space: pre-wrap;}
@@ -28,6 +40,7 @@
     </style>
 
 
+
 <style type="text/css">
   code {
     white-space: pre;
@@ -75,7 +88,7 @@ code span.al { color: #ff0000; font-weight: bold; } /* Alert */
 code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
 code span.at { color: #7d9029; } /* Attribute */
 code span.bn { color: #40a070; } /* BaseN */
-code span.bu { } /* BuiltIn */
+code span.bu { color: #008000; } /* BuiltIn */
 code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
 code span.ch { color: #4070a0; } /* Char */
 code span.cn { color: #880000; } /* Constant */
@@ -88,7 +101,7 @@ code span.er { color: #ff0000; font-weight: bold; } /* Error */
 code span.ex { } /* Extension */
 code span.fl { color: #40a070; } /* Float */
 code span.fu { color: #06287e; } /* Function */
-code span.im { } /* Import */
+code span.im { color: #008000; font-weight: bold; } /* Import */
 code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
 code span.kw { color: #007020; font-weight: bold; } /* Keyword */
 code span.op { color: #666666; } /* Operator */
@@ -109,13 +122,20 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
   for (var i = 0; i < sheets.length; i++) {
     if (sheets[i].ownerNode.dataset["origin"] !== "pandoc") continue;
     try { var rules = sheets[i].cssRules; } catch (e) { continue; }
-    for (var j = 0; j < rules.length; j++) {
+    var j = 0;
+    while (j < rules.length) {
       var rule = rules[j];
       // check if there is a div.sourceCode rule
-      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== "div.sourceCode") continue;
+      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== "div.sourceCode") {
+        j++;
+        continue;
+      }
       var style = rule.style.cssText;
       // check if color or background-color is set
-      if (rule.style.color === '' && rule.style.backgroundColor === '') continue;
+      if (rule.style.color === '' && rule.style.backgroundColor === '') {
+        j++;
+        continue;
+      }
       // replace div.sourceCode by a pre.sourceCode rule
       sheets[i].deleteRule(j);
       sheets[i].insertRule('pre.sourceCode{' + style + '}', j);
@@ -127,7 +147,187 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
 
 
 
-<link rel="stylesheet" href="data:text/css,body%20%7B%0Abackground%2Dcolor%3A%20%23fff%3B%0Amargin%3A%201em%20auto%3B%0Amax%2Dwidth%3A%20700px%3B%0Aoverflow%3A%20visible%3B%0Apadding%2Dleft%3A%202em%3B%0Apadding%2Dright%3A%202em%3B%0Afont%2Dfamily%3A%20%22Open%20Sans%22%2C%20%22Helvetica%20Neue%22%2C%20Helvetica%2C%20Arial%2C%20sans%2Dserif%3B%0Afont%2Dsize%3A%2014px%3B%0Aline%2Dheight%3A%201%2E35%3B%0A%7D%0A%23TOC%20%7B%0Aclear%3A%20both%3B%0Amargin%3A%200%200%2010px%2010px%3B%0Apadding%3A%204px%3B%0Awidth%3A%20400px%3B%0Aborder%3A%201px%20solid%20%23CCCCCC%3B%0Aborder%2Dradius%3A%205px%3B%0Abackground%2Dcolor%3A%20%23f6f6f6%3B%0Afont%2Dsize%3A%2013px%3B%0Aline%2Dheight%3A%201%2E3%3B%0A%7D%0A%23TOC%20%2Etoctitle%20%7B%0Afont%2Dweight%3A%20bold%3B%0Afont%2Dsize%3A%2015px%3B%0Amargin%2Dleft%3A%205px%3B%0A%7D%0A%23TOC%20ul%20%7B%0Apadding%2Dleft%3A%2040px%3B%0Amargin%2Dleft%3A%20%2D1%2E5em%3B%0Amargin%2Dtop%3A%205px%3B%0Amargin%2Dbottom%3A%205px%3B%0A%7D%0A%23TOC%20ul%20ul%20%7B%0Amargin%2Dleft%3A%20%2D2em%3B%0A%7D%0A%23TOC%20li%20%7B%0Aline%2Dheight%3A%2016px%3B%0A%7D%0Atable%20%7B%0Amargin%3A%201em%20auto%3B%0Aborder%2Dwidth%3A%201px%3B%0Aborder%2Dcolor%3A%20%23DDDDDD%3B%0Aborder%2Dstyle%3A%20outset%3B%0Aborder%2Dcollapse%3A%20collapse%3B%0A%7D%0Atable%20th%20%7B%0Aborder%2Dwidth%3A%202px%3B%0Apadding%3A%205px%3B%0Aborder%2Dstyle%3A%20inset%3B%0A%7D%0Atable%20td%20%7B%0Aborder%2Dwidth%3A%201px%3B%0Aborder%2Dstyle%3A%20inset%3B%0Aline%2Dheight%3A%2018px%3B%0Apadding%3A%205px%205px%3B%0A%7D%0Atable%2C%20table%20th%2C%20table%20td%20%7B%0Aborder%2Dleft%2Dstyle%3A%20none%3B%0Aborder%2Dright%2Dstyle%3A%20none%3B%0A%7D%0Atable%20thead%2C%20table%20tr%2Eeven%20%7B%0Abackground%2Dcolor%3A%20%23f7f7f7%3B%0A%7D%0Ap%20%7B%0Amargin%3A%200%2E5em%200%3B%0A%7D%0Ablockquote%20%7B%0Abackground%2Dcolor%3A%20%23f6f6f6%3B%0Apadding%3A%200%2E25em%200%2E75em%3B%0A%7D%0Ahr%20%7B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%3A%20none%3B%0Aborder%2Dtop%3A%201px%20solid%20%23777%3B%0Amargin%3A%2028px%200%3B%0A%7D%0Adl%20%7B%0Amargin%2Dleft%3A%200%3B%0A%7D%0Adl%20dd%20%7B%0Amargin%2Dbottom%3A%2013px%3B%0Amargin%2Dleft%3A%2013px%3B%0A%7D%0Adl%20dt%20%7B%0Afont%2Dweight%3A%20bold%3B%0A%7D%0Aul%20%7B%0Amargin%2Dtop%3A%200%3B%0A%7D%0Aul%20li%20%7B%0Alist%2Dstyle%3A%20circle%20outside%3B%0A%7D%0Aul%20ul%20%7B%0Amargin%2Dbottom%3A%200%3B%0A%7D%0Apre%2C%20code%20%7B%0Abackground%2Dcolor%3A%20%23f7f7f7%3B%0Aborder%2Dradius%3A%203px%3B%0Acolor%3A%20%23333%3B%0Awhite%2Dspace%3A%20pre%2Dwrap%3B%20%0A%7D%0Apre%20%7B%0Aborder%2Dradius%3A%203px%3B%0Amargin%3A%205px%200px%2010px%200px%3B%0Apadding%3A%2010px%3B%0A%7D%0Apre%3Anot%28%5Bclass%5D%29%20%7B%0Abackground%2Dcolor%3A%20%23f7f7f7%3B%0A%7D%0Acode%20%7B%0Afont%2Dfamily%3A%20Consolas%2C%20Monaco%2C%20%27Courier%20New%27%2C%20monospace%3B%0Afont%2Dsize%3A%2085%25%3B%0A%7D%0Ap%20%3E%20code%2C%20li%20%3E%20code%20%7B%0Apadding%3A%202px%200px%3B%0A%7D%0Adiv%2Efigure%20%7B%0Atext%2Dalign%3A%20center%3B%0A%7D%0Aimg%20%7B%0Abackground%2Dcolor%3A%20%23FFFFFF%3B%0Apadding%3A%202px%3B%0Aborder%3A%201px%20solid%20%23DDDDDD%3B%0Aborder%2Dradius%3A%203px%3B%0Aborder%3A%201px%20solid%20%23CCCCCC%3B%0Amargin%3A%200%205px%3B%0A%7D%0Ah1%20%7B%0Amargin%2Dtop%3A%200%3B%0Afont%2Dsize%3A%2035px%3B%0Aline%2Dheight%3A%2040px%3B%0A%7D%0Ah2%20%7B%0Aborder%2Dbottom%3A%204px%20solid%20%23f7f7f7%3B%0Apadding%2Dtop%3A%2010px%3B%0Apadding%2Dbottom%3A%202px%3B%0Afont%2Dsize%3A%20145%25%3B%0A%7D%0Ah3%20%7B%0Aborder%2Dbottom%3A%202px%20solid%20%23f7f7f7%3B%0Apadding%2Dtop%3A%2010px%3B%0Afont%2Dsize%3A%20120%25%3B%0A%7D%0Ah4%20%7B%0Aborder%2Dbottom%3A%201px%20solid%20%23f7f7f7%3B%0Amargin%2Dleft%3A%208px%3B%0Afont%2Dsize%3A%20105%25%3B%0A%7D%0Ah5%2C%20h6%20%7B%0Aborder%2Dbottom%3A%201px%20solid%20%23ccc%3B%0Afont%2Dsize%3A%20105%25%3B%0A%7D%0Aa%20%7B%0Acolor%3A%20%230033dd%3B%0Atext%2Ddecoration%3A%20none%3B%0A%7D%0Aa%3Ahover%20%7B%0Acolor%3A%20%236666ff%3B%20%7D%0Aa%3Avisited%20%7B%0Acolor%3A%20%23800080%3B%20%7D%0Aa%3Avisited%3Ahover%20%7B%0Acolor%3A%20%23BB00BB%3B%20%7D%0Aa%5Bhref%5E%3D%22http%3A%22%5D%20%7B%0Atext%2Ddecoration%3A%20underline%3B%20%7D%0Aa%5Bhref%5E%3D%22https%3A%22%5D%20%7B%0Atext%2Ddecoration%3A%20underline%3B%20%7D%0A%0Acode%20%3E%20span%2Ekw%20%7B%20color%3A%20%23555%3B%20font%2Dweight%3A%20bold%3B%20%7D%20%0Acode%20%3E%20span%2Edt%20%7B%20color%3A%20%23902000%3B%20%7D%20%0Acode%20%3E%20span%2Edv%20%7B%20color%3A%20%2340a070%3B%20%7D%20%0Acode%20%3E%20span%2Ebn%20%7B%20color%3A%20%23d14%3B%20%7D%20%0Acode%20%3E%20span%2Efl%20%7B%20color%3A%20%23d14%3B%20%7D%20%0Acode%20%3E%20span%2Ech%20%7B%20color%3A%20%23d14%3B%20%7D%20%0Acode%20%3E%20span%2Est%20%7B%20color%3A%20%23d14%3B%20%7D%20%0Acode%20%3E%20span%2Eco%20%7B%20color%3A%20%23888888%3B%20font%2Dstyle%3A%20italic%3B%20%7D%20%0Acode%20%3E%20span%2Eot%20%7B%20color%3A%20%23007020%3B%20%7D%20%0Acode%20%3E%20span%2Eal%20%7B%20color%3A%20%23ff0000%3B%20font%2Dweight%3A%20bold%3B%20%7D%20%0Acode%20%3E%20span%2Efu%20%7B%20color%3A%20%23900%3B%20font%2Dweight%3A%20bold%3B%20%7D%20%0Acode%20%3E%20span%2Eer%20%7B%20color%3A%20%23a61717%3B%20background%2Dcolor%3A%20%23e3d2d2%3B%20%7D%20%0A" type="text/css" />
+<style type="text/css">body {
+background-color: #fff;
+margin: 1em auto;
+max-width: 700px;
+overflow: visible;
+padding-left: 2em;
+padding-right: 2em;
+font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+font-size: 14px;
+line-height: 1.35;
+}
+#TOC {
+clear: both;
+margin: 0 0 10px 10px;
+padding: 4px;
+width: 400px;
+border: 1px solid #CCCCCC;
+border-radius: 5px;
+background-color: #f6f6f6;
+font-size: 13px;
+line-height: 1.3;
+}
+#TOC .toctitle {
+font-weight: bold;
+font-size: 15px;
+margin-left: 5px;
+}
+#TOC ul {
+padding-left: 40px;
+margin-left: -1.5em;
+margin-top: 5px;
+margin-bottom: 5px;
+}
+#TOC ul ul {
+margin-left: -2em;
+}
+#TOC li {
+line-height: 16px;
+}
+table {
+margin: 1em auto;
+border-width: 1px;
+border-color: #DDDDDD;
+border-style: outset;
+border-collapse: collapse;
+}
+table th {
+border-width: 2px;
+padding: 5px;
+border-style: inset;
+}
+table td {
+border-width: 1px;
+border-style: inset;
+line-height: 18px;
+padding: 5px 5px;
+}
+table, table th, table td {
+border-left-style: none;
+border-right-style: none;
+}
+table thead, table tr.even {
+background-color: #f7f7f7;
+}
+p {
+margin: 0.5em 0;
+}
+blockquote {
+background-color: #f6f6f6;
+padding: 0.25em 0.75em;
+}
+hr {
+border-style: solid;
+border: none;
+border-top: 1px solid #777;
+margin: 28px 0;
+}
+dl {
+margin-left: 0;
+}
+dl dd {
+margin-bottom: 13px;
+margin-left: 13px;
+}
+dl dt {
+font-weight: bold;
+}
+ul {
+margin-top: 0;
+}
+ul li {
+list-style: circle outside;
+}
+ul ul {
+margin-bottom: 0;
+}
+pre, code {
+background-color: #f7f7f7;
+border-radius: 3px;
+color: #333;
+white-space: pre-wrap; 
+}
+pre {
+border-radius: 3px;
+margin: 5px 0px 10px 0px;
+padding: 10px;
+}
+pre:not([class]) {
+background-color: #f7f7f7;
+}
+code {
+font-family: Consolas, Monaco, 'Courier New', monospace;
+font-size: 85%;
+}
+p > code, li > code {
+padding: 2px 0px;
+}
+div.figure {
+text-align: center;
+}
+img {
+background-color: #FFFFFF;
+padding: 2px;
+border: 1px solid #DDDDDD;
+border-radius: 3px;
+border: 1px solid #CCCCCC;
+margin: 0 5px;
+}
+h1 {
+margin-top: 0;
+font-size: 35px;
+line-height: 40px;
+}
+h2 {
+border-bottom: 4px solid #f7f7f7;
+padding-top: 10px;
+padding-bottom: 2px;
+font-size: 145%;
+}
+h3 {
+border-bottom: 2px solid #f7f7f7;
+padding-top: 10px;
+font-size: 120%;
+}
+h4 {
+border-bottom: 1px solid #f7f7f7;
+margin-left: 8px;
+font-size: 105%;
+}
+h5, h6 {
+border-bottom: 1px solid #ccc;
+font-size: 105%;
+}
+a {
+color: #0033dd;
+text-decoration: none;
+}
+a:hover {
+color: #6666ff; }
+a:visited {
+color: #800080; }
+a:visited:hover {
+color: #BB00BB; }
+a[href^="http:"] {
+text-decoration: underline; }
+a[href^="https:"] {
+text-decoration: underline; }
+
+code > span.kw { color: #555; font-weight: bold; } 
+code > span.dt { color: #902000; } 
+code > span.dv { color: #40a070; } 
+code > span.bn { color: #d14; } 
+code > span.fl { color: #d14; } 
+code > span.ch { color: #d14; } 
+code > span.st { color: #d14; } 
+code > span.co { color: #888888; font-style: italic; } 
+code > span.ot { color: #007020; } 
+code > span.al { color: #ff0000; font-weight: bold; } 
+code > span.fu { color: #900; font-weight: bold; } 
+code > span.er { color: #a61717; background-color: #e3d2d2; } 
+</style>
 
 
 
@@ -141,19 +341,28 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
 
 <h1 class="title toc-ignore">Server Log Parsing</h1>
 <h4 class="author">Jim Hester</h4>
-<h4 class="date">2021-11-24</h4>
+<h4 class="date">2022-11-03</h4>
 
 
 
-<p>Parsing server log files is a common task in server administration. <a href="https://link.springer.com/article/10.1007/BF03325089">1</a>,<a href="https://stackoverflow.com/search?q=%22Apache+log%22">2</a> Historically R would not be well suited to this and it would be better performed using a scripting language such as perl. Rex, however, makes this easy to do and allows you to perform both the data cleaning and analysis in R!</p>
+<p>Parsing server log files is a common task in server administration.
+<a href="https://link.springer.com/article/10.1007/BF03325089">1</a>,<a href="https://stackoverflow.com/search?q=%22Apache+log%22">2</a>
+Historically R would not be well suited to this and it would be better
+performed using a scripting language such as perl. Rex, however, makes
+this easy to do and allows you to perform both the data cleaning and
+analysis in R!</p>
 <p>Common server logs consist of space separated fields.</p>
 <blockquote>
-<p>198.214.42.14 - - [21/Jul/1995:14:31:46 -0400] “GET /images/ HTTP/1.0” 200 17688</p>
+<p>198.214.42.14 - - [21/Jul/1995:14:31:46 -0400] “GET /images/
+HTTP/1.0” 200 17688</p>
 </blockquote>
 <blockquote>
-<p>lahal.ksc.nasa.gov - - [24/Jul/1995:12:42:40 -0400] “GET /images/USA-logosmall.gif HTTP/1.0” 200 234</p>
+<p>lahal.ksc.nasa.gov - - [24/Jul/1995:12:42:40 -0400] “GET
+/images/USA-logosmall.gif HTTP/1.0” 200 234</p>
 </blockquote>
-<p>The logs used in this vignette come from two months of all HTTP requests to the NASA Kennedy Space Center WWW server in Florida and are freely available for use. <a href="https://web.archive.org/web/20181003084945/http://ita.ee.lbl.gov/html/contrib/NASA-HTTP.html">3</a></p>
+<p>The logs used in this vignette come from two months of all HTTP
+requests to the NASA Kennedy Space Center WWW server in Florida and are
+freely available for use. <a href="https://web.archive.org/web/20181003084945/http://ita.ee.lbl.gov/html/contrib/NASA-HTTP.html">3</a></p>
 <div class="sourceCode" id="cb1"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a>parsed <span class="ot">&lt;-</span> <span class="fu">scan</span>(<span class="st">&quot;NASA.txt&quot;</span>, <span class="at">what =</span> <span class="st">&quot;character&quot;</span>, <span class="at">sep =</span> <span class="st">&quot;</span><span class="sc">\n</span><span class="st">&quot;</span>) <span class="sc">%&gt;%</span></span>
 <span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>  <span class="fu">re_matches</span>(</span>
 <span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a>    <span class="fu">rex</span>(</span>
@@ -178,7 +387,8 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
 <span id="cb1-22"><a href="#cb1-22" aria-hidden="true" tabindex="-1"></a>  ) <span class="sc">%&gt;%</span></span>
 <span id="cb1-23"><a href="#cb1-23" aria-hidden="true" tabindex="-1"></a>  <span class="fu">mutate</span>(<span class="at">filetype =</span> <span class="fu">tolower</span>(filetype),</span>
 <span id="cb1-24"><a href="#cb1-24" aria-hidden="true" tabindex="-1"></a>         <span class="at">time =</span> <span class="fu">as.POSIXct</span>(time, <span class="at">format=</span><span class="st">&quot;%d/%b/%Y:%H:%M:%S %z&quot;</span>))</span></code></pre></div>
-<p>This gives us a nicely formatted data frame of the time and filetypes of the requests.</p>
+<p>This gives us a nicely formatted data frame of the time and filetypes
+of the requests.</p>
 <table>
 <thead>
 <tr class="header">
@@ -188,51 +398,52 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
 </thead>
 <tbody>
 <tr class="odd">
-<td align="left">1995-07-21 14:31:46</td>
+<td align="left">1995-07-21 18:31:46</td>
 <td align="left"></td>
 </tr>
 <tr class="even">
-<td align="left">1995-07-24 12:42:40</td>
+<td align="left">1995-07-24 16:42:40</td>
 <td align="left">gif</td>
 </tr>
 <tr class="odd">
-<td align="left">1995-07-02 02:30:34</td>
+<td align="left">1995-07-02 06:30:34</td>
 <td align="left">gif</td>
 </tr>
 <tr class="even">
-<td align="left">1995-07-05 13:51:39</td>
+<td align="left">1995-07-05 17:51:39</td>
 <td align="left"></td>
 </tr>
 <tr class="odd">
-<td align="left">1995-07-10 23:11:49</td>
+<td align="left">1995-07-11 03:11:49</td>
 <td align="left">gif</td>
 </tr>
 <tr class="even">
-<td align="left">1995-07-15 11:27:49</td>
+<td align="left">1995-07-15 15:27:49</td>
 <td align="left">mpg</td>
 </tr>
 <tr class="odd">
-<td align="left">1995-07-13 11:02:50</td>
+<td align="left">1995-07-13 15:02:50</td>
 <td align="left">xbm</td>
 </tr>
 <tr class="even">
-<td align="left">1995-07-23 09:11:06</td>
+<td align="left">1995-07-23 13:11:06</td>
 <td align="left"></td>
 </tr>
 <tr class="odd">
-<td align="left">1995-07-14 10:38:04</td>
+<td align="left">1995-07-14 14:38:04</td>
 <td align="left">gif</td>
 </tr>
 <tr class="even">
-<td align="left">1995-07-25 09:33:01</td>
+<td align="left">1995-07-25 13:33:01</td>
 <td align="left">gif</td>
 </tr>
 </tbody>
 </table>
-<p>We can also easily generate a histogram of the filetypes, or a plot of requests over time.</p>
+<p>We can also easily generate a histogram of the filetypes, or a plot
+of requests over time.</p>
 <div class="sourceCode" id="cb2"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="fu">ggplot</span>(<span class="fu">na.omit</span>(parsed)) <span class="sc">+</span> <span class="fu">stat_count</span>(<span class="fu">aes</span>(<span class="at">x=</span>filetype))</span>
 <span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="fu">ggplot</span>(<span class="fu">na.omit</span>(parsed)) <span class="sc">+</span> <span class="fu">geom_histogram</span>(<span class="fu">aes</span>(<span class="at">x=</span>time)) <span class="sc">+</span> <span class="fu">ggtitle</span>(<span class="st">&quot;Requests over time&quot;</span>)</span></code></pre></div>
-<p><img src="data:image/png;base64,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4F533XXmzjvv3G6/NoiACIhAIQKRHkQsZIBJqP/4xz8KRdE+ERABEchJIHIL6PnnnzdbtmzJGuH7hx9+aCZMmGAGDRqU3a4vIiACIhCVQGQBGjx4cM5BaLph1157bdT8FE8EREAEsgQiCxDrAAWn1jMr1j8lI2tVX0RABEQgAoHIAsSEVNYCYlXEd955x+y8887mkEMOMUcddZRhuQEFERABESiWQGQBev311w3dMKZkHHzwwebjjz82PJx43HHHmWnTpjVYrL5YJxRfBESgNglEvgt2zjnnmMMOO8wsXLjQvPbaa2bx4sX2OaC3337b3HLLLbVJT6UWARFIRCCSALEyHWsBccdr1113tRmy2hxdMN6a8eSTTyZyQolFQARqk0AkAXJr2uZaIpMlIv2352sTo0otAiIQh0AkAeJlhDzrc+mll5oXXnjB3g1jPeSZM2eaW2+91fDWVAUREAERKJZAJAHC6B133GEHoAcMGGB22mknuzD98ccfb/r162cuvvjiYvNVfBEQAREwke+C8frll156yb6qed68efau17777muOOeYYYRQBERCBWAQit4C45X7eeeeZpUuX2hbPWWedZYYPH25uuukmjQHFQq9EIiACkQWIBekXLFhgDj/8cEuNRchuvvlmOwbEW1MVREAERKBYApG6YLywbtasWebNN980vXr1snlwZ+y0004zrAvE09GnnHJKsXkrfoUJjBgxIlGOEydOTJReiUUgSCBSC4hnfnibIg8fBgMvLVy+fHlws36LgAiIQCiBSALEa1iPPvpoc9lll9knoZ1VHk5kDIjpGAoiIAIiUCyBSAKE0Xvuuce+C3333Xc3nTt3tu+p7t+/v30+iKehFURABESgWAKRxoAw2rVrVzN37lzDLfhXX33VMAZ00EEHmf3337/YPBVfBERABCyByAJEbESHt2PwpyACIiACSQlE7oIlzUjpRUAERCBIQAIUJKLfIiACFSMgAaoYamUkAiIQJCABChLRbxEQgYoRqJgArVixwjz++ON2Gddg6bizNnv2bDvPzL+PeWc8gc1+BREQgeojUBEBeuSRR8zo0aPN/PnzzdVXX23nkDmUPMh44403mldeecWcffbZhrdvEPjN1AEWwB8zZoxdd9ql0acIiEB1ECjqNnycIvM++fvuu8+KTJ8+fczpp59uhg0bZs4880z7njGe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" /><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASAAAAEgCAYAAAAUg66AAAAEDmlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPpu5syskzoPUpqaSDv41lLRsUtGE2uj+ZbNt3CyTbLRBkMns3Z1pJjPj/KRpKT4UQRDBqOCT4P9bwSchaqvtiy2itFCiBIMo+ND6R6HSFwnruTOzu5O4a73L3PnmnO9+595z7t4LkLgsW5beJQIsGq4t5dPis8fmxMQ6dMF90A190C0rjpUqlSYBG+PCv9rt7yDG3tf2t/f/Z+uuUEcBiN2F2Kw4yiLiZQD+FcWyXYAEQfvICddi+AnEO2ycIOISw7UAVxieD/Cyz5mRMohfRSwoqoz+xNuIB+cj9loEB3Pw2448NaitKSLLRck2q5pOI9O9g/t/tkXda8Tbg0+PszB9FN8DuPaXKnKW4YcQn1Xk3HSIry5ps8UQ/2W5aQnxIwBdu7yFcgrxPsRjVXu8HOh0qao30cArp9SZZxDfg3h1wTzKxu5E/LUxX5wKdX5SnAzmDx4A4OIqLbB69yMesE1pKojLjVdoNsfyiPi45hZmAn3uLWdpOtfQOaVmikEs7ovj8hFWpz7EV6mel0L9Xy23FMYlPYZenAx0yDB1/PX6dledmQjikjkXCxqMJS9WtfFCyH9XtSekEF+2dH+P4tzITduTygGfv58a5VCTH5PtXD7EFZiNyUDBhHnsFTBgE0SQIA9pfFtgo6cKGuhooeilaKH41eDs38Ip+f4At1Rq/sjr6NEwQqb/I/DQqsLvaFUjvAx+eWirddAJZnAj1DFJL0mSg/gcIpPkMBkhoyCSJ8lTZIxk0TpKDjXHliJzZPO50dR5ASNSnzeLvIvod0HG/mdkmOC0z8VKnzcQ2M/Yz2vKldduXjp9bleLu0ZWn7vWc+l0JGcaai10yNrUnXLP/8Jf59ewX+c3Wgz+B34Df+vbVrc16zTMVgp9um9bxEfzPU5kPqUtVWxhs6OiWTVW+gIfywB9uXi7CGcGW/zk98k/kmvJ95IfJn/j3uQ+4c5zn3Kfcd+AyF3gLnJfcl9xH3OfR2rUee80a+6vo7EK5mmXUdyfQlrYLTwoZIU9wsPCZEtP6BWGhAlhL3p2N6sTjRdduwbHsG9kq32sgBepc+xurLPW4T9URpYGJ3ym4+8zA05u44QjST8ZIoVtu3qE7fWmdn5LPdqvgcZz8Ww8BWJ8X3w0PhQ/wnCDGd+LvlHs8dRy6bLLDuKMaZ20tZrqisPJ5ONiCq8yKhYM5cCgKOu66Lsc0aYOtZdo5QCwezI4wm9J/v0X23mlZXOfBjj8Jzv3WrY5D+CsA9D7aMs2gGfjve8ArD6mePZSeCfEYt8CONWDw8FXTxrPqx/r9Vt4biXeANh8vV7/+/16ffMD1N8AuKD/A/8leAvFY9bLAAAAOGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAACoAIABAAAAAEAAAEgoAMABAAAAAEAAAEgAAAAAKtAJY0AACsOSURBVHgB7Z0HmBXVFcfPAi69uwhKESMWVCIIxEpsEVQ0otEoGsWI2LCARooJGCkR0SASEixRVFBEFBQRQQ0idgULoIBKFZHem5TJ/d8vdzLv7Xuz897OzM6897/ftzszd247vztz3m1zboGlnNCRAAmQQBkQKFcGeTJLEiABEtAEqID4IJAACZQZASqgMkPPjEmABKiA+AyQAAmUGQEqoDJDz4xJgASogPgMkAAJlBmBCmWWcykyfuaZZ+T9998vlkKlSpWkXr16cs4550ibNm2K3Y+7x7p16+TAAw+Muxgllt8p51//+lepU6eO3HrrrSXGY4D4ESiI4zqg6667Tp588klp1aqVlCv3/0bcsmXLZO3atVK+fHkZNmxYzjy0e/bskQsuuEBOO+00ueeee+L3lHkscSo5jz32WGnUqJFMnTrVYyoMFicCsWwBGcAzZ86UatWqmUvBmsrZs2fLFVdcIbfffrtcdtllctBBB9n343qyc+dOmTZtmlZAcZXBS7lTyfnyyy/LAQcc4CU6w8SQwP+bDzEsfHKRCwoKpHXr1lr5QBm99dZbCUH27dsnX3/9tbzxxhuydOnShHvOC6PIPv30U9m7d69s3749IfwPP/ygW1rOODhHmps2bUr2lg0bNsiMGTPko48+kh07dhS7D4+tW7fKrFmz5M033xSkb9zPP/8sy5cv15cbN27UeaB8xi1cuFCmTJkin3/+ueAF9upWrVql8/r444+1fM54P/30U0IZnPcgI+RxOjf5DDuUed68efLVV185o9rn6eTED0yVKlXscCtXrhRwgENZ/vOf/8i2bdvs+8gPrJPLaAdQJ27ldYbjeQgE1IMRO/fHP/4Rb6ClXtqUZX/ggQf0/RdeeMG+r1pG1lFHHaX9VRdNHzt06GCpl80OgxOltCw1jmRVqFDBqly5svWLX/zCuvfee3X43bt367CHHnqodckllyTEUy+QDtOnTx/bH369e/e2VDdR/ykFadWoUcNSY1h2GJy8+OKL2h8ymbKdf/751vr16y2lWHS6uGf+lBKz1ItmnX322drPxKlZs6bllDkhk/9dIC74oSwmXvXq1a3HHnvMDn733Xfre0pJ2X44+eCDD3R+Y8aM0f5e5ENYlHvkyJF2+R955JGEdHGRTs5jjjnGQj0Zd/TRR1s333yzde6559rpoa4mT55sjR8/3iosLNT+OP7+97+31A+IiWp5Ka8dmCehEEC3JXbOKKDVq1dbeKHwB2W0YMEC6/HHH7fUr6ZVv359S/1SatnwItetW9dq0aKF9corr+gH8d1337UOOeQQ66yzzrLlX7RokVW7dm3rt7/9rbV582YdTg2C6pcVL1GmCghxEQ9KSY1P6fJ0795d+yF/ONVq0Yru4osv1mEgy+jRo3WY/v376xdoyZIl+rpv376WGqDV8ZA2Xjw1NmLt2rXLQtlPPfVUq2rVqmkVMyKqrqmlujTWqFGjNLc1a9ZYXbp00emDDdw333yjr9U4mr42/2666SYLSg5lhPMin1FAavDc+uc//2kNHz7cUi08k6R9hKJIJWcqBQTFeemll1rffvutpSYjrMMOO8yCEsUPw9ixYy08F3fddZeWAcrdOC/lNWF5DIdArBWQaREkH9UMmKWa+jbBP//5z/phVOMoth9OHn74Ye2vxpK0PxSFmkmz8FI63YknnqjDZaKAoMDQgjrppJOcSVlqoNXCy3jGGWdof9WN0GmjleV0+DX/5JNPtBfSgowDBw60g0BpIB016G77qe6YbgWobqDt5zz58ccftTK95ZZbnN5ayR155JGWGvC1/SHzCSecYF9DdjUbZXXr1k37eZXPKCBn2e1Ek05SyZlKAaEVaZQgkujRo4fmA4VtHFpvYHbfffdpL6/lNfF5DIdArAehlQIRTL1j7OPVV1+Vd955RwYPHiyq26Oevf+7OXPm6HDz58/XY0DmDsY64DAu0a5dOz2OorppUlRUZILo43nnnafHbxI8S7jA2AzKhWUBKKfTqZaXPRbSpEkTOeWUU0QpIC2D6loI/lQXL2GGzxkf56p7Ic8++6wcfvjhoroo+g/lVC2D5KD2NeRXj5UgnNOpFoW0b99eVDdJVDdFVPdFVCtTlLIR1aoUMME4E8ZOrr32Wh3Vq3wmn5YtW5rTUh9Vt1iUcrfTAQO4jh072n6mDs24WKbltRPiSaAEYq2AMB1vZsFuu+02Ua0CUa0YUd0EUd0FGxwGdTFA/cQTT9h+5qR58+aift31JabxGzRoYG7ZR9Wds8/TneDFdjozkPzFF1+I6io4b+lzpKm6TloxTp8+XQYNGiSq1aOPOIdieu655+Tkk08uFhceUDoYZH/ooYe04lJjP3r5wfXXXy+qm6OVSHJEUyYoxWSHFxaD9Fu2bNFrjaDg7rjjDlFdGhkwYIBWdlBEqmWko5q0SpLP5JOKq7mX6TFdfahutp0U6tvpvJYXP2h04RGItQJyYsJ6IDWuIZjVgTLC+hGsm4Fr2LChqPEFwayWc0bFGR/nagxBz6wk+6suWYIX8oLycDrVvXFe6jzhASX5l7/8JeFe8gXKBKWDv8WLF8trr70m/fr1062cFStWJAe3r08//XTBH8qixpRkxIgRmoHqOknXrl3tcOYE62ngkssKP8wuYcmCWeioujm6Ffb8889Lz549dQsIisg4MIXzIh/CJSsE+GXrnGu/vKaRaXm9pstwpSOQU9PweJGxSnr//v36xTBKAquiMc09ceLEBFpPPfWUoDmvxlq0P1ob6HLMnTs3IRwUgtPh5TS/qMYfU+xOh9YCWmcoj9OhS4DyXHPNNdr7s88+k6ZNm+pWDDzUgKpWoGiBYKocU8zmhcOSAOPQFUK3ES0v/Gpj9fejjz6qb3/33XcmWMLxuOOOk4oVK+qWlvMGOKELm9xNQh7ff/+9qHEU3Tr6wx/+YEfzKp8dwcNJKjk9RPMUJIjyesqYgdwJhDPU5G8uZhYs3TQ8ZnqU1HoKHDljABKzYuoX3lK/4nqWBzNNGMzEdLdx6mXXM2MYkFVrSfQsi5m1QnpmEFp1Tez0Mb2PmTcMCGPQ2TkNP2TIEB1OjU1YGAD/8MMP9eyNetEspbB0tkpZWhg0P+KIIyzV2rCU8rAwcIsBX0yzw6mukZ5ebtu2rZ7lQTmUUtRpYwAWZUDaV155pR5kVuuJdLxU/9RKah0G5cQsklKAlhr/0bNnyfFQNqUc9RICNW5ULDkv8plBaEyzl+RSyZlqENpZZ0jTTPGr1qOdBdJCnWVaH3YCPAmFQKxnwdIpIPg3btxYT1OrMQoNEi82Zp6w/gUPJhSS6j4UmxLGQ4yZK4TBH2aDrr76an1uFBCm9aFUnGlBwajB0IQHHi8wpp1r1aql42P6WHULLdXySqhcKAE1FmXniTUsnTp1spcRIDAUh1nj8uWXX+r4UITGD2U9+OCDrZdeeikh7eQLTHergXq9VAFxUCYoQCjcVM5MXTuns004L/JlooCQbrKcfiogL+U1svEYDoFYfgumXpysnZq+1eMdmDlxG5fAB5GYEVIvtf7+CrNrGKzGDJFxqmWlZ4bQhSrJYYBbrVXRH1amC4tZOcw0oWzOfEx4lAddMnycaRy6dFgpjW5hJgO96mXU42IYfEbc0jov8nnNI5WcXuN6Dedneb3myXDFCeSdAiqOoGQffACaSgGVHJMhSIAE3Ajk1CC0m6C8RwIkED0COTMNHyRa9bmG7hJhwR4dCZCAfwTYBfOPJVMiARLIkAC7YBkCY3ASIAH/CFAB+ceSKZEACWRIgAooQ2AMTgIk4B8BKiD/WDIlEiCBDAlQAWUIjMFJgAT8I0AF5B9LpkQCJJAhgditA8K2O/gqXJlOtY2TZyhzRsFhYwZ2clIZm88oIQ+Bw5IJ9oDwSYrTmLuH4mUcBOumlIlYbWMo48gZRMAnNbARhDoyBsgyiJ5RUHwig106YPw+SKfM7WrDePgkCNsVBelgRQLPOD418tvB+oLz06Hk9NkCSibCaxIggdAIUAGFhpoZkQAJJBOgAkomwmsSIIHQCFABhYaaGZEACSQToAJKJsJrEiCB0AhQAYWGmhmRAAkkE6ACSibCaxIggdAIUAGFhpoZkQAJJBOgAkomwmsSIIHQCMRuJXRoZJhRVgTM1s2pImMfNjoScBJgC8hJg+ckQAKhEghNAa1evVrU3lkp90lfuHChYH90fPdCRwIkkD8EQlFAaldMufXWW/X+VcOGDZO///3vNmFcDx06VBAG+4xjjys6EiCB/CAQyhjQqFGjpGfPnqJ2GdVf3A4aNEhv+vfjjz+K2g5YJkyYoPc/HzdunIwdO1bUdrr5QZ9SkkCeEwhcAcFsgdoWWdR+67qb1axZM7nvvvs0drUNsrRo0UIrH3i0atVKpkyZklAluJ40aZLt16tXL2nYsKE2iQDzFUE7mEWAWYkw8oKZhzDyUXvTi9rHXjMMmp8z/aBlg1mJSpUqObP0/RzsYP4j1c61fmZmdu3Fbrpqk2Q/ky6WFp5v5AF+fjuYznFzgXfB1qxZox92KI758+dLv379BN0uuFWrVknNmjXt8mGLYLXvun3NExIggdwmEHgLCHuQYw/1AQMGSMuWLbUhrEsuuUS6du2qWxYwhGQctCV+mZ3u/PPPF/wZB4NkGzdupEEyAySLIwySwXBX0AbJkouGegvCGYNkMLKWawbJtm7dGnuDZG51HngLCA87XPPmzfURzbyioiL5/vvv9XHDhg3aH/9w3qBBA/uaJyRAArlNIHAFhD7s8ccfL2+++aYmuWTJEsHg8xFHHCFt2rSRefPmyYoVK7SZ1cmTJ0vbtm1zmzilIwESsAkE3gVDTn/605/02A8Gk7HWp3///vaAV7du3XR3DHZjmzRpIp07d7YLxxMSIIHcJhCKAmrcuLGMHj1aj93UqlVLzyIYrB07dpT27dvr6flq1aoZbx5JgATygEAoCshwTDcNi+ln/NGRAAnkF4HAx4DyCyelJQESyIQAFVAmtBiWBEjAVwKhdsF8LXkeJUYTF3lU2XkmKltAeVbhFJcEokSACihKtcGykECeEaACyrMKp7gkECUCVEBRqg2WhQTyjAAVUJ5VOMUlgSgRoAKKUm2wLCSQZwSogPKswikuCUSJABVQlGqDZSGBPCNABZRnFU5xSSBKBKiAolQbLAsJ5BkBKqA8q3CKSwJRIkAFFKXaYFlIIM8IUAHlWYVTXBKIEgEqoCjVBstCAnlGgAoozyqc4pJAlAhQAUWpNlgWEsgzAlRAeVbhFJcEokSACihKtcGykECeEaBJ1ohUuJvZ1YgUkcUgAd8JsAXkO1ImSAIk4JUAFZBXUgxHAiTgO4HYdcGqVKki5cuX1xsZptvo0E9KFSpU0PmFkVc25c6mXOXKlZPKlSuHvhlkNmXNhAmejUqVKmUSJeOwYFdQUCCFhYUZx80kAvKAq169uliWlUnUjMPifUIe4Oe327t3r2uSsVNAO3bsEAiFh3njxo2uwvlxs27durJv3z7ZtGmTH8n5nkY2DOrVqyc7d+6Ubdu2+V4etwSzKatbeuYeXtb69esLng3IFaSD4sEuvtu3bw8yG8EPX1FRkWzdulX27NkTaF5QPHjGd+/e7Xs+FStWdE2TXTBXPLxJAiQQJAEqoCDpMm0SIAFXAlRArnh4kwRIIEgCVEBB0mXaJEACrgSogFzx8CYJkECQBKiAgqTLtEmABFwJUAG54uFNEiCBIAlQAQVJl2mTAAm4EqACcsXDmyRAAkESoAIKki7TJgEScCVABeSKhzdJgASCJEAFFCRdpk0CJOBKgArIFQ9vkgAJBEmACihIukybBEjAlUDszHG4ShPxm7lidjVX5Ij445IXxWMLKC+qmUKSQDQJUAFFs15YKhLICwLsguVFNWcuZBDdLLc0n3rqqcwLyRixJ8AWUOyrkAKQQHwJUAHFt+5YchKIPQEqoNhXIQUggfgS4BhQfOuu1CV3G5MpdeJMgAQ8EGALyAMkBiEBEgiGABVQMFyZKgmQgAcCVEAeIDEICZBAMASogILhylRJgAQ8EAhdAc2YMUNvN+ss28KFC2X69Omybt06pzfPSYAEcpxAqLNg7777rvTr10/GjBkj1atX12iHDRsm8+fPl2bNmsnIkSNlxIgR0rhx4xzHTvH8JNClS5e0yeXDCmu32cyoyx+aAkLr5sknn5RatWrZD8vSpUtl1qxZMmHCBClXrpyMGzdOxo4dK3369LHD8IQESCB3CYSigCzLkvvvv1+6d+8uQ4YMsWkuXrxYWrRooZUPPFu1aiVTpkyx7+Pk7bfflmnTptl+N954o9SvX18OOOAAqVmzpu0f1En58uV1+cLIKxsZsikXlH2lSpWyyS6wONnI4aUwfqeL56GgoEAqVAj21UEecNWqVZP9+/d7ETVlGC/yQxa8o0E8E/v27UtZLuMZLMX/5YIWTqNGjaR169YmX31ctWpVghKpUaOGrF+/PiHM5s2bBYrKOAgEYGE8BMjTPAhBP3BGvkyP2ZYLSihKLls5SpLB73TxPITBzjx35gewJDnT3fciv5HH5JkurWz8S1KegSugJUuWyNSpU+Vf//pXsfIDrlND7t27VypXrpwQ7uKLLxb8Gbd27VqtpGrXri0bN2403oEd69atq8u4adOmwPIoTcLJCttLWvXq1ZMdO3Z4CRpamGzk8FI4v9MtLCzUre/t27d7yT7rMFAcRUVFgh/gPXv2ZJ2OF/mrVKmin/Hdu3dnnU+6iBUrVkx3S/sH/jOILtSyZcvkggsukHPOOUd++ukn6dq1q3zyySca8IYNG+wC4rxBgwb2NU9IgARym0DgLSAoG/wZd+mll8qDDz4oTZo0kS1btsjw4cNlxYoVWvFMnjxZ2rZta4IGeozzzEGgYJi4JuD2fIwfP56UfCIQuAJyKyfGfLp166YVVJ06dbRS6ty5s1sU3iMBEsghAqEroBdffDEBX8eOHaV9+/aC/idG/OlIgATyh0DoCigVWkyp4y8qzq35XVIZo77wq6Ty8z4JhEkg8EHoMIVhXiRAAvEiQAUUr/piaUkgpwhQAeVUdVIYEogXASqgeNUXS0sCOUXAswL6zW9+I9u2bSsm/OjRo4VT58Ww0IMESMADAddZsI8//ljefPNNncx7772nPyh1frCGzygmTZqkTWl4yItBSIAESCCBgKsCOvzww6Vnz556jQ6+R8GX6vh+yzhMnR966KHSt29f48UjCZBAhAiUtKSkrJeNuCogfIj5/vvva5wXXnihPPfcc1wsGKGHi0UhgbgTcFVATuFeffVV3RJavny5PjrvYQUzPyJ1EuE5CZCAFwKeFdBLL72kv9lKZZYCH5jyAz0vuBmGBEjAScCzArr55pvloosukptuuknw4ajT8RsuJw2ekwAJeCXgSQHBbMaaNWu0OVUYs6IjARIgAT8IeFoHBLMZTZs2lc8++8yPPJkGCZAACWgCnlpACDlw4EDp0aOH/PDDD1oZOW3NolV0zDHHECkJkAAJZETAswLCGBDs095www3FMuAgdDEk9CABEvBAwLMCWr16td66I1WazsWJqe7TjwRIgARSEfCsgGAwHnsHpXLYyQK7VNCRAAmQQCYEPCugo48+WnfBUiXOLlgqKvQjARIoiYBnBYSPUZ17eG3dulXmzJmj93N37nZaUoa8TwIkQAKGgGcFdOyxx5o49vHUU0/VG9wNHjxYHn/8cdufJyRAAiTghYCndUBuCeEbsLlz57oF4T0SIAESSEnAcwsIO5li62TjcI5dTgcNGiSnn3668eaRBCJFwM0cRVmboogUqDIqjGcFhG2VsQ4o2aEbNmDAgGRvXpMACZBAiQQ8KyCY4Uiehq9atao4V0SXmBsDkAAJkICDgGcFhO/BouCqVKmirTLCGmMU1x6FXaZs8itXrpxg7VaUXDZylLb82eYJdoWFhaXN3jV+QUGBvl+9evViP/yuETO8CQZYSIzGBd4tv51z2CZV2p4VECLDFhCsIi5atEjq168vLVu2lDPOOCPwynAWfMeOHXosCuA2btzovBWJ87DLlE1++HZv586dkeBlCgFTL24uiPGabNihjGC3fft2t+KW+h56FkVFRYLlLjCHHJQDAygeLLHB9uh+u4oVK7om6VkBffXVV4JxIHyS0aJFC1m7dq2sWrVKOnToIBMnThSnsXrXHHmTBEiABP5HwPM0fLdu3eSkk06SFStWyJdffikrV67UCxEXLFggw4cPJ1ASIAESyJiApxYQuj2wBYRWUMOGDXUm6KOiC4ZdM1577TXp1atXxpnnYgS3ad9clDcfZbrssstcxQ6iu+iaYYxvemoBYdASg1RQRMkOfeGSBpqS4/CaBEiABEDAkwLC+A4WG6KV8+mnn2pltGvXLpk6dao88sgjgl1T6UiABEggUwKeFBASHTVqlB6Abtu2rRx00EHaMP15550nrVu3ljvvvDPTfBmeBEiABMTTGBA4NWvWTGbPnq23al64cKGe9TrqqKPkrLPOIkYSIAESyIqA5xYQptxvvPFGWbdunW7xdOnSRTp37izDhg3jGFBW6BmJBEjAswKCQfqlS5fKySefrKlhNejDDz+sx4CwayodCZAACWRKwFMX7Oeff5Zp06bJ/Pnz5eCDD9Z5YGbsiiuu0Cs1sTr64osvzjRvhicBEshzAp5aQFjzg+XgWHyY7LBpIexF05EACZBApgQ8tYDw4eeZZ54pvXv3ltGjR0ujRo10PliciDGg22+/PdN8GZ4ESCCJgNsi1lxd3OipBQROUDxY+9O4cWOpWbOm/pq6TZs2en0QVkPTkQAJkECmBDy1gJBonTp1ZNasWYIp+C+++EIwBnTcccdJ8+bNM82T4UmABEhAE/CsgBAaSgfb8+CPjgRIIDwCbt2z8Erhf06eu2D+Z80USYAE8p0AFVC+PwGUnwTKkAAVUBnCZ9YkkO8EqIDy/Qmg/CRQhgSogMoQPrMmgXwnQAWU708A5SeBMiSQ0TR8GZaTWZNAbAi4TZnn6ormbCuHLaBsyTEeCZBAqQlQAZUaIRMgARLIlgC7YNmSY7zYE3DrKsVeuJgIwBZQTCqKxSSBXCQQmgLCFrBvvfWW3k01GSQ+cJ0+fbo295p8j9ckQAK5SyCULtgrr7wiEyZMkHbt2ukjjNnfcccdmirsCcHSIozejxw5UkaMGKFNfuQucn8lc+tGcMbFX9ZMzX8CgSsgbHr/7LPPytChQ6Vp06Zy5ZVXCnaWvOaaa2Tz5s3axAeUE760HzdunIwdO1b69Onjv6RMkQRIIHIEAldA5cuXl6efflqqVq2qhYdRs23btgkU0+LFi6VFixZa+eBmq1atZMqUKQmQPvjgA5k5c6btd/nll0tRUZFUqFBBqlevbvvzpDiBdHxgYrdixYrFI0TYJ50sES5yyqJFTQ6UBxZPsfNxYWFhyjKXxnP//v2u0QNXQMjdKB8UZvjw4dKhQwc58MAD9XgQrCsaV6NGDVm/fr251EcoKYwdGdepUye9JxlaTNixlS49gXR8oICgwOPk0skSJxlQ1qjJgfLgXYICCuKZ2L17t2sVhfYUoiD33XefFvSee+7RhULrCC0h47DHPLb7cbqrrrpK8Gfc2rVrBX+1a9cWDGzTpScATqlcvXr1ZMeOHaluRdYvnSyRLXCagkVNDpSnSpUq+j0sSVmkEcnVGy1t0wBJFTCUWTA87HfddZfuMg0YMMBu6qEr5dxRA+cNGjRIVU76kQAJ5CCBUFpA/fv3lyOPPFK6d++egBBG7dElW7FihVY8kydPFuw9T+cPAbcZMn9yCC+VXJIlPGrRzylwBfTNN9/IRx99pP/Gjx9vE/nHP/6hB6C7desmXbt21UbvmzRpord7tgPxhARIIKcJBK6AYMAeu2mkcx07dpT27dsL+p/VqlVLF4z+JEACOUggcAXkhRmmAfFHRwIkkF8EQhmEzi+klJYESMArASogr6QYjgRIwHcCVEC+I2WCJEACXgkUqBWQltfAUQiHhVNYsFjahYic1o1CbbIMUSbgx8fMWIiIbd3TObaA0pGhPwmQQOAEqIACR8wMSIAE0hGgAkpHhv4kQAKBE6ACChwxMyABEkhHgAooHRn6kwAJBE4gEiuhg5KSM11BkWW6JOAPAbaA/OHIVEiABLIgQAWUBTRGIQES8IcAFZA/HJkKCZBAFgSogLKAxigkQAL+EKAC8ocjUyEBEsiCABVQFtAYhQRIwB8CVED+cGQqJEACWRCgAsoCGqOQAAn4Q4AKyB+OTIUESCALAlRAWUBjFBIgAX8IUAH5w5GpkAAJZEGACigLaIxCAiTgD4Gc/hjVH0RMhQTyk4Dbx9x+mGsFVbaA8vPZotQkEAkCsWsBVa5cWcqXL683MqxVq1YkILIQJJBvBLy+e9hAws3FTgHt3LlT9u3bp3fF2Lx5s5tsvEcCJBAQAa/vXmFhoWsJYqeAIA12EjJ/rtLxJgmQQCAE/NrNi2NAgVQPEyUBEvBCgArICyWGIQESCIQAFVAgWJkoCZCAFwJUQF4oMQwJkEAgBKiAAsHKREmABLwQoALyQolhSIAEAiFABRQIViZKAiTghQAVkBdKDEMCJBAIASqgQLAyURIgAS8EqIC8UGIYEiCBQAhQAQWClYmSAAl4IUAF5IUSw5AACQRCgAooEKxMlARIwAsBKiAvlBiGBEggEAJUQIFgZaIkQAJeCFABeaHEMCRAAoEQoAIKBCsTJQES8EKACsgLJYYhARIIhAAVUCBYmSgJkIAXAlRAXigxDAmQQCAEqIACwcpESYAEvBCgAvJCiWFIgAQCIUAFFAhWJkoCJOCFABWQF0oMQwIkEAgBKqBAsDJREiABLwQioYAWLlwo06dPl3Xr1nkpM8OQAAnkCIEyV0DDhg2ToUOHyueffy7XXXedLF++PEfQUgwSIIGSCJTp3vBLly6VWbNmyYQJE6RcuXIybtw4GTt2rPTp06ekcvM+CZBADhAoUwW0ePFiadGihVY+YNmqVSuZMmVKAtY5c+bIp59+avt16NBBateuLeXLl5eqVava/jwhARIIj4Bf716ZKqBVq1ZJzZo1bWo1atSQ9evX29c4Qdfs0Ucftf3atWsnjRo1koKCAqlWrZrtn+rk9ddfT+WdkR/ygbMsK6N42QRGXmHlk2syoQW9f//+bLBnFCfM5yEXZNq1a5cr3zJVQGjF7Nu3zy7g3r17pXLlyvY1TjAuhD/j1q5dK6tXr9atoI0bNxrvwI5169bVZdy0aVNgeZiE0bILQ6Z69erJjh07ZNu2bSbrQI6mlbply5ZA0jeJQinUr19fkM/OnTuNdyDHwsJCOeCAA2T79u2BpG8SrVChghQVFcmGDRtkz549xjuQY5UqVfQzvnv3bt/Tr1ixoiD9dK5MB6ENYFM4wG7QoIG55JEESCDHCZSpAmrTpo3MmzdPVqxYIWj9TJ48Wdq2bZvjyCkeCZCAIVCmXTCM+XTr1k26du0qderUkSZNmkjnzp1N2XgkARLIcQJlqoDAtmPHjtK+fXtB/7OkQeUcrwuKRwJ5R6DMFRCIY1APf3QkQAL5RaBMx4DyCzWlJQESSCZABZRMhNckQAKhEaACCg01MyIBEkgmUKBW3ga/xDc51xhdX3nllXqR20MPPRSjUrsX9bTTTpNLL71UbrvtNveAMbmLRZUnnHCC/O1vf5OLLrooJqV2L+aCBQukU6dO+ttIfKKUq44toBJqFsv7w1jiX0IxfL2N1ee5JBN+QyFPLv2W5qJMqR5iKqBUVOhHAiQQCoFITMOHImmWmZx44olSq1atLGNHM9qZZ54pzZo1i2bhsigVvpuClYRDDjkki9jRjFK9enUtE74PzGXHMaBcrl3KRgIRJ8AuWMQriMUjgVwmkHcKCCYoko2epargr776Sr7//vtUt7Tt6mnTpglsWSe7+fPny9tvvy1hmO8weXuV6Y033nA1V4F03n//fZOsPuITGfh98MEHgZuFcGbsl0yYTYLlTePw8fOHH36Y8Pftt9+a24EeFy1apO1buWUCu+iwEprOfffddzJjxoy09Yh7W7duTRc9cv55p4Bg8uPhhx8usSLeeuutBEuMJgIMpF177bWCh+nuu++WiRMnmlty1113yfPPPy9ff/213HDDDfLDDz/Y94I88SrTyJEjtc2cVGWB4ah7771XXnnlFfs2bOt06dJFP/BjxozR8oY10+SHTEuWLJE777xTvvnmG1ummTNnyqRJk+y/AQMGyGuvvWbfD/IESnzq1KmuWcAyBFincj179tTG+fDDh3r55JNPEoK9++670q9fP21DKOFGhC/yehAaJkDwkmHAD+7nn3/Wv/Ju5iahvAYOHCi//OUv5bLLLtNf8p9//vmycuVKHffBBx/UaWFtCpQYHpQwXTYywTRu3759tXVKp4XKF154QX71q1/JHXfcoUWAUv34448FA/NhOrCEcTMYt4KDMTB8OwjjYOkcFOlTTz2VYHETYW+55RY7ClqreGGdBu/smwGfpJMpXbZoucEY37PPPquDHHnkkdqGujFfg5bTk08+GbsJk7xrATkreO7cubrVYvzw6zho0CBzWeyIlxutGtixhjvooIO0tTcon6ZNm8rw4cO1P7pfX375pTYvoj1C/JepTCgaXoZ77rlHrrjiioSSornvXASHc7TuwnajRo1KaGmijlBXbg6WNf/973/r2T5jRtUZHl3LwYMHS69evQRmYcJ2mcrUvHlzeeyxx+xibt68WYy5U7RK77//funevbtUqlTJDhOHk7xWQJlW0Jo1a7QhfOcDjRYDugvGYX+zSy65RJuMPeWUU4x3pI/HHnusHHfcccXK+NNPPyW8nKlsdheLFBGPc845R2BOFy5VtxGtU9SdaUFEpNhpiwH70MZcMZ5DtISuvvpqHR67ysBOeuvWrdPGj+oNKqAMaibZhjWiolXk/NXBgw/Ljngg0FWLs0uWF7KalyDOcqHsr776qv7UIW5yYFwLLR2MQ6IrjGuMK914441xE0WXNy8U0OzZswWzIXAw8G3GEnDtNIpfkkFz/KJi/MFpvButn4MPPlgbyjezYjDCje94PvvsM2QRiPNLJrfCHXjggQmtOyOrW5zS3AtDJpQPm1+i23z66aeXprie4qJ1YrpKUODZPnvIDIPpPXr00ONYMOQHhxnXZcuWyQUXXCD48UOrFRZGkweodeAI/ssLBYSHDbNT+F4IlYjWCRya4KgwjIHAffTRR/qY7h9W3GJQFr+ecJh1wEpV/CGN3r172w8bpkMPP/zwdEmV2t8vmdwKgo9W8euKFwiDnJjFadmypVuUUt1zkwm/9HDYtgkzkKVx+DE66qijQjGChyUMmPZHNxD5Op+9TGQCf8y69u/fX37961/b4kPZQAmh648/7A7yxBNPxKZrmRezYHiRoBDwK4HxGzPQfNhhh+lBVtihxkzY8ccfX2xfMrum/3dy880329Pv6JdjFgUOg9AY+4GNa3RdcA2FFJTzU6Z0ZTz77LP1GiAMTkPWyy+/XMuVLnxp/dPJdO655+pf/quuukp3ATFmVRqHdUGo+zAcZkpHjBihtx+HzfPzzjtPZ5upTOPHj9dry26//Xa72LCjjiUFcXZ59SkGFmjB7rRzEBmVB3+MbaCF49VhpivVN2JoZaHF4LYXktc8vITzU6Z0+WXDJ11aXvzTyYQ90+L6bRRkMss9nAziLJNTjmzP80oBZQuJ8UiABIIhkBdjQMGgY6okQAKlJUAFVFqCjE8CJJA1ASqgrNExIgmQQGkJUAGVliDjkwAJZE2ACihrdIzoRmDLli327XHjxoX2xbmdKU9iQYAKKBbVFK9Cvv7669qcqCk11rDAj44Ekgl4X/iSHJPXJJCGAExH4JMV415++WVzyiMJJBBgCygBBy9KSwBmMl566SVttuT6668XLLSDITRjZAufu2D/LnyeAFtJv/vd7/THu/hOCv5YrY492JwWBlCmZ555RttfuvDCC2XYsGH6I+DSlpXxy54AFVDZ10FOlaBevXrSsGFDvRIcpi5gNAzfKL333ntaTpg/hYLBJyv49AWGxfAJC3a1+OKLL6R9+/byyCOPyJAhQ2wu+PwAlg2xk8fJJ58sDzzwgFZcdgCexJeA+kiOjgR8JaCUh6WMttlpqlaLpawp6mvVksFOvJb68l1fKyuUlvoMxjrppJPs8EoBWepjUX2tLAxY6js067nnnrPvKyWm03jnnXdsP57EkwDHgOL72xHbkuObO5i0hUMLCF+IowVkXFFRkaxatUpfwqSJerW0fW5YmTQO3/ThnvPLcHOPx/gQoAKKT13lTElhBgUWA4zDx8FOs6jOj4Xx0S8UFuzoOP1vvfVWOeaYY0wSPMaUABVQTCsuysV2KorSlhM2lWBEDoPTGP+BgxG5p59+Wo444ojSJs/4ZUyAg9BlXAG5mD3s1KALBcNhmN0qjTvjjDMEO0DA7hJ2sYCpk3vvvbfMjMmXRhbGLU6ACqg4E/qUkkC7du10FwuKo7RmaTFGhC12YHEShvNhJhYWAGGUHed08SZAe0Dxrr9Ilz6d0bZsC42taNCiMrtdZJsO40WHABVQdOqCJSGBvCPALljeVTkFJoHoEKACik5dsCQkkHcEqIDyrsopMAlEhwAVUHTqgiUhgbwjQAWUd1VOgUkgOgSogKJTFywJCeQdASqgvKtyCkwC0SFABRSdumBJSCDvCPwXNwZvAz3PDY0AAAAASUVORK5CYII=" /></p>
+<p><img src="data:image/png;base64,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" /><img src="data:image/png;base64,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" /></p>
 
 
 
diff --git a/inst/doc/url_parsing.html b/inst/doc/url_parsing.html
index f6396c9..35ee380 100644
--- a/inst/doc/url_parsing.html
+++ b/inst/doc/url_parsing.html
@@ -12,11 +12,23 @@
 
 <meta name="author" content="Jim Hester" />
 
-<meta name="date" content="2021-11-24" />
+<meta name="date" content="2022-11-03" />
 
 <title>URL Validation</title>
 
-<script src="data:application/javascript;base64,Ly8gUGFuZG9jIDIuOSBhZGRzIGF0dHJpYnV0ZXMgb24gYm90aCBoZWFkZXIgYW5kIGRpdi4gV2UgcmVtb3ZlIHRoZSBmb3JtZXIgKHRvCi8vIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgYmVoYXZpb3Igb2YgUGFuZG9jIDwgMi44KS4KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKGUpIHsKICB2YXIgaHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJkaXYuc2VjdGlvbltjbGFzcyo9J2xldmVsJ10gPiA6Zmlyc3QtY2hpbGQiKTsKICB2YXIgaSwgaCwgYTsKICBmb3IgKGkgPSAwOyBpIDwgaHMubGVuZ3RoOyBpKyspIHsKICAgIGggPSBoc1tpXTsKICAgIGlmICghL15oWzEtNl0kL2kudGVzdChoLnRhZ05hbWUpKSBjb250aW51ZTsgIC8vIGl0IHNob3VsZCBiZSBhIGhlYWRlciBoMS1oNgogICAgYSA9IGguYXR0cmlidXRlczsKICAgIHdoaWxlIChhLmxlbmd0aCA+IDApIGgucmVtb3ZlQXR0cmlidXRlKGFbMF0ubmFtZSk7CiAgfQp9KTsK"></script>
+<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to
+// be compatible with the behavior of Pandoc < 2.8).
+document.addEventListener('DOMContentLoaded', function(e) {
+  var hs = document.querySelectorAll("div.section[class*='level'] > :first-child");
+  var i, h, a;
+  for (i = 0; i < hs.length; i++) {
+    h = hs[i];
+    if (!/^h[1-6]$/i.test(h.tagName)) continue;  // it should be a header h1-h6
+    a = h.attributes;
+    while (a.length > 0) h.removeAttribute(a[0].name);
+  }
+});
+</script>
 
 <style type="text/css">
   code{white-space: pre-wrap;}
@@ -28,6 +40,7 @@
     </style>
 
 
+
 <style type="text/css">
   code {
     white-space: pre;
@@ -75,7 +88,7 @@ code span.al { color: #ff0000; font-weight: bold; } /* Alert */
 code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
 code span.at { color: #7d9029; } /* Attribute */
 code span.bn { color: #40a070; } /* BaseN */
-code span.bu { } /* BuiltIn */
+code span.bu { color: #008000; } /* BuiltIn */
 code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
 code span.ch { color: #4070a0; } /* Char */
 code span.cn { color: #880000; } /* Constant */
@@ -88,7 +101,7 @@ code span.er { color: #ff0000; font-weight: bold; } /* Error */
 code span.ex { } /* Extension */
 code span.fl { color: #40a070; } /* Float */
 code span.fu { color: #06287e; } /* Function */
-code span.im { } /* Import */
+code span.im { color: #008000; font-weight: bold; } /* Import */
 code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
 code span.kw { color: #007020; font-weight: bold; } /* Keyword */
 code span.op { color: #666666; } /* Operator */
@@ -109,13 +122,20 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
   for (var i = 0; i < sheets.length; i++) {
     if (sheets[i].ownerNode.dataset["origin"] !== "pandoc") continue;
     try { var rules = sheets[i].cssRules; } catch (e) { continue; }
-    for (var j = 0; j < rules.length; j++) {
+    var j = 0;
+    while (j < rules.length) {
       var rule = rules[j];
       // check if there is a div.sourceCode rule
-      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== "div.sourceCode") continue;
+      if (rule.type !== rule.STYLE_RULE || rule.selectorText !== "div.sourceCode") {
+        j++;
+        continue;
+      }
       var style = rule.style.cssText;
       // check if color or background-color is set
-      if (rule.style.color === '' && rule.style.backgroundColor === '') continue;
+      if (rule.style.color === '' && rule.style.backgroundColor === '') {
+        j++;
+        continue;
+      }
       // replace div.sourceCode by a pre.sourceCode rule
       sheets[i].deleteRule(j);
       sheets[i].insertRule('pre.sourceCode{' + style + '}', j);
@@ -127,7 +147,187 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
 
 
 
-<link rel="stylesheet" href="data:text/css,body%20%7B%0Abackground%2Dcolor%3A%20%23fff%3B%0Amargin%3A%201em%20auto%3B%0Amax%2Dwidth%3A%20700px%3B%0Aoverflow%3A%20visible%3B%0Apadding%2Dleft%3A%202em%3B%0Apadding%2Dright%3A%202em%3B%0Afont%2Dfamily%3A%20%22Open%20Sans%22%2C%20%22Helvetica%20Neue%22%2C%20Helvetica%2C%20Arial%2C%20sans%2Dserif%3B%0Afont%2Dsize%3A%2014px%3B%0Aline%2Dheight%3A%201%2E35%3B%0A%7D%0A%23TOC%20%7B%0Aclear%3A%20both%3B%0Amargin%3A%200%200%2010px%2010px%3B%0Apadding%3A%204px%3B%0Awidth%3A%20400px%3B%0Aborder%3A%201px%20solid%20%23CCCCCC%3B%0Aborder%2Dradius%3A%205px%3B%0Abackground%2Dcolor%3A%20%23f6f6f6%3B%0Afont%2Dsize%3A%2013px%3B%0Aline%2Dheight%3A%201%2E3%3B%0A%7D%0A%23TOC%20%2Etoctitle%20%7B%0Afont%2Dweight%3A%20bold%3B%0Afont%2Dsize%3A%2015px%3B%0Amargin%2Dleft%3A%205px%3B%0A%7D%0A%23TOC%20ul%20%7B%0Apadding%2Dleft%3A%2040px%3B%0Amargin%2Dleft%3A%20%2D1%2E5em%3B%0Amargin%2Dtop%3A%205px%3B%0Amargin%2Dbottom%3A%205px%3B%0A%7D%0A%23TOC%20ul%20ul%20%7B%0Amargin%2Dleft%3A%20%2D2em%3B%0A%7D%0A%23TOC%20li%20%7B%0Aline%2Dheight%3A%2016px%3B%0A%7D%0Atable%20%7B%0Amargin%3A%201em%20auto%3B%0Aborder%2Dwidth%3A%201px%3B%0Aborder%2Dcolor%3A%20%23DDDDDD%3B%0Aborder%2Dstyle%3A%20outset%3B%0Aborder%2Dcollapse%3A%20collapse%3B%0A%7D%0Atable%20th%20%7B%0Aborder%2Dwidth%3A%202px%3B%0Apadding%3A%205px%3B%0Aborder%2Dstyle%3A%20inset%3B%0A%7D%0Atable%20td%20%7B%0Aborder%2Dwidth%3A%201px%3B%0Aborder%2Dstyle%3A%20inset%3B%0Aline%2Dheight%3A%2018px%3B%0Apadding%3A%205px%205px%3B%0A%7D%0Atable%2C%20table%20th%2C%20table%20td%20%7B%0Aborder%2Dleft%2Dstyle%3A%20none%3B%0Aborder%2Dright%2Dstyle%3A%20none%3B%0A%7D%0Atable%20thead%2C%20table%20tr%2Eeven%20%7B%0Abackground%2Dcolor%3A%20%23f7f7f7%3B%0A%7D%0Ap%20%7B%0Amargin%3A%200%2E5em%200%3B%0A%7D%0Ablockquote%20%7B%0Abackground%2Dcolor%3A%20%23f6f6f6%3B%0Apadding%3A%200%2E25em%200%2E75em%3B%0A%7D%0Ahr%20%7B%0Aborder%2Dstyle%3A%20solid%3B%0Aborder%3A%20none%3B%0Aborder%2Dtop%3A%201px%20solid%20%23777%3B%0Amargin%3A%2028px%200%3B%0A%7D%0Adl%20%7B%0Amargin%2Dleft%3A%200%3B%0A%7D%0Adl%20dd%20%7B%0Amargin%2Dbottom%3A%2013px%3B%0Amargin%2Dleft%3A%2013px%3B%0A%7D%0Adl%20dt%20%7B%0Afont%2Dweight%3A%20bold%3B%0A%7D%0Aul%20%7B%0Amargin%2Dtop%3A%200%3B%0A%7D%0Aul%20li%20%7B%0Alist%2Dstyle%3A%20circle%20outside%3B%0A%7D%0Aul%20ul%20%7B%0Amargin%2Dbottom%3A%200%3B%0A%7D%0Apre%2C%20code%20%7B%0Abackground%2Dcolor%3A%20%23f7f7f7%3B%0Aborder%2Dradius%3A%203px%3B%0Acolor%3A%20%23333%3B%0Awhite%2Dspace%3A%20pre%2Dwrap%3B%20%0A%7D%0Apre%20%7B%0Aborder%2Dradius%3A%203px%3B%0Amargin%3A%205px%200px%2010px%200px%3B%0Apadding%3A%2010px%3B%0A%7D%0Apre%3Anot%28%5Bclass%5D%29%20%7B%0Abackground%2Dcolor%3A%20%23f7f7f7%3B%0A%7D%0Acode%20%7B%0Afont%2Dfamily%3A%20Consolas%2C%20Monaco%2C%20%27Courier%20New%27%2C%20monospace%3B%0Afont%2Dsize%3A%2085%25%3B%0A%7D%0Ap%20%3E%20code%2C%20li%20%3E%20code%20%7B%0Apadding%3A%202px%200px%3B%0A%7D%0Adiv%2Efigure%20%7B%0Atext%2Dalign%3A%20center%3B%0A%7D%0Aimg%20%7B%0Abackground%2Dcolor%3A%20%23FFFFFF%3B%0Apadding%3A%202px%3B%0Aborder%3A%201px%20solid%20%23DDDDDD%3B%0Aborder%2Dradius%3A%203px%3B%0Aborder%3A%201px%20solid%20%23CCCCCC%3B%0Amargin%3A%200%205px%3B%0A%7D%0Ah1%20%7B%0Amargin%2Dtop%3A%200%3B%0Afont%2Dsize%3A%2035px%3B%0Aline%2Dheight%3A%2040px%3B%0A%7D%0Ah2%20%7B%0Aborder%2Dbottom%3A%204px%20solid%20%23f7f7f7%3B%0Apadding%2Dtop%3A%2010px%3B%0Apadding%2Dbottom%3A%202px%3B%0Afont%2Dsize%3A%20145%25%3B%0A%7D%0Ah3%20%7B%0Aborder%2Dbottom%3A%202px%20solid%20%23f7f7f7%3B%0Apadding%2Dtop%3A%2010px%3B%0Afont%2Dsize%3A%20120%25%3B%0A%7D%0Ah4%20%7B%0Aborder%2Dbottom%3A%201px%20solid%20%23f7f7f7%3B%0Amargin%2Dleft%3A%208px%3B%0Afont%2Dsize%3A%20105%25%3B%0A%7D%0Ah5%2C%20h6%20%7B%0Aborder%2Dbottom%3A%201px%20solid%20%23ccc%3B%0Afont%2Dsize%3A%20105%25%3B%0A%7D%0Aa%20%7B%0Acolor%3A%20%230033dd%3B%0Atext%2Ddecoration%3A%20none%3B%0A%7D%0Aa%3Ahover%20%7B%0Acolor%3A%20%236666ff%3B%20%7D%0Aa%3Avisited%20%7B%0Acolor%3A%20%23800080%3B%20%7D%0Aa%3Avisited%3Ahover%20%7B%0Acolor%3A%20%23BB00BB%3B%20%7D%0Aa%5Bhref%5E%3D%22http%3A%22%5D%20%7B%0Atext%2Ddecoration%3A%20underline%3B%20%7D%0Aa%5Bhref%5E%3D%22https%3A%22%5D%20%7B%0Atext%2Ddecoration%3A%20underline%3B%20%7D%0A%0Acode%20%3E%20span%2Ekw%20%7B%20color%3A%20%23555%3B%20font%2Dweight%3A%20bold%3B%20%7D%20%0Acode%20%3E%20span%2Edt%20%7B%20color%3A%20%23902000%3B%20%7D%20%0Acode%20%3E%20span%2Edv%20%7B%20color%3A%20%2340a070%3B%20%7D%20%0Acode%20%3E%20span%2Ebn%20%7B%20color%3A%20%23d14%3B%20%7D%20%0Acode%20%3E%20span%2Efl%20%7B%20color%3A%20%23d14%3B%20%7D%20%0Acode%20%3E%20span%2Ech%20%7B%20color%3A%20%23d14%3B%20%7D%20%0Acode%20%3E%20span%2Est%20%7B%20color%3A%20%23d14%3B%20%7D%20%0Acode%20%3E%20span%2Eco%20%7B%20color%3A%20%23888888%3B%20font%2Dstyle%3A%20italic%3B%20%7D%20%0Acode%20%3E%20span%2Eot%20%7B%20color%3A%20%23007020%3B%20%7D%20%0Acode%20%3E%20span%2Eal%20%7B%20color%3A%20%23ff0000%3B%20font%2Dweight%3A%20bold%3B%20%7D%20%0Acode%20%3E%20span%2Efu%20%7B%20color%3A%20%23900%3B%20font%2Dweight%3A%20bold%3B%20%7D%20%0Acode%20%3E%20span%2Eer%20%7B%20color%3A%20%23a61717%3B%20background%2Dcolor%3A%20%23e3d2d2%3B%20%7D%20%0A" type="text/css" />
+<style type="text/css">body {
+background-color: #fff;
+margin: 1em auto;
+max-width: 700px;
+overflow: visible;
+padding-left: 2em;
+padding-right: 2em;
+font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
+font-size: 14px;
+line-height: 1.35;
+}
+#TOC {
+clear: both;
+margin: 0 0 10px 10px;
+padding: 4px;
+width: 400px;
+border: 1px solid #CCCCCC;
+border-radius: 5px;
+background-color: #f6f6f6;
+font-size: 13px;
+line-height: 1.3;
+}
+#TOC .toctitle {
+font-weight: bold;
+font-size: 15px;
+margin-left: 5px;
+}
+#TOC ul {
+padding-left: 40px;
+margin-left: -1.5em;
+margin-top: 5px;
+margin-bottom: 5px;
+}
+#TOC ul ul {
+margin-left: -2em;
+}
+#TOC li {
+line-height: 16px;
+}
+table {
+margin: 1em auto;
+border-width: 1px;
+border-color: #DDDDDD;
+border-style: outset;
+border-collapse: collapse;
+}
+table th {
+border-width: 2px;
+padding: 5px;
+border-style: inset;
+}
+table td {
+border-width: 1px;
+border-style: inset;
+line-height: 18px;
+padding: 5px 5px;
+}
+table, table th, table td {
+border-left-style: none;
+border-right-style: none;
+}
+table thead, table tr.even {
+background-color: #f7f7f7;
+}
+p {
+margin: 0.5em 0;
+}
+blockquote {
+background-color: #f6f6f6;
+padding: 0.25em 0.75em;
+}
+hr {
+border-style: solid;
+border: none;
+border-top: 1px solid #777;
+margin: 28px 0;
+}
+dl {
+margin-left: 0;
+}
+dl dd {
+margin-bottom: 13px;
+margin-left: 13px;
+}
+dl dt {
+font-weight: bold;
+}
+ul {
+margin-top: 0;
+}
+ul li {
+list-style: circle outside;
+}
+ul ul {
+margin-bottom: 0;
+}
+pre, code {
+background-color: #f7f7f7;
+border-radius: 3px;
+color: #333;
+white-space: pre-wrap; 
+}
+pre {
+border-radius: 3px;
+margin: 5px 0px 10px 0px;
+padding: 10px;
+}
+pre:not([class]) {
+background-color: #f7f7f7;
+}
+code {
+font-family: Consolas, Monaco, 'Courier New', monospace;
+font-size: 85%;
+}
+p > code, li > code {
+padding: 2px 0px;
+}
+div.figure {
+text-align: center;
+}
+img {
+background-color: #FFFFFF;
+padding: 2px;
+border: 1px solid #DDDDDD;
+border-radius: 3px;
+border: 1px solid #CCCCCC;
+margin: 0 5px;
+}
+h1 {
+margin-top: 0;
+font-size: 35px;
+line-height: 40px;
+}
+h2 {
+border-bottom: 4px solid #f7f7f7;
+padding-top: 10px;
+padding-bottom: 2px;
+font-size: 145%;
+}
+h3 {
+border-bottom: 2px solid #f7f7f7;
+padding-top: 10px;
+font-size: 120%;
+}
+h4 {
+border-bottom: 1px solid #f7f7f7;
+margin-left: 8px;
+font-size: 105%;
+}
+h5, h6 {
+border-bottom: 1px solid #ccc;
+font-size: 105%;
+}
+a {
+color: #0033dd;
+text-decoration: none;
+}
+a:hover {
+color: #6666ff; }
+a:visited {
+color: #800080; }
+a:visited:hover {
+color: #BB00BB; }
+a[href^="http:"] {
+text-decoration: underline; }
+a[href^="https:"] {
+text-decoration: underline; }
+
+code > span.kw { color: #555; font-weight: bold; } 
+code > span.dt { color: #902000; } 
+code > span.dv { color: #40a070; } 
+code > span.bn { color: #d14; } 
+code > span.fl { color: #d14; } 
+code > span.ch { color: #d14; } 
+code > span.st { color: #d14; } 
+code > span.co { color: #888888; font-style: italic; } 
+code > span.ot { color: #007020; } 
+code > span.al { color: #ff0000; font-weight: bold; } 
+code > span.fu { color: #900; font-weight: bold; } 
+code > span.er { color: #a61717; background-color: #e3d2d2; } 
+</style>
 
 
 
@@ -141,19 +341,25 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
 
 <h1 class="title toc-ignore">URL Validation</h1>
 <h4 class="author">Jim Hester</h4>
-<h4 class="date">2021-11-24</h4>
+<h4 class="date">2022-11-03</h4>
 
 
 
-<p>Consider the task of correctly <a href="https://mathiasbynens.be/demo/url-regex">validating a URL</a>. From that page two conclusions can be made.</p>
+<p>Consider the task of correctly <a href="https://mathiasbynens.be/demo/url-regex">validating a URL</a>.
+From that page two conclusions can be made.</p>
 <ol style="list-style-type: decimal">
 <li>Validating URLs require complex regular expressions.</li>
-<li>Creating a correct regular expression is hard! (only 1 out of 13 regexs were valid for all cases).</li>
+<li>Creating a correct regular expression is hard! (only 1 out of 13
+regexs were valid for all cases).</li>
 </ol>
-<p>Because of this one may be tempted to simply copy the best regex you can find (<a href="https://gist.github.com/dperini/729294">gist</a>).</p>
-<p>The problem with this is that while you can copy it now, what happens later when you find a case that is not handled correctly? Can you correctly interpret and modify this?</p>
+<p>Because of this one may be tempted to simply copy the best regex you
+can find (<a href="https://gist.github.com/dperini/729294">gist</a>).</p>
+<p>The problem with this is that while you can copy it now, what happens
+later when you find a case that is not handled correctly? Can you
+correctly interpret and modify this?</p>
 <div class="sourceCode" id="cb1"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="st">&quot;^(?:(?:http(?:s)?|ftp)://)(?:</span><span class="sc">\\</span><span class="st">S+(?::(?:</span><span class="sc">\\</span><span class="st">S)*)?@)?(?:(?:[a-z0-9\u00a1-\uffff](?:-)*)*(?:[a-z0-9\u00a1-\uffff])+)(?:</span><span class="sc">\\</span><span class="st">.(?:[a-z0-9\u00a1-\uffff](?:-)*)*(?:[a-z0-9\u00a1-\uffff])+)*(?:</span><span class="sc">\\</span><span class="st">.(?:[a-z0-9\u00a1-\uffff]){2,})(?::(?:</span><span class="sc">\\</span><span class="st">d){2,5})?(?:/(?:</span><span class="sc">\\</span><span class="st">S)*)?$&quot;</span></span></code></pre></div>
-<p>However if you re-create the regex with <code>rex</code> it is much easier to understand and modify later if needed.</p>
+<p>However if you re-create the regex with <code>rex</code> it is much
+easier to understand and modify later if needed.</p>
 <div class="sourceCode" id="cb2"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="fu">library</span>(rex)</span>
 <span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="fu">library</span>(magrittr)</span>
 <span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a></span>
@@ -187,7 +393,8 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
 <span id="cb2-31"><a href="#cb2-31" aria-hidden="true" tabindex="-1"></a></span>
 <span id="cb2-32"><a href="#cb2-32" aria-hidden="true" tabindex="-1"></a>  end</span>
 <span id="cb2-33"><a href="#cb2-33" aria-hidden="true" tabindex="-1"></a>)</span></code></pre></div>
-<p>We can then validate that it correctly identifies both good and bad URLs. (<em>IP address validation removed</em>)</p>
+<p>We can then validate that it correctly identifies both good and bad
+URLs. (<em>IP address validation removed</em>)</p>
 <div class="sourceCode" id="cb3"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a>good <span class="ot">&lt;-</span> <span class="fu">c</span>(<span class="st">&quot;http://foo.com/blah_blah&quot;</span>,</span>
 <span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a>  <span class="st">&quot;http://foo.com/blah_blah/&quot;</span>,</span>
 <span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a>  <span class="st">&quot;http://foo.com/blah_blah_(wikipedia)&quot;</span>,</span>
@@ -259,7 +466,8 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
 <pre><code>## [1] TRUE</code></pre>
 <div class="sourceCode" id="cb5"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="fu">all</span>(<span class="fu">grepl</span>(re, bad) <span class="sc">==</span> <span class="cn">FALSE</span>)</span></code></pre></div>
 <pre><code>## [1] TRUE</code></pre>
-<p>You can now see the power and expressiveness of building regular expressions with <code>rex</code>!</p>
+<p>You can now see the power and expressiveness of building regular
+expressions with <code>rex</code>!</p>
 
 
 
diff --git a/tests/testthat/test-counts.R b/tests/testthat/test-counts.R
index 57c91fe..7346d61 100644
--- a/tests/testthat/test-counts.R
+++ b/tests/testthat/test-counts.R
@@ -34,8 +34,10 @@ test_that("creates a bounded repetition", {
 context("at_most")
 test_that("creates a repetition of n times at most", {
   re <- rex(start, "x" %>% at_most(3), end)
-  expect_equal(re, regex("^(?:x){,3}$"))
+  expect_equal(re, regex("^(?:x){0,3}$"))
 
   expect_true(grepl(re, "xxx"))
   expect_false(grepl(re, "xxxxx"))
+  expect_true(grepl(re, "xxx", perl = TRUE))
+  expect_false(grepl(re, "xxxxx", perl = TRUE))
 })
diff --git a/tests/testthat/test-rex.R b/tests/testthat/test-rex.R
new file mode 100644
index 0000000..7c31abe
--- /dev/null
+++ b/tests/testthat/test-rex.R
@@ -0,0 +1,3 @@
+test_that("rex() ignores empty args", {
+  expect_equal(rex("x", ), rex("x"))
+})

Debdiff

[The following lists of changes regard files as different if they have different names, permissions or owners.]

Files in second set of .debs but not in first

-rw-r--r--  root/root   /usr/share/doc/r-cran-rex/tests/testthat/test-rex.R

Control files: lines which differ (wdiff format)

  • Depends: r-base-core (>= 4.1.3.20220413-2~jan+lint1), r-api-4.0, r-cran-lazyeval 4.2.2-1), r-api-4.0

More details

Full run details