From 67ee8f291b1690b8d13c5fd3099fc717d59881cc Mon Sep 17 00:00:00 2001 From: J Wokaty Date: Wed, 2 Apr 2025 10:07:04 -0400 Subject: [PATCH 1/7] Create pdf in man path and try again if fails --- R/repository.R | 57 +++++++++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/R/repository.R b/R/repository.R index 5d59aee..34a6b22 100644 --- a/R/repository.R +++ b/R/repository.R @@ -58,47 +58,55 @@ cleanUnpackDir <- function(tarball, unpackDir, subDir="", pattern=NULL) { unlink(files) } + extractManuals <- function(reposRoot, srcContrib, destDir) { ## Extract Rd man pages from source package tarballs and ## convert to pdf documents ## ## reposRoot - Top level path for CRAN-style repos + ## $HOME/PACKAGES/3.21/data/experiment ## srcContrib - Location of source packages + ## 'src/contrib' ## destDir - where to extract. ## ## Notes: ## Under destDir, for tarball foo_1.2.3.tar.gz, you will ## get destDir/foo/man/*.pdf ## - if (missing(destDir)) destDir <- file.path(reposRoot, "manuals") + rCmdRd2pdf <- function(r_path, output, pkg, pkgDir) { + CmdRd2pdf <- paste0("CMD Rd2pdf --no-preview --output=", output, + " --title=", pkg, " ", pkgDir) + print(paste(r_path, CmdRd2pdf)) + system2(r_path, CmdRd2pdf, stdout = FALSE, stderr = FALSE) + } + buildManualsFromTarball <- function(tarball, unpackDir=".") { ## helper function to unpack pdf & Rd files from the vig - status <- TRUE cleanUnpackDir(tarball, unpackDir, "man", ".*\\.(pdf|Rd|rd)$") - ret <- unpack(tarball, unpackDir, "'*/man/*.[Rr]d'") - if (ret != 0) { - warning("non-zero exit status ", ret, " extracting man pages: ", - tarball) - status <- FALSE - } else { - pkg <- pkgName(tarball) - pkgDir <- file.path(unpackDir, pkg, "man") - RCmd <- file.path(Sys.getenv("R_HOME"), "bin", "R") - Rd2pdfCmd <- paste0( - RCmd, " CMD Rd2pdf --no-preview ", - "--output=", pkgDir, "/", pkg, ".pdf ", - "--title=", pkg, " ", pkgDir, "/*.[Rr]d") - ret <- system(Rd2pdfCmd) - cleanUnpackDir(tarball, unpackDir, "man", ".*\\.(Rd|rd)$") - if (ret != 0) { - warning("non-zero exit status ", ret, " building ref man: ", pkg) - status <- FALSE - } + ret <- unpack(tarball, unpackDir, "") + if (ret != 0) + stop("non-zero exit status ", ret, " extracting ", tarball) + pkg <- pkgName(tarball) + pkgDir <- file.path(unpackDir, pkg) + pkgManDir <- file.path(pkgDir, "man") + pdf_file <- paste(file.path(pkgManDir, pkg), "pdf", sep = ".") + r_path <- file.path(Sys.getenv("R_HOME"), "bin", "R") + # Fails if pdf exists or man exists with no .Rd files + ret <- rCmdRd2pdf(r_path, pdf_file, pkg, pkgDir) + if (ret != 0 || !file.exists(pdf_file)) { + # Make temporary file to move to man path + tmp_file <- paste(file.path(pkgDir, pkg), "pdf", sep = ".") + unlink(pkgManDir, recursive = TRUE) + ret <- rCmdRd2pdf(r_path, tmp_file, pkg, pkgDir) + dir.create(pkgManDir) + file.rename(tmp_file, pdf_file) + if (ret != 0) + stop("non-zero exit status ", ret, " building ref man: ", pkg) } - status + TRUE } tarballs <- list.files(file.path(reposRoot, srcContrib), @@ -107,12 +115,13 @@ extractManuals <- function(reposRoot, srcContrib, destDir) { dir.create(destDir, recursive=TRUE) if (!file.info(destDir)$isdir) stop("destDir must specify a directory") - if (endsWith(reposRoot, "data/annotation")) { + repoType <- unlist(strsplit(reposRoot, "/")) |> tail(n=1) + if (repoType %in% c("bioc", "annotation", "experiment")) { n <- vapply(tarballs, function(tarball, ...) { tryCatch({ buildManualsFromTarball(tarball, ...) }, error = function(e) { - warning("error extracting manual for: ", tarball, + warning("error extracting manual for ", tarball, "\n ", conditionMessage(e)) FALSE }) From 190d477dc42f831df816045d040007619b50d17b Mon Sep 17 00:00:00 2001 From: J Wokaty Date: Wed, 2 Apr 2025 11:40:38 -0400 Subject: [PATCH 2/7] Create manual outside of man path then move to man --- R/repository.R | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/R/repository.R b/R/repository.R index 34a6b22..b3cd645 100644 --- a/R/repository.R +++ b/R/repository.R @@ -76,13 +76,6 @@ extractManuals <- function(reposRoot, srcContrib, destDir) { if (missing(destDir)) destDir <- file.path(reposRoot, "manuals") - rCmdRd2pdf <- function(r_path, output, pkg, pkgDir) { - CmdRd2pdf <- paste0("CMD Rd2pdf --no-preview --output=", output, - " --title=", pkg, " ", pkgDir) - print(paste(r_path, CmdRd2pdf)) - system2(r_path, CmdRd2pdf, stdout = FALSE, stderr = FALSE) - } - buildManualsFromTarball <- function(tarball, unpackDir=".") { ## helper function to unpack pdf & Rd files from the vig cleanUnpackDir(tarball, unpackDir, "man", ".*\\.(pdf|Rd|rd)$") @@ -92,20 +85,21 @@ extractManuals <- function(reposRoot, srcContrib, destDir) { pkg <- pkgName(tarball) pkgDir <- file.path(unpackDir, pkg) pkgManDir <- file.path(pkgDir, "man") - pdf_file <- paste(file.path(pkgManDir, pkg), "pdf", sep = ".") + if (dir.exists(pkgManDir)) + unlink(pkgManDir, recursive = TRUE) + tmp_file <- paste(file.path(pkgDir, pkg), "pdf", sep = ".") r_path <- file.path(Sys.getenv("R_HOME"), "bin", "R") - # Fails if pdf exists or man exists with no .Rd files - ret <- rCmdRd2pdf(r_path, pdf_file, pkg, pkgDir) - if (ret != 0 || !file.exists(pdf_file)) { - # Make temporary file to move to man path - tmp_file <- paste(file.path(pkgDir, pkg), "pdf", sep = ".") - unlink(pkgManDir, recursive = TRUE) - ret <- rCmdRd2pdf(r_path, tmp_file, pkg, pkgDir) + CmdRd2pdf <- paste0("CMD Rd2pdf --no-preview --output=", tmp_file, + " --title=", pkg, " ", pkgDir) + print(paste(r_path, CmdRd2pdf)) + system2(r_path, CmdRd2pdf, stdout = FALSE, stderr = FALSE) + if (!file.exists(tmp_file)) + stop("non-zero exit status ", ret, " building ref man: ", pkg) + if (!dir.exists(pkgManDir)) dir.create(pkgManDir) - file.rename(tmp_file, pdf_file) - if (ret != 0) - stop("non-zero exit status ", ret, " building ref man: ", pkg) - } + file.rename(tmp_file, + paste(file.path(pkgManDir, pkg), "pdf", sep = ".")) + cleanUnpackDir(tarball, unpackDir, "man", ".*\\.(Rd|rd)$") TRUE } @@ -121,7 +115,7 @@ extractManuals <- function(reposRoot, srcContrib, destDir) { tryCatch({ buildManualsFromTarball(tarball, ...) }, error = function(e) { - warning("error extracting manual for ", tarball, + warning("error extracting manual for: ", tarball, "\n ", conditionMessage(e)) FALSE }) From bf19ef15fbbf8b7f0d177fc51522219c48e91a83 Mon Sep 17 00:00:00 2001 From: J Wokaty Date: Tue, 29 Apr 2025 23:16:43 -0400 Subject: [PATCH 3/7] Make manuals for manualless packages --- R/repository.R | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/R/repository.R b/R/repository.R index b3cd645..09b9675 100644 --- a/R/repository.R +++ b/R/repository.R @@ -80,25 +80,35 @@ extractManuals <- function(reposRoot, srcContrib, destDir) { ## helper function to unpack pdf & Rd files from the vig cleanUnpackDir(tarball, unpackDir, "man", ".*\\.(pdf|Rd|rd)$") ret <- unpack(tarball, unpackDir, "") - if (ret != 0) - stop("non-zero exit status ", ret, " extracting ", tarball) + if (ret != 0) { + warning("non-zero exit status ", ret, " extracting ", tarball) + return(FALSE) + } pkg <- pkgName(tarball) pkgDir <- file.path(unpackDir, pkg) pkgManDir <- file.path(pkgDir, "man") - if (dir.exists(pkgManDir)) - unlink(pkgManDir, recursive = TRUE) - tmp_file <- paste(file.path(pkgDir, pkg), "pdf", sep = ".") + # Remove if exists without an .Rd file + if (dir.exists(pkgManDir) && + length(list.files(pkgManDir, pattern = ".*\\.(Rd|rd)")) == 0) + unlink(pkgManDir, recursive = TRUE) + tmp_file <- file.path(pkgDir, paste0(pkg, ".pdf")) r_path <- file.path(Sys.getenv("R_HOME"), "bin", "R") CmdRd2pdf <- paste0("CMD Rd2pdf --no-preview --output=", tmp_file, - " --title=", pkg, " ", pkgDir) - print(paste(r_path, CmdRd2pdf)) - system2(r_path, CmdRd2pdf, stdout = FALSE, stderr = FALSE) - if (!file.exists(tmp_file)) - stop("non-zero exit status ", ret, " building ref man: ", pkg) + " --force --title=", pkg, " ", pkgDir) + ret <- system2(r_path, CmdRd2pdf, stdout = FALSE, stderr = FALSE) + if (!file.exists(tmp_file) || ret != 0) { + warning("non-zero exit status ", ret, " building ref man ", pkg) + return(FALSE) + } if (!dir.exists(pkgManDir)) dir.create(pkgManDir) - file.rename(tmp_file, - paste(file.path(pkgManDir, pkg), "pdf", sep = ".")) + file.copy(tmp_file, file.path(pkgManDir, paste0(pkg, ".pdf")), + overwrite = TRUE) + pkgFiles <- list.files(pkgDir) + pkgFiles <- pkgFiles[!grepl("man", pkgFiles)] + pkgFiles <- unname(sapply(pkgFiles, + function(pkgFiles) file.path(pkgDir, pkgFiles))) + unlink(pkgFiles, recursive = TRUE) cleanUnpackDir(tarball, unpackDir, "man", ".*\\.(Rd|rd)$") TRUE } From 3fc9ca5f72189b1dfbfc941d2db709bdebc13dd0 Mon Sep 17 00:00:00 2001 From: A Wokaty Date: Fri, 2 May 2025 14:54:02 -0400 Subject: [PATCH 4/7] Generate html manuals --- R/repository.R | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/R/repository.R b/R/repository.R index 09b9675..9884339 100644 --- a/R/repository.R +++ b/R/repository.R @@ -78,7 +78,7 @@ extractManuals <- function(reposRoot, srcContrib, destDir) { buildManualsFromTarball <- function(tarball, unpackDir=".") { ## helper function to unpack pdf & Rd files from the vig - cleanUnpackDir(tarball, unpackDir, "man", ".*\\.(pdf|Rd|rd)$") + cleanUnpackDir(tarball, unpackDir, "man", ".*\\.(html|pdf|Rd|rd)$") ret <- unpack(tarball, unpackDir, "") if (ret != 0) { warning("non-zero exit status ", ret, " extracting ", tarball) @@ -104,6 +104,9 @@ extractManuals <- function(reposRoot, srcContrib, destDir) { dir.create(pkgManDir) file.copy(tmp_file, file.path(pkgManDir, paste0(pkg, ".pdf")), overwrite = TRUE) + hooks <- list(pkg_href = function(pkg) sprintf("../../%s/man/%s.html", pkg, pkg)) + tools::pkg2HTML(dir = pkgDir, out = paste0(pkgManDir, "/", pkg, ".html"), + hooks = hooks) pkgFiles <- list.files(pkgDir) pkgFiles <- pkgFiles[!grepl("man", pkgFiles)] pkgFiles <- unname(sapply(pkgFiles, From 9cd3dea4d760f42f9eb7f49fd1caa8a4dd81a9ac Mon Sep 17 00:00:00 2001 From: A Wokaty Date: Wed, 28 May 2025 14:09:22 -0400 Subject: [PATCH 5/7] Update extractManuals documentation --- man/extractManuals.Rd | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/man/extractManuals.Rd b/man/extractManuals.Rd index 8191c13..8b70218 100644 --- a/man/extractManuals.Rd +++ b/man/extractManuals.Rd @@ -1,20 +1,17 @@ \name{extractManuals} \alias{extractManuals} \alias{extractCitations} -\title{Extract Rd man pages and build pdf reference manuals from local package +\title{Generate html and pdf reference manuals from local package repository} \description{ - This function extracts Rd man pages and builds pdf reference manuals - from the \code{man} subdirectory of R source packages archives + This function generates html and pdf reference manuals + in the \code{man} subdirectory of R source packages archives (\code{.tar.gz}) found in a local package repository. - All Rd files found in \code{man} will be extracted and used during - the pdf construction process. Only source package archives will be - processed. The constructed pdf files will be extracted under - \code{destDir} and will be found in \code{PKGNAME/man/*.pdf}. - - Prior to extraction, all Rd and pdf files in \code{destDir/PKGNAME/man} - will be removed. + Only source package archives will be processed. The constructed + html and pdf files will be extracted under \code{destDir} + and will be found in \code{PKGNAME/man/*.html} or + \code{PKGNAME/man/*.pdf}. } \usage{ extractManuals(reposRoot, srcContrib, destDir) @@ -22,7 +19,8 @@ extractManuals(reposRoot, srcContrib, destDir) %- maybe also 'usage' for other objects documented here. \arguments{ \item{reposRoot}{character vector giving the path to the root of the - local CRAN-style package repository} + local CRAN-style package repository, such as + \code{$HOME/PACKAGES/3.21/data/experiment}.} \item{srcContrib}{character vector giving the relative path from the \code{reposRoot} to the source packages. In a standard CRAN-style repository, this will be \code{src/contrib}.} From e11f558b87b3d400c03cd5ed4052a85619cc42a9 Mon Sep 17 00:00:00 2001 From: A Wokaty Date: Wed, 28 May 2025 21:51:31 -0400 Subject: [PATCH 6/7] Correct spelling --- R/repository.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/repository.R b/R/repository.R index 9884339..cac98a6 100644 --- a/R/repository.R +++ b/R/repository.R @@ -136,7 +136,7 @@ extractManuals <- function(reposRoot, srcContrib, destDir) { } else { n <- 0 } - paste(sum(n), "/", length(tarballs), "tarball manuals processsed") + paste(sum(n), "/", length(tarballs), "tarball manuals processed") } From aaa52bbd2163c5333929f44b022d484159e53f3d Mon Sep 17 00:00:00 2001 From: A Wokaty Date: Thu, 29 May 2025 10:31:11 -0400 Subject: [PATCH 7/7] Add tests for extractManuals --- .gitignore | 5 +++ .../bioc/src/contrib/myBiocPkg_0.99.0.tar.gz | Bin 0 -> 49662 bytes .../src/contrib/myAnnPkg_0.99.0.tar.gz | Bin 0 -> 543 bytes .../src/contrib/myExpPkg_0.99.0.tar.gz | Bin 0 -> 558 bytes inst/unitTests/test_manuals.R | 41 ++++++++++++++++++ 5 files changed, 46 insertions(+) create mode 100644 inst/unitTests/repo/bioc/src/contrib/myBiocPkg_0.99.0.tar.gz create mode 100644 inst/unitTests/repo/data/annotation/src/contrib/myAnnPkg_0.99.0.tar.gz create mode 100644 inst/unitTests/repo/data/experiment/src/contrib/myExpPkg_0.99.0.tar.gz create mode 100644 inst/unitTests/test_manuals.R diff --git a/.gitignore b/.gitignore index 745deae..8374de6 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,8 @@ po/*~ # RStudio Connect folder rsconnect/ + +# inst/repo/*/manuals +inst/repo/bioc/src/manuals +inst/repo/data/annotation/src/manuals +inst/repo/data/experiment/src/manuals diff --git a/inst/unitTests/repo/bioc/src/contrib/myBiocPkg_0.99.0.tar.gz b/inst/unitTests/repo/bioc/src/contrib/myBiocPkg_0.99.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..6725fcfd76a8027ac882a34f482144be254bf307 GIT binary patch literal 49662 zcmV(vK|T%4KYNoJCdt*4Nsy|IF|IXxYngNYfy{~KcXkJwmP{@cmO&dTsVp8vVA zFfy?-0x+^NFtRbQu`x6K=N%&>3o|1C0RzDQ2Xb|GF?9ORSIlhx@8A7D<^O*wQUwt) zT1GlnDAI+M(G4g@RsseBdm}3-9v&!q8B;rR7YhP*P6mSiT~PF5mNqV?P6YH~Hij;y zBBsXnCZNmBKD)3*ottzUaX$3?T6d`&RrCo8z zG!eO5VhO*Waks6GFq#*=;O6U7Gd=Cx_WM~$q=hFIBJMHZ&5L_0dWA&ZU}yCKsaM~C0CS{+ z3I|cFta8J$$R~puBxNPeBhWMs~|vzoik*8IQDCg49PD{i0cMC zw;R=Iz0h-Jo-%?2+6-o6lAhOM$p_B;qTH?1JhMgFW^ReJQ(s=-&fUKCW-BUp%v<>e zzq+2er*u+6f&aLrRI8g@{LoV~RuiC;TSmy|a^Krz@c*#sLgJ2lB$`$x2f)!At~#73rE| zqLaP?=djSK<)2C-janl16QEml(eBMpgA@|Q_t#`m*-EpKALh?WqRr(tF%GDZ&&%p` zm@bRFrMu+u+N3#tl2YeRFI`0TSvvX%=(qSuLM9WG)cq_qJLVx+^r0OYr=>Y+q2&(R z-KHsG%yBx@W-fHN=NCsrFjo|UpBMI|Z$z@k8^6;tP@ z$UM#;*N_7V+gUH9CVE7BHFbU2O^RMrf1B;URfgdQdVqnf3;a04RD^Y@YfD-@!JD^F zHR~wL39qFXDv{2YV>ZS=p|EqJ{D7KCIx$`NHIvUP-U!#JnuyKe$g)NErsfVSSWsrcy+RdFkVGPN`LKMeAp+kZ0`GxPuKGDbG$|7DlC z#tA|XF~Ef0|DbZpIcRRRPI{s4EENA^bz7SUz zL~TXDh*pXWa{!SIDK#~4oM6l4vS^mQ`5ZUGZ^Lh@s0EGBgN;WKyn}c#!T;P=*grPp z&_9wWh5Ipe!xQCTqkvMab8vUB1%i4zup87322DRefXF&P*xB6;*2Y-+(Rc4>fBu`vQngle$M62i z>z=2rm`GX85D|DSGm!M=MkiALTT!2wXS<71=iO9#bH zNPW`}e3kP70FB5jh1>uuFta>50T3%fYIc8c2-48#dI0>@0OXtN}Qg;V#jqze#L7822wi#zOBT+|;d zDtf&GpeG23OwGm~fII$o-PX{BAzzH~B|@`F;2$&HHD3 z=09$d-{g0Hb&1=2p;SjkPeW28bHnF!$Rip^ zNATbjLOQcF0B2-u^M`!5*!}Rvz>UDv+g!qa{HgTB1CZZv`CTLAk!zkr&6Gzb0y zZUE7v`>vaM3-{`Or)+<4hae3Czi^(E=FeX{{$Kj9%|Fo0e*yGgn}493dO2`p zat7Sk4Ilg8oEm@ApXDfjOwPR-gK`L8{tNyeu0|i=>}%+De+5rOI%w(s1Lutma%3?m@!IISJYI?>Va$#G^KD}*#p8n7uHRHE7jJ^ zCfN?wW!Z0uXI;(*43_!m>Uen!;lO8c{mGmuPFx|bJ25gHF#b)$_z3U>X|yKagP8$? zVKlUcoj*{W;(?}x@&aenEvLbFhufg%W+pyCqXSnqQ8O({ygu);kBP43dC+SF@Aba8 zQwHZAYE5<)_EPt@)A<(D=|r`bFcnK=7Lft89|XfQDmtm2CV)ANy#aPo%FIFJ}po$Al=na=Tj=x_$@h4>8;gJ>lu(EX8jINX=&Xd z!v~FE1!t=@li8> zG3^=$TbmMb zLh3NeLYm(80ETx_7&pVZ5diCh7)$M}zQKdbUKlu^k!6g#`X;f1l)ejE7C=*MHEg-# zr39HpIgTeOK-H?fk-1r^nmSqoUV?M%VvNlB2RDAn}A&^gX(TD8I`p>bCn5m==zmffFK=2=Q-OoolOix_V8m zuSafD+z(D^qxMa?y zDe9pZxloroY(k1gy6*zgtdaaD-Nd650b{~bw3M9k+WkwwD%V&G^Q8(V%?HYm0T*>4 z?HlbV#!x0%<&$u4Heo2_e!Zu%5~GdM^jwwdD}_|nGcaZq+G9xpxtFV30VPJHqyN{U zTu=CNu*H()NTe-i_(j4F($Tpz!XCZ2FN^yn9A=aGJ|G0QBW4xqBFXB`M|5%V{9cRe95 zF8Fw(>*lQ=rc;J(d*NDrLlKkWpXH%aKZAz(cCKKIP?%cYJ_0*}q;m-k~`S-cz;=(&AxtuF4j=P_S8CYW~i;EK#RL+W~GR882hFA1s0 zbD7zSNWHW=*` zg*?7&ftdUf8NSQYH>%bCcZuHbVb2X`4V6P2 z)mcnc_K|d+XI)00>&j&}om$f%z31DViDP)RW0_McO62rx#kuoU78UqCEp2m7WByXh z*Q68M3EC&yB!h(}mev%NA=b`PW;qavLCs_X^j?XzosgHmVGQm~lgjiqQ-po#9O%jB zYh|NHo$)U7cf&`{X|>}VmrdWV8~rel@Jk$f!jx7UnZZXhvND@u3r+xGpca1}p|AE~dRlx|Ju{y8VSq=&;Lc({D`^I@gT*h#{*ya+sv)8#beif+Yw5h0Gs{arGfq*Lp?C;g_39%_V-k?i`=RVGA{ z8Yfr&!-;PN;B`hO?oPp~AA-l}o+eCM4@*z+PqhN({{gsGZo{Nf>7t=Lv>oPIqE7iCAo#> z857jH3w>7V`Y|;x0+HumM3PjKq66}qYg_OelY}BXMR4iP)ELv6gN5i%=Ii(Kh4Eh= zgB@u<`PK1BzR=T9OJ~uNc3isSmFLPAtW7LaklsR{lvJZ&EHK}Far&+6XPxxtXm5^P z&Mv6aFbvGxMUAlHq?xg-cM&7q8OI%<<1q+V#GO5lmg}xdj8%B_ zbb8NT%7tc*SWe_o6MjV;Fkw$-b@vJB{VmEB%yrj%;XCZmF-uzi2o$vzGrZ z1}}`zOIL>i=Ifpi4<1ZYC|kUFG(CWLWt#bUCGEaS<78SfnHN^5Q=BTSpZaBx&Te;d_B zj@Nvc(Z{d=r^TZ_CT@reUX0#_JxQD& zEgYjWp1$5nW)Xsf4#V!oElu)GnGgq|j(+M@11$if+ZK(=IW;$py(c}7>7 zT2|INvTvukcgA5!Dk;BiWcN`wJGrZ*-zRSQqs`6@{jG{RN2jE^+~nFh=>j< zN$TPBu%NFK22qk;&TJ3?Eu!E44XVof0Xg61;*6KPVt@bRJt;m?eD%>;blo#|Z5;Xz z9hr*dpgffh$}Ap>Imuihd+^U%rM4pN9!O8An7f!cJXI)#6ifkNV{pO>{J9IkH?y!H z1zDexxJ!t34~qs)Da_0fU@g`^O%-+*_j^_zSS22arxXEOxuNo2e!;|ldt)kAQ zI9C)z{e4_{X(r$bThbv=(GImV43ZcQ{;-=~duA|11Bh1Nc7yu|KUI5o;!}+!&EsE2 z<_G4#Zjg3y19I=FBs#|_aMJiXexFtrq8#JeazaiTDw!VL=irgek6(J6JF6Kt%jJ1%Cik6%n+nj}Xb{)J%1GImfPPhD6g^i;$C_@K)x`6L*urx5 z0ovn1o^Jq#*I~?Z8o#LHcZEF-?~LTDH#xwdnJ)L5AxSh%(%=b3?{?r|O3j5ef7m$mS@E}_1#PndF{hkhD$Xo~t|MT5w&^VIZB zOnS|+?+}l&HnNc(=X>@wDzo7(i7k17W(8EW%!&sjKdmu)YA_KL>z;(U+x1Q)S1OBh zk6tA$^$Pxb5H)AN!gIIiXq)Tu`KcneE+^M8nwAV@L}a!eo$sfhIO8!^%!p;`ErG4d ziR*0VibthJHL-HXk;x=G7@B_;l-sX1gyO3Mfkv8wm zNo-Y~*$93~1gRu>W(xfIXiGf1f)M8A=OcZQgObG*>hVS#5n|!0hPL5~<;5WKD6%tq z3&cPs@tAs$lOR6di57aT*@U_KT2>1d<^j*pfquRXHyymS?B~OGbaB%b`B90_wVwJ5aCN!vm(uwFLHCG1c(^8xRM8d zPy4MQj_;i~S%#3Uk{D%5pIp{E0HysJukZo_tSLg?2Fa;Z70-zcR*{-YIS+GI~KS%eI@fDXSIY(?b8w;jzb&CWUbAI!9KB|RJrs~}KV z+VFF>@rEcji-mHXtc1;F^7}HGcILACMw(df2T(*<+O)l}DkPbAVyFmm2s6reav>)L zno7^c-p3JHs)IRrhU@I&%FV%gkHwP?`|!QD{EQz+-{~k);B> zr_kA+|Bku+M4lG}yTfI<4l|#$Gi!iz*6}sX|D7906Wa3fsI8#cjKYhYpyER`NJoH_ zF0q94;xKoKmxpd_c6BVGkH?}#Pru9}be6p&w?0&^Q?Q(qRiT_`K+dx?hMYC*E9AY@ zV}&_|S0uDIU^j1-8~9FbqEEP`v+adR8|a5-2DvZ8u+)~$<^=1zV%M3H$tLsdOm&nG zlQ`J;Y5}y&31|)z6e zdTtU%8JAOb)@%~~xUP4R=w;l5?CV{9rAbv93WfIUN#0)RT)`|&PCT73t*LhM`a9mf zsJ$iHoW#Y)0Vjpu$FtguJ?KD}$9!%ZbW_`&I2Y)y=vuRhGXLl~Cw`F`Jng*tR zFkPx^64?2F?CvbU4m}bT4hDKrvffmxc&I>3J_4Epmb`hxcq>I_`@CuoD~u>{Eruy_ z`QJE1wtCizgOP4mm3{-$S?o7yC|&-;7;~E>3rV3_RWVfB$FGZc>5*h`U_zUt_)t9p zM-^zk!d1PfNeVnF*tmdg9V4j`wul%|H)GKpl^~6+5{n1MJajApJ zw#znZEnaUGy_QLhex&GQxtJ)05U*5Hp%9h=}LU^iS}c3zGmzFkgAIu>2TlH zk@s~`sOK%E!)C(dlmAT&iQe$b8fEIR8A~PTA3sFTLV~%^+I#U+`Fwyk)`VpDgKm$& zvpVYTYYjNErpOHYX~GYfH`UGU1&aU9gYL;Stqg9-^Q?v)-spkflI;Gdb1^d=Ga3>y z=Qz=#A;UjoB0>?(QwpVKUREI#j*{iAcI&MP&XgJpUaT{0)UF-M%@0QyEhcd-L70nC zUEx$94Fxnf>to0vyvXVljQzJZFX;rUrCVb4mT4}%9*nOK%18{~ z9thD)y9Zd+HlA`OWs!H#T$lN2mwd23_yPZASkzH_QU!vPTr~VrO%@gt%k;b3;d;40 z>f}(b{ZlJqH^;cQ?3Q2>P?V=Enmb->Ct-?_jf8T^ODtNASqbLPxPH6b_>fQu*>L=V zOaCC7J`uMeUb$czUgSz3n_wAlXf;sq^6V`&g_@pd!Gh2Gu;n@4Ptk+<>jTd)4$V+$N_^3g=X%hRZGz1 z)Ac^W)*{$I@?@xcru!zEx&Yz1Wxegue1(tdo!M1OcX^~^951qisn_jdY{=}#w{rr* za?yaFTvq#IbM5UO-J$KeS;>^0p2noE9L-N(E3=hYM(o1Hh|`G&Irmj+tfj^MizMZ# z^xT!&ro$Cy=4qWxZr1dSOHBE8DClOGwG6{dU%rZFQ_69x_v4jnB^l0Kout>vS>$Ha z1QA#OsHc*5*A^e)tuQfKSwlQeR>U6_=ZKZM=r6r2jSXt&5WErMAThrv_~M#6C@$3U za++~8bpy>b?Q|Gt+c}$^il)Em6C-~?dxXzcTn^QL-JzWXjm$z-Nkim?h_sL0vWWuX zrOadB;>TwqId%186C0|(X;k`CMw2UcC>ISQiJ^S-?2A9}KrzJ2hLJe`LdNkyc4`sI zg|W4=PEUWr#x5uz1maHm#T2T5b*1bT&tD9<9uG^ z+Snt1zM-L~fSoENp6UEfVaz-x%g(;ljhMlxkhpQudJ`#1_HEeN9p`TH9r{y_IL2oD6En0dAtlHIjja z_xA0czu!Y89IkB4E9z(shtqYcE|4G}_`_y;8S40S>2s8nY`+7Y1~(=5x*qK(ed_J!G7wI4iTZQ$A z*D?YI2QDh<^|4|o(-%a$Ue@WphAJ}#IKmAXSDD8y9s%|65}{TDlw^YG>9#S>f0uBQ z#ee9Q84dYjD@l2zJbFr%#6}5TribZ#4`O0}F6m)Io@kRD{m9sK$lT+$#E-G(J>gqX z;;7Hfi!B(2%sV5xPRLfy%?Pr8u|8<;qrBwLEMiej>f3`cMb>SWK>Zur6u-mGmt$wX z#RiTFy(MTp-5PKrV}fx)zNB$HLy+)e9KYIi8K!-Q>@qX~w8t|>*^^qjrCmJV0@$4a za_W64gM#8cC>vAtx(3_ChyDIA#ib2V&=(wiWI>&Aryr{kgKGJrjy7vAPle*Ib&ZdN zLFC-EZj`qLi;KE&5Hn0HGIN7+6|hwAe*n0w;cj7WHyjeA%z=x{n*4}XR)Tu zoJ@{CynP@Bx!+9@5sXD+F?yumoFf8C+A=;|?t;E?kmQ5KM`Dg2xvuiJ3ExNHLO{w4 zYaEr?GYC&K0ox_hdj$IS&&D|V*jXih`H-_ zx6eh~#=F0+dkjchWsKY=LT(b`E(tbEApb!xDq)}wAYTEve#NOjD&=4$nIOum zUnIuUq}g1n&+yFzu`FtF#xasCgspJ$UWOR8iUxwT=p|ps!B5vLR0|&K8uM6UB&$0~ z#c(HnL39a6>4fmJ>tM;(@mJSZ_Jnhu*|rqw;Fwa>Vv2k4T5g?FzN;E(3%MD>-TW*q zI-D2LLXcOm{nNM68IR~*z45~oj4>zHl<}#ZzI55rK&e}@Q+o0ss=rdB*nr<%QK+Uz z5+1TdO4}I9Cqq{o7UbJ$)ZW7o%AasbO>_F@DMU}2d4rmsnr|r*rhM6?a?}t^x_J=d za!QFW3W1DcxDybztK-dVw*J>O(B5{v&q&TxLOoU1QU68%Q2%uejYFJ-Mb1k`7#IXW zA$tX=)c1{PH=f0T+xUF<)n0DVkZ{9=W>F%KtB+@qm0xTqZO@83s#9j!KP0PfF5oJ= zQ<->--)j^WsU(Ro;LejT1@xS>yG@P_+{P9*dJ07A&wI*x*ro%Ac7mv5z{fHmMH$1g zq2KR_v9Mocw)#Sm-Hd|V7*Q>iGhZwjQ?V$26Jq4&5s}Z=sfqc5B&s(i+;yqPV_Etj z#MyvjEW6CKx*0D4+12OFYNx<OibHkg&g5yjnIncf;wQc^YF4z7fNfXOe>1fOrd_7Ku3Na|=<@sH?zG<31kxE6Hz?h>5khbSmUYJ5l{ zX;O&mo+6-N)I5s*)O-Yt#7rRWohb8b97A}uNV_3)v7@`xITN?c2KD@)OY^<5lZr+E zoaSR>@5iMiMSOFy*^e>JgDr~!EfF9jSSmA!oH^Ixz1w{-Ir}$hbh&b{KcUoiCD^BN zp1XQdp|eVQjfE2p-_$){J{Y__{<$8a1jMcZ=O%$nz@_Ahtdb^_{h&1*i^)j;YL)fk zu6TGG5U4?aYi!qc(DX3)AA3Ow_@luZX=OtdIbHHD;?}lrNSfa;;aqjZT1N0md_>H3 z-~#xjE8_pW8(>_&rg<8XN#E*9Xx$1$)-BxnAzhWv1duum(}F;NMyr_8mn^vyDrkv8 zRZ%!7EWUSE7QXqyG>fFR&rM?ak88|3x2t#$XR2FO%k_F3GEI&boIxMCHLh%sW8ifL zAtclhe=AhRqVdAavXidTdz(H`PY4rNQK6`&QeC!e$mY0rG7=*dL=YatdVP-}(UC{X`-H#s zfz>USwEW&N9LaOglvbPi%xSz34cn}G%VgY`Dy-!r7xB^%#N*8nSx`=<5cz)F@D+`} zc5DIxHb#_c$pXM2#KKGF1l0{n1q8VTkU;!0_-XmR_e3DM7tX1UOMb43k#znI zF{2ce3Ed~rPx7n-YgERuxMl?Lm)49-WSyAV_vdBX1o@)M`G;}6{2(a3OV!&NI}f>3 z3f~-euvBTi!dmYZ>6b}2ir+87)|OjM=PA{6v~%Cq*_JM4`u7U&W~;p929;gsYQZw` zz|ox-1{nXm;B)LDdMyTJT#E+LzDxV5<+Zt5eJG+{u`yFXH-u|&E6Ew5P?;LBKST<@ z)0sLmnVp(^6LQF9V)tlEj|^i$?jRXnJvzh3f%ouKei3M7muEbSdHECAl7L6A7xyy= zu`ix-;eW*|oCenLR#vZO{==;|OO6sNCh;IOtDR{2WU+JXcLZ;1Ub*p-zh=WHWHDbi zynxjE5I0{k-7~eJ`8s&9;YB%f41IjT*;*l|cB`+#pNjbRHlKwub9u_UU^cHWXWw`G z0;3Iz*)8URV#*Z`nl`qua&x3X@hcfW`^>8p2c-zRPdOXIRm|iwu{+Ua-e2>-FcR;O8>6LW|gY?|w zGw%=hr_OF$ic5b@J234fOdUT;oD7zv<8XX7KQ`@DSbR-Jm>D;-bt@AV-K zThD_NHRzIl>^#%7>(Yr#TX&qoN=3?Dv}^M_$+gDC#(B3C zgC@(9Tsl~zXNc>&J{2X2JU=^m$F=CS(uLe@|J1t)QGZdo>RNSVeIC$6;v0o9FPh}usyVs6Zr@jUyr{2CBF|DnK&gPOVN75^Zaluyy%L?~Q_85op`GJLE z-+?)gM*EZRy%kI~R(*#?<{ez^UkSdvv44)e!PG1goB>COHaizSvf{`SQrA(iMK#ua zCN=(YRXgRFDiYgBfYaR6qndb2`5+h}a5@j7f!OK(T6tBJNOkc7&TYNd) zxQ(NIklhBSMGF&;?7~Nn!$+_^<}p0ww5*WYnBMiFn}_=Bwmfp9IA*P)n4Y@G{jnnO zBPWK_DGV49cfULB^S#PWI=!>^pD{AJ2nET<-(7r`0M50eNrih`8)BGxsg4G23ezLk zU!q}DsYeL11eie`N_=4;_Uo_;li8pZe7tLKP-BYa1^1%r^uD@WbMi1| zZy{4a$8_RnZtJJM;89?$BPaC%$hF8^evLi)4!D~PG7^Bd(XyEw!C!q5LQr)pvU+t*{CZ(l3FE?XBOI7R;)#4apO0=}6^2trfHtg1Z^gGo;JQnYMH0^BIx5AeUTtu#Sfv+uZ|U-SQa=Z zZb{qpa9O$Cuq8sT(SlT4yFJk+8|it*Q!dw&NukDsiZJJta!!UxxG}Dckt_9SQqQqX zF`zyDYB|`-0Wt-{_FplBLCZNERuqxBz(B9A+k}-&DbvwqDt@voiU+==$Qd~(u)2HH z;*~M;Hzp!Ost92QwUI24aF(2o4$17tApX&R`b4??7i2Wke?>;K{a?vwb~dK}nv7;+ z_+KTXYu!v$a<Rj~HG_@^I6F^XIArqPc0>S`32#5qgO~8&0fSjP9po$g%OL1~~^oCekl!1ck z()o#*nJ4*aeL?`~`oDiYW?ezH1OQ#@@a_q{#mT@BK)#{x`s7x@0ss}X5C*Vq;D9Bo ztb5c|lfW1!t1f^~1P~LWLwE&;W|r`6KotSC0to5|!~^FhL)WdZ)EUXp@Ag=Bbp{c${Fn^@Is$BH zbOPQ9)z{QB)UW!>ALjW1e`~#=$;rLz`u%3@fN6_OoGAlP_A!P@h`cU@(HF zf7a?KgllmCa&i6}fp&6#m(Jjw-@F82{cd58sUe^Xh(`CI06{g1o2xj5^`w9>f842? zzrI9&*d)L05a0HRZ-4ST{;L=Lx<`NeU*Gi$PIj-aR%meb&=2wKU=N=Y8Ug_I_b>vW z59`9mXAl0R8XN()y}$aBe^|BfpWxb*;@$`SpD2ZB^~8xG8$DA)gJX~I#2cz`H;_P9 z0flO90M^i7>z+Th>!ARGbgu>w7pm+1;!p;sCkOB7`Ej%xSHLIqfF6H`K!O2(Qh%yd z{gchtR1}t&SB!t~@z?u-SoP8XtB+1zr?2?66HBOmk4RiG=NH;@cox7oqZ_jiBCZ}Z8M{R0z1H8_F(wXtj~KtMjb zEq_ekr)^Hoj-IIR_tSq{FaCLdd!7gr$R?p(4A&Nyc~G@P6LKjNXxGVHm;fjn(m9 zp>(17pWOhuEfK}83jIRnC+SmJL4^6>dT(P9Woeg(#7UYO(d^JqlCj13t=@S0-C5S< zGWygeSrq>Mp(g;r_k3<`BBsCNh|d7B4_)BfOL0DUb>D&gjxv z*XAMK?|$SOxcGN*Vp7pcG>-yZXD_SN_SZA`%9-CA{@M++F)C|1`W_Z!RiGOn5uQ5e zQWRgRb+W6{-p4E~Y;y~PDPt##X$E=JV=sFmYr=~{d~`a;at+Q8PV0qMjOgmEPCTrZ zA-`So!BB$=H8zpU&&b;=((R2r0{vM@>+7|OGfubMIw)+LuJhF-s5BfP4t=rQe<=S6 z(nyz#+Jlu6O_-x3Ho4L|+l3VW%NJH^3Q=(aLGQ(sQwOI7S2}QZNFbpLH9p4h#}e_? zZ$}}*_;!;`{p-l09noTJY_|wM3YB62)64Nq@9NDmaj;aL>v|%RdSXJC7-91Pm;Suo zE`fSR9Bsx)W2uOt9=M4*7F0{ASwR$Dw#<-RFpEStAPI;;w!f;`31A`A*cV-B4$24Z z1}vM#myny}l#<&d{~KKkCD$JY@l`lg1fM@5IlG~|1o8Ojjx1|We60)@l#I$DFH^f- z(M_0S8v4EQF|bBWv-qBP(+qlTs@qwchi#w5?<791of*nP+A%_w@CJsJ zeCf4d6dSh$dx?Rl{SLb6td<}@Q(HT&JHB6IFBaQx~^Jn52PO4ONTdaE681~2H7 za~A~JV>VBtQS+HspT-Ddb}}h0s+0HVMnYsXvr5MfEz*(%i@T%+ee+GXIVXy*U0F{O z+AGshf7pWftG1YAm`g~F322Wx#gFmGkEyFZFhADc>tk1T!!W8}4d5GP+RBfS%%~`R z2JkP*23i%1ddp3O8u8kP`QH61as#g~-WgTNrc5`HkY#F7HO2pRqIT$m( zbh@pL5)9A`9nm2s^Yp5HaOZ4{7(G*`qTOOQ^2UT(k*H74^?_l%tRgXew+i0i3=A@t z>^Y9&SeLusGT1@$oORO9yK^sgn398EiE@Eu#onG!nbUF2!rAFuje@J`sX zG)ET6l?x+VJ^qq6CWkjg7x6x&N-P z?B-GdX5Y5FZKP7YW~oJNZzt2(RTXj5qmP;Gd;+-)XW)}g-_V*@9dBxQHsUxK8fhAO zJSi6!=o|yhx{Bp}c%^iylx$Hg5UQrzMVUhv@Y%QsgkWi%~bH8Xy7$TR!gQQ_ynCgyYZ0T zNzgn5@~dPqtruptPWd{ixOVef(M&j|Ew0__d~?K~bWgETH6GE^XA|t=vcB`U?b$Dz zgZh8cp31xbb@F(V?q$bsbP8l@PigZ8{oI*K7k$=W=k|Y7t=d(meUjm&E$o#&FfW%D zag0SXwk5tFJBNXir$>Bd8$z=j3=8tCNk<+FpR`Gz`{FPEAse}UaY8y&Jdr3%i@ zOXB>p<>jfoPDYI~=TdLAEM>v#nnB+SnDgFrz4R(s(M@trKfKra_*t9BvSX)rrz^JS zuZqbopN0qQ2<~EIExwY0Seg)0q`;a+Hm8f#ImwR_HbBnZS_5A>?-IDKl;3HtsA(Vr zX9zIAB#&@A8X{OrtWzFyZ05W!B0tc;p0WLt!(i4wES1d8L$Ijuyv=)TWr$cvb;kt> z^_smdL?K(w9S0{1iff{3Zjn`_7dh5>)m>$*7*?#ORL%P~%Ia|FpQom)L=Q5U# zT32k&A5(=Tu8-w-=97t6Vo)q_U@-H{Rgpo=854?}`7UeXA2@TwUU zLRpY=yi)EU7!qEZmo2~eaLY00zawx$Y(K<_?i&mh8BC>pVvqdsT77u%!55x!O=;Cz z_})G`Ajs7ziQ&j(+eH@HMP#((tLme6f!m|R`p)qADa___5nU}tsIp_*`~tGOBv!Un zFo7$$qmih;Sa~5NdIRJ**-;I%ltm-*Z0`K^3&^S+I2NMwz|99-D)MF0proMT3m063 z+iz&zePD9jVUlRy^hW)>zKSb7Y%X^>uV16Ps1Mg{+D#p^0|GTT4VP)OcmF6LA&?E8 z;)du;noi4l8fq@#DK*c^K0J+IwDVCG9dB;07UJrAA0@sux*06<)^_4GFuJA6Xzdz% zd{fqf)_+E+r5r_nV4pj=OlzE4=20krf7~S>pf3-Pd-h^lCRHP1bU~& z5qnvwY~SkLB3y5WO~Eq?&Z3vmKK&;O?(JkXvjXMOX5mf1zE>gWtAe#fp_g1^46H`d z_0B3Yd+$2P)htfsYfekJFZ1Z8wUgGP8^3iSzRHX{6DgyKbxw|8>ulWrfl#QGGcI6r zh?#RSvSLM3ms>m{XiG+1SA4zeU6GiSdD9T3?N zZ{u^}lEY1tjsrS`mag7$h38GZB3=_sHnJ93ULL{X`7k6q?SwM# z2j5*vvG&b2DwcW2T%?_T=g%maAM{huCWD1Kf!-sy99M-sA}})|%jn3FxoJl%_PVIM zpI&YQ@0_y>67-c^!VqV|M8?Eub5vrR88C(6-v*k?xI{@=z?1|Et9O*txr0gkukZ_J zqHe<)-l5iiV*l0;&&}~P!5}qFCAMv!m7XYT$NnAGc$GU+?4b-J@oIn~e4e4*#UOT@ zv2H6^r;4{v2#(LS;jxOB?d<{pwf!4>Fhbme-780QeuFWe-4Y(qJ4*l9{g7Ap8m`SE z*a%i~I?(vuJ+Hd^XOXX@(4c$z1WqJU2N}?PwVp!ciyJ!cy9Ymo62o6r*B=Ht%`A4U zt_OK_a2+S~%S2?ij?W^lgWAc??NebLrBP^?TV0?+05?F$zh0F=%FS;H$|yZk`7fvU zQ!biUQk9itf03t`ZK(DQeKzdbz3*`LEh-x(xB+m|L0!frZ1+6mcU%hk*F)X2ZGHv= zyl(Sa+N?GO2hcU1YqRtRKYDKWf&G%;6#Auc3VWQ*+Ql2UDkm)UN#bH6w#n47e3ux^ zmQb@ZRHhrkVBow=sV#d(t`h^g|8?^Uq}a8e8DMGWU}WtY0Z3d+?vK`@79tVM{~# z=YP{9)6|}2`w{-{xYwLnZB|Yewr8Pf3A9URU60h{_m{ixw+wvQ3`jiSTlY*idBVV4 zU$4W@AK3`NUMTRm@mPiUHysR9zzmylnJqTh*{T;?){}*n9F zUWg2V6W==-Li_tArdmRA_BaI&oMz@tPdFNHtMWlejdn_}XN@fsVKms;xjV?iJMvb{ z5_XNhKS{6bu_&D~V}UQXw56qw=ni}0k&xTt__QP%`vgaHylCg*qSI{6YcB% zUqQ?Ncm?3jk3ZYJ33MH-OE9u>d<`;9Z;gvhm*gQK3}T_QOw^#F7{pUyDp=7g`lwdK z7?}=TmO6VVG?={k=Z^}`?eEuV+0SxNKV+@H2ajRCl>b z%Di*Zwh~lpaFy$K-^DUyf-3ulF}SUi`I=QDALXB&Bu!+Lh%Z)6Fj)3}bECj{jvoN*aCA|;gKL*3i* zCD-$E{JfT3-*fH?9KQBlJp(W4Ut``d|3oT)(nztUGA}Vk#=3Kw00rw3?!8&N3{B)+l0g8MYq|&{Ny4W-`;)-h zI<+1K=Vt2zj0Ww}wp{Ky;4tN%J>QN1kTpo)>4&#V`Wos#sNOOmu^PnFBgf~KO?uN! zljOVU@36&Nq+ui@N%i9zcT;AidV(yhIvf4cF)V4%3dgM+Ge9aQH%|EN2V_Opsvn{#2FLQ<2w2hw!meuT)Jhy469l7uk~I?_$_&pLE2*et)yKhRr~g`-65b z_Wnemi_WzsuF6G?w+~^9f=bDL(DJx=s<}4%A5;-tSCxFkR9q@TD?dPf-)9e8&dvFX z%fy0+u3zVxQ#{N^o5tNPYwF$38u+Zj_$277I?jrx#gj2@LiC*tkSIRwVs}+oJ4rGW zkl{oaKi208WNIS&Nu4^D7VVA8%hO%zRh>PWHKr?fzNfUfSCGK4gE@`udDpU3aUF`g zSR_uvVp&=vHi$ZVdCe3gJINjdFzr0 zit9v(ZHUuUxOGfCFN!E;yp4M~oS6=D5S8qUHHv9qS;Qc%Ayd5Cs}`V+rx1k<-gAQ~--AdN5D4m^qN1r0lQ znuNHYUBer0Msnnd%d5F$C4pgVcX(p*pdklNZ++DZ(;@1_s8B;~$BbfD&r1nq?LX~y zB!iBvkqXb!r&H^1)SkBEWnSf%t~O{zxU|-jJ5K^og;*W6#@ttxNJ9tPZ@9$$a0I4g zC>=BlLquJ-$DqbFWF3!rtEy_#=fUVe(>4$yAFRXx_6;0H@;@`&dQ2~(Cf#cx#brz_CSfO;!#y8s+yD}@t=$Apf!^L(?ye#Vk%5*9Wwp0JUUd(H8Ge@`CBtH+L4m!)LSO} z*tR_rhk4K9(Kh9y>1&3yG>@1KYw5Iz3u5saI~oNk>35$vb)HKXzjZvy%Vu`7ondlTYv|ro z=^IhX+U|DP&!mV^@rj>7gf3K}ne?=O{G8{QtGScMDwPuHs9uGWrB=1T&cl=ChkB@1 z>vZ^HVzXlqE2hTjsu?P6;)+L;H7ksQce%($;;Dna!cdP$-~Je%dpXYH9^KGT2fe1F z!eYht~W&#TXX|3jW`p0GP8Q4W!R%M4;_gyXyN=B9%rE(2h8O|JNGo@m|Hg^H`0 z`*n~>uMc#F-yE>Z*a23n*%;r!<+B=d=RHc%L$*fww{OpjmR%?M-cn(Ma(~^k&kfpH4T-FjQu>yZavQ?!j|=?0tQc zWnDYb&+#UwIFl-ZmBWo1#rR0V!<#JQNb-8q#yRYdR+(oi$aNSJ&Y3A`jVf*}OFC4i zOJ+zmn&mt`>*tzx8^G^8xFHu*fB+rt=6tx5i`)Pog?z%R+MM z&h%gb>71g=0s%W4TnGPMvrlkeo}1piRo?m}FkY{fAKLDe*|@^|7wIVZb|=7wKhdSU z&Spil3zeNzDc%K>#txlEiZOo}*2bbK`iNi(VK){Jd|#7S*LScZK@A!#yNj)TS3JDE z+PEZcls_v9e`Wu9Qjz7zP zvRF~6udRKv2m9`QqlvVMrhkGko~QM3q@!!g|OU^|q5|oK|Q$?Fj;=SeA!mq$z5Y2==?;d`cC${c(t?n4pkN!+Ry>L8{*4oufA+kUZXCbK_2A4D;oO0KnDgOqNj*~ z@NS0UZ&TvMezBiCnZpF){7FW!+`Y%x5>+;rr#Lk4`vCAr%?rTmffKh@khiTnM+R`6 z*nMIztPU78s5B>*EoJ`_L7W;&2gNg+hw(MhcR2F-b01Q&)M{m^jTrlVnVn(V(Ihcj z51&RCZN=J^5Q8=jBKKZfO)#=Q zshlkso!*E2eF^_Jc=~?N@b_PXpL2Zpf0CwY-oyd61c_=J8IBhCjXZ!?LSGp#g(9*u zS}O&l!e)1e^?dI9UMzhy%}{SP4|=QN`AQCmodu&>^f?agGZ99H5BwHwDWcB zd7$!#4G1TbVfhBvI|F(=sG^8r_2)%niu9a zS39Ycx&N-sIy{_%Tbr1Kzl`q+_x@&B2Bg>%F30O<20ymz5p{$Ct;x(q7)R{eU39HP z!+L^BaVuG(?q!reA9U(EGc&d+b3BS-ZTY%FC{u7(F13qUfH$M8>0=#OA1EH+68A)h zcO}?<=q`d7rG^<9b2}efapVdf%aw1);9{bhhy|iGuN?=dC@gpru zF4KCkpO?IFt3O1dXu=j@DTs5QeBfToOdgA;*Kx;*lo*Npfs1Q{YDQC}+!g?*BMVk( zt57GpHhyz&+C>}w6dcP|ACHKDkfqbStM`-0+~bnM_;BLD*9dHs;ri(+%o(|B=TwTL z1HVs!_S4u+kqeoKR|$67B-d*KLCC%yo+Ue<18*Tu$-s*8cKRj(FOHr0S&}ruJl}3h zs6H(31AL&+Zh5og@Ybl%an$Mg@SRSN&|N~C$fbj(u=&|nD)HA_RAA4EsPH9D{F@-{ zH^FN#rgxynp36})n}HKGUn&q0$v=r@z#mHDi8^w=30qiLzsuKSny8UQ?2uSF5n?75zs7qm1}QCw%zmcvA4ybdi*qc z%{e#1M6Vj#M;^Ci=R>9=_fdit!FkEV1iD5TRRPX*KhvJd0W(CC*#zq(7wy zX-c0nW9cLZ2wiFRw8zXLV|>4S=$m;FFRcYrlFSw?bt`L`r6wqq&r0Mhlht7AT_PP4 zLRur>VT&n})L*l7afYR|{F3$Qwxj-NyU6EAhdZ>`b#*Sg4ezU9FL?<6vpzp)!=_`7 zPG)eudG-5|8r&hrfNA`B(y_keJmKIgGQ|I`3qa)gD^T7+c1wvi`+yiPDccK6+8E)? z%=Rgt+w=A&-b|=n_ng#Mu!vzJ=k@bgTA7pZ&S(a`pV8wr!PC4|lo?wmP|T$Gvw!b! z!k)zk2#r}4t-q#|{MvM+Qw{8v&O!DKRG8p|)kfm0D;JE2Y0KNIlQZtTucue?(kRKL z4CE$fS@O^g5oP4P-J#CNw-ncv~no3aSh)-jo z!S!Nr-bi^#<@JpXjoem~a3Pkr`9=qVoE|qFgPi#4OrmLm?R!x|Y-=0VGble zGoo+1E>6!Yc!?N6XG0P!m@P4uI)hN9#cXs!COB?Nqe2?6Su(5PPl34r#AxCDCg_vp+;oBbV zmiStdjJj1ZD4z02MJpHHhEUT(9=}k-l8F4UQI}H_P&@xVqlrTn(>nqv{>aEz9{IUt zF^Si{rP}9g8f5YM(XIop)}*De;$UOjB(Lct^zQ~f{;1qS8}Z2kW6<$?re|zK9yjoN z1^Ihz+Y1LWV!jGlFix*3-_V^s0!4*#6gp}Lg^aru$@#~TPwu@WFyqDg$E3}SX(g4( zVGlr%r28fqH8W7G{}7M3>#Pin=G7tjMzDEwC6>yv_&apkm>mZF9F*{1y?*JXR5%q<1Re&y&MJzm9P-B%DLkIj% z9OmOVLE~!bp89;eJ0+*fjEpc!>{+x6n zkS^YkrLyY`7WzwRD8nj!jCH6N2)h3GcJ3cQZ4?ZgIB4At*jydZ%(SQHts4?AX~K!U zvI@@{KF9jje5AiSViY_h)e^LQ|KkgTf;FYGoP809=XM>4qZhYyw?odwek)wtw^Iy@ z2U%BS3`)aS-D)lCLt^i4EtX)YXJ61OMgOIb4at;?*Dl1P*SB07M<0A8i(MVu0fnVAj?`fgIXSfkJ z1+O%Xb-?$}SJwe1br}5nOs|t%Yj8Xnm{)Ics}*QTXp!8PdG|`K5D=?M>|h^BluRS()_fO-DqhF!UN9JG^3@w-FR6A8H;=__V_qcPypg@*^j2MF$Ih={)YALdBm_(8fO{ z$js0U?*^rWy4pJ}nR>4WW$eCpa^zCmuVWlqGmSl|$6b14RX@aY8K=ESu|^RwoZCcn z$7pym-nY36*tEyH^qE6-#jv+Es3a1yaKvZ1*>+!`W+E_X{;Vn;31rruKakLwLwbG= zwKihC1?tD&vND)@bFNBclf)Fs&$DSRe=@1{+MU}yuc^x}rG{SZ^QJ>veA=*I6ydi! z%1`6v+cyt6tgb`{rN0AjKJ2B+C}x`^#x7e=9iUVIa8GL=W+D2a>fc!D}F*_z>qB)Q3W)i5kA4{7Q3=zK2q ze>W;k+^)&|(z6Z*^2|8639$k?8eD$Jq!@1G^QroL7A_p980c)!Zc(94SeFPB7G1AC z)AcXv3b{St~&q9_^kLxnZn0fOq zQVy3I9%WwAMY9*}qCwOdiN_!BBgCr@vBtkkx&09!cLYTEPYxJ-hfS;h*;s0f>vZ-H z@FX2>gF56y#ixeBIh*i{Y%=^`6@EGwcrq37iVppK8qkQoe_>$m=7Yr7Ym$5KvXNIf z(3~GnUq_YKjOmnegpi1Y*Eu2mz)A!*4wD$j{(WnhEEnNGLW6(=IXd*b!Po9>46K_Z zoz_cdQCFy1^oWx7i4{%hhl14c(i*}}qIjks)(i^kCSxr1|7Y=VXooeW;(UasXwhHz zY=0z>Qg5y{87~l>1bsPydsB*GwR7nriMjc_pzD3!Q%)VxstvK+&1Hf*uV|EFK3*q_ zfOXq2_7$+fo42^`(YFyB&YyoiviiMHEo^9edw$r=5eRc@4n{}V4usmr$|CcoqSaD8 zF?xL^)}8DcAF6nn{P9@HkdaQ`u7Y$&jKee;{6oVV7t(jnQ1PbL5X>bLUqX@SVL;@j zuu@&;eS!;!cn8Hb=!wU zhQ?4b3g|HWGP>ELfr~N3N_W1QbNkh=P&9@~1+a^L>b1W+H(o~l&XtYMT`z2@^_-%_ zjY(4Z)@ZX~q{EtuDi%$5pFMk6iQmxfQ!WzL?=DAuG3M;V-IuAOtJ8zc{KAz(d1}{O z$qQp`GC4krd;2On^SFg;kWrtZ?Y%ko8;dPpq+noplBOd*esNDYc1GjwZ6~l_PrjZS z_MoQr8F(PLI!^bhl|YbBdOOeXHE>UDswRb~atRKr`V2nxy+S|JFB6=}67mQ@{5G59!6#?9tkbuxTVST-iW-9=AJ zwqtMf-TO1ze(xQQ6L%mqn)8JerkH4|&~~|f`@E=b8%hX|QA#OZpsrcf>VpO{m2NJj5+?V;)ya;`MK3!*fOK4=ssfX&qp*y{ zGvDrSBMpQWT9U}8E$hxd63eNmx&3RU8bu*D2L{Ewz7|%G7?ON~&_&S##QaG3>!sg| zs+=%eQnwJYsyDV=W=W;pvjMf|?+|>(KPx>~OL4+Z{>hD-W)?2OuOV9pU1-+|)s1e8 zCZqH2bZS;RpNFOIda^iPV*@z~Kj&PBEBI-k%O zK|YV<7bw!~=LjcSLx%~r*xd??CRMWNAlTTZox{(R@IkN0l`bfxAYyCNn?oxjlN-2VRh7l^;^N|u@?#pr;O6l@ z3tpZanpqp*bUdDVVry;>%;fqT@R8q51vC&~?u;OyGL#j9psJ#Tww3_0AWcO9Tq4Lu zFiva@fE3->8X7quClqpG4N?S{q172gsvJo`4~K{0eJx8zyzMD@!bKq zGdtksPiYbOMlg;IO->H~4*;4xAhS5J_E{W0=N161jcko>pdaZyA$#j5H=(z9H#~GU z{0>-Va&B^Sa%6F65Ay+0RZ`{%-;*mFoAVEKd-6yawt@Ml0c0z)<6CuUzY9JCzP33r zv=(^)^W^SZoyHgez~a!v-uC1X@e6onZ}I4!MJI>GX7)D|kaqyl#Ows31&ou^cfiNs zZ#CC{4f0)n6?=1A+xz?0_N{%@|HR<%2BeA2RK&pWC&KdR8*zJP2rclkUNf^0Z)(xMYvgbHztP-CbZcu+Vr=-p5AnFb?;1>EZ2|GTzzM+Ltrj)0IDh>3 z#Msc*@qcsI`n9Zre-dx~fXQxbpBB*#wVU9qGchxN2wEJH8Xds_QfPBzX8_8?*YSBj zwCe4kK{&OvHiGy&zq@Jxz|hRk{TC}Uv@$g|e?)=D_*4nB5Bk*a1=siAnI)worXsAD zztNyy?S)I@1RT|#8~!J+_Nx=yfPcpi=rIuyx!eQMfv3>u0fDK}r^mm(BqOs^chCAE z-`EkS`R1O)=Hk%q0e9lNGc^9{fA;(Q^7?TI5{2>07vN|}p z{1U(3fIcce_viiRcpy&TnFKWS8<`Ja+GVC?-0KGCFfoyruir+2I1r8Wb?RS<_xh&m zr|GY@(cL=_rCcG6hC%1GtH!@0zpnCOZvGeOX{@U1P!~k;1K}}c-1x4!Pvqpgegw&W zkLUlCXDRBZIXh)3a_MKVzP630s6IvM8A6cxH*pT>?k&G3b)J71C+=?&ePorcjTpBT zu?7~bpycEzk>l^~D?Y=(!9Tm}3cKGPE}M)GDLrBve3RuRl5%)qaQ{}adj$DAow!tI z%vr6~3dyRvJ&*Y5I}noh$7~9lOY)l$Gkc+f@0p-!F~+C5bVEY@q6~i$2?XSMh`1`r ziuJeq2z+J3?2-IVHmb9zJ<*$+@C2gWUnvzGRGax&-PsX(hUs6@%r87No zuJ8^)S+bS&gUOm^dEFGotYX%DveW!*ScFIH#bXnS=j%=7i_`q?U> zmRYls%K3mdt|m;T5}HM!aByjL41_xs!~9ly!%=r)QvJ^=)WA-b(oW5{mG)iUMcztr(#s$`#Sa11eJ1|e5iKAyP@eW!W)!Vc(@z06L z2VcRT+xz>hD+Cs)Ht>sty!aMVf{H9I$%JHlG%G$Vc9n&mKz}1wWD=75FbpJ z_lIy&pnsOJCO13_2k!((!V_N&znJx&uzPbar#b%$%7#A6pfYXqVn(L`bm9%ZDeTz% zv_rAIa(olvLg}p&ghc8{hw_0D6=q0!RvZ_o zN52&xdGpXtFGQbsik<+=4OFhdyTqTSTucO2W%FXjlR*|q(JgC8;yI6%<}otPLW(rl zV7VLmfI#e+cR2ZRv>ubr;QD!+whoo~RSH5Qps&aNe6+z*F`(J@N= z(&I%~-+Z}Le5r~qs#GmLu{5;D^Dv@tJ_gG7`oIpz0{3x^3t&At3}{tMsIxWD+Le-Y zUaAAs@GeKC)6-#oWM%y|Z|>Z5l;edL4kXv+FvGFip_JW=LdnO9O}NFC;Mos4 zQws03te{BZAm)bu^>RsJ3ej+cDd{bDKDF;qwz|=;AI*U<-?&Kl`4{{}bKhfe?cij- zGjM6^qCcSo;VPeXoFAbw38*IL>RImMjmm?Vmk^^mubZ#GWwx$M z*6Wnteu|jq7}_gJ)rO!%8=`srhY5!pRP{Axj#ZyFZm{#1Q{*eHO0psMX&T&5 z?EyiMQu3I)#a1+L5tLtCP?Pv8#y@N3p{##>Y&UtHwjES)iwwyGn?85rlgXyF+iiV0r$==>ejqqrBR*l##HFG5yqP3h|p+X(OCMXkW6_oEyq11 zTAc3oPM}o~6a2IzJdN|sg*UgfXRFS*cT5WZ*uue~!cs|lU%jp^qs-?eduD}z-i5iDu~_DhFBcR7aqp^z z#2^_?_O5&-tMRi+8fTLeb(&yN+NEj2(bk(Khm;5Mb zbC!RaJ?liec$}}?GhMvT)&(^v*^0f({P!Z zCFUabB5aaR?pPh*rivjxw*TY#a=@+Ut3Z^(%nFpL7@iBac=T|)NrOXPP^gCO_k?xW z_cL!CiP4%*QRQp2te*e`5U{<=KjNUc0s}-E;Gi7Hr4r({0VQN(-r6(du&M2u(U}$! zhsZp)L9Go8=PZ7;*a|z3-08`_9rby9wCcj!v_Lm$_&S-(lI4ELbetn|;Ge{RjuBLG zwKA49mR_g$w{Pum%-#S}(_vjXV3m8_y&VWkYfrvHc}JVHProbA1uik8hA0PrQ@nKO zEzGky2fmLAVeHtBrJcpsubBP<1y>o1Nk|y%%cFQtsnaw$p?5bJShcFvXq87=pvu0c z{m47f){l9O;cDi|>PT*nVs_?bg)wO{c^y$V#NXOC8>H6qXANXUowEEfOifqa`N1kJ zuM?^h`U7o0Fm`@>(KqL8;o^cNf#T!OS1`j!_pCLV#6imWx_moDyOD`^Rl@yhIUBq~ z@^QVxpMTrXYa=!!z5np0NY$Nvo4DX83imTs?oARQCatk9?=|Q3mEFD69X+Rgf>UPA zW0D0mLf!fwM?*s_VwNFBCTf7n5SyA<^-UA7PGV4CXXL#Te0 zy3sjFesD6mBOO%g=<-fN<}p-5(bhl^ymr0IWtLA^bacV$nXFxuf?_VM1mKhvz{C}|l=YS?zT`AD z0q)O}XJWL^+zgAL@Iw+mcB)%X1Av#*e=EPlJbbGqX++h40zx?zqjq)^ZCWGrjand7 zO(xo-*SKov>GCDy3!a@4@crP)oI(3W?V!@?5uH4$6A^R~Hr<=vS7t7Xo#=7OpA%)> zJ7~aN+-384JZ^N51sc)(EL1?Le<(tkz+ADGg+bQC?LkiO(8g)z#{bTB8<=%}E%1Uh z>jDGWepIxCod*MzdTT`hB89G4edZPy>Z7cyC3>eWE~Ipw^^(ymxYLbKGR#Jf&#gM- z$m0k=3^);G+lRb{D&_HpVm9nv#z%cW%y{&RhI4G1I;(&pxHf@>gM3T*@rla5PzeX0 z9MN7aqR2|=Sz6$@Y-KD+4|T0Wcg@wqAA5r4v|=KwM#`|k*FvMPQRVQHOdGDeS=Sv5 zMKrec9y}TGj~YVeJs{E)s{O9T&e9BTA}@~op>51!8T3(H9b6jJF6h@P$ERKOSe57W z2jZzAWnyQne+2@stnExf=PVAq&z>ssx$?#KP4^#I+d-#vr8WD|?6gxk?CL-q>3-Y; zA-6^J*^eU&&o!wN6yhCD;KhFw7J01v9O9{IK9DEGJx2U2(YHKPc}BCTfbK7Nu6psU zg^~Sd=!<2^UOtz=QT&Ug8Vi$&bL-rKzA7citY7j1M0spajs#3dMPYI^)Is1b`Ye zBrF;WVrA1;rx$-W;IHuTtWQiAO0AaAMQQt#&S~Nn0Sp#ycS7M8n$gU4Y>4RO?X^C~ zz~nZKG*TH7-o4IW#RhR%@!}~YWFDKP1n7H*9IfG+e=Hz6Z-y~RY-nu*^d=O8Dc4P-%y(x(M`y`$<|UPTQ10DAU5Nc>jxh z3Gqr!fcj;8hoyVIbGJi|0t-t8qPkt*KVkDky0D}v!GNio!Hci>xs-DA2sQZ5t?RQQ zdTfVt5s*QbKhGbUI-|7A4cE}z&E0*ul}PcD%aoM7JiJMTa&b;((`B4T&Ggt8Ui~!9 z7z8%H8tdPWSEp7|U)T<~n9cjiAH=GlD}w&ZrE*V=?j0h2&T$Rh+iM?V@5m z|C5Jtp@xbhEr%DTZ*HAn=M?XxxbQfn+!Q%ekIIGR$Y`8Q2TP|cDzQj++5=uwli&L^ zU5;Q_`rNh9kMz*1A?*Hv{FHEiie;2Yaa{zNH<)Zp2_$TN5AD``|5xtY6gNmH6P>eQ zYQ}Cmj`>2cWj$(VsHEoN98Yvm-YD}~8+-~^B|tx@*UEO+(M!ShgSc*GXU%KL$FHl6B$^iMcyZY*l6zI z+2sHvc>Ml8R#Z62#o-=a@fkU}#u`yG=(GHKV~LG}YITsc}A z{N*uD^Z8mMK@)o>hvFjNBA=kEAc!~L>O8spS-LYK5hsEb8UN`|&TZgI@7(5Oa5?Bs zPFK!UmAxX&PE32)jZW@_kTc&1zw$nx(#D9}!<@6uX*Yd$aJ+*;yv#s;DejOV;96%R zp@E3y)P7+C`D%9O_5;X_kG*3feV}?UYGM;hq`C2zx;i2;=;F>~AhCp=>!9~yRAATNMj;kYQD65E z;)y`Jd*zekrl{=ir5se{=YqUcV2Dpz=~L93G%3))9o-KH-Za>*MIqR#r`j zTs)86W8xu|ADnBKw@;XHe4va{No#0SdxzQar=jE(WH>TGT1&J1_4!$qyS|E@KGCd5 zsNQLES@vL{l$3IvJjLm=NvQ624XY zTw2!`@;BoA>+4IOS9WV_rqHU#Hcm>uz%wUA4P%zZvILO-H}|BV{MozV+q6jw0oL2WWCA9+@;xMVJ_2#dezvF_HGn|>dR>x4&gJ<2~bD2Z#rlg>IgQ+nXVbIA7)un z4CXHlf`fhmMlJ_#cXf`Mw|1B^;&Po(wfhT)u!G!9hq9trwC22MEX+PD?f}T+95|qPe5p*eMIgj19St4R+B*rPk!4D z^+C^{K8a?m+$)g-^q{V&Q}ti*))3)Kg2foK-9aBCrQiZSxh>m)^Uz{m~a84JX9PT(Gw1bQ^X}5TD$If#g;cA zT+KQyF_V2_rAtudcTt%9w1KoT7$q|&PEYm`VuycD8M8#=J-fWPu6QV?LJtQMDfF%YJX}-|vy7sh+oK^P#BR z(y5!b*E{pGpV56NvgB{xmkTj$&ohOrXCaJA4`b8k1U{!jTSse1BQm!_)U#pRLYwoT z?dw;Ff;%9X$cA@ZjZjXZz8FY}*T%TS?dz1{eGtSS(d5<5lkSjD!w2E)J!KD#nIQ9k z(xl=UX43_4NhD5jAAsl8w z%|%?u#`rRNO@kE+!;fD6)X^j+hPT#2Khcik;2(VStttAg2PCKTqLG4E5st_4qP8&h zvVpz9T$Wo&E@S$*2y}gxexStS{U(|RY?&hG1~<$FL!gbiM@ zhY3e6x7SchY$rY@R*;WXXI^@r#i61+H%CcT=Lk{^cn1^|8W=O8Fv`%RB0T2em*(9*L?LMrr@yPC?B#_(7C*%1 z7F04-MdwE*4!F)YLh6=?XynVMQ$;KsQvQE7U1o(eFC0(af9f2JcOo29t!07s8PcCj zr|SXER#I|D(&bXR*@6U6gF6=Y(6vNRQy7PUq9<-5C_TyzI#1;@sShV2^QO1YUv0oYXjOv$gDGRJ0Q&FB{UFy}UtjB(3&#J{d-+ zaa&I+t-Y{-0@i|j^#g{mcl(Wgwmx%2|AX4_$RqQl%f5J)_KY(r88jWKqj0>8-r+Dme}HMJ7AtVXbtQ8J zUMk~i5x~QCmYk>t{I$>=jd9+cUfJ;t*L(kIO!IKfR^AbFdygr1Ttg9`q@v!S2=ZHm zLTO5i?fJ~DJ*O#9oIMyNVr?DRQcp0AXk@o~J5dU1_&b%bis(4F_6;JJVQ*Kp`0>r( zo&B~mRio%&F^@It46YoVJ`kB|u{+$(gQYMUNvY8kx-_qadnx|}!fwkxzSh>RCy<#(P`7BTlgYa}#UO;O?v5d07l^@C# z@z&V|sali|{ykHv8sc}Bu9WRoPW|4-_a=z?F=fjv0hhUzhg|kaL?v5Z)jWFhg(Rjg zeQWVX(-PGy(TS;`A2#Qbp8!HskIMHCBg){aUVy%qCtB2Rr%>J&l(3~^sJ2lXP=ORB zT+ju5>f1~ERm4~(#r9rCcI0&JL}f71Oxek>j3RTDm3%F=oGY~;Z631v!e3N9Vn>G$iaPgqH%-sWFCfA_0nt?C1=E6 zm2EST@>97BcBwpcyoV^00E8c0W4-^O%C~=^JWwn~No5_c-PSS5Lj-Mhfrs8k1%*#Y zu+T!Z7(s~Or%V=`IiPpwW@Lnqn=Jr2j`eOn1xol+!J?zvGDRupP56}B6&;`t@^oHk80umnk2t@xAI+|eIo_UKHYZRRTNuD3@n*u;PhVd;RiIYD zCnUanfHlC~xTsr*f7}*0h;>HI@L9fpXe6@rt9IO7+q=ZG57*tcezsK+P-V^$GtbfQ zGvUuX%S)c7UfxYlJsd0q_5_Q7L-JDGsfxXRifaCNoxm_%;H*=&f%As&ryll>C+^5D zBLxvQgq#67wm<3pkTs$7BHMlm{m?v-%+ZVox2;X9ce{M4+Xxq?q{HZA2xM0z-$QN} z8@Gb200C?j1xM{mJ-Jn8EPe=(0yZ+ad}0Z1twPsO^RmBd%Ee>&>q!#dbyBND;cW>| zYi$5G4W$_Br2o=6Salp8!-2J2x(cE5^%J5bI!x)BmsOpdxoX}@DPiZ9jVFcf^vaL% zfUv!gQ{BD+SvR%?3ijeHiWyS@Jv2Q`y?8|0#5G`DR+(1Lq#BBu8j`Ht=sGm#h5lB# zzHl;ZOq=y6K7&p4m2qiJ!>s?zJNw&JU3-`gL=(L|J0XxS73CxKLpVBuUWn-h1ImDN z7p~?HM2hWZ;uI;#FD{+hU>t9ear?)ek#bMfVJU$8(}; zjXK6%88NJkfS)@`m2U;q{7fNmVmCa~G?)pz7JDk16Pnl+SBP=`lH1j~DcExt=@qyb z#5{RUu;gh7UKe^lk*~$FEUv+NwN$>0vtXHxvRbzvl*br4rvuP?U6p<2wwD}N1K>yS zr#djH5TYK2RdwXEhmy4$_QoKuZcEr;zBeQE!bq1WuLHli=DK8a*~_Q$gvvTx>rt#7 zUXNYrT$JkHD3-~D%z16>oF18eZA@s61GTeMg+Ot31UUjIn%{y0z*dJ%#VB(TWeQeu zJ`VMrG+g$TYYzszxqly{?~9=rDuV2B-!ZNkf~K$H93^uxlQRG`M_J7(082o$zj!AR zUibIURpm7Z6HXqjVzaWq$`so`n@CkhfAF|6j!gL7VST}`5}|CVtCtP6$>t;~mUkzY ztbJO#o!;-q>cBe}`~5_=^{Js-_heu)lt@;t{NLJn3#hodY+V!x5G1%upl}FQg-dV? z?(XjH9^BnMxVyW%1y68y4epQp-KV?H>AtVe9pl^{(sp`aYxdD(^dY!b-(l*<>tPFh8dLjOT!!@b{5VH%jQPZ(sa%oEkS~74Q;Z zI!w48NEd{6udL_6`SKL>ep;2uBM!(ZiYS{yVJ$$&FwjG~7-FqRdP+c5+qA2V6oc8$ZOd0cE>zxxm1&xsmR^E9=FnbxS+vXR zJf3r4R75&*^;1rGB(qqeP@`>)hOkaTkn5#@r5qpD71tR|B({9)3sB<~x1v_u@ZN16 zf3G`3JnmAPTlH*GMnQ|jWEJzu{&7-9OKdFPFL8y|096uR=DtqJ|v zyceKZ;ocPpZbDZbb@=bl@IYgb#jj?hK_x`rxI^X0B(R2}-OLu2tLE(@g5na}p zxCt)MO>Ca%P>U)%Yhr^+4KPmG;R1GM9HuJkZz7jh{gmeSBy>zG{k*R_au2>*>Mo5n z+TU=fkxBu7-E4{44t%A$C8;3L43uB#MNC$TsY_J#!p!XGQr4E>6OZ^aU*~dAQo*cGzZ> zn2HZE8caK}A5@=0h8|b%jXAOU$v93iF7fGjK->6h;SX^3DeRrrkjyS{&k$kV0J?xm zO-V^q2DS&pYbaKf;Tn?q*XXU0oW`44N)F`1?+|2uXAU)jp%u)VU!jpdy=vNcN*Ge5 zgS9_0=BTq08}jQ(+)Xx4kQce#^cZVo zt?%1I^IODWl+~ri<5mA^EHH4Eus~3D3CVTco+_E=I_;BXE`J_*j-4X0z4zV#8+vXn zSZG9BuJNgT4=XpvzjmeKy2EC6#-;HgXel^>ULkKYd3l_ptMBP$}^AV;6N*+!TFsk7Fy zGKXkTyQ;2+>(^iw`Su~h7KrV7sv;!jK-@s{ol`1BQX0yht0k0i-Jl~o2lXS~KC zMI7g(tyexsS63U`Fh#-$_^7tZuFcDxFG$>TH!dDD_lmuXn8J}nJECtg?ROK5b*w9o zv_pE;t}_&V!LTQ}7OX5Q*YA))9`Kr#I_sth%L>X%Ed2fj7c|DhiTi+^dXg;oEqegV z&M8b^C>s5GIJR%wD>2sOeEr7^e&Os5t8R9Sf*e2zXPCUiZ#(t#YrheWjWTl=#l7Sw z$1Lm@gt&OvwFD&-Z;7Je94Lp~6m(a=MPk1i8|{;PrC%q_moqq{);^KPzmD2l3mxP{ zQRbi_r^IMUi0`>W3-gXGI0OiW^ew6^bdIyCK6ae&_pxYyHUJmcfAJMHG~6;! z3o~9;IN<=KM3@+6k;m(e6&YhsNJb09+y^4`D?jfn5AwC=CL~9)uu}GX|RkSd< zM-Q_F4Q4<&z;oFwPoBxynklwJ81$N?ug3Y;@@wN{Xxn{jq+#tkY#LmGbhKl%Dukvl z&uDhjzevV&u^{`kqZSvJTPhu57_st6@`M61>|;$Q=Jjd8o&UwUx|7_QyzF#ME5&x?Es zij_XpF}8AzNoyMF8*j*x+8&&o%HU~7+{QH|g8Ak^>C`VKc8N*yx)l$_AMAP#tFwt> zeG!@+hi)W`nCU=aJye*RuzC$+!w6|CI9cMZFZYQUG6|9iW!1saver8e(bbs2!vDBH z6~C)`7zw-Y8|c0ByjPGqm$AAd7)#}IiZ!mPVRwYYn<(Hs_ookcRxDqB#^(V7YPP1sr&7769idg2k z6y2d~7oJ1w&d;S5L}*ic1(d zk!!1 zya=Quekc-Y4;(MoA4?H8>6no|hYpNi9{=DD7siQ_gW39sMG{ztr=p5bHBJ7g4lz?E z&zUT0OY_Ui*dyx08MaT`7iTQ)AEyM{p>0Ctax}9p`7yU_l`K4 z5>`!P=D>OU&Uj}R*Kbxfh=_fQwSmyXoj**%^ON0D+gjm!FSp>Fa`xkb52RdF25@CR zlD0w*358$%*}4*$g-Bo!rK1F{N=n44vS%yE7mD3K_ng%`7zyn=A_iEEm3P}y45F5g zG?``KpU&%2WDd*QeFki@>}cne8m>9qi@m&fX6Rlgj-MaU9NkH{olcCg)i6p7kKEAW zvD_~s6{dkA)+PBwmm%IS*<^1U+?;;hAi6Wd8>LevaGrO*=m7(r?h})bEb#%p~ zpyZ53=+_WPUW{KO>`R1^c0*=nw%8iLnXs-okKbO_)KAfB&;SQnN;B_g{X^{g2WK)e zlNEjBRrlSkWDB8E4tpJj-cLIiw`X{o>CQ^Wz(%{mVc%et`ObE|^+BeP%hhR#+IC30 z;MuLL^G^r{swhVm2S)zt-92AuP14x>j|pMD@em`LYf%X2?k>Ak46W%=ZV0@o6Lq4( zyjbT=QW={SGA!*QhT84+n#=D#8tzJ`{E}=Zi&kUjW}y^TyQy(BDERn_{AlK^%q)tC zoBf{r{lUJS%1ygQ`dnLJgM~&eWTb)np~!%%feY;R>OPbot+sblR%Q=`RqBm66`zPH z^V}Q~;pg{eaD1;Rry%mOQdT%T;TNi}Fmi`Uz~j4hA^$Dm#R+wJFnJhNS1&z2)pd0d}bj zvMwWJqP1UyM1@Pp(0>OFWmi%Qh;>c{2zWMjI5SdS|E%U%o;)v=iRZ&q#GGWtP z_0{ss_FQI7Cv~**ul{r|wTvNWU1Lu5Q;60%w0?yXEu9v(#ZIWeh^6`r-w**m{S2Kq zM;-Y1e5|D>dSFcXt%=QKhN0q&?iYqpn1w}Wn5N+()hCD}aubbxC*hz_P77@r+}{0^ zu{6gf#2-=M35!Lm(TkX;NsBc9bR)}grREFg z%9k%_>b}%wFUtulrWI7aH>g%62t=L2IC&n`_z@DR6jm z5t3TS=fz{`+@<$W{S|&KzE36FAh%>Nz>k={dSue=k!Om!-qXXU6Jj-W?;lW=aDDnF zXD@SXCj$8_UHQ@OqT{^^i9vAYoW03*O6(wOOcIW}E|oGYLzJVK zh}HrWb`+{%-_6}K;{1rNlo&ahQGS?9Kn-$5O5Njo2PcO9SUu{Ro5&Sj&k{S4jp+BN z&~c5gqY=6uVMm!kEh~4FR8AuQwx&O3?YGYcuk`y39DIqKnf$q?_B>ZWps<|+{a zMS40XLt<613;2gd!e` zSILxLQH%%ER~|<3v(TMH#T$k+)N*+-3zgSSLGr4^Q&VquO*_}PuHR1Fw#reqOJVXw z?!9Z3wA_^-?fzB_TFQAr$VX1tKr!2Rszykw=baTIe4fzfR4(l`I#vy?at&j&G2R(i zs)t?LOyAG!uFAfS+Eom^rdFZges1wD%JHsk^KLd=e8mWmd-6@mw%-6jx7f3@(i=)> z`e+XaPc|maiUnI2nAHN-qi>E)<}WUz>ykybv>0IiyQ?LE-0q+szkc4%kWHJt8yVgL zwIw|Ga=@LKbS-J#f%jV78mg@U*GnqM6O1f9ZQ-CavqNq52kvnF-(de!_la;{=qAA~lXmecp&%uK-13qYqBmqx9my7WnXeL!h zZ|YW9SXo=CPfI?rr#?`+$jsN zaViwEszDkmryw>XOf4s=5^1p7PiQ82BwhC-M#{V8XA;uGz|k+x49Tj~D6sTh`jcq)d8 z^{=O5m>F1D|Iwis77&mD@ZUWYqin1aw^RcSX(}faok`n%yISf{4B^WQ154^pN)FC{ zCd8ZiRqXwNq+3kn7Zg504v1-VnS<$Wyp`K@&n(Zgd;8P-3(v{MUCqmhF*oD!xbr7n zGoqXgUkB(TViXk=SXo=4uduVdKhg9fuYi1?utSplG`X&;dD+0ChGovrO|rXrY0yKy zL+f>if|*yr^WuGg_#y^DijIy>=>n$qB_0X)@GubSTs=h{9tIZn)$qO^YW?^U3Gyt& zr-c}-?GA|^h#&F`jHJpX)O%?P;sdnKN*5RmIwG{m3aEaLwHaZ((^3zr2|@Vl)E%(| zSH^}6au*C71PM?F91Jo9y6aT~jQ5K_{FSmPw(RF5XlO7<9T^>D^fTxIpROY9XdoDr zusbgZ`-v4S6uc?N2ZrY5L)8~BbZ}qymM1YV>mYzPg+D*Z1?T5;?94IrkZwI*6G}Mv zE)nLr`DaGyGCbr*Y8L3wAn-3RUWM?e+xMk;YuK64QF=ZykkDVDwyHYy*!{riWIn(l zUUd%+#ASc~zGmv8_YG#DlK~m}TXzL-9Xx(`_qyr%a;MZ@B?tIxt{VUj>h}I5;;H>8 zi=DR`8;DOVMnn`61>3W!-^!1IuGje>LF(7%>s6}!2sS7U zjO!fXd@mh*{XGIQc-JKESCsXIDxY^#U$x)8hkMYj;6VG;nf$l(9zM-PQ+1_$u6y_|b3l_S&XFyV)SZ3(@2cDPX3UUcdv zTFFFnZYJR}c=PM{kFJ?_9o@7-RJ-H4wYVknzv?Z%tXhPg!IkAB!F{+p`!YZ9CCQu4 zOV-qk*cOZj1y&X6Yj9pV+Y7^HWv*|YL)RGoAP*AI+H)9X403NzTIyK$8Vp;ITC0yjeW>6WQW`6cT5OdJe)s|ygCB1-y&3jc;_ z3#TEKs_?A5K~p-ZFQEfQ!8XH?&&vj*hH>BYiXyZ=6|HnT?84CbSA;*~y1Lm5=auFSLcH1g>3ydPcZT-ABzxJM^?`>9mM z34%QeHJS?Oco~IW7KQfk4bef=?vQLx^gwdQ`T1u6g)+?MynLQg#MzG!1E9D0h1ZYZ z_FXiIm2ma;rZcBCpR`0cEI=sj=4Z_b9>K;`Y6A4;MuFDF+$%rfbXrHgp{`HuE2HFh zA}bEK37r+#oeB@Ep34Nl1zZ!7lli<^a#7B-X|I z;7g%$U1v=q{vdkOXPSGnmv!RY+ZL^uPTS5MU<&%j&*?#{tWZAJJjXpMXBT1VuCSZsO|-)*_h9#p;xRC+;Wd%srvkc|`6SL|rG^xDHJ54cIo z|5;m;i;_?ys2)|D05vx$H;y>Z5?sDTc%pzo8#5yXb{zNQP$Gg9K9X6CnGwcdX~ta2 zk+c8;&9$e&;njwdGJevxM`7~nN#DQu9{%aO={i}y)+pOlITDaR(HA`MM-M=_wIGc( z4~xp;Iq;`6DtSG<0><#AYN@r8FGNQ1wPZ&iwfd5$2k-t^RlHEXT>t}lYYFMY{CwO& z63o0XA&uz`v1EQ1KhuQwOTn?!S@7Wv=L2-ufxUX#4+8=lSFc8C%lV-% zL{S&0i*< z4MA=M_j9ZZvl@0D%ZJ{P*Q#Hs%*l$&rBVn7@rGSbg?3kS^WB}R7CWt{lrmPwRz&H8 z_3Iu#J7hGY{us90wPmzjrz@i2F>bzU?Xp{oYt7SEwo;duD1o4S)qZ*4`ggQt}n#V%QVv%w38=rR5l2)imHl+EVF_rdT>c>xQ&x~dOw9Q`pR?m*?* zcxzSft4Lt5e4M{pbzJ4gHBq^*b8(1bfFm&9uIr7FXN-d_ z1krMG1da!<=SGGMAF*xDoEZ?4_F62xj)osk1P_xl$ka6fj*)r4X0;Bg>a%C=MW{6L z-U*>mSztIAD=x+!PXTlV_V`n|+*YI*S$2=ib2@AjB`A8%!sqb#qeX95hhruiWfc;L z`?b<275g}L@j#U99s0|#=LLHQ$5=fvn!Q>RpjML<+9E1i@-QRg=CL3{RnnNEzB@7+5^dC)($$pTc#X^5P#Qu zABBNLar41)Ec!9q-W>Y&EJBei(hhuYLjIVd(N{`&vxImdhZP&ll|xtwwf@+-yyLbB zT3gK9SDJ<~6j2PvzS*KdX2Tb58f9OftS{il1q=#zHPQM;x6wAn6fKPu#3|vajD|dO zsX8)ETD!eVr6J6Q=4zFird!(0lLr;q5^yZX&%{98a$kxW&2EXwMJZp) z|M(6C0i1Lp84i)aK%gOB6Vf02K-ZTi*nF`e?J2OIhGbV+eZZ6#6j}^_yNC0Mvn^^+ zkV6tCdb1>5a#tJJ=qF<`l_GrPpIW|FE6BvtvW`no0l=gg|=?z$Ab!EB#qlFWE-`vQ5real{7uq z5%?|mi}+1xOdmkX>}^(Gq-?|>IXA10wFN^Z`VX>{P~VJJ+Pu>(vZ=%6Q$;@M4~=0? zSi?%@9t%_-I}Y2vwh2Yy>Q}WPp+~sZQf{8>fJe15(8zZ5QTvY5Tqo zfJN@7Ye&qBxWJp4kx;wb%C}J`raN#MENgq=^n;+MZZW<)j!$q8i&4E%b6Cxm?1s~? zl*`ueyF{{!@L+T%6;Jg|hiDRnmxmO|DJACDWnE_2RK1I+vln($e@u1CIVlZoPIS34#t6SJ~1eIZVi!_Y-g@@In4;gb0I_`Ri=4 zrjNf4yr53K{DCP1mmze&dWG`GUj;y#>Or7u3hoLtRh)PBL~BKBbqac0krK0H^rtY} zVE4Xb2yf*q`kQ2e2D{sh`41Z79Hk%9e#Dtxl(j=wQ|+rme1*+B$XeQzTb$x=w8m-< zFe{)zWjKJX0aQ%=_%QJ6@bbrvVPO7zI&KJ`FNSO{UWzd(`w!w-+Zo&}#eG>XrJ~t3 zMTC1I5}b$?EmYI)@!laFHjJ(ugkzCl|nu&nP~KK96qQSPw?DLm?7 zR(-5N{oFSr5`;l&A-Z0#Bw&n~uGFgwrOuf^pl>-ep-X^FgM7eKgUmrFF=Ris-Xa^tiWwUL61g)wvIZC(x#u zy+eIIj)jhUX+pm)sg>UvS-}l4>y)h4#Yu5=kP2_9)kh(OQXS&ihkTUw z*i+j?$WGPTa~%YYoHaYNE%6A)xhdZ(@H6DXE9d=(U@J<+p9=bYv>5%C^Q23PIkz1c zzYrFR${{&dta@BOo$%BrxpZap-3_ei%jnkyL^X}XEr>q{BrOeKADux>Nn_DVOUK3? zTzaM|7B`k1Boio|G_JSfOv>}~GJ_uN`-$1zh13K-e|irnKEnYiSA=bX=8)iJQx@%U zKJIc8C7-l6^n`eL-L72dQFpHVf;-i4rd2_G!Y-K|AR)Hs@P3^&Z^`I%%B&U{inX&a zys&aUdA3-x;`$zh+@6t(Cet1E^QpT9ck7vx^9K?aH~O;mgDMlT^VHW;Agk8qjj61@ z|M^LHx7RmjJngy~>GyonUiuiLGCIDz*aliz7^;3pX%^gc#oG>^%C;qS2R(f0r-;-J z_};a;8e<<1c167^8nNOt&#tAUT)q2nxf8OT4c0o;5hm0V+nxCMW^AWv>=rlS#EH+5 zzW==ZfoLsC&^d_r^eZy^hi7&fFOS(ajc$+q%cSpS1~a7KkDvI9hZ;9q`juzaWbX}V z6qmi5R!f)?@SF9Ekv$y7ysHi9)^?f}Doufds zp;>FnX+U|uT8kzo{?a>6!q;OL`T$F>&*qwHbYN5&_614_V*d((m~ne;fk$x*>?W;7kn=qTQiA@egn&}$ z5|)_l9*t`;V{4AG14f_7S@CC;MVQ=uIu_+vBCE5pO4h>Eymr4hy;yHjSx(Li0sUCc zCpIzxmt1y$eVEIIiixsz4u+JL@=tucZ!|7BlOE@Zz*yu#EsXr1Bl$!f;-8=Xs+k{K$B(K&p))-Pt*L|(M6dkUvCJK^c zg#YAZP|C2%u5eU@Ms!}T^itY3!ffqAeSv_~l2SXa|AR{2yoT(Ux)+OlURZ!6W~nBG z$5GE!G|4!K_MtvVb4LR!iz_zqqh~y(GuBMYPu_kS_F~~&F*JwW+FE2T>|#1cM+`(=nLAg9NWJmqkgzxa75k6|>x@Ugc6bfqPanJ+PMQE{H7Oaw~0_^7%sO+=t zmX%?3T9ys5FJ+YwdZQ7$1e+iyl~*mB+|u}E){)%M2GenMp`5vm`*?Im56HW(=zK|( zn=bgp4Xo{5&h8*60;3eOHEv_P0o?Z?UO!x(`PQ|l@Uh-~zg$8u$!bF)Jj3y<;yf39 zz3e$$KUPnPYO%hf3-OIqZ)bs%Ul6!A#X=&5E6LLR5*eP#=1G+b6C82+wxi)->H$)Vd()}|$-V$L*seqJn5oNIbmU3J!^%LB$3O z{us2A1i-`ItiW!~r9nF*8~X5~K`DD%ehJW7=k0gz=B$wBMIQbwlf(%Vq|sc&M<--| z3Ch>~0Tw6Mv&|pA6^9A%_mQEjK_v5@WH!x~3szhj{$zW_&2fjlhj8S#-vY_9ITeYB zvlJCAww|(fg+HBV`{ssBIKnFPC%PUm4n@+{5SB0Nm=pECYGXIm_-&wI1siJaeKBr= z;S>4z5U!E-T&++1BX%`&D0@h#p8uM>V2;*;QdUci?~{b#;Ah=!*aXuTTLZVyvrCRB zeX8TckemdIqb7}0j16;~fdTuzF*{s$B|ZrCqXC5v{bq}v{Q}VV^NMhoM}>+{lWgN! z3^Qx(6z{5SD-q0|%cy=-$c#0O8eJT~*;(Mhe$cXXeI1of8ozYDU9 z;ujKH9_4ra#mLCsyfvT|1l^fq*@EYlPIPJs@+jAmMg=%$auAdvQ7l_A(oWsE$)O}a zA*jcURMZ;h$xfgwCR>2LBQ;jHN3;+MC_#Ry=lmO zHE%m*lS=xdC$1j;p5RDFLO+kF43-*V*sar1qaupSZd3VEY$_yhKD}xtn>#JV?DLK+ zee0g-SU2``JjP&C*HIYDK98aDiud&cq9R$@)jC@moC%&c)AAGxfr_A&8}8@l8*z^9 zImnc;%-vclM@xzG}bkpk4R9|eUIC4V{Mx*j4c`ItLjXWR{j;a$R? z+QhRNJ)MhzD;{aw8e>DFCVRPoaxh!!ikJ%nIF-LQE-Ze=G3xycY1AaFAlYU(a!>#8 zVASysUM8^p-OB_33p+dDzx$TJQlZ-_7l_<`iLok>e-k|r$SZ*%M2wt=-%y@vR=)t5 zPAB&+I9lM{l_#??uI%*23U$T&dQ)n}wP>02wfV>|EiI>X zLS!K_YGSUU<2aLG_VT-;I%~<2hrGq2QCse|q%j`+%BiF&; z)+!>}gXwlV%NFN}_nKUt(n9^_thN;!v*zQsvG)1Yua4?_D=00}-Lv+k2SVf7rbpfI zGVVjL5=DmvxX+4|$A)&)b#)8BauNFN(2^?5oR4D6b|>^kgCe`RCV_xf5Gw-jvK=B ze>9>?x0y1)H{aEUok-6KlY;06Dv7W!JS>b_eDn%s|DY;!XK&e85f*ScpMyA9>Go2!m@eP+vA!0T~26`o6bs8SPv+M|;2y7%M-@p5Yu81aJZn}-k7%WZ40rHkS9Zq#01E8?=b&Ix zzkvQvprExv+OlxipV4wD(=7U8zxJM$RY*A_s^TMIMyaOfPcE*az3kEkD}~1Uf**C` zE+WHe4Q@OOr?J znHj9b&k?=vsaxR-qya&PE0|sbVcy^yq6O2pJuIvNrvv-tL%+RM9vV~qP=gL^K4}D{l<|jTd@u&NVIT@P zj++7d?a+4;flfWTuGFs(b>_pAysdP=Mi_Mgw~%AIez1N>Kr6Z~dhfR|wCWBv`RAWV z+wbliRr1bB<7H7FE;$}F1lkh$jBG>(<=%T)l4%i1kxd|1k_MV&)Yg*w&!t}A%OPB* z!Q|rYB9RPq+EA!Wc9gYqqrHal<%(`2^msC2Ni~@;L^5AiLK;g=2~qgyVVCBnn?IZH z{OGjbhkI^)=bb|~;Gwkn0k>=;ljx}`d%Fv1lraSzw~PndU)fi{Z^utp?-cgg0JKnHD7;I{p2=r?*c_epa69mxF+pvB3+w3(1`m0e@Ovz@ zeXKV5V;FnsTRc=Yh5>g2#tNUWvPyY8?`&+FH7flMKYwtLKS$_m1nYP$a9j{CIdfCE z$g*x6eGZwE$9aM(LbGf9dnhmi{~ijgK;ZwBRrpU(kZjd_gTmlg8|&nNG7rHYP*^5y znL8Z**gEqE6c*kqE5AVjvEt*|Zzy=Vx5-BdC|j-+Ra{C|o2Fd^#@r3$ZE;uf^Y~G3V~MAQY_rLY3v9%h|^4!LlOicJi!Uo~SZnzqn=b{t3`r<>DGkIcc(la}2wg%T=@7P%ESLV%FA6LGw)#z#Q1iHy%Ffdcx+Z>W0 z@S$LFa2oKCY?p}$2j2qBpO`e+@p&ly2jSpx?|6kj;gAyp1fpp62;LB}uRI2&f+q9T zi5BP0HbCuS>Y9I{kI}5a{+0}8kVG7=hwb1*Ja24V!qe*G0oI8ahMwuqAja>lC6dJ4 zXO3e4?d(9~xW1sYiLt4$`QbuLFL<7v)0|(W9A}bf4%it2Y|(uI>OG-3`(7W0@ z29nD}{K;>O*BV38&m9-t68VX?lThArlL6etdp*sP@D~UgRQCPsdw0@s8mdGc7dRM5 z&wGc`gxne$^n|y3j=0b*pY9Mh)xp-hXIi4n|Ad9J#!Ir$Ie|AU-~k=_{s9(1e~$$= z5YvAf3yzB2R%yJyv9KhNx4rIy^?@eF&=j0x=R2ubPKomSc`CUNm<>n=3(jj}Yze8m zI!6~SjF-DO^H^&HnMM_O+D|mi^M_M}12eM^s@I;iQFL^N)m$e}Hf@(3mn-+D8^T-? z`j6XDhczwb)B{_S_7myn<>P8;as@)G`QQZMP1?M4+QyuSc)7CKPo~l#q!pf9 zi5@cgrCO(tbuF;k)l#8~bxf2jAd~`#7~i4fFAykrI>>78@nP_67J<6&V)$a@jWhUU zd1cW75{N~w{>Bc zt0$G?q$meXp9E4^6lCeX>hChH``bhyU->d2>N|{hAf$twy4V+XyAoZeu{4&zICo>} z=v?VcKkW`nkE`YuiZ)@k=^~NoPB8Ex2D+0cXCkXC^3A+aiag>E#-ET6_e??d#+J6iJyXX zOiRS&&Uj^W8F#k6Cfe|0RJ4Jr%0L`<81p&9Ak4T|v>|ziRNY{oRDJqO!;b~ghVx@m z_2aj!@e`u;XPk+HKjaMXVT8>Nkb zk%FNLEr^Z@NXNiT1xL^4=wM=PM@dDmVCrCDNU6cd%JO!xY5;*i%iqNHH{t(HOn(#W z-$eg6k@-!`e-q>1gyT2S05So8-zEQ2@;~MLwXpf$^5p-*Gx|*&eiP^4ME5tb`%Mi0 zR$k^Wyua3^`X{kpJG>1_;B87A-i9Zk`!;HTv+0`(GI6yrw6ilbqM{c! zbal42Gq9(8n}$CGO|7j2-*gdxQjmiI$iNI_W?%;aLF_;vEs%)<2&8zEle9MYXCexA zx;8e325*W@*TUZLZSoa_ROo~qEiCkOt*m~pfr5#tJ>c#0r?sE~C>h$>zcmeDqysU5 znAsUvm>Fpq=ve+^k=_ct^j(ybT*bFRf=L?_dc>F9l#?`K^KN>>U7%jO>5?^Jg|T_W!PaK2cG% zUuwYgTBz*GU5N|{023WE;MgK-af)jqSh98BI`oOrNs&)c5c=f!aCGL})sMbIYe{hS zPV{^o?Cv}RD$Kwa2U86bL{B33C`_M?z}RgwuEtGfiQ`OF{-J`Wz8Q?%6D6?M7rW!Z+FqI*1C!Iuco)6I zl^R+JRWMYMcg@sc*Jg)e3>8TpHnlWdl&3%I0cSPjGT$hs7`_}E_+X+L&Pxd)YkVuK&S)=XK5ao{+>#rp(A{CkO@2YfSoXqyCD=-(0QQoFs== z%c79y0Pp?1M+WV1;kUBp(A+HXoTF=Yqa7j$6Mz_mv^6 zZ_-5e@=}0C7sC3tVHK$a%S#n?)=$>dm8sGEVX7DQ135mRPY>SCE3!ZYE)?V9d?5`} zK7d10F^E7|0TFlMS>Qj$%LR!`4A)SROck?)>j{_!j+jhLD)nFWbWa+`XFm!c!7ipcWc+Sl$$eKW? zQETazAY3{axvzd+z%7q{!STdMr2B-|Sw;3@x&xZ;X{hk*>3b+NWyR4%Vt#pTI|R2M z`8pZhfTh=qNY7QCA(7V_WMQ-cXHZKS`n)wd1O+|nc6`e`5+!nDeiU19Y`L;8tNuye zQ(c5Jvq8cxDy@Nw=p^6b1W)1gUg?qS9`mLEpNHWLQ$H&%liruTa_X~IX!2d5h0}B2 z=7!I5V2*xn8aqh5jA;lqUnGcO&XH!yyL17#bS4sNBxYIY$$=mz1wZB|s4s1Nc{19{ zBFSz#V(GaM*wdiAfMhu|Z%{&dR)8o1M&-bs`Zr* zK5xM*Cq6~)wXKV*iC~@soL^NekS#r|Jr%lvAE>&$-++gD3^DiR^|>OI;IQ#BY{#2{dWk@M(RCW)K_BE zm69Lpvfl7fSvOIGgGo{6U*fz%#o_f#=!v$YM~AFzL_3kDOnW8iZu1T{84s$9S)Z)o zCak&;@8_J-g_hzx!)O>sf3XKnSXtrcB;158WS=w>Lz_xWS81a~)Jmhf*VyJ< z&+{W%l*ueb(?EG22n{9o6Y+H4cSfQo!gvj!2DlV+ZNN<}!bhOHw~_l=9b)I;`FP=j zs2tO@_Y=V|Z+#eD=i=*Kn5=#3ojPL9MG^59SWc?HkbJCB(P3Z-JYxw#8RF+2TylwT z5dJa9`tzoFRVmfK>WEK`qm#&!<-oFudd1>y{E%{h&!h?`V$0bmmSQ`O{zDRbzOk6)mDC-v8c!-a|WKslO_vwtDmjsKCa6H z{gIiEf(%QMiU7QiUPQ#w>Y|fs!1mnTA-A~=v$0}s>RQ5M4@+FLwb7!{uPLKK2aTn3 z+mWl}o(WmdN^8-yV!b$P5>rOGd9!9qheustWQpY56^kaZ{1Y#6%52T)K>0xv*UCr{ z`3I4M)-v30CiUb3c_-shCDNsw`Ip#U=M2oz0j&<>EmSkD4tp(BjI9pfoV+uUv&u*7 zvjwczbrD`xJA(myZ4K?751Zp%EOtsFi`C3qTzRU;%2v(aW2<8NNNi(JKSg zK>!8-=q*pq+S&oY%=%Vd?zgy+HQ*2b@b?!%fcj@aMrI)!QRECe`mz(&f-HTV2uN7Oaqu^Canb(lZmt|)-+3Q>?%%IxS^|BIk!zekcEYj zl^F~OVqgR@g8_j5iV1N1y}jPLVr2RMF89y)|Cc5iU43(1V?z$WUp4~VZ~evr_%j3U zkKmL8An6K_wAMEV$XgpZIP2OO{)PXiD3$~8yR@~{TdeyQ^Z_JwO|2Z>E<-!GKZjTx z03aPZI~@>C$m&fKnOYfh02CF3Y1!cZD*C^y1Mu1MFVDPse06%uThIrDlhAc@ zm9W+|-~hN9+QZ3NySN$~T1i>Ny>w=oKE0*ox-{x8746rZG!ybPa!(EoTF{|x^?W|qI=AIR_< z|3Dz?zw!UCNF)Fe!#7yHxd;XTJy(F;0cQc2{-1U|0|&ss`fYbR01ORG9ey)Rbgc~F z{%v&sKWzWy=>Jc(@f+f-%*_95`~!i1!9N4TZ~OyUSwUa`=6~b=U%LK(d8U*5m+F58 zCg%UL{)}%D|JMKi68%r{hg$?NaT3D$~CaoceFHoi_8De>ZVqJ|KvfyY5X=7 z?ti0Li~<+=q5tvrnT@OT>H`|_GS;Fn+b9v_n?%@CBE>Ed zNUcx9OJifZXd+@ROPhJ5jj(fZhuGXE>_z{ zb};Rb0bm^V{E!m6rQv%>b96H2|9I@(Su`DA&!ge^?PI*Ae>>Re->0+}Z1nH>K5g`W z49;N0Q&wdL4i^Ao&6(i|+}5x_XRzS8y60f-I24-S3ssenSt)`@p;i^}L>Rj&N=QY< zk^N)*P$+GHWf@48TP5-B#GDz!wQRR;zTLRrTj$7W_;2*T=>D@98;u8)zNml8LH~ph ztAFhG`VP=W|HnN4$F93L^81ei|Bv%06gTzXQP>njmz9jSmC{8A(tW>u4nGlC3T-Q| hc5AsSoDOB8YoG65%>&-h(9m$Q{08Tr;$i?2004355~2VA literal 0 HcmV?d00001 diff --git a/inst/unitTests/repo/data/experiment/src/contrib/myExpPkg_0.99.0.tar.gz b/inst/unitTests/repo/data/experiment/src/contrib/myExpPkg_0.99.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..79bb61674f4dd0c0cbf315967ab051504b8f5497 GIT binary patch literal 558 zcmV+}0@3{+iwFP!000001MOB(Yuhjo_OpJ)k-nr4ab(xB7q5(ENeYD|3u(5Ov4U#L zsfcYESuXX){`<~Jn)apZOBY)32Sz99toy|2J1(my_r+qf?vE!|qvhpdb@_E}y)r1m z_q=9w0!E*XTQJYH97Y`$xE^(Vi#o33I~Gvu2&hWKHBw2kfBU_(|4y;s(T1-@2-*H2 zkX2pabiYnk(xf<@)i6`h2FBcQKu4ivCUSFd8&>94=@7n16{$R~BBM0SxXcZHLX+=8 zmr~^+P_kldRK6?h7X9xT9%@ZG6>GdZv7GNaQ76a;S~OwW#MJ!zuq&PZf_ts6|QULd4}rWra-n zE<~=#{_^PJQkV58>$wA5#t5BvJJ&z1?Vp`fVzqcP`d{|{TZ~5I z0b|eVAFYw_|w}7?!KW6?POnZ6c`cDJ@G5=nZf0ucFTmO%NrVF~L@~CNQ w;JgRP-tL~lZvu!yW7E~`tajbfp-r^0eE(?+c#9S-TD)8Q1!9#+p8yg70D?0ai~s-t literal 0 HcmV?d00001 diff --git a/inst/unitTests/test_manuals.R b/inst/unitTests/test_manuals.R new file mode 100644 index 0000000..3987ad5 --- /dev/null +++ b/inst/unitTests/test_manuals.R @@ -0,0 +1,41 @@ +tmpRoot <- tempdir() +repoRoot <- file.path("inst", "unitTests", "repo") +bioc <- file.path(tmpRoot, "repo", "bioc") +annotation <- file.path(tmpRoot, "repo", "data", "annotation") +experiment <- file.path(tmpRoot, "repo", "data", "experiment") +srcContrib <- file.path("src", "contrib") +builds <- c("bioc", annotation, experiment) + +copyToTmp <- function() { + if (!dir.exists(tmpRoot)) + dir.create(tmpRoot) + file.copy(repoRoot, tmpRoot, recursive = TRUE) +} + +filesExist <- function(path, pkg) { + file_list <- list.files(path, recursive = TRUE) + paste0(pkg, ".html") %in% file_list && paste0(pkg, ".pdf") %in% file_list +} + +test_extractManuals <- function() { + copyToTmp() + + # check all manuals processed + # package with manual + checkEquals(extractManuals(bioc, srcContrib), + "1 / 1 tarball manuals processed") + # package without a manual + checkEquals(extractManuals(annotation, srcContrib), + "1 / 1 tarball manuals processed") + # package without a manual + checkEquals(extractManuals(experiment, srcContrib), + "1 / 1 tarball manuals processed") + + # check for both html and pdf files + myBiocPkgMan <- file.path(bioc, "manuals", "myBiocPkg", "man") + checkTrue(filesExist(myBiocPkgMan, "myBiocPkg")) + myAnnPkgMan <- file.path(annotation, "manuals", "myAnnPkg", "man") + checkTrue(filesExist(myAnnPkgMan, "myAnnPkg")) + myExpPkgMan <- file.path(experiment, "manuals", "myExpPkg", "man") + checkTrue(filesExist(myExpPkgMan, "myExpPkg")) +}