optimParallel/0000755000176200001440000000000014011252206013050 5ustar liggesusersoptimParallel/NAMESPACE0000644000176200001440000000034714011025675014303 0ustar liggesusers# Generated by roxygen2: do not edit by hand export(optimParallel) importFrom(parallel,clusterEvalQ) importFrom(parallel,clusterExport) importFrom(parallel,getDefaultCluster) importFrom(parallel,parLapply) importFrom(stats,optim) optimParallel/README.md0000644000176200001440000000105514011021512014322 0ustar liggesusersThe R package optimParallel =========================== The package provides a parallel versions of the L-BFGS-B optim method. If the evaluation of the function fn takes more than 0.1 seconds, optimParallel can significantly reduce the optimization time. For a p-parameter optimization, the speed increase is about factor 1+2p when no analytic gradient is specified and 1+2p processor cores are available. See the R Journal article https://doi.org/10.32614/RJ-2019-030 for more information. It is also available as vignette. R> vignette("optimParallel")optimParallel/man/0000755000176200001440000000000014011021512013615 5ustar liggesusersoptimParallel/man/optimParallel.Rd0000644000176200001440000002101314011022640016711 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/optimParallel.R \docType{package} \name{optimParallel} \alias{optimParallel} \alias{optimparallel} \alias{optimParallel-package} \alias{optimParallel-Package} \alias{OptimParallel-package} \alias{OptimParallel-Package} \alias{optimparallel-package} \alias{optimparallel-Package} \title{parallel version of the L-BFGS-B method of \code{\link[stats]{optim}}} \usage{ optimParallel( par, fn, gr = NULL, ..., lower = -Inf, upper = Inf, control = list(), hessian = FALSE, parallel = list() ) } \arguments{ \item{par}{see the documentation of \code{\link[stats]{optim}}.} \item{fn}{see the documentation of \code{\link[stats]{optim}}.} \item{gr}{see the documentation of \code{\link[stats]{optim}}.} \item{...}{see the documentation of \code{\link[stats]{optim}}. See section 'Notes' for more information.} \item{lower}{see the documentation of \code{\link[stats]{optim}}.} \item{upper}{see the documentation of \code{\link[stats]{optim}}.} \item{control}{see the documentation of \code{\link[stats]{optim}}.} \item{hessian}{see the documentation of \code{\link[stats]{optim}}.} \item{parallel}{is a list of additional control parameters and can supply any of the following components: \describe{ \item{\code{cl}}{ an object of class \code{"cluster"} specifying the cluster to be used for parallel execution. See \code{\link[parallel]{makeCluster}} for more information. If the argument is not specified or \code{NULL}, the default cluster is used. See \code{\link[parallel]{setDefaultCluster}} for information on how to set up a default cluster.} \item{\code{forward}}{ logical vector of length 1. If \code{FALSE} (default when loading the package), a numeric central difference approximation of the gradient defined as \eqn{(fn(x+\epsilon)-fn(x-\epsilon))/(2\epsilon)} is used, which corresponds to the gradient approximation used in \code{\link[stats]{optim}}. If \code{TRUE}, a numeric forward difference approximation of the gradient essentially defined as \eqn{(fn(x+\epsilon)-fn(x))/\epsilon} is used. This reduces the number of function calls from \eqn{1+2p} to \eqn{1+p} and can be useful if the number of available cores is smaller than \eqn{1+2p} or if the memory limit is reached. Note that the numeric central difference approximation is more accurate than the numeric forward difference approximation.} \item{\code{loginfo}}{ logical vector of length 1 with default value \code{FALSE} when loading the package. If \code{TRUE}, additional log information containing the evaluated parameters as well as return values of \code{fn} and \code{gr} is returned.} }} } \value{ Same as the return value of \code{\link[stats]{optim}}. See the documentation thereof for more information.\cr If \code{parallel=list(loginfo=TRUE)}, additional log information containing the evaluated parameters as well as the return values of \code{fn} and \code{gr} is returned. } \description{ The function provides a parallel version of the L-BFGS-B method of \code{\link[stats]{optim}}. If the evaluation time of the objective function \code{fn} is more than 0.1 sceconds, \code{optimParallel} can significantly reduce the optimization time. For a \eqn{p}-parameter optimization the speed increase is about factor \eqn{1+2p} when no analytic gradient is specified and \eqn{1+2p} processor cores are available. } \details{ \code{optimParallel} is a wrapper to \code{\link[stats]{optim}} and relies on the lexical scoping mechanism of R and the R package \pkg{parallel} to evaluate \code{fn} and its (approximate) gradient in parallel.\cr\cr Some default values of the argument \code{parallel} can be set via\cr\code{options("optimParallel.forward", "optimParallel.loginfo")}. } \section{Notes}{ \describe{ \item{1.}{If \code{fn} or \code{gr} depend on functions or methods from loaded packages, it may be necessary to explicitly load those packages in all processes of the cluster. For \code{cl} of class \code{"cluster"} one can use \code{clusterEvalQ(cl, search())} to check whether all required packages are on the search paths of all processes. If, for example, the R package \pkg{spam} is required and missing on those search paths, it can be added via \code{clusterEvalQ(cl, library("spam"))}.} \item{2.}{If \code{fn} or \code{gr} have more than one argument, it may be necessary to pass those to \code{optimParallel} via the \code{...} argument. An illustration is given in the section 'Examples'. } \item{3.}{We recommend that all R objects used by \code{fn} and/or \code{gr} are passed to \code{fn} and/or \code{gr} via arguments. In certain cases it may also work that \code{fn} and/or \code{gr} use objects from the \code{.GlobalEnv} (without having corresponding arguments). In that case it can be necessary to pass those objects to all processes of the used cluster via \code{\link[parallel]{clusterExport}}. An illustration is given in the section 'Examples'.} \item{4.}{Using parallel R code inside \code{fn} and \code{gr} can work if suitable clusters are setup (one cluster for \code{optimParallel} and one for the parallel execution of \code{fn} and \code{gr}).} \item{5.}{Using \code{optimParallel} with \eqn{n} parallel processes increases the memory usage by about factor \eqn{n} compared to a call to \code{\link[stats]{optim}}. If the memory limit is reached this may severely slowdown the optimization. Strategies to reduce memory usage are (1) kill all unused processes on the computer, (2) revise the code of \code{fn} and/or \code{gr} to reduce its memory usage, and (3) reduce the number of parallel processes by specifying the argument \code{parallel=list(forward=TRUE)} and/or setting up a cluster with less parallel processes.} } } \section{Issues and bug report}{ A list of known issues of \code{optimParallel} can be found at \url{https://github.com/florafauna/optimParallel-R/issues}. Please report issues not listed there to\eqn{\,} \email{flora.fauna.gerber@gmail.com}. Do not forget to include an R script reproducing the issue and the output of \code{sessionInfo()}. } \examples{ negll <- function(par, x, sleep=0, verbose=TRUE){ if(verbose) cat(par, "\n") Sys.sleep(sleep) -sum(dnorm(x=x, mean=par[1], sd=par[2], log=TRUE)) } set.seed(13); x <- rnorm(1000, 5, 2) cl <- makeCluster(2) # set the number of processor cores setDefaultCluster(cl=cl) # set 'cl' as default cluster optimParallel(par=c(1,1), fn=negll, x=x, lower=c(-Inf, .0001)) optimParallel(par=c(1,1), fn=negll, x=x, sleep=0, verbose=TRUE, lower=c(-Inf, .0001), parallel=list(loginfo=TRUE)) setDefaultCluster(cl=NULL); stopCluster(cl) ## default values of the argument 'parallel': options("optimParallel.forward", "optimParallel.loginfo") \dontrun{ ## - use all avilable processor cores ## - return cat() output to R prompt ## (may have issues on Windows) if(tolower(.Platform$OS.type) != "windows"){ cl <- makeCluster(spec=detectCores(), type="FORK", outfile="") } else cl <- makeCluster(spec=detectCores(), outfile="") setDefaultCluster(cl=cl) ## return log information options(optimParallel.loginfo=TRUE) ## stop if change of f(x) is smaller than 0.01 control <- list(factr=.01/.Machine$double.eps) optimParallel(par=c(1,1), fn=negll, x=x, sleep=.5, verbose=TRUE, verbose=TRUE, lower=c(-Inf, .0001), control=control) ## each step invokes 5 parallel calls to negll() optimParallel(par=c(1,1), fn=negll, x=x, sleep=.5, verbose=TRUE, lower=c(-Inf, .0001), control=control, parallel=list(forward=TRUE)) ## each step invokes 3 parallel calls to negll() ## passing objects to fn/gr (see section 'Notes') ## ---------------------------------------------- a <- 10 fn <- function(par, b) sum((par-a-b)^2) ## approach 1: clusterExport(cl, "a") optimParallel(par=1, fn=fn, b=1) ## approach 2 (recommended): ## rewrite 'fn' such that all necessary objects ## are passed as arguments fn <- function(par, a, b) sum((par-a-b)^2) optimParallel(par=1, fn=fn, a=20, b=1) setDefaultCluster(cl=NULL); stopCluster(cl) } } \references{ F. Gerber, R. Furrer (2019) optimParallel: An R package providing a parallel version of the L-BFGS-B optimization method. The R Journal, 11(1):352-358, https://doi.org/10.32614/RJ-2019-030 Also available as vignette of this package \code{vignette("optimParallel")}. } \seealso{ \code{\link[stats]{optim}}, \code{\link[parallel]{makeCluster}}, \code{\link[parallel]{setDefaultCluster}}, \code{\link[parallel]{stopCluster}}, \code{\link[parallel]{detectCores}}. } \author{ Florian Gerber, \email{flora.fauna.gerber@gmail.com}, \url{https://user.math.uzh.ch/gerber}. } \keyword{package} optimParallel/DESCRIPTION0000644000176200001440000000213214011252206014554 0ustar liggesusersPackage: optimParallel Type: Package Title: Parallel Version of the L-BFGS-B Optimization Method Version: 1.0-2 Date: 2021-02-10 Authors@R: c(person("Florian", "Gerber", role = c("aut", "cre"), email = "flora.fauna.gerber@gmail.com", comment = c(ORCID = "0000-0001-8545-5263"))) Maintainer: Florian Gerber Description: Provides a parallel version of the L-BFGS-B method of optim(). The main function of the package is optimParallel(), which has the same usage and output as optim(). Using optimParallel() can significantly reduce the optimization time. License: GPL (>= 2) URL: https://github.com/florafauna/optimParallel-R BugReports: https://github.com/florafauna/optimParallel-R/issues Depends: R (>= 3.5), stats, parallel Suggests: R.rsp, roxygen2, spam, microbenchmark, testthat, ggplot2, numDeriv, lbfgsb3c VignetteBuilder: R.rsp RoxygenNote: 7.1.1 NeedsCompilation: no Packaged: 2021-02-10 18:53:50 UTC; fl Author: Florian Gerber [aut, cre] () Repository: CRAN Date/Publication: 2021-02-11 16:00:06 UTC optimParallel/build/0000755000176200001440000000000014011025676014160 5ustar liggesusersoptimParallel/build/vignette.rds0000644000176200001440000000040514011025676016516 0ustar liggesusersePMk1~/*T{EZ[kpg17K6 :Ѥc ͼ0b xOtmq-P TVe&߂i.=_NtWn=~=L=p;:4{j W#j\dR77љM`na:RA`?I֋܇цa~˅ѧ,81tqE+P"+ ;|c%optimParallel/tests/0000755000176200001440000000000014011021512014204 5ustar liggesusersoptimParallel/tests/testthat/0000755000176200001440000000000014011021512016044 5ustar liggesusersoptimParallel/tests/testthat/test-issues.R0000644000176200001440000000565414011021512020471 0ustar liggesusers## rm(list=ls()) ## library("testthat") ## library("optimParallel", lib.loc = "../../../lib/") source("testsetup.R") context("test-issues") control <- structure(list(maxit = 10, factr = 2.22044604925031e-16), .Names = c("maxit","factr")) FN1 <- function(par, sleep){ Sys.sleep(sleep) sum(par^2) } GR1 <- function(par, sleep){ Sys.sleep(sleep) 2*par } test_that("optimParallel",{ compareOptim(list(par=c(1,2,3), fn=FN1, gr=GR1, sleep=0, control=control), verbose=verbose) }) FN2 <- function(par, sleep){ Sys.sleep(sleep) par["a"]^2+par["b"]^2 } GR2 <- function(par, sleep){ Sys.sleep(sleep) 2*c(par["a"],par["b"]) } FN3 <- function(par, sleep){ Sys.sleep(sleep) par["a"]^2 } GR3 <- function(par, sleep){ Sys.sleep(sleep) 2*c(par["a"]) } test_that("optimParallel - named arguments",{ compareOptim(list(par=c(a=1,b=2), fn=FN2, sleep=0, control=control), verbose=verbose) compareOptim(list(par=c(a=1,b=2), fn=FN2, gr= GR2, sleep=0, control=control), verbose=verbose) compareOptim(list(par=c(a=1), fn=FN3, sleep=0, control=control), verbose=verbose) compareOptim(list(par=c(a=1), fn=FN3, gr= GR3, sleep=0, control=control), verbose=verbose) }) test_that("optimParallel - use compiled code from other packages",{ compareOptim(list(par=c(a=1), fn=dnorm, control=control), verbose=verbose) compareOptim(list(par=c(a=1), fn=dnorm, mean=1, control=control), verbose=verbose) }) FN4 <- function(par, a, sleep=0){ Sys.sleep(sleep) sum(10*par^2) + a } GR4 <- function(par, b, sleep=0){ Sys.sleep(sleep) b*2*par } test_that("optimParallel - fn and gr can have different aguments",{ expect_equal(optimParallel(par=1, fn=FN4, gr=GR4, a=1, b=10, sleep=0, control=control)$par, 0) }) test_that("optimParallel return correct sign of hessian if 'fnscale=-1'", { set.seed(13) x <- rnorm(1000, 5, 2) negll <- function(par, x) { -sum(dnorm(x=x, mean=par[1], sd=par[2], log=TRUE)) } posll <- function(par, x) { sum(dnorm(x=x, mean=par[1], sd=par[2], log=TRUE)) } compareOptim(list(par=c(1,1), fn=negll, x=x, control=control, hessian=TRUE), verbose=verbose) compareOptim(list(par=c(1,1), fn=posll, x=x, control=c(control, fnscale=-1), hessian=TRUE), verbose=verbose) }) test_that("fn can have normal and ... aguments", { fn <- function(par, data, ...) par^2 compareOptim(list(par=1, fn=fn, data=1:10, control=control), verbose=verbose) }) optimParallel/tests/testthat/test-spam.R0000644000176200001440000000456314011021512020114 0ustar liggesusers## rm(list=ls()) ## library("testthat") ## library("optimParallel", lib.loc = "../../../lib/") source("testsetup.R") context("test-spam") control <- structure(list(maxit = 10, factr = 2.22044604925031e-16), .Names = c("maxit","factr")) test_that("optimParallel - mle.spam",{ skip_if_not(require("spam"), message="spam not available for testing dispatching to loaded packages") clusterEvalQ(getDefaultCluster(), require("spam")) truebeta <- c(1,2,.2) truetheta <- c(.5,2,.02) x <- seq(0,1,l=5) locs <- expand.grid(x, x) X <- as.matrix(cbind(1,locs)) distmat <- nearest.dist( locs, upper=NULL) Sigma <- cov.sph(distmat, truetheta) set.seed(15) y <- c(rmvnorm.spam(1, X %*% truebeta, Sigma)) mle_optimParallel <- function (y, X, distmat, Covariance, beta0, theta0, thetalower, thetaupper, optim.control = NULL, Rstruct = NULL, hessian = FALSE, ...) { if (!is(Rstruct, "spam.chol.NgPeyton")) { Sigma <- do.call(Covariance, list(distmat, c(thetaupper[1], theta0[-1]))) if (!is.spam(Sigma)) stop("\"Covariance\" should return a spam object.") Rstruct <- chol.spam(Sigma, ...) } p <- dim(X)[2] n <- length(y) neg2loglikelihood <- function(fulltheta) { Sigma <- do.call(Covariance, list(distmat, fulltheta[-(1:p)])) cholS <- update.spam.chol.NgPeyton(Rstruct, Sigma) resid <- y - X %*% fulltheta[1:p] return(n * log(2 * pi) + 2 * c(determinant.spam.chol.NgPeyton(cholS)$modulus) + sum(resid * solve.spam(cholS, resid))) } return(optimParallel(c(beta0, theta0), neg2loglikelihood, method = "L-BFGS-B", control = optim.control, lower = c(rep(-Inf, p), thetalower), upper = c(rep(Inf, p), thetaupper), hessian = hessian)) } expect_equal(mle.spam(y, X, distmat, cov.sph, truebeta, truetheta,thetalower=c(0,0,0),thetaupper=c(1,Inf,Inf)), mle_optimParallel(y, X, distmat, cov.sph, truebeta, truetheta,thetalower=c(0,0,0),thetaupper=c(1,Inf,Inf))) }) optimParallel/tests/testthat/test-optimParallel.R0000644000176200001440000001436414011021512021761 0ustar liggesusers## rm(list=ls()) ## library("testthat") ## library("optimParallel", lib.loc = "../../../lib/") context("test-optimParallel") source("testsetup.R") x <- rnorm(1000, 2, .4) f1 <- function(par, x){ # print(par) -sum(dnorm(x, par[1], par[2], log=TRUE)) } f2 <- function(par, y){ # print(y) -sum(dnorm(y, par[1], par[2], log=TRUE)) } f3 <- function(par){ -sum(par) } f4 <- function(par){ # cat("f:", par, "\n") # Sys.sleep(1) sum(par^2) } g4 <- function(par){ # cat("g:", par,"\n") # Sys.sleep(1) 2*par } f5 <- function(par, a){ # cat("f:", par, "\n") # Sys.sleep(1) sum(par^2)+a } g5 <- function(par, a){ # cat("g:", par,"\n") # print(a) # Sys.sleep(1) 2*par } f6 <- function(par){ par[1]^2+(1-par[2])^2 } f7 <- function(x, ...){ dots <- list(...) if(!identical(dots, list())) return(sum((x-dots[[1]])^2)) sum(x^2) } f8 <- function(zz, x){ # print(par) -sum(dnorm(x, zz[1], zz[2], log=TRUE)) } test_that("optimParallel",{ compareOptim(list(par=c(2,1), fn=f1, x=x, lower=c(-Inf,0.001), control=list(factr=factr)), verbose=verbose) compareOptim(list(par=c(2,1), fn=f1, x=x, lower=c(-Inf,0.001), control=list(factr=factr)), parallel=list(forward=TRUE), verbose=verbose, tolerance=1e-2) compareOptim(list(par=c(12,100), fn=f1, x=x, lower=c(-Inf,0.001), control=list(factr=factr)), verbose=verbose) compareOptim(list(par=c(12,100), fn=f1, x=x, lower=c(-Inf,0.001), control=list(factr=factr)), parallel=list(forward=TRUE), tolerance=1e-2, verbose=verbose) compareOptim(list(par=c(12,100), fn=f2, y=x, lower=c(-Inf,0.001), control=list(factr=factr)), verbose=verbose) expect_error(optimParallel(par=c(12,100), fn=f2, method = "L-BFGS-B", lower=c(-Inf,0.001), control=list(factr=factr)), "argument \"y\" is missing, with no default") }) test_that("bounds",{ compareOptim(list(par=c(2), fn=f3, upper = c(10), control=list(factr=factr)), verbose=verbose) compareOptim(list(par=c(2), fn=f3, upper = c(10), control=list(factr=factr)), parallel=list(forward=TRUE), verbose=verbose) compareOptim(list(par=c(2,1), fn=f3, upper = c(10,15), control=list(factr=factr)), verbose=verbose) compareOptim(list(par=c(2,1), fn=f3, upper = c(10,15), control=list(factr=factr)), parallel=list(forward=TRUE), verbose=verbose) compareOptim(list(par=c(12,100), fn=function(x) sum(x), lower=c(14,-21), control=list(factr=factr)), verbose=verbose) compareOptim(list(par=c(12,100), fn=function(x) sum(x), lower=c(14,-21), control=list(factr=factr)), parallel=list(forward=TRUE), verbose=verbose) }) test_that("ndeps",{ compareOptim(list(par=c(2,1), fn=f1, x=x, lower=c(-Inf,0.001), control=list(factr=factr, ndeps=c(.1,.1))), verbose=verbose) ## compareOptim(list(par=c(2,1), fn=f1, ## lower=c(-Inf,0.001), ## control=list(factr=factr, ndeps=c(.1,.1))), ## parallel=list(forward=TRUE), tolerance=1e-3, ## verbose=verbose) compareOptim(list(par=c(12,100), fn=f1, x=x, lower=c(-Inf,0.001), control=list(factr=factr, ndeps=c(.1,.1))), verbose=verbose) ## compareOptim(list(par=c(12,100), fn=f1, ## lower=c(-Inf,0.001), ## control=list(factr=factr, ndeps=c(.1,.1))), ## parallel=list(forward=TRUE), tolerance=1e-3, ## verbose=verbose) }) test_that("fnscale",{ compareOptim(list(par=c(2,1), fn=f1, x=x, lower=c(-Inf,0.001), control=list(factr=factr, fnscale=1000)), verbose=verbose) compareOptim(list(par=c(2,1), fn=f1, x=x, lower=c(-Inf,0.001), control=list(factr=factr, fnscale=1000)), parallel=list(forward=TRUE), tolerance=1e-3, verbose=verbose) }) test_that("parscale",{ compareOptim(list(par=c(2,1), fn=f1, x=x, lower=c(-Inf,0.001), control=list(factr=factr, parscale=c(2,4))), verbose=verbose) compareOptim(list(par=c(2,1), fn=f1, x=x, lower=c(-Inf,0.001), control=list(parscale=c(2,4), maxit=1)), parallel=list(forward=TRUE), tolerance=1e-2, verbose=verbose) compareOptim(list(par=c(2,1), fn=f1, x=x, lower=c(-Inf,0.001), control=list(factr=factr, parscale=c(.2,4))), verbose=verbose) ## compareOptim(list(par=c(2,1), fn=f1, lower=c(-Inf,0.001), ## control=list(factr=factr, parscale=c(.2,4))), ## parallel=list(forward=TRUE), tolerance=1e-3, verbose=verbose) }) test_that("gradient",{ compareOptim(list(par=c(2), fn=f4, gr=g4, control=list(factr=factr)), verbose=verbose) compareOptim(list(par=c(2,1), fn=f4, gr=g4, control=list(factr=factr)), verbose=verbose) compareOptim(list(par=c(3,2,1), fn=f4, gr=g4, control=list(factr=factr)), verbose=verbose) }) test_that("... args",{ compareOptim(list(par=c(2), fn=f5, gr=g5, control=list(factr=factr), a=1), verbose=verbose) compareOptim(list(par=c(2), fn=f5, control=list(factr=factr), a=1), verbose=verbose) }) optimParallel/tests/testthat/test-object.R0000644000176200001440000001021414011021512020410 0ustar liggesusers## rm(list=ls()) ## library("testthat") ## library("numDeriv") ## library("optimParallel", lib.loc = "../../../lib/") context("test-object") source("testsetup.R") verbose <- FALSE f1 <- function(x){ # if(verbose) cat(x, "\n") sum(x) } f2 <- function(x){ if(any(x<0)) stop() sum(x) } f3 <- function(x){ if(any(x>0)) stop() sum(x) } f4 <- function(x){ x[1]^2 + (1-x[2])^2+x[3]^3 } f5 <- function(x){ x[1]^2 + (1-x[2])^2+log(x[3]) } test_that("basic",{ o1 <- optimParallel:::FGgenerator(par=c(1), f1, parallel=list(cl=cl)) expect_equal(o1$f(1), 1) expect_equal(o1$g(1), 1) o1 <- optimParallel:::FGgenerator(par=c(4,3), f1, parallel=list(cl=cl)) expect_equal(o1$f(c(1,1)), 2) expect_equal(o1$g(c(1,1)), c(1,1)) o1 <- optimParallel:::FGgenerator(par=1:3, f1, parallel=list(cl=cl)) expect_equal(o1$f(c(1,1,2)), 4) expect_equal(o1$g(c(1,1,2)), c(1,1,1)) o1 <- optimParallel:::FGgenerator(par=c(1), f1, gr=f1, parallel=list(cl=cl)) expect_equal(o1$f(1), 1) expect_equal(o1$g(1), 1) o1 <- optimParallel:::FGgenerator(par=c(4,3), f1, parallel=list(cl=cl)) expect_equal(o1$f(c(1,1)), 2) expect_equal(o1$g(c(1,1)), c(1,1)) o1 <- optimParallel:::FGgenerator(par=1:3, f1, parallel=list(cl=cl)) expect_equal(o1$f(c(1,1,2)), 4) expect_equal(o1$g(c(1,1,2)), c(1,1,1)) }) test_that("default args",{ ff1 <- function(x, a=1){ sum(x)+a } o1 <- optimParallel:::FGgenerator(par=c(1), ff1, parallel=list(cl=cl)) expect_equal(o1$f(1), 2) expect_equal(o1$g(1), 1) o1 <- optimParallel:::FGgenerator(par=c(1), ff1, a=10, parallel=list(cl=cl)) expect_equal(o1$f(1), 11) expect_equal(o1$g(1), 1) ff2 <- function(x, ...){ sum(x)+list(...)[["a"]] } o1 <- optimParallel:::FGgenerator(par=c(1), ff2, a=1, parallel=list(cl=cl)) expect_equal(o1$f(1), 2) expect_equal(o1$g(1), 1) o1 <- optimParallel:::FGgenerator(par=c(1), ff2, a=10, parallel=list(cl=cl)) expect_equal(o1$f(1), 11) expect_equal(o1$g(1), 1) o1 <- optimParallel:::FGgenerator(par=c(1), dnorm, a=1, parallel=list(cl=cl)) expect_equal(o1$f(2), dnorm(2)) expect_equal(o1$g(2), (dnorm(2+0.001)-dnorm(2-0.001))/0.002) o1 <- optimParallel:::FGgenerator(par=c(1), dnorm, log=TRUE, parallel=list(cl=cl)) expect_equal(o1$f(2), dnorm(2, log=TRUE)) expect_equal(o1$g(2), (dnorm(2+0.001, log=TRUE)-dnorm(2-0.001, log=TRUE))/0.002) }) test_that("bounds",{ o2 <- optimParallel:::FGgenerator(1, f2, lower=0, parallel=list(cl=cl)) expect_equal(o2$f(1), 1) expect_equal(o2$g(1), 1) expect_equal(o2$f(0), 0) expect_equal(o2$g(0), 1) expect_error(o2$g(-1)) o3 <- optimParallel:::FGgenerator(1, f3, upper=0, parallel=list(cl=cl)) expect_equal(o3$f(-1), -1) expect_equal(o3$g(-1), 1) expect_equal(o3$f(0), 0) expect_equal(o3$g(0), 1) expect_error(o3$g(1)) }) test_that("derivative",{ o4 <- optimParallel:::FGgenerator(1:3, f4, parallel=list(cl=cl)) expect_equal(o4$g(c(1,2,3)), numDeriv::grad(f4, c(1,2,3)), tolerance=1e-3) expect_equal(o4$g(c(-1,2,-3.3)), numDeriv::grad(f4, c(-1,2,-3.3)), tolerance=1e-3) o4_2 <- optimParallel:::FGgenerator(1:3, f4, forward=TRUE, parallel=list(cl=cl)) expect_equal(o4_2$g(c(1,2,3)), numDeriv::grad(f4, c(1,2,3)), tolerance=1e-3) expect_equal(o4_2$g(c(-1,2,-3.3)), numDeriv::grad(f4, c(-1,2,-3.3)), tolerance=1e-3) }) test_that("eps",{ o5 <- optimParallel:::FGgenerator(1:3, f5, ndeps=1e-3, parallel=list(cl=cl)) expect_equal(o5$g(c(5,6,7)), numDeriv::grad(f5, c(5,6,7)), tolerance=1e-3) o5_2 <- optimParallel:::FGgenerator(1:3, f5, ndeps=c(.01,.05,.001), parallel=list(cl=cl)) expect_equal(o5_2$g(c(5,6,71)), numDeriv::grad(f5, c(5,6,71), method="simple"), tolerance=1e-3) o5_3 <- optimParallel:::FGgenerator(1:3, f5, ndeps=c(.01,.05), parallel=list(cl=cl)) expect_equal(o5_3$g(c(5,6,71)), numDeriv::grad(f5, c(5,6,71), method="simple"), tolerance=1e-3) }) optimParallel/tests/testthat/testsetup.R0000644000176200001440000000100114011021512020217 0ustar liggesusersverbose <- FALSE if(!exists("cl")){ cl <- makeCluster(2) setDefaultCluster(cl=cl) } factr <- .01/.Machine$double.eps set.seed(13) compareOptim <- function(optim_args, parallel=NULL, tolerance = 1e-5, verbose=FALSE){ ref <- do.call("optim", c(method="L-BFGS-B", optim_args)) o <- do.call("optimParallel", c(optim_args, parallel=list(parallel))) if(verbose){ print(ref) print(o) } expect_equal(ref, o, check.attributes = FALSE, tolerance = tolerance) } optimParallel/tests/run-all.R0000644000176200001440000000005614011021512015702 0ustar liggesuserslibrary(testthat) test_check('optimParallel') optimParallel/vignettes/0000755000176200001440000000000014011025676015071 5ustar liggesusersoptimParallel/vignettes/optimParallel.pdf.asis0000644000176200001440000000034014011021512021305 0ustar liggesusers%\VignetteIndexEntry{A Parallel Version of the L-BFGS-B Optimization Method} %\VignetteEngine{R.rsp::asis} %\VignetteKeyword{parallel} %\VignetteKeyword{optim} %\VignetteKeyword{optimParallel} %\VignetteKeyword{optimization}optimParallel/NEWS0000644000176200001440000000416114011025363013553 0ustar liggesusers- version 1.0-2: Author: Florian Gerber Date: Wed Feb 10 11:46:16 2021 -0700 (1) migrate git repo to github.com (1) change maintainer email address - version 1.0-1: commit 6f389aa916dc8cbc2398b2ed3635713a4ecf1778 Author: Florian Gerber Date: Tue Apr 21 15:26:15 2020 -0600 (1) pkg 'lbfgsb3' removed from suggest because the package has been archived. (2) 'fn' and 'gr' can now have multiple arguments mixed with '...'. - version 1.0: commit 373ce0334eb05a7c382bd95d086b83966ceb64e1 Author: Florian Gerber Date: Mon Feb 24 17:51:45 2020 -0700 (1) bug fix: hessian has now correct sign if 'fnscale=-1'. (2) Vignette and citation info updated. - version 0.8: commit f0a8ed6e658cb481d549fd908d5640bf03abf394 Author: Florian Gerber Date: Mon Feb 25 18:38:17 2019 +0100 (1) the mechanism to call 'fn' and 'gr' in parallel was improved to avoid unecessary copies of objects between processes in the cluster. (2) the 'BFGS' and 'GC' methods are nolonger supported. - version 0.7-4: bug fix commit 813a06269b6e777157fbe529bc62e38fc4d59de4 Author: Florian Gerber Date: Mon Oct 15 22:40:37 2018 -0600 (1) 'fn' and 'gr' can now be functions from other packages calling compiled code, e.g., optimParallel(par=1, fn=dnorm, mean=3) - version 0.7-3: bug fix commit 01ebb9016000a7b087c01b190db0b7ab9d4778d6 Author: Florian Gerber Date: Fri Jul 27 22:40:37 2018 -0600 (1) indexing 'par' by names inside 'fn' works now. e.g. optimParallel(par=c(a=1), fn <- function(x) {x["a"]^2}) (2) using functions and method from loaded packages works now. 'fn' and 'gr' have now .GlobalEnv as parent environment. (3) the default value for the argument 'method' is now "L-BFGS-B". (4) the help page ?optimParallel contains a new section 'Notes' summarizing considerations for the practical use. - version 0.7-2: CRAN release commit f46556cee870a5c13145ddfdf5f2e3998ea0b317 Author: Florian Gerber Date: Tue May 1 12:43:35 2018 +0200optimParallel/R/0000755000176200001440000000000014011022065013247 5ustar liggesusersoptimParallel/R/zzz.R0000644000176200001440000000030614011021512014222 0ustar liggesusers.onAttach <- function(libname, pkgname) { options(optimParallel.forward=getOption("optimParallel.forward", FALSE)) options(optimParallel.loginfo=getOption("optimParallel.loginfo", FALSE)) } optimParallel/R/optimParallel.R0000644000176200001440000004257214011022065016211 0ustar liggesusers#' @name optimParallel #' @aliases optimparallel optimParallel-package optimParallel-Package OptimParallel-package OptimParallel-Package optimparallel-package optimparallel-Package #' @author Florian Gerber, \email{flora.fauna.gerber@@gmail.com}, \url{https://user.math.uzh.ch/gerber}. #' @title parallel version of the L-BFGS-B method of \code{\link[stats]{optim}} #' @keywords package #' @docType package #' @description #' The function provides a parallel version of the L-BFGS-B method of \code{\link[stats]{optim}}. #' If the evaluation time of the objective function \code{fn} is more than 0.1 sceconds, \code{optimParallel} can significantly reduce the optimization time. #' For a \eqn{p}-parameter optimization the speed increase is about factor \eqn{1+2p} when no analytic gradient is specified and \eqn{1+2p} processor cores are available. #' @param par see the documentation of \code{\link[stats]{optim}}. #' @param fn see the documentation of \code{\link[stats]{optim}}. #' @param gr see the documentation of \code{\link[stats]{optim}}. #' @param ... see the documentation of \code{\link[stats]{optim}}. #' See section 'Notes' for more information. #' @param lower see the documentation of \code{\link[stats]{optim}}. #' @param upper see the documentation of \code{\link[stats]{optim}}. #' @param control see the documentation of \code{\link[stats]{optim}}. #' @param hessian see the documentation of \code{\link[stats]{optim}}. #' @param parallel is a list of additional control parameters and can supply any of the following components: #' \describe{ #' \item{\code{cl}}{ an object of class \code{"cluster"} specifying the cluster to be used for parallel execution. #' See \code{\link[parallel]{makeCluster}} for more information. #' If the argument is not specified or \code{NULL}, the default cluster is used. #' See \code{\link[parallel]{setDefaultCluster}} for information on how to set up a default cluster.} #' \item{\code{forward}}{ logical vector of length 1. If \code{FALSE} (default when loading the package), a numeric central difference approximation of the gradient defined as #' \eqn{(fn(x+\epsilon)-fn(x-\epsilon))/(2\epsilon)} is used, which corresponds to the gradient approximation used in \code{\link[stats]{optim}}. #' If \code{TRUE}, a numeric forward difference approximation of the gradient essentially defined as #' \eqn{(fn(x+\epsilon)-fn(x))/\epsilon} is used. This reduces the number of function calls from \eqn{1+2p} to \eqn{1+p} and can be useful if the number of available cores is smaller than \eqn{1+2p} or if the memory limit is reached. Note that the numeric central difference approximation is more accurate than the numeric forward difference approximation.} #' \item{\code{loginfo}}{ logical vector of length 1 with default value \code{FALSE} when loading the package. If \code{TRUE}, #' additional log information containing the evaluated parameters as well as return values of \code{fn} and \code{gr} is returned.} #' } #' #' @return Same as the return value of \code{\link[stats]{optim}}. See the documentation thereof for more information.\cr #' If \code{parallel=list(loginfo=TRUE)}, additional log information containing the evaluated parameters as well as #' the return values of \code{fn} and \code{gr} is returned. #' #' @details \code{optimParallel} is a wrapper to \code{\link[stats]{optim}} and relies on the lexical scoping mechanism of R #' and the R package \pkg{parallel} to evaluate \code{fn} #' and its (approximate) gradient in parallel.\cr\cr #' Some default values of the argument \code{parallel} can be set via\cr\code{options("optimParallel.forward", "optimParallel.loginfo")}. #' #' @references F. Gerber, R. Furrer (2019) #' optimParallel: An R package providing a parallel version of the L-BFGS-B optimization method. #' The R Journal, 11(1):352-358, https://doi.org/10.32614/RJ-2019-030 #' Also available as vignette of this package \code{vignette("optimParallel")}. #' #' @section Notes: #' \describe{ #' \item{1.}{If \code{fn} or \code{gr} depend on functions or methods from loaded packages, #' it may be necessary to explicitly load those packages in all processes of the cluster. #' For \code{cl} of class \code{"cluster"} one can use \code{clusterEvalQ(cl, search())} to check #' whether all required packages are on the search paths of all processes. #' If, for example, the R package \pkg{spam} is required and missing on those search paths, #' it can be added via \code{clusterEvalQ(cl, library("spam"))}.} #' \item{2.}{If \code{fn} or \code{gr} have more than one argument, #' it may be necessary to pass those to \code{optimParallel} via the \code{...} argument. #' An illustration is given in the section 'Examples'. } #' \item{3.}{We recommend that all R objects used by \code{fn} and/or \code{gr} are passed to \code{fn} and/or \code{gr} via arguments. #' In certain cases it may also work that \code{fn} and/or \code{gr} use objects from the \code{.GlobalEnv} (without having corresponding arguments). #' In that case it can be necessary to pass those objects to all processes of the used cluster via \code{\link[parallel]{clusterExport}}. #' An illustration is given in the section 'Examples'.} #' \item{4.}{Using parallel R code inside \code{fn} and \code{gr} can work if suitable clusters are setup (one cluster for \code{optimParallel} and one for the parallel execution of \code{fn} and \code{gr}).} #' \item{5.}{Using \code{optimParallel} with \eqn{n} parallel processes increases the memory usage by about factor \eqn{n} compared to a call to \code{\link[stats]{optim}}. #' If the memory limit is reached this may severely slowdown the optimization. #' Strategies to reduce memory usage are #' (1) kill all unused processes on the computer, #' (2) revise the code of \code{fn} and/or \code{gr} to reduce its memory usage, and #' (3) reduce the number of parallel processes by specifying the argument \code{parallel=list(forward=TRUE)} and/or #' setting up a cluster with less parallel processes.} #' } #' #' @section Issues and bug report: #' A list of known issues of \code{optimParallel} can be found at \url{https://github.com/florafauna/optimParallel-R/issues}. #' Please report issues not listed there to\eqn{\,} \email{flora.fauna.gerber@@gmail.com}. Do not forget to include #' an R script reproducing the issue and the output of \code{sessionInfo()}. #' #' @seealso #' \code{\link[stats]{optim}}, #' \code{\link[parallel]{makeCluster}}, #' \code{\link[parallel]{setDefaultCluster}}, #' \code{\link[parallel]{stopCluster}}, #' \code{\link[parallel]{detectCores}}. #' @examples #' negll <- function(par, x, sleep=0, verbose=TRUE){ #' if(verbose) #' cat(par, "\n") #' Sys.sleep(sleep) #' -sum(dnorm(x=x, mean=par[1], sd=par[2], log=TRUE)) #' } #' set.seed(13); x <- rnorm(1000, 5, 2) #' #' cl <- makeCluster(2) # set the number of processor cores #' setDefaultCluster(cl=cl) # set 'cl' as default cluster #' #' optimParallel(par=c(1,1), fn=negll, x=x, lower=c(-Inf, .0001)) #' #' optimParallel(par=c(1,1), fn=negll, x=x, sleep=0, verbose=TRUE, #' lower=c(-Inf, .0001), parallel=list(loginfo=TRUE)) #' #' setDefaultCluster(cl=NULL); stopCluster(cl) #' #' ## default values of the argument 'parallel': #' options("optimParallel.forward", "optimParallel.loginfo") #' #' \dontrun{ #' ## - use all avilable processor cores #' ## - return cat() output to R prompt #' ## (may have issues on Windows) #' if(tolower(.Platform$OS.type) != "windows"){ #' cl <- makeCluster(spec=detectCores(), type="FORK", outfile="") #' } else #' cl <- makeCluster(spec=detectCores(), outfile="") #' setDefaultCluster(cl=cl) #' #' ## return log information #' options(optimParallel.loginfo=TRUE) #' #' ## stop if change of f(x) is smaller than 0.01 #' control <- list(factr=.01/.Machine$double.eps) #' #' optimParallel(par=c(1,1), fn=negll, x=x, sleep=.5, verbose=TRUE, #' verbose=TRUE, lower=c(-Inf, .0001), control=control) #' ## each step invokes 5 parallel calls to negll() #' #' optimParallel(par=c(1,1), fn=negll, x=x, sleep=.5, verbose=TRUE, #' lower=c(-Inf, .0001), control=control, #' parallel=list(forward=TRUE)) #' ## each step invokes 3 parallel calls to negll() #' #' ## passing objects to fn/gr (see section 'Notes') #' ## ---------------------------------------------- #' a <- 10 #' fn <- function(par, b) sum((par-a-b)^2) #' #' ## approach 1: #' clusterExport(cl, "a") #' optimParallel(par=1, fn=fn, b=1) #' #' ## approach 2 (recommended): #' ## rewrite 'fn' such that all necessary objects #' ## are passed as arguments #' fn <- function(par, a, b) sum((par-a-b)^2) #' optimParallel(par=1, fn=fn, a=20, b=1) #' #' setDefaultCluster(cl=NULL); stopCluster(cl) } #' @export #' @importFrom stats optim optimParallel <- function(par, fn, gr = NULL, ..., lower = -Inf, upper = Inf, control = list(), hessian = FALSE, parallel=list()){ fg <- FGgenerator(par=par, fn=fn, gr=gr, ..., lower=lower, upper=upper, control = control, parallel=parallel) control$fnscale <- NULL # already taken into account in FGgenerator() out <- stats::optim(par=par, fn=fg$f, gr=fg$g, method = "L-BFGS-B", lower=lower, upper=upper, control=control, hessian=hessian) out$value <- out$value*fg$control$fnscale if(hessian[1]) out$hessian <- out$hessian*fg$control$fnscale if(fg$parallel$loginfo){ out[[length(out)+1]] <- fg$getLog() names(out)[length(out)] <- "loginfo" } out } #' @importFrom parallel getDefaultCluster parLapply clusterExport clusterEvalQ FGgenerator <- function(par, fn, gr=NULL, ..., lower=-Inf, upper=Inf, control=list(), parallel=list()){ stopifnot(is.numeric(par), is.vector(par), length(par)>=1) n <- length(par) stopifnot(is.function(fn)) testFn(fn, dots=list(...)) if(!is.null(gr)){ stopifnot(is.function(gr)) testFn(gr, dots=list(...)) } stopifnot(is.numeric(lower), is.numeric(upper)) if(any(is.na(lower))) lower[is.na(lower)] <- -Inf if(any(is.na(upper))) lower[is.na(upper)] <- Inf stopifnot(is.null(control$ndeps) || is.numeric(control$ndeps)) if(is.null(control$ndeps)) control$ndeps <- 1e-3 stopifnot(is.null(control$fnscale) || is.numeric(control$fnscale)) control$fnscale <- if(is.null(control$fnscale)) 1 else control$fnscale[1] stopifnot(is.null(control$parscale) || is.numeric(control$parscale)) if(is.null(control$parscale)) control$parscale <- 1 if(is.null(gr)){ ndeps_mat <- array(0, c(n,n)) ndeps_vec <- rep(control$ndeps*control$parscale, length.out=n) diag(ndeps_mat) <- ndeps_vec } if(is.null(parallel$forward)) parallel$forward <- getOption("optimParallel.forward") stopifnot(length(parallel$forward)==1, isTRUE(parallel$forward) || !isTRUE(parallel$forward)) if(is.null(parallel$cl)) parallel$cl <- parallel::getDefaultCluster() if(!inherits(parallel$cl, "cluster")) stop("No (default) cluster specified. See the description of the argument 'parallel'.") if(is.null(parallel$loginfo)) parallel$loginfo <- getOption("optimParallel.loginfo") stopifnot(length(parallel$loginfo)==1, isTRUE(parallel$loginfo) || !isTRUE(parallel$loginfo)) ## prepare function evaluations ## export '...', 'fn', and 'gr' to cluster dots <- list(...) e <- list2env(dots) assign("fn", fn, envir=e) assign("gr", gr, envir=e) parallel::clusterExport(parallel$cl, "e", list2env(list(e=e))) if(!is.null(gr)){ exprList <- getExprGr(fn=fn, gr=gr, dots=dots) } else { nParallel <- if(parallel$forward) 1+length(par) else 1+2*length(par) exprList <- lapply(seq_len(nParallel), getExprApprox, f=fn, name=names(par), dots=dots) } # print(exprList) evalFG <- function(par){ ## the first argument of fn has to be a vector of length length(par) if(identical(par, par_last)) return(list(value=value, grad=grad)) if(is.null(gr)){ if(parallel$forward){ ndepsused <- ndeps_vec parMat <- data.frame(cbind(array(par, c(n,n))+ndeps_mat)) if(!(is.null(upper) || all(is.na(upper)) || all(upper==Inf))){ hitu <- unlist(lapply(parMat, function(par){any(par>upper)})) if(any(hitu)){ parMatl <- data.frame(cbind(array(par, c(n,n))-ndeps_mat)) parMat[hitu] <- parMatl[hitu] ndepsused[hitu] <- -ndeps_vec[hitu] } } parMat <- cbind(parMat, par) parallel::clusterExport(parallel$cl, "parMat", list2env(list(parMat=parMat))) parallel::clusterEvalQ(parallel$cl, assign("parMat", parMat, envir=e)) ev <- unname(unlist(parallel::parLapply(parallel$cl, exprList, eval))) ev <- ev/control$fnscale value <- ev[length(ev)] length(ev) <- length(ev)-1 grad <- (ev-value)/ndepsused } else { # two sided ndepsused <- 2*ndeps_vec parMat <- data.frame(cbind(array(par, c(n,n))+ndeps_mat, array(par, c(n,n))-ndeps_mat)) if(!(is.null(upper) || all(is.na(upper)) || all(upper==Inf))){ hitu <- unlist(lapply(parMat, function(par){any(par>upper)})) if(any(hitu)){ parMat[hitu] <- par hitui <- apply(matrix(hitu, ncol=2), 1, any) ndepsused[hitui] <- ndeps_vec[hitui] } } if(!(is.null(lower) || all(is.na(lower)) || all(lower==Inf))){ hitl <- unlist(lapply(parMat, function(par){any(par=1){ ex <- paste0(ex, ",") moreArgs <- paste(lapply(names(ff), function(x) paste0(x, "=", x)), collapse = ", ") ex <- paste0(ex, moreArgs) } } paste0(ex,")") } getExprApprox <- function(n, fn, name, dots){ ex <- paste0("local({par <- parMat[,", n, "]; ") if(!is.null(name)) ex <- paste0(ex, "names(par) <- c(", paste0("\"", name, "\"", collapse=", "), "); ") ex <- paste0(ex, getFunCallStr(fn, dots=dots), "}, envir=e)") parse(text=ex) } getExprGr <- function(fn, gr, dots){ list(parse(text=paste0("local(", getFunCallStr(fn, "fn", dots=dots), ", envir=e)")), parse(text=paste0("local(", getFunCallStr(gr, "gr", dots=dots), ", envir=e)"))) } testFn <- function(f, dots){ if(!identical(dots, list()) && any(names(formals(args(f)))[1]==names(dots))) warning("The first argument of \"fn\" and/or \"gr\" has the same name as one argument passed through \"...\". The value passed through \"...\" for that argument is ignored.") invisible(NULL) } optimParallel/MD50000644000176200001440000000173114011252206013362 0ustar liggesusers95a3b566658e609088b8bbe75f0c31cd *DESCRIPTION 6e1aded77c11e733fe7e1509cbf07c81 *NAMESPACE c3e3b785ea5d99f9a25e12d8b6bb7eb3 *NEWS 9e524f48e77b8f87ecef03e59018c698 *R/optimParallel.R bf76c82f3f95872f4b59196671b876dc *R/zzz.R 6c7aa210ed6741d434c3e6ad4249579a *README.md 0070904b77629f322854744ea2c700eb *build/vignette.rds 0c8c87c9e5bf6f43179a324a7fc2d01f *inst/CITATION 49f0d85f332c3beb440a6c744a83c6ea *inst/doc/optimParallel.pdf 07b2d374e5b0439375392e3aa994e8e3 *inst/doc/optimParallel.pdf.asis ca5cd47e911d39bfd496fe1f97f5c9d5 *man/optimParallel.Rd 251d09c4aabf499d32767cab8cf4684d *tests/run-all.R 9e984011ad0775580cffb12eb7caa9de *tests/testthat/test-issues.R c87b16cc7955f4afff6946c8af4a6271 *tests/testthat/test-object.R c50da87b620651b701f8d896a59e0f17 *tests/testthat/test-optimParallel.R 35af59828f6202e133a0c88a3192d97d *tests/testthat/test-spam.R 2ee1d328b8d805b4bd56d09a5dfc7d9e *tests/testthat/testsetup.R 07b2d374e5b0439375392e3aa994e8e3 *vignettes/optimParallel.pdf.asis optimParallel/inst/0000755000176200001440000000000014011025676014036 5ustar liggesusersoptimParallel/inst/doc/0000755000176200001440000000000014011025676014603 5ustar liggesusersoptimParallel/inst/doc/optimParallel.pdf0000644000176200001440000051054314011025676020113 0ustar liggesusers%PDF-1.5 % 53 0 obj << /Length 5282 /Filter /FlateDecode >> stream xڵ̲٫g/?%٬de.4F/g\GJqh9@=~ [k /iuuMpQ D9Z\iRcͱϳ3\I6|-`ɢ-V~O6[§fe1{W33&dݳ~Ir&2Be3á?mնugXװ4ŸVՇ^ClkK v9۾nw 7/^zwb د`. wKO_iY݀mm*[~v{ O"gL+6B[5r"Nmn;gdZOk͔+7@Y.^\i ޙPe:Lg?c# {> YzḖPw ;m[F _ +|׀@!v_ jW++K9 BU lAAgϻn߹2yf#g'F a'BMգ:>PO~ c,$G:púw h]yٵ;/D8<֬cCJ[z8akb MMC=xxqkz8{ֶk͎}ݹպj?Eպղ;՝$h1^6zmk-z䙧̝NĬH v|zףYmz8Z2]tdqW}{X-`cl_,[S["n^W_ -*5*M%i@$h QhRyo4캮u+$CZƀBK~%_׮S5+aDyރUnVR[ih灏DHkP"FFšED^`8i M?.z(V(;Em\=YJb#Q c< IeVN/ڑ UhtbyS%+D@YKLв^wXX $~l@E2N9KL pPdzzS~nj Ƌs+vw56 lB/Ãq=Vgf8w5˿:^0>&s3ۂ}lr2jp3 Qr[j|$s(׉':ASv'n]wﺻcE\m<߮Jx@/IdPVo{G1as,s!v ~Ysp2A:r&l );'PYXXJҧ; -np[* ݟG^Ncx#dYNOy ͪ^u[2^8K3m[xyյ˻j{{xʚNh?,GxtnOiѭтf.qղ<$TA&=e‚` &PLq*:o#R9K:`Q^ ))l0D9= ԟ6aK4l%B?OnVɝ d^ fc?Ɓ #z"0CX }]D\q&cg .Tѐ(1НP9,"P<8}b3 Ew7BoFPG7ɇԨ؊yd~ʼ50\ NFY4h̤ 4(UX}ݺ1Bw$S30ShaRkh.G[dTJdtz4b, ė 'O5݈l6(a:~m 2Yq?Ȟ!F:El3pǫo4\"V)2A41dP7gO 2@;UTO7[}oipví_y1 ;ivE(D6(Q$<^U2Xkh&f- R5+4+Scq 7;P,;v6.$L,%(/ C2290&j#j|.$y. 70o.?Oȩ΄Ohgx?괍m^Q!8:h8HøsQe&@QEr_U⸕,H&:s`*u< *1>g0$e=e+\&\/jjtk_⪮lKv-ـێzG 0hqJ[ ,)$}_;<=Հ\xlPbk",[OyU> . %G2 FP,Urf!pC()lI5e9nBX=+s'2@0ЏǯOn@Fs8 3k1q1ydӍ:qŋ,E2]`+|ƇA+z#$uQɟrQm]JӢdL`kJ=b?В}8 "9gPr|m3½`fo㊶¥>/<è[2Vr F\ŏSbFg.T=1BfBbQ)Tf(O S<'q^Ĺ΀Xx0=ijt=@I>P'Jӧ (26pE %? VEi)Kk:yǻ&d֓THy(4=IT9޽ȿG(h^VR`}x\2~0oJ99OaIC0\,`^SSM<;Ǿq$,w$K;*O:XI'~d/fմzy*H_@xMTQCF2_d˥b/uhUV/1⴩ I'ٜS*Ӎ~"Hǿ?F]Yd@ DC6L&NJzt̹BJ s8S |n2tS"01F)C]EXro44|bYb"as-=OB #Ә)xKJPga}K?ukЉ> u[m\dB 1A[٨C>AhT' c4!}jGZw4s`頓;*@sU#6gVLbc(SXbD@:& \_5A?vy^^N~ "/ȏʇ/ cIT XT:(}5](uwDS֟-\>%+3pHqGs-hPeh5^6Mfr",ktʑxˤ @ %luB :76%h Bi‹dY{?0bɌv!M<x7Cf;M53lk?:PZwo*|Ƿ> ىGktY)殩JrJ"屺0c9'qBB!wi}(sd^XoGZ1B4ɨ%IfZK\dƊҰMhQ"LJJLYCa~jM Py:X۫U4P1$]$V,:"Rg`bpxdtD ЀP@YǜbihNӓyi뎍;K?n^x^6g`HRCEN*9+#4BfLUdbeeN-&@9 \ HӰL9Z621,5lvJ6]{ ڶ{ .Q[}iuwr +Xt(ܰRaW/c}r0w0FvLnW?Af3LaA`4iUb >hO'*M~Nv~Mk5&~ 0crW ,0E0C?Ĥ$zdļ}h6PnrP,VR~Y;Ӆal*4pI0YC_`yxPH`+)ҟGut !;y/+^I|^>$- !nWaxVl(Zpg@;a` Yl/0uU4Z|: <#.S0&q QBYE"> stream xZ{>`9&m&8־I{:"߽38P>Rfdˋ//LtSۉ`I$#2\/&o.]N Łi"*vw3Ŧ_:W{zۿ_^x*Py3+7`{'SN2Hp닟/P2d=Mx'wd'$:ہ$a\{9ys 7)ˀ)2EZ'ITR8r& >ǟf"I~ԤWmeKf53 BQ9ij̲,c޷ju}ZAȇ![n\NcQ#4V^kћc#,U~ ls-О]k/^}jLO'fD٫& !'0%u6FC Q@H(x4HMQ-ȷöh:dW&/KSA#573t/=;+Ƨ !Zݛ#JL&b*<+Mk6gj$H4φf+*0i+IЄ0?'Apcjql)P-i4l0M9.6MUDvsIiHKnW_^:/MtL;W ^pBccXq,\{kힹ{,9ΝQ\m٩f#:5с3&<6YFg:(PUϓho>9jfo>r aWJvq=F)$m3E "Oy0:C !P \f-ڑrxi"xJ8Qxh4kH "KGY@p;dh7N I|4B%7 ؆S f۠DLryKU{; Ie 5JŔVtcv{js((n>n`&S<C gLFy{!≀m@hl@! @rLQ-.PAZ(F\Pt~6 @Ft`ITٞ4 gW Fd`1uVCKc]7MqS.۹ >SpǰW:0 hOYN͆ E#HȵHD:ZDn-/O1'R#yȯ0?=W*" |zRrXtFsiGv#P`|"7fCp Pc-e.} 㽱>xg̋5CD8O ϯ.[e„ڵ} ^B1Luq S(R\`IHh]7u뛫uM-@ʽ 8i>UNw?oCz,Mej^ s HI@cMyM͊ ͷ~ot{>ѧ@{OĚOX!"K&ddBvif00/d1#jz*_ҡ4I}δ3t^ҩaպ4W!gWH4_"ߙfO<%|!D )$[ r$ sg+\$",3#̝,T B:]&p{Vٮn,~wEe]xS*{SsF7"FP \#5N4_, Aᗍ]n{+cĦ8Yc: g`P2> pxe܂} i":wW:2H r &CZy!M3δO"VHdTBЭ Q &,u^=]~ Φ/lPA8=k)_HIHP/gRnklB_8e/L m%[T,SFo:<` $w$2]jQFhPv`3?8Y;tCIt'ΏBP`',VwdP/bZx@`Iw xql[bmZn\i7#^_{/ߴH)3 ZluX`v_:ͤh psOdr'qRR1] &)Hg2hP,Z6/-m UKz'D~Ҏ|KځZb&Hv(e~)5@%).;^i2SJAx )~xeGFJhAz 4A.!ag0í.ˍGvɢ=6/_Lq+E5VO}g/$%DPlAv&u'`U@,~ f m]Bw$RN?%tf('xw 2pmksä (@[Wdʏĝ{<0j?Ae1Y9TV5xM(dbD'Y-^k>uB&LD qruw~D~$#A1w*Mfxx\IT|Ȕ៎9IٯBD.$9(:7gk?.5Pe?ؖm)fOJx%CF7y]#ہWGb1~G=<𽅺I臟IϸȠV=|{_Mon{]kJbm+?ޑrE޼6|PBG2=/& endstream endobj 94 0 obj << /Length 3455 /Filter /FlateDecode >> stream xK{ܶ_^oi~8:Ki쒛%)$(K1 WtٓodJrbtJ"̨f.yq;hHf(C@CfB|5ZJm}lf},{R̍+H}s /Y4Ӥ+H'a RBR ~gLAJ)}< ~O#SD7OE%T5\nXѡ% U %sKK t3OOؒٷ.w;?u]\~U_y(Ux׏@ƊN?Ê?mk͝@8 3_c`@"b=(2`"6qַK߱0BT BIz1饟[C ň`ʤlIH(Mi"BRԻL ]A"!1ʦtGZ%B2Kq?4FqG BdTH|ЖGyZ~_xG7Զ,V5͋1R^uq.7X˙wRb8Ԥq]w;7[ʛۈᐑLmt ίZ]j.bHps0(|n[C.TجKf 5mSd G2ޥF*Hf];C?9 ZJ}@wᘂllY(oٿܼw׾W7]5QMTXF3*ɋ?ݨl틗閥W`"% }_d2sp{jc7$|! ^F޼<[+^6ٯĕp O$,9{z6QCvwMԒҕ׺ɪ<^08$bƙg((`uoy{. #A'RIc[[AzY다1FTԜ`HSw$|Z3v0p Vy;}ûN.W:T { E!-5˘x8(N9>eM;KI#¦|86qe1ݔrvqZ9bʼn[RBs[2M瞧7,#-qwc0Nm"ߤ1DrߩpdCۏ^{Cm,ޑ͆fjIA{|% `xe(()(alp0/V,n@qausuS x=~D4o­u  S28B3qQk'p=v/<^{HQ!Y@p*tgt pӗ@7&`*Z7.KݓT2QwZVVuŦ/w%XRg19crɱ*t:`co|'Zm7y Lc/4MV H(\ogw#ߌ^~JQTf1)"٥CS G (W_&L[tdrQ4iS4иe29g^d4|W:[`;7>_B%A[~LDdh!) DSL3"B73:nc&AH-C4UZ=Pu_v ߢTZ1ľ|;蔑M!.lv!]0)La2zx XgEf0\B@V鿭'y; ɮsI+йBb!@oNg>q"$owMUM~:g-bnB` ۷èk,b닳s}b endstream endobj 78 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/fandrhome/matloff/public_html/matloff/public_html/Refereeing/RJournal/articles/Proofs/2019-1/2018-57/path.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 96 0 R /BBox [0 0 466 259] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 97 0 R/F2 98 0 R/F6 99 0 R>> /ExtGState << >>/ColorSpace << /sRGB 100 0 R >>>> /Length 15382 /Filter /FlateDecode >> stream x}Kf;R<v8mi$$ KbTTDՀߎXkOV- ^_7wٟjc|QY~۷?>~oy_>[;>?[7_w*>_G->{(%} ??_ l/3(}sY|>sgsfϾ|igo%K9os <{ܿw[޿XY?s8/s~ظs~ysr~e6>3_mϺg~oF]6dgqc={p{'s{l?ƕ|69|i)?7҈Y2?JJ,{ܓ;2۸aѿoo>OX/ߏQJzcM՟?_3wB{!^\?^l_}6^>{?J>Mg=_>ߚg}?6a6vajdwA㽟}p 8[0_벍^q7}'b)'iȓÚ6B193,y2#r=_!OlF6.&8B-ymyފoDV|Cx_ ~yNGظl1_;_Qbw4}<ƛBb}lcw׶>s[?{Lkkmqښeϳiuo~א>w}m =m6̟o;Wیj۷q$=/A>>P-:h15o!!Q f_+Qajw>\,#dT|FFS}9bywsG=t*\CfAaۛP1P6lGڽͦiy${SOֆ!]jjF{: $5"p C>ԲMhگ()vf+.m10%5mqDH[FuMDh`m%v/İYSM@;k7MGt ; 5jܽ{K$ +PFDcJCu$~u(W\Rլ fuK*iJo߿/+Ƿf{.7k@qgE[/׵6z=Fsڰ7{LpfVm;z*/y 8mMR$h{ ȷU7֔2w.ҧݜ:Uc5?VSV j`HB ŁĹ_ \Fo2m3ҦP F7m7Ho$ʡC.7e]W)g>|_&$;b/Pnpl&T[@Я{0- 6_B_ լab 7(XGnCnTcC8K6!z4 l l6s{g `I - C~8ƑkAvlzpmc'Ԩ2 pѨf#q#iT3*4#l~v4旔5y\by6͆kѰf=F&͑O:7w'иbƮLrwvV*aڇ(&R`;²bnMOk -8vi;7";6z66v3arY~rE~l?G]~#DO3B_~'q0f|66v+11mUqll~=|6~'L~*cs=~0cю OjٸMg- xڸfu&-kcK?e%(u8o DqU~f4_O O+[(s~b~З; O7FϷ`BQ=t6W\@m.qhRp{vGl9L=+fLeN=[oA=,f$ ܶG2-ë{B:%Ԃ- |m p&8t~Mmzr{\6\4{ . H6̗ڴJl0ꀺ"MZp+Aw""~-p2A+zT B{7mC yLmtST=DgDQS x"NA@&dC-K%]MіAa sW઻A, d62oB㨻6 ?#o nNa#1 07 `dy_B{OPl ;~⽀+"lܒ>4sP?P|;Q!{)눂_+Q 7|YPQ/Jof..8` g7a odP?#2 >*0"(Q}47 +\{q}XD e&ZY~8Y6 @TiA&(1 ^PclByƳ  - T<VQ}5U@VĔm=JY@]?}].{_ 9B !.C GȄ'G0ˇaw~(As1yPrSq%'H&.P{c% `qIJÅqJn4ly3@MDCMFV+U%WQ2EP2UPr(YCJ(&LV(G E}$AskD`@ɍ4Q~QrRڦX:fq%{=d\[6͢<= 4/GBDəȏIk\%oeb 4{?3;PrOP [:<~@Mub뗯x(n#RX,a8x(p <JrK#:p`tټu"о ʶuS!ཏ8M-T |Ŏ7IsK[XqL J `H\Nցs;[(w= 6%_Fbܭ6a$z:I"Zc.٤eCl;@VxYޕy".Į!M2_5Īi6v'VU&`MsvaybSxXA;IՏ[XJY`6aH> ?%3 9xT@薕eZX!9w!J.$tcR6$kDc@r.yB7oTH膨 PF- Z H$EVtЭ*6mR ֕Fˆn}#Y \-eXb6ǿKWn+G$F `P Xm0<2 V& #Z$Vc]b fNSh}[lMvgu-S8['luAꙏjD=ƁgU,{QQ,H/r" Hధ)[=W(쉰{idXp@D`)#&ԐD\[ {<qI_w$He!WKR8qe4M,\g4b Ivt Cb!ݝtA IU c`Hb*TJ2@n;#e<@&{Q(U۽rQκQuz %QSeݥ("z%щU%ڢ$~v xK "jy?W:3^gP.ebN'LA4K0?W)NJ Sԝ:$ᔀea , ,7r<[{HHWC VSp y4h)$&(gfӊya6GNM+95TQz͖ގY Rl!hM; ]jT61ẗ́2|)HhAt^?N_jġP V1>_ M][O|i4iT! "A …>`B 1"db*WI/DG8£]w,#Jj*Z-= ֦5UTV/( 8+ni9@N3Y 4+^ C+sY fXXW=$c`mpE+s0]%uՃ-uoa}xy  F&l!Y,Z;1-ԙNKUk[E-"N^jM_,ehKȺ^şU *ӋJEZh|2n3-հHi Z4 iTWWD(1s21iꛛɀNsv *'gn /EQR㣾 8:Z^ T`y[// 1{خ\Tpr&Rw Gp!,!W+ME2'!֩+d, O=Y Н%(6Z04IUz L]bL:rh-QrP* >gpIYHn Q~ӵ˦ !!fj?e/D2sfFXGڌoI&X'5nwulgt8> ]w~O|H@ƠO0={ H"Z,U싓Ij8,K R2Tf#ڃy2UkЛ»}q3DBnV L lBׄ ùTd yUh)T@pzu,㶦 0`/j% ,< d//L^@%$ ҈ =\ iHAJQ#V%&w1IRA6vFdecVQA*-62gs+4UK#&:JaZFc XM 5MVQTc!fvzTc~}5Tcme{=~*j.z-%̼la1zƪRTcMY1Mo==)56Xv 5$ 5fEWIc-Z.BQVQ}PTc[eE@1z3:UX6s[{-ud애,)ڻub.lFg@ꭦ-˕l[[* [VCBoVb#f ފ:S(* =$Fޢq(h5h$&3sPBo)6} vq 'i*<ƖNhݫTj2)ѵ* {MiT W_hzMB/-,()j, :K4uUJ,K ywYy@NohV mBVfa4 A}/&R66fGӊ*!RkB Ҙ @UHPAg#1')G& l8( 7ClI" 8-2< ZNHu [8,VM&l 1.qv vfjCg`uy&EC@A=xU&ʡh2|~)d\4y~`L.MfpBU (  !O^B?έFOn0C6@8THVUd4׏"nM/qS鉾⡵o)?h}-]f-Z< iuLXB䎉<0Y]9GU NsY9UPYVp2 AZ©mo/pAc˪ !]#)o$vfIt=ڬW N%v ԖϤmx@j+#M4`hH|JmqHjj( OݘC͂XNpqmCҦ2b[>]$tRɅdr8@=$"JD|!~дbsY)`n7d;0H IO+bҳIO6&]ޜTW='E\,2_^l^:{W Sr&fmerbUHdQu&4\ȡn{Hw.SG4Jn7hӒǑs]]>ʹq. NaL J/g;v>j͙͓CS3ǃR?$ޥTƤOԣF Nυ⢦zLuJ$ HC;1UPW6w^فI:?.?F&:ӥ QI$.)zXzM+J'/IRA`SX#QǑyc]BblyEGQn5څ[2|BQnVt.ϗ(C&ۆܲh@ռd喂[ Rn59bʢ)VW}V' (ܪ2\nIIPQY2< -"-1E[[JRX\8w(hta/IF,T&Ւ.E=߉6E.! ]${:ssY@jĄF4.&~> eۿ "J*?osRELQjZfpgt A[$wj_S~Ւ٭Cѩ@{ٔ%&XLi>K^e~Z),2 Arz P #(] F@FVcr}$ 7>L,gS AY̸-td|P$3vȇ'IPf_'nT*gGW"ˬ6%9+ݕF-(++n8xE` ʧQU1!LT)[$BxWA@,3 MmJ)hedZYU)Ir0IfC&^: S1wfUw ͛/`~t&()P&J(Pn޽Oj0#;_ݚ 7ݦ:\݆ΒqvJjS8؍BzeҎMsg8"zhn}ײ"Z 1mA;;-wn XIb"[@vc4T *#;rx(EXz,D~$eP{ZWB7vEOΆ@~Z!oŎ \1ʓ`Q^,D~WF17ʜnZ`!2 ۨ $J8L\ 2 I?Zo?d6I~ktG"}0I_wN2O&azGLHI0ClA20lZ"|2I9{Ni̻N b2WlFbپ&1r}E\!D@Ad$ Y2.&K L2_UI 2ctO&Qn?% Vg1;v;d^_]tS1NY=Xu\*]ԀW c^K27L)HL'aW`rW&A7kMԸ3X5ݎt|D^n!YP/:2iY"s#w3y\"'MK!̇@׃5kt %I!D״02 ;5-"%sE3#oaΊatQ$4 \"£=-;(f؂9.:UA6qa. *!{6B/w'/Rm YNLҢfN>HSH#H bʾ&[,Wpe!Uf9g%1u1wBm JĨ0 T`V#cu$Fn*wfcct I.#QTW۩^ z)0r:9IЗ!N iҸ1c=Ê'FVghbLQUwI㣺|MS=tR{qYA\x1闽t*vpLDLmH6_ V^XRwQÓ3 "8̽`U)뢟<b?^)#cKвaY䴫#&n~EϡqWgtr =NzXݏ?Z>z@b|x}rLޜkDCH_JEѫ!W#@{'jH_I_)J}ҒˑCB ]}HQ^x(?@`UIQK9I(d,(RN2̠C3 05$t |A;ޭ:xvrÓV=.>_P 0Պ0tWhx]LH;x KҗҌx nQ>;)z4TݍsIcv'g01M8o5&W ]`< cT<'\aʇv'z×h\ts:RlU_ٮeNjseɼ_pBs#/75ٸ]fӭtX ?RLOejw. Ǯ[%KvXu(IQPuB9-_\T ,K;Ҥn+@̯cNwSް{ZJZJsc+Uہ'{T1f'N?-i',zpZQJ,R+[ ZIDeI^A4w.Q+Gp\]:pTYg;$d=!\lrYF퉲A*259='ϻQpP]5\2G0t4ڈ3~U_bGeZ.穟.]]WMSH!IƑ+"?/.S YRq?2lA{ťl;*ճ9Qy}fL|mVLr*M'YK%d.:}@ZtlOem#.!Mfæ)$i!~#9f9yDwM>BHBX]B]lwR cAa3^oIdtj]V]_AR/2gk,2O*VYiX݁T@^/wQc:E(TWzVU񵆬ck+f[aT}- n)Ba9R#Ҙl~& Vc{$4{`= ʞ|Q՗>bޙ(h Wj7^P;/ WFJIvƟ,sz8QiI~v? gg1.Wp}yePo΂ p+ÊX5$z{}+q'֝BV駝&~|u֠h/n 6Yx 釓bI->6"' K9傳Kxdnz:ԂK\  s sQ8)O^zzP#2*xѬ9N0[ Tzds9G1D^B׺\E~%P1_c҅{r6&՛~*hnR;)C=tTtY8;}yˁ0mm|c-2jUc$?ov0hϓ**iDc촇Z',tnh)IWBpf7]-bʵN:1`{o9\'ӱN" ¸3̞sOܱŗ޳`:g8c-`r.5`TE]J"%r!rt}U8W2Bu7@3,?&GjX'<_־)i`aÆgn拃B^y|wC~oz F}N^EuenSS;+ xjޯCBqWb#ܩ%um_Q`պ;5!vEcЮšzj92W /Cdb^ƵhU+#3@fzxs~͢V@k>z= Fdh, aT6Y.]OBae[^K5Hjͤn/[}2";nQƑΗ8wq|?`W~MQEmh}vq8<$%E\;4&|niͰQ)wEN|z?н5 NDPQ?_(?{< 87Yx L!x:zz[|cXp'Ool3 oD8> ']jF1t0neu֗7?Ν4[hu sOwzoJB>x#и֯2p/ԝ \a= VKB~dLIDÞ>ٰmQHGl!f2iʻAcq'_آ7ޱn?mkhȰ|{ }c-^Rf;+(CsONR߾\6:y_gRMҧOGĨY[Ϧ_{2ϼsycywmڦ;X_E;}NOZbhߗw" .k&5lͷoi`;u4kW]tO4 @f>' ~?'{ϝ'*=wb(8f~<;/jq_9?oL/F 6la+ B~ endstream endobj 102 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 108 0 obj << /Length 2544 /Filter /FlateDecode >> stream xےH}Bl CWEUIȆd kP`.ITW[4Veg|ZCٹmy;%P p=$J9GTr1GZKUBuJSHjb,xIBe؇ȯEJ)A J;4{oy0/jtP QMB.iaYUu>ri=TEa-)&ӀЇ{M/}s[ }Q<`3$ JҨ8}@.A}g ci'ϨF9".?n]=b@6Z# pDIbf;Oyk \ܾ/ϳފ02E땛wvDgE8tEв.x$l,ܮ7RH Ms5RıjڑĆɔ0"Ou#&pqz|D `+ nZF/ (`v6V4X G9}!_ne 6\fi]i<++Y%xI5!Q$y9#\4I R#HI2#j)wŁ>F\z_[0 (CLKQR|eVY;r[+^ [NGS?Zz抳uˮT, m|X#B?@|֦7$^eYkGk>ۇ˭(C5ygOXo)I1m1]'cpç 2ɃjϫaĘO?o2/tUg\Zo^euKCQpF2EL[T/II}VrXl֢Р(1j iWq6+بJe8+{~]=bcT0d5Y~k$ӹ2of8i7{>Xr=Y_ASuڐnǧ'_ 0ѓ;ն`7KmoSb5xMC3 O [ vn _'U^<^}Xj`CSb0 ZîC QO~ޘp,̡]%LrVNJ*v'htzu=˳$duZ`uEƫsE#ъ]#VfI$kԉN3S>v:0Dİn%u>꧃M^{i4]Ob@.}G R98 @q-Ey1#jҮjXwΕ8`dD&SF(iDH47: r[;DŽΐH~Q>bޑSRiȝ*}im64SyDMs ۆs֗ڸK⇦5x}f9ҰG]x o HAOZL 3ʵ|f|pir[*?Wq2/-qD!CojVe|?:CEs2fb֐v?f.]o1y*bAIYB7h\, , endstream endobj 117 0 obj << /Length 4154 /Filter /FlateDecode >> stream xڵ[ےܸ}ﯨ;F!#6bGь&l-ia]EUji~n,uQxd@"3<\xͷo(-B0YT$TŇ降%5bş;ڵ{_pp{ǵ]}O~@m鏁s"Dnuc%)Ԋ/Wf\bO?/JMxv IK¸{xכ24>#A*T-TR QuH^ݧ8,4|v@G"|QAf%YAJyߴms{',:dQ脋5nӺ~ ,Byluo],޶{j9/I߽=sa׳f4<-Űb MNeEJh ]KQ]$RPݯ.)QL'SpJ)wFƹ* ]=pz*Nj,ތ fmF/ȌHEMɗ+RC~?sGni$h>ݾ޵Cݿ BR|‡;ʢ96  /^b \ӡp#r6󵙴$/u6L98Ua{- "lNh YN^?=qB99Y y^qNٌ~JeLޑwӐj%(f]׻7>nUﺺ3ڃW$%.e_w_v2ӲĎNRĻܤ>ZnKX yY|]o) ءе+G*Lf/+ g֔Rͷ#glB:97;sɖq,%[qO\r\̱eRQc᭳Z'Ɗ} ^i{/*c; E|қ(+<ȶE,wdmg@aZ~jJ4nIN}7\a>.*2Jk'&i>r9;:?l,F2)B_9ٖuZpE߷ۺA]ɨ =iumy3nAyHozBqeCR ?Zi/%e'xeT\m^{IRa1^2y?e Z-x@W$ MXPD&DϖLF^VIcNXX9[̵U;G1Yp\Y12ר(8oI~"39is":W隆.pvCTJd;AKKTHhEa;f&:lk[]=³_l߹ N9s*0+x5mk:O73AaGv?ǟ~=R:$491f B)4/,h/yq,hÀa>ÅIU3Z5~=K ̙NVKx {IܠEf3`DLHqQxM|oI,0!CҕU><Wܘ${C5wU4ˏcqU$20b \4_I%Xº]nb X0frR1Q~f;zG2YH`L՜,|nI;v2G>p%3#al"3Kb1Ý@dY)୫؛P^NPnŏyB{JV0 ԃlfQ6T:Sʓ-čd5zi}%4܁ͧ^:J> jwT&!椘ל hN*onj-l"gst8WѪW~* ~|~}qUJ>9ԕD9_FjA/4ZUN@:K[uqeJ x}w'XX{h.ѡZLƞ{cKSyHr<:/VC*B⇇I}őv_W ee=9WW L MN(l| k5hi&PjsǧSԁ 4o+〉1b!}tܶzfi.jVpL˹Qq鎵͟`kvcbpr(osU\Y#̕X>2= y11z([ڴMnVžϟp1]P`4f@@´ ;4e uEwo9u ;|MCf bHz~9)'̨x8[?63񺮿 ϫṟN=vpނ{=;Yخ?mWw 9(QX.{_akg\*cy#݂⑔UD54RGԮ|:}O=&x^&~|o)lO9M0UȄ-5t7]9h8m0>Zݶ2Iw>xTB3k[aЗ47UpvUR _.ͩ)sbΗe>U5swXYwMvʛ84JluCRuw&5zJSwXC7.Т#CNÉz i/>xX;UH&5Fr0L5TfwO@sHmhu:׼*LJ G7Z Ixn|-'*)R߹sT]8¼3];O otBioKXCe`ݚ+Z}ϱU;QIqÇ E endstream endobj 112 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/fandrhome/matloff/public_html/matloff/public_html/Refereeing/RJournal/articles/Proofs/2019-1/2018-57/benchmark.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 120 0 R /BBox [0 0 466 259] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 121 0 R/F2 122 0 R>> /ExtGState << >>/ColorSpace << /sRGB 123 0 R >>>> /Length 1803 /Filter /FlateDecode >> stream xZKo7 $H h $Q}#͌f#hgF=$D1`__"6Zn,&p)n6~5"X>|jߜDu& wF܏ѯ;60%VR*5/%%[ZF G 덲Oasx D MZ]'Jŝl'2`@$Ҹ|@" <ת\⊴>[q$3D-8Re"A: 4 @BH '2``@$sȤ$2`@$sL'0d6@4-CKOi{ۼ]Rs[o w V5;;l 7ow(F{Ltz1Ӷi;)dZTՖ?t{n@[񄬸)3-h[U1ܚȸu^W \-k=װ"SB@Q4\5}@ϵ|_sS\!]k;'.qO2]1e[]PW FC|,px?2W]G?'jY Պ1Tٷ.>p[ Z ܔ va/% >e^{'BX6[bDܲ@o絝Dv<@:Ì[P)tB?kz&I'tqvxg, j(?]k7Yaf6\Y):FOYx<rgEƥYg?-\|~㹾g?U\{كF8-9V/. ۲8oŒe8tEMӐaGc6MAv;391RMD]FЧ͔Є>4Ӷ3[0t]^+GT'dm5 8 _ߋ 2]C̼!ur?~ȫR!/vhڇ!Jrr6ŞZ xjUd`n}q4Vp-;g7{_[ßno%y۽U>ALo3u7a,гJ~wE*}M9C\P@5BjXv*7jqt QS;ǯکG{oJOj-\ +:8Y,чWBj +%QV Aj-j SYbYg@F^ j4 5YLYg@lZ 2-(E d.,҇B| ^kxfإDwL$:KZ$R!;1ho7 ~<:4GK\ wqƴ7H})HPbS:3YKA(z"6ßLYh?u81e-_yw endstream endobj 125 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 154 0 obj << /Length 2618 /Filter /FlateDecode >> stream xZkSίЧ\~PUHHڐ$%dȒ,K~y!ؽ’fF=={NGow.vzG #.#N&X Dt1>Ň/'~BFab*$$)nNW~I|Kw{߸ם.S< MAaAew24XbQs1Z1;o.vc- ĴΧ/8BI3:uǑ Q&ᾈ;KYD2d -JJsWE^dtԘ _t !Ӡ\(k. UwuxkU|?dh79)$Wi6L xbYG"M6쎳qUyIqSy3!UoY9U9m$/^Mk& [1$M^hz|# ŻB,yvIU7˕_+acTWYx Z"֢ҷ+C5pZ QL{ްQU,L=9?0Sh944ybi _6kmnD80"|XduG19Ƙp'Q: ]f@rUF\huOZ:"nDƊ5pĸjszu}3b^9O=4gK)kCsbl]d,楌o!|ǁEW8k:/G9ufмjMikjpL1=N"t{9#(FX 7"$I]}$I%7ٯEXaA5|-*> \; o{"ºo $Pv$IE]fs:6lx#WEf ى,DNE{!E[}1<^zx57v-,kFUmPnߪLDn zk<ܹDu b$.P}=젧z.SLi^޴z=/~v4!y؏IEoCx7j*&novwpVI^d0ȆT_=e@etʼ(fk4t%$=>;m^" *0-v@JFC욶äIܻ(EwT~i)zBtu+b3!t$D1R-`"{_Q H#jL8>'?1( Ug%.qRh4dE$dݬ.r!Gu AHh)v޾,<=̐bL=SGΪ+h tc%Ee0FEjRiLm`އХ4%@CӖ`OyR fm fl2থcq:mnL{#'a#iIi$d HWkE'!]<)a(8h۫  "ۂΫ%P˩Ù Ԅ0\/" 2i[0(j+[Axpr*yxxpp1i n\ZrSpZ3#O!Dio1)ǘm-(ieS_xہ= #TmM*}֥T*ɗT2^=9RppbScT[=R7ԩ{^N,PRZG5bz+a F,T֩YB8X R  yd-DgzlV!Lɂ-}od[rC>q^ck S+P0z8JJۤYβ<}oOG u {Ȏ;:Q2vGÞmhMf46a(nƏk!d/_](BnIɅ;)x6, ҜezIlO z{i_}3~GR{ֳIz?"&h2ފ1 ,0,'8fz*Ĉ\@l{! m9[Ce+8u<-{$ܴg=`*Z3=vl*dOAk?|@ "j6J]u"GEUIP&9Վ8+?ҟx2)r ZҌ1l`748,EaƧ*StG ~>:<^&Uq^·'W1DX~s{5Xi>tσnB҂ &oU QeQ V~,:~EuхSq l{Ϳw&TBrܵ1gDSz(, 6?j~:8]o,XN41BhJ9^/x/(f[>/+A~j," G!$}u0 q2+4.$K(:Tbź\ p  endstream endobj 5 0 obj << /Type /ObjStm /N 100 /First 818 /Length 2841 /Filter /FlateDecode >> stream xZY~ׯGOmvc;>= l;r$ גPc+FʖWHfWGl+HOZ9Z: @;a<Fx (ae7wD #jL%pb[rZXpc0ou@gc &@IJt$8`txɁe` E.&9; R0`D,2d @KNF1U H9HH K2P "QQ0E`E =x  !`'(Z1E0zH$|I A=JڀCZ2C !X!@p73 >LiDl=xFD@-`@8* !(㑇1P ʈI%dx Lp!`*ܐTh,xň=S%2WbwB LЃEv.'JdĽy1ljI'YSNu>Sq6/|:.zSr{QA@TW)N+{9 l7n!vCjQQQQQqZ|qٴߗ׃AUU]dOgC\+g؈W6%bA*PĶņeS)uV? DH< %iyEkwwX+=҆TE|~.#bQzD%&8esZ[LSZHh p)';吝 :;4l~e_(_|3@Vu,xr,ե(5;4Į$q]wbߡiVKoNǁq[ГHڈ,Nr~!H9Q,9r˫9uT2"/me[0.P֢P߭X/)|xƃ3g(Y>G3UnZbtO g?XkGJ_FY:#hpͽ2 IQ_PNj>#(֊N06R/ !:j* ( CvI*F= }"8ɶ3C{r. F|h( O+A$@^ Ch K8Ͻ+8^_y! . Ȣ2\?슾Ij~/-ЗE 6b/vMMSXcWXXjB$@Y{:qUc16MQOEe}<9G\Kdє{L-,м 0Y]vyw#Pgjx^c,6۽Vi{9:ͅbP6R2EVjEMJUy 9gNb-cw¦Mv۰maTseu6vX-jE`5 W^O^'u>)sӢ-VŰ'=oljp&  ?ÿhMϮ˼ }bha>:V wI$M.1*{!?'ӼEqɯ{w=G9=GUB՗M-QUcQ ev]o,."p1olkTu9x%1٨y9$eY>)!%y327$ʐ"ƮEضcJC@]+O|3+c9D1psCI&LDLoRd4_6~}P[5:4x$ 6w؏]'ڱTRu??FB92{YP$ԟ'@ :d GK?[Bv|-s~hh$Ӥ;6M5ie'Nj%QkuKh;wmn8)AHNiu&(wwAwc >e1j*u>?o#%`/= 4o) aO0s!=IDm>/nYvK L`K- >щk>Ti#Ԉ1::(ڑ"Ẩ`rB~kɈzs 3h K/kQ5!c[ >R~r8D2Wv!Pq)ŧPodpw") } dR endstream endobj 171 0 obj << /Length1 2867 /Length2 24297 /Length3 0 /Length 25739 /Filter /FlateDecode >> stream xڜT][.`wwwwwݝ%8w  o>{o0Us-(HDLv ,̼[S;[';kcgcO;*ֱp PP;+ MΖ{1G3X"n vt$&3/;/; ߆v1fihDpYX:yPҀ9ެUc{K<js a c5 Ll񯿌vol rDӿ]Lf.4a&2:.f@G<|.`cnסI tveb/9-Йb [31; 3 d 0Zl 0A=fFff_?<[afgk\\.f1sx1X<n6U6)ߎ2v7sw_GPv>3)fe|?{=:3=G_6==0/]?v'`tR1~9g{.$m@-RsPeDl-$A@3e% \bA@e;'_%x%8Kn 2:9G5/`f [ +'̬/tfbs]}tDk89L"F&߈ $q#?$~#6o*~#p>O7Sq3(F&A7gPiF Z 02~N )9;_rg#w;s5 89G. g.mWuΒuN 趓tiiXơ-41Բ-J-p18Wt}6±kЪ8:Uɥte T:84i_q36I\[nV 5L%[&}$?.&41hϱD61^&)`,|AyV}?Am>nY͵[iO/AXÒ66ňS\'b`45}_z1۰ֻhXcZf5pW&Hn@SDD,U@Seq 5P yqp'7vEEs**Y3ʅ*(|MD\=&B`H 9;3SOԔ i=l.§KMΖh[QqNtN&O}S[tԦQQny\@a^^gّw"? i&Rf5D\INB q/T;ug;65ꮐ,~@,E[rR@޹*bY@ZٸBFq _5F ' D9u(?muST[f nVIkPj6 Yi: :/ܙɜa`\#];` `I!s_fGoݠAE%ǀ@<=_(\pegޢ*w}*ltN{ըu˶XtI6<לv:*$r{H=R[Šq=W!?4)Ӟz64E9Ƴ W/:{ѣϚ[j8B';I,׃)_4}+rWsx0Z5j>o > ҧ' uT: eOB0>i[eG:Ar8Pf}Cg$aR~4nyGr\>SjAiS=7duZqhwWx \XaGo# )RyWx!cmL~eYe'2 . Tyk[C`%?Ơ|5Qq͠bEW@`-Գ5l*=_ laoheDvtn~=Ԙm4&džb.)O$wؾ4SY!j&CҸ٫'e 0hCS]F? Ιa֏z?}VX<ƾU*j"\Od^O[lvtY#vΉFW0yhf'[G`XW]`!ɜQ|v*[^ةK|y@B!pVGp+(0xl_4ؤoACͻtN?.&~ }; y=H]4`76# xd%Uǝ11 l'0=$Ͱ7( c}hnu1D̮5?vRbNY@9fg'Z~x}# 2=7B[5˪2dr)8~?Ol7f$?ȃ.5E޸/XѠkzrbGq+[ML81$'q:,QI4M  mKϬQX] + v뀜%$ن1!i,кal vGZޭGbJ>ڔE2>EZG#1B%C+ :& w{2X9X/W"t;L!3$ P\J DyIAS?QrVB_gQa:E)*z&]Y C_:):kQ[ IC_C Cה9@WX&jjxb$ a8;}g>Zf@wB8Bw{aGt+_9aڐfoAB"WK=]-ܣrYBBuؼcUFMG*6|iq>3[Pou HPxwT=܈ Ʃa+?r%@]9u3S`2!BSp~b3 i =`N,>0fw>Ζ_\ڏi3f[SF_J[Â5TBٛ?l&RPGRqYa_xt K}-_pa?Sx QyUa_iqWY'2@LULlc3kj\T{ۊ&B݃DH4wΘ*5Ĭľ9vyrU0ݔ]UBiBg x{^@ Ȟg(0:IPkSlkCt',\(MkזٲiZN70 G_6b-+BOP f-y9Zub D#JfbfvN]k~2炜_;=hh[?v`ȡ0܃ɲg0E|&YPu@~ 4C̃fG 58'jhdF7OȮ(~~^֜UY]!'&OCI[?P'oiլU%Z+C!aUD__˲FR\aMƁo/T0*/D'8qJ8\Vq. /jk)rNz*0d1Ϡ aE߫V)h66FˊSɚ\dg?]s \Z _*,IJww`:$+fW~zHz 7|gcZɛ'AA9[DCMNϥWϜ x xþbyc :'oôyt[Haӈ+)BMy?YmDSwckxhEm޷>j4>vߎ5rlk4v)`3'f|>zoQʞX27/P;swk M0ENZu5ma >$Ҙ ,t O%y&9EN]e?3WDj$ig )X^?6&w`@̹9oVMǴ:~*Ͽ .WJ _اpft-1`seu$x8:[ VK7#&SKU&k%d@ [Tܳ|潡Z·b&ʸ@ҀJ:YS2nIB&ex'"#r6[>:c9 ';8I'n8Hw>6[X: }8\^"o;-yl0 86RKmĮt&_ǯZ=uGE5]0^ӱUI'c/eE|*dQ2Qi<yG Fuqubb/vƒcK" NրG(>-PD[r90 ts JA]TZ^)N 7g 2Kȁs^uSj7%?`Eٷ3l^գڰkVCl%v4Dh>yI~_QМfo:mcx VþGIZGAĠM1Ǯ{7KOk.҂Rk ʍRަ3?Θw2=*u%lKĝVޫ5dYp0. YUpYy 1(\8hemˑ!S36MLG S t8 ן=*ˢ:AyMPg/sb.5&L_TeOaE!*0mV}O4F-yV'# XH"L 9*\^6E~C XRo8k?ø/ҙDo7dzp>}Yrيka,5NÿPʦ?j6q4cd ؎Cޱ6iFOYeyݱ =&cch/G{՗\zqvԾlj%6G<2zDBBv04;,0?Ki`pKXcN%^s:j+%rAeh"S x!{ei H>Z>2 ihOƵEO/;ߋ}ubY RT `$;锝Uz#7B/"K&x%PUcM68A0Ofi/cHy&'%XopD`KMҷ71 W)S. GjQ`p-d=1| M;CmX<8̃s-@q,FaMēXN 401;%8uf8-Ldt3ﺪSI-5. ߞ vY4Z3dRO‘ g/qhJ"߂L$0JOz'䜺KBu:[M?(g@)$=N)etb~Y;&XA @5d{OGb<+` _~0/N(H .)5B/( ̑O+$fҿҨqҿ`~ɖ_Km@blDyb檶Pxhܲ{WSi )\ 9g4E9iHˣ+)q‘eNIקK"  kwFL w>Qz{qJK) }%k^v]YDAnK{|NP-־_ 2@[ãQ:IepdS=)‚H Si؎?L&{ >}N|l֠mS¬4 % nSF)b09'$8Nń,D}4ڃG):&K+m4eE e3 EO59gHo_Q6[Qfy%yx bnT̸7d_exԛ t|dEbۚ-ϰa͈TE`@HF8V;]dҊ}ޏaК. |uze4Ԝ$jjYrDzzo]gvn5>&WKG]W `ƃ(]/?@^؂4'&I#V_AVxK9g˟ SzԻp/tPqb\qLEڥ!7njY{.\œEE.(5冱8*E(_e\?|в]9H D2t`f&ʦ~@FAo l5AmvF˜zV2m28yiB{xg Qȑck7V,ў#Erd:ABE 1\|衛0-m 5A^y֎4&O<׽wIwQ%ەSr4:}Y=O8-\?xj ]Un 'UjIP*Fn(HMn(N WǢ/ ,GD3ܯ#G s(R87o;՜sp$#>w0* ^ wظ=1eu;m㟨 urjJ`+o 2#9&C?ik[{tAZJ K@%Kcj=e%/U5TNv2kcۏ7 I6b΃vQNވKK^2u'x5$R.c5bWː?U2a ёG͡`j`2[-OnaZ^,+➐SIk@%KQd'Ʈ 3(=ɜY*,;LQp}q lq_'-aYs}h& WN2o %G iyPdb"ۅfUߒf4N?C'ͅ J7j?%f|ݛp.Ϗ yu HSW=M˂wM咕?N+g^-lGκ[jUү[_CU4I?0cE:v~?x2~\ QBũ)"}`uqtcn@O]2q0b FAO瀣Gx]`|Rj$h9Itjd-Ak P &EՀ/_>͙3-}.by*  #E a[%5 :/wp.,"r.-{myL*M|jj8m1)ɢbMozL7dbc-iDsyoylbEQC!5\Zst!d])TM?c=Ae-y_`{2-™9v.Ȫ^^Tp]ĝ*=:m_+YV܏̌rg)Yh^#uౣ''9͐n<¨Tݲ-aG^E8e?] ԞVaPL#KSR&l酔t,Z>@ MAH g][?WA`et!";'b4? "<ֱ=+^kScNor|'~!㨕m5DU8QmN+Vf^HvY[S[ b`?k&K 6 (xM~$mÖ'.oĮo ә(B%rCGƣcolmP*CGzymP}0+ȩV%aECL֗|5q3GBU:gNy`\39di(Pͷ 8:^KZ_0R*^F (;r/HtwD싫W2";avIM*Y@Cf=`Xϊѭ. ryigs3: >3лxH( P`O:PApsv75Tzԗ(?w½p$XSPm@Q&nX(ak532O~*t.gkH!(hLDw]68]3: 5xtPjM` ɘD^/-AŦ(2fZ \[B2_ q'^1:lF6[ΕՖ,P~T?*pS6>NȍǼ}צ˂?^ָ?".E.5@.UGt`7GLGs񫎫l)ADD6I ډ"땶pVWOMz RnD4@b;am {*0Q!` K.\rrƧ9 %oJFU'Y8jt¼#."s6$cƞX`A"tS%yUY!RM0;cKRMЛu"I=@ 4NܴPp[4zۛ|ȥJd#$hyg)HS*u.rFS9x@VsW2>yo} +*ubS# !Z.+Ei:r׺S'TS L% ) JS5H Om 䣓owC0[u(v/Clnn6ޛTu4ho}Ѳ`6͙e,qVinIޤwsG ⹶;JE^aKl!8O!VI;G-DB[Ro Ŵ"2/ruꄟC%vGzgOq:F M\g -hHB97Tip3;G~D3QcqU-| N,TVy# %ӋZ'kIdPTZ!YVa)]l| $ t$fGJڨ_5o ??@w*7fE[!:ou!n樱|6f-]Raxl<~(k#%T #\leo XAnr+_'{:[rs,R@13SrZ#3j?#/Rx<87 h ڮ3dENް>4/=&;~Y6Lf T)NF%٭b!7~[jAGj;/wC%Ċ#scgO5Z4{N*+.xw&`Uf7m"x"?:Gw"˖a-rÊb>n-TB^.]M bzg[(L\0ĥ_K=ڥ̎taLOyHu=瘻|YW݇Ņu4Q}0Sgr{:"?k(-#}N(R꽪=STsMKZ^T4yή]KTšե*" YӡL9iCPi*(ǫ)Qʶ,/D%)r !ND=\cd~z*'4lG,ʝ)vf;޸|D@vMЏa}B?YַF#֗In8QE{]0Fo.2e+]?=cQ+yMOŧjB9;>^*rmbJ_i\8z ΠE (eɪi܂Oy7l6dE$Aq5,roIk x3OQAIp1bd_<F#uV;k=GCYn%ԘWp uO+~r/r=L;$3atvD `:,`Y#,F?1?_Djj/ be` } =W )ESs?"'. (J?9U!Ж(lxCÉI!A I 4U*Aì:Dm@(|b0ߗgMѫZt8x_j2ZVPC{ik$4.6/+! Ӫq@KyHn->J㽻Vwbi?;1qy> TGDS!hЄ ^i$œq I}H_9\,M -: &Uy(Ja&9X'"V"孝Ic/ PGx Sv#xoHM/qwhm;Naٗ56ҏt>pKgTiޢSCCDRR+(Zо>&v9>>pܧj&9P Sum@jW6=4%7wu݆MJ~x+m|j-a _f>DկuVb7¨^!a8kEDh"_k"?( A{^,r-&c$aοx&e )C5J6lBybcjfD$P\'Iۄ-<}wMG&@.Zrt3^\po'kPV_b7j..G21- [%#` +3bQݼR4x\FtY[\e/)F+1KDۑv/&^')b<6O;yLc2!x L +FR8y_L*d,IG:rb7yz؝ 8" i+ + W ,X_aRV~~!,ŭiH p/iEg 1ݻkiBAC3:餢 }sۺ0[:E R抺e4vlmls0o9FE3E ?\tHec^[)^TO`%aT`/< v5 Vi5e1jFlMZVi"Dğҭɝ #tB39LN셄o A%EГ2 65܈2}ԫ3U+ CySmQđh~M|ѭEs4'Uun)&F9KCR.)̃&j9=r\jOD6KOA:鰵^hɃD,3lE/[_Flj ᓁfO|=x^&=$C,"'76KuEu}uo/.gSRڦs1Nu9[ CrUTCtT=BmBxe1H3**/s -mZPF]'ԝ+)7WB@NDꗯaX)(/_jO0 y1cˋZg(ya4~V<k ~<@~VJxT7nk֣ok f'Xv =ɦ{a(ICWeY] |!CO3z(GT 8*Z'1GZr9 TfjliTHن!'9~pmP|S=͉%sYV W9$lѰ0!uBWz>-=NVsnE^@8 b SgJlUV8oJ/Tgخ*Sqsk~RԗLq(I%֦h+w6ҥhob1%NV /GF5 nO{in{W:-6Qv}ҙei~9xF M:1U"kt3(uo8Lq$mUU{\Q ~Ȼhl"@a8솉dkQ4b1=@Q/54TQS_2ԊS& 7ӎ4K͛k?gOFuB"֋,n{cU.%9R2[w,LZ%gx@RAUv▢h* =R]?:U2yAx t?j rcר`~4P@.Dd@E4aqD$+9n?_UT/!UEo!#A1CJ)'oe˃цI> 0O/}-YiXyL g/HoaH|M9y }ɪߑ r}qUñ_m"3=v5\B4{At=٬uڸfES.  `t?XRJ ؝FAKivp+H]$-yՂmDBǠ*<`֣-:r'?R :5#Ƿ+6C!DQ?9^pkÜF2Z?_8\dy3hǁ֒[hYPO"[ݜT1>G >ZN<&O3+R}K@RtaItN4Cw/RSPK8q1{Y~ d9 3 IZOt},ZU*dEp<܊o;"B\(Q'"p4 )YK0[懰&fk-M(B\Vh!H-}T#+Knk藒Nӻ<6-P9bXS@E_pŔga"D>OLkTh( ^~]ێu[|^X@y|FTc+zÐMW8IrvtbnIKeBϲJB® !#_Gf'%}^@ êQАȰ@)^F'ev3ʢ @ٝ9Z L9^'κ+ߦ};J%{q  Ίk21aK4B6“{2]VZg5ۋ"3&vޥZ1L1*'Vż*0 ifiQt0|qk AO -F:<˝GxNҢku5qYB@ =# D=dVOo38oM ⅄r8hT|μ͟" |mq=Qf}c4TWJ"*32([.bLWDڋ+ԄΉT:ow'ATj7zʔrc"}\ C{M]`VTвxu(i$ײ_G1R_ǡC{_BJWz=2mbXvwo5ĕ$tO>S_:tk իk'\88Xttꖦ&d ?Dtﶳ^Fh:_moWi;F1:X콷2DmA^Cvp?f@>ONO'-+@ ʳʑ۟{񒳥[6a$$A7Nl+郦/=菤z AeeeImKc}B(5,OH1= |?߄K|CVf\be+&s#%m:7si9gM`}/PR  /*13`/5mE:dGZ]NaٟBQgDz('yA8gwJAlLbu aK;b>hܔgõQ7ZV,7kj{:k~6_h@,f~; ͧA℥XMRI$&J9kzYђ t:qҁo! '^dW&Y0!0@hi"H/f0.e]2y[h@s;Yk7>@Zbѹ%GQ5bI/k4lZfN5 .$;z&-2K DƦKYroVfa::Sx":wI˨ | X1 *#qхqbdG؞FRc82" 'Np~ X{W])fUmad):q꟰~5d.eO*14>B L<܄_}@ELE"O0BG*Ux_ :L;h?e%>,5aGJpML;aVxZqM9U$dJM2UrwŘi=-P疛GB%ygiۗ޻1MZTY,Fvؖ1:{d>ڌ Ѳam=G v7MCk W{)l=29k""mE_+TQmjl:!,,/=])<%w=Q$6wΨ"-\Uthl!4OıOi803rks0ugCwS8H6bÇ$5[Tj9\B[Z2:<;LBKR9Ξ ̛qnvϓ9cS/Pꍨ53jn֫PIzH9_3T2 /o2ɿNn}.Dj)dV hT zu^'!tYڨӭtd jx sȾ̾!N*n0T5bޯCȖQEu p%U̍D\o|\D>Uk*]' Q^, e GLo5i<A#^[v5nɵL;\WfvT ]&l˽5 ¿@%#}@=L9ĤՏ",fbжàfwUYZ(@SS= vN6R_ ]nW#tN SαApR`Z@u+?5Rl̞eT"QpB{Q>9;e!]Ʀc=NA\l+5`Jd~(ɒvPF;@-s`"m9¢Gyv:FѼߩ/kRI6)CC N!nh bJRC0kq#KpȠғ{H5渚,UVƯ*̐hK \S^F,ЭrRgp%3/թ2?$Z 3s ez+4jxpOE5-iD05BGּc AsZEGDyw[o<7Ӡ-s2"x,B 򅍡1L%&y[ TGWT:yE.d!xpK!&vk]i W5 C2kAf|;`:;kj蘱uB)ȴ|%'ޅȳ|$EaER쬂YLKozL^MϨD"3|{`ƾ$T9PO WSdK4o}97LKyw} R\uJY=(ۛ]tB7}fv+ :垖*;E 1XLȡ+磘th*6D3Lo#EɉaqC:`\՘z<6:6$1D[ͫ|mwpnPb=&g]C|$r*E .twkTcd/$3jΪlŚfsx"j|g7(Ď%mJi%U>JdnC+3p'oO,-ZBz}YNEG=cl7&NH%^nUVC TLvdUdX2פCFBjc1h/d) B-9HVr`Lݷ[Kwհ5&]Ν'ՔV"O;QJxx/3U?zcݶ~CմexOL+*%R/eJaE%B zE/ LA[!R6O3`LxG" eF|5(N:2U/ɇG,6>q\6\_/Ql.^刘MxbjF#u&/ۤZQ{ફ"¬VvU#nl кCp鍜*8wտZ_" "1 y+5kܥC퐱ߋJPt6=^L&4^^9V$ v:qN~ZV8ŪI]4kJE>3K//]A-,_NV`;jS05 ߅3UURrb5#F}fNRx֧޼ qը4C쬱6)irReB$!%JT $}$=7ȧ[qUdbG*2*s,B0t`-3R MFfW+"{^{+n?\-qe~Sfz%f\1Lj"-[{LhH_ 4o(n~=쭆 aJ;٪ݚ @&S#{Ì!̅P V+X][L9 M F\ejZi۲'*.vޓkރK-]9?K(RCH,ԈHh-/Rg3f@ Fnjă=b&#_C ^zA~iMFL[;'.C!TPpće_+ Z@`\[ms5GŖBבu$b *'Vr]x|/uaYߩNX$Ȧuo<|~ ާ{u'~VPQHiǩf28 v?sA#J7F۱ Y :R o% gA/c- cރ:k'm9cg Bo*pjrJe'[5 ^}Ln|QEL!S}%ץPtR:}`9)JȳTS',&ؑCe[j4?ngM/BjI I TrtI"lk̐_Cy *%ޟiopxq|e΂;`a?}!a|'}'9[Z <*tL{Nht﫾| ۚ/Kmp6h_K DzјВeX9w-% r,}j)9!0 0v¨(Ʀb4{rTEwr$=!{vKr(#뢶%TMy!ޥWVT 5=9c\t ̊y|6p@AFw*i[yiuG}US!\_\c+M3P @:~ N^W?5AN9OjapW%v:v罯1ոĉ}zXBbVBN 1NZTS\xt[Gb20J]igQ#(aJ$ ۿ=vl9·hj^/u.*R:YbkV*9_pVz.PIJQ;f8Fz?d&eyȏQJfj?El.(zmj+kM~X;73A]R[ʪ*iʩqȇ atsvxm3ot0iixUJ%Na;$J1~}FU+6Oˑ3I1%2*`GeA9/^LhzJW,-HI$ Wq(QWkpu~ZPiICkPv\c=@s٤b.Ē0E\Ec yeXL@X6c:|=]A'ZB++V } /H)A27+V5`Shl8~z@ɸtM.XLC-KƱS9^`;{k6 {|;"Y>BMY˒ ]; jФ\7KԃvcbY(HhOZ,5bYr?*==3F쫣J@Co$Vё7 n(MqwM.{Pks -Kh'|h[.`gmR!T%?m<o !#u7dKd\~9tቁˇ$e,W¤`j`EC(9 &mIaosD ~b 8vIAՓ3n)-F}vw۶|`t\FoޥP?n@!C\*G*XϚiTnyk~"ls۳0 ~HVp?}vNɻjnQt~=,cC*S!bHTlYe◩5>я۩9E Ud؀<@*탅$;_vFhWkX:;&WTw\Ȼ ;#![܍0(pC]>ـґ{^ŧ ]ڒJf$ę h]2_ڧ4[_ؿYlwР]ؗ”Qo$P'۪ȷ &GR[7|`j9!Փ Z$4L`1"\\jʛAn2+ȸ·7\(0 3:ڭ V[ܯO%_$\l޳ٲU"Ȩ(.Vs /3[Fq* -\ QrD,"D8F#՚g"}w3[ gѳ ھ(YIu=}A*pg+W~RxՀ;Upb tfx5ڑOU(tG}S> `-O.$Ԛ(踽פS?[]ktͮ]1.m7lYkUS[o9!4'e(L횷pZƳv<vuvH3l*#Н%^VOȿ̘ۡW=lEVQ>*vcʵ>u$%QŰ%T-WKG.K*!?nz'"3`,Tr1b endstream endobj 173 0 obj << /Length1 1381 /Length2 5916 /Length3 0 /Length 6863 /Filter /FlateDecode >> stream xڍtT6 -9twJw C0ҍH+]t#]"Z߷fg뾯`54P 8J((,PS EEH88La(w~s(B 0>5 C|@QPB()#, @@0@Opzp"<0g߯n0(--;E 8@rz`:AE )#$'D x~0  EB!_+A? pL]`LN(? 8a`(@Lw. p@AU  x pC(?ܽ|/r~h(@ F70 Ig`HȮʷ6qlXd>?)3xr×(ԹO>\wۛ c:Ҍ:σ.OntM-Unb"#`tdێ{G° Mʏog76$tH/*mʧ9fPLDԇ7ONQf$x/I m"|6Xm*xњ $'Ze+芲id'kMES0O.8!uFVJƞ B8}9PS6_jU=hN[+S4o5+@dfr_PYDѡ3lB-Zrt>Ȍal 2Jt:H0vF{bRsght ?>TO{[id:ز{bW 㞥-b7dڙ!q Z~Rðk }/tS~r " >_UJg=ҦOK]0ij]B1I `& 1~C+œXf_Ӧpil8j Ě41ϓE? BYb|Ąkv| bƍkraJ/:2| aVǽ.Z;Щk]r#GgY$? NxJWks_Hճ ~kTaӳ{u6pI:+Rk Iutlikx遳}HRj(QEM0í43?|Ι-{%2.Tn{]YBerX-]np_kXEB?.tmq#%^5:MsH PڎMmy&HBV`s2N}TTO\O*K*=pnA⋭cp_Ѻ/-[..Z2.;%,x;9{x=6 )JFC^rtd%17:n*hv5m o8N#7|dLfmA{\i+qNUJ9}>U_Y_ֹ4E S /W ʺ2*ܯKtHNz!duvVC4ŸfI]MSϖ&T[`q{^E8Okhީy"og%I͛<0Z-DT:c@ov6{$;.FVmt݀R*] \DE~S QdQ (--iWLڦn&0 ~~S:jv*;gֻ8*tUQ.y%t4C~86@,}3k!3_v.O؝iBr &ӌIщ|k*<ݢ`ro]L@=5 LLlZ\r̓O3EH6I 54~.7 CM(*Sio^*` ĒrRHD Id -~M1Ъ*Sʸl4KIܸc7qؗ ټ|SǬ| TG+̦΢{Zby&: any|mUKKTA N-}C/{bS+%38DG|>{29 mx$gŗ2"MI:n֬ mIsIz]"èy[HoqgJdBm$Ny8cٍ#"v,h%^9^ŖM֓){v.7g'&4o ~DZ84%7|J'9|57ٳR^`E j%ǚ2JAsM~r3״G/1Q6'l:iE@Y $h<8EȞxc^9jr2ˀU]nAѮH>qx5/povo[ ?ZItsz? >,)1!T=B=ȋ1ЫY]Iy\7AOje|ښꞌ#Y 7Xo9 0vd&eH'd!F8~AVmLVO-o%λOݙٖnK̺-9Kc}juJAJ ?k[m].6abI[=|il T2,u9zS^Ajm.kkc4Mw Kb_['zeJ#1Ț._.= mYsPgOkϡ鲏R Yo5 ²J-&'ŽM Ԁ‘ 2w"59j{sm+| uWx1n@$b!`ޭCl:DaQA}^ǹ)Vr|2&=,aEͭiMV܆/+-+N%zQMb-`Ѫ]nwRѬAƯ|s4i"^2xk OQz :RuOsɼ8.l^FX[X*]ɷ.ADuvA ssBC#]k +01GRyƓўIACF I.o› X~vLgLCVYY9l/#4݌Όoq>:\z5vrmۍP!R*p9*} K1hʮ g)=اo^ d0G{ #-àGm̩wN鷚%-PUWIǧAfjKÞNBZr@vk!m2nwb:RP1 }|X6_5HzfSVWV[A^<Ž.>@u#K.Wnc0U-qy| -u]vɐ*u=T6pC愂XkR,Kb?эbPqW[1GgEs#C抂&F{G,14X'r;f>՘3 > stream xڍtT6!HHĀt)!3034H ()0"Rҍ4;ƽ[֬s}>هXP!hA @E(%4a0 "2XLtp %eR2""QH* h!  uuCc JKK v(CP'0 FAܱ':acG974CFXGB ]y>P !΀_? pLܠ?1FBXuQX/3 0{@:w @Pog ].PB`/"B``( % )rBB=(!D_awVAChɯTHtq]~!l zzA4UR0W !"""%-x Nn¿›y@~`lA H# @!4  ܑgqI C\GB}"X"~^b匀C_auMumSVFE"/IaA cMj]?b_{3Z?"q~RS(/wB /췙0ݡ0hE`TsȟՅ8C۪cA 5BQ /vr?)A Yb[_6h9=>($ jp'H ؝ Ego4-/@$ ;`"}0 ?(/Ű0 GbN^H,[:ج@ '1lʈ7J}W s D6zݼ"3ly̒ϡE懪uɆ? ԓL ~(TzL$hxhG-O7 N|}u`{V W+$I1_Mۄug'D 2Q SbzO/V` tD`EόH;E7PT8i\!K23E3*Fq𚶷޽Mg۟P#i*o@כ\gZ\?g 0BfRsq  L>@>57ؙi t^9DHgmL;9ߟU5-P|(mï%?>+`pSsȌPky;m([  - $-JL|(To[/ */cVfZ(oȶ'ط^ڥ.}伾xTRlG0;+Q~D*"QQf~Rޫ6b;&l5 &Ζ_`4U9 'u;7'm'T ބ(>: l?yk g4ʷMN/഍[b<+y-^ x{6~0qKl휩RیOkw7Poi 3t ƒ/g)&+GTQEܳiWU1F!b?MUpUʡ#?zˇN,6!6uulǚuyovU|Zucg.:}i)Rڛ 9O2fsCNgcweR[hF[7ozv8FJY=of6wTȰrIMύZdfH_wI'#v8(kcV/Cnh;WRZN$_z=+V+E )N칾Dq)/=hNhӘgRQ?46Xh.˺~דMKme.{om$X"O9O;C8>u|*j/4>{*d7&R$Ú zWlu"oyz/4Ϊ)7_uFiկu+֘F8rL ;sH߼ޞ<,rؖk4P͕a1S5V^HPaT珳`IyMXAIDq8/p"M (ZMx.Tc)/6-_I伵k<YY8)X-9wX]Z㻗^<S0%Zkf LAkff sw(iki AF,FkC!'^[[Pu0̩ 31:9%$y\N1#ݒjh'F+U* >\zCFBcw;'ar?aؾ8D́Ildk86޲GIGr;,m!OeR PÇ)5.72g#D}(a#T>W_3oQ r<6|Kӝbc635n8ru/24yW-PAo6e,8<ڶ5`Qwg2KRBuŵ՝iTOȫo_14琲e҅Y3A1zYP@5*4i]qNSLec >JD֤V#!=W vN~M)A6ށvrܞ$} kZuGCQ%yüQN e3p߰p(7jߒwj<"=u4ӆxO;Sp˾%-y>-}I<{~) UX73@EHJRuz"xWsA W=$p/ msXԲ^A;~R>Z>s6I4bR4AsݩPvg=^M!Ƅc: ֆQ:nKK?@RxtPEZjanzt~T]Sk^oG22yMi7N_㊨ 8োZ޹7+CmgpL^ǐOs)JE_0o~]1>8\Z"HCV'"qj^ߙv[ܟv y3;qkr.޲TlUؽ^# pUqrv쮗 r?uKgDCYѬ'[7Mp9P&ir{~3ȬsVk}]P]&v +mfA%;~!z&ї[l.(4Sk% E3C5gC]/ mf^xst Qr/NY饒inX+pߨ{_%aqz'9ZB|ɂ2xOU BUYQÄݗG%>ז5JEb.JaPҐơݭ/[̪G2 S,׍ gJhDj:0mq@zvCEv1؂cǵ;~"om|k-[`7rW::ʠ=oֺǮu'F=y!p`U2Nv6WWO]myCUgCjnFs';G|I4c=_]""M\$zUrڨ,fk1xg| x]GW E}yv-:De 탇7 x?iʔ7TE?NQ+B~>ִ_9x5pj[]B߾5iMKld bZ'ؽ?MeRi]jDSSrW8$+M,)ݙ/y~%zgM!gh4Dl3&F)U,X-j}Ԋ?BxCBr]wBQ>ònCx^ïm3UuuACU]tLI]/^'IJ7h jSst|fxql7̈O*FjF5"yeq1;PQNVV^}GiZ=W;HV_7yw_TۆN%MrAű6o [45F~ 6+l+NvH[̊+w[0# mwRqKxgkgL0$  ҫUTQqLjIoDo9kbC~}yiU!>÷%>4;0"3:B]t얤& kZ̑LOnW|"A64DbSw{-2]{' " zxcfR~YpC MuNLb6T{Y`4*l` o2- q7nUM3&mtsDV;Z2}Z)S@OJkXK^-Vm@\ȁgfs$/3 #gL[,dMM+8q.%֫Q6: oyfok|n0lXlAD8SxCXzK8y)ҎZ Yf_(WE|.䬩rA8&4D>W3l"6S[/T[a|ּx \ N>sFnKڮĠT ]˶y`%̮>ZAg#Ul3xE]9gZz_ i}nu9r{*jpoA[$SڬnU@}1a a?*pj8~93.L^nN4G!3)o"=xK Wl%1uF־oJu)g(twߙT&(5ًJr7R%:?z,+̉괱c 4#]}2Pʮј̓mm9TDpV5UpC苽lQ&kbY>owT(7AmAr*MK$m6mU|mQiΨ xCD1eAזW\ )f]WtZ| =-=&,c"'=,Re/spC5$5yYF]9S3)pkb().FNs<_%l~3$zRdh tԅ͗0*[ٳ.&m5W@Aa,x'?ꌸҝQ<.:9Jk7@hz5 q uT}S&5_dEDQ*͕ ’yF, v+3fwckʐrX^tb^Ow$\:yn, 8 endstream endobj 177 0 obj << /Length1 1469 /Length2 6560 /Length3 0 /Length 7553 /Filter /FlateDecode >> stream xڍxT6A4";H !@ $@B 7#(HGқ4 H._xZ߷Vg=癝1):jpO_P kl)$&dc3 qB63IC D1 MԅZP@HLJH\JP ,((7%P@-8 dS{ .H>?8A\!IIqEwtH;zG 0 `$!8e\H)___~;, ]F`U2@S?!` wB40wk=:x /p~;A N(ÏC0_D G}(M:h+S@"~A*Q!SxAsG i {9:*Ck!c`$@TPRLLT@.60Ay<'t AH/opP"8B@H#wt4 vk`-@_O6h9aPԿ[,`anhl~>aI @HHH .. g O s$J}NG Xzpr &oE_yC;EaDO.= ]]#H zahE =|AA$/7(6# nCrC"4羪0װ ^^@!( @=`bH ]c E""vma!AaN5А; #g[\^-`?0pyt}u٠H˷5b9+d_|ࢃ>dXww,`*zf!Wa+YH coLp:) TCFR{klkt(>g $s2,zdbQ>#Kf5C;^9&S7 IJ] PI>.9)b.KJ-z`W=WLa-sf__>W:ԙ:,⬧v[?xջ . [Էr`oMn[Z oC6[#hQ Rmk^p黗yB6PO LcNoe2tlXz̮kcy>XK9~f KK})z܌[U ٨J.J 1*.6QR\fI6!-1!_4#R ##p\mc6LPwǷT 7n}ñMq:Ʒ.rB>H\(YΆ/+0 ~X=YQbS4.w6d8cPCnm?sc Qua2hMkh!8S!NYW߸S7"! a;-zG߫=TwH9$E6tC%bBTJ!N /1\Z 7oKYœ7]{3|hd]`I|1yQB_5J9xܓ^%\7jityex΍p*Ff,-Go7m`'\QjIan{w=Ct1\19|) ≁+_qG28#xk 3WbY>ن~v${ԮMbּ|_!̥s{ǿ {+pޯFrWP6}\aPdKs*]KtaXW.ler(e)OGA|_S=錂FٱrC5=Yjf)g.aҒ) SvݡNtpn+j^bV7.Q;jhq.D"0ŏh69hOVM 袈>OXw J.iԦæ_~Gfŀ#Iػy!f ]}tHqEwB utzi"q&[MN:ayLD>Wd3qܧY6(HuWiFO(NOvbmU\ޟl+e-]Z.B;q(V솟=S1I7=9"h?Ҏ~/KsFaVh\nq|O,̸W/&v;mY_'lؐK@37_ ##_ r1l O1j?/O7QuH'd^{b*)ɒ+5Mnb Q(yĐ!uSNzFm4}&֫ 8raC|=.`/=ܪ5{99 ʳ9ۑ%<BW<%uhAMa5pgbPmIfG))k׭]?ު!)[%62ALNI]h{|AZíT!E`z[{wxS3 d<_J_;gG.Ea]k w}>o+.i*QIyn6e5^*DoNUlw(]%X.nfceY~8[LCH zY_*6^]jShՍ4NjܔXc!&uK ⸛UN=noc2]jqW&CXY~5Cz܉?ݖ -s2K o1sFY1TE K$Հ?:搙^ \$%pv`\-Kߙy: c5 É:D򠶯Dn![ pɾF"?/݉)Ib6~r*g/ !t/Fi(~d,ىg\_>1b; iԌǻ~)ŧ T?c\"yXen9wWyS>&Jp ?AO#T OW㮩ڸs?8 ~J>$]O`!g[n+O{bE s"_2*@)C5V1͹A{/BY+"[.M&])t&WINvmU 7Rm}_(WLc1~5w14 ='hЏȓRMJ6еFX\y$\<Zɑ#xj|v*b!U/r*wuF̘I`)Dz,gd­%r _x=#NV]oyJMB8@5jo2Z.9?+ڶ ߍ͍~=1ȩ䪞S yXJ'T <{k5h3(Н[_LN=&eN+MIs/%,b]'R^A\E2|1XsSgi3?nߤ6 Eʡd룹7zm^%P[.Gt0#J őHRsouimoOg_xs6I_7;$߫)"f (y^p.RetfFv? bw0eX<{-?QQ(r,Dl}EmkF&SDx޳!@:Iq赺)8krLv{`CrKo<~p%=z\]UNWdE*T)aͤ͠!(TXw'IuF=49p=pot Q,GzP7)Nn?ޠ}]5jB!60.{9/WÃ$ ʶtEKGfZn1lbė;v \Nd `  ciJ~T+7qdI~J?f ZCdC2Y6>|Ng_rܱ>뽐!oL">> ·|LV?P:?ϿeJg վsv4R<RHAn]o> l7]B0( X ^efK8QysX{s!F' ϣTrD 6'w=qk>/~r{•0Qe_3}{gJө]77E,|sMCEWc{q^nD/p/d@Gv>3]i]|Bkh8BLn}SWPF%)=};ws/_*F5W3 s׈mf=&Mɔ&LtYvWLη{U8~ClrSUN0P.ñCk1aQ,w#o<|i?G v$񽙁R`5 \]QT\+sEIBR`_%P8voկWSXOO?$~LmpxEj0vUE%cg{#+=W8.*3SC?dϳoGܲdA ;JiCUC#Zԣ_=ƫ:ʟxp罘~A 8vl,ϧ=KQȅ I(qG 2jZ%*iTHXMO>יeƿOǖ(Ly<(x0Xq(th0I"=OE #G5{w{:8E36~0o\@r^x0&.~fO뻭Cl48a0DT]|Ɏ endstream endobj 179 0 obj << /Length1 1222 /Length2 3010 /Length3 0 /Length 3851 /Filter /FlateDecode >> stream x}T 8T}6ʒ/#d 3"Y+ۘi؉%[YC"eI",Dv Deg\לyy;bX;ΈHQ H D4CC^zx4;MX#ld4 `P RPRH%8̗sPP* `A 0t-t1]O$%x!p#0!ãom駎 8y9Gsg8n/hoorF\dCSr@@6 uе(*\|Plk(]ۖhmD< @ҿm~d08)1G|TT/ e-n.a b4#2ҡb,Z#G}S?GcՆ#tp8),lXÝU"m#%8YΤV/;>|^k˸^hWO+!v u3hϱ|LzK{RxХ#Ա`wijOmL\"ahD `N>}=I_>Jϒ{i}y`߈ũ[A6706C>٧+Qԅ4[6UqajI)opnO0twpJOD0=X)fU>-2/]0k12yTi 1ҁ S:~\@k}OvJhRЄa|h(ŕhڅ4 lՒbEq|^#=_XYz5#dӲQ\n$/,Ymaew@ƒ [mDXHLL|s{2ˤhѭMIx>(P?D>3]}YdUjd-Ac,Rw = J/WK[zab`h%u&9g#Eܒ;{$9N{Cr4_"K1^)E~{~XT9V\pxZpB]:řcU2Vc2oP 0Z=x×=YCx?X6fh*Ɉ٧RA(P}0qWRD!N7gˡ; +ՄeGlN{ǯWϟ-MWśV|1+w+Pq2+P7agTpZ2./uOA+ ׾}]{2r#`.;G|Mב|ǺdeJr⻴AyM ɣ!"kNat{6 ڀhoq"I9rp m))~੊_9vx%b7Rc;n$ꭴ1A5ӏM3_Z?6zzլ0ȓ So u_O댬?Dj=Q؟66;y4G@$a}i1*tH|ðs]rY Ǒu >MKgO1`Kl/Lo 9YCIz L:j忘laEac~ͯGaX Bȑ]jA39%LhK_Ѿk1cjKucJxfǵh/$땭{ ښlwZ$\ޤx6ATCzO'Æ 7{-)!XGP>LEҢV_Ox9?GQߝw8H{d_I^!s1̾'&kgYzyA .qPC9̼\cRʢ+bLkLoR1ˆӫL]7޶VBj*\~rʠ/51(*SYb }ϲoyN; $Fcm+yzy덝l(D|A4F&bK,\}+?zI~Ul'b%uUT_ /o{ݷH#!<Ҵ̔Wc Z;Kw$)yPuNز\r+gN37ț(2Ў6&*X}^1SFc+cxMF05`ŌʬrgߋmFsmYCyػ"GnRt/ ɃD*HxV_|oCcfp,e6ނˁQP9DݛңNA NI:%׮g.yc _ U E< ooc<4qY̛ewޘ`2:c;BwBi^6 'Fna}uMNA!VhW6(u,h v&#|ltfpy=9qfa] '[E[XuK մ:gd5G { 3d?wB_)R}29UܿK Rj+9P C0X^ȒE+Pqi֭_2]%t#W{fFwN`ݔqh}CtȇAD6Ic"]\B!REe97z޵qnqemڅEw++rFWy\ɋ0g1,7p%807j.^@t:2Y%֏84K84#iTQlϯ7,Q#xU Yԏ|K'3Vh"R]?hs[2OqGǸԝ#.6a*+jhE%J*#D4B-C {e{gQG`#_:8seVkasiRO.4e0 vG#5džD"j7 Ǩnw֟J? endstream endobj 181 0 obj << /Length1 1210 /Length2 2956 /Length3 0 /Length 3807 /Filter /FlateDecode >> stream xuT ‘LYSp0/ $Sٕ`U82rTsȜ6@߂tJZ,m d Rc>&~Vg _[Hˁi@%b(k0d lx(pkv{Έ)d* `%TNs-G1(Vpn!+ C#+? O#pSQSp ._#a@guHEAp@B0[`4Hg)4*۪ }~jI&L^ @:`~v>u3,QXkK4U44M HW^ #^Μݔm0v VUTQ]i<~JL ]+NNfA5rS<&_SLy޹ufOZቫ/&R[>AO" n:3C܆ƝJ;=d[g:i";7MXt`/e#ҜxRQ6ĥKw%V_= ٚJ|eIƥrwx7ɋ'NXeZgfH鞉 B9Vlѕ.2:`WU~']{Ktbj.19&z熬k{bRh8.Ms[ԙ'p%Zs+Uzy%!ځRڢ(9ý9.[Ɵytf c]=ٵP܏yJתgTkY{QN];8yKF|泖b+<&$ۧb5؁r;{U.zQbu˜g:${EDiJOA=\[e[vBfՎ:]*jݗj eL"pGDw5OӍЦZ i(Up Ycq*M8G"T߻;uTWء{Y RG' pg=iSBCQ YwKٝ 1ny7q{$0~L,1dC˭ آ矅JR;VQ=/ZF3z =9h2s9\; 0V|} eAQ\츿} -ni4RD5Wm]D[}_H{sMmU*&%,&8mK>ya^6\802pOAfvy՞EpҬjM =AG nOш+d`QVcI}'Nš<{ R Z8V"0,R1LЮ24↓'=ѹdWFI+_N~-c|D9+QÅI>4ڿi:$em=^SƎŚʥY*]n|~|,uuL09~-AJkG)mxUf{N+*nrs\o|w'z檗>|'.u~ZOi6>|tYAO/ i4i=(ۿ|GLܚ=<`D'M[woE×[MRc2n%_GR5p'-y6PQmffE57yza WWWnBN>|\899aKv@wnn{-7],z{r4i Z G} Z1U%>fŗճ.f"7i& kh .8]?OEύujdZRJIDO\rxG|(x=|ٰ2^/o ]3ܧo-498/#a.QLBxMh\-$XkAFqcOkf7.l=5stL s啡2.S Wk(ۆ}ύ O t:+G I޶-h].K<%撆&%_p9):.M{L2-E}o֌*-z%(rz:0c\9S.dĘRIZ¼Yw>zHs^R.M6/$4FHJW-ҟS|zT{|17I2b{saKqV 0zT^_)к菰=VE\##$"g̤bϮOx4uVk1fv>k5W+vZ|XR\k~~PjWV򧛷)?S@Co,Y';O0' `^eD Yڟ5F\0.w'cR6 1#w+=֝-y {J5T;HZf4̍B0siQ | uJmD̛"= #I-nuV9 ƼnTK#s]7ٙݸ!Lj\`jslNqb݇2j \,%Bb++d9_Hݽ؁QM}R6e!"q>S{.*_akȨ@?Ӓ>\/MM*Ykf&>{Y}>{\ AdwMWRoT8sw7`t}NO7ec.֊.WtEx>ۂNC[-\}[SY\NVE!jldBfby|5j7ڑXvprūr<7Z  E=E5 Vy"}jxf1LZt"Y KZx9}g9~6Jlx@է&+i#Ā+ElKq%@jeS\Đ(;/!տ e{,}?c>ol*_ͯ#dvl,(tTr)^Sӷ$Ugf(}stV4!iw/kf{0ь ѷp۴g^?_'j9WsEםf_ݱ,s jʜB iV`It'3!򑝾E!0[TLNtJm b6c_zքliznQxӛ6]<>-QCF7|-}3Fjե~'_K endstream endobj 183 0 obj << /Length1 1614 /Length2 16098 /Length3 0 /Length 16931 /Filter /FlateDecode >> stream xڬctem%vNlbb$'6+b۶m۶mVv10\k>kME$jbkqbbcf)k(ZYlelL\TT@C'4H6>>>* @,7df8NTN@) WPM^@+- FV c,h:01Ӛ#_,QG!h t3bA G8@6V&k7뿾`N ;'ߪRڎnH[cZdp9S09Y/ gG1`8 Lab3tohggoQheʌf 7S[Mtw@$ Mlm&@Sy[%w*3O"?qF-le%oh 7 ,lh r?H p?|s2;Qb2(r(V]`UAXYOdliع1 /q5oj 8ſ;?:5PlLl\&V @lu3tr7_'#iclk]Qq21{_UMߋVm,Rq%{ Ts}*m ު'?ZN wXt%/s(zr7xXS4=eYvƕ `'8|(\r}(P~'FaՃaT睞Q?> t@2dFS J8%wr7pSgS/OF;ΰp*{u0SC Yq awG#ǻ'pn(m(ܞo"@՜3{~,#ߚo$0x52|)Q֨a?א|}$we`^n6 >7f 5'52J:}d79;-V$z퓙fT"krvoC˺S7Aĵqb&u0/Gh atPDqK04a$v.VwZ:pM_Q[^8Sb>nHs;)e'pFFS 7֚8B(nbI{S,`n!tx;0@C0pĩ#1ApoQ[C$*yB9Oɍ6P<_6`p^ %JI2$f|(c!7P~#@|"-!ˤ[6BwdU7Lbru3PiuڒjOj|W{CDHvg01lEHSbl\C` "j6*_"ʋ"}RD`wL{ژ,%䜛c 5Oϕ2iZN 'ﱤc,Q9#)dcCj C}tzeb{˪Fsk ]v]CGuվw|7 % b7 X=l;qiwU\Th碞qtgJCeB#yj*cPD\zhCw6FCR'~]XH&qtE40mX6 GrYskw_(N1g:ACHwXz@*%5CH&Dux=1tζjB;ڙ '~"mo<8I> cpgW8ng](;H Ըoŏ$h!hfQ+ּPӦo(wO`MA3R=sPyVg/S݇anC5c/`Mc1T3B b lPycL&7WuLWd}oüy>F/Z ?hz?y*i~GK \*pϠ)\MmTgO>~"Nlħ⦅bCxT: 1"!ەQarY5A?D{v"h1d%YݢTS24 )Y~$]ٔ͡Gw(/8&o)-6-[/\[h}_f!<C1 *tȼGb'W%G_f.iNB^Ee+;3~Z1jFcb҂]N92[J=Z'7rex8@ni (,qvFoq7u)'wp덻kLs< ;Y/]h9sHs֓M5ñ>d H iУ }8 jmLGדrMٲN(sfu×j8f"/DmlK1Xfy<ij$U 6ƄХJh:ݯ /(/ Mgl555.\ӯ6R!ĂyE^>E#1їt鑥CT"س?~3_vj9+nf]lE-*k$Y~$(&?F| <-K{(vXֶ+%9[Epr+Szto1쮎b 3/i'`Vf"}=م@E^ٮʫrc<~_l GB&dIB_#+5:|KLpjnҸj˰IwĢ0>|gU|šbzn&Ʌx=,Vmnf%*d'j3=1F6Hͱo7 H?}VbNcy`d$Z|lCmΤ15Dݝu ^fފȳ H̓]`TAL Nۛ靥N*;:IP5%SѬ >GO>ڥo|ЈuK gm)-. pAk ;qMM%"feİϘV(h)Blo_&@ӛHK9b׷ M>D;RF^ azIsc 8& `R8 BnO,ĻrVgAuֳA{ sFm^C62eh}P)MϦmyaddOK?<{dk%.Ԝ1N2.𣽘 :%'l@_uLisV}W=`/ e[)k­vCV$5%j ]uZY.S& CƲ $79|Kߖ8eOGC& s# >~`2:ǩπN3je`?5nS轓yx=b_ҡ ڔ!M\Ao$(_Q.khnpG?zƕPA􅜱"jKoyzӸ zKƆQK"቞88V5y3|"L3feg#'Ak 48R\ ڂK趓 8E>_~r9#A əE݀z?5,!韶)x-h !g{QBXoO%1GUCfeq^5/о_uG',-]弐n`hG~_ G !%r&(T㓎"ckJ qޓHԮڹrpZP2ꙬdWs OWd OL@ָyn"F0PeP9QnibO79i&iJ.e]mtL Qt# ;xؠ}>3 ҲIiXo)5O#%%=Tݴ:^li۷$"'3na-6*'@4Ix ڔ]mI}CJ&gԯZ4 Đ". 8Ɇso{Ò0;`EsZ. sFT*D<ʫ,-C\QG/H9qp_P7Q V0,W}HO򁐢ʉ  iXXb6A˻Pi(Mn!# 2o:? n%NJu0W'bӻΝ(\c9 Lj@MXlat$%ܯ{L! lYmGG1HnnX rt"zz_'ϡ&d&PJ$'G2i|lS ^.7*1rdž rq" `) OcqOZgv~/-񬚳#+˻ax<a]C3Wvr 1BͥgKNiV0>k#;G89:əb\*Ў_[؉JW@f~㥑8}޹^JSif:NS?}p8VN z dQ2׉~q٥>ϒ2PUwmeK %Z;Ig?=P0/*$`'Wt zy?x`Ǵ" v~cЗV-O$Fק!}HIR!|x@;Zɫ@qhE]5jLsT` )NKws~CgX]QOQRʫ4z \/hu>A 19Q ֱvI6uسd/ 3\lkI/ epЮ]7>ԗmVSĕ@*YdK|בUKb̮oE"-Bmc'>TvAN:X4='o?APǐh\yܸM&[ Շ|2n,&Zċ qH|+U3 a}2rsyd6vwa[ՓÉzluzckT'k|@C0tkKAӄϲK2#ƹ&oGgzN_#>e?s^ZŤUkEo=vT !b3ki3^tJ<<]O'X6z7{ZE3C-I=JDس0 |v"IVodtTAͨו^mڃf 3Ff_$g ]&6"!pk9:ҡXWy>#y<E~+慕",gQ !#Khloܘhr}kQ8AtXfL*,uVsJ-WSM3?#dKϒފ]v3/W,|N4m01P#pMųK A,9f_|[pMubC8̠bD:b;rON2 ^+d?N3QXJM!T {p6u'Bq( ȃh jX=޽QSssy9 qnʺu!gCv爿%,xiwx0fw޹WB3 g?]6><<Ro/a"&hBE״n|ua?~B"J1=+Ûy?ZЃf< I")JP1 `Z-G5D'VPP IgZ.eԧ6>\5k`xdk4 &t36 /<ݯ%c2Wڙ?cejJ$Roeq>.5bp5/WHQǍV?xAp(>%wUxy =_:#5ȴCB 0 ĵ\B=) IO}d0:A:ji呇/_dW"u3BzG2udRr%@KMI0 R̞IIWjyj0Όﷃ͡QDUVPA=76pVTϓJ/u?a|(:%2+rw~[ 8-F.ClQQ3S`VOs&VsMjkcRY0V\{˔2i sC`a| ߆s ʍ|)MT0& T1S!+"5Stlz_WXݞMd)wCNİb%2KtNv>ZwǏ%Vc^ET~'y@pOѩl@F52bbۏO?<[DTdvsv\yy k &:(u.ނQK1jȯG׻Je9_;Rj(V΅ D <'vr9HdM3.Q PX30Uun&ydIQlkIPQUud!~$q6^-U.`H(PDqO{EiH5?s#OdҀÝ?'h7췴,+\|?;+XEkiDݽvIO.g艍#cE~|tc5Uқ3dcHR5TfIips@ubBi_~]Ɔ2NWv޴PWtPKR񯐹ti.6?q]jTZ/hLI¯e0<ȊmISHs,mAeҠͦ;0a88V5)MM.Y:ɲ &wU` Dێ&0_)K_ev=E҂RoqDC$nn3êbjhz)w<_W ؂+%v'~J;mZ^*w]BWBɂ.D"(GŤTh#`=Ј{&Uc:6meQ:GMo <%|NUl3gi)z!ԗWi9j{x?DjJwo!϶0+2XnrJLh}щ?s_!@[3`N kFDqeG @϶*aRaMV(,mWcK quւ>RDzޖ/M˨WL h:fYub5BSp7IwY)sfgu;XN4@˵C]ݖsI4 !w!?Rh~t #$nՈmalJKE9[ЙJS4O, Si%\aR7<7]ȵK\)k+UlNx5&}/ nw)#Yh@3X" ˑ+Ւ\3eDɦ" t|0zf7~rx1la|A<A~;|=3J~LJ-dPGvet# DޒYĀx'fHp>vv=b\Uݴ$C1XYѽŋAڣVˏ*M]Ǝ`>$a"6_){<`{(a\WMhd. G']!>~r_M1{a2&|.nb;y8.Í,~$?Dq c!ad}4ӧHɫ'=K£MȚŭKIusG^=.V]`RaiPŶ⏴k17f(#ۦ՞ e'%p&GHrˍ+-l:0:$,,Ҳ.%z8it;2ޞӿW'4ϋuDȁ|T KCeCL%ʍ`m(tkQ Ҡc%1Ή'ᮗ}v6<_;{NHw E.ҪKUU7]孌HX(FgQ[HY4rC\B?kzd۾$;aAy7#[cUjy5+W#jÉE憶YQVu ) "kFs/b^DN ' ş;es Zk| S iMy$̍+YXOOp&6dC3@}L'm5& nUjN můV4J-0S2Z.c8ԹXƂLw'" PJbx(NB'rB{CDw O?jz楨sWΉ/JcdlhQkpzp[mK|ʔS<-hL`juF %MxbD#cGNZti;ݸ*huLЪ"%0=1+d6ӒA;TsxOQ$v5swwTwؾ۳c2 +r"\p? Ov%2K l~DxՠAZw__lϩҳ7=;*U;=ok,ş`MKMQRyƺƲ# $/MS*Q05XlT5xfBvOn Zw##FXW!܀;&sr _gFd?:{nXEL?4Blcei,aO loU7J\cpecS.Vk߫ٮ{v+#T;%C^|~`0q멁Wk^芀Ӈ+GEn%B]x#)N `Q*Iq9Mpݗzy[*"Ƽ(D|IƯ mm-vzFzvI>]Rr$vSb# cON_{USus[ G"_Gb9R;10fÆKN.MoZIxR%שTТ,|UQ麣x*l1TXyVxݰB#uhuxU2A!>f= ui-Ql_#ɾD9`DUnZ;r||)PzD1Z9c~j'sg+p:FOܧGD5&o`(oB\CG:5} 2ůȋ7*8w/&d0(?vK: Ġo5NsU3ՃæsS0|!['!hiN4Sl{Ai?&$Dy'os{/L]DW]F y,c=9[))tƙ-vhT Ӫۚs'o0q#ҥ 3Rܽ*ELH&0iMo_CQߣ(D~(Gt#i!6#6x*U]ﰜ7OE.mdi f/Pbc z J۽A? V6UnZ#S'3 hvL`ƪ:#'pY8]Fn/Y+k;%bˮTk?=g^F)Pzs^ H*j2U\{;(ef3\NQOKƽZRzDinz"$3LH8'U ït1tA//sAnW7k-T`֙&-\^BJHǧqP1e&mHk+fS`G]FuO}A]ilMXiu γ!)QD\8ֲB cXӣP Ky+H//gj;4F(1QUGQtǥ|I=PGְE ^Ƅ&. '`׭ grnXd5,J |M|&d3XO|QFce݅R1/gz93C6<(K'Z7}U GuHsy/ ~i;gqQ 3%x];jHz3]*fXO YP\梕JOw}6yiΏdžrx<}Owb=蘞tMƅu.:'QX uoqs/2\6r?Q*N I|)\9ߩZ;XrxMSev{@+![evTww @MYp#9=WF3]j@\X{gTJa"Nӏ@l]re{YHbt O"tRNuD qΰ4>ܥ-Yِg8+r0tv(zQw=swVԔ# Kk_TOk?=xuRh4" .ˑәh7jTKI 2/m;r=_#ܠ0ڻ%O=95!E;* O;aC$]:9x -aYyGk֗U7e(z,0Hcr n f#^'WkqNN?lL󽉵u\j=8R#ntƹ^!35oq&Ou P}yk7gN9Joгp͕mE0uB A. Pzچh{$G>9n?灅 3aSP9sqUTPh=ʒ<*Mr姘@F;ma*wE'_(TX30 *gsչcdyg$Q+"{ޅG-!Эz ֈqA\*+):&M"o[\[' f!kdfh.ͻ˳mYZ,IaȤХrce4N{;XArb2[bEeVF]ˈ5. m£`IRԜMkclﶘ65{KDVØ_Zllбɯ{{]O2M`t'i9qy'G؛WsN1ev^G0u [lt3A-wr+/2pV*>A;#߇l~u%A܁REhyYr@n+|/]6)R#bO s*è.ěމ'NEh Ӗ(7jHka[w=!6-lҥ"'!CP,dRM &3Ō1( T^څO94<06IaQQ)LC&<PV9'חbYA͝;ş_bǥeUH $r LR{1~R}$9Y*s6z`> p˘O4;&࢞}cuenl̿wl+ZH޷Z-UyrYotAl({h*gE$!vfmc4ZskoAd /|$W*b>=36F$F6|qbYi#{uI- =2z Y62ql&BMDoi\$ěR>7_f ?YvMڠq}%g`Έτ& y_{H*<_H3b qq&֪BpܦÆ>LJhUF|L[׷jb]{uxN_ޱHlfQFTa,}p PKmk2Qú1\TO }P9 eQz$DkIǧ vWϒshxC-a < 7|ZqB[9.%8Z^mK4Q"qً2C䍷x~>cUMrUdOs뿁eMji7!g=2V3!nbX7?ZIL׍3))Ba4VHZҦ}8)vkl<G,=~6N!:)3L-~dZw`y+{oՄ:6XY}bJN4cA/.kqn$"ߗoeoJ+VXx%mcC@{1}ChFM}%fRy8鲃]VD[lFj)7r嬆\_ $8p N`kgv2A7=!2 H5Ǎ7ᮠxq#z%-TdԽV\jlvKR-(N06/&@u=V>Q7/mg )sP+CY .'*PpO2aʸ 3>&_tZc~Cr`bVb+PkߋM ~,μ r k1/.8sO0 O*ܲh# ʷeu< @À endstream endobj 185 0 obj << /Length1 1616 /Length2 24143 /Length3 0 /Length 24972 /Filter /FlateDecode >> stream xڬct]%ɉc۶m۶mɉmNNlvoWcZf\Ƴ&%TP472sec*+X*YaHIL ],D ]L&Sc ldinAIMM_BF@/FeSS) ,))'Sڙ:\l,2ƦvΦ3{',v&LK`pv05 3`dh.K;cWKo__0{ggc'K߬ "bΖ{&Ʈ/_3\FKgCϿ98YKL LlL;U'FO.Φ6ft0LsmniCQ302?}nN63C' ^oJtD Or-jc#ghk& !cEZx{?Hm_9h,faj`bl03ۧv&N6vZFS423J/sz-!UIq}W{OG)&s @118Y}b@o ?>o0v&eC;q:9;\{MM=LaV썹Cҳ2\j1'E{ACJT {#v8+ >jB<>G{m{RM p}) 7:ةJ3z_/li1N**@Mw0;A]?S<9 DjBuvNtD>8628p;µLC]eE$j@238!]\k7jveu}?`*ۯj*@o9j6C^n7ƞPM¶eųOKJ頳3s|be;~iCIm9/ !c/%j@F6+0j{QɳZۥ[``tkR;бCn*{ݷkF|6xfٿ=FϺ4<2h/VԨib|QmgRԷn.6MakAuNBCװvvk(Sy{R! YvV:D,sȵqԠ rXJT,hE{=aYr#E;kODv+NE .Ip1,,' &l. /n{㡯_"}R,z*wܣ pZfweo!;XvHl9Wu>䜦x,BnIsLQ=ַJc{:Ƚ<>X^g0Dï=Ţ໖lR3g5(EUcaH*5C" &(߰ukI |<_ ſ PuAv%VQ~Ka֕!1"}hU3:Tak| !<'.Oi vxFS8c!8hk6`W9~ܙGLo8K[BW>ccז-l"%qxlR8&9zETd/aeI)ys.@_g znֶ3;m"F'q!`%Px`0OH(?؍.Bhը^ L >S*m Q\)[hUݎT\1PTC}B^r4nb]m6{kl'Ht l[|7դ]9yMGX0K 1? K8!cF Gimrv9s4{Xxԋ#HGIo(!ȷl$ݔ}KzPm!cC>Kr{BP*GGnp#x;pI6j#2{Bw48ල5Y$V e!DPxW&].'_~O7D/M٘X)RAuط8Z[ kFf{;izN|'8qCl߸rLFE>|֝pT)P٨Y:΂^Pa93g@ae[iWBXIq˝oN6!lOD9[kWzV{+e[xrߵ`Κ9&~ iS~x\0VۥcKPG7bmMKYs^wRA圞RӡI#. O`5%iEan^t;ZC]F-;uØ#`Q|SM֤a6ERXT>\)n3ڈ :^)KGd}% }iCX՟y:H+cdք-0sÆڊ=d;3|TϹn,w-jrӈfFFh.xP#O@,$aʟb}e!ʆD Ē&v5o72z9~0Ӭ|Pߺ~G=.f͇3}?jDg;d&WqF*Eڊ)">fجKg+d ^9PL:q*#Mr6}xEhSQ?c|M*@|U+FZTDU}RJ.q6ӢՏ(k}Ay:~IEQ.Rd䍺}"?*W w jz)˶>Cg,{IL/!7<j{GGG dC8_Hq.r:܍LaHq [w}sf.Yp__up P&aCoi|sЍ p*ǯ>RǦ{ٌ up+Zg,n) hZWU6B[3AAiƽZ )^܈X-9Nؼ֒k8wqȠ'ז:OU>xNS:CA[$,d҃'K|#^an^JUDc='T-ZPF芩9n/]z}A]uX@w69M)HI(EyrIܯ,ŲU? @+Me65 G>lo?}8#02RW@Yu5r&֫7X`־DE!`bH:!#J=s }?+1?"%ů*["M?i,zš9Αjajll$ͮ?*(-X:o AyAW]ؤb+=6K(`ܙ)uȕu7gtk6T~ct\&iStA5N2Չ! [e /yll}qRrNmv+P^ٔPNA7K4 mn<3EP)DU4?V)U\l! <=*UO2viP5Dv  YFo+{ٕ֓#Mu5B:=eD1Fl8)cǵ?tN51Spm '3%(( 1RGFݶ]SyM/ Ì2PROߌr#nG1c1ńPj5  &mvሦrd:xGZ֘td*s+?'zÝle7ӒZܞ9FĝlU`ڐ'뚗 t>KNL]iA0=<ڙtƢ8t~G`02$htuQxR0$yX!A[r柕 dHǙ.t<#\L {VULP vR,5מUħcU[& .) &D#]"1 vQ)8PImiÌJD/Wu*]Ql;eH /}qʲ\:3ƇoA,tUw0KE6z+ =׼(pXaPNxEYQe* .yFl$iΒB-V8(ggb p,_,ߛ3cD=Ɠ}즜&&VpX^S g`Fx /R}R"c;v~d]5g}ƫEoj@4RR"Zfx+o?dCeh9~3^X7HHG7aDu:vNֵ.9_jE< ʂDoZ0 fq-ͧ,%DP 1q5X!*0hQuTnMw&Ҿ!\[\Ue~K806F*ːs`DWD۸r,kՓLC_ ?~^;<\7HUd-N;Ll֦7:'uu.$O8ą Nw7mɣY5b`;L\uvWFQ͕Lx]͙,=Y;m Kk97a6%%d!3}5DnI军NkXvrR#R miUL۞7^& HrN>DƪKO;>U:ރƗP=gY&TQʡ*K . sHk}("b/g7VoUmDf aY֔P|fY¬_ߌ cVvscΰ*{g!p<;{Iro+3fO6i?gt%nWX@ [ ~~v^G,h&' 1d5.&nꀯmXYe3ͅaZ's<~-VmeD١% &{_ؒoWn2w4s(Z`(UQQg}#/νH-rLLX *JOpX4YU~Ы9] FA0l>F|nZ^{Ȟtؿ8Jj/.(%<6Ǐ bbbZyl;R*K {`æ=@Y4fDͤ[k=(q2KtMFw> S־qڲn7Ӟ8n1B,!*e.kMNC2o錱(h HH vN*-~T윽n%b{`3L^⑑4>jgE>WCq-1=6Ki xdzNJfiw8񕢛4ܣwCfuol7;0Hs}tb(aN6"Ts5'tDkyf|W2V8)?'Md%ݕmp H5BgIxֺ,G 6TP[Ogpo}bN#LZY )n} RHvS5bٿP'ς'_bOJ*e#[|a_ GigU09oX(jƩZ7/ØܸHI57 LLD ě&ѶO202IwR/ƸX) bj1+6O٤>evE1QLl|cƉ}]x)CRݫ.l&eOX*{Қ!r2{ |Rc7n*E J!ؾ7hٹB/W00x1,kIh %ZAv”Q#$6K#_7 KBgKBT;eTN$D$ڮ@M 14`1hߨ[6\JL[ @VF>rk!?f ]AoI{-{cޡfa!_ Us%1ߔhu !\ C2rgQm_`W¸Dm5kVʸDoWad߮*]E1%f]Qqh 1f?[>T>JXaɬp^3|p/} YHf@!~,T';ЋϸC%'6`m?8~ycoOwQcTt.{>J4Ӽ +ɑ&l;ǶC-˄?e,k>Ӿ s@T̽}](iNEd2VHE/N+Lfo|Rm)4Ռz9G#k c@`qR3uNPmzyw2ho;- %5 es ,k_mD9U@:-e81-i͒ ,Y gDԬWˋ4KevΊ" |QZ'Dԅ_ko֤x 5W".F w#y[ C"u.h Hp10%$P}U9DAU69@/{h0UCrnm޽D" E/XO>$U_̃tRL]nj|,9W=%w_ct4WC<@ piHR 'Q4xB;}a=P I=>rED-Ql'[j,D1"hef<d-0&1Ч` ((ӏp |`t4`yK_aZL冥Gqf݉t'Vt`p͙hX1WMs`|ӁqY,v]͊z24ngL!u'ٕs!c,Ǐk9ug;r# $+C֒EXgMp0#6IǶDpqV5B s% \OV~/6$Y-Lpq׆ζl3'w S!Ybhuy^q7QաWI<~w9ub.|WJqWSOg2o'c0N R޲ڇ9φ(Ĵ~-ݨ& ^˚R#* <.ZIYٕ4q9.$EU۷L.`贝 G۞z~ ddAxaZ arDm`V@cb`ᣞ B+)fAݖ~Ɨ^r";=~ۦ&} m /\fhoYnad'Xf7 B(2jYҶ?"rs>CWv^R\bZ2Rf@$P4hkd*w SR*'C@[,-Ek 6rۙ.?&jj\c `]nm%YSuub4ஂ9%u%tyE5+AmbpP`/[6z%~"xxԮv1b2F˝|6* 32ΎPW)_)'3JҔ,C.aj9҆#QݭZ݄]lʜ2GHfmyAC"S/+D.FB{TsrkԽ%f68TPh-3KCM%,n74e֡5 ˱p+˶LMK+6Bv5mk eri7sd7׍%P{61yGBD^gLV̰$GHlz[o:c, 11(%GU/4Tڅ[{VnQ+f@5-Kz@{U>@feZwi1 dV5ڒi;ŊdJ(Ux6 mz HQM䂑7VRM ep=]'!xǞFFqQy$zOm=pX9aw)yA>boΖ/fFy6fXgpun/QaͬB'FX`C")hN1Bd=/evms8^9SsW $0]X#`+'fId2 m?֓|lc4>CKR!b8B/*c9VفBrD~Ȯܺ4 ;\7,/UqY Y;ez;.s;e,+:Kǥf{՟Z/̇ Nʌ Ǯ5W36QB 2âjK7nrI4or~-ܣVmorݔ횕$LAjw裪N8Svc> ]eYtc nQ.bLQ ܷ$~lkW#+f'2-Q’U2ϦdFѼF cp>yT!_͌h=y~_Lih{R6YK8P>ߵ< >r20 c]1--%P/;e&`ߓ O@jQ05eRХY1`r*c/osԌ{H~-M@dtm7>ڜL7%Iލٱ{2`.t]{쩴`8 /)֞VV|7-Pyxϵ` ~@%x @rl C䧖Hf5X˹ou0k@~Bʉm< eSTe?OsN_ghK([5r$}^ʞR}"\jBVZ񺛝u~u<4h. S0$PJu1ċFc2Xi7gT-pޛz"{HX8)"4OASg1Ҹ8Kl7 ]ħ?0[]2+TQ(^ ~c:s:ߒHRk|ZwcĻa2.ӰqsSSuI=-8bJ9%oE<0C]Z.^}}{䀮H6s:پ7`+8 mkna:.)uRR\A =($CF1"6Φf) ?:4&+do"$b8uN7ݎ\\>DGd^4sIءJ5 y> Kġ'!Dm/ #6wx=MqdfiI 7A |~{̃OUzmW>߂ *W7z+g3\U|,fesͲv¡x+/r0MiO7H em籥#A1-К 7n . }[D\˼ _d~r/ <1r1nGZ VmW"uoR=[` nʙݹ:c'T43X'aU|Z*S}@X6֞]ig$+mO@%6.ٜd;Ko>g`NOC}l Ovd%lXTYt >|eAB=b[EAVMYG?(t~{kEbed䈪8ӯſ0]4?nJ+D1EjH-V嫝, eLR{r-Ύg4./ܗ>ӓ+FSggfVnt.U锹,XŀnXN[[=5tS0,.ڹDEK'WbB9zTjulމ=̯9d (H8Ndp\ D#4C/jBvPu~ۤdx& jGW{BsI/OO57͏Tdi5)&j$l)`jf6c.M3"=s ܶk_'GB*"g>e1mewȁ5{PKbwxmy}\)׮~Dk1",En6<ZkBpFnRɐϹ%@^39?n Y<[:eɖ)*Pod򁐄}Hqh4zmEx2J>(wH.rdGIuȮsiT x^(WrY%1TKX=XpmޏJIX2xZ,LI-~9{C6Jʸd;[vǴCZcU7Oc3`t Eo9BhgkQi+`HJ B j4 0dP[i DR6, }pg& "m|曡} }Uj[@悦2K]F5*;2rHcưNY*/8"O g^BP@t!5rLJ@a^f-2O 0VCGZ_D6NX?]=O!̯q}, }+mcA&0wܲ߇A֋j`!|kd7Xs1{0EeNsj|~yb(T}zQ*xL0<]#$"'\GGF<8g 镚 *d sX}|FӅvR,#QkEU|ƙ:oGpZJ1OMz8ȜݸU-Mn,F6-K0B7e/>ݾ.=/MhJ҄!ŬWofCx zmKLugtdc"N-6l =v.[py ʗ|>έАX{ D@8nf5uP"-lŢ6,~ cOAWOe'_k82Wk ,ʡS wO*3v7|Ul/i *.H!fo d\¦u! Jθ4j໦C7Uo6ov˰!\O^k۩ @^RHL =ʓ bi2}MAa'P_Av] <}δLa!1f7 iHhvѸJl`{% j]xOŠsō]E+Kle DL9]Qͭ-h wjxNV`Pl4GPdYpAҠE^m"(q|@&|4?9`wm{8u{QR.: iYνۛ;b_K_XZiGQa/`VDo`KcҎsCUP&Tf8Kt6BIwvutI]?1cJyH0`l4 Ca$ؘ).M $rH@M%l+K4b |gtEқ=Xo,Z!)`pIam'\;YH ŌF=Œ=Yv3{eIU= R#-l~xj h󪀕}DT2IP'8aԱ%MѢwZrʌ"≢յ%" YXy,l7&q'zWJE!P#hC+Ӂ%$\WNi¬dP5DaO,2rNj͑nnX sߢ{Mq`֢aew =3̏Χ{ u]=vFO=I*enQIM&۸ iܼ+$,K& m~hᶉh-k\C}pX! H&"";10,>bq~k Qe5i Vغ{FBd^cm)S.k~1g.'ԞsΪ'ˈ-K-*报ɕ<h\Zo+3dW n[ʢ"/Frn(ߟp< ] R%$q';eO`.0BDu#[78L09|oS *W;ߍL",P MmRmOcLK㦚9gs_?@ 6Ē3/t,%*ϔBe.+r"d :#eK'4ܭJ(+Rpkc2h491+j s{kpSkS|}_@.$ _jrugnhUO6y6͒ܺ:5LV򧖞^DSzWJcx~4 IHE!P|-񿕌4Ҏ擨=e`,Uk0'yZWA&~NT%Ue,7act (a]%g [Ve^H~^eaibg lrc>JI{sQWzo" 6q-wpkМũxG 5; 단Bv .M5ڳa_I@3`{WȆ>Ĩ햳&EBƂfN. hxTÿʙ|4 1"RG4ڤ, >Ps@PӦ03CV_A=sH?|"ʸh+&:ʎ,gq a 'RֽءI iPBnڑDrX󀣙Dz{r Q4FIPFa^U*58'wkvS# # u=HpG1REM) T#:/$-P^]^-'֧}9ԑ<*l:{Sc@K%͛iߣK$|2GZsmE(X$[lNq2>zȱVH-?!^l!ͣnߘ`tFG!A"7+X;ϰzT *+w%ًnoCm3>A0x`ZR&)%#I6 G\ KbXpacshPÃ}`4S`!'f5Ȁ'ql%}-Eʱ1J[RGͨ<9f5 ^M7U a0k&Dَ/ = nkR}Oql#cJ M?a~iR,=d+ķsC}N6/Ζ ΏWҸubϋ&RloVK%c@@.'A|z"0MSBL"q'Mjp%\ɷdct}7"[>!3ϐ C4Zy <2`.x 2tz- ?Dz;)k ?@? E9qFѶ8: >6XlB$㐵s>׾EbeFMWFvuQ0s> xj/|oVg1 "[z:4"De0E:ʟ 6vDů}i;,hyJ+n;b[=f J Dq#g&꿂"ZEm5iC⩕ Sް;̝[KF@ܮtsc$FC}]&tWFK9 ݻ8 2q;U4)0QCr?aIkA l`ljbhtm:oUC 4'^[#7G c0pl&p`:O/LW'XkG'Dah_*QlntЗoQFwq'Ĵ^S$ygSi>P 4 ~727)?h^=ޑ :yZȱG~T<-̊+H౿7b53Ǫ3͂=~g/fI FsH*lM>:|G0}lV:t(AG\&CMJ*gCb?tL$%J ٹ Uә3 !k&&'Đj}!?&r=v\d5QV[ ^1-BPRq^@?FD3oU7XC5͂8~7:|0A Mm98ۣ3,IlyHhr'H# T 2dfV1%"6lg ǿo ɢǽWuX*Fq -2D9(b,d9M/ְ@{x1wvJHaKǃ~P[t`eS!IDkIjM;^s 3_omQUL=NK @O;"Rϭ_p!lsONOgWUr;evxުNvKGK{! v"j#g0| lջ~Qi,-A1 hdm!F!7(Dx"fW "^sAtf+j)ۀ )#\*pJ‚3yWYPa[g&UFC2(y3Zy,9ZTȭIH9P[4 Q@q(UJ^~v"6275E.B Y-l VpN{>fc0M* >JɱF"g0 5ԨdK^PUĽ?'d-RREQ@mBrUH5uo:#|/ПD:WHesnV4RL]b@ˑQOɺK.}ަd\BU Y.yWYg;vAj`6HCfNnJ?XzW6I\.S=aԿ P,-kR{;Ux/%"Ɯ^ O 9"TdJ?h#")b ˍ2dv2ک-)Xz^ O(X=.5tFeZDo!]C ޝr}%9#BtTbC'x6E8YtX ^?'@&&wnX+p|VEƊ^kE0xcH D!H==BLKIQ}dDNW #fcC*ԠEKQ }@kp\ gjNY}ϥuH5n|_NWEQSwi5-J_]2*K_Į?ǙMSeZ.Q=( eD뛜hǟG +ch,%* :wB 6|An8қ28TOcnve/L!ҩ&xvē ,$*o(Rv.JH>/L\v7iR<};HJK{J- u B|2 Ix;qi[$On]HS "އ05ċLp/Tw3 IUê7K~;4eqc) y-|'ܶpxocdpzF:⚭ :KX.q*ω8Ƒt._J5#F7u)x+leHxĂn$E9cP׍~T9ڜѲӃGN>^O3U 䐓h1YE|{`֨(M' N}u a% *ƐH,! M1pOcՅZ9s\uqZi5XT ցߐ|0˘`=j }kYK+o>Au~ko+Ea ت*W5E +gzA72>mfSp&?@4e<ą\9ZkE\45@J5rCμ ^vW\M ?Dr@W")y,8yk =, yDPM`tT[Rnt}){ϾJb5W4%82Gb. /}q#|˿>DG3(ֳGu0ݿ4,O(7㭙YӪkpI`Ofq@Jcvf{yCw˷/ACvހtȧo9DtTF@e驎2NxwyCte~[-$tne p~Hů'l/0'&QӢ/8(%jM9FvBNz<7Lv) WeӘ!{]xoZIF`}J3$)`v?¸AZݎs~eֳ@0d•UG(fqhq@ʣ3񤀤^ӉXa7Iq]$^UʥƊ4q5t-Gx1L{}#N2b]UzZ>k'M˸u:<$8 "cBϴ'vYKwQ9.<؜#䠜. >_19EZłoQ$ULB(ap6LK~;_N<D`t#>`bMyU4od!8 fmVBï-n^e9#5=ࡁzPA͔7[_jh 6AGz= 4`j3 nҪι[_pS3K,zӌN:V0#ce)Ԕ ǯQI;;yK % `˙-Sov ]Wu9$~Wt _s=^4+BGV9_HrS.t|T)n_SIjR)MXXaù^rGt9N5jW+ ,Y9WÔ&s. v Κs ʃ :x7,NUh8Em'W-pNE,{pX'_DA117P+c&N&c ':˥|چi}|Yރ!n+pmV]).qYjyIM@Ž7Aq1d\s1= a> stream xڬcxm&fǶmuq:f%*m'۶ٱm{=kf:s\"SVc3ANLl̬Zf@5_5 4vjH%l|||T ;w)_ :Bj@ [R.k /u@d 5ZH%)k*ɐ(ilPv6*M:RsRSb9:LnLvoR#8HfWoWAv6mAN@;'ҿY%]?ͤ f SZ/_1֑ O.o`v IfGǿ0Itolgghп#ڜoNS-,9z3g5 vof [kwR39oJR;Hz/GzZZ xcHHyd =R`lm3׿@GiLdjIjnlwVkؚkLlͦn 4g\6l{iW,_%w_~wRwIAf)".r#dba%e`{v_@l%+;9HuYYYH$#ek 2gcԜm.*1:;8_wa7T GZfS nЄn_P]Iza_7-l{u0sgǾH5Mw '7]o>u;AA rVՂ7΄A; T;Kij],vZFMu#` t>!CN,<1O)Y}' k~e{d^ږPcʵtqJgDYy6< 8P )BjHvrRLϢ#>@́O v9bqH/IC'J"2$ֽýpW*#m1BT$ڐ$LV  mv%p\4X֎8nʏA)ma78~*IFh!Ӭ:'hl50FCtkoκn["J>y"~ʹ`̘LƗj-ؚAiܰa"da)sk&Qʓ215΍!JK9HSN0-kW74!FEϰ Q9~ߓm'Wz4GH : ܤ\ώ .b&70GږҠuX ጣj]"̰`p%JF"%FӒHwfbZ_"PLi+3R!R)Pݏj,VǑPs׾}[R{2y&)jab%3 5-*\6Y .A,UE&|;gRk~ E[>yjRлڀcIn%g?\"~^Ìg[G6Jkk\ $cjN?ێg]@6\lAp_]po [O LCT#".ڏH/]vSbY7u@"@1`;y|^ |IQn0[yɀ#%<V2Yۨ[vk,$_&h'u^ oC@z `V(#̊״|p9&9 9زubCiM~ uτODpؑ]B#p4,zxAù) L(o¦1$?hn~''ƴ4 O5kՋ#l=ųELN18VVAK*lmZ0*DDo;b]%nrg!)H7'|/;ɫ|9nZ+tUv7 -S%fڈ\N+'+'0]Kg`AK31I*Y˯ p.FRgyED?A,aWx3:Z1J8ɜC*kTt7. FA燄./W)]c7Y&Z1ѥ1Э z7 )Abَ2߃y!A2tD-HY[d7R*F{5X?3_ʇb3>AO2)Y}"[acZ}זP?D\"_/o1D!j[t~2ֲ9ΫD򻏴M2F[€z)HL_XK uP*[ ,b5_XJa'&iqE1"Ry`vfIby ]|7 2a?A8 =r0͕\Fb )FoK C+ȃΛ!p@<ٜ&-ra-=oR[wlВM Ȋ? Jc͍&6MUK!S ,5޵| R ;ԭԄwP27ǝ T0"ky}j:E{|RlrQ7)qIG pIO)`#VjF`QvNaw3uYqv3VpOnH+=M5,-VWX@>ttS&!]^Sc?< (^A\C,@I b;Ϗn]G/eaPk7$1OEÁ8RFN>2qbw9hj(U}&ƌ(LI/_e`L}|~6Cl{zQoT9iX4< 90^/܏/>( Fcߣ(=^jRHdc7ji[vF[t{)S;ZvS,t4mQSpo74:ABw\2G?aywKiU;اzl!^ ݣksX+y &2)nᥘHFQa4-8Œ<ƀ}Ɉ ER? ۵=7k@OrWyR FHaN_Ufx]r_5(.-l_D'*ci+tOODćC~b FI߂8xQk_ڧ9 #!I3'*ٳԒE=v³xY235$~M*rNQG1lGa{ؠ4,F&D8W3 >Q@<} a#ekN?z%UeD,A-2wJCw7ڷ1-aW铔*wvDV2VGaȄ`|0ҬL/h鮳_9#^qBDޗZg[<} ~Qq\n ?#Tt'#;۵<.3`!Ajj7;Z6$mȸOўofLΧG  oeļ/4jش}|-,vjFC2MpZ4ޟA4ycBWOswU(z'~5pT5{U&d؇-1Ux2kPY1$Fh37MDN@G_6}[c"XE:TD{>a ;ͷ)q_*_M6:?[f=/z/BsTTC޼ lH P.5bhLCbX^PnWc-r:FiYXp NZSK{Gi a )^H2*&K/7QnnjXʚDhӪ)[- m9I)%? dh"? ̌te֊fՃ|;bCbQ4+/`\-lMWg|#1p ZA~7ڭ+Rzߝ׳V"WGF-4D"j#Hπ}??ؗsZ8v"ߡ(tlMݕ Vw] BC{b["\t&ݾzT<ӉX D) u@>y|~mәO",֦n!9﫹kuq~Z$!b%|dεy˗(IqMWum2 9(qkc- ӏ 7u^ɯЃWMƦ*Km˶d,8SbaTMspj.٧k\I{m|Y9]'- =uKP/P/䠦%1I;ěl{oÙ"Az'ZQճOmUZx;uOيS]^iPPXn@P|٘}˲S G7ۻ|'& 'F z|dWS :ںgǡP ;/p ]`M?UV6LiGM +sLD*2}iE`'9vD$߮gg:[vA-|A¿\E ҨN:}e6,U\MxsrTKm%Qhh6SG2xe2ąsWJ~i~u:F֎/)mߢa&C 5g^،X^F ˼X( y"X J&Q}%yqF?c;'ʩ!F<ڃoz4&1kȕ Aa<%:Ư X ٱ@ sg_bu.)? ׷(\Q׫s~@;OqZ0|I.j@}XY V⩥d*:NH JHG,})Sxcl63Lý'4j8'ˬȎk~۶d|[giڧk_Uɫ7tg{pá9ddB>`I1 yԯŬV!M /ݧw@b_T"vB6HK$=ar,e7D¬brJ@?v5:?oZ J2~>폔'""*+ 2AyF=.);pTMcKǟ闯wwl O3T\`# #6]fg.g__@ﲓ`Kϛ}PM D79bJ<$Go%xE2ybYJA*5s NNj}"&_>)jW6ߥlCZ28xUmm}`w:!hJ>ܸd %ri-t~"yw+ujK`|sBo]BVOkǐ>ȥbV)E1t7  &?b*ylyxL7@Yh37uG5rssY_q"Lj.@oȁȩ5fDj\ݼTu[$l!uG7"j܉z#kBbNPUPH&J*B_Zħ\&4B]ݬ{i0j'q<9ye'c/؎5S<"CX$γU)ҼHBEwpDp:gft qo-m;L!}KOӈm: kE:&p{)VP|Nqcw,X}M,B7la+(뛷Y-|Ʒ|8ņ?g Jk.3ƠD75?F oyF_2VʸBx|H=6?OD. &÷p1U2鱎<=24_|hPQ[sˇD*^k7,X[<5FP곶O٩C}ohG:v1ݯTwƻU dmQsݼO[]à}_ǴPRqڕ4$HDM?t[Vtgc,D)&sD` z>Q6ArToDW08TAi.xyka.=Ԏߓ SWg9R.@^5n0'o4lVt5|ΪQoe|TM(MdWu]΁Ṋʳ[{螃60xG#c*-j]ma)>5]|`≘ *jI TOhfO&@b"W2U[[T Z# Q>/ÜY֟)Stgmɳs";|*R.ʸh.2o7DUOJ|ś $ꠠ.M궚D-QD6n+?gN&gZsﮊ>?eN^(s!Q; {yLiS"x5_,o^f] hO# EZ[%9ZVA՝UqԌ8=N4;BZgs C0wm&#r{e2w,9SudWw)c!TMל}gtL=Ip!.RVlZrZmƼ9un xP kOPn3'~(Ϋ"Ū'R(Ԟ&Pu4ṳ Xܤ+w$Y7pRς/+,Ҏ}6c+Fu^"IzDdg jFZ)7ihJ!hiG%QC_ՖcvFTîx^ftֻ3cηş6tϦd(DӹǣF>i Z-1Mz٠߄z'Qqb"O]cy M}XCg< tj$&j-\bta8>{0}ڴ!$%( o<5/ 1kmE(Nfu€4j簴3DV>\0Ta6ٻd:S:7a1 4 YA^m`Gj ř;[;HJ ot}A, б.[%)~DA=mϯS`r/B-pZI)fm:(F@ᬀXteOݿk;J+3tc| LUoo m5%]~ j7Bay/A{a+i<8{; ю|ɬ;WKK :>+%u? .xw6MK<NcH !k*E NTWmKL9"c4($9,!sQ= H84&uEPг1EZ}]S\~@or4Di${p<ȧK,^\=86EeAZ,$; esY*&s;lj68ODMo 1cVp9){r kd~-)dC%M!Flﴉ7 Eg'D.OU.j"!/mds.pjZenǝNŻh zK.ӠEvލ4ϵՙ'ˌz,j[IPln>[yDdDק#A /@!c.hc 'ɽ~Q DK,2yOܗ:*GŔOnH#Q q~fZ =G>%{&ȩ=5Ϭh([%h!G0Td-N2PmyO;␴\FN NZ6+ Viէ5_@e=?rq<=|R%P벦 Sr=XPon>erqǗg%o7շKq]#s崁8e$\=S2eY/5o?LhJ(TmqN:_ǏEme%tg&h}yYԾ*j`ָeҫVC PMi;r굲-Ki1+1ĠcSs`[Kс1ej"O@ ȳ W֥em`|5DH1VQ4uSUD=wdeB{%`yDJOBYKrt/bݘ=d٨ މԒDAksL:gt`LOpw^L`Pǹ;"KOVppB=sbbc쵚gVWA<8=ql_Z5Io锵}$;LկzO=銉a[*=& f!Jc=WV&v"W, ~ A ^O"ŝHFJv⟛)*#ӗm}?(S^~{l9aH`$y,R'h߲K] .|(˺ύTydtQg- Ch' '{zQVJ"DvZrLw璤lXmTr$%n=HGKA_$z4xdZu{i>t9K"!E,-Cl>Ł={ vEo]P\B0"UAY]B|fl~Ԫb VZ=a3UENOEKJ/оx/-,OUniLةW==WH{bRfD(XhdĶnw=L;x 6%ݫB~<q aEԷYJ= _17iLL^dm;QQ?{ $6)ԍ0z=g 2M:>g5n[41kJ;*!|G6\F#j1-z 7꣯0Ug%xOhpABoC䰜dox*I+NL$1U&>GW@z@Zu';^$øABPWpYȁ 2Q(2g|8d0`zV~K&,Aa*Yx%*1b9Ah%G{k `4cCu*E e ߹W#Wyve@:(:tM # S)Fy [>hߵ|m>$EvB+܀y/o"TǯD5ĕ0QtMA-}< O_{pWY+O j`U`Rb昐10©!=u@2{ӻiOR=cG@aPT[1}O#& ~+ke Qf_.u(MY4EFP15jP,*Fbs< wVϫW먓;]bB"h$67!,4Ke`V0K՚ o6+g7{l7$zcŪS!$}L{tGGRE [%ÒrVO<_i5DrGPF?xt_ aNe%1hv>8/I{l=_1_2L|üLypZInAa 2UtϦmfk]Y jr4'vuNE!YI)P\̶i/mPi`$Wv#}{GAk6MN 3uNCnc[NHf8'uv{K+V0UÓ,.ҫP?tmVZ) s h>URE$y5 W9/pP* ?{[1= W$cI缍\O~jCZo$݅m/?TdmabK?0yyڦߖܢFSR͇ MNwJ#y8gu,* ^#Q#K?tMsv"?R5cg2(+ա$6J%TCY"kՒ~\iU7W$dc6A>q٩xAYڝr(g?6Z]]Xwmч|B6Lq I݃kEcO]I(S\i*(ߏ?\mC1 C1ȃ?q0H$Q%NbY4|ﵠ&$ݠ+Q3)?0y.ob˚X,H7lm9^>|%W.ʡ 1U*4ĺ!< endstream endobj 198 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.16)/Keywords() /CreationDate (D:20190917225915-07'00') /ModDate (D:20190917225915-07'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) kpathsea version 6.2.1) >> endobj 159 0 obj << /Type /ObjStm /N 76 /First 664 /Length 3867 /Filter /FlateDecode >> stream x[[sȶ~GrVNqvw@Q[Id`[%L<@Rko]["YDpH&TȤQ "dĸFFtU,-MLHߠѡ e0ƆXX hF4]0)h&#mE 5-UUL( iƁAWp f AI`np#cIc8Ω5, IbA"RC!X$%5b`V 4bd$2QL[G= 2@1368D,! QVa,ev$f.Ap[`tVbm\A2瀀W"E(!<!,d Ñ[<a KK C3h8V3!0VHC8,-:zC10P x9L`*I[Z@RK#e"Flu^ˈ4->0Ÿߌi:hLy8 :=`3~MCvo\8`Xu<8|?!6&PP&RZƟ:10|ӧtܻeyWxY䟱~|L_\] B @Q:hxŸ[`ȟa/Ѝ!gX׷o߂eTe~Q*_ 3tAO8tbc@K G !(gP# (- p}W"mXRL)o,zԿ&_y^eI@JAlE\.?#1Ǹ!vbY 'PLJ`QHI (@ UE6Fi̩ҲC R:H@Ieq/K\Hx4 \XS=Xn>*ClLPhԬ ^`qzA5 |\#uLO6/EMϼ!{kg*;u6g~--uOo@-THcۜcL:j/l=&kj [[+[L1QiR:z#ob6.A2%P@GMUeiZ`Pjτ512ciމ aHg k,w#Nd>\ԇWBBOWÇZ=+KÝucy\?6~ muXBUa$+C_܍ ]_Ks_.֭50!G=rD)&GkZ||jR]7᧣ d:4kuimjk~JomHv $n⚪t􊲦v՜{Nos1&K=V!h܉.zCҗZ{!uIЫ`e(a|Lj(E'`z^ԨZU*3Xze=cDЯ1fű%Bd7ő]չ&Z}e&5; A`ہ,~6͢*3Iۜ1V5LmO}4;h}C"U:}}mzg?VɌ'd/6WEL՟˫t33>K˒/EsˤHoԗ`/lU?J3^?0j7)^ i=@|4X&:J>_YK)et/=klO,-2+ 6uSNKz|}CON^|~<RK'")ѳ)a/8&l3h°ίc75/Ꞿ%JoV3T;cXK#;h@ -x##fm؛7ֽѶX3M?qFlɆ<Av5o'VhAM?>jvY&Yߧ[!¼-`fk+}<ۗbD+]-*^EW‹0*UDoᶬ"UܶEyA5F!#5"*vA*aYӵ=jxM*YB.m]]0bz9`8?|ɪ(=W<6X5Ӧ~ܓd:;P>W(:`<̗U6?`ujۏsY5(<)4 9:m49h!-=[@5pS!GUu AZ2rUOXm}b BZmgv59|?QeA=#>]MĽXh>WS"n2돺Tp"ʃeщBmv6f'r_:,׉*kݍ޲ue nKn8F:嗣:I6~Xj4q2}OSLe?c zRZ endstream endobj 199 0 obj << /Type /XRef /Index [0 200] /Size 200 /W [1 3 1] /Root 197 0 R /Info 198 0 R /ID [<2411303013E3F1B23690932729025BB3> <2411303013E3F1B23690932729025BB3>] /Length 489 /Filter /FlateDecode >> stream xIsMQ Bt!I<]".8+U*#UkTf+Ą|WsynD*B۠Dҋi ;E Tc' &Z+aTVh 6Cl *耝 5ˈw {x<If' endstream endobj startxref 167546 %%EOF optimParallel/inst/doc/optimParallel.pdf.asis0000644000176200001440000000034014011021512021017 0ustar liggesusers%\VignetteIndexEntry{A Parallel Version of the L-BFGS-B Optimization Method} %\VignetteEngine{R.rsp::asis} %\VignetteKeyword{parallel} %\VignetteKeyword{optim} %\VignetteKeyword{optimParallel} %\VignetteKeyword{optimization}optimParallel/inst/CITATION0000644000176200001440000000145014011021512015154 0ustar liggesuserscitHeader("To cite optimParallel in publications use:") citEntry(entry = "article", title = "optimParallel: An R Package Providing a Parallel Version of the L-BFGS-B Optimization Method", author = personList(as.person("Florian Gerber"), as.person("Reinhard Furrer") ), journal = "The R Journal", year = "2019", volume = "11", number = "1", pages = "352--358", url = "https://doi.org/10.32614/RJ-2019-030", doi = "10.32614/RJ-2019-030", textVersion = paste("F. Gerber and R. Furrer (2019)", "optimParallel: An R package providing a parallel version of the L-BFGS-B optimization method. The R Journal, 11(1):352-358, 2019, https://doi.org/10.32614/RJ-2019-030") )