iterators/0000755000176200001440000000000014177344700012275 5ustar liggesusersiterators/NAMESPACE0000644000176200001440000000112014171060105013472 0ustar liggesusersexport(iter, nextElem, isplit) export(irnorm, irunif, irbinom, irnbinom, irpois) export(icount, idiv, ireadLines, iread.table) export(makeIwrapper, isample) export(icountn, iapply) S3method("iter", "default") S3method("iter", "iter") S3method("iter", "matrix") S3method("iter", "data.frame") S3method("iter", "function") S3method("nextElem", "containeriter") S3method("nextElem", "matrixiter") S3method("nextElem", "dataframeiter") S3method("nextElem", "funiter") S3method("nextElem", "abstractiter") S3method("as.list", "iter") S3method("isplit", "default") S3method("isplit", "data.frame") iterators/README.md0000644000176200001440000000040714171060105013541 0ustar liggesusers# iterators [![CRAN](https://www.r-pkg.org/badges/version/iterators)](https://cran.r-project.org/package=iterators) ![Downloads](https://cranlogs.r-pkg.org/badges/iterators) A support package used by [foreach](https://github.com/RevolutionAnalytics/foreach). iterators/man/0000755000176200001440000000000014171060105013034 5ustar liggesusersiterators/man/isplit.Rd0000644000176200001440000000140414171060105014626 0ustar liggesusers\name{isplit} \alias{isplit} \title{Split Iterator} \description{ Returns an iterator that divides the data in the vector \code{x} into the groups defined by \code{f}. } \usage{ isplit(x, f, drop=FALSE, \dots) } \arguments{ \item{x}{vector or data frame of values to be split into groups.} \item{f}{a factor or list of factors used to categorize \code{x}.} \item{drop}{logical indicating if levels that do not occur should be dropped.} \item{\dots}{current ignored.} } \value{ The split iterator. } \seealso{ \code{\link{split}} } \examples{ x <- rnorm(200) f <- factor(sample(1:10, length(x), replace=TRUE)) it <- isplit(x, f) expected <- split(x, f) for (i in expected) { actual <- nextElem(it) stopifnot(actual$value == i) } } \keyword{utilities} iterators/man/iterators-package.Rd0000644000176200001440000000201714171060105016730 0ustar liggesusers\name{iterators-package} \alias{iterators-package} \alias{iterators} \docType{package} \title{ The Iterators Package } \description{ The iterators package provides tools for iterating over various R data structures. Iterators are available for vectors, lists, matrices, data frames, and files. By following very simple conventions, new iterators can be written to support any type of data source, such as database queries or dynamically generated data. } \details{ Further information is available in the following help topics: \tabular{ll}{ \code{iter} \tab Generic function used to create iterator objects.\cr \code{nextElem} \tab Generic function used to get the next element of a iterator.\cr \code{icount} \tab A function used to create a counting iterator.\cr \code{idiv} \tab A function used to create a number dividing iterator.\cr \code{ireadLines} \tab A function used to create a file reading iterator.\cr } For a complete list of functions with individual help pages, use \code{library(help="iterators")}. } \keyword{package} iterators/man/icount.Rd0000644000176200001440000000106114171060105014622 0ustar liggesusers\name{icount} \alias{icount} \alias{icountn} \title{Counting Iterators} \description{ Returns an iterator that counts starting from one. } \usage{ icount(count) icountn(vn) } \arguments{ \item{count}{number of times that the iterator will fire. If not specified, it will count forever.} \item{vn}{vector of counts.} } \value{ The counting iterator. } \examples{ # create an iterator that counts from 1 to 3. it <- icount(3) nextElem(it) nextElem(it) nextElem(it) try(nextElem(it)) # expect a StopIteration exception } \keyword{utilities} iterators/man/iter.Rd0000644000176200001440000000352714171060105014275 0ustar liggesusers\name{iter} \alias{iter} \alias{iter.default} \alias{iter.iter} \alias{iter.matrix} \alias{iter.data.frame} \alias{iter.function} \title{Iterator Factory Functions} \description{ \code{iter} is a generic function used to create iterator objects. } \usage{ iter(obj, \dots) \method{iter}{default}(obj, checkFunc=function(...) TRUE, recycle=FALSE, \dots) \method{iter}{iter}(obj, \dots) \method{iter}{matrix}(obj, by=c('column', 'cell', 'row'), chunksize=1L, checkFunc=function(...) TRUE, recycle=FALSE, \dots) \method{iter}{data.frame}(obj, by=c('column', 'row'), checkFunc=function(...) TRUE, recycle=FALSE, \dots) \method{iter}{function}(obj, checkFunc=function(...) TRUE, recycle=FALSE, \dots) } \arguments{ \item{obj}{an object from which to generate an iterator.} \item{by}{how to iterate.} \item{chunksize}{the number of elements of \code{by} to return with each call to \code{nextElem}.} \item{checkFunc}{a function which, when passed an iterator value, return \code{TRUE} or \code{FALSE}. If \code{FALSE}, the value is skipped in the iteration.} \item{recycle}{a boolean describing whether the iterator should reset after running through all it's values.} \item{\dots}{additional arguments affecting the iterator.} } \value{ The iterator. } \examples{ # a vector iterator i1 <- iter(1:3) nextElem(i1) nextElem(i1) nextElem(i1) # a vector iterator with a checkFunc i1 <- iter(1:3, checkFunc=function(i) i \%\% 2 == 0) nextElem(i1) # a data frame iterator by column i2 <- iter(data.frame(x=1:3, y=10, z=c('a', 'b', 'c'))) nextElem(i2) nextElem(i2) nextElem(i2) # a data frame iterator by row i3 <- iter(data.frame(x=1:3, y=10), by='row') nextElem(i3) nextElem(i3) nextElem(i3) # a function iterator i4 <- iter(function() rnorm(1)) nextElem(i4) nextElem(i4) nextElem(i4) } \keyword{methods} iterators/man/iapply.Rd0000644000176200001440000000143714171060105014626 0ustar liggesusers\name{iapply} \alias{iapply} \title{Array/Apply Iterator} \description{ Returns an iterator over an array, which iterates over the array in much the same manner as the \code{apply} function. } \usage{ iapply(X, MARGIN) } \arguments{ \item{X}{the array to iterate over.} \item{MARGIN}{a vector of subscripts. \code{1} indicates the first dimension (rows), \code{2} indicates the second dimension (columns), etc.} } \value{ The apply iterator. } \seealso{ \code{\link{apply}} } \examples{ a <- array(1:8, c(2, 2, 2)) # iterate over all the matrices it <- iapply(a, 3) as.list(it) # iterate over all the columns of all the matrices it <- iapply(a, c(2, 3)) as.list(it) # iterate over all the rows of all the matrices it <- iapply(a, c(1, 3)) as.list(it) } \keyword{utilities} iterators/man/irnorm.Rd0000644000176200001440000000164714171060105014641 0ustar liggesusers\name{irnorm} \alias{irnorm} \alias{irunif} \alias{irbinom} \alias{irnbinom} \alias{irpois} \title{Random Number Iterators} \description{ These function returns an iterators that return random numbers of various distributions. Each one is a wrapper around a standard \code{R} function. } \usage{ irnorm(..., count) irunif(..., count) irbinom(..., count) irnbinom(..., count) irpois(..., count) } \arguments{ \item{count}{number of times that the iterator will fire. If not specified, it will fire values forever.} \item{\dots}{arguments to pass to the underlying \code{rnorm} function.} } \value{ An iterator that is a wrapper around the corresponding random number generator function. } \examples{ # create an iterator that returns three random numbers it <- irnorm(1, count=3) nextElem(it) nextElem(it) nextElem(it) try(nextElem(it)) # expect a StopIteration exception } \keyword{utilities} iterators/man/nextElem.Rd0000644000176200001440000000151314171060105015104 0ustar liggesusers\name{nextElem} \alias{nextElem} \alias{nextElem.containeriter} \alias{nextElem.funiter} \title{Get Next Element of Iterator} \description{ \code{nextElem} is a generic function used to produce values. If a \code{checkFunc} was specified to the constructor, the potential iterated values will be passed to the \code{checkFunc} until the \code{checkFunc} returns \code{TRUE}. When the iterator has no more values, it calls stop with the message 'StopIteration'. } \usage{ nextElem(obj, \dots) \method{nextElem}{containeriter}(obj, \dots) \method{nextElem}{funiter}(obj, \dots) } \arguments{ \item{obj}{an iterator object.} \item{\dots}{additional arguments that are ignored.} } \value{ The value. } \examples{ it <- iter(c('a', 'b', 'c')) print(nextElem(it)) print(nextElem(it)) print(nextElem(it)) } \keyword{methods} iterators/man/ireadLines.Rd0000644000176200001440000000152114171060105015401 0ustar liggesusers\name{ireadLines} \alias{ireadLines} \title{Iterator over Lines of Text from a Connection} \description{ Returns an iterator over the lines of text from a connection. It is a wrapper around the standard \code{readLines} function. } \usage{ ireadLines(con, n=1, ...) } \arguments{ \item{con}{a connection object or a character string.} \item{n}{integer. The maximum number of lines to read. Negative values indicate that one should read up to the end of the connection. The default value is 1.} \item{\dots}{passed on to the \code{readLines} function.} } \value{ The line reading iterator. } \seealso{ \code{\link[base]{readLines}} } \examples{ # create an iterator over the lines of COPYING it <- ireadLines(file.path(R.home(), 'COPYING')) nextElem(it) nextElem(it) nextElem(it) } \keyword{utilities} iterators/man/makeIwrapper.Rd0000644000176200001440000000263714171060105015762 0ustar liggesusers\name{makeIwrapper} \alias{makeIwrapper} \alias{isample} \title{Iterator Maker Generator} \description{ The \code{makeIwrapper} function makes iterator makers. The resulting iterator makers all take an optional \code{count} argument which specifies the number of times the resulting iterator should fire. The iterators are wrappers around functions that return different values each time they are called. The \code{isample} function is an example of one such iterator maker (as are \code{irnorm}, \code{irunif}, etc.). } \usage{ makeIwrapper(FUN) isample(..., count) } \arguments{ \item{FUN}{a character string naming a function that generates different values each time it is called; typically one of the standard random number generator functions.} \item{count}{number of times that the iterator will fire. If not specified, it will fire values forever.} \item{\dots}{arguments to pass to the underlying \code{FUN} function.} } \value{ An iterator that is a wrapper around the corresponding function. } \examples{ # create an iterator maker for the sample function mysample <- makeIwrapper('sample') # use this iterator maker to generate an iterator # that will generate three five member samples from the # sequence 1:100 it <- mysample(1:100, 5, count=3) nextElem(it) nextElem(it) nextElem(it) try(nextElem(it)) # expect a StopIteration exception } \keyword{utilities} iterators/man/iread.table.Rd0000644000176200001440000000231514171060105015476 0ustar liggesusers\name{iread.table} \alias{iread.table} \title{Iterator over Rows of a Data Frame Stored in a File} \description{ Returns an iterator over the rows of a data frame stored in a file in table format. It is a wrapper around the standard \code{read.table} function. } \usage{ iread.table(file, ..., verbose=FALSE) } \arguments{ \item{file}{the name of the file to read the data from.} \item{\dots}{all additional arguments are passed on to the \code{read.table} function. See the documentation for \code{read.table} for more information.} \item{verbose}{logical value indicating whether or not to print the calls to \code{read.table}.} } \value{ The file reading iterator. } \note{ In this version of \code{iread.table}, both the \code{read.table} arguments \code{header} and \code{row.names} must be specified. This is because the default values of these arguments depend on the contents of the beginning of the file. In order to make the subsequent calls to \code{read.table} work consistently, the user must specify those arguments explicitly. A future version of \code{iread.table} may remove this requirement. } \seealso{ \code{\link[utils]{read.table}} } \keyword{utilities} iterators/man/idiv.Rd0000644000176200001440000000226114171060105014257 0ustar liggesusers\name{idiv} \alias{idiv} \title{Dividing Iterator} \description{ Returns an iterator that returns pieces of numeric value. } \usage{ idiv(n, ..., chunks, chunkSize) } \arguments{ \item{n}{number of times that the iterator will fire. If not specified, it will count forever.} \item{\dots}{unused.} \item{chunks}{the number of pieces that \code{n} should be divided into. This is useful when you know the number of pieces that you want. If specified, then \code{chunkSize} should not be.} \item{chunkSize}{the maximum size of the pieces that \code{n} should be divided into. This is useful when you know the size of the pieces that you want. If specified, then \code{chunks} should not be.} } \value{ The dividing iterator. } \examples{ # divide the value 10 into 3 pieces it <- idiv(10, chunks=3) nextElem(it) nextElem(it) nextElem(it) try(nextElem(it)) # expect a StopIteration exception # divide the value 10 into pieces no larger than 3 it <- idiv(10, chunkSize=3) nextElem(it) nextElem(it) nextElem(it) nextElem(it) try(nextElem(it)) # expect a StopIteration exception } \keyword{utilities} iterators/DESCRIPTION0000644000176200001440000000152214177344700014003 0ustar liggesusersPackage: iterators Type: Package Title: Provides Iterator Construct Version: 1.0.14 Authors@R: c(person("Folashade", "Daniel", role="cre", email="fdaniel@microsoft.com"), person("Revolution", "Analytics", role=c("aut", "cph")), person("Steve", "Weston", role="aut")) Description: Support for iterators, which allow a programmer to traverse through all the elements of a vector, list, or other collection of data. URL: https://github.com/RevolutionAnalytics/iterators Depends: R (>= 2.5.0), utils Suggests: RUnit, foreach License: Apache License (== 2.0) NeedsCompilation: no Packaged: 2022-01-16 18:19:31 UTC; folashade Author: Folashade Daniel [cre], Revolution Analytics [aut, cph], Steve Weston [aut] Maintainer: Folashade Daniel Repository: CRAN Date/Publication: 2022-02-05 00:50:08 UTC iterators/build/0000755000176200001440000000000014171060663013371 5ustar liggesusersiterators/build/vignette.rds0000644000176200001440000000034714171060663015734 0ustar liggesusersuO 0?hA7]D"DAݎ\1)s2ɵ/LG]l9;g!d#ײ`Zv< ёIE.${K^1p#j"yj_ )Xci5^ {0aA+SE ͈s5Z,&ai|G2AeÂOlMfkK_~n7~fiterators/tests/0000755000176200001440000000000014171060105013423 5ustar liggesusersiterators/tests/doRUnit.R0000644000176200001440000000522414171060105015135 0ustar liggesusers## unit tests will not be done if RUnit is not available if(require("RUnit", quietly=TRUE)) { ## --- Setup --- pkg <- "iterators" # <-- Change to package name! if(Sys.getenv("RCMDCHECK") == "FALSE") { ## Path to unit tests for standalone running under Makefile (not R CMD check) ## PKG/tests/../inst/unitTests path <- file.path(getwd(), "..", "inst", "unitTests") } else { ## Path to unit tests for R CMD check ## PKG.Rcheck/tests/../PKG/unitTests path <- system.file(package=pkg, "unitTests") } cat("\nRunning unit tests\n") print(list(pkg=pkg, getwd=getwd(), pathToUnitTests=path)) library(package=pkg, character.only=TRUE) ################################################################ ## BEGIN PACKAGE SPECIFIC CONFIGURATION # ################################################################ ################################################################ ## END PACKAGE SPECIFIC CONFIGURATION # ################################################################ ## If desired, load the name space to allow testing of private functions ## if (is.element(pkg, loadedNamespaces())) ## attach(loadNamespace(pkg), name=paste("namespace", pkg, sep=":"), pos=3) ## ## or simply call PKG:::myPrivateFunction() in tests ## --- Testing --- ## Define tests testSuite <- defineTestSuite(name=paste(pkg, "unit testing"), dirs=path, testFileRegexp = "^.+Test\\.R$") ## Run tests <- runTestSuite(testSuite) ## Default report name pathReport <- file.path(tempdir(), "report") ## Report to stdout and text files cat("------------------- UNIT TEST SUMMARY ---------------------\n\n") printTextProtocol(tests, showDetails=FALSE) printTextProtocol(tests, showDetails=FALSE, fileName=paste(pathReport, "Summary.txt", sep="")) printTextProtocol(tests, showDetails=TRUE, fileName=paste(pathReport, ".txt", sep="")) ## Report to HTML file printHTMLProtocol(tests, fileName=paste(pathReport, ".html", sep="")) # printHTMLProtocol(tests, fileName=file.path(dirname(dirname(getwd())),pkg,"gsDesign-RUnit-Test-Summary.html")) #paste(pathReport, ".html", sep="")) ## Return stop() to cause R CMD check stop in case of ## - failures i.e. FALSE to unit tests or ## - errors i.e. R errors tmp <- getErrors(tests) if(tmp$nFail > 0 | tmp$nErr > 0) { stop(paste("\n\nunit testing failed (#test failures: ", tmp$nFail, ", #R errors: ", tmp$nErr, ")\n\n", sep="")) } } else { warning("cannot run unit tests -- package RUnit is not available") } iterators/vignettes/0000755000176200001440000000000014171060663014302 5ustar liggesusersiterators/vignettes/iterators.Rnw0000644000176200001440000001411214171060105016774 0ustar liggesusers% \VignetteIndexEntry{iterators Manual} % \VignetteDepends{iterators} % \VignettePackage{iterators} \documentclass[12pt]{article} \usepackage{amsmath} \usepackage[pdftex]{graphicx} \usepackage{color} \usepackage{xspace} \usepackage{fancyvrb} \usepackage{fancyhdr} \usepackage[ colorlinks=true, linkcolor=blue, citecolor=blue, urlcolor=blue] {hyperref} \usepackage{lscape} \usepackage{Sweave} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % define new colors for use \definecolor{darkgreen}{rgb}{0,0.6,0} \definecolor{darkred}{rgb}{0.6,0.0,0} \definecolor{lightbrown}{rgb}{1,0.9,0.8} \definecolor{brown}{rgb}{0.6,0.3,0.3} \definecolor{darkblue}{rgb}{0,0,0.8} \definecolor{darkmagenta}{rgb}{0.5,0,0.5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bld}[1]{\mbox{\boldmath $#1$}} \newcommand{\shell}[1]{\mbox{$#1$}} \renewcommand{\vec}[1]{\mbox{\bf {#1}}} \newcommand{\ReallySmallSpacing}{\renewcommand{\baselinestretch}{.6}\Large\normalsize} \newcommand{\SmallSpacing}{\renewcommand{\baselinestretch}{1.1}\Large\normalsize} \newcommand{\halfs}{\frac{1}{2}} \setlength{\oddsidemargin}{-.25 truein} \setlength{\evensidemargin}{0truein} \setlength{\topmargin}{-0.2truein} \setlength{\textwidth}{7 truein} \setlength{\textheight}{8.5 truein} \setlength{\parindent}{0.20truein} \setlength{\parskip}{0.10truein} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagestyle{fancy} \lhead{} \chead{Using The {\tt iterators} Package} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Using The {\tt iterators} Package} \author{Rich Calaway} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} An {\em iterator} is a special type of object that generalizes the notion of a looping variable. When passed as an argument to a function that knows what to do with it, the iterator supplies a sequence of values. The iterator also maintains information about its state, in particular its current index. The \texttt{iterators} package includes a number of functions for creating iterators, the simplest of which is \texttt{iter}, which takes virtually any R object and turns it into an iterator object. The simplest function that operates on iterators is the \texttt{nextElem} function, which when given an iterator, returns the next value of the iterator. For example, here we create an iterator object from the sequence 1 to 10, and then use \texttt{nextElem} to iterate through the values: <>= library(iterators) i1 <- iter(1:10) nextElem(i1) nextElem(i1) @ You can create iterators from matrices and data frames, using the \texttt{by} argument to specify whether to iterate by row or column: <>= istate <- iter(state.x77, by='row') nextElem(istate) nextElem(istate) @ Iterators can also be created from functions, in which case the iterator can be an endless source of values: <>= ifun <- iter(function() sample(0:9, 4, replace=TRUE)) nextElem(ifun) nextElem(ifun) @ For practical applications, iterators can be paired with \texttt{foreach} to obtain parallel results quite easily: \begin{Schunk} \begin{Sinput} > library(foreach) \end{Sinput} \begin{Soutput} foreach: simple, scalable parallel programming from Revolution Analytics Use Revolution R for scalability, fault tolerance and more. http://www.revolutionanalytics.com \end{Soutput} \begin{Sinput} > x <- matrix(rnorm(1e+06), ncol = 10000) > itx <- iter(x, by = "row") > foreach(i = itx, .combine = c) %dopar% mean(i) \end{Sinput} \begin{Soutput} [1] -0.0069652059 0.0161112989 0.0080068074 -0.0120020610 0.0017168149 [6] 0.0139835943 -0.0078172106 -0.0024762273 -0.0031558268 -0.0072662893 [11] -0.0055142639 0.0015717907 -0.0100842965 -0.0123601527 0.0136420084 [16] -0.0242922105 -0.0126416949 -0.0052951152 0.0216329326 -0.0262476648 [21] 0.0041937609 0.0121253368 -0.0110165729 0.0044267635 0.0080241894 [26] 0.0042995539 -0.0102826632 0.0051185628 -0.0013970812 -0.0172380786 [31] 0.0096079613 0.0046837729 -0.0080726970 0.0083781727 -0.0234620163 [36] -0.0099883966 0.0026883628 0.0029367320 0.0205825899 0.0035303940 [41] 0.0204990426 -0.0010804987 -0.0033665481 -0.0127492019 -0.0147443195 [46] 0.0027046346 0.0016449793 0.0155575490 -0.0003488394 -0.0079238019 [51] 0.0086390030 -0.0039033309 0.0168593825 -0.0067189572 -0.0009925288 [56] -0.0162907048 -0.0059171838 0.0093806072 0.0100886929 -0.0111677408 [61] 0.0021754963 -0.0056770907 0.0081200698 -0.0029828717 -0.0163704350 [66] 0.0057266267 -0.0017156156 0.0214172738 -0.0141379874 -0.0126593342 [71] 0.0087124575 0.0040231519 0.0038515673 0.0066066908 0.0023586046 [76] -0.0044167901 -0.0090543553 0.0010806096 0.0102288061 0.0039881702 [81] -0.0054549319 -0.0127997275 -0.0031697122 -0.0016100996 -0.0143468118 [86] 0.0035904125 -0.0059399479 0.0085565480 -0.0159064868 0.0054120554 [91] -0.0084420572 0.0194448129 -0.0103192553 -0.0062924628 0.0215069258 [96] 0.0015749065 0.0109657488 0.0152237842 -0.0057181022 0.0035530715 \end{Soutput} \end{Schunk} \section{Some Special Iterators} The notion of an iterator is new to R, but should be familiar to users of languages such as Python. The \texttt{iterators} package includes a number of special functions that generate iterators for some common scenarios. For example, the \texttt{irnorm} function creates an iterator for which each value is drawn from a specified random normal distribution: <>= library(iterators) itrn <- irnorm(10) nextElem(itrn) nextElem(itrn) @ Similarly, the \texttt{irunif}, \texttt{irbinom}, and \texttt{irpois} functions create iterators which drawn their values from uniform, binomial, and Poisson distributions, respectively. We can then use these functions just as we used \texttt{irnorm}: <>= itru <- irunif(10) nextElem(itru) nextElem(itru) @ The \texttt{icount} function returns an iterator that counts starting from one: <>= it <- icount(3) nextElem(it) nextElem(it) nextElem(it) @ \end{document} iterators/vignettes/writing.Rnw0000644000176200001440000005006014171060105016445 0ustar liggesusers% \VignetteIndexEntry{Writing Custom Iterators} % \VignetteDepends{iterators} % \VignettePackage{iterators} \documentclass[12pt]{article} \usepackage{amsmath} \usepackage[pdftex]{graphicx} \usepackage{color} \usepackage{xspace} \usepackage{fancyvrb} \usepackage{fancyhdr} \usepackage[ colorlinks=true, linkcolor=blue, citecolor=blue, urlcolor=blue] {hyperref} \usepackage{lscape} \usepackage{Sweave} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % define new colors for use \definecolor{darkgreen}{rgb}{0,0.6,0} \definecolor{darkred}{rgb}{0.6,0.0,0} \definecolor{lightbrown}{rgb}{1,0.9,0.8} \definecolor{brown}{rgb}{0.6,0.3,0.3} \definecolor{darkblue}{rgb}{0,0,0.8} \definecolor{darkmagenta}{rgb}{0.5,0,0.5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bld}[1]{\mbox{\boldmath $#1$}} \newcommand{\shell}[1]{\mbox{$#1$}} \renewcommand{\vec}[1]{\mbox{\bf {#1}}} \newcommand{\ReallySmallSpacing}{\renewcommand{\baselinestretch}{.6}\Large\normalsize} \newcommand{\SmallSpacing}{\renewcommand{\baselinestretch}{1.1}\Large\normalsize} \newcommand{\halfs}{\frac{1}{2}} \setlength{\oddsidemargin}{-.25 truein} \setlength{\evensidemargin}{0truein} \setlength{\topmargin}{-0.2truein} \setlength{\textwidth}{7 truein} \setlength{\textheight}{8.5 truein} \setlength{\parindent}{0.20truein} \setlength{\parskip}{0.10truein} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagestyle{fancy} \lhead{} \chead{Writing Custom Iterators} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Writing Custom Iterators} \author{Steve Weston} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} <>= library(iterators) @ An {\em iterator} is a special type of object that supplies data on demand, one element\footnote{An ``element'' in this case can be basically any object. I don't mean to suggest that the data is necessarily returned as scalar values, for example.} at a time. This is a nice abstraction that can help simplify many programs. Iterators are particularly useful in parallel computing, since they facilitate splitting a problem into smaller pieces that can then be executed in parallel. Iterators can also be used to reduce the total memory that is needed at any one time. For example, if you want to process the lines of text in a file, it is common to write a loop that reads the file one line at a time, rather than reading the entire file in order to avoid running out of memory on huge files. That's the basic idea of iterators. Iterators provide a standard method for getting the next element, which allows us to write functions that take an iterator as an argument to provide a source of data. The function doesn't need to know what kind of iterator it is. It just needs to know how to get another piece of data. The data could be coming from a file, a database, a vector, or it could be dynamically generated. There are a number of iterators that come in the \texttt{iterators} package. The \texttt{iapply} function allows you to iterate over arrays, in much the same way as the standard \texttt{apply} function. \texttt{apply} has fixed rules on how the results are returned, which may require you to reshape the results, which can be inefficient, as well as inconvenient. But since \texttt{iapply} doesn't process any data or combine the results, it is more flexible. You can use \texttt{iapply} with the \texttt{foreach} package to perform a parallel \texttt{apply} operation, and combine the results any way you want via the \texttt{.combine} argument to \texttt{foreach}. Another iterator that comes in the \texttt{iterators} package is the \texttt{isplit} function, which works much like the standard \texttt{split} function. \texttt{split} returns a list containing all of the data divided into groups. \texttt{isplit} only generates one group at a time, as they are needed, which can reduce the amount memory that is needed. But of course, there will be times when you need an iterator that isn't provided by the \texttt{iterators} package. That is when you need to write your own custom iterator. Fortunately, that is fairly easy to do. \section{What methods are needed for an iterator?} Basically, an iterator is an S3 object whose base class is \texttt{iter}, and has \texttt{iter} and \texttt{nextElem} methods. The purpose of the \texttt{iter} method is to return an iterator for the specified object. For iterators, that usually just means returning itself, which seems odd at first. But the \texttt{iter} method can be defined for other objects that don't define a \texttt{nextElem} method. We call those objects {\em iterables}, meaning that you can iterate over them. The \texttt{iterators} package defines \texttt{iter} methods for vectors, lists, matrices, and data frames, making those objects iterables. By defining an \texttt{iter} method for iterators, they can be used in the same context as an iterable, which can be convenient. For example, the \texttt{foreach} function takes iterables as arguments. It calls the \texttt{iter} method on those arguments in order to create iterators for them. By defining the \texttt{iter} method for all iterators, we can pass iterators to \texttt{foreach} that we created using any method we choose. Thus, we can pass vectors, lists, or iterators to \texttt{foreach}, and they are all processed by \texttt{foreach} in exactly the same way. The \texttt{iterators} package comes with an \texttt{iter} method defined for the \texttt{iter} class that simply returns itself. That is usually all that is needed for an iterator. However, if you want to create an iterator for some existing class, you can do that by writing an \texttt{iter} method that returns an appropriate iterator. That will allow you to pass an instance of your class to \texttt{foreach}, which will automatically convert it into an iterator. The alternative is to write your own function that takes arbitrary arguments, and returns an iterator. You can choose whichever method is most natural. The most important method required for iterators is \texttt{nextElem}. This simply returns the next value, or throws an error. Calling the \texttt{stop} function with the string \texttt{'StopIteration'} indicates that there are no more values available in the iterator. Now before we write our own iterator, let's try calling the \texttt{iter} and \texttt{nextElem} methods on an existing one. Since a list is an iterable, we can create an iterator for that list by calling \texttt{iter} on it: <>= it <- iter(list(1:2, 3:4)) @ We can now call \texttt{nextElem} on the resulting iterator to get the values from the list: <>= nextElem(it) nextElem(it) tryCatch(nextElem(it), error=function(e) e) @ As you can see, it is possible to call these methods manually, but it's somewhat awkward, since you have to handle the \texttt{'StopIteration'} error. Later on, we'll see one solution to this difficulty, although, in general, you don't call these method explicitly. \section{A simple iterator} It's time to show the implementation of a very simple iterator. Although I've made it sound like you have to write your own \texttt{iter} and \texttt{nextElem} methods, you can inherit them. In fact, that's what all of the following examples do. I do that by inheriting from the \texttt{abstractiter} class. The \texttt{abstractiter} class uses the standard \texttt{iter} method which returns itself, and defines a \texttt{nextElem} method that calls the \texttt{nextElem} element of the object. Let's take a look at the implementation of these two methods: <>= iterators:::iter.iter iterators:::nextElem.abstractiter @ Now here's a function that creates a very simple iterator that uses these two methods: <>= iforever <- function(x) { nextEl <- function() x obj <- list(nextElem=nextEl) class(obj) <- c('iforever', 'abstractiter', 'iter') obj } @ Note that I called the internal function \texttt{nextEl} rather than \texttt{nextElem}. I do that by convention to avoid masking the standard \texttt{nextElem} generic function. That causes problems when you want your iterator to call the \texttt{nextElem} method of another iterator, which can be quite useful, as we'll see in a later example. We create an instance of this iterator by calling the \texttt{iforever} function, and then use it by calling the \texttt{nextElem} method on the resulting object: <>= it <- iforever(42) nextElem(it) nextElem(it) @ You can also get values from an iterator using \texttt{as.list}. But since this is an infinite iterator, you need to use the \texttt{n} argument to avoid using up a lot of memory and time: <>= unlist(as.list(it, n=6)) @ Notice that it doesn't make sense to implement this iterator by defining a new \texttt{iter} method, since there is no natural iterable on which to dispatch. The only argument that we need is the object for the iterator to return, which can be of any type. Instead, we implement this iterator by defining a normal function that returns the iterator. This iterator is quite simple to implement, and possibly even useful.\footnote{Be careful how you use this iterator! If you pass it to \texttt{foreach}, it will result in an infinite loop unless you pair it with a non-infinite iterator. Also, {\em never} pass this to the \texttt{as.list} function without the \texttt{n} argument.} The iterator returned by \texttt{iforever} is a list that has a single element named \texttt{nextElem}, whose value is a function that returns the value of \texttt{x}. Because we are subclassing \texttt{abstractiter}, we inherit a \texttt{nextElem} method that will call this function, and because we are subclassing \texttt{iter}, we inherit an \texttt{iter} method that will return itself. Of course, the reason this iterator is so simple is because it doesn't contain any state. Most iterators need to contain some state, or it will be difficult to make it return different values and eventually stop. Managing the state is usually the real trick to writing iterators. \section{A stateful iterator} Let's modify the previous iterator to put a limit on the number of values that it returns. I'll call the new function \texttt{irep}, and give it another argument called \texttt{times}: <>= irep <- function(x, times) { nextEl <- function() { if (times > 0) times <<- times - 1 else stop('StopIteration') x } obj <- list(nextElem=nextEl) class(obj) <- c('irep', 'abstractiter', 'iter') obj } @ Now let's try it out: <>= it <- irep(7, 6) unlist(as.list(it)) @ The real difference between \texttt{iforever} and \texttt{irep} is in the function that gets called by the \texttt{nextElem} method. This function not only accesses the values of the variables \texttt{x} and \texttt{times}, but it also modifies the value of \texttt{times}. This is accomplished by means of the ``\verb=<<-='' \footnote{It's commonly believed that ``$<<-$'' is only used to set variables in the global environment, but that isn't true. I think of it as an {\em inheriting} assignment operator.} operator, and the magic of lexical scoping. Technically, this kind of function is called a {\em closure}, and is a somewhat advanced feature of \texttt{R}. The important thing to remember is that \texttt{nextEl} is able to get the value of variables that were passed as arguments to \texttt{irep}, and it can modify those values using the ``\verb=<<-='' operator. These are {\em not} global variables: they are defined in the enclosing environment of the \texttt{nextEl} function. You can create as many iterators as you want using the \texttt{irep} function, and they will all work as expected without conflicts. Note that this iterator only uses the arguments to \texttt{irep} to store its state. If any other state variables are needed, they can be defined anywhere inside the \texttt{irep} function. \section{Using an iterator inside an iterator} The previous section described a general way of writing custom iterators. Almost any iterator can be written using those basic techniques. At times, it may be simpler to make use of an existing iterator to implement a new iterator. Let's say that you need an iterator that splits a vector into subvectors. That can allow you to process the vector in parallel, but still use vector operations, which is essential to getting good sequential performance in R. The following function returns just such an iterator: <>= ivector <- function(x, ...) { i <- 1 it <- idiv(length(x), ...) nextEl <- function() { n <- nextElem(it) ix <- seq(i, length=n) i <<- i + n x[ix] } obj <- list(nextElem=nextEl) class(obj) <- c('ivector', 'abstractiter', 'iter') obj } @ \texttt{ivector} uses \texttt{...} to pass options on to \texttt{idiv}. \texttt{idiv} supports the \texttt{chunks} argument to split its argument into a specified number of pieces, and the \texttt{chunkSize} argument to split it into pieces of a specified maximum size. Let's create an \texttt{ivector} iterator to split a vector into three pieces using the \texttt{chunks} argument: <>= it <- ivector(1:25, chunks=3) as.list(it) @ Note that the \texttt{nextEl} function doesn't seem to throw a \texttt{StopIteration} exception. It is actually throwing it indirectly, by calling \texttt{nextElem} on the iterator created via the \texttt{idiv} function. This function is fairly simple, because most of the tricky stuff is handled by \texttt{idiv}. \texttt{ivector} focuses on operating on the vector. It should be clear that only minor modification need to be made to this function to create an iterator over the blocks of rows or columns of a matrix or data frame. But I'll leave that as an exercise for the reader. \section{Adding a \texttt{hasNext} method to an iterator} At times it would be nice to write a loop that explicitly gets the values of an iterator. Although that is certainly possible with a standard iterator, it requires some rather awkward error handling. One solution to this problem is to add a method that indicates whether there is another value available in the iterator. Then you can write a simple while loop that stops when there are no more values. One way to do that would be to define a new S3 method called \texttt{hasNext}. Here's the definition of a \texttt{hasNext} generic function: <>= hasNext <- function(obj, ...) { UseMethod('hasNext') } @ We also need to define \texttt{hasNext} method for a iterator class that we'll call \texttt{ihasNext}: <>= hasNext.ihasNext <- function(obj, ...) { obj$hasNext() } @ As you can see, an \texttt{ihasNext} object must be a list with a \texttt{hasNext} element that is a function. That's the same technique that the \texttt{abstractiter} class uses to implement the \texttt{nextElem} method. Now we'll define a function, called \texttt{ihasNext}, that takes an arbitrary iterator and returns returns an \texttt{ihasNext} iterator that wraps the specified iterator. That allows us to turn any iterator into an \texttt{ihasNext} iterator, thus providing it with a \texttt{hasNext} method:\footnote{Thanks to Hadley Wickham for contributing this function, which I only hacked up a little. You can also find this function, along with \texttt{hasNext} and \texttt{hasNext.ihasNext} in the examples directory of the iterators packages.} <>= ihasNext <- function(it) { if (!is.null(it$hasNext)) return(it) cache <- NULL has_next <- NA nextEl <- function() { if (!hasNx()) stop('StopIteration', call.=FALSE) has_next <<- NA cache } hasNx <- function() { if (!is.na(has_next)) return(has_next) tryCatch({ cache <<- nextElem(it) has_next <<- TRUE }, error=function(e) { if (identical(conditionMessage(e), 'StopIteration')) { has_next <<- FALSE } else { stop(e) } }) has_next } obj <- list(nextElem=nextEl, hasNext=hasNx) class(obj) <- c('ihasNext', 'abstractiter', 'iter') obj } @ When the \texttt{hasNext} method is called, it calls the \texttt{nextElem} method on the underlying iterator, and the resulting value is saved. That value is then passed to the user when \texttt{nextElem} is called. Of course, it also does the right thing if you don't call \texttt{hasNext}, or if you call it multiple times before calling \texttt{nextElem}. So now we can easily create an \texttt{icount} iterator, and get its values in a while loop, without having to do any messy error handling: <>= it <- ihasNext(icount(3)) while (hasNext(it)) { print(nextElem(it)) } @ \section{A recycling iterator} The \texttt{ihasNext} function from the previous section is an interesting example of a function that takes an iterator and returns an iterator that wraps the specified iterator. In that case, we wanted to add another method to the iterator. In this example, we'll return an iterator that recycles the values of the wrapped iterator:\footnote{ Actually, some of the standard \texttt{iter} methods support a \texttt{recycle} argument. But this is a nice example, and a more general solution, since it works on any iterator.} <>= irecycle <- function(it) { values <- as.list(iter(it)) i <- length(values) nextEl <- function() { i <<- i + 1 if (i > length(values)) i <<- 1 values[[i]] } obj <- list(nextElem=nextEl) class(obj) <- c('irecycle', 'abstractiter', 'iter') obj } @ This is fairly nice, but note that this is another one of those infinite iterators that we need to be careful about. Also, make sure that you don't pass an infinite iterator to \texttt{irecycle}. That would be pointless of course, since there's no reason to recycle an iterator that never ends. It would be possible to write this to avoid that problem by not grabbing all of the values right up front, but you would still end up saving values that will never be recycled, so I've opted to keep this simple. Let's try it out: <>= it <- irecycle(icount(3)) unlist(as.list(it, n=9)) @ \section{Limiting infinite iterators} I was tempted to add an argument to the \texttt{irecycle} function to limit the number of values that it returns, because sometimes you want to recycle for awhile, but not forever. I didn't do that, because rather than make \texttt{irecycle} more complicated, I decided to write yet another function that takes an iterator and returns a modified iterator to handle that task: <>= ilimit <- function(it, times) { it <- iter(it) nextEl <- function() { if (times > 0) times <<- times - 1 else stop('StopIteration') nextElem(it) } obj <- list(nextElem=nextEl) class(obj) <- c('ilimit', 'abstractiter', 'iter') obj } @ Note that this looks an awful lot like the \texttt{irep} function that we implemented previously. In fact, using \texttt{ilimit}, we can implement \texttt{irep} using \texttt{iforever} much more simply, and without duplication of code: <>= irep2 <- function(x, times) ilimit(iforever(x), times) @ To demonstrate \texttt{irep2}, I'll use \texttt{ihasNext} and a while loop: <>= it <- ihasNext(irep2('foo', 3)) while (hasNext(it)) { print(nextElem(it)) } @ Here's one last example. Let's recycle a vector three times using \texttt{ilimit}, and convert it back into a vector using \texttt{as.list} and \texttt{unlist}: <>= iterable <- 1:3 n <- 3 it <- ilimit(irecycle(iterable), n * length(iterable)) unlist(as.list(it)) @ Sort of a complicated version of: <>= rep(iterable, n) @ Aren't iterators fun? \section{Conclusion} Writing your own iterators can be quite simple, and yet is very useful and powerful. It provides a very effective way to extend the capabilities of other packages that use iterators, such as the \texttt{foreach} package. By writing iterators that wrap other iterators, it is possible to put together a powerful and flexible set of tools that work well together, and that can solve many of the complex problems that come up in parallel computing. \end{document} iterators/R/0000755000176200001440000000000014171060105012462 5ustar liggesusersiterators/R/aslist.R0000644000176200001440000000177414171060105014115 0ustar liggesusers# # Copyright (c) 2008-2010 Revolution Analytics # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # as.list.iter <- function(x, n=as.integer(2^31-1), ...) { size <- 64 a <- vector('list', length=size) i <- 0 tryCatch({ while (i < n) { if (i >= size) { size <- min(2 * size, n) length(a) <- size } a[i + 1] <- list(nextElem(x)) i <- i + 1 } }, error=function(e) { if (!identical(conditionMessage(e), 'StopIteration')) stop(e) }) length(a) <- i a } iterators/R/isplit.R0000644000176200001440000000525514171060105014120 0ustar liggesusers# # Copyright (c) 2008-2010 Revolution Analytics # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # icountn <- function(vn) { n <- length(vn) if (n == 0) stop('illegal zero length vector') icar <- icount(vn[n]) if (n > 1) { icdr <- icountn(vn[-n]) hasVal <- FALSE nextVal <- NULL } nextEl <- if (n == 1) { function() nextElem(icar) } else { function() { repeat { if (!hasVal) { nextVal <<- nextElem(icar) hasVal <<- TRUE } tryCatch({ return(c(nextElem(icdr), nextVal)) }, error=function(e) { if (identical(conditionMessage(e), 'StopIteration')) { icdr <<- icountn(vn[-n]) hasVal <<- FALSE } else { stop(e) } }) } } } structure(list(nextElem=nextEl), class=c('abstractiter', 'iter')) } iwhich <- function(nf, ind) { n <- length(ind) if (n == 0) stop('illegal zero length vector') x <- rep(TRUE, length(nf[[1]])) for (i in seq_len(n)) x <- x & nf[[i]] == ind[i] which(x) } # define the generic function isplit <- function(x, f, drop=FALSE, ...) { UseMethod('isplit') } # define the default method isplit.default <- function(x, f, drop=FALSE, ...) { if (!is.list(f)) f <- list(f) cf <- lapply(f, function(a) if (is.factor(a)) a else as.factor(a)) nf <- lapply(cf, as.integer) flevels <- lapply(f, function(a) if (is.factor(a)) levels(a) else sort(unique.default(a))) it <- icountn(unlist(lapply(cf, nlevels))) nextEl <- function() { repeat { i <- nextElem(it) j <- iwhich(nf, i) if (!drop || length(j) > 0) break } k <- seq_along(i) names(k) <- names(cf) key <- lapply(k, function(x) flevels[[x]][i[x]]) list(value=x[j], key=key) } structure(list(nextElem=nextEl), class=c('abstractiter', 'iter')) } # define the data frame method which uses the default method isplit.data.frame <- function(x, f, drop=FALSE, ...) { it <- isplit(seq_len(nrow(x)), f, drop=drop, ...) nextEl <- function() { i <- nextElem(it) list(value=x[i$value,, drop=FALSE], key=i$key) } structure(list(nextElem=nextEl), class=c('abstractiter', 'iter')) } iterators/R/iapply.R0000644000176200001440000000167014171060105014107 0ustar liggesusers# # Copyright (c) 2008-2010 Revolution Analytics # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # iapply <- function(X, MARGIN) { xit <- icountn(dim(X)[MARGIN]) nextEl <- function() { i <- nextElem(xit) j <- rep('', length(dim(X))) j[MARGIN] <- as.character(i) s <- paste('X[', paste(j, collapse=','), ']', sep='') x <- parse(text=s) eval(x) } it <- list(nextElem=nextEl) class(it) <- c('abstractiter', 'iter') it } iterators/R/iterators.R0000644000176200001440000001576514171060105014637 0ustar liggesusers# # Copyright (c) 2008-2010 Revolution Analytics # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # generic function for creating an iterator object iter <- function(obj, ...) { UseMethod('iter') } # calling iter on an iter object returns itself iter.iter <- function(obj, ...) { obj } # default method creates an iterator from a vector or list iter.default <- function(obj, checkFunc=function(...) TRUE, recycle=FALSE, ...) { state <- new.env() state$i <- 0L state$obj <- obj n <- length(obj) it <- list(state=state, length=n, checkFunc=checkFunc, recycle=recycle) class(it) <- c('containeriter', 'iter') it } # allow a matrix to be iterated over in different ways iter.matrix <- function(obj, by=c('column', 'cell', 'row'), chunksize=1L, checkFunc=function(...) TRUE, recycle=FALSE, ...) { by <- match.arg(by) if ((chunksize > 1L) && (by=='cell')) { warning("Chunksize greater than 1 not allowed when using by='cell'\n Setting chunksize=1") chunksize <- 1L } state <- new.env() state$i <- 0L state$obj <- obj n <- switch(by, column=ncol(obj), row=nrow(obj), length(obj)) it <- list(state=state, by=by, length=n, checkFunc=checkFunc, recycle=recycle, chunksize=chunksize) class(it) <- c('matrixiter', 'iter') it } # allow a data frame to be iterated over in different ways iter.data.frame <- function(obj, by=c('column', 'row'), checkFunc=function(...) TRUE, recycle=FALSE, ...) { by <- match.arg(by) state <- new.env() state$i <- 0L state$obj <- obj n <- switch(by, column=length(obj), nrow(obj)) it <- list(state=state, by=by, length=n, checkFunc=checkFunc, recycle=recycle) class(it) <- c('dataframeiter', 'iter') it } # allow a closure to be turned into an iterator object iter.function <- function(obj, checkFunc=function(...) TRUE, recycle=FALSE, ...) { state <- new.env() state$i <- 0L state$fun <- obj args <- !is.null(formals(obj)) it <- list(state=state, args=args, checkFunc=checkFunc, recycle=recycle) class(it) <- c('funiter', 'iter') it } getIterVal <- function(obj, plus, ...) { UseMethod('getIterVal') } getIterVal.containeriter <- function(obj, plus=0L, ...) { i <- obj$state$i + plus if (i > obj$length) stop('SubscriptOutOfBounds', call.=FALSE) obj$state$obj[[i]] } getIterVal.matrixiter <- function(obj, plus=0L, ...) { i <- obj$state$i + plus n <- obj$length if (i > n) stop('SubscriptOutOfBounds', call.=FALSE) j <- i + obj$chunksize - 1L switch(obj$by, column=obj$state$obj[, i:min(j, n), drop=FALSE], row=obj$state$obj[i:min(j, n), , drop=FALSE], obj$state$obj[[i]]) } getIterVal.dataframeiter <- function(obj, plus=0L, check=TRUE, ...) { i <- obj$state$i + plus n <- obj$length if (i > n) stop('StopIteration', call.=FALSE) switch(obj$by, column=obj$state$obj[, i], obj$state$obj[i, ]) } nextElem <- function(obj, ...) { UseMethod('nextElem') } nextElem.containeriter <- function(obj, ...) { repeat { tryCatch({ if (obj$checkFunc(getIterVal(obj,1L))) { obj$state$i <- obj$state$i + 1L return(getIterVal(obj)) } obj$state$i <- obj$state$i + 1L }, error=function(e) { if (any(nzchar(e$message))) { if (identical(e$message, "SubscriptOutOfBounds")) { if (obj$recycle) { obj$state$i <- 0L } else { stop('StopIteration', call.=FALSE) } } else { stop(e$message, call.=FALSE) } } else { stop('Abort', call.=e) } }) } } nextElem.matrixiter <- function(obj, ...) { repeat { tryCatch({ if (obj$checkFunc(getIterVal(obj,1L))) { obj$state$i <- obj$state$i + obj$chunksize return(getIterVal(obj,plus=(1L-obj$chunksize))) } obj$state$i <- obj$state$i + obj$chunksize }, error=function(e) { if (any(nzchar(e$message))) { if (identical(e$message, "SubscriptOutOfBounds") || identical(e$message, "attempt to select more than one element")) { if (obj$recycle) { obj$state$i <- 0L } else { stop('StopIteration', call.=FALSE) } } else { stop(e$message, call.=FALSE) } } else { stop('Abort', call.=e) } }) } } nextElem.dataframeiter <- function(obj, ...) { repeat { tryCatch({ if (obj$checkFunc(getIterVal(obj,1L))) { obj$state$i <- obj$state$i + 1L return(getIterVal(obj)) } obj$state$i <- obj$state$i + 1L }, error=function(e) { if (any(nzchar(e$message))) { if (identical(e$message, "StopIteration")) { if (obj$recycle) { obj$state$i <- 0L } else { stop('StopIteration', call.=FALSE) } } else { stop(e$message, call.=FALSE) } } else { stop('Abort', call.=e) } }) } } nextElem.funiter <- function(obj, ...) { repeat { tryCatch({ if (obj$args) { val <- obj$state$fun(obj$state$i+1L) } else { val <- obj$state$fun() } if (obj$checkFunc(val)) { if (obj$args) obj$state$i <- obj$state$i + 1L return(val) } if (obj$args) obj$state$i <- obj$state$i + 1L }, error=function(e) { if (any(nzchar(e$message))) { if (identical(e$message, "StopIteration")) { if (obj$recycle) { if (obj$args) obj$state$i <- 0L } else { stop('StopIteration', call.=FALSE) } } else { stop(e$message, call.=FALSE) } } else { stop('Abort', call.=e) } }) } } nextElem.abstractiter <- function(obj, ...) { obj$nextElem() } #print.containeriter <- function(x, ...) { # repr <- sprintf('<%s iterator, current value %d\n', # class(x$state$obj)[1], getIterVal(x)) # cat(repr) #} #print.matrixiter <- function(x, ...) { # repr <- sprintf('<%s iterator, current value %d\n', # class(x$state$obj)[1], getIterVal(x)) # cat(repr) #} #print.dataframeiter <- function(x, ...) { # repr <- sprintf('<%s iterator, current value %d\n', # class(x$state$obj)[1], getIterVal(x, check=FALSE)) # cat(repr) #} #print.funiter <- function(x, ...) { # cat('function iterator\n') #} #print.abstractiter <- function(x, ...) { # cat(x$toString()) #} iterators/R/extra.R0000644000176200001440000001724314171060105013737 0ustar liggesusers# # Copyright (c) 2008-2010 Revolution Analytics # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # This function makes iterator makers. The resulting iterator makers all take # an optional "count" argument which specifies the number of times the # resulting iterator should fire. The iterators are wrappers around functions # that return different values each time they are called. All this is done to # avoid cutting and pasting the same code repeatedly. makeIwrapper <- function(FUN) { function(..., count) { if (!missing(count) && (!is.numeric(count) || length(count) != 1)) stop('count must be a numeric value') # construct the call object to put into the nextElem function m <- as.call(c(as.name(FUN), list(...))) # construct the body of the nextElem function fbody <- if (missing(count)) { m } else { substitute({ if (count > 0) { count <<- count - 1L REPLACETHIS } else { stop('StopIteration', call.=FALSE) } }, list(REPLACETHIS=m)) } # create the nextElem function using fbody nextEl <- function() NULL body(nextEl) <- fbody # create and return the iterator object it <- list(nextElem=nextEl) class(it) <- c('abstractiter', 'iter') it } } # define some iterator makers using makeIwrapper irunif <- makeIwrapper('runif') irnorm <- makeIwrapper('rnorm') irbinom <- makeIwrapper('rbinom') irnbinom <- makeIwrapper('rnbinom') irpois <- makeIwrapper('rpois') isample <- makeIwrapper('sample') # a counting iterator icount <- function(count) { if (missing(count)) count <- NULL else if (!is.numeric(count) || length(count) != 1) stop('count must be a numeric value') i <- 0L nextEl <- function() { if (is.null(count) || i < count) (i <<- i + 1L) else stop('StopIteration', call.=FALSE) } it <- list(nextElem=nextEl) class(it) <- c('abstractiter', 'iter') it } # an iterator over pieces of a number idiv <- function(n, ..., chunks, chunkSize) { if (!is.numeric(n) || length(n) != 1) stop('n must be a numeric value') if (length(list(...)) > 0) stop('chunks and chunkSize must be specified as named arguments') if ((missing(chunkSize) && missing(chunks)) || (!missing(chunkSize) && !missing(chunks))) stop('either chunks or chunkSize must be specified, but not both') if (missing(chunks)) { if (!is.numeric(chunkSize) || length(chunkSize) != 1 || chunkSize < 1) stop('chunkSize must be a numeric value >= 1') chunks <- ceiling(n / chunkSize) } nextEl <- function() { if (chunks <= 0 || n <= 0) stop('StopIteration', call.=FALSE) m <- ceiling(n / chunks) n <<- n - m chunks <<- chunks - 1 m } it <- list(nextElem=nextEl) class(it) <- c('abstractiter', 'iter') it } # an iterator over text lines from a connection ireadLines <- function(con, n=1, ...) { if (!is.numeric(n) || length(n) != 1 || n < 1) stop('n must be a numeric value >= 1') if (is.character(con)) { con <- file(con, open='r') doClose <- TRUE } else { doClose <- FALSE } nextEl <- function() { if (is.null(con)) stop('StopIteration', call.=FALSE) r <- readLines(con, n=n, ...) if (length(r) == 0) { if (doClose) close(con) con <<- NULL stop('StopIteration', call.=FALSE) } r } it <- list(nextElem=nextEl) class(it) <- c('abstractiter', 'iter') it } # an iterator over rows of a data frame read from a file iread.table <- function(file, ..., verbose=FALSE) { args <- list(...) argnames <- names(args) # need to do this (at least for now) because the default values for # header and row.names depend on the first few lines of the file, # which could cause a different number of columns to be returned from # the first versus the subsequent calls to read.table if (!all(c('header', 'row.names') %in% argnames)) stop('both header and row.names must be specified in this implementation') nrows <- if ('nrows' %in% argnames) args$nrows else 1 row.names <- args$row.names # it doesn't seem to make sense to allow nrows < 1 for the "iterator" # version of read.table if (!is.numeric(nrows) || length(nrows) != 1 || nrows < 1) stop('nrows must be a numeric value >= 1') # open the file if necessary and remember to close it if (is.character(file)) { file <- file(file, open='r') doClose <- TRUE } else { doClose <- FALSE } # create the call object that we'll use to call read.table m <- as.call(c(as.name('read.table'), file='', list(...))) m$file <- file m$nrows <- nrows # needed since we use a different default than read.table env <- sys.frame(sys.nframe()) # compute these once rather than repeatedly rnlen <- length(row.names) gotrownames <- is.character(row.names) && rnlen > 1 # initialize a few state variables first.time <- TRUE irow <- 1 errmsg <- NULL nextEl <- function() { if (!is.null(errmsg)) stop(paste('iterator failed previously:', errmsg), call.=FALSE) if (is.null(file)) stop('StopIteration', call.=FALSE) if (gotrownames) { rem <- rnlen - irow + 1 # remaining strings in row.names nrows <<- min(nrows, rem) # possibly decrease nrows to match row.names # there is a problem if nrows is one: we would have to set row.names # to a character vector of length one, which is interpreted # incorrectly by read.table if (nrows > 1) m$row.names <<- row.names[seq(irow, length=nrows)] else m['row.names'] <<- list(NULL) # we'll fix the row names later m$nrows <<- nrows } # call read.table to actually read the file r <- tryCatch({ # handle the case where we've run out of row names if (nrows > 0) { if (verbose) print(m) eval(m, env) } else { NULL } }, error=function(e) { # this error is thrown at the end of input sometimes # but other times a data frame with no rows is returned # (for instance when col.names is specified) if (!identical(conditionMessage(e), 'no lines available in input')) { if (doClose) close(file) file <<- NULL errmsg <<- conditionMessage(e) stop(e) } NULL }) # set header to FALSE, skip to 0, and col.names to names(r) # after the first call to read.table if (first.time) { first.time <<- FALSE m$header <<- FALSE m$skip <<- 0 nms <- names(r) if (is.numeric(row.names)) { nms <- if (row.names == 1) c('', nms) else if (row.names >= length(nms)) c(nms, '') else c(nms[1:(row.names-1)], '', nms[row.names:length(nms)]) } m$col.names <<- nms } # check if we're done reading if (is.null(r) || nrow(r) == 0) { if (doClose) close(file) file <<- NULL stop('StopIteration', call.=FALSE) } if (gotrownames) { # fix the row names for this particular case if (nrows == 1) rownames(r) <- row.names[irow] # update the index into row.names irow <<- irow + nrows } r } it <- list(nextElem=nextEl) class(it) <- c('abstractiter', 'iter') it } iterators/NEWS.md0000644000176200001440000000042214171060632013362 0ustar liggesusers## 1.0.14 - Maintainer change (Folashade Daniel; fdaniel@microsoft.com). ## 1.0.13 - Maintainer change (Michelle Wallig; Michelle.Wallig@microsoft.com). ## 1.0.12 - Exported makeIwrapper function; request of Bill Venables. - Exported `isample` iterator maker function. iterators/MD50000644000176200001440000000502214177344700012604 0ustar liggesusers7d8485a6c3a0c667a4345542ae20c11f *DESCRIPTION 0b50ca623369d9081d3f8a7559ce2a72 *NAMESPACE 9220865a7bbced0e281bd90e13bae7df *NEWS.md c13851fc6f99c89fe043628da55f10f3 *R/aslist.R 00381725c56190d15ab198f64926f1b0 *R/extra.R ccdc22e9988d39851bdf3abdc0e2cbcf *R/iapply.R a61f4333fe27b6ddddcea9379a24c1a3 *R/isplit.R 0e1f2118fad28b3d2de245c137235f06 *R/iterators.R a67e576e2fabec6bf1dff7ca0cb8fdda *README.md 93c78f29d78ff797c0c2bdf97518a068 *build/vignette.rds 522f033d6595bc491193cc9a37fad0cf *inst/doc/iterators.R 6d57aef64c4ca142685e309653381f47 *inst/doc/iterators.Rnw cf8599bf31df232c41a86d3ed3caed9d *inst/doc/iterators.pdf 27383417d57f64f44327a215c224aee9 *inst/doc/writing.R 38dd715a6cbfe10470a61733fac1b66d *inst/doc/writing.Rnw bdc48ed2d52ddbeb614f568f2c8786ec *inst/doc/writing.pdf efc4aa1c29a21aee9b2259811d5d128b *inst/examples/ifilter.R cd088a2cccbadd9a4d5c9c97c9d6cea1 *inst/examples/iforever.R 771899b2dce53fef9c19fef2aa2be1b8 *inst/examples/ihasNext.R 7d36a109d61d1e4159d34e31410a02f6 *inst/examples/ilimit.R d6c12d3fc2188b2e225346088ecc2050 *inst/examples/ipermn.R 9d4437887a11be2186086a0f8e40b453 *inst/examples/irecycle.R c45c26d6d4a6e77f2ac01ba023bcc3db *inst/examples/irep.R 5a7f81cd5479d0d08f6a75fbecc47ece *inst/examples/iseq.R b29b453b78f72a4b3841b9506bd96797 *inst/examples/itimer.R c85115fbfc13732bead938f79e3c476f *inst/examples/ivector.R 0aabbdb9be56dd8a89df9f1b945c9538 *inst/examples/ivector2.R f046692a4e2b7c087e020f04698fcb87 *inst/unitTests/basicTest.R 0efb5c13190ea6dc26b293fd35b4523d *inst/unitTests/chunksizeTest.R ee81404b0f6f3201973ef3a745ba7a5e *inst/unitTests/iapplyTest.R 6f71e4bb43764d1897a5034e7ecb7639 *inst/unitTests/icountnTest.R cae9aeded839388cbc29684b1f993ef5 *inst/unitTests/isplitTest.R 0b32d8e74e2eef0cca3cf21d837f8958 *inst/unitTests/recycleTest.R c9cebb9af84ef3ea1197f222a1b51265 *inst/unitTests/runTestSuite.sh ae52a4bd3803d2c7412350616f97d067 *man/iapply.Rd 061ef555146a3d5148e7465887ccfd4c *man/icount.Rd baed914594734a2e58bc80ba226dbf35 *man/idiv.Rd eb9d0fc60440fb5ed2458130c4cba0d7 *man/iread.table.Rd b74b194a671a3748e3745167cb0d914f *man/ireadLines.Rd 09c714a81258b8c1aee0973d06f7542a *man/irnorm.Rd 3eb1a7a987fdb890546e3b0092b0ca57 *man/isplit.Rd 2afbca4442f48c670d2025c5cd506271 *man/iter.Rd 3e911bc606d4da3fd4d41e34bb92c0eb *man/iterators-package.Rd e7592de15d7f63f68f9ca8931bc9e643 *man/makeIwrapper.Rd 0134407cacb5a399e25941fe83fb2570 *man/nextElem.Rd f10854871ee134fb081e9d448e1d3cbc *tests/doRUnit.R 6d57aef64c4ca142685e309653381f47 *vignettes/iterators.Rnw 38dd715a6cbfe10470a61733fac1b66d *vignettes/writing.Rnw iterators/inst/0000755000176200001440000000000014171060663013247 5ustar liggesusersiterators/inst/examples/0000755000176200001440000000000014171060105015054 5ustar liggesusersiterators/inst/examples/iforever.R0000644000176200001440000000053714171060105017025 0ustar liggesuserslibrary(iterators) # return an iterator that returns the specified value forever iforever <- function(x) { nextEl <- function() x obj <- list(nextElem=nextEl) class(obj) <- c('iforever', 'abstractiter', 'iter') obj } # create an iterator that returns 42 forever it <- iforever(42) # call it three times for (i in 1:3) print(nextElem(it)) iterators/inst/examples/ivector2.R0000644000176200001440000000233514171060105016737 0ustar liggesuserslibrary(iterators) # return an iterator that returns subvectors of a vector. # can specify either "chunks" or "chunkSize" arguments # since that is what the "idiv" function supports. ivector <- function(x, ...) { # don't evaluate x if is specified using the ':' operator q <- substitute(x) if (identical(q[[1]], as.name(':'))) { rm(list='x') # being paranoid: don't want to evaluate promise lower <- as.integer(eval.parent(q[[2]])) upper <- as.integer(eval.parent(q[[3]])) inc <- if (upper >= lower) 1L else -1L len <- abs(upper - lower) + 1L it <- idiv(len, ...) nextEl <- function() { n <- nextElem(it) y <- seq(lower, by=inc, length=n) lower <<- lower + (inc * n) y } } else { i <- 1 it <- idiv(length(x), ...) nextEl <- function() { n <- nextElem(it) ix <- seq(i, length=n) i <<- i + n x[ix] } } obj <- list(nextElem=nextEl) class(obj) <- c('ivector', 'abstractiter', 'iter') obj } # create a vector iterator that returns three subvectors it <- ivector(1:25, chunks=3) print(as.list(it)) # create a vector iterator that returns subvectors # with a maximum length of 10 it <- ivector(25:1, chunkSize=10) print(as.list(it)) iterators/inst/examples/iseq.R0000644000176200001440000000125214171060105016140 0ustar liggesuserslibrary(iterators) # return an iterator that returns subvectors of a sequence # of a specified length. # can specify either "chunks" or "chunkSize" arguments # since that is what the "idiv" function supports. iseq <- function(n, ...) { i <- 1 it <- idiv(n, ...) nextEl <- function() { n <- nextElem(it) x <- seq(i, length=n) i <<- i + n x } obj <- list(nextElem=nextEl) class(obj) <- c('iseq', 'abstractiter', 'iter') obj } # create a sequence iterator that returns three subvectors it <- iseq(25, chunks=3) print(as.list(it)) # create a sequence iterator that returns subvectors # with a maximum length of 10 it <- iseq(25, chunkSize=10) print(as.list(it)) iterators/inst/examples/itimer.R0000644000176200001440000000107414171060105016472 0ustar liggesuserslibrary(iterators) # Returns an iterator that limits another iterator based on time itimer <- function(it, time) { it <- iter(it) start <- proc.time()[[3]] nextEl <- function() { current <- proc.time()[[3]] if (current - start >= time) stop('StopIteration') nextElem(it) } obj <- list(nextElem=nextEl) class(obj) <- c('itimer', 'abstractiter', 'iter') obj } # Create a iterator that counts for one second it <- itimer(icount(Inf), 1) tryCatch({ repeat { print(nextElem(it)) } }, error=function(e) { cat('timer expired\n') }) iterators/inst/examples/irep.R0000644000176200001440000000077014171060105016142 0ustar liggesuserslibrary(iterators) # return an iterator that returns the specified value # a limited number of times irep <- function(x, times) { nextEl <- function() { if (times > 0) times <<- times - 1 else stop('StopIteration') x } obj <- list(nextElem=nextEl) class(obj) <- c('irep', 'abstractiter', 'iter') obj } # create an iterator that returns a 7 exactly 6 times it <- irep(7, 6) # convert the iterator into a list, which gets all of its values print(unlist(as.list(it))) iterators/inst/examples/ilimit.R0000644000176200001440000000066014171060105016470 0ustar liggesuserslibrary(iterators) ilimit <- function(it, times) { it <- iter(it) nextEl <- function() { if (times > 0) times <<- times - 1 else stop('StopIteration') nextElem(it) } obj <- list(nextElem=nextEl) class(obj) <- c('ilimit', 'abstractiter', 'iter') obj } it <- ilimit(icount(Inf), 3) print(nextElem(it)) print(nextElem(it)) print(nextElem(it)) print(tryCatch(nextElem(it), error=function(e) e)) iterators/inst/examples/ihasNext.R0000644000176200001440000000320614171060105016763 0ustar liggesuserslibrary(iterators) # This example was originally written and contributed # by Hadley Wickham, with minor modifications by # Revolution Analytics # Define a hasNext generic function hasNext <- function(obj, ...) { UseMethod('hasNext') } # Define a hasNext method for the "ihasNext" class hasNext.ihasNext <- function(obj, ...) { obj$hasNext() } # This function takes an iterator and returns an iterator that supports # the "hasNext" method. This simplifies manually calling the "nextElem" # method of the iterator, since you don't have to worry about catching # the "StopIteration" exception. ihasNext <- function(it) { it <- iter(it) # If "it" already has a hasNext function, return it unchanged if (!is.null(it$hasNext)) return(it) cache <- NULL has_next <- NA nextEl <- function() { if (!hasNx()) stop('StopIteration', call.=FALSE) # Reset the "has_next" flag and return the value has_next <<- NA cache } hasNx <- function() { # Check if you already know the answer if (!is.na(has_next)) return(has_next) # Try to get the next element tryCatch({ cache <<- nextElem(it) has_next <<- TRUE }, error=function(e) { if (identical(conditionMessage(e), 'StopIteration')) { has_next <<- FALSE } else { stop(e) } }) has_next } obj <- list(nextElem=nextEl, hasNext=hasNx) class(obj) <- c('ihasNext', 'abstractiter', 'iter') obj } # Create a "counting" iterator that has a hasNext method it <- ihasNext(icount(3)) # Print the values of the iterator without the need for error handling while (hasNext(it)) print(nextElem(it)) iterators/inst/examples/ifilter.R0000644000176200001440000000113114171060105016631 0ustar liggesuserslibrary(iterators) # Returns a filtering iterator ifilter <- function(it, FUN, ...) { it <- iter(it) nextEl <- function() { repeat { x <- nextElem(it) if (FUN(x, ...)) break } x } obj <- list(nextElem=nextEl) class(obj) <- c('ifilter', 'abstractiter', 'iter') obj } # Simple example use it <- irnorm(1, count=10) is.positive <- function(x) x > 0 print(as.list(ifilter(it, is.positive))) # Example using a function with an additional argument it <- irnorm(1, count=10) greater.than <- function(x, y) x > y print(as.list(ifilter(it, greater.than, 1.0))) iterators/inst/examples/ivector.R0000644000176200001440000000125114171060105016651 0ustar liggesuserslibrary(iterators) # return an iterator that returns subvectors of a vector. # can specify either "chunks" or "chunkSize" arguments # since that is what the "idiv" function supports. ivector <- function(x, ...) { i <- 1 it <- idiv(length(x), ...) nextEl <- function() { n <- nextElem(it) ix <- seq(i, length=n) i <<- i + n x[ix] } obj <- list(nextElem=nextEl) class(obj) <- c('ivector', 'abstractiter', 'iter') obj } # create a vector iterator that returns three subvectors it <- ivector(1:25, chunks=3) print(as.list(it)) # create a vector iterator that returns subvectors # with a maximum length of 10 it <- ivector(1:25, chunkSize=10) print(as.list(it)) iterators/inst/examples/irecycle.R0000644000176200001440000000077714171060105017011 0ustar liggesuserslibrary(iterators) # This functions returns an iterator that recycles the values of # the specified iterator irecycle <- function(it) { values <- as.list(iter(it)) i <- length(values) if (i == 0) stop('iterator must have at least one value') nextEl <- function() { i <<- i + 1 if (i > length(values)) i <<- 1 values[[i]] } obj <- list(nextElem=nextEl) class(obj) <- c('irecycle', 'abstractiter', 'iter') obj } it <- irecycle(icount(3)) for (i in 1:9) print(nextElem(it)) iterators/inst/examples/ipermn.R0000644000176200001440000000670014171060105016474 0ustar liggesuserslibrary(iterators) permn <- function(x) { n <- length(x) if (n == 1 && is.numeric(x) && x >= 0) { n <- x x <- seq(length=n) } if (n == 0) list() else permn.internal(x, n) } permn.internal <- function(x, n) { if (n == 1) { list(unlist(x, recursive=FALSE)) } else { fun <- function(i) lapply(permn.internal(x[-i], n - 1), function(v) c(x[[i]], v)) unlist(lapply(seq(along=x), fun), recursive=FALSE) } } ipermn <- function(x) { n <- length(x) if (n == 1 && is.numeric(x) && x >= 0) { n <- x x <- seq(length=n) } ipermn.internal(x, n) } ipermn.internal <- function(x, n) { icar <- icount(n) if (n > 1) { icdr <- NULL hasVal <- FALSE nextVal <- NULL } nextEl <- if (n <= 1) { function() x[[nextElem(icar)]] } else { function() { repeat { if (!hasVal) { nextVal <<- nextElem(icar) icdr <<- ipermn.internal(x[-nextVal], n - 1) hasVal <<- TRUE } tryCatch({ return(c(x[[nextVal]], nextElem(icdr))) }, error=function(e) { if (identical(conditionMessage(e), 'StopIteration')) { hasVal <<- FALSE } else { stop(e) } }) } } } obj <- list(nextElem=nextEl) class(obj) <- c('ipermn', 'abstractiter', 'iter') obj } icombn <- function(x, m) { n <- length(x) if (n == 1 && is.numeric(x) && x >= 0) { n <- x x <- seq(length=n) } if (m > n) stop('m cannot be larger than the length of x') if (m < 0) stop('m cannot be negative') icombn.internal(x, n, m) } icombn.internal <- function(x, n, m) { icar <- icount(n - m + 1) if (n > 1) { icdr <- NULL hasVal <- FALSE nextVal <- NULL } nextEl <- if (m <= 1) { function() x[[nextElem(icar)]] } else { function() { repeat { if (!hasVal) { nextVal <<- nextElem(icar) nn <- n - nextVal icdr <<- icombn.internal(x[seq(nextVal+1, length=nn)], nn, m - 1) hasVal <<- TRUE } tryCatch({ return(c(x[[nextVal]], nextElem(icdr))) }, error=function(e) { if (identical(conditionMessage(e), 'StopIteration')) { hasVal <<- FALSE } else { stop(e) } }) } } } obj <- list(nextElem=nextEl) class(obj) <- c('icombn', 'abstractiter', 'iter') obj } tostr <- function(x) paste(x, collapse=', ') failures <- 0 # test ipermn using permn for (x in list(list(1,2,3), 1:3, 1, 'bar', 3, c(), letters[1:6])) { cat(sprintf('testing ipermn on: %s\n', tostr(x))) actual <- as.list(ipermn(x)) expect <- permn(x) status <- identical(actual, expect) if (!status) { cat('test failed\n') cat(' expected:\n') print(expect) cat(' actual:\n') print(actual) failures <- failures + 1 } } # test icombn using combn for (m in 1:8) { for (x in list(1:2, 'foo', 1, 7, 1:8, letters[1:6], rep('foo', 3))) { m <- min(m, length(x)) cat(sprintf('testing icombn on: %s\n', tostr(x))) actual <- as.list(icombn(x, m)) expect <- combn(x, m, simplify=FALSE) status <- identical(actual, expect) if (!status) { cat('test failed\n') cat(' expected:\n') print(expect) cat(' actual:\n') print(actual) failures <- failures + 1 } } } if (failures > 0) { cat(sprintf('%d test(s) failed\n', failures)) } else { cat('All tests passed\n') } iterators/inst/doc/0000755000176200001440000000000014171060663014014 5ustar liggesusersiterators/inst/doc/iterators.pdf0000644000176200001440000025253414171060661016534 0ustar liggesusers%PDF-1.5 % 1 0 obj << /S /GoTo /D (section.1) >> endobj 4 0 obj (\376\377\000I\000n\000t\000r\000o\000d\000u\000c\000t\000i\000o\000n) endobj 5 0 obj << /S /GoTo /D (section.2) >> endobj 8 0 obj (\376\377\000S\000o\000m\000e\000\040\000S\000p\000e\000c\000i\000a\000l\000\040\000I\000t\000e\000r\000a\000t\000o\000r\000s) endobj 9 0 obj << /S /GoTo /D [10 0 R /Fit] >> endobj 12 0 obj << /Length 1497 /Filter /FlateDecode >> stream xڵX[o6~ϯ$ fIelC3OEa>(|Y;ٯ߹Qn: {E֋B/~9'?]pj/. SJ" erqyx֥&k.3-WLWVi[vڸ|-|uڨRmjwpp6rjƩ.2bˊUCYClr듟Q-|j|/#E=*3~̼2^[(t}#+39ylaJX ՞} d"4{r ~] H.[N@ 5VD\3j| N95EexO9=EݱF;l&mQ\ba?n֞܈U>O3P[0|ywe/9 _a{1r`*Z y98Mk+(O+iEa^IjV ƛ˘{P*o|.DcNAce)L~ABq`s< :}:J^I=`{L,$̴ Th0,G &jn$b9uiz=m3bN@ c~ q8B,m$.UP]&**v[ |xMDH 'BS yv;INUt)%^gNX%TxҙSؐk^G9cB-21ё ͝"u+y{J|   :;w?)HW+41\̔CS<ި^ FnbbgW@}do\ezr- 6(WZxS{-˽f1T3XTax Tg~uEg6D> endobj 13 0 obj << /D [10 0 R /XYZ 53 735.4 null] >> endobj 14 0 obj << /D [10 0 R /XYZ 54 697.538 null] >> endobj 2 0 obj << /D [10 0 R /XYZ 54 525.694 null] >> endobj 11 0 obj << /Font << /F46 15 0 R /F51 16 0 R /F34 17 0 R /F55 18 0 R /F63 19 0 R /F67 20 0 R /F44 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 25 0 obj << /Length 1609 /Filter /FlateDecode >> stream xXI6WX!)@ d-&),=߇o([n&(zAE{+)2SfZs&_dTsUV[,^upTx><qt|Q+##m3Q֛xgW p94ULS|:O.Exu#tlV麰gfq}R-3l|.*_Ю|p onoh X^ GN;p&&tqf 7T60!9\ȁg.yw[F[a" % '"pxZHH=o{dz0AQ}0 C_q0&&[.^GIة'@ C f-G Jϙ$##DN64BdE .4`by @o= XUkG&IΉ^&1 Oni7]!%}RsoNyAS衙'HZ |l xGh@9H:(< kG3V4K@ \[F0ϟvF~Qg4aڣhᷪiI'tRaߣP#Rܬ|c]B|xX#Mm[MCŔ`Қ?Tc0SnKDW5q$>[M4I4ԩ%)IуN+b/'Q:  TLϪ1s ucnT 5r%#짰0d9D PWh;ZF~ziQ Wc|4P'U }%JSRO)h)V¯9vNOCg2> 9Wx.}=us endstream endobj 24 0 obj << /Type /Page /Contents 25 0 R /Resources 23 0 R /MediaBox [0 0 612 792] /Parent 22 0 R >> endobj 26 0 obj << /D [24 0 R /XYZ 71 735.4 null] >> endobj 23 0 obj << /Font << /F34 17 0 R /F51 16 0 R /F67 20 0 R >> /ProcSet [ /PDF /Text ] >> endobj 29 0 obj << /Length 2101 /Filter /FlateDecode >> stream xڵYKsWqXex?R9NŧMT^hHC+Ƽ0ZoR9p84C}d?]^}olH:B:tQS|lv]o.?}x"IFϗp̗S9RΟ7:nq}a./}2TlTӕn);'m~>^BPu>:)|rʗVI{EHI'|@g.RВq)|iu[X̀D2pA.!@ Ü&Y y˶o}-\DHbF\!i* dD{KR&z D oRb*:!QD b:tb! pZt05\42mV@Q 02_կUb$XXai)ܯ`ݱ eC{*8rGI ݈RD7VOd  S Q&PI7fBͰ!&n -I4:d-nP*>ha`Pbv_jhL tJc5[j8"c% Ϣxf}";f Nmb1 a;ςq~>]EB*p_xn%XF(MLYMtWv>Zd )v O!9.5m5Z57V_XGoCYBN^#>1c:9K<2jM t}KGu5rO"bm毚[\=OD,) s&\a5y-Tf;.xXjar7i*M#$Z Zu66z7^,䧚C?ܯ`VoRQt]P{1)9v*|~VjPm3XT²]Zjߔϴ0bh2x<COzfK ]YWha-+JxXB7_M6u<ݩ_L O'򿣓U;fϾ4[qR?6!l@rq-0?a%` wNx\ endstream endobj 28 0 obj << /Type /Page /Contents 29 0 R /Resources 27 0 R /MediaBox [0 0 612 792] /Parent 22 0 R >> endobj 30 0 obj << /D [28 0 R /XYZ 53 735.4 null] >> endobj 6 0 obj << /D [28 0 R /XYZ 54 479.298 null] >> endobj 27 0 obj << /Font << /F34 17 0 R /F51 16 0 R /F55 18 0 R /F67 20 0 R >> /ProcSet [ /PDF /Text ] >> endobj 33 0 obj << /Length 658 /Filter /FlateDecode >> stream xڽn1_氮_BZ@S!JP$" >Y[q 8x;﷕%5o͝uBk1A&F1}qͤ&ZLʣv$~ఠq< Ie - -u.6hs;m5y:I^,l)y񝹶|hT^I@|]=tm$(< W#@X3sPwx'P D?[I#]3 > endobj 34 0 obj << /D [32 0 R /XYZ 71 735.4 null] >> endobj 31 0 obj << /Font << /F34 17 0 R /F51 16 0 R /F67 20 0 R >> /ProcSet [ /PDF /Text ] >> endobj 35 0 obj << /Length 123 /Filter /FlateDecode >> stream x3532Q0P0P06R01P03RH1*24(äs< =\ %E\N @QhX.OfAcՓ+ ^) endstream endobj 21 0 obj << /Type /Font /Subtype /Type3 /Name /F44 /FontMatrix [0.01004 0 0 0.01004 0 0] /FontBBox [ 28 32 40 62 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 39 /LastChar 39 /Widths 36 0 R /Encoding 37 0 R /CharProcs 38 0 R >> endobj 36 0 obj [51.24 ] endobj 37 0 obj << /Type /Encoding /Differences [39/a39] >> endobj 38 0 obj << /a39 35 0 R >> endobj 39 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 40 0 obj [500 450 450 500 450 300 450 500 300 300 450 250 800 550 500 500 450 412.5 400 325] endobj 41 0 obj [500 500 500 500 500 500 500 500 500 277.8 277.8 305.6 777.8 472.2 472.2 777.8 755.6 711.1 722.2 766.7 655.6 627.8 786.1 783.3 397.2 516.7 783.3 600 950 783.3 750 683.3 750 759.7 555.6 694.4 769.4 755.6 1033.3 755.6 755.6 611.1 280 544.4 280 500 277.8 277.8 486.1 555.6 444.4 555.6 466.7 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 427.8 394.4 390.3 555.6] endobj 42 0 obj [544 544 816 816 272 299.2 489.6 489.6 489.6 489.6 489.6 734 435.2 489.6 707.2 761.6 489.6 883.8 992.6 761.6 272 272 489.6 816 489.6 816 761.6 272 380.8 380.8 489.6 761.6 272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8 435.2] endobj 43 0 obj [514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6] endobj 44 0 obj [628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4] endobj 45 0 obj << /Length1 1615 /Length2 8632 /Length3 0 /Length 9679 /Filter /FlateDecode >> stream xڍT6Lw#-2tI ݍҝ "  ) H ݝz={[}V]Cn~p9E*2@n77/'77#6 [Ũ vra":]dr.v*p@ "@Ann7 N"9s7%@ eNk49X@i{d؀2̡-8v,b6.."\\Μp'k ֧w @ vr[~5 P5'#@\ nn< ;^_el@N?la5 Ԟtpy 0Y24:!PsߕIk=gř"ׯ0SY0g_A{ruv0;o`YZjՁKqt+m Wf vsss `Gd+/  l8}T7 l aA ?\`= 矓,0KṢ4_{8x< CzQ7]J0+8@j& Xւ,ܘo?# f!PϿ H*5C-Wb0k?C8?x-!. \׎A!0:QpGX U0ׂ ̝=h Ma' xh`wu._Hi\"aV.?  @!_U.!`vp9\N@?a\.?5Të`$h[xQ&Mα/>¸5 =sәtBW+̲<˩ͭv}zȗ8k1C Xҕ?1shKy:z!#6)3~ptS&pQtoتg79"u" F,ӡpPcxe(ǰcDy.D]|5[L@aHN|J;%L6U1/>!s*{tɝ8S߼h"fht:AuA&fJ BR—!Z_[44s_>:Ʃa"H5~"7#au5Ky-t;,ڋ2"I&gkF^˃PTv_o&?z[~uo;8 %:L=/35*bY['&Ƈ`u—Eu{@ҲH<(эᒽNgI:7'zn-MIT'>\ב+zpnPrΌ貽vwM(U\"9X)Մ"K16:( +a[} ~~>tsIEBH,z.ne€Uç *c ܸ7u,8S>"`q.^AadﵚnuXqq$b<7 T"8]v+0u<7/1(D}h*O2ScQNkNs0G t_\x7ؐF/'dpt`C;ȘTEˑ+^[鍖))fJdY3BIr6bC߷b,;TϺJ$ b4tw p@&[Cҷ|=PMxLj*킾{|=Vq\?}z)%(WC^>Z+1up.)iXٸ-T@Fdܱ ǝꥭj|wy￧ ;'nr#J_,]mb'5)|Bu͙fCaid2k|/ywv-q- 8ذ=JVȓ3uH.TCX Ծ]zCA sC6/SώinC(߶H2YU͔ }o5DȘ|jxY+-j ZI) x}u>NC-y*uKG$v7d}J7Q׉$)dv8G=JNB{{` \R;F!3, ][I=L%>sni2۬yk^jV}Xj؉ 9a:P:Gi.\PJyFJ!W法EK)С5$ex-Bct,1E^X @3CoCxPœ] CdV+/y8􂷎Vjnd&GxF>c<Ť"d3БMK}# OO؜7 lR1U  vT^/ߜby[3[L'>SI~%B?)tf5+#U_tIM>}>r5W4!cjͱBp URg6Z*b_hRСՌ;g|)Zp6`Uf跔JV/#όt4̣$%4p5ˡCMu9|[6(1cG9%5cys! ԟ,K-8'bE0Mf'ik340DS+Ux  >t.Ӄ#'l&.ݓ g7s Mя-zZ6b:V,!d2clI7䲪|{ߛcm[Sݬ[kQ2\sFr ǭd7d4\VpGY_56ߑP3h띓^%w9v .aM6C7VѯTx?wq9%eەL/ y Wp3U奠she9y(&,m]ZOGJeoR ҙ{JV}%a=o{hx1lun]ߺZޑ4B|B)F7 2=qȉ⤦b*JuqO=J Vjr[Z.9nH:#F0=ǯQPUt+`$nUX{|ؽ~)F?]worV3ZIa.Mf=6䒹g DMǞn 7n73ؐ]p1g:ثEG&)ȼ7Z3cl2Úwdr'mm-ggs.DMBo04_#?hA.sJyT<"ҽ}qի mdF..? ;cv%Wpni mri5Vi2Džo>17h]{St9&v8uj7VvS:e|) q6dUJ7(25%kwgRS9p9Mqh e(ⰁܦQSfJ\]·p(nDf#YP}e 28h?a)5v!»1sdot.:3D4Y;{{@R43>$H{Cop=Tzc,hO>P\4qoH_/w]r1v>]_+ L=e^i₂LV#,|0siMs_}uFwnزsF}&;yW~6_rE UE$KG:QlɐNc۝JiG^9S:Ѩ;$fdigX-)4K1=>Gu髐|[.`a%1d J"xM%nw#Q/nq2R!9# .ץםDuŰx+#^:IoŚ~̰x?J6Bռ4;-KЗnk{I#G Me%gÙjݣFi1e֬`rĎl;R o)V~8 -&S!a"m@+kU_[ʵ4cvkF)an3~dn{^$uoW7k"3@oy}pQܠ(YzTt b!%S{~:|fT|9:uNh.-Vjh4O 5-u^ ydm _f c-Lq ̴) ƮW Zχ>rhs y#v~iCrN.2I}*2ӁŒ芦 A2"j"I?".-Eq* z\eFH78wl"Fr!)l=3#sWfʭ1XΉ mMDޞxwUI`G_BUaRpuzs)ƄbxFke \V?E'5/IĹ1%*Fe|1g[YE3am50,$*/<e=dw* R ef+DaO^nxs_`ER ~G" ]g:%#Bb:U+pl佾("չ%cCY@ԬFsRg`<ѿcؤXr}-ŅSL>+Pg>,Vq)nٙvuqԑOa\YF$ PÎ""~LϺÞm߮.r g[m ^1uzL-Aʵ5S qrx)Q"˦t}3ދwmHpdxxG2ZNgnIIt|-' _pЯJj}&=ڲÊH1C0Ƕ>fV\꼟+ښxB!?Gbf"d.е ˎcf88Y XS.yo.}P8_m|OBT"L+˱$%`@K A*D|.sLfmEOexBgAZܭ* h-GquU:BK jƝjjݶ ywrK}'Nin S"/<3+Zqĺ]f.z'\wRğke)c&%yXMġNn蓺߼ϴJ!om2|E$4î"Ҙ:( sU<0-JB堢[rd4Kl`K֍&' cbhպ,൘|f $k ɖRfenG z(V#F ]z߬eQSw'kB^LеU_Ƈb$&@~-VGRL0-.jO /lb+X8%糭D7)[[sED]հMֵx owx&VH1jvgQ,KBkIPc0)Xܞ}ړR[B7+DywY 5doKvϔN?~XRϥmu `Id\ɝrAGbuq{Vu*t~<:۴Fw')$>5R8Ozk(Wї85byȗC]dYMG<_TŌj+}_tlpX`aNsM P4/y6x#j܏ty ȴ1!0Lz"ڭ:Cttl㪦D̍Vj>3v[ǥsw-x/t7@[4Ģ*Op_jjD/Iu{Bu'^ݏK@}#r \wUN&*b|SjB4eݯ4(!~+;:w󢤙(NLqČx^"i餠ġy[( c-PUĉf^LŹ/ zOcbyԯm1Y#Gbx%Z G؏1{+aÍ'!vy]a?qo?=snz*agܜ˒;ލ\ ̄8'm06m$y)RȈK~+:)mNJؕ:,q*ځt z2Zuo[rڵeCR"F>xQBH[OVe;L_ZƸϧU1?f^43< i*)}]3 aC}g՟-C?Kޒ6W]uZÞ!dŽd+D@s[HUUe"V>2ڋ›T kCDY9-U|.쫾bۉ/CMgj*jEYns|K;-&K_E.pjs7aѿ 6ZH袮2gLi)_YnfnIn}T#U88*@rb=wJ5"Tʶg&/3Bk_pyr%l|kݎeGT}hJ}5 %Rd lNic6!ebar$g[a3Rx^hK{1gRTS5{%irwuc<}ì o(.c}dپ+~x6L/a@حV(`"!ы:w̑yts1fn4Jθ/a\-C׮Eׯ1h\Z/>h[P-.Z8Ɍ/V*' {n*Ƚ<8 ō,5DӨu++]Hy>:3(2a6[@35o$Cvbf, Sh9nl٪Rt_΄dY*uעM^QuML¬v8sI{M|B:ir}4O endstream endobj 46 0 obj << /Type /FontDescriptor /FontName /GKHNTA+CMB10 /Flags 4 /FontBBox [-62 -250 1011 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 108 /XHeight 444 /CharSet (/I/S/a/c/d/e/i/l/m/n/o/one/p/r/s/t/two/u) /FontFile 45 0 R >> endobj 47 0 obj << /Length1 2073 /Length2 14797 /Length3 0 /Length 16052 /Filter /FlateDecode >> stream xڍP\۶ #Ch5i%C [\<{ c&'VT65J؂xr,&&V&&8rrU 'kp@G [Ͽ DN21Cw;9[@ `aab01q@ Em,̝#ʘI;@`al:m3ZTl-N+#+#5 t:MaGP5pGbkj - wg "- P1ǀ?lhllkcgrL- Y'7':!/CCkGwCC kCw+7H+ #_ eq W}b@3sV [W/&vj {gLEpdf@';'7h3^/;oO;[;; )prpz{[33 `4. >{>}}/[ϗQKCARFՉغN/gkgg&6W+d 3Q hhdlϰ#Wkɬ-@@E[G*zf&{,c7D/N)25kX9pLd~_E3 `d:yLm:Qv_'Q ( 6׻`TTw??=]0~/~A\F?]glk%WMw_Oÿ 3|h/`|e/^;3?jп{նX۾2RjG}lEb|/_ wC]F~G^Oetr;Uw.J_j<_a~?z__F@ne֘7Ȳ>Vߕ;F*5CLuMfÝpX?8խ*ыY[#Lh{Rog8噃i3!BXzUC{/u+6\{g.$|AI򵉐Qj:%yFY 8$Ni.ܐorވdhDyjmD?.xlT8jBޢMPx'`/ym9L,`uM$2[Sy+?8\QOP0BbHj)!f˺Xrl3rSxSl`W>{i8¬פ U6Lj  4P -gc(7SAFNDV=ˋfnx)NK. s W(N۾[˒I/,^iRsIpx./֘S뇽|,uO*1#<Ž&LK|6 ,?'rB0؇} G %"}~^S T@ -b~zCJɜ'/R 9بt:U1!Kk uXK/9s?R>fiRǍŽQ{3ځXFۖkN!o ysl+(b(X8< L͑ñ吏Q`,>]ULtT^#]~TO/v2Ʒ(З|¹/J158OZHn4Hͱ, ou@) 1CBTp9ޚH{:e+r1(8oVb|.\\?RnsˍpbD-VWp>u[hlۧfZ Ӄ\2A )փW UdpT**s5b@N``sO&;A8:{jE ,tG%F:Z y-]Er}:Sg{)zle2vFY=zҌD2$ Ar:OmQr+3,f k  8OͮS ԂmErՍ08v2nex+{iW$ z W2>OVo#Z$p̚s@iòl5M~"vQIߵT"ViEh_"DC4;ĺpL ',Or]TȏlOIᴔǃMeI{i0.!GxKdz|ۄx-mppH0RĤꀩM*bL(haKQ^`ﮚ^%#<)W3NC)m:Wc"OzP(;h;@lBܥ Ds ߳}R=$fn<oDV~9Rm۔s.Sh.ݙBo ɀ z W8Y%u3WP~@AB,ԢUJ[㱴.W3l>&AL]aE,QIʱd"yW7@iOr[PxT^ (|a'EzPa\IӇx]Ҧak39`iJq 8,{,bKw>5<hF! U\4Bo vy#NƢ Lу~\_(OØejAv;:5V?ɫm2Y3T1$5D7K]iq (5T尃P-D_iRܶA]BD}!sdҷk?ZA+_0H]v&^vzs&E&{t BWq]km T'L?Ԫ{>_FQ, WŮO3ˊVL׃7]^\ac3aN0kˠ}Ԓ#1,H1=f.%taΖYoHW_pxt^[s1 Mx()ߣ)o'kk)^(rzp9#24HAzo%8D`1 ZH'g= ه*9-SS,` ăf PW UJt-}~D[=rX:>dOnr=zp]7Ud&bZ(- ^ GܮF*C"0;飍M,f(kF0DmWkqxH$[ K&`Pg>Qz,y~nl3vznTPno⾟jVQsnƃS{*ҋzcq 6Ht%0zzVUYFm-`X FΆ?ƏCuDdRh`z/UC!#m41i#0',q53"/BՔܬ \dIx "(FC?$ X^$fp!PXf@ѡ7}EuM5ijȲ+dԎ"NSPv`? HNy=X*~8OR^vlG`ic ΚC~te{bȼ-:0 /Ns)H:!Iɴ=67yF6Xe׋%:Ab7j1s+izOc>"G)dMY@}KNI7DVĹ5ut )C|>߭q,6lSd!YH^(5 #޴fp1eb!s* -bfOo-?BG٭|x^\H*x-/k?(`"n{qBρ]{|Y@)S~IR&r>3,%Ď3dNy4i^jR[F\WD㞺^)VAG?&̄Q_J2 k5́rLu2sz~1E~~ip.nr1i#9t&@$ggh0en rnlkVN Pk(g \ʶs z /ZkBKkb_ݍj5F3F~$|'#9`A8 piaByMӍM8E">o9͌sPPӼr58̔汭!r_y  xx;\x .XZjd4ҹ;w޸?hSBD?mo.МncUXKcIX::& $a$?#tX|a#/0xJd@Y09)$ ~Ri񷫸MQ̒9Rn_;OT'g+cT"+Dsy ݀кsu * ۪$aL+  @c\e~Sd3KJP#E"h9b<ex::Fz~~ noMB5e֝'aZ@3]0 XxssZb{GD8^Dhg2S}yœ ep_*܄ʊY352)<1r2ޫVY]΁ք 2µ^ ѩ7r7,1|`@y̬HA6 +!8 4#HV`nYio}ܕR\,cS߯|2nUҡiG("tgt{47V0 ~1śtZl:Ţ`Ex.k Q(|/;؝h‡g#ۢ􊿗]Uj9RhPS 8 vI,z |J)kø܍TqE+4*;E~7{T`~qq$4.GgoSKW8]CKWi+؈Qgد ]Ҁ&ȮT]~?r[Zo$U#9R=I+\+MqUImr|bsX>&3$ݘ*U[*O{h'!A`sɿj a=#Sp{`@5JE\MY.)htYQ<;|S-)aw7%Fdf1`SlCӒ;sŒEb!Q7g[Q![3>j&McoFYE^ +ڂBItSR_3rZdX憟%G-~[QU @lIƙ ~{ @gXVxL!dbw\Ż4қs_óG.d%/2J[lOđ >ʡJr _ʻpy|iILu*ې!}ݿ 1w demJwTeqkT(έ^I9a>W"eZ4< [M[ز,oo&X.eSP>~0Jǩ` Cd7ƼFp9ZL*hOSfJj:B{+AζUÉ *]M-JVĞ zE"QVo1J)/zs[&S /}΢\ej+2^"3QԎjށ *&e_wPzqNj8eO)3Yl\B(h>cv:O4-rsO1FY+jYom!o3xJwM9e毉HM)>)~PEHJ4xBRMb~a(dɥ[It`Nn: 3å.#$~L#6EVzc=.rFo--@bڏkv]ڑѬ` @vgh,K9(:17YKV<\>1E__Aɹz?ÈC^AhdE4_.+6Gb~wzc??>%ٙÌ fiԸW]I_A~‚$>XY|O-8Uu͠Sɴi}4Ōd!1i*rW3Yڼ*tE~Έʼn9puGe=Hr-X~ԡ_8`L#hفVT~D55Zrzm)2as߉c 1jkvC~L|׼F5t!g|2/G$ 'ъq#8?ޭǼ5 ݕ#ZM*oNZbU*- տZ`oЕg ԏOe~M=; N}4%u྘ -k b3Wn0]y!Kok^aZ|XI\ iUx/ULI1):E%XbCqE5Soy3zJ !ᐛRuIa5HAMNtx63_.|U j[1ku\ݨw]"[ҵ^T'3y>* 9c~F3dT>njh|(K,%I=䈱#orj*2C܎DM}H%a 3cDcOݹu"#M!;:riCZߺD׳O| O5J9 ^oG1Fvh$I<އkG5sy:y`(z"$8sBg^4} C,6WؐnG?,14B$&d_u՜̤0U۱gyRѝj)YWgjW>IubY+foߞjຼ0&X#{%Ε8@`@wPa˟AݚJ60!!m̙xS[4~yMV$[Hśހ|t# &°'"GD v` 6rL͓Cłf\ klLWT?0^-G S3m8Bdoay3~;qozn+n._Д#KY.csBᤨ%ۍoobK["HZdceQ~ӃYrsY*7^,#etji&vЏuh>{Xf#˷x|T]fxw14~Gj=s/кв30/V 2jgL,72鐩XW"xmJ1.E?!ɻ8PU {=Ёk‚!"KpRрZaU( EH(fB4?t~)_ѷ),磬'oί?Y< 襻~ OkZ^Lĭjekmm#»LNn3QZSzx\q']+$:v¶M)_[(uϭWdהu;+t65!#tmwI iocMh˭b0+cD Yav M}6)Olw_\`ψ:ߎR!v@/Zng&U0u-7mPW(퓎M'ΫP Gw)(#ݺK)URu{1wUCW-8y::Gx:nusޙ -B$3x'dLTGMxHXKBqIcs!ſ목17ӲSll\@I&DEB9=2g `~Au+ 4U' !dj&ןQi~é c}mʝ5WV89?f.rڹz2aq8,(E"+%rpXmM0qr~)7Pry15^ȅ:6@ky_OpQI>_/fPؚ \}?"𪇉\r1 $l H" T"Mý/N봑pQr}W&[ " dC{xP(кTh٢},mxw%^ /Ç|'-?O ۔g:@$Wߖia ot|#5wt3l,a3 &T~?$qMBVh_Jp/]xePH`g^{`i|z:pۑV\yxђtnuTa1fyO.櫛N)?zGa]φ(؞>F=>t 9Br>.zSK $2JziM2Y K xάK wa_áyf~pDyA'J>wtkѥΈkc}1j1䆗y81swd>mFCng|\?}~M"Q\Kzx ͖Yr=EǨ=;0PعcC薈 PxpH&SOiy*?Ra4e҈%4H%(G#YMmSLeZIbV!-YU NKl/6 ?_ 9/Ko5~t'Pde!zk)Exᚩ6+Mjx8 W=Z=Άzg_S>-2:ŵ]64Bg_ }+2(s 7a hb .ndS^t6sj. tzum2LQۮ/#p.hBY+÷l|T݌lJP6k vyt#1 7$Ĉ * c|#{֔PORyRLXd,r#UWr ]'~ZSgQqEy-{b~ !:Y6[n}tyFkMP5IW!ӒŞIEC%Ou)i$݅ԪHL8b{9GU-:J˾磛LIqqYip͞h!- >O6V3b==AFz)~rv! bկAvfqO*8a3~G~vq/xC yio F1Y+:5jMυĐ">[̌M=/wݭbB5% qD5Vgc_,9 ),%džQbfǁ["O lǁ*[GF ٹvf O*(Sy6µ$g_HKNǽ;L}/^ Xi4U9mP=J@5~|b,AEcbιqlY4ߣZpG* 6 <[/?,pmDSM՝;6qoGP3@ ݁0oX9);xu& Ŭ ȫBFa%M`Te$gS@^cɡ'w HˎbD/b8P+2o4jT QqkZ7aGuGv+&H5|’ǜ5NC'w=tX\ܜ5.-^P1=Y4p䉍yI_pO.NEqz49j1& 4x-b/PP%)\6GЬT jo\GUE&וܩ],{mb~7A'v?d*>?t3'v)0I*7u=to{gaض{-K ln&H#ᴄ++!k𴙧wS]w;|TvBE9b00Np:I>ÒR66g&%E_:QobmT/Hɰ=^}LN"g?WQc84Nydv6>{W7!^(wMn՜`UA^t_cJ{*)\ p^@o_O }`_f* '5ʢK;Z_ķS¨`Oc"\U\+:R2Ki|lZm >qMNU!6=rǚȘz# BiTѸ#\ b`GT?#E[7!, vL}\'=t]2 (+ި_XZJ6J2|v@4#^}<) g~]SaU/;ȕHB3om+_0)Hk@ I9ɳXh}[,AHozy(K< = #u9/_tGl4:` =4vjh18K,aC@Pntٛޤ{,؄yHL0\(u+f[.B,׭aE*(K"H_zٚv){:VbUU$(iUoshb'Vf*d1revcӇۅ7M} =JRdOr[@cnQh 2EWJ5DRJ%2 \j `no,v-M{ 9j"~ |jYІzRofl[[pLLw}ZJB)7b C"a *z]r,b`u@ [MbIW@p5kJ"Ywּ̹ȝ؟TIG3hNNݬƩ :̕5| O2XcL2D>XAVlxF}Kp.qCxzZ#=䜟%r$i{vS~\n% =7\Y/lx#J)r >y|5'D1~ǘ1@[șCo}KIMuP83[osL,emU*NC;.t36_Η H_Mj#3,9B"]+MqR<bΰlpe*VGH$%v[V .<^#;bj0\cy ZL7jN 4}jM|VV endstream endobj 48 0 obj << /Type /FontDescriptor /FontName /ZWOGJP+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/A/C/F/I/J/P/R/S/T/U/W/Y/a/b/c/colon/comma/d/e/f/fi/four/g/h/i/j/k/l/m/n/o/one/p/period/q/r/s/six/t/three/two/u/v/w/x/y/z/zero) /FontFile 47 0 R >> endobj 49 0 obj << /Length1 1523 /Length2 8171 /Length3 0 /Length 9184 /Filter /FlateDecode >> stream xڍT[-C 8XpN@#ݸ !=y$ܙ[Vvթ:gZEEfAYY E5v rk@mN?`S'Oȹ9oy@/"̑ i 1(`P:bi̿ F;p2MvO+Lm0_)XMXaŒ7@ vt~7 P2+:=@ ]ff<l! 0)jv<-PU(ۃ"0;+;'ٛB= PK PV`uvwfBMm`O񦮦[S'ŸMbӧn wvbunw]KPg'IBm`dm075݄=&dBf vp@>nvYNadm~fxj?{9Ύ.`t7BggC@3%O'3/tw>I{Ͽ ezCslz2>qq; qqx>EwBe0_>ҿ v FR= `G@n YB;M[7mjY'+žTm_36WiĠF4lqY%욿 o ;?<NO? /)O:IH/Q40 s~ <9>Q^ M/`q4xl >߈Il6Oi>|JldW Gģ̌Ms̀`, $l]rS)FƲ=*4ErsF.M)KEG/aM jㄽcb5=Y4Dwl8b߸u˸~VFt%F3 h>,sř ;^/*>18bog/G`zTUj-;8uh퇧tD-ZԎv{P*9,iw}3r$7QF1|}LU>_2O'+o..ʔ{żo*4A 7w wj|p?;ԣk_g[.$ d#Z&e,Y Ba*eyx6Y{>+hgY%x]J=.5'2^t+}ôY+VGb9J'S՟YFrcK٪r4p)YbHU{&M;rl*x,){ޤFK/.=er-Ew?KV]ݾurKzKħ88IP*}Yѳ.hQjc>!XC Lk-B.b+į$بϋ7ٔ~쓱|)r@QLw8M^fEA.8ouk#?ۯ5p0ބP@A3Tm2$!MhV1֘/@*Qd 'fouF%Ȉ^ca'h~_VѵL}==jyq[ʃI*lǚY}*r)E%qM{W:}1;,yl5_/)&CKzg[kY?-m`xJg .8%m#Z{v=#->>m dFjFbLI iŸ?-5'$,xYk0e^+}2Ӆ!I{ū#GBHiQp7W./5%#WRfFz~tN۵eU:RXc yӪ,BF#W{P+ dtm% ?lgPi峷QlɶWe?GZ 4kֺDBE Š$ k~tS7wY%'"O|1 ؅Vܷk$h#$͒r+ zf5~2D/Czt{7p{1=Pߴ"򏃩nPlYN% \:B_˼Ch64]7ҳ9 |7V_ ^!3%iéop\۳KX&l8 %1ICJ6͏.|K9~ee\/WY._tF`&E+Z3Mل=x_Yʒ0GAa{\]mS46C#߅ I121$/[ 2ͪ/Ýd#|g=fq@}MN ZaVG˾MkvD3*&J bHp_c=>u cSLnAhXÒ4f@[u:l7:$Ҳt6i:KRs٤!nƺIT J{YDINrͨ!q<HW '?^FuC9[TgjOGO$.(tE뷕Yɧ%s1(tS'G%g}!f&[k7MVe;x~Jqܘ2︬]e A oK ު}yҧr>|uu?wY\GݥRv zPdq#5fK16Ky?:W,# pjU0g^g? ȯYHU]jB_eǹKhrl_F&$G~OuUMLc3e`lI2T(pxXCy~e;x(3Ho )NE)dto8_$*$yiƴY.>)H|K|V%|)xYOww4*#R1F{TUoN\MׇA7Lq](@#u'^zv;ipK_|#S%$Į4Tobxnw"L[jϐ4#-ЯSfk'؇ygDhbzʼn ]Jd6ke:hMW"kC m$,Fe'YPEDjؖdHu:#2ԩN~C7]Qva1vx mFGʻgHSN}@rbeQE(9KMܑg1bQC!ۧ;͍ud|53۶^x1"ޛb\@`esIZF';t͗H&5?sLqf+${MԹݥ>%ϲ dV8/^zTx0FןqżixZC,d^4AP!M-?Rl5kE I8MMb?774-}J6IO\(?B\o;WESI;hlѡ6xO؃6~b.<ظ(Gk6g8WK+L.(4G%_Hbӌ.:1LV! WM J wqtR{'QL^]GWA~}ܧE[!\J@6{HmQ?`M&ѳ㛜7 PB㮤5BjuvD-k8#*|ҡqN;G. !Y e%[gxq~b%8QdhQOY`P&O͸"~NZ;{ۮlnBtJ8!2<'?:/8+u3JENf'ߐ&Qua;|47[VGN/B.7K<ԡuMI"Sogj'*.r#S'YK _K"#1_gByU+x=T;GN췐1z]i!WD3oQ#'&fPڟ?S9zDTw >KҮLOB VkX_ n;8a!>8fyM(rm?Gc>3>I*fXdAVIn}D 㷟.R./C+m& *pcPv6ɦL8^+mãX mo{jJBs0v>㮴^w姷/%#1>T)QmHAX }&HZz|* *uPIEbv+NKєmP` t$oZd{iuDza}N~E6@@v7SёM8RLoɤ LXkvJke>jZE+!HFZDhY Ț;.H\ l#dH >ie5 T0fx̖/> pTNJUGk_2Rq M6$tskCjCeȶZ;bĬW3CD$IS4pChW dx]A2Җ<[6u "p$.80/$kIXo?'퉺Āt vOwNcWs->s,z(=83$h/-1Pa.l/h5=0禼 X Ȍ|3LI|fʃaCP,\5Mo |ϵv׏g>dsmL\AޫjǸ)Kg&m^hRVw' DIJL_e_UI{2"_q*_B==)[`gjV_`ѐh 8cP0Ate90(Y%Yꢇh0U8t%eԅ;1lz}3y YL0_kZ֝3n摄uvX4^LP?3Y\]+yxÒ=?3wx/bNj녥lF8&9Τ*lEHkcM"Ȼ fB:%CdG~۞EwWH/@zuz]?I ho; OKbVhJ&|@+kWRAؐ`kఠTZBՌUAR,藬^G.:, :5[4ўɚq/jy^`VH!u耻l|E)a;"XN?CG  8ҭ[ܩMC1U񬘩l)t"IUe ?Bqk,݅Rk DCvKop-Su[1_>0%&5ΪLj1ςXhAgQ-G}1_%7!w~G3xIdnݼjRu` z:k̏hDž<rMÇ\ZmtRؒ 9@0Ix6 Y/!3;b#:P{IMIMSv1 Cۺ|*{3vG 2E%.P;hDS4ŋ9A QN~X MBF+u/UHW:Y7m_2N-^׷5Ơ~N{j7XHl[%~bu7??C) 0S+D {ctָ ǯ]_ Ƚ[b< %4D|M^㰔s>_hN4%yeqk|x%9jܛd0+FU,?U;n_ rw]2p? >;yz]~j endstream endobj 50 0 obj << /Type /FontDescriptor /FontName /KDBYZG+CMR17 /Flags 4 /FontBBox [-33 -250 945 749] /Ascent 694 /CapHeight 683 /Descent -195 /ItalicAngle 0 /StemV 53 /XHeight 430 /CharSet (/P/T/U/a/c/e/g/h/i/k/n/s) /FontFile 49 0 R >> endobj 51 0 obj << /Length1 2079 /Length2 12166 /Length3 0 /Length 13438 /Filter /FlateDecode >> stream xڍveT\[&N ;-)@MF[YoF`cfYvdePgyfm]݌lMJ )0~_:[9\]lW[% [9M:#wpͭbȢao \zZK~`V b]>7B`cY&@ +{?hm <zoC`ϓۜ9zQYTEdSĢo&vV; oGVJ2޿}kԿsv kOKm?j=yߜ$]mmҠalge/vR-VYTd"o7m"i4SZ5&b0mLmޮK|[*ao`{عƞoCf{[N3_ `aw*;8#>Zn^o/m N`A,&ЛO 7[f893vvWb`rFNoCG-Q?!~#W?ox+h7-?1R}ouo[ߎ23v/[Ύo߮j{[9/7v%C/O[99([?pu43Go)L~#?vm1x'gY:Y[op.,xcSۑxn-[_@Yo[o?4EXs0 j!tgָyu%DbVij)#̻~%);瞖=갚1؁Q|'C*61nq ,xj#^i6ha_]V RIkHX#m޻Vfc-Y>)7_]_=C&˴'H9 E*_S $L̃]FLJEN:I#f/zY,<y7S{e Mqf7uݳu5ڂhe RKYIzM('Tk,EF?=H&I^v8aoyD>`YKy`0xGsRec;QXbRoWzr8˰$)=pr:䓞^ ~ӇoqlT&ϣ)5bn*7i4C2dF| *b;k,yz`hfQ1$9^_ee>Lֶ~/5pH>m~CM<)<7-Qw_h2PԊS؊b9xxi0A #{}J$͞gweSl+L]*_o>0`^Bg/_Ni G3jX. 'R"&Dj ka Gn'=Pj̦?eNehl9hdIלRXA#"DǤ‘iO' wZM Ǎ_)iK \zN:{tp3,zv :,A.{)(ar|Zga5 1RNU} ʔ y#8wv杁yAavM{RݛL5OO#˼(@P)2; iNa9\题:GHN:ْkހpņ^s]I̬KA5iq&dJ_`T?.'`6 ]H~c]{bHa q _8^?Lh^q@1-cCitމB/SXp4 9~B9Z̸ 3G= %*3t!oFf,zWgň>o4-OΈF*nZa#Z[ąj=iaB}+Ef~yٿ2`I"uEق#(QQRȊTȖq z3Kz#Yl.w)S! C!6x8z hLv4K&]msơJ!/:mQN7)Se?ՔI1‚g}E`aj^ET )oAj3Wr|wn6- a%]3:f2rn W< rFCzh_uh X%z<' &$NCVMzDM玫w":b`|WJpA2<sX$Wh?D{+jT)IiϺ慽 lQڛ͇S4}N >f{:'k''|=U×o<sٗ{z-ٛ@ٹA<?i5f#C_I\㗰XASd2/3/cbeb Lfoqme+99!iڄ'*`nLk;EKzθLdfDpT [d12X<ڝ.վwl))$/=Pd<ήƥF7Iw'3cv=~1N{XN 6.\hY*MD}ۧqz1kËLsX®@(f8Yg]H`*Gk҉ Ӷ%#} \9z߿fcjCǩ"VDvJlj!5Tqh'hw'.Vzy[]Bb 0)o1v@/pL{x #_wt\(f8$B_ݱE!یdj5XIl&!a%-R車UDڟwዓ% *ٔ H.F.l 4 fDXUD I>- 5 ߫ۦgK<8iTT)ڸG9R8b'B=EAJM1.k\ 6[{sabmms/xįz'e*4TpQS4TUjy۾?šC~teUF: |c :̞Z' ki'Ev-"Yw_f}^qOe2Sag̊7có*A:TO$E-z|k)q ǜ"ƅ^"O ΚXYK(j<4C^`4[9qMT93in2uRDQ;Uk EwЄJՋQ9OwO2}r&f֛k_uͶ~^p|ׁ@]^L5J hSb_ OO"-4ՑIE5 {invXJ -rKbnD:yV1FjO\tIؕXlk |1.ƺy8 O]3dET7zpH-X#F674)>hl!] V yJЛ}P{e yظw<;J^m%>rUb Mc%fL RA!z,MdBݴW+JN|"ڱ6.j3"gxL`⬋$)?PNL~FR6)^\\OѮ2P_Za1L1OҜ}\elNpPdx3v2¥BJlƼuOK j{?X%%r~StYܔ*TtLYa^t lYƃ_I%bba~] =q ,-\ra9d?7ky ^ !Mլ)I~n>I;LtZ׃%8.yHVrz%*4('7ᜉ?C+qp|h_%4i#s"B"yGu&qKe,\Bϔ ryFWɛ4)jYoDA6,"- mzha1y!(&JK7^*d7w XOǗ_%&ǚ d;G |j7iV?$ *xjOv%T!6QΡti AFknC/5:(dXh&?SFF GgKJfG:dP8C] !O8WIt՝ އ<̐Py )칶Mn*D9u a;R O'Prn à{*5,zhn?D7tQzY4*LV!C{X9$Cy1~Hl]r(!F+_06^dH„'-($ԿtI%8}|}!WݷQX@3J|tD=kRL %czbv~ZLV峽&fJ,nNM\J2]:JQө"3uXLV"n= L?gAιa t"S!(In]Pيf4 1.]CɢZv*˳+} ,U+f`_@Wqǚ86@JY3ʳfNЧq=!᪹Pj  š12!g"\J)gN^&=tO辿<@ vMƆMq hK+3 ݍ=pe\~ZŞh6Ul߃M,@S=4܀I$LL b~Dٜ{ǑQGTپ?^eU}WZ/.:S:{ZI0iL/6a πd1.3y 2eFsI%}[HDϖ_~Zm[,C1ܛvF(nUh^f8%á婵w:JmnYΩQKUe-!Lu$Wi9:Quq'<yoYnݍ ZgQHeJC%Ruέ`!8xb[ ^+rEc??}GD Z15$3u/["@d>%aF-_%LxmƞaG1THq?S+fSm%kl85oQqaq'ʝG{LI7S}).MM\y *SG P5TFy 7Pyǎp;\۬U6[ *;bGw8g, Ī\D`Ud BaG.{g (S dI;cfI躔 >7NW#њcdQikC'vs*-Q?gb=-f:Vp`x^z|3hQM*2eUjȫi*tĨDXdNwOdN RtJ;&m(Y'x:YY)2wQj wu@XK"݉`Ս:L}(mվNg]~NC4\%eH єMiƒ2[0db{dORY_y)(|ȐkOޭ;H9mxW9ģ ̅#P1FPz$٩]BZBd>g[ɲӽfLsРL-޿5toIՎtt~pT 傴(<8%mK3ϑ1tW ]5sXP@>ծt:т1'b!q曄Ek!1#' Uw.2ZHPPzgK>(EM Z%ޠbXnN͇|ؓg+L5+aJR|Sya(""1E|'r獕dVg~6#żxvd@|a7#picc5R/>3Wkrַ/i^z1eɺ}KF?_]5UQGHWSsw)l Q<%>*Bd*OȖeW{z>ڔ}L Ѭ}*c%LiIU\26؅;zx$ gPiMs@Z.u>$Ӱi7zT#S+̓ha]t?~_SSƗX] /AS%i).^7RBMw &Yy5+hG9hVړ OW0:V-3=^^VG/*ۆlP-qCkpv4~jqZ=0~O5drPKE{[9XFwi4!%HG"Ś݈G-%fu4v*/ܡq}.Zy=v=$ll]Yxp9Eѝ'l7ݥZ)JNǀo:T$2 Iߝ`a r9A ?+'ѵ€M .u%Q?f4 UF̭Y tl 'Ap! oix;ʷ{PPŭIzIX"ta8 3iFB_c$Cn ~d!/ |Xy#tΞoG+n,ddn"PP *M;VYѡI4Ҟ[{ ߩjOdfLygIFl;鰗M͍@wFjvFmdZ",[KFN"\[Ose4ϊwtDf'Kڝ-?_JH~:nF?'H8B U0M"m>Y8anI.r_RjΙV-;Q,I i6Gb0ˬ-?ʢ iES6_o4UAKa zgϨ]شtÔ"؇[㝟K~p(#{٤1i⧈7&'98gn}`0W]r=٩A*WWkSu%>ܐ!> endobj 53 0 obj << /Length1 1451 /Length2 6794 /Length3 0 /Length 7783 /Filter /FlateDecode >> stream xڍvTk6 %% 1 5tJ 130CK4"ҍ J wZfg}}}u?P׀[f VA<|E-C OOtcy @@`P@(zAHO D`P+_/"/*( -: F(G'$jv~qqQy7hN`7Ԋv WF !x`2\o F=_#An? 07 @9\!v`( {P 8X/yܟ_ ;;@W0@GE W A\A(Ay=5v8W6+Cann`(?%ᄐ m9@ưA!` ʅ  }A_n pq~ /0 -<~~= ;BxTG٨P%a0?G̫|g *(|܂"na~?? @T: ȟ>B`E-{p]Kb.-P_tc*OwG*8 b'-J Q R<hn~!> l A9ŚF uaȯ_1\PE!0JC^Wj%6aLJb0J{o2xy0$*1u^/oE5^^?&0axuhၒo*}7>`;dsmxyo!ž\ ej/zRǂsS[+_6PX}~+A9_ߌ`dT+BS`KFjHNDnps:kGU]Y>[H|,}11AJɩV 3Hn[ EFZB):d5.!\$kW&}SFf 0ɲѩ|{Isx-b@Ꝿ~"fJ}ӮwY(\MPQܗa ŵV*a)oJDL2j'쌬ƯkBNw"-g?~rJ8鹼~zX[r<J D8ОV`gE &>>Sz%Dtk"+W=xtE|`S:3,Eȶ΂ݼzC=B1KnrG0e0$ѷO "}ˈHZ-0 ^{ք Gf\@q>M]'y@;4zS]үpsW:' K - pR_7]`$ xlcY9\QBC2u85ieYi~N 3\wg<Ɯ4(6/~Y%Xiߒ݂k{9M‰Q;s3{ͅK=P4Rռ|VM)?P^Tb5 `H"4 o("ő~0EԮXZ vAl{ӎlTN\lR *ԔS4!A 5|O&|?B^@6ٱ%Jؠd~dVAP}ެiny@jH'+wIA=`").ƤVW~eKtZ~I~dd㑍ZNV49DK\a3?z@g.Oy?a]ޜ! q&BJ8A\,J{wcHh_4_"mLXeҦߵN^F }oeE|dylGzCЍ֟d~HKЀZ7 COr1/!Y?'[{ (>Ŭ7Q)m[bP?ŻkKG nxA (F8 ,vQ\p(צ-zu=O9˗Mkb#-Bu+4x'JqzE]/w5 2iu03EHH2SZ68rݗ͂&~xq!+R,ʕW-~fۦA_4}׶z#xXMiPލ NA< 24}̇`q'Gq4?D|U|Jbec\鏛o/"R!Ћu@Ǔcw^/%T{`T!< iBCh|&)ױFiЯ~ǥFs ʏ II0,3{>Q2GNc6a+y˼~6mimvI#ma{Zf/ fĻep&y/JT0YJy bjGZVGr#$9օ;w+owV0|$ӟ{9_t5,-͝u ߻[Ou5Z)'UQ[-3?Khvj(Fxt݅1$E-IųsbWߤJfy/S\ЮfTD]S#3|z4dȳgK)&t^Զ6GJ''(@&-ٜ3kQ.!rX4皂rz_إz}b98^3~+]Yűwŗ:rWUI,f&vx_+<|zȾ_9jp|QP*9^8zW ZOVvF85t3L|ɲgG1 X[( K=:SS$:e{vKٞVhѯR6vï|AlpQ2^2,gc[&/ŦgP/\F@XgƝHfO3UmInR)!vĤk@jc@o7Ɓ#[u 'X0WFbhyn6QKOQa^C$^*rE6=r~cơ\XWbrGF3YgGhxMtbl2P4exW :b3Shу.:}|)IRFU4WYx~%D ZO?>&Q'qGˬ3_,`i"m&}o  5KՃH@2}j4:ҹ9J+/!a1L=B Fd5#-O G,b&;eepۦjKtoگ|wg9_>,߳KƠpn/QYýeqʉw7"K,#0Zr)Bg974E 9GYnZ3?.2wJg]ĝPeH2|E Xev0rybdf7y+5m`,c`B[+p38'4U4CU)˻$b}hOS% ?q([cf+ :hؕ%hCY/tNoFx,&X+`W _$:Bm\Bҡo9\W>V/׌7U;H4`SwAJ8}loo>J%6ּ,[D:6Z(!a4DxDNFz>8b0Ț"yG(#)36廊GH'hH[!&|'5p[G$hKƯ1Go}TY|5Sbi*CݳpseL{g GĽ!0=We@p|ݼ5>-Vip]wl`+B|Է#wU݉mLGφoU^ܓrB?+t9pM0lM*sR&OQ4a =;-)2i ֒@7v3~ yt?W{2RiOX b,ҢYVdj%xG`@'X+n`ja;z1Q4yZXoLǣ_sq˵lشL)BoQX6 MLŽAJ$Ґө}Xec-YlEG| 8]ѣ|C:;1jij D~pmOQ2̈1˥I뤵iyt0Gz{ k>x9u@9S#GnF/8 Dx45`X DhN$뢢=˧$\ǩ[gSK}#gVwHFFѤ$r8>sE`*%=B䲏#:zHOU{Pʦ'0e ˎ3৞Jעŋ!~E GC&^nnw8]rUҜcI\Z4`В@W \LD}m##z{@=OFG,7 $V-5[S{m'b#;@7&!xdAPX8Xx+/tyюـ3 պ'=MZt.@FjM*xߙAIjYZw,ϔST-Mt7[FvTjF-+(ЦoSܑ)lT6kc9Ql'zXBC{gbT/T LȪL 魽 W!0V^~ WW-3znlO1CWY<4Td"RNyp6G*ۻD慓~rMCЇu1:1aϝݰA~Y 6'[歩Zj>4%$ɟе٭s4֍%Q3R@e~W,ICN3вu }JaKeGcۜ΄!L-W:b3ƙˏ.&)>woJ4㕟+.6SFrye[qb"@ؑpHgAGC8X>V3Ƃиwoc}ΗnHym)Ȑ*|sFOšT5{CV/H9™կ8m9@??KO '-ҫKlJB8I-%&b.j༱5ls0:%nS6< Q5|MEڸQƐ̅K\`-grVJYb:%bQt/ He&15myrJ _zȐ-)Ui˨ʵVg}5Ԟ5wTwh"D+跒T$6 ~BBkzX_EgUq*Dgu;#d‘]7ٟ8q>ӠW{컙QFP-Yw63ˆU`FJcwfcGkwX}sW>wb$g2kHn"*9eȩgdT_ > l&'[*=2S_fޔ*΅6rQFz.Crw~Kt1Ⱥ`a Ds;q6<º5vo & h#uFhn/< tuqwJ)i-Vv 2Jقm+Idk77c;M֧OK841e vZW/]֍Bo)叵q aDӫa?dh =vX =x%G'GU8}Q>~xVȮPA=߸ V,gv2E}WE9zßg{߱-s'[n;Ԛ,W \/Y5隭OY;=JD/)TaQ&*c!{u=ճDZm%;•trz5֣؟N/,or!HryRr%-Ͳ#qgڛF/G(-;A)O&u9'uBkMxmw >ud`QrP57ث~j. !l$Ť`(J|aG9["FxPR'aRuHƘ%#5g[Z=(.2ʊњG/|[Tx.)67-[-`E޿U%eL9}7ȂZ|lnA -ﲥaw`L";ȖW*3{ø G\w>%آFܝ蘏BmxȾQw ɫI7pNV6ϬTFeL‰ݞ]  a6Wk!]7 endstream endobj 54 0 obj << /Type /FontDescriptor /FontName /FDRPFI+CMTI12 /Flags 4 /FontBBox [-36 -251 1103 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 63 /XHeight 431 /CharSet (/a/e/i/o/r/t) /FontFile 53 0 R >> endobj 55 0 obj << /Length1 2175 /Length2 8485 /Length3 0 /Length 9770 /Filter /FlateDecode >> stream xڍTk6 "0tJwIJ* 0C3tw4"H7"HHH4HZ߷f}{fzm=nYk%X Cr| Pefև"2? p.`%S!Qp@'@ .P\fy G;OLL/w#j4AH[#*Mtuww9"x.6R\w( F]րߔZ G?xpP =8rP@¬.Tv\7?޿Aa9N 'f@'J^? *%602Q J P?<~.8Lllo B %Q H9Qo!m(!+ 5mQQRwU;VGPAU+6ov B嶿i(JHw@TC(NDv;m Zw` wfn%bWr^)Kν:/0"ۺNő@AlEm_ Fd@ >d3-X\>cDn#4\L,`6d2ɹV'27%YlYwxcFcS  \JVU&ġnEzrl :t)zk끓qTF03J"e[qKH %vB Da CHKnh;uwDB8lLWyg57/Kfk4V)>-f4FzҍLN  NX=88˯ĊY:93I&KM pxr>{2q(,?k GNQPI( 딬 g'c%*tIT~w.ʥ05s\>?P.!l.8w0[z2d>gƲM^_S 7p`q:~\{ܟjR:&hؿCAX3k2è:|b9]!qYk9Ɠq$fp oűY%L^͸T%,:6:(4*/`*"_)kFӛǭHp[5ꮏΉX5sm|ᥰɦ: q4=CڤFG!~Ѣ ë[ q{]6oUp?Q4e8" FTm.w<$2dkaqL/=<)U%%&:TINC!Zov]$jDrաIij+|'x*HZ3@͂㺌Eڏn2wLPr,؟< *Li8sT:ܤMV‹sCMK/zD@#c/zn =>'6fGi*ۄfieQ%?'x\Z|ap>^7fEztЖN9% =^;%^z`DAbjQ )b3"HayWXlz̻5{2S7k"*0a_?_}xt ő+WBU}:Zkhqt3Θ7jZhL) Z@3(Dඟ\( ިʰNvgⅿ{E횪} -~Ρ5ὪER_Wq h?-hvZKU5w$Syu,KeyvoQs9m駧//J.а4O2|)ݣaM=Sp{1%$WFեYjeTv[|4°DZ:='&.DsHw ^VX k~V@Υn`\q5O+\-KTEZҐoМ[|aȜ21&!Cw#3]h-jԒ8#XDG~nާ~W󊕀fCL)'ƚ⽒Ȭp _24:#X˘89sr~ʒRkoPՉl /sԨ{\6;;e/9x1 =wg#sN!lEsR̠ 얤:1f _ϳ*ݷr@[8.Ut]~v|3cf Vpb5) LnAϏ7-J[Rm]Ru=su+)8MYaM)tn!.(ē|Ͷ}"S+5*,T5:ʸWPRDz{J|+9wU >+s |W[Sa1vj)ZxqmeγԭǙv͔+5䒕&?Wm0`*xg*i TFT)(O1j. /nw BZ'؛Op 7mAV$ʅ^~+;ǕkaI-/k[ UMs!o$U|fɲJPW_\mTQ/#db +dNOþȧeDyÌ(ъ#|*9Gbd~SiNHi{YaW4fF#2]vZ^d |[G҅>.3M>/챏Tzs(*|g^jWL!oMu7:L62ы˟h7$CS !1y:>ca{ҙǼ!̛ F2P:*V|_ln4qpu֘iJ8Ć.D|bm4 5Ƙ8?wCBah7}'vǮz6^/պ)}c.1a9szwWb$z1ThK?@>ڄ6-Pvdb G3EƎ˼gɧplWBW!Gj`㫥ѫ`>BVʼn;U؄nyP"ޗ0?g{Or˾T`Kz.IEpwwۛ{TibFO0ȱ۸ 0yv m}LVl:gBc6e?sM ]x } R#֫&ueQ [7K]-];|NPR u.]x+#dl[/vIl:Od1%X%X`Ϯ{ +!^ۋkj*RC,QEފCptG}e%om,Hʈk-YF}VЎ\1}*մ63%<[#ԱvHhIӹ+MJGTҎXd&"UgnO"=a /\|.LZZa>p V\ͳnLl)K84"A^ IN9qtC =;>C-lˍ *ެܙ ?^+^֕+we˶X!㛜ۧyDә,ؼ=s}ө$zV8t:sx59]3)}&R"DDH!ye7r45I}[J`uD wZ-m'?K}.;2Ϛ ik*ٹ4LSer֣Qհ57P(vErqFOˍ,7ysI~4*L?QiZpPX3w$w8Uh݈kDuOPeE$YGh\p=kO:1T չL7BrJs"E:ǭ\arcSn++,oRp^ 8r}4ԀƭT6C)Cbgt#1h/ _xu9}}ug`tv|tƗt{܂TZ!H*ut{ey8rt7٤ꋅCmEs6ϓNEC\Gi-Tx0gRkOG5Z(L| B&iX|p5nSN|2DYSIyzt ͈ -z)jwn$:[ K Ӏ J֌\y/egfau<=D&H6x񺱽re|MOc8kF}&_&UGJ ;\U0 a^V84~3, =_G8WS@Å{qUcx&&QӢ:T*NDyÀ/EpNע72~\lwDZH1)gcߑw&j/r.JDeew8 {~~KzM;buډ닋ĝazHKH[őNP-c嬺Eܮf)ܞxonoYhgLϐ͚p`oeEt0U _3F m3I1;itDZLF :[0-b &]oVJB>bEGng;C->+^ڀwLkzQBia+(WDގIsB/hn]٪|;ӻ"rSxwMkC4h3W? mc{+,%,Tbk„(cxp.htI旼zIlhCHSɇ\΅BJZeT)fI5Qz1O5>dUoMfϕ:].cOSNeut5S\)Q iD\Y?wF^|* rsh '3 Ũw^Rt#z+93|94e0psΛu0A%ȦDPeBMk3B>55Y G3wbw_or1̴C/Y@v)wqzy-G>w'cJg7xFG W$︶]'$'.hrpE!^YMe;~w Jxz BǥځnDkUgI@pT!K 4d:s.kh ̓s/0U[HiEo)sgm%9^`޲т-$+)(*?ߤIx.ίɃՉW\*ժk*D5Pj4dZyY2/33*DHmFֈd7Ⱥ͊8s[\_cF=Ԥ۱]4e]ThQ'[=1ga`GS mt<҈1ܡ ĕJ,7:6A8;b"/My~@B PO[l]Y C$cּQ(y}+{ꦦpg,oCOZӔ$TE tycs- gD*S_j9Kq3 Y]B/ZP66$ oaCgri~.{Za<<2#d>@p[*kh+L}~H>#'LIeB!)vnVN/͐A~)փi3X)ROV/7/—<0ؕbn |[~`Ms7a`1 ,kYJ:9Z$R͵ 턂Oi$-Wco b+8<)< h߱hd >IB~NԲ͐vxS̝+k 5;䫪;-zIGB<k')2Y6]d/:ޤNKŮGQU-.':A’ *Dp4h ϶ĭDVT=v]05܅:G3n3~vMtK)2c(3I ܫ[z܇Xg)9Eq^ɜs3tq$'I*:4[:[> nI+A54J]X/;ܑfӴ|EhNVBʦcݒ)]p!Q@of{ټwsd|W岋#bҺ*-kk?;*0K-r؝ˎa>}e8笏ﱇwuE-v,a Ӂȡ]+Q . R:o~c,{s7 :D=PޔxPEߗ[\C= MQo!i4祍nH |:pU./,f ω=ns"(a+Zm$ ~Xx|,*h^ 3S{3\̔PWpxsMr&;GG̨rh+DQr->x8Gyb}e˽4Ig!c3r & ;uIaAיfft /!Wyf:R֎Ӻz~OտVs;t΁]lZ_g*Ǥ"떾HZZ,]mE}]]˸w|u%*"sXV6\tSڍf! *;KЏ.4=2zOБBSaxrmFL2UB/2NL endstream endobj 56 0 obj << /Type /FontDescriptor /FontName /YXUBMJ+CMTT12 /Flags 4 /FontBBox [-1 -234 524 695] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/A/E/F/G/H/I/L/M/P/R/S/U/a/b/bracketleft/bracketright/c/colon/comma/d/e/eight/f/five/four/g/h/hyphen/i/k/l/m/n/nine/o/one/p/period/r/s/seven/six/slash/t/three/two/u/v/w/x/y/zero) /FontFile 55 0 R >> endobj 57 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=['sv}o|7lԘ[kxBYwS0`Qٮi"m!-M5\F:i0U4e7;yO!(37Px\lCys0l+htcA620Ae L[7Њn& U RZ,cŶPSan aiqD4',IF\Bbu /y2RXR xHXc®eg:'c|0xq?S΃qI&'g΃y9 C :sǡ;(E8o"AJ'Ođ+6KIט'; ztFzKp&q"pBCT/9!ɩ~B}Rq҉TFIܨύ|nTs|neEAxwIyRm4͓_Oyf;s|KۄwU羷{lC'i=>vGr_$Ԩ endstream endobj 18 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GKHNTA+CMB10 /FontDescriptor 46 0 R /FirstChar 49 /LastChar 117 /Widths 41 0 R /ToUnicode 57 0 R >> endobj 58 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> endobj 59 0 obj << /Length 740 /Filter /FlateDecode >> stream xmUMo0WxvH UdCmU^!1HDI8߯-@=ۙڽ١=?w]pwdV^ڑݧl#oxdGa0NiqF?Sր'YNR}{f{x2A! u xk={Exo"}Rɑ#x۠_J B C쩁b8!=%p&r"D9 Qg̑Tu+gGNN8O-(7ZRntH ʍ(7:hEњr1+w(O:͓.ndm'#Ʉ'> endobj 60 0 obj << /Length 675 /Filter /FlateDecode >> stream xuAo0 R{HcIE H9l[5j 8] CfUmóٟۃŏ١.rn|vxb}[6ߺf|歫NNhYgy8å9q7۾q0_f_ дGι/63Dk 6"WT#!YT XF{޺cl_c9K_۾qk8rw麓 G ylIo2"dݾ}hrYWydͼ//V&ZKLxY juwԯx2$OAPyt4sk)$Q "7A?g@c(3jok9E u9/d86dq/@cNiЃ9eyDH{f@/Z`~G. И!`DoSc_ BZ }%m<;4x{[W<Q $R1R R2R:dA3NUAUI5'ZG-^GGGG$zE"ZGmΉ..h$q41q1//fm|T ֵiKN" endstream endobj 20 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RAIGNC+CMSLTT10 /FontDescriptor 52 0 R /FirstChar 34 /LastChar 121 /Widths 39 0 R /ToUnicode 60 0 R >> endobj 61 0 obj << /Length 750 /Filter /FlateDecode >> stream xmUMo0Wx$*B!qض*jn$H$3Ch<~3~~~ngjv9{C{K;K.k6㳵ችm#O7٦4\ =؏8ݿ߳4B8͌>sIvdXC6OLx9im$l6Dl_7ڞhz*{pɲ2kAʶC+mk>lpfIQTT?LA>J e .1PbpqH I$\kL8Hb،Shąr =z51XQg_s2Ē+ sC:CQ}.'c-BbOEu+Xg~:?aj B.U $,ĨAA 2A%%" 19hM_)ELN 1sR3fg =傸aCYjV^w&L= 3nqFyDŽϠOL5'pZx?i^x?IGO:~I4ϼt~3][gF~Qgf}fB3y,h3cL}f23{,g>KYN0`^ay{7)q W7:*ሟS`R$m endstream endobj 19 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FDRPFI+CMTI12 /FontDescriptor 54 0 R /FirstChar 97 /LastChar 116 /Widths 40 0 R /ToUnicode 61 0 R >> endobj 62 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 ᫄ endstream endobj 16 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YXUBMJ+CMTT12 /FontDescriptor 56 0 R /FirstChar 44 /LastChar 121 /Widths 43 0 R /ToUnicode 62 0 R >> endobj 22 0 obj << /Type /Pages /Count 4 /Kids [10 0 R 24 0 R 28 0 R 32 0 R] >> endobj 63 0 obj << /Type /Outlines /First 3 0 R /Last 7 0 R /Count 2 >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 63 0 R /Prev 3 0 R >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 63 0 R /Next 7 0 R >> endobj 64 0 obj << /Names [(Doc-Start) 14 0 R (page.1) 13 0 R (page.2) 26 0 R (page.3) 30 0 R (page.4) 34 0 R (section.1) 2 0 R] /Limits [(Doc-Start) (section.1)] >> endobj 65 0 obj << /Names [(section.2) 6 0 R] /Limits [(section.2) (section.2)] >> endobj 66 0 obj << /Kids [64 0 R 65 0 R] /Limits [(Doc-Start) (section.2)] >> endobj 67 0 obj << /Dests 66 0 R >> endobj 68 0 obj << /Type /Catalog /Pages 22 0 R /Outlines 63 0 R /Names 67 0 R /PageMode/UseOutlines /OpenAction 9 0 R >> endobj 69 0 obj << /Producer (MiKTeX pdfTeX-1.40.24) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20220116101928-08'00') /ModDate (D:20220116101928-08'00') /Trapped /False /PTEX.Fullbanner (This is MiKTeX-pdfTeX 4.10.0 (1.40.24)) >> endobj xref 0 70 0000000000 65535 f 0000000015 00000 n 0000002173 00000 n 0000085003 00000 n 0000000060 00000 n 0000000146 00000 n 0000006655 00000 n 0000084933 00000 n 0000000191 00000 n 0000000333 00000 n 0000001957 00000 n 0000002227 00000 n 0000000380 00000 n 0000002065 00000 n 0000002118 00000 n 0000081807 00000 n 0000084622 00000 n 0000080829 00000 n 0000079852 00000 n 0000083711 00000 n 0000082720 00000 n 0000008011 00000 n 0000084781 00000 n 0000004219 00000 n 0000004058 00000 n 0000002369 00000 n 0000004166 00000 n 0000006709 00000 n 0000006494 00000 n 0000004313 00000 n 0000006602 00000 n 0000007714 00000 n 0000007553 00000 n 0000006815 00000 n 0000007661 00000 n 0000007808 00000 n 0000008256 00000 n 0000008281 00000 n 0000008341 00000 n 0000008375 00000 n 0000008745 00000 n 0000008845 00000 n 0000009242 00000 n 0000009847 00000 n 0000010333 00000 n 0000010567 00000 n 0000020365 00000 n 0000020621 00000 n 0000036793 00000 n 0000037133 00000 n 0000046436 00000 n 0000046674 00000 n 0000060232 00000 n 0000060621 00000 n 0000068523 00000 n 0000068753 00000 n 0000078642 00000 n 0000079033 00000 n 0000080010 00000 n 0000080987 00000 n 0000081965 00000 n 0000082881 00000 n 0000083870 00000 n 0000084861 00000 n 0000085073 00000 n 0000085239 00000 n 0000085322 00000 n 0000085400 00000 n 0000085436 00000 n 0000085558 00000 n trailer << /Size 70 /Root 68 0 R /Info 69 0 R /ID [ ] >> startxref 85831 %%EOF iterators/inst/doc/iterators.Rnw0000644000176200001440000001411214171060105016506 0ustar liggesusers% \VignetteIndexEntry{iterators Manual} % \VignetteDepends{iterators} % \VignettePackage{iterators} \documentclass[12pt]{article} \usepackage{amsmath} \usepackage[pdftex]{graphicx} \usepackage{color} \usepackage{xspace} \usepackage{fancyvrb} \usepackage{fancyhdr} \usepackage[ colorlinks=true, linkcolor=blue, citecolor=blue, urlcolor=blue] {hyperref} \usepackage{lscape} \usepackage{Sweave} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % define new colors for use \definecolor{darkgreen}{rgb}{0,0.6,0} \definecolor{darkred}{rgb}{0.6,0.0,0} \definecolor{lightbrown}{rgb}{1,0.9,0.8} \definecolor{brown}{rgb}{0.6,0.3,0.3} \definecolor{darkblue}{rgb}{0,0,0.8} \definecolor{darkmagenta}{rgb}{0.5,0,0.5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bld}[1]{\mbox{\boldmath $#1$}} \newcommand{\shell}[1]{\mbox{$#1$}} \renewcommand{\vec}[1]{\mbox{\bf {#1}}} \newcommand{\ReallySmallSpacing}{\renewcommand{\baselinestretch}{.6}\Large\normalsize} \newcommand{\SmallSpacing}{\renewcommand{\baselinestretch}{1.1}\Large\normalsize} \newcommand{\halfs}{\frac{1}{2}} \setlength{\oddsidemargin}{-.25 truein} \setlength{\evensidemargin}{0truein} \setlength{\topmargin}{-0.2truein} \setlength{\textwidth}{7 truein} \setlength{\textheight}{8.5 truein} \setlength{\parindent}{0.20truein} \setlength{\parskip}{0.10truein} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagestyle{fancy} \lhead{} \chead{Using The {\tt iterators} Package} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Using The {\tt iterators} Package} \author{Rich Calaway} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} An {\em iterator} is a special type of object that generalizes the notion of a looping variable. When passed as an argument to a function that knows what to do with it, the iterator supplies a sequence of values. The iterator also maintains information about its state, in particular its current index. The \texttt{iterators} package includes a number of functions for creating iterators, the simplest of which is \texttt{iter}, which takes virtually any R object and turns it into an iterator object. The simplest function that operates on iterators is the \texttt{nextElem} function, which when given an iterator, returns the next value of the iterator. For example, here we create an iterator object from the sequence 1 to 10, and then use \texttt{nextElem} to iterate through the values: <>= library(iterators) i1 <- iter(1:10) nextElem(i1) nextElem(i1) @ You can create iterators from matrices and data frames, using the \texttt{by} argument to specify whether to iterate by row or column: <>= istate <- iter(state.x77, by='row') nextElem(istate) nextElem(istate) @ Iterators can also be created from functions, in which case the iterator can be an endless source of values: <>= ifun <- iter(function() sample(0:9, 4, replace=TRUE)) nextElem(ifun) nextElem(ifun) @ For practical applications, iterators can be paired with \texttt{foreach} to obtain parallel results quite easily: \begin{Schunk} \begin{Sinput} > library(foreach) \end{Sinput} \begin{Soutput} foreach: simple, scalable parallel programming from Revolution Analytics Use Revolution R for scalability, fault tolerance and more. http://www.revolutionanalytics.com \end{Soutput} \begin{Sinput} > x <- matrix(rnorm(1e+06), ncol = 10000) > itx <- iter(x, by = "row") > foreach(i = itx, .combine = c) %dopar% mean(i) \end{Sinput} \begin{Soutput} [1] -0.0069652059 0.0161112989 0.0080068074 -0.0120020610 0.0017168149 [6] 0.0139835943 -0.0078172106 -0.0024762273 -0.0031558268 -0.0072662893 [11] -0.0055142639 0.0015717907 -0.0100842965 -0.0123601527 0.0136420084 [16] -0.0242922105 -0.0126416949 -0.0052951152 0.0216329326 -0.0262476648 [21] 0.0041937609 0.0121253368 -0.0110165729 0.0044267635 0.0080241894 [26] 0.0042995539 -0.0102826632 0.0051185628 -0.0013970812 -0.0172380786 [31] 0.0096079613 0.0046837729 -0.0080726970 0.0083781727 -0.0234620163 [36] -0.0099883966 0.0026883628 0.0029367320 0.0205825899 0.0035303940 [41] 0.0204990426 -0.0010804987 -0.0033665481 -0.0127492019 -0.0147443195 [46] 0.0027046346 0.0016449793 0.0155575490 -0.0003488394 -0.0079238019 [51] 0.0086390030 -0.0039033309 0.0168593825 -0.0067189572 -0.0009925288 [56] -0.0162907048 -0.0059171838 0.0093806072 0.0100886929 -0.0111677408 [61] 0.0021754963 -0.0056770907 0.0081200698 -0.0029828717 -0.0163704350 [66] 0.0057266267 -0.0017156156 0.0214172738 -0.0141379874 -0.0126593342 [71] 0.0087124575 0.0040231519 0.0038515673 0.0066066908 0.0023586046 [76] -0.0044167901 -0.0090543553 0.0010806096 0.0102288061 0.0039881702 [81] -0.0054549319 -0.0127997275 -0.0031697122 -0.0016100996 -0.0143468118 [86] 0.0035904125 -0.0059399479 0.0085565480 -0.0159064868 0.0054120554 [91] -0.0084420572 0.0194448129 -0.0103192553 -0.0062924628 0.0215069258 [96] 0.0015749065 0.0109657488 0.0152237842 -0.0057181022 0.0035530715 \end{Soutput} \end{Schunk} \section{Some Special Iterators} The notion of an iterator is new to R, but should be familiar to users of languages such as Python. The \texttt{iterators} package includes a number of special functions that generate iterators for some common scenarios. For example, the \texttt{irnorm} function creates an iterator for which each value is drawn from a specified random normal distribution: <>= library(iterators) itrn <- irnorm(10) nextElem(itrn) nextElem(itrn) @ Similarly, the \texttt{irunif}, \texttt{irbinom}, and \texttt{irpois} functions create iterators which drawn their values from uniform, binomial, and Poisson distributions, respectively. We can then use these functions just as we used \texttt{irnorm}: <>= itru <- irunif(10) nextElem(itru) nextElem(itru) @ The \texttt{icount} function returns an iterator that counts starting from one: <>= it <- icount(3) nextElem(it) nextElem(it) nextElem(it) @ \end{document} iterators/inst/doc/writing.R0000644000176200001440000001325014171060663015623 0ustar liggesusers### R code from vignette source 'writing.Rnw' ################################################### ### code chunk number 1: loadLibs ################################################### library(iterators) ################################################### ### code chunk number 2: iterable1 ################################################### it <- iter(list(1:2, 3:4)) ################################################### ### code chunk number 3: iterable2 ################################################### nextElem(it) nextElem(it) tryCatch(nextElem(it), error=function(e) e) ################################################### ### code chunk number 4: nextElem.abstractiter ################################################### iterators:::iter.iter iterators:::nextElem.abstractiter ################################################### ### code chunk number 5: iter1 ################################################### iforever <- function(x) { nextEl <- function() x obj <- list(nextElem=nextEl) class(obj) <- c('iforever', 'abstractiter', 'iter') obj } ################################################### ### code chunk number 6: runiter1 ################################################### it <- iforever(42) nextElem(it) nextElem(it) ################################################### ### code chunk number 7: runiter1.part2 ################################################### unlist(as.list(it, n=6)) ################################################### ### code chunk number 8: iter2 ################################################### irep <- function(x, times) { nextEl <- function() { if (times > 0) times <<- times - 1 else stop('StopIteration') x } obj <- list(nextElem=nextEl) class(obj) <- c('irep', 'abstractiter', 'iter') obj } ################################################### ### code chunk number 9: runiter2 ################################################### it <- irep(7, 6) unlist(as.list(it)) ################################################### ### code chunk number 10: iter3 ################################################### ivector <- function(x, ...) { i <- 1 it <- idiv(length(x), ...) nextEl <- function() { n <- nextElem(it) ix <- seq(i, length=n) i <<- i + n x[ix] } obj <- list(nextElem=nextEl) class(obj) <- c('ivector', 'abstractiter', 'iter') obj } ################################################### ### code chunk number 11: runiter3 ################################################### it <- ivector(1:25, chunks=3) as.list(it) ################################################### ### code chunk number 12: generichasnext ################################################### hasNext <- function(obj, ...) { UseMethod('hasNext') } ################################################### ### code chunk number 13: hasnextmethod ################################################### hasNext.ihasNext <- function(obj, ...) { obj$hasNext() } ################################################### ### code chunk number 14: ihasnext ################################################### ihasNext <- function(it) { if (!is.null(it$hasNext)) return(it) cache <- NULL has_next <- NA nextEl <- function() { if (!hasNx()) stop('StopIteration', call.=FALSE) has_next <<- NA cache } hasNx <- function() { if (!is.na(has_next)) return(has_next) tryCatch({ cache <<- nextElem(it) has_next <<- TRUE }, error=function(e) { if (identical(conditionMessage(e), 'StopIteration')) { has_next <<- FALSE } else { stop(e) } }) has_next } obj <- list(nextElem=nextEl, hasNext=hasNx) class(obj) <- c('ihasNext', 'abstractiter', 'iter') obj } ################################################### ### code chunk number 15: hasnextexample ################################################### it <- ihasNext(icount(3)) while (hasNext(it)) { print(nextElem(it)) } ################################################### ### code chunk number 16: recyle ################################################### irecycle <- function(it) { values <- as.list(iter(it)) i <- length(values) nextEl <- function() { i <<- i + 1 if (i > length(values)) i <<- 1 values[[i]] } obj <- list(nextElem=nextEl) class(obj) <- c('irecycle', 'abstractiter', 'iter') obj } ################################################### ### code chunk number 17: recyleexample ################################################### it <- irecycle(icount(3)) unlist(as.list(it, n=9)) ################################################### ### code chunk number 18: ilimit ################################################### ilimit <- function(it, times) { it <- iter(it) nextEl <- function() { if (times > 0) times <<- times - 1 else stop('StopIteration') nextElem(it) } obj <- list(nextElem=nextEl) class(obj) <- c('ilimit', 'abstractiter', 'iter') obj } ################################################### ### code chunk number 19: irep2 ################################################### irep2 <- function(x, times) ilimit(iforever(x), times) ################################################### ### code chunk number 20: testirep2 ################################################### it <- ihasNext(irep2('foo', 3)) while (hasNext(it)) { print(nextElem(it)) } ################################################### ### code chunk number 21: testirecycle ################################################### iterable <- 1:3 n <- 3 it <- ilimit(irecycle(iterable), n * length(iterable)) unlist(as.list(it)) ################################################### ### code chunk number 22: rep ################################################### rep(iterable, n) iterators/inst/doc/writing.pdf0000644000176200001440000061276114171060663016207 0ustar liggesusers%PDF-1.5 % 1 0 obj << /S /GoTo /D (section.1) >> endobj 4 0 obj (\376\377\000I\000n\000t\000r\000o\000d\000u\000c\000t\000i\000o\000n) endobj 5 0 obj << /S /GoTo /D (section.2) >> endobj 8 0 obj (\376\377\000W\000h\000a\000t\000\040\000m\000e\000t\000h\000o\000d\000s\000\040\000a\000r\000e\000\040\000n\000e\000e\000d\000e\000d\000\040\000f\000o\000r\000\040\000a\000n\000\040\000i\000t\000e\000r\000a\000t\000o\000r\000?) endobj 9 0 obj << /S /GoTo /D (section.3) >> endobj 12 0 obj (\376\377\000A\000\040\000s\000i\000m\000p\000l\000e\000\040\000i\000t\000e\000r\000a\000t\000o\000r) endobj 13 0 obj << /S /GoTo /D (section.4) >> endobj 16 0 obj (\376\377\000A\000\040\000s\000t\000a\000t\000e\000f\000u\000l\000\040\000i\000t\000e\000r\000a\000t\000o\000r) endobj 17 0 obj << /S /GoTo /D (section.5) >> endobj 20 0 obj (\376\377\000U\000s\000i\000n\000g\000\040\000a\000n\000\040\000i\000t\000e\000r\000a\000t\000o\000r\000\040\000i\000n\000s\000i\000d\000e\000\040\000a\000n\000\040\000i\000t\000e\000r\000a\000t\000o\000r) endobj 21 0 obj << /S /GoTo /D (section.6) >> endobj 24 0 obj (\376\377\000A\000d\000d\000i\000n\000g\000\040\000a\000\040\000h\000a\000s\000N\000e\000x\000t\000\040\000m\000e\000t\000h\000o\000d\000\040\000t\000o\000\040\000a\000n\000\040\000i\000t\000e\000r\000a\000t\000o\000r) endobj 25 0 obj << /S /GoTo /D (section.7) >> endobj 28 0 obj (\376\377\000A\000\040\000r\000e\000c\000y\000c\000l\000i\000n\000g\000\040\000i\000t\000e\000r\000a\000t\000o\000r) endobj 29 0 obj << /S /GoTo /D (section.8) >> endobj 32 0 obj (\376\377\000L\000i\000m\000i\000t\000i\000n\000g\000\040\000i\000n\000f\000i\000n\000i\000t\000e\000\040\000i\000t\000e\000r\000a\000t\000o\000r\000s) endobj 33 0 obj << /S /GoTo /D (section.9) >> endobj 36 0 obj (\376\377\000C\000o\000n\000c\000l\000u\000s\000i\000o\000n) endobj 37 0 obj << /S /GoTo /D [38 0 R /Fit] >> endobj 41 0 obj << /Length 2828 /Filter /FlateDecode >> stream xڝK۶_%LǦSg[th-wWQ}'J| Ǣ*~|So+Bw0ı/kM]WkW0|<4Now?}ֹz|L߆bkoUݕ#W t;Vmek? [>Mi(GֶXT*lWpaUpYmy ș!Qj(Kg|"!@́lg,l*t :n@! Fm9 9\v8@gYdPd ߯֍+?09'tpd pa"qi:=˥Xh)"=#@o'T^GP_ot;㪾Es w_3igC2my'\dHm05`>tA7#ɂR3l4%3Ni. xZsrQQ!$R٤"6-TN":|F|NmrvW@?0MnmaNl3_DBo=ѥs(#6*{^F>ĤĞ)dd4iQ  D;n?+%vgF9PۑNVkkn3wQqGNGn r+hX7Ns'Wr>{%D)n\ ԃ z]uuɜF\Y>~tsAnBH÷/_Wu9YT6(i2!.Q@b'u>jW3^=!3_Oy|<\A1HtAsA罋+ETxM_3xIg.it8iׇ$%2Վ5x[܉ٷAKC~G9Il2”gc[Ɛ-!GMY!}xl1rT{\SFVQVAA"E38L$b`T/% ESxQ{>&%S h'a^&𙏎%pec԰7QFbGu+9%䬙aBxK1n$7QV6x OHi!Bw+njTcI0%oi./nc񥨦AZ6+ f˓h~3ܶWx); I-I/,L ɸDViz:S؉Ag?5Ƌa\^T_I]T[Li?Ip]d4SrʹgI6;D^XZ1Rz|)띨~.~Y_š€%"b LE<.Ty]J$T6&lkIfdRLOkyF)V6޼81%ܣ3m9{vhrw.& WZGyPi27ulbYw5JʼnYHMY&./_XUklz 0/qc ΣQ Eړ oڔY sJ*9cIX`y7r>+a&GȔazt1SE~ޚnb%Gq۸t"~C6Ly#!$3R u.U]e֬c:z:.Ӈcn 7Eg<ՁsLgN!xn!T)M<+k+qN?0glW/5;xh/~"B0uEO+9CVe:jMK3Ev"*n*9᝽˺:&_*9=k ^Np@AWڂ׮p]핚eVH:^@AFЋj|jq\$zNMDSLlȞpC ߃l @g-4}Kf_F%,(ߞu7Vޮ_ت3}_lo~*a x%}QW4gvo_vE`y񡅣,Q p}у; `mb-_JR6,>(A~[ ӗrj?4IYvmOrVo)+{$1^b6}˰ti >m5=85R(8h>#6<d8%?CO8sCrźE?x` endstream endobj 38 0 obj << /Type /Page /Contents 41 0 R /Resources 40 0 R /MediaBox [0 0 612 792] /Parent 53 0 R /Annots [ 39 0 R ] >> endobj 39 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [461.158 462.574 467.881 476.293] /A << /S /GoTo /D (Hfootnote.1) >> >> endobj 42 0 obj << /D [38 0 R /XYZ 53 735.4 null] >> endobj 43 0 obj << /D [38 0 R /XYZ 54 697.538 null] >> endobj 2 0 obj << /D [38 0 R /XYZ 54 525.694 null] >> endobj 51 0 obj << /D [38 0 R /XYZ 71.933 109.787 null] >> endobj 40 0 obj << /Font << /F58 44 0 R /F33 45 0 R /F65 46 0 R /F71 47 0 R /F41 48 0 R /F75 49 0 R /F18 50 0 R /F19 52 0 R >> /ProcSet [ /PDF /Text ] >> endobj 56 0 obj << /Length 2861 /Filter /FlateDecode >> stream xڥZKoGWf &ӯ` 8wC  5K¡"o1$zyQ/yY(Ufm]/nŇoZ/򻅿ϗWF7cc[;Y= ᗋ>\qz. ub}S_uBxQ W[[E=Xi]Zô?K_/[>#a?Jӱz.>a{ŊZ>_#W]wX2dPmF&Bq;l{re}9!cyBVsA)`% bF̜qq%G((򕲕 s3~CE }q + f}җWoc@-Q ln0Z텅F/ۡqsa_bY'GY7`†SYτJxPO:Wr{h2\]_^9I\xؓHfwp-ZY}&Sy7jUpcpqeK$ej7V޺376ͻLΠPfpퟄ NWƥYYXQEO{RRI+WN @KQ聦H7<0M$m j+uz.j>$o}: _#,9{>:)+.ZY}8zb%t{dh$H`@Dd%e]aN5ЃEGAM76/<:il@E##L"s[FFf5ɸ |Ur.V&n-k4LeLLF em%6dNCɕom]ֽh',bjU}X- nuL].&NdJ0 Wt6,s}S[U5/wcZ_h6Q6_ԕ,jz`9+*# 'N<4ِȲM딼>,ɬ$?#thm]ڜټkO|މ4pcKkF&DHFlkWpަŠ6dN 7#kf0m::c_ֳ=gJqiP\* /@dX# OtY*a(toڐ*V ~ǵhRs"Ɓqxʪb$1NҋBYq:&&:|5t0,n<È6|o:8sBWq1ŀhCU>ϕ J'qh} ^P4TD>?&QE7-QL!+؄ʆݩUz|Z8GB.ko)[1LX'1Ƹ}Ͻ"}(#@>sIkO*UsEyfHp :ȰԀ0Q k faNti}?ŭIヂ֍ř6'+Y@Љrڱoxc# ôg̅;}4YJ@6+D/`QbfaWAPbW1Ɵ+hq5+"y>kZb­DPMx5vuF?H/3yM(dk`}-M [卒!e}F3T'e\)u#>*13HWem x_ƣw/8 !Y6 0~sǬ>x0^(}U ǭ+;w%Q" _LFk2Dž&Ϟ{q^KcN[e\Vrol="z'%6&¦iө!_6&.LVseg-2δ0X%B=9_WFhf6#q`X&Z8IY@FxWʕr^h4X}3A:Мj:&qVIenc&"bAY 1xRf8 Pty?4VbV>mBn3\0HJaiZ5k84BJ ɱr=c~ 2MijA^D`}Jwjfr4-#.,rߣ-K-?hAeS\/E*h9*Xha︋y7YP:8L(>M`c'=)N>~N6k!)rV1#ng&@ MS$jQd';Yw"aWfh玨k`|? KRźP6`풡L3lr/SheegτNM-=]KG63Ev@C5p1g%u+AeGO4=(LQ(qbj4e5xz`-?o6*dP1sr lLRzP~!&ȍam=#SҶ=;#VM&o7:zXU6k-Fp] 樂I6nd;h14ϴ.(gAI]HAOH"WSD  2AZ=TFSJc~7>BUv endstream endobj 55 0 obj << /Type /Page /Contents 56 0 R /Resources 54 0 R /MediaBox [0 0 612 792] /Parent 53 0 R >> endobj 57 0 obj << /D [55 0 R /XYZ 71 735.4 null] >> endobj 6 0 obj << /D [55 0 R /XYZ 54 653.145 null] >> endobj 54 0 obj << /Font << /F33 45 0 R /F65 46 0 R /F75 49 0 R /F71 47 0 R /F82 58 0 R >> /ProcSet [ /PDF /Text ] >> endobj 61 0 obj << /Length 1600 /Filter /FlateDecode >> stream xX[o6~À(@͒)QV+!E1`h=t}Plqk[Yl )ɖt@=˹~#Oty*:ɬV>+2*>'oϽIMk+5\ϧyVwn+ltlpV-;ω#tbgTʺ"&odH4j8mLL~; 9twSg4LJM-t2e04l=WfpvZbY_U7,> <Ft'ډY/𭴉&\&h1(puEO8jop{VshdC6\C<3;DJ5lÒ!X4zA)ِW1ͦ^RIJ Ĭ4%sVSĹB -Ԥ{7%unڕdh!#kLjs|8 6r(n eB56|Xju2hx XL,̐2qXpÂ@y6P2AP7}:^ (* xt&v/y"hM+(/jIx*82 Z=DK)pUi0u}#:wD3BLM0SqZI} ;A۬E(6HQaAۈnY, *s-FrhgF1б$|IEr/ "D4aKbna7܀g+7z,6jm0 :^G4?am!Y"U k@eTi0G;v;nkq~=JN+#0R.+؎F+"CiѦw՘gQ)h D/glMȳdW* {y=2eԃŕj}7x*/l@j۰uqG7@ T-~^} ba5+=UU'Wt L bu W:-efC>IS .=cD# @tnsC6pbz*4"r)س'=ƍreN`aC( _JB=غOxj!mw9kXzf;ȝ2J[sN?4T;/׳usP[͏eHK( D@Ѯx+5K`|[xe I25tFDSL^A%}һǫW^T٭#WHDš#nSJԄpc`w~A>r0 Q vZZR bakWA\aa:te~Y[Ѳ;R῭Œ&&`P|/_+ȸ Azr#&!zI.F7C!dqC$!`TLMfƚY:96z[j; ⡤O}d=7"Rj6ו|.Nħ@>\eo$<Ω =a̩ endstream endobj 60 0 obj << /Type /Page /Contents 61 0 R /Resources 59 0 R /MediaBox [0 0 612 792] /Parent 53 0 R >> endobj 62 0 obj << /D [60 0 R /XYZ 53 735.4 null] >> endobj 10 0 obj << /D [60 0 R /XYZ 54 533.701 null] >> endobj 59 0 obj << /Font << /F33 45 0 R /F75 49 0 R /F82 58 0 R /F65 46 0 R >> /ProcSet [ /PDF /Text ] >> endobj 66 0 obj << /Length 2224 /Filter /FlateDecode >> stream xڽYK#WtNA,G>H2@`"8{JfCo끄Dkto5dS ck ]Gy8kҶI)'Wɵc2 |TRT9ց1A eQ8m^ء&+ Vi}jYx ŧPz/~XP˜ qAQsO̖L;HyC5pCOuG">]YKo孳JNc88"Qp9iu='_r 8~F!U.z>ecSD:i<3MX:d^-.Iw'Eh,MDK4:UhGcP5e/0?\fѳz_EN@ M ǰ?Ds+槰eZCs#h@,L|eSWOp1=ۖ1ؑN&'gxqlFz[*[7Rvck)g #cZ+u1JËBIjR1R-*c^ {5zuqJh+ t7u-@Jժ}qC44̌ %1a5p 6Mꓚc i ,=*Z `gGF82g4"[](o\W[|PhJe eFY2^%'8x= [ºj}f7w>ε<ש./F 3V ͸bF~1Ɩ۰Lƃu/6po,jhK0 M #Ht)ע$ ^Tf62q)(C\ EGg*EtI18}(&j1h@tܙwsOjPM EC *uS8;m6XݛvF~4<$FTVN?f?R ʠODiH6>J.TK{aC穜.f岯˿SQRUBA/3_FWhghssՇvr#W!XqmQ2ЊγH)rnմr|W6; avmk^e9IA$o"+ endstream endobj 65 0 obj << /Type /Page /Contents 66 0 R /Resources 64 0 R /MediaBox [0 0 612 792] /Parent 53 0 R /Annots [ 63 0 R ] >> endobj 63 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [419.276 129.944 425.999 143.663] /A << /S /GoTo /D (Hfootnote.2) >> >> endobj 67 0 obj << /D [65 0 R /XYZ 71 735.4 null] >> endobj 69 0 obj << /D [65 0 R /XYZ 71.933 109.448 null] >> endobj 64 0 obj << /Font << /F33 45 0 R /F82 58 0 R /F84 68 0 R /F75 49 0 R /F41 48 0 R /F18 50 0 R /F19 52 0 R /F87 70 0 R /F89 71 0 R >> /ProcSet [ /PDF /Text ] >> endobj 75 0 obj << /Length 2168 /Filter /FlateDecode >> stream xڭYݏ۸߿Bḧ_T\ !-Ї$Wl϶RNr(pHl>Z"o>8*, )Ec*62+2Buqw_ZsYa)w==,WZUyp.^"aZ^7Fe! k 'alUw7ޔ=Pi#Q [?|`VVZ{qw( H%h qߠh_8(eO$߲@!+ŷz&q\ر=Hv]Yv2Eψ&mI6qd5يDp:c315=`N3R9)B.J4eTz˽' A P#s"bed-3JaL9HR ICu 3mhC|XuᔉC2\u[>0\Z4.Tє֥DSa.25g%Oes݆[[CXyZյFܰ!$ r"EbȿbCkJ d!Bj$ {(G!8I"\pF@І1FܳJ!p@ކنBHm #_p wO=Ep9mOOLޡ6}g5yLh!5<^yץGOLk,Վ%<[Ts@rפGblbX7cA햹fȢZ:h[էژe?k^CmT]?CRmz#v> 5 ' WJPY | 9$$v15SAbr%˲\iG۰Q@P;<oYEUE ̟e:r{F s)pF`ԏLN 1E?[K1 cҕAI\GO;ƞxy8&'wlQ蟃9y&K > endobj 72 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [378.384 115.07 385.106 128.79] /A << /S /GoTo /D (Hfootnote.3) >> >> endobj 76 0 obj << /D [74 0 R /XYZ 53 735.4 null] >> endobj 14 0 obj << /D [74 0 R /XYZ 54 586.128 null] >> endobj 77 0 obj << /D [74 0 R /XYZ 71.933 109.448 null] >> endobj 73 0 obj << /Font << /F33 45 0 R /F75 49 0 R /F65 46 0 R /F82 58 0 R /F84 68 0 R /F41 48 0 R /F18 50 0 R /F19 52 0 R /F22 78 0 R /F25 79 0 R /F89 71 0 R >> /ProcSet [ /PDF /Text ] >> endobj 82 0 obj << /Length 2398 /Filter /FlateDecode >> stream xڥY[o6~ϯ0edt̒K.]mX,fcˉ;NfE{υdIwK+fg8ggכ-m5ll]Ϯ׳7ٿsmfm=u].lqW\_}2+fiT;=[3=Ҫf?_x )W{BLLEymv5Uvgq 9'\d*/q>5Yяh2w ZOd }me2Iծ]zC-E*Òz| jkxu T'KF ;En-Ld>ΥTV ?MIT*S8Y U dZkԽ!zUNEGM G\<'q`hdlh}(VUfLSH.eߒ' N4j[6<3wiƱyB[6׋Ha00vH,4[bjtŔx`RE PQR7qήa~819}wQu^ '7|vhh9"UyLK@llD w ->ڷ[-$Xc3h)HDm,ޯ}C$݆D˝UeUIG/KL3pwdVlj/3!'Y^솥#$HNYw˰#6ЊH/gJKݻy+3^FFlC#,>yi{ b i(K91u$"HUS'R8h# |Z"hFLP^{Sz9ˆnFqC-suz>YBV܂u}܋>ytdT0ʛf\C0%NhAfa-2b `dߞ0J|+D9a70FBҰnxs+Ļc2gB{ 6_+wAnȘM7EŅZjArqvם>z }?q!nAۿNC?{"ER}$#@2)JᝓR\ CհWLlx6\/|Y=ǣM>ct@"FTaC:m7i4 ڞh/t8&"L*Ňsd/_p8E[j0K4J'+SxOlCQ@?5<)9?*@=5H#yvPL'.?i|7}Ac\]/t"%RCzO㐠G_E%~>1/@x%pG/ NXʯ[cxl3ݕR ?pS6^MRgһtl^䪎['zEm%" .'ʑz!~a*^|ՋLYt>T0'L*JʹUEә6='[ΠS'vʽ1QìR;ʕK?hp:~%xtrWseK+eP%U:dtW_]\LfWxw5\Bbp0Fٮ@Y*RBA(ˀI k?7JǓc T]{ 0×F66Yy|9йqx GXyY9 H|jKp֩ :> tq;L] ,BŒ}N nݿB x8m[UwDR5ƞ{raue)HVZP7Rn?ﳥqm z#|?){w~gS? endstream endobj 81 0 obj << /Type /Page /Contents 82 0 R /Resources 80 0 R /MediaBox [0 0 612 792] /Parent 53 0 R >> endobj 83 0 obj << /D [81 0 R /XYZ 71 735.4 null] >> endobj 18 0 obj << /D [81 0 R /XYZ 54 556.615 null] >> endobj 80 0 obj << /Font << /F33 45 0 R /F71 47 0 R /F75 49 0 R /F65 46 0 R /F82 58 0 R /F84 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 86 0 obj << /Length 1978 /Filter /FlateDecode >> stream xYI!ڸvq`'c  IhVFjt jDmǪ^UW*|Y[h:Mq.Tk1N-VŻ򟷭.s#fTJ=ΙZ}^38up`ќ+ITO<)C5z(! bgS>g`l$/+Q $M#z3Z$n1Zh7:TmX%1GGδd~3Gfb(uZ`jg5l8/,ŹiLyᒂ rgA>eou mbD[;6o`.;82q8 3C0eRfk[ ̚m*{a5ǯlrnOC0s@x=<1#ñZyh>&$`O`#޹afX:&mB(ÃL>WL` gB !˴ w>94ðJ ,%KM zԂRPd^)S)(z ;3 W9TL"F`q9-qCX5<-Hˤ, ľlyjp1$LdZ\;0uW~s&y!ƶI'Oj(rr 2M9uY1jLJ҆.s/ +| Cn>bYoLWu|2 1퇁&ΈU7v8Cn ,ǛԚŝ[e6y\^cX.6VE4Mm Ls8%?Ӓ|U?~da9|b1k y1$!Iz>6CdƓ??gvFNHԊ)Qx_p0tq PGI 2fW)R'r&Ŵ.LqyR9`Fzd]m**"3/zHH:ݠkQ/ngm2S+B6 iFضq [wRC͘`@ZZjZr# ~NuN-&)io-g-`=K:n9=tM?D%TNxH\7hTSŃ9JIhf=0ż &+n#qVƤҕCѐEWot:땊;k髇Bm.P{_Cv:U8aΊQ[ꨲ<|޾N:,/-|+kkaAor.Y5ky:\Rs/\D佪sn%% endstream endobj 85 0 obj << /Type /Page /Contents 86 0 R /Resources 84 0 R /MediaBox [0 0 612 792] /Parent 88 0 R >> endobj 87 0 obj << /D [85 0 R /XYZ 53 735.4 null] >> endobj 22 0 obj << /D [85 0 R /XYZ 54 389.027 null] >> endobj 84 0 obj << /Font << /F33 45 0 R /F82 58 0 R /F75 49 0 R /F65 46 0 R /F84 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 92 0 obj << /Length 1840 /Filter /FlateDecode >> stream xYF•*ᨗŻއ]*Q"B*$A.9qBwvv^;\xDQ=r6x4M#Y#! !Ȳl 3jo^1+;"2.LJ턞< /p1­FM т}&:vm3 vĺ3kCZSYLrMfaKwzI^1'hq HMR23/ٺ?:@R_}DpNJg: δ˥Uh?H$M1.)X#n@LŹcjQL؜*H\7V ]~km0ݫ?we҅R֩;_l¡ xi.q Q4 W {2iti.+$ABý G2TMP^Z!!txlpY%;E.hm^VdΙP*xL~q7?isWҍ=j~ gj׬GE-ngVhwĶ/ ʸƜ13dUI-?4e//<~7zQn Sk[韑m z,wAA 3bs| v >>$kGL1z YQWOz<6U'}>Ơ*$N a8_h.|#RO/#L"Q;Z1ަԱ.yY4jIo_$eWBS#v/ WnI;jպwQA>iPKzOSATW_N{hh O]0'L(gdP4ͤ(Y5؁_yF{ΛU& ҕ{x&Tx>YS"*g$mvYIu8*Hx_[.^I+HSGŭOoT7 G:㿆Y/d z"R=~;a,܍{=.y[f'^zפ)} Q1A9HYKM4g.  c[$@?X 6UFvDYVM/MKy{դ޺s\Q\=dŚr+wMy)YOa=(kBL֬HG~ endstream endobj 91 0 obj << /Type /Page /Contents 92 0 R /Resources 90 0 R /MediaBox [0 0 612 792] /Parent 88 0 R /Annots [ 89 0 R ] >> endobj 89 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [365.987 617.284 372.71 631.003] /A << /S /GoTo /D (Hfootnote.4) >> >> endobj 93 0 obj << /D [91 0 R /XYZ 71 735.4 null] >> endobj 94 0 obj << /D [91 0 R /XYZ 71.933 109.448 null] >> endobj 90 0 obj << /Font << /F33 45 0 R /F75 49 0 R /F41 48 0 R /F82 58 0 R /F84 68 0 R /F18 50 0 R /F19 52 0 R /F87 70 0 R >> /ProcSet [ /PDF /Text ] >> endobj 98 0 obj << /Length 1798 /Filter /FlateDecode >> stream xڥXK6WEh$E$mab˻, M{EÙ3yPfWގ^]L)"ӅՅU]̳J5ߎk]M.?Ź CWռj%G/FLYDal]~ϤpDʌ,>~feerfs@%=k6մ95x]B$m=j (HdZ .PRN; -.oQM#1tM/{X&UN^9atG}6_pWt-*\YeӢ"WE6U(@6mX .^0d-~ִ"d{^]5v}Ԩ]eHД㩟upfp!NAAdu ڒ;"[*l *G:(]te qCT"-V8]SB!?Bov*V ¼2T+Q 3T{?0v^Wk'ްO<QƊ\Gu֥ xc'RBW7* [8ݚ7/-YqvA.2h%s}'  j0O8е' l҇kNk=kҩ%m!b25:?p} 2/?,pƺct*rkڐebdj4f5#? _;wd!4-gRJ]!<] 0zd?s40ێWb\ԋ* 8^rwe Lj,8h|h{<0s?+VwNwLTAZaX"gR-Q\ '8?e qۗFv'%fd[24Nlb],?(sG^qs[h A=gRFBy1JU&iX1+Q~r8$%yw$Yq{(Os"_92Hv8ˆ$hpn^ƾCeWi1a e 'hХr{E=6PPDW`a'}?~'\7 ~ :Ӏ+~:As#0@#vb;@KUi#tl U%iu< 7,5 әԬ`ce'k8htgA *zʖ3^~PA  1jtk*,f@@nEQZK)rDs%5@V–r*x0rαPcoVԡ BԡɭsVM Yly^5!\Q(aꂊ˝^`@3YΜʤ2:sKVP(LQ_uc8o:<EwPEAUqSxU-눯ۗu+]ER rWvmhgx-}MJ>fx#>{eV< xЕ949#Jֈ;> endobj 95 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] /Rect [162.416 351.941 169.139 365.661] /A << /S /GoTo /D (Hfootnote.5) >> >> endobj 99 0 obj << /D [97 0 R /XYZ 53 735.4 null] >> endobj 26 0 obj << /D [97 0 R /XYZ 54 460.19 null] >> endobj 100 0 obj << /D [97 0 R /XYZ 71.933 124.698 null] >> endobj 96 0 obj << /Font << /F33 45 0 R /F75 49 0 R /F82 58 0 R /F65 46 0 R /F41 48 0 R /F84 68 0 R /F18 50 0 R /F19 52 0 R /F87 70 0 R >> /ProcSet [ /PDF /Text ] >> endobj 103 0 obj << /Length 1928 /Filter /FlateDecode >> stream xڭYo6~_h̊)Q:`!E1`h=}P9[Y4 IL'iK}HEVdtz◲̴Vs&;]fʛ:U<{1:#^b6/M| XaOcZ߄nN_:=HE3gZ7ʺ*[}(si.Ze~TV)K%ހ`˖P+S1V >nC{ZuT4o(^g$zۗXnXB[.~eτvlԲz;0fs0yfi+B{26:/"oiT?s5D7؀P{y>͌x+30=oAB韱5`57?a'nyQxKb*4(!t4lQA iL,X3HD,URXC# 6 UT1y7 mT\@9MyjGPvʍ"ޡ,"`נ}w\J/3(d ՌxM,Zj_@8xrH)a":fxp4":Á'v;B?a~˓/{(h?h57O򊒲oqL0rIx>TTsÜeUՇf@"=V3e#11H"N.#H1!Vu8[)x;d†v.âs];k4jԢЗ%mF|:s$~@ė|\͸(g"qHLE㘸r~:S)ɑZ"]HzuB ,ԸJ Gȝ&K*?[i;U|4ƪ!ZQN-w>(5+> endobj 104 0 obj << /D [102 0 R /XYZ 71 735.4 null] >> endobj 30 0 obj << /D [102 0 R /XYZ 54 504.413 null] >> endobj 101 0 obj << /Font << /F33 45 0 R /F75 49 0 R /F82 58 0 R /F65 46 0 R /F84 68 0 R >> /ProcSet [ /PDF /Text ] >> endobj 107 0 obj << /Length 1458 /Filter /FlateDecode >> stream xXY6~rH(M E aW]Ķ6BPly@lI<\ߌ$D&'o~:QJTf|dF2+"3"+d~MKn*ߎ]Lg:ӷ7p߹nЦUv&擯 dkBUNX2ayi-5aq:F~hnoXEgcpkWYnG͔Lق֯}ޢ,=.P!gXf\6qC@2Lj=W[_rH_@N9W44sHϰ%^MZ6fi.jy[GDAxq?LWWl3*AUzhv#'t$( ɯK)ӷƗ,|Z@/Կ&1; u ,X_fQ\W2X>(XAW @4"ۮhpO5cXֿ4|{n V w6L2Bs'4.nhBkF6lޚ$c f+l{wգŜ%Ân[<g68vy6iwCK8ݾB wK\i.G|!BsL+tu; w0 >3^8U0uGB&@w PLfpl٥ :lLw͎n|fV(O՚뿐;LU5Īuu1*08P|5/pˡ/}r#[>zuT"MhCZj% 0}9uGÖ2uK [~0giY&B?@Vp͒?_]} endstream endobj 106 0 obj << /Type /Page /Contents 107 0 R /Resources 105 0 R /MediaBox [0 0 612 792] /Parent 88 0 R >> endobj 108 0 obj << /D [106 0 R /XYZ 53 735.4 null] >> endobj 34 0 obj << /D [106 0 R /XYZ 54 205.909 null] >> endobj 105 0 obj << /Font << /F33 45 0 R /F82 58 0 R /F75 49 0 R /F84 68 0 R /F65 46 0 R >> /ProcSet [ /PDF /Text ] >> endobj 109 0 obj [777.8] endobj 110 0 obj [777.8] endobj 111 0 obj [460 306.7 460 511.1 306.7 306.7 460 255.6 817.8 562.2 511.1 511.1 460 421.7 408.9 332.2 536.7 460] endobj 112 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 113 0 obj << /Length 123 /Filter /FlateDecode >> stream x3532Q0P0P06R01P03RH1*24(äs< =\ %E\N @QhX.OfAcՓ+ ^) endstream endobj 68 0 obj << /Type /Font /Subtype /Type3 /Name /F84 /FontMatrix [0.01004 0 0 0.01004 0 0] /FontBBox [ 28 32 40 62 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 39 /LastChar 39 /Widths 114 0 R /Encoding 115 0 R /CharProcs 116 0 R >> endobj 114 0 obj [51.24 ] endobj 115 0 obj << /Type /Encoding /Differences [39/a39] >> endobj 116 0 obj << /a39 113 0 R >> endobj 117 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 118 0 obj [555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9 555.6 527.8 722.2 527.8 527.8] endobj 119 0 obj [569.5 569.5 569.5 569.5 569.5] endobj 120 0 obj [514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6] endobj 121 0 obj [531.3 531.3 531.3 531.3 531.3] endobj 122 0 obj [500 450 450 500 450 300 450 500 300 300 450 250 800 550 500 500 450 412.5 400 325 525] endobj 123 0 obj [555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 755.6 444.4 559.7 722.2 777.8 500 905.6 1016.7 777.8 277.8 305.6 544.4 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 305.6 777.8 472.2 472.2 777.8 755.6 711.1 722.2 766.7 655.6 627.8 786.1 783.3 397.2 516.7 783.3 600 950 783.3 750 683.3 750 759.7 555.6 694.4 769.4 755.6 1033.3 755.6 755.6 611.1 280 544.4 280 500 277.8 277.8 486.1 555.6 444.4 555.6 466.7 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 427.8 394.4 390.3 555.6 527.8 722.2 527.8 527.8] endobj 124 0 obj [571.2 544 544 816 816 272 299.2 489.6 489.6 489.6 489.6 489.6 734 435.2 489.6 707.2 761.6 489.6 883.8 992.6 761.6 272 272 489.6 816 489.6 816 761.6 272 380.8 380.8 489.6 761.6 272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8 435.2] endobj 125 0 obj [667.6 706.6 628.2 602.1 726.3 693.3 327.6 471.5 719.4 576 850 693.3 719.8 628.2 719.8 680.5 510.9 667.6 693.3 693.3 954.5 693.3 693.3 563.1 249.6 458.6 249.6 458.6 249.6 249.6 458.6 510.9 406.4 510.9 406.4 275.8 458.6 510.9 249.6 275.8 484.7 249.6 772.1 510.9 458.6 510.9 484.7 354.1 359.4 354.1 510.9] endobj 126 0 obj << /Length1 1888 /Length2 12013 /Length3 0 /Length 13183 /Filter /FlateDecode >> stream xڍP.w50Kp .w.!CdwUT|OO]P*1;]YX b,v&6JJu-/1&`/qgLN f `errXXxc0qr@JqG/g1yИXyypAf&W+ۉf&53BX:13{xx0ع098[ 2<@VU hMhb%@ \x؂̀.on@g5Yy#Oc? wlbf`hbXl%)y&WOWoC[7wDU&ob rtuar;[%.9;x{,@I92k؃܀Y],,,\if;#7ގ7@_puvz[`2s-AD-o 豼+'2we}O'ubboF.6#' xl+[8xLk8hKk\pQoM ICQ؁l2xkZ7׷Ppx59bu5yQ{Kۿry͕AfVʟr3f *;~/#+ mq5*f `lvo6@?Zdx# ppF}\fߢ?7Yo`q߈O7}C& ^7GfAV3oFc`FCwps __l/?m9ꍥKo_)[^o叫-%?'F@wrx3wy8 3_y/7n*mZ?zCC:kE <w&g)wi;Q`Shk6oES{߭nI܈,x6†%?<%N#,NaL6|#'dTyq lwrAQ.ĸlie,l~Ge=h9Ӝd0Dpt瞨s7y$r 1%޺?bXTgsƣ%AOY./\厌ZO^O9Q0+@ ;,VlR@EMJY.mTM>\nCx!'RK7!>>gF}RBB.eNW=GdU 7q e  jڕ/CIژd GEk1g=XspѻJ6l$#=6sVvj"Pcӏz%~ a-hk-\յ1%Ϻ?4¯G\&?۴bx odsf@FzVZ)vrp_;i>"ڝ3m٩.\d[EPKoJ$(U?G}! GftHy;|!U'Зlw* 0"kXU@nť1,4"'YP;ߐ%VRtO,;\CZ&\8QL?BLv'CEfi I +@7vT!fPެ1|y̺dL?uaGFx%6( 6HẰ>l&O;VVlVʗNt`0I1Cd \Kzr+]ZY_evDsSB2KG?)W*r*avy꒶[! #(""TxйXnQq݅d_vL:m,dΥ?]ϸHǞ$C.I{<>y8wrY[efFh DLE2V])P0;i+,+0*p=Z Z3Xnq N5ܕAs<7+'1.~#9f'08Cp=6*}Y"w9vЈ!^8c#q"*=tmXaongR"iZm~zKVC5'N&F≭ J!7{uG*;QK1"7aɽs1>$_DL}f_y3$pmaP'x޳Z MaYi=tUDTI%3w~m&Ӳم%0~T= XSJ"^Id7$W7ŗo>|&f-x'bBO3нެ&邔+?|4:~BGrs}MһBI4P+b U!+?Pn ;? vplIf\Xi.Kl,dfGy%[}uBO{9lw0|2L6ܸ5%b(Kh`L(#}maUmyțbApYXk펢 G_'R-,#0x'ōi;;Š3V|tqְpZx& c ]^HBc)ū AwQܻ9NwO6=Kjeްx[qՔbrh S:([BtaMma53דkm0Ha:J݉ȘEAcw):kYuW{ >4ͳ2B^U2ӘYϵ]na# a8_qm'r;ڭԵ 9KtͳJa?Gʢ,Ǔw7S >=J }N6HԨxI Coi sRFhLfžަnJl v9@ԾzG#C:bKb PU] ;NP復$'VTH]?< 3IEԺT[Lf&wߏe$zee{pvƻ2pygqjzK?'[#9TBVK[z5x3c0 ytI[ Vh/` iGR}aƣgDTl"e1X41ɨFcv"JNn y_"/)a.KBI.{,Сid"]KěwzjH%ڳli?& x"f_ݲܘz|a Lya<o8U8I]GƞN{#,JMξ*ÿa4`,Thd߃{)F9}q2nqǛ{\=/:-/WNT5m__ϭ: BWOy]I'w4N)ojpSYB(fC,WȯӱOI&Vs!:<}zN60oS!5څ@ZiUпrujB-[,WG9?,@ynD'Oz7LV哐{R!EPRI+s6DbsE$@tN/?+df{ZW L9U FD3~ā^Ϊ;sABzK(9f%艼HOlLqm9y3ٽpyXSRϷ!dr70:#pEϚ<%C)#ɬfwoN?aO& wc4XtǸ)u+}Q)0[^?+# Uim8b}T]+d)kZǨkn;f[;=mK xx˱Ҵv5{4|O# H8BJ ';#QP \wqF8\EP~T5Y( UZٝ7{}{Vcr'm(b5Xѫ )ӐiLI)rʓ\$KC7'恾'wN+wIJf?[U*]{沇Wfk h^HcusBhz;-EP1Ʈ!bInhDۄ{f`x,@kS54Ӑ߈/h#}d7㿐&ƇUqPi2Ǖӯfu$yP6]ߢ˩s|A{CkG?}n5K$/x0 ͽH:l$0ZfKRժΦ*QF]}f"{\=vP[ڤ_//$[D5r*nN1Ӆ{kI6x<"{v4ob`55H[.6,DO}VpYQ=KGlw#~ 2  <;Zn1BQq]|Xm:]owO44;Ȗؼ::[™%9 yHb@a{6[qi0,h~kqӂ!*EԚ[0 >XUH Uޞ~kxhVc$J'$H>VGKE,R`{(堥Q4mJ5ŨI7 jL gh0XJf.*Ik&^TPNlH|&x>#]ak*54WUa;5}6h082pj o#B"S*"$wU>w]@ 6/:KMyFC݉BmW959R[f$nߏ>{L3ob41kmKB4OW+;mAA[7ƪMhA02 3NΗ ̹2j=>BjSa؀|V^=V7<ázI'fQ/<>(UpY]_`H6>PDOͰa[1pbaj0:تTNFKiчl*ԝb,D)yĺD֔\a:5nZ]&zY{'0n9+4! y{\ړOxv d<69;A#2: {`<^RgCRicϴі WR[Dȟ븥N,؟%0)#))jJmDAbrը@aVhOq݁ -B[v/yhХD/Rڲ S ޞ~F,J$$ٺB򫷲8 X !̽_A/`>U%3'a,Wr~8)OxXmJJ>hܳ̍6NZ>9R-(qf}dQs}x*,HRpZ8AQИv]Zӈ#]퇝ےK6/Q0УW {0ᨈ5;Vz~y|CTyh#](kwIQ֩c>_ѧ3khڴU8Obhԑ`+EC7hɌB/g,d` " <1:m.uZ>]+.w R4aUZ-X7Ҟzv[5<#&>^bvti.ni~>gST^kQ?4GoX*-OGlҜ{:Aԩ(sfܺV7U 9#޵?K~c#?. N'@P P,>Â#DeWXqѽA{85{3ˎԣ'SM9\@RnK%P2dxwX %U/%VեjlF#SEG  OkٲA\Fbta[n/x'5|߿F [z:˚=~\['w;b8*|eUV &R.i@ Jgg8,u{њJ4rˤ٩VRH/eЊpY(؅<{IИ.Gݱ<,|mFCsOӒ9 dWHaKہW JҨ'EUG}Bx P]!>ɬ+EnakDO< =GJ稯iED?;Kt\Ӯ Nʘ͎Vzi[E{E$L Ģ[ݡO'KxV,#߲%Y=։~.Ο0d\?U24.Anz_jوE,>‿De |۪&4?p"nJvgØNHcDT;L/dٕ,n|N[l_sm9ºfyy} kgũ)({Wk'P5٨r[pguA S]+Kqgi_h Cjsn7idW QFJ2V50rl4;VFo& j]T;_p7|?@ ̰XN bjm:ay8^ً"v6up *lIqO0 ۲ϓo6єMKQ?*4ߴvԆ~尤5n&&8C"=i/׃3Ӆ `Hs%1=FwR,\LX[T]BJ?=2Xmݩ8mѿ?ih/,v#3)N5(:d 6V- dھ3=TO]/o{ƢBn %f9T c>#jE<P Qy<}@ nє,p8FVPJ;912A7СD+A6\p+HΏͽkAY_"#:clݝy*)w9%ѿU+[ ~qy:xЂ@vZeq_ZXn`g/|S 6zaWTɋ}Ȍ0z}cGzrG-O`c"l2dl/ 3Sˤ[|愮0)G@/81zn չ)W;̗p\̹:LM Oϫ?w1Q}.l g*>l.7w[omfyY0RtGe|s'O4}T.٘e,O9MeKHQɍRRBz:sߌbcy `[[<m:J2 (HMuC.c)Ƞy/NG#Xqm>e0vv?RGCo0187`2fӌOhh*-#/.x7z+ ܁}%S\U wý8Hmx]3Z]Rnty1Q\YXsแbq2?s\Mjl<B 489C王jJ#ܕvʅ  sMȡUCP}I48v5Zi+o6C 9OYMOH+gjPe;+j%:Th%?nwuEE-u4ROÝ -0* e6vMZBc]2nQIYxc#ȸ]ݘܳp՚";+4j9kmX4ۖS x餳 S72 "GgKNѯT2]1Y6 ^D9T`-L5Y浼s-p'a҃[48 Hj;"R]OwoֺԚ QI/|3ʿOc= g)Ɔfմ2A!zeD$xAb.>@6剦Oյ ]%Y>QhMn0"^3_!ѫ`b!$3󆺇k嚸I}MI~0P KA 0J5Pk8yFb,6?ױ./-s|x*mkrrL/~g=EwVнDzݯXX*)D {?4?#! \*AX||po0|q_^&#g2^T b/' mVeYn}iEfvbelgJŶ*aKr1&^]QU1:|آ;ጴ/M%iQ`kBզ9l&׽R_N~4bG뺤qdi2z8/>}QsvWH:Pб[a@O3 TciWunKDN*yc օGv )X:x9Khw FOPK p6z_?87NbɒaVKyNiFRPu3m(':rM4L e*9-;qJC8 Gv}Ѫ>MIJY\YJtTD6L=tӀH;?jX DҝoVmOeKQXl8X 6fvBh_SAl)'!VbN(즁0Yf&C! Gw(h, s.D(Iwi0V\6ѵ_!"j1I5B Y$ǷRkx2=>ÙBk\tU +7U:9z`&i':3M"QmViŠmmArqh2PSlO#ooEk. хp6Ty4 qNo]tCi,@D'["vMz‡\̈́Nh `^pΰ~1 oˑt%ם8;˽08D:d@{Hx7 +}eg3>͔Vȳv6t=i~\%"9ykD1Dʙ@~ bi/>_=fZXͭmi۰e埫'`W$ed\Nۦ aV/(0m5ܦ_ I?TՒ(֏V##GE&0`B!Q >RbyYS ?G N}h(5bmZZ<8iAN/?0LjL=ҦOzS#hwiz!E|?XbAʢ\& .[J*>l>EN}9 /();vnxo؍_~AeqçȌy}2)Z)a]Tw T`$1zdGR3*y endstream endobj 127 0 obj << /Type /FontDescriptor /FontName /LJFDAK+CMB10 /Flags 4 /FontBBox [-62 -250 1011 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 108 /XHeight 444 /CharSet (/A/C/I/L/U/W/a/c/d/e/eight/f/fi/five/four/g/h/i/l/m/n/nine/o/one/p/question/r/s/seven/six/t/three/two/u/y) /FontFile 126 0 R >> endobj 128 0 obj << /Length1 1396 /Length2 5940 /Length3 0 /Length 6893 /Filter /FlateDecode >> stream xڍwX}?RP i7FIwƀF ]Jw) RJ  )!t3yv]9=~m"l!4(X$T 0$ 񮈿n3DdE@OQ@W X ߒ @4VD:hVEc|HG'A4FXO=g@Okn m0A;འXpE(e ف&z@C  s9@0_x Drh7 D90/84 EBaҡ@ e# pp, 㐮?{p({U~֧"{3\ D;l#bB{ `*uQ I 'H@?0aM޿ F  9hIPgBp,%i-9ፀ&'pP*e/a9;BÅ6QۅD)ݧ` ;~Ku>B I~7&˔`{ntR*;pSU!ɋTNXA{gUiٗOfX?dYbOnCc 2oʵ*ii^x_UgUXi6ʏύL:?U gs|5NK֜ɝb_|h1*h$} I8 Ol.:a>S]#?oظTS+DxZ:%eOdz},|ﴷLWƠb}k3 oE^3cU}+E徭n_>E9rwD1 D(^FoOTjx7u/H Y{{A 4`|ɞ޾&k6(XaRBKa2hXa߯]1C4Bc~SՏ.ߧ7YK|۪<ۜ7V2Rk|0b,;W8,m9ahkTX {^l6x!'rݡAc\.Mܶn\4ҋB!]z!on_eGG=x1 :_7 #8P<|Y?|uji9 `B4oD)ZVX_02|m_8ƭmw|q@'H2_U؝trٸ:QCօKMsZD*Ae0sbWhVM akdWW\Bɲ4+!NNv.(ׅ ?^G Y6<) JΕa: - ʑ0+&Ø/g9>+l_hNV[~ZϬQ &_) HzU IhkZf@<ЦY؋DJ$;@.*g ^w>iYUz{ҵ] ZʺuQ32ek96uP-0틗eN;+g9F=-,;\etٔ#T[}${إJ$XѰ<vT8%b[vv|-bi^h !E$Rbҫңw(,>}k9rfPPw өp/4j?kz bGdu#L{{”IabJ댥 dw`paibپ o4|ۃL?wvgxT>KqIaQ~\]PcҖNbSχؒkz_\o;=^DAҁIXAl $ dVBw9cs7tZ|Xz6#{F^° y#džg$~DdIy/ԖAbB}uՊwȭwR9\]Mu1\F蹁3)$Y{{Tm.~ nW t,&hHSI~n >. R=xj"H~BA3<3{QB|-x/LܔFN!՛ R'^RWiaV@oPXcUw6#G퀇B )fz>A;i U+|'Ŧ:!:+5gN=0(l%}3YŸZW3תkD}s}O-"șH3va+Dy-D #l|9w3vm4WLL_^.(GHy멽PNnwcP֘5ۡ{ET7*fj"#r:雑']q!U$;OHN]Y ) mK]~ ^*RyJG,YIa81'H%wt! wS3[xJx׾Ԝ Ѻ>oMu)Z=y^34k[λ-ct\Jq5K8L්oQTwOܔ}'>gڷXd$I,m̵]kbR,d6A,P$MxRuL%Y>4,$M% /ߎ8uyuȊB㹍?ƁmE=p-9aV/Z3Dj ~HD 2G,oN_ "\A "yKR lfmbt|Pq?MЊs#⛻>[(FV3^Ffr]8OU3d> =p QAMngN\*RC%Cosp FÃ̻1Εַ[!qu܂.`t=9ҠA .;W7 zImV^uL\h_(~y3^QNuyfs}L ~|Ik%Ԕ46# S]g޼g-P f:?: t1¼~}Xl&ܮ싮XW+[| [yZ[ܑ!ʖd-QylmL/BbuLlB̳ׄ/(p.\mU8-wQ##0Q4͘Y'+M;؅}(Taf#vJ̺U=;bhW$Kq2},Zam5u5pz3EBx""} 0Se9dtpЇ{IIirFa[_m6K9F䂛mHp>MmDR Lm\R)%{ޣ)[z u3G}/Z'b *D?vV%Ut|М~EHE^k F,FɄ~',g%LvuJШyp}H=}apV P獬6{~)aYr9c/ ib"݆}Y=H}μK o̓lw{vR ),N![6|ay(4lǒ* .qlj2OOx#by:#<Կ|5ّu7?϶]xp"!D*[YPVκ8wIIFVӥÙ5H x+qyO0jn at`b;FkijrUsG8z s'uI Lὢ?ZcgoS}`ZE/?Kݦvu/0@&jپ(bߩlҷ_hr!;s~˒S+U|+=k'da=. |rLUd*׃.]V/wu))vdbQQ>o+B'؟}5|&żQiaPQ%uukE}{|{k6q-ۛRbDxʩ&Ez$^AbxVp;)CoLݙy۰](iBD[ݰ־%2nW]P&49IUƨу .7gvLuwHYG=MS N 7SK,4EQc&kU['(SA\DͿf$s/1Ya)vUr9QJv^bc,R͏J2bxk\^+-R@"_^9P?I߅U~bϠ׋ D[o7dsLL5#.)j!vGJm_>!'#LE?ď0SyS 1jzc{h$5@.~ty'fw:skxT}J~W(3*M_xn!>$w792Esǘ'ΰ"<` HVGs%&ܬqɔŦ8Jek6 kyB6e96B\PWg%ۉy>mnBTBUp=:)mަo`?--q91srMy*sMc^s2??>E>6nUսəxGqs<` N*X{D{-_4־F^O%Au3BLT/ݿ厀d20|Mhbnh:M\Л;3wt5m7A]boCH>rVm4֎ROpvةm$s֌z={بb݋YNYmH=*`ˑtxTqoi=r2m J_UȗNixk .&.YgTMI}{/rYA{Nw!|^"c/N[-/nL$Ȩa$ ƔZsH6 M~;绂 9.>Xt:LHΈ%ze _u7,>Mu* \]J1EHqoկ5j7oI hC^pEĝ dMFl&]J WN֌<it41,\M&SJCKG|ʸtwV/X=LhK7q UmV~VaRO \ LnAQ8hAk{F%3U &jGA4[#VL׸<ЩjESsg>GPK PU ÐC`1l3o"wm&yAr^փ2L|2LPב^ߝ\SegFֿh=%d+.L'Vb{P9:SKݾP=D,>c).]\xLE,bs*٥Y YZG.od}v0@UUe*0ܴol7u\>d#e=4˜#|ahMlq|\@Ez˒pڅvӁZj\$GN% V e}qPt#$FzCyXv 3`l*)` |vWh: endstream endobj 129 0 obj << /Type /FontDescriptor /FontName /RLYTRW+CMMI10 /Flags 4 /FontBBox [-32 -250 1048 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet (/less) /FontFile 128 0 R >> endobj 130 0 obj << /Length1 1968 /Length2 15439 /Length3 0 /Length 16646 /Filter /FlateDecode >> stream xڍP.38www:ww;ew>W[S5>O 1P΅ * GAjb[ GtrC&fa'ooq09x9y,LLch3r43dpN.i@mB` l t41Xm?2TM,.Łݝ֙\nb t:M(bGPtKbon|l,Mvv@'Gr@h_t{`f`Odi9PcppٙahdlofdicdagF ae98Y:838[A0]3ڹ8Q힌jv@iM>Dṕ.v&&&NnV0`#O%@_K3 33` 4'h8|'K1IcLl<1|ehb @`c8?|;eWWm꿗߱?guؙL>GO #mwA66F6| 6@SKWv1Xa;sYhdbb״%Wcl,JΖ\+_2:?FOcs;+0rr28fESǟC `dwp|;qF?D!' Q `b08 n`4}X}3l#F GElleQ?d/퇇GBCoX ~Pf/A_}$"\:SG; hOQlpo13ӿG6/_#_fV#@ oUCHC0;$ŞF: St MmvІӝphڎ8 &$>/ g-Mc M 7Ы yuQ-CʅT> 8X:Cr>F-Z7l8gʅڅZ;L-I k&Kz*s.96!- A O򒵡%o|%ytik( ,YZƗwS!TCIN ]Y]f"wfVi+ܳyD-〶^&ѱ!ֱ^_2AAswO:kK'e~T8؇u杻{|CpH6˄yK5`Nͳ{g|S]ѶŻ) .G9ٚ|c]fu~S^{GQL_[,zWAiȮ"gP)3c׍ro;O Mc쐼zay rpbQ/*#K +ĺ%9ɥ,(l8”8,1u60MiPm^A!#I+spE! Kȸ[,gpBiצ%Z-4Ri*Dv_2m>%[?[s4d(D pY ʻUbV| X#o eg=ܹY2QT0TbstS9iR^s`{5؟2t^'v3w8(N5ӊ#BrɈpr+Y0B>z(% ;ZoysСEn=R< Ohz댥ɺ)}*,U.cwEa* q03OtJ^FnOK%QKZJO7pj'os= RT B˛.E=:4]/v9ZTF}-TNvv)2rX0ԩBp ?3᪛e%7V/a~~@s>Xk]ȖtÜNd+~朂7t}e);}w"< (q7 v9o&l;McPsgtSrݻ,J9>n6dto~YM\O -f^n[ "^5cya7,n0P`G?5AHpmRWqݗI`8$`g#cFZ9< eV1#cW#7?3Zn.2L>; ]TF%Q<"]\?Ep)d)n-KeEX^.5*MA9Fb_.Po!QiH @KqmB@MCBB9+^h\*o<.2VBG_ũ$x'1Wb+U];-ȉ2'i'~8Ζ FM{1)1GTX&YʤʯP_5Gme9A5^>4K"R7ղƨvߔCafH~j<̃JkR׶=g,K@1ȮQ-u,*T<JZ ӼD1z3Z XQB3xp 9bRV(;ΘNAkpVkk jVlx)SkW2뮀4f3^Yí;& B*R|g@7;. JkjaOώ9Z\" )/[fY?JwH%+RQg55^}_[۴cRXM HuG)JÌNpX0,k s*u:ıӏu]o! I%%U~b*uP1PBq K`s^'br+874KJ["NmqkGgH'Ev[ +?N`-Lk=O)@W YnTö hT*;}bǗm<_q8 nEm[j%] $K]6cƷ/6پ3WE< :@64 '|*:4\ҟ&){};Įp9pІkU@nU,!O\̊)u@ *1}e<vQeh|;>l"nꀪl&hRb6Gpp'4u{ \YtIQy6T_w*mlfe`0D 1ZAS c̳EZbNd$l׸xnQ;^/>Bo+9l4_Q=A-{vαLvjm+RТNf(Ge M}gݣΕn?|FWGҀgkni͛DgZRMT-~O2*H=+ZD0V2_GtPG֠lF.ml_0 d_T]RnvJxS±b"zQ+DEw $$`Eçaa+!po y.&ޮ;S&9=:"QT!Bj(!kw/<` ܟ|uI0aYV.G]w%ǗCo6h#^Jij.#`:lZ|]Ìv/pG&' .CZ<i}[4 ФY`V`Q'zx2hں"ֈETMperåˊyf(Kx-g w\ƭN)t*EW||6\KrH/>^MUA;zSk"*a1ٍ0P PU4I; $NZ^%|%aNi¦ҢpVP/6W㯑ٲlx&eqk)EMWJR` =a7Nώ,MK)qbjj7H'GwBop -:aaoRB'#b{n 5o;*zJ;X_Uʪ% u"_59*LH`׬R/~gBۦыӆ^@㶅{Nek*HFĿ엓դ\mq&~ jf}5{Xn{q2ʿTlg!*'d'a74?krtHኵe+?"RSՓ y ċ*fX80c"}WCk`a &ckX'q"cƇeEVK?~O:/[iPxJcMn)E_;w4|#ZF, JyD*A-d>yEf{Y6Gֈd5 oh|~daQ lӟ}~+< ϣX>Bqt %ET/anP7M?L'<9+ H{wxv849]1TxLn&EWgvz[`;0o$`^6[)+4#9aI86bouEy kllVl3\aՂ=CZ=GnÐJ%'R7yRtO?n9º&jΆ!I+GƲT0]2LuRECUt mָ17\~~ 02.]+?2IR@Q 4m?>3#`)%Id'CI]w:gIX ~ƻ0SǢF}?k`/c`N=Nw6P[FLjtMh4y-nz'9#. p[ڮQZO~cyH,[C$ M =#Zx~#X+0EkFgULiZ8XS oPF G21_`q$-6v|_ˋ4 Q7~]WdۮX=?T*pPU"h9 /e&ZU·Z&% ^?^Գ MucE T*<\TZgf48/.x`R 2ּ-RNl ?f?əįz/9!NE FgIrii32{7qˉ,yy4˨Ow$_'#k(_ren[Etrxŗ#s$_tccچg\X,p;1I!Cuq|fh"f2 %Rh%K`Vз.[DK^4aq*%lꦟ˟G5)MW8d:M_F&Xw[50#2C]2$*D9ú.Kt0 ˲b@k$tt][Q~%QUzGveUfla3%ZSeX[=d*#nD$eT r!E[W _YϸQ+Ju}iTrv*&dPGbZAZv)JZIt!jE.S']㕓9.w R }DT־Z݁[{X>YTiկ7hBT!o U]zPҳUGߪg>5 -]qQÓVM~ÆE Bo|vֶ)Ǽsi W4CzVk稑뉕~iek5k('w1)Bi, %t&q=_E$(uݏ^ڭ4w#]":,]tZ'`nD\VZK>mPqYƖRN܆ko"A&AbM{Ŏp_SKƯ %Yqk#8Tᑪwz usl[^sz&T1&,*R\ 8VE'g k?:[b>ީMtw1\=Fߒq_r2tz)5FzƮguޅraAҬpcݛGm|U1_>;h{Kvbxc- 6݅ybx\}SQL/&6.Bj&hV:s Lg+vE.Z">=sn{[AoЌoO>4eؤt0y$)!)GFC",ʖݘBߜfitrJ26(J[̅aCbKzsAQkEY0:UJ ^宦+;L֛0 W8wf:,y8xz11ٕ4bjs#;XiC%VO\30dF~Ob+xoe wV=?l2e~9ew3*E]=tФYJ7R~n:22Rnq2I|hq%ET`y*e{kA(ֳ+qq'\@?r/.n_T.nF'fGtssQ`=B,@CY˵@ZiDfw*͡-8( <W-w[6i֘,<AI(M AfMU4^M ,e%䛏2uXL T$z+t5>D\א<G8(lY- ISMfl1yD|Dd+|4j?$+=ǗZz-A)Ey~ Lv+[=Uuwm`Ay,ю|fzu'BfC+vcN[x-\ȗ)J*TC$!C$'kjoFEA¤n7ą\|bC0L|=7coڜѰG˾4)LVyR/-1a.wY2Y?JBd!{MtkA" mX}^ ^lɢ{g% 4/s ey 0!|Vd{[]ȍ9ѓ8FvDILc)␳7UC:"d; vbHCFvyN."bG }ٷ7ڭYu *P#I ;epT9zRQo.-y+\4K8Na㕈pO~GWd7\Ru:ҫed ){1! T*uquc>_ uY0/z\Z&`nע1v#~zIӐJv-…h1a/aЗ< BE|ry(4-17c-=[%z 'BU2v Wv"'GyY"ŧYEɒT/-: bvH ٕMk*lފzNk tOUx=$jŤVjY?\6p2d\pk-D+R%#qLZޏ}H<jcX~a=oUqciJ.5\6qQzv7^758"vD6w!7~VTfK{ 'FN a8@<h)k=otobpW`©rZG$CWKSP|YȈ;^W.6tYM֏ p6o4+]+k!Tr55qVR~HYp 4&8/_aZ:IEIK@q{}]9AYubeEg33Q?' Uᣭ%,ﻌtZHY=k"dk^= V-L猟NKo@3"S#W g ch;1yA;g"t8'B*c:j,:SvW]Sw1ڒg;WȘ!%QFM&WQK'j:w䵌U@;o`5LK!*\r J=UMAKZ d@sԀF50D9LYq]0 4j7v؜\{G&iZ0*U-s`XSARc1w/D5NgdP*_$u₴k)<8{XT}.Q=[dM6f[kᘩ fz&ɜxG+x:- )gC4^S U2Ez<b/HHoXC4efM)b4'j5Lh/Eg X\^zQ%:r}zWX&V]m- QEKT"W~rR̈́\ nMoɘؙe6f3GI + ^xfb֌6l %U˟6\vȞ;oc,D`9(ޛCnq[j wI{]V eAO@-i=6 /!(eC2<_E+]c\0&̣A羚Aya,"!)nFWB|.Ebٗ?!2 lczpGPZQald;1c/t.oAd@{ńn+#ssj¼9ub"uZuj0߀*\Adl'V`h8po/bM([%)2}4-8OI><{\ACax< t޴n HXewT$ޏ`>Fخ@M uUGuiXģCG_8 &:86] U{mAقcRcd:0Ƙ.ޡ!ufPh 2N=!bItwXr L0y@; #n LfD# {Oz_0} 8vf-GHs@FM0_sva.&En/N3!DE{uNCp7YW}+ ?:iRZWv̩4CQU/"2{)cX; DtiW67 7oeB jM,o)$ y6){p0U$kS9REMG?# GcUfs^lOppkv[iAG$ؘPNX"ĤUԢ}RCշ{WXԷ]>/<̙w,;R>GoŚ'5ܡÔ@vYkZկ$_kvK)8.6%鉃p6b/w*?(!KkԈ\~5y)dgy|VֲS?B*mrA L5>ߌ: endstream endobj 131 0 obj << /Type /FontDescriptor /FontName /OJYHED+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/A/B/H/I/T/W/Y/a/b/c/comma/d/e/exclam/f/fi/g/h/hyphen/i/j/k/l/m/n/o/p/period/quotedblleft/quotedblright/quoteright/r/s/t/u/v/w/x/y) /FontFile 130 0 R >> endobj 132 0 obj << /Length1 2340 /Length2 17670 /Length3 0 /Length 19037 /Filter /FlateDecode >> stream xڌP- Ip[ݝ  0 Np \5#{{*ޫTI^$akDWaf01201 @5@`[:N/21Ӌ @b`f0s0s01Xց t26 GDrQ[;7K20sss96y9%1 jk 9W*>s'';FF#5dP9A& ֠;c@$ښ:@d19^Tv 6 ?l3h1@E 9'W':! [^ V_=Gc##wü,nc"jkm qrD]dBߓumLL7acTC@b@Nv&&&Nn6r56g^/;[;K /)#prB'"3 4bUu%Ф FjW=.r>JlG }1LtzUvW8si2T?_P4t~T3,A`q=X Rݷhb >9.6JR+N 9Z(:BXlcBٻAY\4-OcB;p,rO QZr2NLN-Ar?%&74'|.kR,f=ShsɺQ",PYЭDvF>'@)Zӓ6ur0e6jJ۝T2A )g Ud`\2e'CЏf%jg 1̜5+ݡuMp J#=P&yPMS!Bvg|C16n&%WBoB)c\^[ʊ^{gŜz: " 5Wa@=PT<Ui]R 8h2oυkr)Gjm!y&Ȥ! 2$o;I|ը G8+H7djW*CPY6^rOQPqv Aǧy6МevrgV`Z.Uk ;%yb6B* 8( 0rHV>ތ*eأoj"iht|QLWeM CO62P)81zve {3*wE~fUJq]&]ݮG[rrM֩hx2om#L Crsƒmc`c>4ZQ́*M0gh߰GԨ[9wqPC㏓ى~#Fj|оKs]萓aBWZJ.rmaʣfT$jd*9QAqm=FnǪcJ1eN/Y*E} ou0ׯ@E,vBB0`@MI/1glwfn vmN凭J牸m nRf@\CG r]ܬйRcLG*{˕ w.ٳp":ߕ#Bkӹr"eSo?B7v_<52aO&ebrȉ%\K3 [8Qp0RKgJd C6p 'Ԗ8\n]3,|C꽫ڸ;Ia 0@ ]Z v¡lzFf1"xoW*0Kxv]χw c5(a|PoEWR89k `*7q<)'+9H>ؘLƹ`P,G&ے~eA[o+}RC4҃.U>ZKBDLXgyϢi/p b 8 :\Oڐbv Q:a`LrI-~F+w-&WGQGAd׌8o}J'.\t/EHрЮ.Rh 8z^ЍX]1j,*`7@oLµShb{h.BU¯=3 $Tt#v`䥎_XfqhȢ[n  SNFO6M9P{?u`:t|U "=)w* *: xJg=[ k+ĠT,ҵS|n؀o7G膐~.Zv2:c;uQO^h&aGQPHZ;࠭l òh1+CACe8T$Gƃ7vpɯڲfD Xֆ-0) j$9H'ކw0)0\ Ey "U'1ms%i|C2!u|YRsѪ(Q림׽^%yx )Cv2ߩu(:hUVRJ|cZտ~ϲQ ^tᜁ "'t `+kGOMp. 1eg°o& UU>6jâ0̺(l>Xa}ڀH}8BR8m2JC2=c7%X%J&._EKK]iOq0u$ z*&ܞo񔺧y1m:1Y rpht%McxB6/ )rI0MzYRGМp ӼԄX=Dc3Mm~GCZ~ʔf3/arE/)]}™ޥfOm)*"O#,'#bX+*:lS;"W'b ,[*ix8jjHIJ5~'v!9Oi!ȡ'شc|?r+.oZIKg;f8Ъǿ^{3LD|*Mip16Zdmi\,ʵ>:­f#?>( iTҘ,WVYo׍҄c"t@l.kh'k^˾{yZk)4uZT Fo/[T^̡?:wCo pՎCy(n!qEe})6C awǻR? wLsډg-iaƸJStgYY+5dΞ9ZywTi%ל#Y $^B!SM;p%Xp&T/%fd;Þ ΄5T2|81o;HzyaݪXBW~ 8p\\nf8r2h)U^.tf BDALX<'Jx "_NE*{$llOk%>fWo7 'ܪB.ؗ3ts XSٶ/?X}wkjY 4YӲŠӂ`fJ"3bUҀ|jr&ۨM$>*ןbAD)ȡqROͳ”⾥)z_†z2.?5h>0D8oQ"cɲaLҫo/2j/~Y:& 4d#J>Y+U5!6HjZ%¤d6^îǔPC(: CE̓GrTB~/I~ykUCwYt(@X$q>X+_RbV"%Wn\þjN̖@;F٩×f vyּ ntSlU]dاR``~ f2&ݒE8M`_v_}#(Bx=5HDɄj@6n/yaz I4Qf_~KXwUu^VPoįbuOr&twzHl"޳JECށ EMK% "9!9Sw!ٰwHu} 9}fzkCi9ϥEB0tj j7].kU2?z;y~{!2ןW5vW#,c^wfiF26'SiTUԺMXr¡Y1wetX]C p\nc5[O?WI2QN@hP\!-:rL\)r(CT!K{Z,4&l&R~EiU;uI;TO"ijddA?bx?KU&iLSI(8\c-G4 AvNS`hwӑK\!U5BP TGNfDRWBf2jY}zPB>o*#o1' !6OnP8݈ܶ"9ώSxz}ń9/7%|^x=Fmzkj M`t: 꾍uV]?z2 KhيQg>:bqdC7 .PtZW Tȟ{go 6Hĝ DNT>.l2b/cWo'Jwk~ַUyOx &xcr;gtNl:hƎ!Pв ZJEQL/TLl"ܛx&chI\ #G| 3xFȉ\{vnz92oX;S@_<`q`-h ͣhbR9WY8RU2G,; Be~Qyڷ˜Ё ]읶ѱ+^Qهe/6.Ō̊:'5`%Wg2U(kUSu-7*wpMh% ҹ+Mխ>r7~H8E;jI'҇ >bƖ?mib˄Xe.V4cJ=*t>;~[TW3㑼27 Jށ-pdwbR"C BwĈ w7pr Vk?R6j5M_ "W>|Gں݀_QJYpBPݧOvQ^Z?y&Ux=ޙ.l8< Rٝr +ڹXWvy D% 0wwUWŕ~M] QcZ}Vi*;OJ˿9QY$+[`@7Cc:DkTx,ɌNB "A$I'QFVL[\6ŊLΪږ m20&x!L-dngdݒڞi,*Qx&(CP_K쐐䨧j,t疉FO^)j4mcYiu9%O.ʴұ*ɹ~~Ö$sA *I%a6e7|el4x_r Lo9]K =W[h3>r,^3j׸-\~֝P^4w3"܁-ֲgRZLVA)0%#6ݝhOL2|7_XbMfҷ*lm\B!UWW2hݵ[ rҘ}DP z4 I#毗ю22>D7n\Mzaq{6Z sŬ"} 6sjUd%2-slO~'<,*QZUpY$um0#.(–)9|(X!)vY8 0bCyռGj5Xzِi MGTeݪ0ZۏݘZ eY9k}dIdO09J"NƝCXN,ݛ"F2F e͒I [}$%Z! #*|]@N}r1o2Ku!^,B%fD9y`ڮ J{ЇA}yeXYB`Wbն->{d8.LXUUf8'MRi>j b_I F'tW/UʳMP=%,1&2F:BlAC$9(1jDE/ xPՑ R_ƫT! 3hv1.eZn8plK"߮.TGʒ9gb=(%z5;T\ A>;̣zNEFKɣnhVT2u (fn'0M8zTϱA:%?VZ*H#[׽rP(+V=pQU4*d 1d|D[lY6yĖ zX67X|Xl#ڈh+n/=?"h:Ц@H<(~˦k"6ShsɯMRʰ j 5~n -swt@! iAk4Ule{[sU-jx*߱f 0QKK3GT(6B~Q|M@~ xhp1 ٬гs0>#5m|iQzh!L3Zhf,^ JbՁuBԓ{ cUUKY9zv&86k6ܓToaGjx`fRreJ=qԠ]fG0l=cm 0X}zJpdoMȾ+侧Vٵn{DIB'wMW@͐wc<]%˜V>BC>R`qg=>s`¥0-"A.2 a$}llI=p-ZE"gQ&`<  -8b+8 +źtp[mM\ X[h`2ua? nվD(_}y^>k8QW{@_BFyqG.TBb$–]ӣŜt b.MvazK߼(n(1 *" ^GZCy)wIwA:kvh|O:?jv;ͣ"Qב%ew>i_uM2q/ӝb!z{%HT{!& 6RM4'ۻ\oC~qhҳ-U0%"4=E_ON2HpIԗ5X\LfM*F6[z8dHS1B*n-faL⥳*c CItޙzt(U&.'<(saEc&h(ND867[,T|vtR8{v-hoy$z7ghiO0jǾzeV_in fiEt>uJ(< yxVSjMcװv][WU)|jJqn@3 -JwI|#AXnW!{O Yifok+`az w_|:UA;8ݶJ]Gu>,S@(?qw]hyHq<묽O:lƗ3]KN3}+n_.=J1cSQ7.fu44k2|WRޕ>r3xqeBUHe0@YCHDNh]˯ Lc$c T(w2JzRtX6XS4WBY]d&V*Por)to`Ϛŵc Ac PkxhYk:*1x,?!Iqڵ(cp;` X@U~C F&%vղ-.vLRF[չ>QzbhF"|דU\;;t"㳎M,^Py|9Ҭ#( g?50dvvNѪ$& 3|b `"W[;h9Z-/ 4pV|Gi>N4T4,ͬB";0+{-i7lІ! (o]e/oݾɓd^ubaq9hDs;Ȩ,hrZ.<nS*|Jo#f#Q8HCzH ZpIaHlUͪycs7 Y;aY4jE\oVQY{ҫy[ _ yӇRbSllNFmpUBcV"NsBQV 3ƷvvH/}BHC?KGw7F8QOZ{/ }yC=Ԟ "1f:LQߐxOnz`)RX~N/X2a}DpDǟy=R-x_@Dw&+թR $eݺ'yV]YVלXLv'ӊg+PB ^*v^7UqKMO:x&Nly$ˈC?f:qUVfZsBG$k%h~ǧ4ބj,7c"^MblN. b <1:[_v(:t o@>ೊ|wB[^"Jȶ%- iT½Y6Yo+s *,!cҝހZΑ pF̭C牻T=AFE6hZYH~biP[6$E5L/MFCvE[5KБINZ19}jsXz22h \'XFM^ū$(9HOKOqT&y|MuQF KQBUSuZgD?tS\1z[6g"^p*F ל;~=Њ8}_kPy{5:G.>oH;4aZ!@0=3o8x%,[ zu$}PVl%FwsJ$ N,$K`5GJ"澰粏AWאoi4 E֟?br=~/SyI@cvJ%5@%J$. #Qj+)~b4: U]i{@+?T{zۓYmrq˭|ɮCvXp"UXtT3CVxEbU4I8$=:ycd=M ]@J+ ~ūzw"dk~?JSw}4qaWe6>A!xoH~*2F'+ǼQbVfMKŲ(@]y)}@F߃`(aVAg5ҀϑpTbaaG{ҝzςaz!O!*8ʽ`6 H|NɘDS\ǬO?Jk $q_c&"X53E" >WWD,[}쫗 _hm5 *:&m|>u)v΁BW!HؽvJcMD :Zd`3VlBB0?n<yˉ' lD;y14Z> ]"]!ʊLhFSrɴ/)j}'uH2#L{t;%#8EE%_QNx7eqGK%=y_zZX˄Uɯ7=;դ=9T|Z*BV>L1Lj̬IE o*MjEE][_Q\JZw 1N:}v苺a 63u܈wZ4\8U?#F>yziCRnټIk!%PR#*Qy!#w>w;l%ylOzz h' {?rP;%nP;>Rvr !,OHh.T| z #ޒ8M˴xV1=]"TZh c _:a:yՄ"~R#G\My`{luF OT51D:<)'->NOkF2h3s3+j)qv?ek.b7.6ǯ:`J;Jζ>'Iyȗ̲z@ISCr M+h$QwNq;Qx+W5ZE\/eo?W^V8eT_{t dZw]D'~Z2qr,a}N8*k|`./ɢp,涔nX: *FÐcڹ6$2#]mr6y45|")0&fFQ̘~Z= *}hyχ6C_[[zDC ']93J1;ګ Ydh01k X&a[׏S'^Bj1No_Ft:V|:Vg%*=}$NʂQ&;a( Ē8dŊWln9o [Sn?a!i RL}lz{xSFd=SC kbhjƈ&6.=;ܳ-b.]?ku +T3AB5op0AbrQyI}DKcIY26G%bp(J2/H]ʒU}{ QZQa(:÷f_?,s E76N15X'R$sY2>C}[XO]ʲe%(6X/C~2q?k֚Ī55KU \}:+ 9:% Bٱ3@6MQXTJ4F5>mWhl$ҹ{%ْN<' d״3 nXDЊS7* DB(gGAv{kϱ Xf$ @xk…:1e70ar޶9ʛoKWt>eJ&\;$p2EzՄ9ﺣN-HǞ6~t]`JΡOTν#kT-Nw ؚYJ%#AX%(z5ƗdܜK~鎌Gs |Zzlȅej֠.:X>SC;Ln/-Qck9JJӃxe8eɁLf tUҟ+"ې`.^d8|@JF0Qá( L@_ϕ 9z()W=ݡXm"qzch>Ȉ3#ilC _)nxB O hԨWyB=լol5>!WPIhAoJ!3bːRHc&KS)FJR1?y`9N]4O=[26IvА5zm4`LPlXpL>i K,CH0a endstream endobj 133 0 obj << /Type /FontDescriptor /FontName /ABYGBP+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/A/B/C/F/H/I/J/L/M/N/O/R/S/T/W/Y/a/b/c/colon/comma/d/e/eight/f/ff/ffi/fi/five/fl/four/g/h/i/j/k/l/m/n/nine/o/one/p/period/q/question/quotedblleft/quotedblright/quoteright/r/s/seven/six/t/three/two/u/v/w/x/y/z/zero) /FontFile 132 0 R >> endobj 134 0 obj << /Length1 1554 /Length2 8497 /Length3 0 /Length 9518 /Filter /FlateDecode >> stream xڍT6!-!5t%9 0 ҭtJIKw#%)!Jw+_֬sz5%`98̕( V<@ 7= @l(p}SJn.00ewXC%8 A/ wrغ>W%$$ ;C@0-x" A^饭0'ԅl#.`gww5 (80:pkW g0Qa.n0+3p @ X/6߽pqp;޿A`-@ 8!` +fonq|4@NR`X幀!..%reY4 \]0~'q05fe+7GN] (ɣ?2+ N'Ȗwx/G%oc~>pGc`?5 puvS `,6?wxfH/+8?SZ[G@{|yx|@/@WQ4, g"+.+a`w,5#ip=>࿣8 ɹ98Q3Pus}*q `kkfUV7j]-@f6B\ `+ +/%=dXU\@' d9\G~>R[0n>~H||Q{0w}t<;cQ~GA<N#G޿#7z"' pBN?c(? /1? ?1+?rsv~\ س?[ 0f *I21)mTfvv[l$̠UKɤ=KLT?}P[iޛkMlb!/ؓ@'gבU=bN%Nny}_Gf5U+cޗNэ1,ϵ̚!Aqe@c?ęRgScf{\ۥԐdG{Oh&aJY&JL|ƔQe/עaө@3_ұF!c%WBx\:{-K;U@kآ!ͻP,S8/{$P <+e!6u;C.;"PʶEOYش.<:8 f5 leet0kC -l_}f Wus5 G3E=ƀRWQRZ(xػf 2Q+ie3,,} ݓЎ*gтC:ڵB8<^EWZMle uݝL*b\3ʅ\'UwH+A.!ZGGchPK1vʪPlm*"ƥ.L-օr*\#E%ʼnlQZY0}-?IzϠSt ~Nrj9+S9RhaU5JLQݶ&`12haYfn͞Fn}+û!ɘ1%~  V CnHo4vITk30,Gڻ4t1U_{M 5ZyEEllf1Q-ٴyJW73/ 8ż,2(EAy&6{:8F %*t6CEBY̥,) F6u,g7m D z^,?̀ nW ҝq;_N`?%s2n J8$7qnP%TǺ _=o\5 Fbb Aѣ?;+€'.οmSsqnlNiR= W٤+I]E䔃 6zL9$S݀+v-ZShLHB< r{aۮmvEڳu'cGJӟOTb#:*nmW+eR8LܭN!(*!8ؽh+ޱyu UĸAe5j;=dDCK}$@-Ѳ@T.u:pQoҙτuunyÃ;TNI K桘"/2 ͸UE_~cdo](=CԪ CY;9Z^VgwØGh~RWjԬ *rἉ7O . =ϴ~흨FfAyb~=.1z VQM'w_i"OXQc_+URDŽ\@G()}^꤬kGXyfbn~HBKB%Bُ;R qfGTUQ_<]!~ mmت)pCڗ. p'9DփT )Wp %┛_^Oq_ʟyҴU@NtİHy+ҧ ^,~ӭIfVri%V<СZzOHξhZ.d'CE lL{ơLވ&kTZun1J+>Sd!>F$_C؊NYMy:hD&\HI m*ʈS:_]:NP_مk9!ӫH{D 5]kW5dECK/j Vi>`˙َ $NjY[O|FY& ɉB& Hݟ1WⳒ'vou FıotrT0OK~|fS!6͸?y舌zۍG4@lX䉨7~ED@ZڎS+t$ !-- o+[Ӧ3)*D&7כ*`(BS g{M-nh3L|FՔ*jK>W2!fZZy2|F;+r)q0妟YY.9[b! ׳*$>s(N UĢDNJsD4:ޙ yBaڭ]-;B!ߑS'^W嵳h,Cmn,NhHTHzmSVWUW"(D|fznz|rrp4}>5gԎf w6QH{"f ؈)MNt}Ť*qe=VD"=2~l uxbgkBAӀ1zpߍP rI4Ĥ&4#!k`7 H?nJo F`{l̽;YuD6OI~X8ӟ$`_V&cf4X0mtci? eOH7c2RD[ɽ|ٯ· S@mR8 YUt5jFGU岼^"Df6{HaJb<\.˜O65UFdK _#ު"` d1N|_I#)>9c=RZPaϱ\r;)#suóL gx5 m}=ʗ*dmy*Rj1~)LCYܟK4(?rǖl)b1xAJS#FF4|~K]!XGOVDxMn5pn(0N?|&}ԻEd֓J^+zUJܖ[s5(<嗓k UtMD67!M澚UDJDIC hO/4w5 m엽nUw*74;ӬR< r0U63p+5Oy9inʴӗ۞2uNŎr_nJiH0"}=6?a>~TC?GEdNA+LEJgTa{mGSkbO4hC _e9s bye/|?.ޔ^ k)ԥHMDF9t]1mrHR-~^N :CՒ@;D*ZDz9 $FAL$%R}c\ N)qc^5tZs_w,NT=';/vFCZ B^cCdi ThvEgB 6(#M@NIhgLXWfs >A3j.O893q|}e+57V+BWiLi<)%1aEB!{ >iђm(Po)&|4?e#homOr3{utpZ)"Sny"NKXSIY+5: iv`^(-{V& '8J!J$"Ef5|@=sBƴmwG{ԝHOuP^ 7YPkvwLϖF%g濑!jtT. NmkV=+FQG=8b$Fq3@Q|ss* 2Z}4ݖLuѓNc`}`Rqv0PJ4S{p2uSK>C7nb]^eaS$j*"oV`# Y9[pުr]9(̵dj5 ԧKabIki/QW%6(zT{5mESzAy a;-4-or#IL}8Gb].GQMt G$ nj'&kkwN\ ߥ6GBۯ:&ꃦ"y9Ef<*@tN/ݢlxU٥|Գ1]cH^_m[N Bݞ} vez!Gt$Y;6xನiϨSeb,=oq>j| EĬϻ-t$abRĩ.ZaK&,]|` 39-'&Rs0n1ܩ~k-QY{W|T!LPAҎօd2gwwmvD/o6 )75:Er{T-gQejR+dt׋,{^DotNlՓ*")gk{~2ds,vO}WRf&Uu9(kz㕊De'q/s.kqX.(íCS:߷Q&65kJ2_@EG>-vQ v,LEKO;i/k%+ߜe\@4-ḅ70J3uŀKQWT]BIU1R"(BFV]}=i.7 W'QrOɽ'iw$݆%v;jLTDIn :Tyrkrn1M4q^G|7R`csnPvʌ&vWj VB| b+ɷPrQLA7J? b?V8gy( wWf`iZ([ZQ}yZL>}i<2SݢDL[g7m6]7*yԽuQ,*ZX%Z~=$^CA>^mmjLd?!ʜ/hB:#/?Z.QYOpN*J$xJ}YnLKGt?}ٓ"_LL'/_6Z96Z;cVty ?W:3J 3YNyQ,KK!G-KG+OdPeqRQI z{XTle'P$H1_7h(πz} nkyǪӋS,_hFnkj}$ѹ\8WLSE@Ap{&{O]q}5|ma?E52 !#̝ j7zҬ lv;tJM ׸e$bptw; # 5b>lΦtHzi.jyVRM@^ÇL!>PvJ-nd pn,Ls=12ZE/ma.zs%RVe0fC8u bG yz$Z>|(cSXba*Ơ3zC,-]>&je* Ysʓ^S$jry"LZiڼ[|+n 4"]F`|j-->%t*2'sJqՋ6ڳjyfHsӶԾzVPY-W +KqRŇ4kؼ " F6 -mۻZA4) ԥ!J~Ozkԫ1-V^gri9AX;verEwU,t77Hd*5>tSϚY3Q}'ѵåkgr^U\(@ExjGɖVk&fGCX^fDnI͉kD8-bBcwAPFbϜF ~a->L4XCTArC`W7ڰ.$^r1ŏV@^f )5 Y{8 6EY5WXLǞ8/_z>NEq^ a6CB"v;Dg_:[z%3/4Exi@δ?dhPi}>SjW!>$!u:tPX*%p7۲Mԅ AÑL,S;#؆3KxeIlj@,ixq%UG)*Zfw-x.AV͈ endstream endobj 135 0 obj << /Type /FontDescriptor /FontName /CSTHYD+CMR17 /Flags 4 /FontBBox [-33 -250 945 749] /Ascent 694 /CapHeight 683 /Descent -195 /ItalicAngle 0 /StemV 53 /XHeight 430 /CharSet (/C/I/W/a/e/g/i/m/n/o/r/s/t/u) /FontFile 134 0 R >> endobj 136 0 obj << /Length1 1425 /Length2 6643 /Length3 0 /Length 7613 /Filter /FlateDecode >> stream xڍvTڲ6MJ@:%RNBUzBJB(M&T({iRTHE={Z73{f7{熡D` YD<';h 4@u Xpy Gv@HOG00# ~B<8/qNP6BpU7 Ga*w'U' O Aq g G89*%b{A1(d@@u4M($ + w~Xo/ AIsNp(s#G0?{\p]Nx` +[7WR_\MwTT@PHTEERE?BeW IwKJ5|G -pe_Qw>>Y_B<8`pC&ߦ?sx7f@K{kaNp Tf"/7UPwܣo "~M$FCv@,7N0 # W^0꧄P,߀ Ppm`\Ѱ@@8{>h4n4L!﻽pT'/?̳bO;n9$I{<|}F={4qݨ}OUdTtfh> )5naffb'<4t[j6o'?FlV3dlLJ.(Vƪf^ftds{e(յ3AV=m{1m;泗RG%cBnJE?PgN-)rNg97EYP :μ32$AmDv5FFd?*] 6 vo &+艆^LB(ZD'e&>kag''{ޞuur~ UT>ŔJ{ NdSv(DzwpiWQS~O8FN1og+ZPpeV3>$J]r7}燭S-5=qu!;___Qs{lDzlm#NY6_07,wgc"8Qz<|0~kj4([kWm{?els:9mIН׋ʓsecu X9>U~[N';(gJ %O~ mF-l;KSZH%)E:PGx aZ~#ǮQDԼŷϝ]˼s[;uu$WhٌfcMu=E>~5Pg\-G߫ }Uh {/49}6, z,g$>UTm+nސ"H߹3l5~ոo2/P^8{p}qfc /Wkj͋G%lB9م[@駏%!ʞ['畡 ѷêOζT9Qlp0VD^lҭl@`Z(́N_X\#dYn)_{f@I.gKNWTG9M*nk &OlX. tZ2TuK$Q dO<ݡvgU|1Mefs$f83y2UQ}ΏI:N2{!X 64>zʹž71_fz)mʑr MRNE+ ɌBn]>_[>StSJtm*3[A/ #mRYևYp=wP:ɔ[0KN֋s:&WxݮИEzɂ"1d9fu'GyUJt<<~iDcdvS$luOf;MWnqbӍy^D' IloOn#EX)hVή>,OOGc37nj=řVy2j=@zńYS 6xh:9Vf+`eEp \@Tnch27n؆=ri:Y+\z$KPlsRnHHlܕT !O feԓ9Md2y89% _^lAw"pp^G)A63YIjKs]s̝|LMѪZLΓ< G4BF x-Ҙ>)F/dܒ.ɎK2c{m$de,͆ns.\;^wk C"U _pfƐnsZI&% HY+Nl28gS=AiZ;=UV"V̵ʂv^od#VҔ{휚B'jƏQJP/QF=rjFC ;8 a@U{^yqhiU٭<+r+BujVqOW!UlFp(ʷ+n5rGӔZ]{CNz Oiኖ#f1?a-L#պIN}{4#x_ W\UڱVغ/ux5U59%pqb\*ۺ}H=Rw \g9Ph8N#I{NPjBk\ 1KAj0A5K5 2P>c+~s H$^utBEnQeCǀ,riu#j$Af.0IwDnOkLB}cߺ 0evu,t/y+?7YFwcTElO :`v`gW|RɪN͝%ܑ!Z]kՍ0o L|\>yu~\jO`V1YSJU-!6SSKn@Cs9&B9h/?Tevk=2nuOR\L @bCªjM8ٛyF5/uO b⢦hu{-SUZ}%h1MNdIV/bGCB=\VцV^Utmά YbfL#I'$>17*&cX r;V RJsX~b[pvcԨ(뻞CӄD! 0Ŕmd)1n.qwҦ{}$*3ms\DW9?)4BLV.N:vQFĐnlmE$ n*,TgzLjZݙNNО8IJ3T&1'LΣ3{br묅(uc5ӗʗzaFVlmco7˾,sbؼf5j8+YcFyQQrf Ģ;t u\fKR &!O|N$C:rkLZD&"q۽L7=h-)ro: 2zfcе v/MO8ÀJFc=D>B49xMB {2uJuPx0λxA(=:2X>;,'[Tȑ0ܪA7{wka0/6rw;™9cHU# S63v=oZꇑ&z)X%B{ A3l_ ƾhs rBN~=@ u)e($#j :U@2$u4wo pv]tObf!׳orӣwǬmU&gL _aE6c1GK(2 ,@(݄;ʻ dOBetrx@ 5Fg2,ZL|W/ ϿE\~g>B}dO +9Ѫ*oQ\'@'Yh\OJXߎ,E-,eqry>)jdyG\@o!o 8p7#tcwnMC` OR@ Zte%kԴdfCndv'k=q[_8umXGTɷ_`P@*+@l)81hZެ\sW>7Rfj5jCV?ɁAD:`:DWQ $?ÄJ+:"4CLx3gTtd Y7 7kNC9XxC =E{-*݊ ڛ9bWL'SJWO_P'L*GZS[৩;?,06q?? lюp`\iPNPS.]pIh:O{ʶĭ7ZMRTM #yHA geWyYĢmXf.)w7gpdf+5(7r)bROy ˩QHXJ]uUd<-ᔱ{6%+,6c7ܔue.Sk`=HɦI$L~S@3U";kh2xDV~qcxD%tFq_ Q lL{"9~(p; )]r|^@f/U#jh-$H_ :͔TҚ2(Y'ƭGXI 2u핌1݌b"Яc[x:go*/9(q9UmrKnx'=4hͷܕMҿËoZAwʷÝ*ZF`8&\@1HgYa{He ;e;wx|C, )uk<{.3O IY_,=Nxڋ`_sy"aØHG-dJ3 -0TR>Հ^ùMZ]`Y6U4w< s.jM+q('|e6bjNє@ J;0դ,YcM1FTobd[bh7 m*a-]OS"D%@o6F!##x׊`/ʮI)oPN|ɑZ'p1uDl~zh~ e0gge-Sa)|qf]'.g"nFCh`Js/^l7? NT>Cyjr٣P9>1I(:Eư݉GnFjMm aow=ɑ,[\?>Og';)B ]6{E(b+Kh;6:'}2ջ <2y =<?=T%=E1 GurQsk9BDxH`>0A/ftnXu6$8HNT˻54ʹ>`QjbUdӸVw2=nw*b|Eљ,uUVjl}q]uWSpdd3;qd;+kѸvV o"&ݙf;4iÔeyW͐50e0= s˲*>T?5 I+ ʲ5=e9X縺u}$u5 &47<>fJ8}wW]c(7FMqZɔZn&])Kv@;B?MzLԶ8\>ЧzCvg.pKhtp$Kd`*1|Fp!6׎I-!5y %8Wj>fHyo򓷼)"an}f(5߉zooF#tolFKIsEAhۗ9$zXrwJix`8i`wϘ~7ri/ӧECM?3I(ܗ9V Z ⷎPg3E,Z)? "JF*/s*7-?]-~Y)5Yג\,l_MRHZq|g6:[6Y\Df/㊅;4kݜc>*Te#I?؇*E G/]<h`av5t8IG`G2ZfyRu V:b J6dă1r^RAC$Ǎ\{5Gik*KoY2 ɋDx8U@$ՏhIAo*rڰ#KW T-rIC|/wWIrO1T[pŮJM譔CC^Kz]EI2Z2\1wp[s endstream endobj 137 0 obj << /Type /FontDescriptor /FontName /XNDOVD+CMR7 /Flags 4 /FontBBox [-27 -250 1122 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 79 /XHeight 431 /CharSet (/five/four/one/three/two) /FontFile 136 0 R >> endobj 138 0 obj << /Length1 1425 /Length2 6638 /Length3 0 /Length 7608 /Filter /FlateDecode >> stream xڍtT>]%)Cw ) ) 30 "%" ])!Ht# JK}Z߷fߜ<{>:0k  H5XY jaP +SB 4aP;E%bA+-@Xa.pyʿNP\\;@XAV3D+@f!"g?x=*e ]+և!< m@P7; j]@? x] wC;[]`= 4^ C(U psC~U+ 0gg+?0duomu<v`ݯl] `Ww_Ho WƁWpoo7CہxnV O;< ` AA`(ё0y8 `* 9R[0(oW3Q7~Srr0//(WPD!c+ }Uv0d=>_ g,-R 7A~gvWE;E?3ԫ;}Mrmg\5A`wfUVC}`7%Vq#? ׃ *'o .AQn升l1r'"[~>( t x)"#%DH7 ,G>\8?$ Gr6p8r4 d77|XZ֓wsDju+N^9xOBTΪ3ԁ_9Nen|6a7'\][&o}-*[KKk wgބڡƚP'³G٫ta(lfSwJTuoaYpi*&,/=$;Dnn,&T觤Clr;/]MS :!;>ZzlT1*IEIXG_ԖT5Yh'!b5=㵯D%R?e5V#Hx:U=Ԣz*3w% !b;[e TJJHq8VBz%6 0O%RFBv\Qz7Cbᨅ< K*uTN7Nnhug\d1jŶH>d>Q"5NLhB`ghIXRrzVC8!61 5=.ЋYg{L<?)X^DhOZTQ3- V'XKhj {8S34&l2FlD$ m[gafNW:;c5}Кnᷥ<4#1ELI(DjOKOG-E4Qa䠠ѕ̧*t;K 헼`ٿhoZ+&3"֛ TqVO2DjAwlо8AJCۨeϡol$?Z.Wn7>WС:s0M4=Dduu3N<40n'՘3],9e͹9[:wF,R(a3q׏[,{F[w{\@p9ҞؼWб݇ZuraW>2y] }HCϞBAڜ1bD5c.䢝郬+N53! <b~qn^k!&' bhٳ{ B>ӫMtoo'Kh o \~v"f"[^ o[N'oS2bMig1,Kf+.pOb3AHDnS(нpԅ-cJںcVMιzMkR;eMŽft ԩ00W z[עtF2'{5뮩V}6C_q$pGQBO)HwBǪ] Q5̂e2/˱&z4O5RCae 4ۣ#'Xo L6<Ƞ@Qe5G%,m{c9|ί%;D{ňv:'Rb)E+j{sTr.|Im<Іnz,D3Zqf5jm~9GxL '0L*`]z-@v"ME8GΎ3e֚=9]g=F_#[D*ƽyyygݳ U:z0}[1c+o M"C7L}e;aP¥/ d{]ԁ}͖nw" ?٥חqoA;]?O0[9]N&*۱z}pfAEa w}Jj>RBoqE,79B֜,-jAt8(>X?J6ge{0 19;J)܊JgS{rPDN45ȳqQߜp_ulka8+.\ oBjB[Ŏ.q oaRQ8CF,<'/qg/ŇtYɤ󿕵i#C)2Ԛb;xs!rZѩQ5'h$w=zEO~::O /!uMR8zI.-/ra1s<ŸYY}˽"dk{׈>tg`ȭRlg}LYV '_Ysi>/n%4Y~MoP.pޅv&ɽ_λaF e32={f߽' 机$vPA`MDEY—{<55R7jD!O*}zžЋwѲ-圏m^1OFiPSLYUe9"e5q",(a3UX#glݠ)ۣƕZM+xv٫?Yfa8˛y_W[Pj /\9y랑e'ٻՠch~jyg|зQruŢFQǩb*a4iTm XiA|3%{v9m]yL r3 c5yzm gvh #17~nW{QX ^F]YlZ<905 Q0* ;f.}$ʠ)MeQ5r#4kfbl}igGQ/Bʃ3 IKBҳ}ؘ3ddn =FYbIW?=Fqn/:~)AӁ@JǬs_gJcȉ ^5΂y%:ߌ_^N*orK'NE&[\ Pв/(4o' _]]z_*# l`lr*u1Vz[SR|hf@荠ɠSam|ǁo9n^f{jm QNp8>E+ǐç3a&oNnLB&Cmq 'ޜLXR.ѰXfSJӯ|FgW>E2V)0kp%V|F4<;lVbي-Q~*թz۳Aqt,V؜V31qBٽ՛&ԘPaYE\ =M^XŒXoa}mFz~r0;<5R\j 5~&8{`px U,j0Ju[RsdJd1r0򧌩یJ๰Zˑ v(s?桏/M-&ml[̬M.tkù$? * %?QJCn;٤=qm?GIڮN?<<#ΨB )y_8viݟT$vkvBUHri&Tn|&X*yFj 6Hti R$jh0pM> y2x=ۼI@+j6}rqDy7OVp\`&%ɹ cQ@ Uhx_^YH 7g " 4Bܥ 36&S~s-\ы{Ǿ\' -Dv $ ;EzTcҝyd&>ŻMvFhY|ŝ l(d<9t(Dk^/LU%?~ofm8`i3kϝPG/xU%PO2/~(lu>zC1IfOXQ}z{ҊrGA ).P"[rt|#yqo.5ELw$$IB0V3cRVRuibNE7 Hg7dnjB(tb /_s&U bGp*ǒiEQaZ[Ѷ#%xwarywt˂Lߔ Գ*4vKx[vyٮŋpnn N,s\ڱ[c\(c)k[_N7uZuvpGBj Oԛ*iϾ`[Q0͘y W+܇l./^ʉ )id;-Ғ*uY-'1u#6ԐOK#f 2Xc2Mao,)DG5gRMl5y0FH P9>+ahHvmX" '1+l6<[q'/g]Y-E4GcRDYpE yo# W뢆%CJvhCu͡km "fNdpn#i tܞF[CNgW"2$\r&(zvq\[ y ༹ fBH^HT;?}x]޷݋os 4Ɂt }`g_F{}Xn&΃;xOt\}'4!InRL.EgLzE@ȡB]@vs/6T@ׯE}├~WD}q6} 1J|# I@Xup K.`*lkZb Y퉷LFTQFIh,ɣuϬ ~ZaF#OݝD+V)ḔWKmM[bVw%3/ ӫo~ٳ$K%Acg86H8-byh]h.CF@_0s hir 麱r~QxI{R 誌QI[Ź(d\:z p<01'*^0vp\=5Z="Wơ)peb'ۣAxRjȩnL\Q*UF 5oj8f:3n15XPPst OMe/ڐ;|Pt`م{p`.[HX`_o,RR6n'H$,OoQTڧ7Dn|n)5!Bj(Mzj,]ry_oU5~bI+anZ>n, j}QLd]zuW*'\Ntu?BK˸BMY#;0iĒ^KaOzNSڃUdMՏJ%p[Ѵ9Ygj6Zڥəy3sckՅĴ I \jg20Se0+g-ᔒ?Iخd%Zrn#Or_+ endstream endobj 139 0 obj << /Type /FontDescriptor /FontName /JZKXYQ+CMR8 /Flags 4 /FontBBox [-36 -250 1070 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 76 /XHeight 431 /CharSet (/five/four/one/three/two) /FontFile 138 0 R >> endobj 140 0 obj << /Length1 2436 /Length2 15438 /Length3 0 /Length 16871 /Filter /FlateDecode >> stream xڌveT\.\ ]CpơqNpM Kpw n9w2-jʫnJREez!PdDSUQaf01201 PRX8Yh(Հ [qDNo2QC7 l `f0s0s01XrX [#-|P0ssse:X ́6o  c hd`hr0@pp2|:\&e mǀ@ P1p[ 2ur5t@[7#g[->@YJ`,7qߎ,l2646ں[ؚL-qY'7':o#Wq!%[ɑwݼ5ZDdcurDjZؚ.َQ(%֛ `gbbz,t36gDoO;)  33 `4EM 4m@m Lg& [k?ͨ$$-@OAnOz&= ++oGI_R 5rv"PN>ۗ QO^0}ÏM9q.yFZqI/2 %?W! (W8OIk%١.Q&!)MS掠NUub #K 8՟hqtu2+ }EW4t( CNpX,*>:v#k?1K3j o\d.3#xȏcF,cbzԀ|*G>#vpEȂz١dPk uܮ8G~#\  Z>)RAw@Pԋv:}@fsGL\E-qbqߴyo^{pÄ3m\T/g*v x4!}|_3Uݤ(hX_0!H{j Rw@W#T" =LC,2^7Y};DH2` ([bCJ[t_?f zw ^$^y7] voimNFz"/ CwѸzQPy'\0#ﮅE\FէEl'U1ζf]#tF1lV&ծ3Qt@|Ih=73 x &֎]]l(L/g#Bo1v7<9uƫ8|3M)dDžn>ycOzKIWD%&3J!#"/q ƪE}o'M*uj;Yy;,oBŽ%}|ko9対"8`%q|lpIڟ` ,5 St' +*n 2-+^M4Nx<EC#,bJӔ,OK^;[;3^{C#SuL;mF#PfLV>ohTa 䦣9 "!V4;KYʇÅpԠ1=L;U /5fط ˒vs*4@3S14BP/%(7Uߥ^Női+@E;蘍ᴤqP/TΧ8U^AE 윂D>[LcAx_ X)ulӔ﫳Ų+½!)6uȰ\VYr=D}Gy3‹өHM(:&K)^ma'Bv,"(׌.C1LȖlƳ{ )sl]PcT_;]Xz>"|!\&7yR74SyF=]LV#`5HpW1-}sP1呙0JO=֕}O.)W}`ĭJ O٣PB{ ]s܇bKR6\/m'd`G#&<4 RհClHu ҨS> ]@xP. .2A|9Z7?k{+5M3A3ta&fa4KF3bDg箷4mOҐdJ.)a 7BG9*xVZ|kWO@x;Nt&] +."d.ffهDߚtaLCg*uwgc= lv&(M.Y %Nz?laK."1|b6~&fB\y%9ם lCԉ$} M@ m>XE'@=.!k{VU؝ XtiX R% 4O,7y*z[hHVљq-*mQi ~M/(i9!B ępr"A2 _W %Όsk4i&wr%E~0I|nל9Jy7ŘܬՍ.OSp"m].ЋmQk8"R_}am,O9 a<bGP_֋3z!eXоo^aZ#ZLւi kuG!HWjRg%D+$C#0yKW<F9J"Qi/ztp^l6_툆clBM~6*\Kz9G 'L]&'vo P~]k_sx[ӐE~"sc v!FC0]&۶J!WHUUjA$焱S3m2Љ6ȟ33&)q?vњF'1݈4)ȕ0WsSw$0K%#yB9Cl|p".<̃+g.gbgrɗLh||d#u(2ps,\xL5h<T)CeF^÷ @i}@tFCa, QV;ѺyQ9&ϖA.&l[2.4'dcmVSXցkbO\"?ZC r4,-$HM_WI"#IVH$H{ֺX(F1j5O(cTk\Q" zBn 4r;J2t l@/`:_f2;\Iwk*]7kޛDmYr6iuzep1z\E jwX8idX﬘ $ &'0.±ڲ8.;ip]Aby1U⚺ 9n) OK'|Uv[cyn~eW׍w>~]>AX߯<KqoL2=Q%ge\@$ @R5r Q+[aZmn`*|FvMz\:oz&(zycStr x)U2DԼ#:~ʣvU"m?"1,Wy2ݼ^5FahZ`?h?'&X#kCC>X;cWⰧxVK6E--LԽsZz|qݗ({j9.C_6ԖzhyR4+J?]Uˁo54s?REg$FTɡơBO1L[b>~3tFo֌<ī{L~hf< b$τjPu hȞ=IJɘ2a8˧œC3Z*!XKt!Pݤ܋ p0Y"X͋xgХ:c&οAa5l*5)OHx>Ήkp۸5AƯ ?s9 S*7i ykDgO+v?a ln8 `: Edl%úcn8.\ǼunVhiQ ۄ!kx%i93'"VJ؞}^RfzҮI7fY-қcw{ IՌISjs[_HH~ɩ-ZgۃRPf6xnEbq|~\ĝ糨d"˜jh HD4XTW~=\:n[ٓ9Mfz ,ɀ#5ǁ ӅrHRh-InG{6pxs]ynʂJ-WddpG$,6gC:fi} )q=xDEA0TUk$R6dnaZ?W6srX2D ql7(NgR[)G.Vl ?{l9DQg\U/5c0'gv:F%w^i&N(Ak&YwfgS$HKCcu 4BW;>ά}_20?h@*"V)>a| ⍃TsE!eT%%f3Pw-Y{_J{c|YJ~p` 8q}x:!g@ 1&h%ӯ "s4^R!d"$7KRFu= P'?JV1+EoĿ_31%ĬA'Kʞ̺0r^m'tЂx.gݵ?o*y32k=ҁUۘVIyaPΜ%u$ߴ9{J/z"Xt(@oﱏ9C # {!-G%7E=B9Hrą`G!Hwxm]74W]e!MnYbfMxpDʭwvT R,G=LW<&^~cG;[<_F*Z2 + D_v Pre% "k3=kt;$>ֿf+#}F4+dgG*B[ERA8emPg33󄈩PBp>K LrrRaYtgPuN|P~Ȇ:1cLיϰȌXc%I^hgBdq36o'A FU:RJ/TU:/R2IFt~i&[[[nIZ&?`Xۡy5!}VRLnl{>_X+ ӂ/%okJ7fM~^\QüB.hܖР9٠jAV/~V )Mv|y}. 'P%[p)bkGv3/t÷2l'18M^,i<,$h \}t.#N!WuM>l8J&ޚ ޑawB,:dwv%߶@4sbU:8̴KgT>g}'TG 55R 00Ӎo3P :%ƞƠNfLÙfIrd?U'c(3K{P~AlTAl5rsKWtKfub6,0_~ŲS-y}8YVN{$,i VN۝LwOi#f bŗ\4DM+"B r;ycu$r4#[S\ng^Ð~Ŋ_ ̙(?V떁B $YK ~LZmL#0'<+&IDB}9גQWL"˰;{~&^;~H: B-j:yDTΌJ!֫:>I[O.'@:檼PrKcΊ/:;l!?фD7` QՉ :Hcpwj2A 9(Xu'P4+}sIߩI2/5Xg3 b">zaVעc z c)>1AaWnI <-.*at#V⊰&|_+Lp(FX,}Myh!/ffg&6~o𺃟e 5ŏ_6.o1vb ەW;xMj sU8Oo^͹i 8ދ_:+b%޶1$TMhiCasuP佥mMp1Xu3O#V^L)r$EfX֮I}BZxcX9~(ZF0б) I[1MMXVy-tl8|yw+7/Akڀ#^˸x[?Wg_bGP!$F[bҼ dq_ y7f Χ>ves_92^_<N%WaԾ9gMt@?N%VjMH8t~sNeec fH~>:<φ X ;FS8F%;ӡVy/}{JDʓ}kL\t&odGqdE8Ⱥe&< !`^풻x6Hፇ(h&'dBM=VgjM7U3Vs[|Y(Ez;,?2Usî&7q𡒺W_vbw\b.ϳ8Ҝ `~2kѦ؆ʬ`yBɡnT-K;w:ɸSI/eF7d_sѫa/n:aJ9ʚEXc,,5p;vA-ad¢PٌӜˊOND]!:e WFe$o-l 43e!zڞ+|1Җ3x]Cv٬u/:@@s]nY𤒠Mށ-k= UW bځz |Z:>SVZNmq͇M +Z/PWs`'>ںѼ!qaC ,0MkLIog|)NNJ&Nˋggh˺O*JX;PF"khGj4g: ?f>\_UHчZe3^i9j}VZg]i%ƙO;H1O:x517A#f;tf/"bU˒%G\jD6r► WGgS?:V5۳ ;?Fv 5-B>1p~kK KE\˻dށdu V9C$e,Qzm 6JNƥxCtG­ĀѫؕQ.t;HjQ!+|b0"#q= wzSo096m%}SgJ,;Dıёyu|ΊR P.MTM:O\U[ /s鉭;DXN4%ybH0%q8q%Ts,znH{嬳QrM=-!nU?"hmXPg׺q՜#>YHJG5N7՚;Bk!]{ԁ1bXVʽ)9l/O|rیBOH D=Ǝd\vJMH%WW4,FCu@Uƫyt>6gǘtrpTiq9a2tcK ^~=/F,=W5a<PtiD)h@ԲR2h`k56c ;p"Y4;cL'8+}V0ִAMkmc&2Oҗ2!onu_y0>pԹٟ yCBig)<`zl2DgzZr(8jHC OkŊ4yltoA钰{N2*~TR faJ2Y~;~r!09Nބ()ėyzMg0ݟ ]5bU̥5g6 ct؜TSs?%oK76GPx_UB{t7<n[ra@v,;S,/OVq"܋D<p)/HV<͓Q|7b0=͠啓Ef#=<1lI8Gr{t5-xR2pZNm1~jZi`$juiCb #ÞX1' 3q\ܨPJzuz%w9\ۡ_sRL *J x^5t!}^y+ս4{U)0u8_9޷&z ;L!b*B3eaSa0_}LܪΦ"8(?Xh3>-!&IM?S"S^w3*?gº-.^.W=|? ؓk@܏Z<*" OӾk1ɫl6!ҡnN9.#@6 a[g 3~FG{}4kT?g,D2@(}I7/TO"oOKOq ()$0V~E&7Dk5[5L$ACzIɒU>?%ީ3^~mZR龄?ߵ6KqK!?k6ep)8xv J:;/k#]tLn"+ӡNQ!{'"9:*IyO9Gveנ=DCe^X@srmhk6"A˘.Tԫ-lߜ;t7^4V aB3PӿZJM@x(@ ~ ^cG_|vD+:3`|V@aً Mwuhk8¸a'8ctC :WJ3%_$ɚdx-DG7`om:]&¡s;`ɉ_!?$lg>/snS,Gn H-v|WXsYkê MC}G-4$F jnqR'l}{Cs}z /įG+*fw wg 7/}nazR Q5y"Q&>d+ 5a ^ZWdpޛ8[')Y-=b{XG}"ځBH ?ȂX7&E1W׫d4jWAnǃ AJDw]ׁ蛯]je]jBg|P4PTN]xr KN$M-`U vtkn|fc+,&Gmg=|.p@c̨-vwpq ͞)K,XheOϠ K9Dz6@ӣkC?hAg@s5.Z [FF>И́EsW[q&>}HJ@՞!QuZCN{Yp S,n"bL1Z|9wS>s|&}.Z N|mMB6bHpIZ8]鯮RA=i/$ |4Y^6 ᱳÐ{/|n96g0^J J#('65&!ʾq<%d}Ҡ@JLtdm[NЇr4jFwՆ FČn>՜Ճ-3ÝX1v%l"OY-Y>[kBR^їbľ<_~#͹A?@p΢8>NC7<}Son_˷ڊՁ~af_Jz}> ObȿB+We[J*7cDHCZlFMY=ז.΄[|\o|r+F\2?:@mMLBomHSȏjf][{\u~)w5n^1Pxb_΄=^$H=] 2攕,w K/=P6 " 78؆uu#qNr|.rca_MTE#и k5# 1mCP@C&K` oμ}ګѣf !Imi ڦ4\LB0s@)w} U}_0Ư5)q;O6^/Y\"cXZIRQIV<93rhIcJˡP`ZC{k7diJ=i K G8U>8CochWyĜ?brw~꘶2\>A3D,y5B?edHFo)Td5}"&@)⢮H588!w̼1جm0FJļ# 5Wd l3(f%6v*fc׺QƐ|Vyad*(1(vnM&5±˧6"@#{t&oѮ) ˏ4E[誶ibe>Lw߀q؂ӣUtSQX*T$Y<-bD sӌV)gK.tJ>A;P]o9(Ϊ1 Pad>[ #Fmh  7 Ocd D&[ei*d6yenXukrFgDicksog ӻGr)'QNȀz#m R`_O.5 !Cͅ.pitdTҔu#8y y2LYipIێjjk(aW|d=sj尕]|DP{E˷4!ļ;t %(r:N|8.Jle3u`*MayhMrLҬK{t ՈV0j6  g4/*ΒsNK=-NI?Ώ<įtkTD]?ȕaހʡzM&q<0C3+:XpWtY:,QwG<^q_};z+oP`SD;IHD/&wO4C3 UQ< wKG!0?]㖛\tRnI]d1r̉[]oubPQm*$&=2Ц+F D-s'7#.Xp] W(i M%K{ P0/zp\F8K$Xgmt19蒑BF/-J-V9f1P oل֍؆r|j3:ZR;X.PQӪ]\Դb& 8p X1c_. țJ?lζ"obU PypA7 kUMj5a u'"@ Rxe`uz7dN(nkzFgN1ͬf^:E0)ꎳrc߲{Qsþ ZC$@R0{Ԛ}g1s:%9T?ˇi&/31'TCUSf/'/B{4mMcw"%r뗃w*=;|QmD9OZH endstream endobj 141 0 obj << /Type /FontDescriptor /FontName /QAJLOO+CMSLTT10 /Flags 4 /FontBBox [-20 -233 617 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -9 /StemV 69 /XHeight 431 /CharSet (/A/C/E/F/I/L/M/N/R/S/T/U/a/asterisk/b/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/dollar/e/equal/exclam/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/r/s/seven/six/t/three/two/u/underscore/v/w/x/y/zero) /FontFile 140 0 R >> endobj 142 0 obj << /Length1 1379 /Length2 5902 /Length3 0 /Length 6848 /Filter /FlateDecode >> stream xڍxTT6"̀t "90 % H()] JZ߷f=繮=6;1#Re]cK! M(o;> EGm*(4PhyB"!1)!q)  J DxHT콠]F+#}=N(to\ n8p tQ`7tE= `A(qFܥݐ'9n>7 0#^`Gzn? Lȿ @`PDxtu@ gsBBJ'W"(w=psBN|P|{/= @{Cahj{C<( 54mV;*#pW*P0ツ@᎐_c8z ¡<*0hmN`@()&&*?}@΂ ;3#@(G{(Op:8BA( wv k> ;k4p῏XPLr*)!|’~I1 @HHH .. g{>#VA$jO\ g.=`׿( /BgWݑ' ۻAahz*Eo9/nD٣ՠwB3__v(R v4@//p AGC ~ 5Ϻp؄EFDBhU:}~ (G!nP'Ahߚ} 9H:exe"71յ$hQ3glGJv54#O *"y/} Y(@ao(};}frD9M? =J6d$¶L5z @r(='aɠG+wa>da[C [>$I 44|MPꈣa5܁"'Eڽb5~Z,#)ɹZ-H %s$VH,;3EEyT++Ŧb4t-ԝA_X`.5>1_Iӱhb鱸yZe ?n}1u`;dIMn=Gjƣ*מGtr''cR~ 0ɚh&B\hB:owR*B1xR3Vt`[*$w {ݶIr8Ƴ.zlWǩmKV9[)PadK^a${׭ ņ 磌2_Ovroh4]c; K Eە? PƘZ tyBϾY]H qn;r^HI@F̹!)Q!MmBU~)Tx. i߄k/QY=i%mRw?>e@^ 5* Ue [_EDw-kG*m8іWN#[I,gG, Tun7lִU 4}i)v9;ðһN%|qQ)=5 ,Kf+?ۇ) OS{ҘreGlUu=d֜M=etpH9};PhF/j$ӕ*RԼ4l^&/us]|Ob 765lkW!",k; $NX}_`ja/TL%Y1Lz><7lZ+ְ'3.E4O-l P'NU(K9I1 iFs7Vg>OE W'(J1{N~z 񏚴!Uq~&Y䟕>;xz`1) T>]Y|1B$ZFv}W}YU s0'+ԟ]1e=²Zbٿj_؞yxj3ĚTقl#nÝb/؞spqa*ӘP:q;8_Q$KLIt eWX?1uQAn-3=50P0!Jtd?Zh8_IWq̎Vsh_+ Tm9>m_m}-?Gyp*f:%ԏ-1mL2`_yD!vFAv+/iUF4 Յ@(wR(ܺC<+{hC7v}ƘXH66︇:T-l8rV~ok&x+!H`Mm$5]_xib:6GG]|̯yAcJ rn+4pn9r''+PCĎ-(ɹ,".\̛,_-l+6d6,p-N/1o_ač3o+~j /#HM\b&;}T\ԗJxr+Ew`o^朑juΎ\4Pn;bU $('<-ȷn*TNzUǵf6e5V& 7[(=Yy$BPMӛ^yD'yoZAx@[-րͱtZOעޮ.*nD5n 0LB|E1m5GeNôɧG ۳oI~$Zy%H=?3vd܀ĬBK9Ka>K^_z5s`*:GDB. ሳNNIU0%Q\xH轧Q_ ʕrl?9LFCmG z.=s/*^1c=w)j#b0_*aQRP񜯳)GMOHvFE(ܵXLVo03m7A3望ɡVQ~=#tHٺ!NccIբv$Y'<۵Ģ"%jN3 󔲶7s˫:8!f^}2u 7)8iPݝS9 <ˬ?HT=;Bg}x@`aѴr]jcYiPY7[<#8[8}1F\ OA znO?<`y20"2:m}'Εz6e'}nIyg@&J/&UQ:Z8ٸOˌEx]h<NV,G9M`25Hx暣e(@fuEAJ4QMpLc_N}LN;mfaMRƣۙrDc]"rZ~*z:,X%xt \"c/1Oc46zU. :(P>Y]"`4[rCY߫>AZ jI^)cg(~; 3}j9+aRV3G]jSض?fIS{pi'sIvㄸlXAG'r䡺ydlr ~s=ēv]ڨc_')c0dr W} [JUճOTWPSKN ٮ^R} ϕuTqXTe2bj0eK+;>_˼=I['DrSFJG @29/֕fscpȵe&-⮟j)iێNhvByFd2} /^ME铧j_M/ X_iGFVuL[vU\xPGzlFi'W\7d\Iq0_f)>+NiH5xf ڴJcп;lr*Z 3:y\ߩm+jB{p յ 5ZbkF+PLClݑHew*4q.q(R`u=aWH)SK\$/dkm,H{?WwfED~>1B94sRImuJ)wb, 4 XLw[TX֛/Rd,bܽIm|󕭍qPzlC؉W/q6__zxvP0ĠVh!Bc{Ik;_:gnfizo9r|Uq|V+5V1S:{mÙp -LՔ^ABzmeZL@`H(qHEo5iIKukFSdh߭O}&qʢN8}$lQO8cP\KXXi˅U 2Qrc=no9jNLF$đ΋%f$efo;NKjA9żO6,^*th3Ҿp9)x[CJͲFzv }a!V35],|ˋIpý[V9~)l`eYѧFv\ I}序7宒k|>l3]JWCzq, ^cIl?P(߱{ss!Fg̠ NJexގ6/hg[箄I{}n1Gy+9M&w߼a8Igj>Tfd7ݣUEGHz&w8e|񹏝1{[hreu%+p'~*8EoYk-h×tgu0s@--Jcvrmz[T|`3iRY]j97hc4TܐPTVnCga7_}oҪ,9W/,L'Yd5_=SkŦ _fZ#x^7$~5˚0M}dv[0U;zQyAշ̧Cc[޳?|-ӎwg\(\#mbf+i'0C/t7G1mvRa4ud'y3"\V{\,Tnƾ CFo}f0¸"k d#*j{oVUK5M,KR|3);"мYO0> endobj 144 0 obj << /Length1 1482 /Length2 8145 /Length3 0 /Length 9136 /Filter /FlateDecode >> stream xڍtT].H7H2tPtwI 1%( ! R|wZY7}γ3IK9DC>Hj+pyqH{v\&]3 ! #m2`=Q(x<υx^qsx&2`W%@ ALpGg ~V 6 ?gP#m ;ZZp ("6Hv@p8nP @8B,[ ƅж"thn`g`!.0K3~w #'YO'po'[X0(`^ʩp!ݑ07lǃ]P{=9I ÿCX8C.wiYf) wp@!r`p7 ݆#Pur(Ź7f A@na#'o}>^pG} v.:pyxP $b 'b'g;xܿ2W%fW QTSUuJI^@g n/?yпG" sd׿4׀K ~\?B7q[xGM忳?ɹgP{uAO*~`MՃ9K{iY+?7v(BT"-lT͟vfA>|Cfaw r?CWf=l3s?? r}>+3@@WxOv|"@?pqv?vqXN-m+$=1O}y&K庮(-rq)jFugmZ;Gv&K)QBf1W9G^n#T\x*,}v,1Ftc2mS^Kg=,_\(7I5HKO4+2"%vm^twrBWRom8*mhNl6gZkzxjgNW\9T8\VԴг֕&~G9waDO>Ka{Q<^ $*彣q&ڈTu#iQ (TӓU? Xr"<&:ȃ 4χwWF`ׇqm] Qw^|xn{ćr0 #M2Y~ezMaE‹9``$,B7{> A2 [3 yNy] zd|D|m$^pSgDqWxev߽%H%JƄch%=A׸Yi?jFYE9,*{^蒍?dSE#W?% (gTDz2x8hگ@8~v zeO]~,LS*ٛ752wȄ;1Rq2mNRFDoJplous/{@|TS<ZWOls):4T\{|C2Jܼ)^sNyKC/:!mENo!:~nWs$\a1Ns0|S4Uz|7C2(^nTOzFV$7Wnٌ"rUAsM J'&lvcD؞q$%eČ.Y> ?1`Z \-1}mWֈ,2N0h=y`~YCA˓j Me}$}*:dQ/0d$2NԼ˚Q1k?Lz}"_Pj9OW 2C)l}ގt1^|\#i9,]1.)d/Ϟ:(Ac `,rWA:Tƞƴ=<2/Qe<ߤkHFsԜS?<'vf=AA !82is}TZzi{VW_Bw`hm% 0xFZ~rNvfU)|N^e"B=nZ^W`+Xo5vԖ[Ry^sK5VLvAjzZ֫BKDJ(B&YDLs~>qdv[O|"˭B}ST'hCk{'8'I-s/y G³qPdW5'C~B>M@YcLY{O.冼g+p/IgX5ryk5pSȨ,ІA|]b@|ҹ"} \mYX~(n,UQsFX@ϦefX\q&srʐ7lϴ>f#~ !wnM0 _ז)$CeP2#ʀR`IQѶ?<\ȗ²4mc(OS효XC?g:!u6>g?#/~/LZ&6M>EYۂXq{NϤi Iʵw2E5(z/- bT5*0+%؋R K/hO%OHm ze$OMHtxD#r9ltE LTgj\nЏ-<L=Y3yv͜LeL|09Y#qUsꨤI5Ou)?a:b{Y L}_nXG[R ryTйjАo n7YRS`X-jWʇ]Q@R]dɂrA)m·Ut#S?{TZɚmm@qd~XЄ py{//fIaU7YOuJ_/ }J\ylB>B%BHd#+ srh;@0btLk{-νlJuG×x*X4׉C<1dC]+Hcf^̺7e8~u <>N7 E꼏rz}*WNaĿh !9JqMxvM|TԻ4?(pzUg:N6ʶy u[ 3Ml^@&W§_, m3z,Ks!U4ܱ%> rWjY:AwJcVSk3v֣ZCaU !ƁV!ѡeSDМB/>r uo"wݢz~ 1ՃU-:2Y4O9SSyYYha6TPue(Sc5m[{$KDZwOHAߛjN%;)cvC+^8ynTP6(\%m6XAbے-"l²¯Z}/KG%'d,5L>X{kw56 @w&S&J1ffOE,2BK&Kd'E8Ư2>q''Q+on28*D촶vsA5{V$ʍL ^AFm?Gۦ_ss!1I6pj ]Dobv vP[YݲBϯyˏoDޣV:7_hHhG4٩ XQՉm}FWV(-=fL퍜)WR#ˉ~cc@x OX'bLiWu'ɴ ?5IlJ+WJ=xPw&|#Et"1􂷪}`"d<⹯8N{. SItnv8SUZwG/u|>ah|5;| [Н=ly1nC:G~fpCx;%&'cۨڗ<(SLc[3-8cJnKxjբBCl]@x;}KωIo-./_dN['~&E8 f-r30Vp%]h֡yG{Zma>aj""f牨a/pEћsJ "'DY`k>2RqfypFtq|m + 7z$gD: Ϟ@7g9Uv'"ܺwk$UVWn ' FU_fy(kijѴ04ڰH|Z>BEK{WH s4Tm ^]5)'v2FxJۺ9bq/CߎT?>]vNA xjWw+FykXw\)%hhVW" dfKlsl +4ȔzbxrT^,{E } gLYG0*h.MջAPHEa0JOW&oo\erQ@ + |, |l8̈́4zZ-*\k:Lٕ]C5?h=K_c[<+f_63< ƙ-`T:QjU]-0p7:YHi<Gl*2s c{ZZC(pjKBXڢ٫+ѮVڨdtnE~.N4y 6@*l;-ΗQ=e8oI@;DsMCB 6%ЇE4v"3Bۑp֞B UM5LCqv;a+ ιrJQ~$b [rsj2ߦ@i75K  H>OHP6Ty {&a"t5Tz i܂XQb.vLkUX@b]Ffn"ks$Qcc}?(„uBjr[53Oлm#~jR_fXy5Tk[v-ڣ 0 "<7ٺ=]`>ٗI0Q2V? -D .)en#{ͻP$Ns d-070,o2¦iSB‚U^Ԟob+ ]Go(d\ ʔLjco()*1!+ؙvV񋼍zjTvdR⤬W^$dwya])A6!Fjcs#?f=B뫧zhRof1x;b=Ѿ LVb>K"M6"Us/{S󞞈 [u~*n27צBP ӆ~߫|Rzd_BAR4][>+RbfB]%r0*rÓWfTX_13Q=H?[m9bvܿ.fӷQVC|EN킗ݹhp_ Mƚ*`1z2  ) ֖ ,aaF[#O 5o;>BcMLz -zW7cG0G LJ&c&1\vU]f7%yap[ oXf)/樼{Z})Ab*uj`?%8J/tn5E ]\ф4dD# ܼNP"N墊HCKk&!OKbTo? 8}7qhh$be}@e(a\ fAV`uMI8*#V"!E{N7xVOF* C"ތVPt^+`xݝu8@~l &\TWgx&Oxk}R*Q')Ix=Q̀ʊ /`xQ <=r[Y5}k|o s'V2.IubygFE1}bTE8@ܝBzCfbvs9mX5t Yeȋj{pcR\4{5%'ȟ6Z;]5M0bYۜ籘 MR?14Z<ӲN|l59;D VL~|mh˵IBs}6JY^.~ܔc|ZG`mԘF>'z,^םHݸh8"X,z1arm'`2ٽbiM蜍d/h景H^&̴|Pv^7 ?Kji3T,wjJ!Lu^h]DzEsʊ7)mԻ^R5ˢj P'b2d[؊4_߽Ab2^ ( %.cxYjS )mBʽd0xHGc៼@;44}JaʹţُKtӪ/\ ,)ۊ}i{V#PfęT`t;1x;X휀A,ӅLP%TC,m0T!l C~[׆ryfK9WwB``ICcxlՖ=b]РQz229A Jȳ/ k(R£t=I2?bwW$@CoHjx9_#}홖_*뿸Jm~'qꮎyfJt0yhXD @هH"!*3Jb 1ϭ3^b* MмѺ%~Ȑv?Cʗy)ځJPX̓mzꁝuh;lb8|bU=n= <',-\hKgL<ѰϺK%OP7C]_/\:<ʺ>:KqM#+܏}:G߿'on#ś1"3t/`5-q,7)Pw!V%;z&၀Vnޯv1c.eOZ>shFՠx{&ϚTa#!C&yS'9!Iv,[˒.}:D}}Y?A!'ќsہ#Qi>ŬVqau|ӺǢzK'eʟ wU/*SԎƧ@U%8ߏy3'є#|V՞\z&M6is^|goqVC]Zz5YCQ+Fǝ!zw>'Ro-Moպυ#րBMoFdMG*(Yl%Q5kina! XDN=!_Q%Vi3Ưv Q$hp ؆8^=bW֬хK2smp p-4 endstream endobj 145 0 obj << /Type /FontDescriptor /FontName /DINKEP+CMTI10 /Flags 4 /FontBBox [-35 -250 1124 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 68 /XHeight 431 /CharSet (/e/g/h/i/n/r/t/v) /FontFile 144 0 R >> endobj 146 0 obj << /Length1 1539 /Length2 7844 /Length3 0 /Length 8866 /Filter /FlateDecode >> stream xڍT]6 Ht!1t# C=33tRҠ ]! " ݍ}^k}εϰ1l*0(W( P2 @!> Ptme{@@`P1=6{ =]BQI1I  JMyHl ->: F)G':8b<;(@v_`S K{{{ٸ!`\<o F=-mƇ0t t6`b"C<`&@Iks|IWD6vv07 u8@\M>`MqEml 6?Jl;?D! {~0770]lw  9@۰A!`_{?6G0 %`wΉpN08 p|GxHOpp;$ vߟ`ϗŽaPW1ꣿZSA B1 @O,HY>]_k@Kv\0Ev?r#O忳_x۸A\}b+y?ZY/)C< BO<^Ѽ|@? l A9?F7}?!sE^Wj=l"_\རEDSiC~>( y1}b~ߦ?8$!?_Pu Xؿ0_>_P/_yzx_H~[9`wzf'\r^-Oͻ>$(L{2צ^űPAw%]Fc I Ug#$2MO vSk!#'r\<߲U?TU8cq4 `Q ᣅgV*ȏOXGrC?U/2{EVzgJyP!˙;;pٌ.Q 8Z2KГN[W |A;ށkp5!GIfa6+Cym\U"i ڱ|S-׎(eNY+m"nڢ[?.cŦ C'/\1Q}~@}7?`P-K$5 =`.lVj%GZl‘K4'Jz&2v4¾%`~}M9@ =su:\8S1Iv|Y>49)0G@izc~DIHFOWX''o_6VAe) YؿC&^>~2>(x?*6|FJ{! wcYӞ `sqw9KVn|*88BR 0vL'7KH~br%7S4B{1- 㩝ڇ8 oyo_!N3ixLN4n(QhF,aށ~X (ק`Duyv'F2ů^H|sAŢO@ ys,ۆy~⛝ 5՝d^MT%Z0<|%! VbjO`di>z4dгwɥ):taԖG ''8@&-ْ;e^ܙVxQM1(v{M_d?m_ĥzul>8.*f>G _t8AON~$ݠ`6ScJu z^ҟW&o=i+ZJc+)dgG}Z~(ˍ]֓*$[iq6sr\4;b}6`f+4-P <{63D*wlFe یrQ/ȬqD8ް8F^iͣK 68p*$98s >*{Y)z#J7PK> Ŋ䇯=_/ s c:B+ J)׆\΢ά Bhx~TV.Kf_.GVO40$RX߾x&-o??Brդp{6m-0p}"Ѯ}rp1~(4J-H gwZFU3uBfw˃*`{sMXA8VSi~R7gV#pe ЀJ3X߱>t_KBZ)`LnGa8"K97-Fi`]OLPBboA`G;Xktأo/oUb^r;³wn\ƛqiۃH`N*ɊQ`g4aJ(h%2z>Nj韧zpDV)'a{,hE~RÅ҆sY0^V(>k^((PU_<jŌHGCE#[ݸ8}F45Я )F1hK͜/EM]%M,Dͧb)?18X)rlBg+GnO>"ҹD450i,bd#`FszbjU1.[ab tTֳ˹dK$xN"C#hx Z^}A+%.#ov\r|N^] s p<-v(q_=-] +V-9B~~mn,V K%!JWKCF4:broKQ턱LQa}gḲ:ڦyQ6["P=rVߵmLD<LICcѠlљY;F#J^gu⟓234whkTĹth)4QgF%y)xh}CD߭|?KOqֳ,=5kQt9PԮ1g{9mRȏ5nޚJ&_'{tn{xd͵y~ 1"](x!C(mP h3ȘfCXzU+̌6k`A^ sK$&ӿ%Bq*eoB􇷥r_D┟I(ζPDBα81ld$?d!zVKH7Vu+׍ ohtfR\yJE|&t]J6ݒ",]2l&|&jF+Kn VWn3*wBpN}3:#P6ҹD`V 7b- .P؄-;|&XY$[z+֎.ֆ.lBIYKe  FQ`B[曄h7tIɭ쮾~!_mIؽ7UiYDUP%VRz7pkMm>P>dHo#ѩ:Mk@=%~2(>eu/ _%wlQU%%Aew]N!iHdMbw"⦟hx2jسIDp; h |FwGؓS>5>Zfw:/ \ܴNW9T"x]YC|KZ .CN}< %5Zl7 ·3OB7F!#Y/UzeY'_eߔ*|{{7Cu*|w~Kx)تpa*L~p5nMCl8Sǩ$el+g8Za=*moeƪp璮d[vYcѹ##v^;6벀{{I_jt/m~"^jv f.|kO#%!ΊՒ0{|ctr+ y$gzx`H*S_v[牒[DKdc Vbꁔ rf?<g(3ޖd̓%e1? Ie꽖0I wLȟ蜱e,㧗X p13+膤W(Td|2bIi-avS+s 1n>T)tUe3cCf!{in9E1n֝/ur G$\X24}0&>) 'I2A*#{ !d?lt`u4UpZ1U9 R gU;5?[ h;guhQ`yn%۱Ã^[)X[Np~tl[WqY}2X]>F]fB[M\)ŏ|~u9Y=FOZ@jsV>_¼Ap vO"*} * Σf56? Ƌw.:{!Z14>_ 5Ҷ7fQQ$=C} L+ڪhG*+=E ͩku8ts3c^iXTTD#0*Ml ;WT݄ˏSPx2}xǖ%~X$"{c{G{O؏h >ὐ[q+7"VT/Et.lTٍ E`p9f$H_2:$9V޼IQ7&eue2iA ,/6,ӿċe\a ӟ&-m zv:jSb)}6jX0c_d=fED4) U-V#R_sC͸j_i)tPΟ%].j)HΚnpBLr Ex{reRTu:zW'e'xn6:mxq|jKsʆ>#(LTRv maymz0c0#hy@#.0Zب@o'}G?->BhycaR&?㄄j:wbLBȋR endstream endobj 147 0 obj << /Type /FontDescriptor /FontName /ZQYURG+CMTI12 /Flags 4 /FontBBox [-36 -251 1103 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 63 /XHeight 431 /CharSet (/a/b/c/e/i/l/n/o/r/s/t/u) /FontFile 146 0 R >> endobj 148 0 obj << /Length1 1595 /Length2 9569 /Length3 0 /Length 10611 /Filter /FlateDecode >> stream xڍT.-(];,ܥ(Z\[whšhϹ{VJ|3g7F]]j:9R*ZZ@.7=/;: !\l ' f@a..7пP0@p` z) bmT_L۟p9T@6` {&vL6Nœ (3ja`K ߭q`l .94V dX]B-0Su2@ Y/;w"` qXA5YeWOW67d} 'Ÿqrupw18ZJA.' -9B=} V۰tsv8<0cy`g†w-/''?'  r\an`?:aK+l qO'3/t0'I~@Ͽ?)h+攖Օe;%%v^;7G/, ߧG a׃߹TO#s#.>./iwDnL?~oƓn\v@ K*`Kz\AO hmAB\d!`KumegG:e\vO˓$Oe-@^\OJGNGS;?JM$7>ɏ p8!Oeotz.OO={59 7# y`OB$sHuiTfvE[$5إD`ʖ Ӆ/Z԰-wq;- }G5Z⻾}u鳝qs]{y,ޭW¼/b֎2 *10KJNBp;sq9M5HNJw`;f{Lۥ̀`dGr?Ydާ jG.f^jvaCe.{آ_K g^7z掦g#yRV+Y\Ƃ݁0p{,"҅хqC!CMtMU_a~*(绂t>ݶNӞ_Je`'=O~k^)bnl8H$|{3b*tAQe8^gN@mkwb@T ?7XT-|B\qٲB|E~T%lӴ$5ۣ "f >Rt)"T/#9D >&ˌ~2cȎVݟĎFI%qjW5,Ϥ'Q)%fT\cnzpc#nl٧%# U/SG ; <*>U2HMe04ϊ QUk[k]r^[u܍69Vifth%կH!yuyVʇK×_t/!geu*DLKݕ@~_=WR~Mi'_My/@I@XK@bENM'C$f}+$T도z2nԭy|-N%Z 6r"4NDrY˧c{NNubjp(y)/6S<-owʹQQ11~(}g0 J? OopuQ]ɖJAN LfPyȘ<^gR6]7h#Cw z\o53_Abf5[g~{u(/>Â:ԌD #KyUVaYFF')$J_B/%N6X%V? 22!=Hʕ`GrBf!H!lvJeh3Zo;Ÿ41eJ*fDqHTbUڜf|)&#ǭ#o.~:kB Klڍ|O>TR1Z4ZhV^~"TmJh=eA545W.݁h<(LchI0{/FBb2[1AҊU(u߮2#;ی`rn+(5r~XDTش{Y.[}XY ތ'TWC2$)}S~Ӕ*|'6{>"c=3[%@-j_w]UʠG2(UCJ"By%'"*ğK2FsP;z7P ) -J31>Ǻa?2<_pE&SKLwKv,x 4:H?uܞ@!5zCS>&AԵ$T gi/1>+'f ,=}C92 B-¥- F磉 T*;}aFo7&8M /6P#6x)ɚpZzn%sn ?L|i%D=_&֡w6 i%g.s+r6 ցNIRNU J/&Drʓ!g/h(hW)z m=2GEʁ=pHXgb6̂ #D <7 4$\ux *z\_kttD ~wAk@Ȧ/6j0|Um `Xy},G>Ix3?:"-͡Q.WfL;7/~)|;k"րoHOjV@dKte.5>6p?/軲,7w#fy, Ǿ  JOj1l :~S ub1ɫ$vwzx`h͆9V і-ZHϱZ[{q7葽ZU32cG ,v>Z6PPtG[3yaoIƘ Zv,81:7fRpDM ;9"({erɶc?ja V45] |-sOZ5>HRp 2#jl *ð}^Zuԗ1d{X.߰DܖܺZgHz[Է,t5~#)g,K)#]wA%ixIY1~!𹭽Tq[ N/X@lb羚=㔟qkQngMϐ!Q89u]9AOgx[.Ycp"uC_ٲve1kٶ|y^Z ~>;R2\rsDL_l8C 2XJ3 ‘ם8ۚ,&`_*1EW* 93>4E囕wYX!;9bCk+'r#}DMeZY8{$o/vK('yΗ[ŵɹ鎫Z[Yɽ}Ț>M[ة-`pTwu_zo)Lӄ`ki(fD\t̙/  "Y}y̛Ö)7[kb/F;4|o&^i+5!J%mhU\vme*NJk5GFA 23"oĀ̡F >Et٥ mΘy֔x2kD1 Y=UErI38|r!`A<1LrjStVR-Z*;LGm87 J^Vp͛5k4ϖ*ɓimnR_pW@U2 gkH>BnՂI~d:ޗn?{bĥ9JE? Y +1ʼnA6Q{t"He(;0+NvcVҙ^GXp؜&ꑶ`mxAxt)]֋|Hpp L_)T>1Δ-L說khGm/<-٫h-ùL~*ɏC|{ N&eRGJ *G"ʘ*hy8+0euMp3K]߲x3_WZz8Es^cǒz^d!`X1!7BDR 5RO/9^׸Yob1*"l >s-9Kc9J>GrR ?(%4C}&)wC/CP/ZΤƿS$Pi I[D:B15?xm~}&&[結l[P c{j"d CH2Ppbet[1Njp 1>}9E{wyO9D>.&PFfGBBsv|5^, ~r<1ڏ;" ߢ,#n]|^K0{Be6'b[J& 48mrM^\B ki'F2z,MAIjt;w{:r1מp04wﳽ73XpUjXc% ec??ReGJ<]E-,%cLSbeה֝݌( {O9 >Dop0Bb߾ZǬ[Hó:Zk軥#6YZ@{EY5oCIN^/eenY #>kCLZ0r9mpsCn]љ8 {ķ|E A0Y F6V885w)JVS8<Ģ1OӮrU}/ü=@E,cUPu6{ZShs?-e-݅׼*.C洬" M LmC)*+U=pUQYeݣ0"hCKl$ &x[g4P0͆ʣVo3 z{CĐPXˠ@@x yɄ;-lH;}54i\`^~xo5mH=-2igI(@KSC2E^;"SF:kk]5Heݑ3[ 5֗ A?Fi9;Zx2X61pHT.(*/l;d"b1 4y߶K&;r|j<(e-$@8I0"8**Fe'ޯ /hx\Uפ'M։U)TZOuG"vqQp B빭Z,҄T8$8߻jFb^x [q+ڕvTi +8XO^"4gb̯KYlв:^pE>Ĕ9k! Y0!ЌcMz_m`_D,fG6O?ޢ)/yJ$ۉw҂u=?0c9Mh* *8VS|!6}eՂM=+]M6SJ='ų xEHjzܥ81&²D.4J\a]tݕZ/׽etoq@^Ts2;Q2C@;*S~c/5f)1gsaxLNV$ﹴrP6C2"#T9.ؾ3\ Ѝ$= Z'"d=brL\J|h}=oMnRX sE3?H'D&yPs> 6ӷ3Ar YcDErSF|͎?l| Rm`3xnt 277Mjd%ӌ|ɸW|W8iUPgʼi|f99˃![gB0*UHaf7矅c6nJpD2(^{O<3<<wL9k z~ga?91?{&.iƍUrQGNf*/ma5iJٮ#[RW9E2FVƋJA[2YO+XwJ./Iwl1:RR@=Upn5ˇZ$]ZD U_x;(( Z]Ɵ.R p.RDR.[ vItEף7ϵ4듓&#c% *X4!-)ڞ33 !^Z'Gip %Ԕ6Z?<_)b콿 XBIkcwf2F;5Gg`Ƀ$?RWLxuVRj{^ S@H6>]^oh!XW7}S2 0lf6JZ(|F:=7T=c(gDxњcu58@S(LU7xO$]ٽ#BemāieB3#Bz2΢/Nx]TfreW= g~ԣUH)``Bx\'ų EV&_hrR ĐnH8+9(5JQR N3Y=d!<<4.5*pey,#-20KJ5ұGj< T̾#4Fѡdq)3= ybS%4hڻa*'36w+yIVwjxI=b\S=6P^k?ǽT^B{d/?-IAkFP &##%xHN]dmB&"щ&yGYx {]BZ&~UV/wS+n XlZDxO<7hl69I$M".T7qJ>% 2~*!& 3L)B 6)C YI ^"a'QEG]|4+2!ITYR{S͋n~ u'K:V!Q:ͻrGy *": 74}ar6vh3B[# ՜ +#g_ӡ&0z7πzA+ ;L.#MYov9yo9?_DFOעm"gәFpKsCO ]͘KS3T'׋)rx,Ӓrab7),m"mNh( Zp'MʤLƦ|%R|-"xs6 I?/A xd}]R\P]}x~:o~kO2d1E6N~Ԭgj)[cKH?:l%br1YF相mő (Ǽ}t$zhr@J5Lk%ͪd?~4X!1q xWUNI}M",(H r/77Re=߫&Twe#@dFk-U֏} (gߒTΤfLnӽVQzϻL8|>5. K$3#twF'9=9WsѦnϛ{& \hzN`1kJ~86&N׾ㇵvSe<"aв\7 4x`@+Qh7ՙA_q=_4[Z'e%ҟY.xD?70aU>\Tb?"1<-T|(wS,ykqɼ #JNk,-odydł >{ $_p]nû}ܷB 7udbIۉmj-nⵄ۵ saO ϫ fQQ(b3F>OB [h*jYᑩďbz-{J_ G AE{ K{X8jc.Uc Ay@d;8HF/ƎPe>zG~[Y{Br endstream endobj 149 0 obj << /Type /FontDescriptor /FontName /DCUWWF+CMTT10 /Flags 4 /FontBBox [-4 -233 537 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/N/a/c/e/f/h/i/l/n/o/period/r/s/t/x/y) /FontFile 148 0 R >> endobj 150 0 obj << /Length1 2251 /Length2 8458 /Length3 0 /Length 9775 /Filter /FlateDecode >> stream xڍTZ6LH҂ ]C%R2CCttIH- )8Hz5k̳}#%,9y5]]^22B丌`g *C #e 8]<|AQ!Q  C9dAnK@2=!6pdX,X<""B ۀ-@ q8Qݝ s~pm`d:4.\F o r{4qZ%U#7YoWs<\|I#{3+;`oQ8uSJl0)G=%b2_Oe{ڰ_AxX8RP0Q&Ἢ4vugzxMfgr~埾>ax"mvpxzFoϗ'ྀݡm8u (#}ecY*6$s*l׋_kuY 0۔I~q*q5ӊ@AUat|L^g+m%.,37۲znW Vv IRju i*. ft94IebTO#)ع"L;a\ʐI9QAٯ҉k5JW쎬豱%_PH63 LK._J$"osol\$> R/>t 2 P eZ:+NJ]hÏMfdhk8 b_*a@cS.M ~2Fc[7dua *}^J5@ X-쁞)jg/-s}?\jB5&>Uu'% }&2em-mv+Zз>7w|mvPb(1Pe fbHs50־EcYWth,xSTP\#x)"CdҎB2`ˎ bMrql;yAH\;`,*SUaR9anܗuf7Ѓef]OtdjCC2[h^_S?N!Q6oQ~Ōa9`x'''C=Ky~;|Z >jjR$%BӖSקsclRqŝU?K|:;IvAfH3X>hWB5qHĮ0C)-")f|޻ȧۄx[?W S?%UUHGYINZfh :+Vp6${rxN):9f7Q*=,7 S,I6 b.7V6Tc}nld#߇'PX*%ϒSj:] 6 s[)tN$61ms G:XvQOgx/.4fII>xDE5НKl\ **̝&JwJmw+dUG!۩MVk]d#<̢9/l{@-vRD\!Z2W#z[|o2'>uY,Ek F&PR鑉3;g p}"pц0 i x]X{1Q;Sjc Iߨ^G2mrƖsw`кGC*Fs#MCE_aױxuAB?СW Ô- g$WGGmEDi#vÖ:F8qeZ| 7Zc Vǯi]0h{+8cj)g.y2/~1$ a>=|"sc#]E] LuoO)q1PF~hVx4i@ިR_0 (g q-w3jaeIt3yDH#qw AQURZ*i܇eP=Ph!ñhE܎.7sčM`z .62Cb'9Rhm"P.@MgmظGwܫ8΅w[K^OTf ( Si("Dh̨Ʀs7J,:6,cGakZuv>P Aӟp_D gi}i`gLQe_b}d0vrXOx3d%e"gÂw\^Y&#b{ rÂ=<+5*G%NL?xʊb<'ޚ"y_dzGmPq74/+BhRYdJZ8D-zh^QSKg,Aj(LRI~L0[ݔy[s*yO?b׻pvdK3p29זfy^$9lĥnc&#wr5m$ΒeǼWXzM.7QLmCESW_g1|͈,2W @5v[^-H=-jVRQpJfޠ;Rqe;CFW>mÔ1nw=wa|m24m#9i. >M^IIVY M 6n25 sL&%u:A7uM'&ۘyT,?*i-մʊܻ!Œ3=jtkb+lݖMOMfye:`%Ny%F$(Uӧ؝@Ss{3>M,P;D.2Ts_EI JQdhnt̢_/"bR_VM4Zsr3P\:!9?ntSzEfi4;6JAݨe qGfӉK^(9<DǮ/Ăo~^pff|Sw-=J_242B70KN?|o\1UqgIJn\cLEnzM2yW 3>K tgEec-ئ*i<޳t' QM{QSUn^Y7)CZf#AM@iQ|0 Q:kxMUa~}ܖ. XOTz5{#TZwMetU8^؉;(a{- \P^x݄Q(U53Yv͞ɕxqib=uM"t( t#ޚA025!9'Cs}.:ѕ+>סlkӯY1L͝Bg_R05+~nk6,Nש`ɫ5rM!37ls{S]/|_: Kbw7$'&UYZߪku O }/!:#t&"aş>ɎR܍ޯH{ ]mz.#,?BA-k ΕmWP2g~k7Ηb'y} gjǑj EuP6zʢD$Mޖ #_A66W=r7tL8{b皓Q_܃+=.irN$T/h^20F j^ܿwvε-(ojXV{M.CxKeYcW1D=Vd\>VΩ)pߟq>*e*M@up>FD3v o ';8`GPqŊ+xZ s.12󩩶_4 G +g?FdS jCRA=ڃ<.F8J;²09#. {>8tgj,~L/E"܏wzL, Ul@8ܑuNZILUIލ}zեvHq3}7`dZ/c۷c+IIqhQvy_;@jw@8 #TE[&hֻعvam5yWϓAm솱Gɥ%'m82z; Rp4Lt%KWTNIwW cbxd[wbe/0>Fts~rwdKХu$QŌQtL+|+?Z>~VCwf" b-ZJA+)f1]wKLnFㅨ-8r$Y1kMXɒY)ŵvrSbx3(DzB}#]oDe՛%]}^gy/bO&7T,(*o0 hf~3;ZId3;G3l]@%k߄An6ak[y3,B{9ĬS&Xd:N)X .ӷ}TX.w[i&jĚ{Ѓ[Ǜ3=iO2r*-8-M3ViUקrhOs7w,0ʜȓCEBj }BWVib t3}򽖰'kG`aqdPZ[3loꛯ,'Ac BK`1W2zіI&xjQLm@)S4R7ɱKt%sW>&R2w z|S8 &Oj]. X3UǼ&a!7#ߟ.J jB:ޣ"j<_\^8i|\mXxͤsSmV n_shh%eqKv{[+ncƨ> endobj 152 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=['sv}o|7lԘ[kxBYwS0`Qٮi"m!-M5\F:i0U4e7;yO!(37Px\lCys0l+htcA620Ae L[7Њn& U RZ,cŶPSan aiqD4',IF\Bbu /y2RXR xHXc®eg:'c|0xq?S΃qI&'g΃y9 C :sǡ;(E8o"AJ'Ođ+6KIט'; ztFzKp&q"pBCT/9!ɩ~B}Rq҉TFIܨύ|nTs|neEAxwIyRm4͓_Oyf;s|KۄwU羷{lC'i=>vGr_$Ԩ endstream endobj 46 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LJFDAK+CMB10 /FontDescriptor 127 0 R /FirstChar 12 /LastChar 121 /Widths 123 0 R /ToUnicode 152 0 R >> endobj 153 0 obj << /Length 696 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS >_P{=s@dkx;`VY`s4JaQܡn.Uu9\Y6><ٴ.Z.4>Dӗ}~r:-d0VWk,8yLһʮӮђ[*mLr?q 5F8@=@)& 8Rx uD\j2HV0CzL] bctI g$`htы0\F0s jd< I6zg W qȐ+#k .bsrbmXK7ǵH7Gnb>&jؐu1VljOu$՟qWS/%1{\xB!K(hHTЖ枃Jρϯv=k2UKς_:~$/ ~E+7ˢ/ l(/} -+ZXukoԝE?ZKq endstream endobj 78 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RLYTRW+CMMI10 /FontDescriptor 129 0 R /FirstChar 60 /LastChar 60 /Widths 110 0 R /ToUnicode 153 0 R >> endobj 154 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> endobj 155 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> endobj 156 0 obj << /Length 740 /Filter /FlateDecode >> stream xmUMo0WxvH UdCmU^!1HDI8߯-@=ۙڽ١=?w]pwdV^ڑݧl#oxdGa0NiqF?Sր'YNR}{f{x2A! u xk={Exo"}Rɑ#x۠_J B C쩁b8!=%p&r"D9 Qg̑Tu+gGNN8O-(7ZRntH ʍ(7:hEњr1+w(O:͓.ndm'#Ʉ'> endobj 157 0 obj << /Length 740 /Filter /FlateDecode >> stream xmUMo0WxvH UdC۪TBb B8߯{ .@=/ۙڽs{K;K.k6/k+[M'ҷ>dyӔKe'$cS`vfSfK}fƁVGGf\bu<19w|擬CTAW $rG]IyMsh$aW7y̟u? sK-`θtJ!'c83?NaO<Dg!;IX 0z)rЃ@kpBQ]^Z7! / U <ɉ#W m/%]cX! gȀhID8QN~ACT/sQQRs 穅ύ>7: F+}n4eE=zG~<6OɈy2kLd>O&y2ϓQ>OfdV>OF<dR'<>O)yJS*}𗏿tx>z{O->tՍ]*3>cC~ endstream endobj 50 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XNDOVD+CMR7 /FontDescriptor 137 0 R /FirstChar 49 /LastChar 53 /Widths 119 0 R /ToUnicode 157 0 R >> endobj 158 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdC۪TBb A!Gp?gxYOTm$|՜s_Iss :L;268{zb/}WUjWm?fd}Oi=7gRd{nCN8oͰof-%6'&9Pu`L/"tkں(a[ duS $xqa MN{}m}gىx` tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> endobj 159 0 obj << /Length 675 /Filter /FlateDecode >> stream xuAo0 R{HcIE H9l[5j 8] CfUmóٟۃŏ١.rn|vxb}[6ߺf|歫NNhYgy8å9q7۾q0_f_ дGι/63Dk 6"WT#!YT XF{޺cl_c9K_۾qk8rw麓 G ylIo2"dݾ}hrYWydͼ//V&ZKLxY juwԯx2$OAPyt4sk)$Q "7A?g@c(3jok9E u9/d86dq/@cNiЃ9eyDH{f@/Z`~G. И!`DoSc_ BZ }%m<;4x{[W<Q $R1R R2R:dA3NUAUI5'ZG-^GGGG$zE"ZGmΉ..h$q41q1//fm|T ֵiKN" endstream endobj 58 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QAJLOO+CMSLTT10 /FontDescriptor 141 0 R /FirstChar 33 /LastChar 125 /Widths 117 0 R /ToUnicode 159 0 R >> endobj 160 0 obj << /Length 900 /Filter /FlateDecode >> stream xmUMo:W5?$R. d9M eCkmCp;;w~>|3E_?O]5߶w]Occ]=~?}Oyh9%?۹׬B|Ɯ>);vw%g43>\ 6 EJ78 1{~`W(-;]%=xe_,b+-O;q\L}UI--=BKE1p[! Mߊyu>.N5K)Wb٬8i[_uʕMzQ)V(Txޢjy!Z2P="Zd0\ÃGR\).2*Шa!U,H`+j.5Nα@VK-x%3%AYӀzΚ>kP#5m0Woþj.ZT$X/)n)#Wo(oRZ $Kp4Z-b\1ܰJ P"GXQi/8k^Zq:Zs9dB )sL-7xJ`aɽ)f$1 dъcCZC<73JgznHȰYɚTa,_-O87}KԴܗLloK+gJ.GZyVc48Wt]:P~`rZq.n1] S/Pu7Ue:?&?!d&1yHn5)yғBx#1ޞ]Go׏M?X endstream endobj 79 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FXXUVH+CMSY10 /FontDescriptor 143 0 R /FirstChar 0 /LastChar 0 /Widths 109 0 R /ToUnicode 160 0 R >> endobj 161 0 obj << /Length 750 /Filter /FlateDecode >> stream xmUMo0Wx$*B!qض*jn$H$3Ch<~3~~~ngjv9{C{K;K.k6㳵ችm#O7٦4\ =؏8ݿ߳4ւ8͌>sIvdXC6OLx9im$l6Dl_7ڞhz*{pɲ2kAʶC+mk>lpfIQTT?LA>J e .1PbpqH I$\kL8Hb،Shąr =z51XQg_s2Ē+ sC:CQ}.'c-BbOEu+Xg~:?aj B.U $,ĨAA 2A%%" 19hM_)ELN 1sR3fg =傸aCYjV^w&L= 3nqFyDŽϠOL5'pZx?i^x?IGO:~I4ϼt~3][gF~Qgf}fB3y,h3cL}f23{,g>KYN0`^ay{7)q W7:*ሟS`R̯ endstream endobj 71 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DINKEP+CMTI10 /FontDescriptor 145 0 R /FirstChar 101 /LastChar 118 /Widths 111 0 R /ToUnicode 161 0 R >> endobj 162 0 obj << /Length 750 /Filter /FlateDecode >> stream xmUMo0Wx$*B!qض*jn$H$3Ch<~3~~~ngjv9{C{K;K.k6㳵ችm#O7٦4\ =؏8ݿ߳4B8͌>sIvdXC6OLx9im$l6Dl_7ڞhz*{pɲ2kAʶC+mk>lpfIQTT?LA>J e .1PbpqH I$\kL8Hb،Shąr =z51XQg_s2Ē+ sC:CQ}.'c-BbOEu+Xg~:?aj B.U $,ĨAA 2A%%" 19hM_)ELN 1sR3fg =傸aCYjV^w&L= 3nqFyDŽϠOL5'pZx?i^x?IGO:~I4ϼt~3][gF~Qgf}fB3y,h3cL}f23{,g>KYN0`^ay{7)q W7:*ሟS`R$m endstream endobj 47 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZQYURG+CMTI12 /FontDescriptor 147 0 R /FirstChar 97 /LastChar 117 /Widths 122 0 R /ToUnicode 162 0 R >> endobj 163 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 M endstream endobj 70 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DCUWWF+CMTT10 /FontDescriptor 149 0 R /FirstChar 46 /LastChar 121 /Widths 112 0 R /ToUnicode 163 0 R >> endobj 164 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 ᫄ endstream endobj 49 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZIITZW+CMTT12 /FontDescriptor 151 0 R /FirstChar 34 /LastChar 125 /Widths 120 0 R /ToUnicode 164 0 R >> endobj 53 0 obj << /Type /Pages /Count 6 /Parent 165 0 R /Kids [38 0 R 55 0 R 60 0 R 65 0 R 74 0 R 81 0 R] >> endobj 88 0 obj << /Type /Pages /Count 5 /Parent 165 0 R /Kids [85 0 R 91 0 R 97 0 R 102 0 R 106 0 R] >> endobj 165 0 obj << /Type /Pages /Count 11 /Kids [53 0 R 88 0 R] >> endobj 166 0 obj << /Type /Outlines /First 3 0 R /Last 35 0 R /Count 9 >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 166 0 R /Prev 31 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 166 0 R /Prev 27 0 R /Next 35 0 R >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 166 0 R /Prev 23 0 R /Next 31 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 166 0 R /Prev 19 0 R /Next 27 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 166 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 166 0 R /Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 166 0 R /Prev 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 166 0 R /Prev 3 0 R /Next 11 0 R >> endobj 3 0 obj << /Title 4 0 R /A 1 0 R /Parent 166 0 R /Next 7 0 R >> endobj 167 0 obj << /Names [(Doc-Start) 43 0 R (Hfootnote.1) 51 0 R (Hfootnote.2) 69 0 R (Hfootnote.3) 77 0 R (Hfootnote.4) 94 0 R (Hfootnote.5) 100 0 R] /Limits [(Doc-Start) (Hfootnote.5)] >> endobj 168 0 obj << /Names [(page.1) 42 0 R (page.10) 104 0 R (page.11) 108 0 R (page.2) 57 0 R (page.3) 62 0 R (page.4) 67 0 R] /Limits [(page.1) (page.4)] >> endobj 169 0 obj << /Names [(page.5) 76 0 R (page.6) 83 0 R (page.7) 87 0 R (page.8) 93 0 R (page.9) 99 0 R (section.1) 2 0 R] /Limits [(page.5) (section.1)] >> endobj 170 0 obj << /Names [(section.2) 6 0 R (section.3) 10 0 R (section.4) 14 0 R (section.5) 18 0 R (section.6) 22 0 R (section.7) 26 0 R] /Limits [(section.2) (section.7)] >> endobj 171 0 obj << /Names [(section.8) 30 0 R (section.9) 34 0 R] /Limits [(section.8) (section.9)] >> endobj 172 0 obj << /Kids [167 0 R 168 0 R 169 0 R 170 0 R 171 0 R] /Limits [(Doc-Start) (section.9)] >> endobj 173 0 obj << /Dests 172 0 R >> endobj 174 0 obj << /Type /Catalog /Pages 165 0 R /Outlines 166 0 R /Names 173 0 R /PageMode/UseOutlines /OpenAction 37 0 R >> endobj 175 0 obj << /Producer (MiKTeX pdfTeX-1.40.24) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20220116101930-08'00') /ModDate (D:20220116101930-08'00') /Trapped /False /PTEX.Fullbanner (This is MiKTeX-pdfTeX 4.10.0 (1.40.24)) >> endobj xref 0 176 0000000000 65535 f 0000000015 00000 n 0000005181 00000 n 0000197131 00000 n 0000000060 00000 n 0000000146 00000 n 0000008550 00000 n 0000197047 00000 n 0000000191 00000 n 0000000435 00000 n 0000010563 00000 n 0000196961 00000 n 0000000480 00000 n 0000000598 00000 n 0000016165 00000 n 0000196873 00000 n 0000000644 00000 n 0000000772 00000 n 0000019108 00000 n 0000196785 00000 n 0000000818 00000 n 0000001040 00000 n 0000021512 00000 n 0000196697 00000 n 0000001086 00000 n 0000001321 00000 n 0000026361 00000 n 0000196609 00000 n 0000001367 00000 n 0000001500 00000 n 0000028816 00000 n 0000196521 00000 n 0000001546 00000 n 0000001714 00000 n 0000030696 00000 n 0000196446 00000 n 0000001760 00000 n 0000001837 00000 n 0000004793 00000 n 0000004920 00000 n 0000005294 00000 n 0000001885 00000 n 0000005073 00000 n 0000005126 00000 n 0000188092 00000 n 0000187110 00000 n 0000184210 00000 n 0000194097 00000 n 0000190053 00000 n 0000195927 00000 n 0000189074 00000 n 0000005235 00000 n 0000186129 00000 n 0000196089 00000 n 0000008604 00000 n 0000008389 00000 n 0000005448 00000 n 0000008497 00000 n 0000190968 00000 n 0000010618 00000 n 0000010402 00000 n 0000008722 00000 n 0000010510 00000 n 0000013155 00000 n 0000013420 00000 n 0000013028 00000 n 0000010724 00000 n 0000013308 00000 n 0000031565 00000 n 0000013361 00000 n 0000195012 00000 n 0000193103 00000 n 0000015961 00000 n 0000016279 00000 n 0000015834 00000 n 0000013586 00000 n 0000016112 00000 n 0000016220 00000 n 0000185148 00000 n 0000192113 00000 n 0000019163 00000 n 0000018947 00000 n 0000016469 00000 n 0000019055 00000 n 0000021567 00000 n 0000021351 00000 n 0000019293 00000 n 0000021459 00000 n 0000196199 00000 n 0000023732 00000 n 0000023996 00000 n 0000023605 00000 n 0000021685 00000 n 0000023884 00000 n 0000023937 00000 n 0000026155 00000 n 0000026475 00000 n 0000026028 00000 n 0000024150 00000 n 0000026308 00000 n 0000026415 00000 n 0000028872 00000 n 0000028650 00000 n 0000026641 00000 n 0000028761 00000 n 0000030752 00000 n 0000030530 00000 n 0000028991 00000 n 0000030641 00000 n 0000030871 00000 n 0000030896 00000 n 0000030921 00000 n 0000031038 00000 n 0000031361 00000 n 0000031813 00000 n 0000031839 00000 n 0000031900 00000 n 0000031936 00000 n 0000032327 00000 n 0000032938 00000 n 0000032987 00000 n 0000033558 00000 n 0000033607 00000 n 0000033712 00000 n 0000034337 00000 n 0000034949 00000 n 0000035270 00000 n 0000048574 00000 n 0000048897 00000 n 0000055910 00000 n 0000056135 00000 n 0000072902 00000 n 0000073249 00000 n 0000092407 00000 n 0000092836 00000 n 0000102474 00000 n 0000102718 00000 n 0000110451 00000 n 0000110691 00000 n 0000118419 00000 n 0000118659 00000 n 0000135651 00000 n 0000136140 00000 n 0000143108 00000 n 0000143334 00000 n 0000152590 00000 n 0000152826 00000 n 0000161812 00000 n 0000162056 00000 n 0000172787 00000 n 0000173040 00000 n 0000182935 00000 n 0000183390 00000 n 0000184371 00000 n 0000185309 00000 n 0000186290 00000 n 0000187271 00000 n 0000188253 00000 n 0000189233 00000 n 0000190212 00000 n 0000191132 00000 n 0000192272 00000 n 0000193266 00000 n 0000194259 00000 n 0000195174 00000 n 0000196304 00000 n 0000196372 00000 n 0000197202 00000 n 0000197395 00000 n 0000197555 00000 n 0000197716 00000 n 0000197895 00000 n 0000197999 00000 n 0000198104 00000 n 0000198142 00000 n 0000198269 00000 n trailer << /Size 176 /Root 174 0 R /Info 175 0 R /ID [ ] >> startxref 198543 %%EOF iterators/inst/doc/writing.Rnw0000644000176200001440000005006014171060105016157 0ustar liggesusers% \VignetteIndexEntry{Writing Custom Iterators} % \VignetteDepends{iterators} % \VignettePackage{iterators} \documentclass[12pt]{article} \usepackage{amsmath} \usepackage[pdftex]{graphicx} \usepackage{color} \usepackage{xspace} \usepackage{fancyvrb} \usepackage{fancyhdr} \usepackage[ colorlinks=true, linkcolor=blue, citecolor=blue, urlcolor=blue] {hyperref} \usepackage{lscape} \usepackage{Sweave} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % define new colors for use \definecolor{darkgreen}{rgb}{0,0.6,0} \definecolor{darkred}{rgb}{0.6,0.0,0} \definecolor{lightbrown}{rgb}{1,0.9,0.8} \definecolor{brown}{rgb}{0.6,0.3,0.3} \definecolor{darkblue}{rgb}{0,0,0.8} \definecolor{darkmagenta}{rgb}{0.5,0,0.5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\bld}[1]{\mbox{\boldmath $#1$}} \newcommand{\shell}[1]{\mbox{$#1$}} \renewcommand{\vec}[1]{\mbox{\bf {#1}}} \newcommand{\ReallySmallSpacing}{\renewcommand{\baselinestretch}{.6}\Large\normalsize} \newcommand{\SmallSpacing}{\renewcommand{\baselinestretch}{1.1}\Large\normalsize} \newcommand{\halfs}{\frac{1}{2}} \setlength{\oddsidemargin}{-.25 truein} \setlength{\evensidemargin}{0truein} \setlength{\topmargin}{-0.2truein} \setlength{\textwidth}{7 truein} \setlength{\textheight}{8.5 truein} \setlength{\parindent}{0.20truein} \setlength{\parskip}{0.10truein} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \pagestyle{fancy} \lhead{} \chead{Writing Custom Iterators} \rhead{} \lfoot{} \cfoot{} \rfoot{\thepage} \renewcommand{\headrulewidth}{1pt} \renewcommand{\footrulewidth}{1pt} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title{Writing Custom Iterators} \author{Steve Weston} \begin{document} \maketitle \thispagestyle{empty} \section{Introduction} <>= library(iterators) @ An {\em iterator} is a special type of object that supplies data on demand, one element\footnote{An ``element'' in this case can be basically any object. I don't mean to suggest that the data is necessarily returned as scalar values, for example.} at a time. This is a nice abstraction that can help simplify many programs. Iterators are particularly useful in parallel computing, since they facilitate splitting a problem into smaller pieces that can then be executed in parallel. Iterators can also be used to reduce the total memory that is needed at any one time. For example, if you want to process the lines of text in a file, it is common to write a loop that reads the file one line at a time, rather than reading the entire file in order to avoid running out of memory on huge files. That's the basic idea of iterators. Iterators provide a standard method for getting the next element, which allows us to write functions that take an iterator as an argument to provide a source of data. The function doesn't need to know what kind of iterator it is. It just needs to know how to get another piece of data. The data could be coming from a file, a database, a vector, or it could be dynamically generated. There are a number of iterators that come in the \texttt{iterators} package. The \texttt{iapply} function allows you to iterate over arrays, in much the same way as the standard \texttt{apply} function. \texttt{apply} has fixed rules on how the results are returned, which may require you to reshape the results, which can be inefficient, as well as inconvenient. But since \texttt{iapply} doesn't process any data or combine the results, it is more flexible. You can use \texttt{iapply} with the \texttt{foreach} package to perform a parallel \texttt{apply} operation, and combine the results any way you want via the \texttt{.combine} argument to \texttt{foreach}. Another iterator that comes in the \texttt{iterators} package is the \texttt{isplit} function, which works much like the standard \texttt{split} function. \texttt{split} returns a list containing all of the data divided into groups. \texttt{isplit} only generates one group at a time, as they are needed, which can reduce the amount memory that is needed. But of course, there will be times when you need an iterator that isn't provided by the \texttt{iterators} package. That is when you need to write your own custom iterator. Fortunately, that is fairly easy to do. \section{What methods are needed for an iterator?} Basically, an iterator is an S3 object whose base class is \texttt{iter}, and has \texttt{iter} and \texttt{nextElem} methods. The purpose of the \texttt{iter} method is to return an iterator for the specified object. For iterators, that usually just means returning itself, which seems odd at first. But the \texttt{iter} method can be defined for other objects that don't define a \texttt{nextElem} method. We call those objects {\em iterables}, meaning that you can iterate over them. The \texttt{iterators} package defines \texttt{iter} methods for vectors, lists, matrices, and data frames, making those objects iterables. By defining an \texttt{iter} method for iterators, they can be used in the same context as an iterable, which can be convenient. For example, the \texttt{foreach} function takes iterables as arguments. It calls the \texttt{iter} method on those arguments in order to create iterators for them. By defining the \texttt{iter} method for all iterators, we can pass iterators to \texttt{foreach} that we created using any method we choose. Thus, we can pass vectors, lists, or iterators to \texttt{foreach}, and they are all processed by \texttt{foreach} in exactly the same way. The \texttt{iterators} package comes with an \texttt{iter} method defined for the \texttt{iter} class that simply returns itself. That is usually all that is needed for an iterator. However, if you want to create an iterator for some existing class, you can do that by writing an \texttt{iter} method that returns an appropriate iterator. That will allow you to pass an instance of your class to \texttt{foreach}, which will automatically convert it into an iterator. The alternative is to write your own function that takes arbitrary arguments, and returns an iterator. You can choose whichever method is most natural. The most important method required for iterators is \texttt{nextElem}. This simply returns the next value, or throws an error. Calling the \texttt{stop} function with the string \texttt{'StopIteration'} indicates that there are no more values available in the iterator. Now before we write our own iterator, let's try calling the \texttt{iter} and \texttt{nextElem} methods on an existing one. Since a list is an iterable, we can create an iterator for that list by calling \texttt{iter} on it: <>= it <- iter(list(1:2, 3:4)) @ We can now call \texttt{nextElem} on the resulting iterator to get the values from the list: <>= nextElem(it) nextElem(it) tryCatch(nextElem(it), error=function(e) e) @ As you can see, it is possible to call these methods manually, but it's somewhat awkward, since you have to handle the \texttt{'StopIteration'} error. Later on, we'll see one solution to this difficulty, although, in general, you don't call these method explicitly. \section{A simple iterator} It's time to show the implementation of a very simple iterator. Although I've made it sound like you have to write your own \texttt{iter} and \texttt{nextElem} methods, you can inherit them. In fact, that's what all of the following examples do. I do that by inheriting from the \texttt{abstractiter} class. The \texttt{abstractiter} class uses the standard \texttt{iter} method which returns itself, and defines a \texttt{nextElem} method that calls the \texttt{nextElem} element of the object. Let's take a look at the implementation of these two methods: <>= iterators:::iter.iter iterators:::nextElem.abstractiter @ Now here's a function that creates a very simple iterator that uses these two methods: <>= iforever <- function(x) { nextEl <- function() x obj <- list(nextElem=nextEl) class(obj) <- c('iforever', 'abstractiter', 'iter') obj } @ Note that I called the internal function \texttt{nextEl} rather than \texttt{nextElem}. I do that by convention to avoid masking the standard \texttt{nextElem} generic function. That causes problems when you want your iterator to call the \texttt{nextElem} method of another iterator, which can be quite useful, as we'll see in a later example. We create an instance of this iterator by calling the \texttt{iforever} function, and then use it by calling the \texttt{nextElem} method on the resulting object: <>= it <- iforever(42) nextElem(it) nextElem(it) @ You can also get values from an iterator using \texttt{as.list}. But since this is an infinite iterator, you need to use the \texttt{n} argument to avoid using up a lot of memory and time: <>= unlist(as.list(it, n=6)) @ Notice that it doesn't make sense to implement this iterator by defining a new \texttt{iter} method, since there is no natural iterable on which to dispatch. The only argument that we need is the object for the iterator to return, which can be of any type. Instead, we implement this iterator by defining a normal function that returns the iterator. This iterator is quite simple to implement, and possibly even useful.\footnote{Be careful how you use this iterator! If you pass it to \texttt{foreach}, it will result in an infinite loop unless you pair it with a non-infinite iterator. Also, {\em never} pass this to the \texttt{as.list} function without the \texttt{n} argument.} The iterator returned by \texttt{iforever} is a list that has a single element named \texttt{nextElem}, whose value is a function that returns the value of \texttt{x}. Because we are subclassing \texttt{abstractiter}, we inherit a \texttt{nextElem} method that will call this function, and because we are subclassing \texttt{iter}, we inherit an \texttt{iter} method that will return itself. Of course, the reason this iterator is so simple is because it doesn't contain any state. Most iterators need to contain some state, or it will be difficult to make it return different values and eventually stop. Managing the state is usually the real trick to writing iterators. \section{A stateful iterator} Let's modify the previous iterator to put a limit on the number of values that it returns. I'll call the new function \texttt{irep}, and give it another argument called \texttt{times}: <>= irep <- function(x, times) { nextEl <- function() { if (times > 0) times <<- times - 1 else stop('StopIteration') x } obj <- list(nextElem=nextEl) class(obj) <- c('irep', 'abstractiter', 'iter') obj } @ Now let's try it out: <>= it <- irep(7, 6) unlist(as.list(it)) @ The real difference between \texttt{iforever} and \texttt{irep} is in the function that gets called by the \texttt{nextElem} method. This function not only accesses the values of the variables \texttt{x} and \texttt{times}, but it also modifies the value of \texttt{times}. This is accomplished by means of the ``\verb=<<-='' \footnote{It's commonly believed that ``$<<-$'' is only used to set variables in the global environment, but that isn't true. I think of it as an {\em inheriting} assignment operator.} operator, and the magic of lexical scoping. Technically, this kind of function is called a {\em closure}, and is a somewhat advanced feature of \texttt{R}. The important thing to remember is that \texttt{nextEl} is able to get the value of variables that were passed as arguments to \texttt{irep}, and it can modify those values using the ``\verb=<<-='' operator. These are {\em not} global variables: they are defined in the enclosing environment of the \texttt{nextEl} function. You can create as many iterators as you want using the \texttt{irep} function, and they will all work as expected without conflicts. Note that this iterator only uses the arguments to \texttt{irep} to store its state. If any other state variables are needed, they can be defined anywhere inside the \texttt{irep} function. \section{Using an iterator inside an iterator} The previous section described a general way of writing custom iterators. Almost any iterator can be written using those basic techniques. At times, it may be simpler to make use of an existing iterator to implement a new iterator. Let's say that you need an iterator that splits a vector into subvectors. That can allow you to process the vector in parallel, but still use vector operations, which is essential to getting good sequential performance in R. The following function returns just such an iterator: <>= ivector <- function(x, ...) { i <- 1 it <- idiv(length(x), ...) nextEl <- function() { n <- nextElem(it) ix <- seq(i, length=n) i <<- i + n x[ix] } obj <- list(nextElem=nextEl) class(obj) <- c('ivector', 'abstractiter', 'iter') obj } @ \texttt{ivector} uses \texttt{...} to pass options on to \texttt{idiv}. \texttt{idiv} supports the \texttt{chunks} argument to split its argument into a specified number of pieces, and the \texttt{chunkSize} argument to split it into pieces of a specified maximum size. Let's create an \texttt{ivector} iterator to split a vector into three pieces using the \texttt{chunks} argument: <>= it <- ivector(1:25, chunks=3) as.list(it) @ Note that the \texttt{nextEl} function doesn't seem to throw a \texttt{StopIteration} exception. It is actually throwing it indirectly, by calling \texttt{nextElem} on the iterator created via the \texttt{idiv} function. This function is fairly simple, because most of the tricky stuff is handled by \texttt{idiv}. \texttt{ivector} focuses on operating on the vector. It should be clear that only minor modification need to be made to this function to create an iterator over the blocks of rows or columns of a matrix or data frame. But I'll leave that as an exercise for the reader. \section{Adding a \texttt{hasNext} method to an iterator} At times it would be nice to write a loop that explicitly gets the values of an iterator. Although that is certainly possible with a standard iterator, it requires some rather awkward error handling. One solution to this problem is to add a method that indicates whether there is another value available in the iterator. Then you can write a simple while loop that stops when there are no more values. One way to do that would be to define a new S3 method called \texttt{hasNext}. Here's the definition of a \texttt{hasNext} generic function: <>= hasNext <- function(obj, ...) { UseMethod('hasNext') } @ We also need to define \texttt{hasNext} method for a iterator class that we'll call \texttt{ihasNext}: <>= hasNext.ihasNext <- function(obj, ...) { obj$hasNext() } @ As you can see, an \texttt{ihasNext} object must be a list with a \texttt{hasNext} element that is a function. That's the same technique that the \texttt{abstractiter} class uses to implement the \texttt{nextElem} method. Now we'll define a function, called \texttt{ihasNext}, that takes an arbitrary iterator and returns returns an \texttt{ihasNext} iterator that wraps the specified iterator. That allows us to turn any iterator into an \texttt{ihasNext} iterator, thus providing it with a \texttt{hasNext} method:\footnote{Thanks to Hadley Wickham for contributing this function, which I only hacked up a little. You can also find this function, along with \texttt{hasNext} and \texttt{hasNext.ihasNext} in the examples directory of the iterators packages.} <>= ihasNext <- function(it) { if (!is.null(it$hasNext)) return(it) cache <- NULL has_next <- NA nextEl <- function() { if (!hasNx()) stop('StopIteration', call.=FALSE) has_next <<- NA cache } hasNx <- function() { if (!is.na(has_next)) return(has_next) tryCatch({ cache <<- nextElem(it) has_next <<- TRUE }, error=function(e) { if (identical(conditionMessage(e), 'StopIteration')) { has_next <<- FALSE } else { stop(e) } }) has_next } obj <- list(nextElem=nextEl, hasNext=hasNx) class(obj) <- c('ihasNext', 'abstractiter', 'iter') obj } @ When the \texttt{hasNext} method is called, it calls the \texttt{nextElem} method on the underlying iterator, and the resulting value is saved. That value is then passed to the user when \texttt{nextElem} is called. Of course, it also does the right thing if you don't call \texttt{hasNext}, or if you call it multiple times before calling \texttt{nextElem}. So now we can easily create an \texttt{icount} iterator, and get its values in a while loop, without having to do any messy error handling: <>= it <- ihasNext(icount(3)) while (hasNext(it)) { print(nextElem(it)) } @ \section{A recycling iterator} The \texttt{ihasNext} function from the previous section is an interesting example of a function that takes an iterator and returns an iterator that wraps the specified iterator. In that case, we wanted to add another method to the iterator. In this example, we'll return an iterator that recycles the values of the wrapped iterator:\footnote{ Actually, some of the standard \texttt{iter} methods support a \texttt{recycle} argument. But this is a nice example, and a more general solution, since it works on any iterator.} <>= irecycle <- function(it) { values <- as.list(iter(it)) i <- length(values) nextEl <- function() { i <<- i + 1 if (i > length(values)) i <<- 1 values[[i]] } obj <- list(nextElem=nextEl) class(obj) <- c('irecycle', 'abstractiter', 'iter') obj } @ This is fairly nice, but note that this is another one of those infinite iterators that we need to be careful about. Also, make sure that you don't pass an infinite iterator to \texttt{irecycle}. That would be pointless of course, since there's no reason to recycle an iterator that never ends. It would be possible to write this to avoid that problem by not grabbing all of the values right up front, but you would still end up saving values that will never be recycled, so I've opted to keep this simple. Let's try it out: <>= it <- irecycle(icount(3)) unlist(as.list(it, n=9)) @ \section{Limiting infinite iterators} I was tempted to add an argument to the \texttt{irecycle} function to limit the number of values that it returns, because sometimes you want to recycle for awhile, but not forever. I didn't do that, because rather than make \texttt{irecycle} more complicated, I decided to write yet another function that takes an iterator and returns a modified iterator to handle that task: <>= ilimit <- function(it, times) { it <- iter(it) nextEl <- function() { if (times > 0) times <<- times - 1 else stop('StopIteration') nextElem(it) } obj <- list(nextElem=nextEl) class(obj) <- c('ilimit', 'abstractiter', 'iter') obj } @ Note that this looks an awful lot like the \texttt{irep} function that we implemented previously. In fact, using \texttt{ilimit}, we can implement \texttt{irep} using \texttt{iforever} much more simply, and without duplication of code: <>= irep2 <- function(x, times) ilimit(iforever(x), times) @ To demonstrate \texttt{irep2}, I'll use \texttt{ihasNext} and a while loop: <>= it <- ihasNext(irep2('foo', 3)) while (hasNext(it)) { print(nextElem(it)) } @ Here's one last example. Let's recycle a vector three times using \texttt{ilimit}, and convert it back into a vector using \texttt{as.list} and \texttt{unlist}: <>= iterable <- 1:3 n <- 3 it <- ilimit(irecycle(iterable), n * length(iterable)) unlist(as.list(it)) @ Sort of a complicated version of: <>= rep(iterable, n) @ Aren't iterators fun? \section{Conclusion} Writing your own iterators can be quite simple, and yet is very useful and powerful. It provides a very effective way to extend the capabilities of other packages that use iterators, such as the \texttt{foreach} package. By writing iterators that wrap other iterators, it is possible to put together a powerful and flexible set of tools that work well together, and that can solve many of the complex problems that come up in parallel computing. \end{document} iterators/inst/doc/iterators.R0000644000176200001440000000233714171060661016156 0ustar liggesusers### R code from vignette source 'iterators.Rnw' ################################################### ### code chunk number 1: ex1 ################################################### library(iterators) i1 <- iter(1:10) nextElem(i1) nextElem(i1) ################################################### ### code chunk number 2: ex2 ################################################### istate <- iter(state.x77, by='row') nextElem(istate) nextElem(istate) ################################################### ### code chunk number 3: ex3 ################################################### ifun <- iter(function() sample(0:9, 4, replace=TRUE)) nextElem(ifun) nextElem(ifun) ################################################### ### code chunk number 4: ex5 ################################################### library(iterators) itrn <- irnorm(10) nextElem(itrn) nextElem(itrn) ################################################### ### code chunk number 5: ex6 ################################################### itru <- irunif(10) nextElem(itru) nextElem(itru) ################################################### ### code chunk number 6: ex7 ################################################### it <- icount(3) nextElem(it) nextElem(it) nextElem(it) iterators/inst/unitTests/0000755000176200001440000000000014171060105015240 5ustar liggesusersiterators/inst/unitTests/runTestSuite.sh0000644000176200001440000000134614171060105020256 0ustar liggesusers#!/bin/sh LOGFILE=test.log R --vanilla --slave > ${LOGFILE} 2>&1 <<'EOF' library(iterators) library(RUnit) options(warn=1) options(showWarnCalls=TRUE) cat('Starting test at', date(), '\n') tests <- c('basicTest.R', 'iapplyTest.R', 'isplitTest.R', 'icountnTest.R', 'chunksizeTest.R', 'recycleTest.R') errcase <- list() for (f in tests) { cat('\nRunning test file:', f, '\n') t <- runTestFile(f) e <- getErrors(t) if (e$nErr + e$nFail > 0) { errcase <- c(errcase, t) print(t) } } if (length(errcase) == 0) { cat('*** Ran all tests successfully ***\n') } else { cat('!!! Encountered', length(errcase), 'problems !!!\n') for (t in errcase) { print(t) } } cat('Finished test at', date(), '\n') EOF iterators/inst/unitTests/iapplyTest.R0000644000176200001440000000170214171060105017521 0ustar liggesuserslibrary(iterators) # test iapply on 3D arrays test01 <- function() { test <- function(actual, it) { expected <- nextElem(it) checkEquals(expected, actual) NULL } a <- array(1:24, c(2,3,4)) margins <- list(1, 2, 3, c(1, 2), c(1, 3), c(2, 1), c(2, 3), c(3, 1), c(3, 2), c(1, 2, 3), c(1, 3, 2), c(2, 1, 3), c(2, 3, 1), c(3, 1, 2), c(3, 2, 1)) for(MARGIN in margins) { # cat(sprintf('testing %s\n', paste(MARGIN, collapse=', '))) it <- iapply(a, MARGIN) apply(a, MARGIN, test, it) } } # test iapply on matrices test02 <- function() { test <- function(actual, it) { expected <- nextElem(it) checkEquals(expected, actual) NULL } m <- matrix(1:24, c(6,4)) margins <- list(1, 2, c(1, 2), c(2, 1)) for(MARGIN in margins) { # cat(sprintf('testing %s\n', paste(MARGIN, collapse=', '))) it <- iapply(m, MARGIN) apply(m, MARGIN, test, it) } } iterators/inst/unitTests/chunksizeTest.R0000644000176200001440000000130314171060105020223 0ustar liggesuserslibrary(iterators) # test that various values of chunksize test01 <- function() { nr <- 13 nc <- 21 mat <- matrix(rnorm(nr * nc), nr) for (n in 1:(nc+2)) { it <- iter(mat, by='col', chunksize=n) bcols <- as.list(it) for (bcol in bcols) { checkTrue(nrow(bcol) == nr) checkTrue(ncol(bcol) <= n && ncol(bcol) >= 1) } actual <- do.call('cbind', bcols) checkEquals(mat, actual) } for (n in 1:(nr+2)) { it <- iter(mat, by='row', chunksize=n) brows <- as.list(it) for (brow in brows) { checkTrue(ncol(bcol) == nc) checkTrue(nrow(brow) <= n && nrow(brow) >= 1) } actual <- do.call('rbind', brows) checkEquals(mat, actual) } } iterators/inst/unitTests/isplitTest.R0000644000176200001440000000165014171060105017531 0ustar liggesuserslibrary(iterators) # test isplit with a single factor test01 <- function() { x <- rnorm(200) f <- factor(sample(1:10, length(x), replace=TRUE)) it <- isplit(x, f) expected <- split(x, f) for (i in expected) { actual <- nextElem(it) checkEquals(actual$value, i) } it <- isplit(x, f, drop=TRUE) expected <- split(x, f, drop=TRUE) for (i in expected) { actual <- nextElem(it) checkEquals(actual$value, i) } } # test isplit with two factors test02 <- function() { x <- rnorm(200) f <- list(factor(sample(1:10, length(x), replace=TRUE)), factor(sample(1:10, length(x), replace=TRUE))) it <- isplit(x, f) expected <- split(x, f) for (i in expected) { actual <- nextElem(it) checkEquals(actual$value, i) } it <- isplit(x, f, drop=TRUE) expected <- split(x, f, drop=TRUE) for (i in expected) { actual <- nextElem(it) checkEquals(actual$value, i) } } iterators/inst/unitTests/recycleTest.R0000644000176200001440000000051414171060105017651 0ustar liggesusers# simple test of recycle test01 <- function() { if (require(foreach, quietly=TRUE)) { nr <- 21 nc <- 17 x <- rnorm(nr) it <- iter(x, recycle=TRUE) actual <- foreach(y=it, icount(nr*nc), .combine='c') %do% y dim(actual) <- c(nr, nc) expected <- matrix(x, nr, nc) checkEquals(actual, expected) } } iterators/inst/unitTests/basicTest.R0000644000176200001440000000672514171060105017316 0ustar liggesuserslibrary(iterators) test00 <- function() {} # test vector iterator creation test01 <- function() { x <- iter(1:10) } # test hasNext, nextElem test02 <- function() { x <- iter(1:10) checkEquals(nextElem(x), 1) for(i in 1:9) nextElem(x) checkException(nextElem(x)) } # check checkFunc test03 <- function() { x <- iter(1:100, checkFunc=function(i) i%%10==0) checkEquals(nextElem(x), 10) for(i in 1:9) nextElem(x) checkException(nextElem(x)) } # test matrix iterator creation test04 <- function() { x <- matrix(1:10,ncol=2) } # test hasNext, nextElem test05 <- function() { x <- matrix(1:10,ncol=2) # by cell y <- iter(x,by='cell') checkEquals(nextElem(y), 1) for(i in 1:9) nextElem(y) checkException(nextElem(y)) # by col y <- iter(x,by='column') checkEquals(nextElem(y), matrix(1:5, ncol=1)) nextElem(y) checkException(nextElem(y)) # by row y <- iter(x,by='row') checkEquals(nextElem(y), matrix(c(1,6),nrow=1)) for(i in 1:4) nextElem(y) checkException(nextElem(y)) } # test checkFunc test06 <- function() { # create a larger matrix x <- matrix(1:100, ncol=20) # by cell y <- iter(x, by='cell', checkFunc=function(i) i%%10==0) checkEquals(nextElem(y), 10) for(i in 1:9) nextElem(y) checkException(nextElem(y)) # by col y <- iter(x, by='column', checkFunc=function(i) i[5]%%10==0) checkEquals(nextElem(y), as.matrix(x[,2])) for(i in 1:9) nextElem(y) checkException(nextElem(y)) # by row # create an easier matrix to deal with x <- matrix(1:100, nrow=20, byrow=TRUE) y <- iter(x, by='row', checkFunc=function(i) i[5]%%10==0) checkEquals(as.vector(nextElem(y)), x[2,]) for(i in 1:9) nextElem(y) checkException(nextElem(y)) } # test data frame iterator creation test07 <- function() { x <- data.frame(1:10, 11:20) y <- iter(x) } # test hasNext, nextElem test08 <- function() { x <- data.frame(1:10, 11:20) # by row y <- iter(x, by='row') checkEquals(nextElem(y), x[1,]) for(i in 1:9) nextElem(y) checkException(nextElem(y)) # by col y <- iter(x, by='column') checkEquals(nextElem(y), x[,1]) nextElem(y) checkException(nextElem(y)) } # test checkFunc test09 <- function() { x <- data.frame(1:10, 11:20) # by row y <- iter(x, by='row', checkFunc=function(i) i[[1]][1]%%2==0) checkEquals(nextElem(y),x[2,]) for(i in 1:4) nextElem(y) checkException(nextElem(y)) # by col y <- iter(x, by='column', checkFunc=function(i) i[[1]][1]%%11==0) checkEquals(nextElem(y), x[,2]) checkException(nextElem(y)) } # test function iterator creation # we need to test a function that takes no arguement as # well as one that takes the index test10 <- function() { noArgFunc <- function() 1 needArgFunc <- function(i) if(i>100) stop('too high') else i } # test hasNext, nextElem test11 <- function() { noArgFunc <- function() 1 needArgFunc <- function(i) if(i>100) stop('too high') else i y <- iter(noArgFunc) checkEquals(nextElem(y), 1) nextElem(y) y <- iter(needArgFunc) checkEquals(nextElem(y), 1) for (i in 1:99) nextElem(y) checkException(nextElem(y)) } # test checkFunc test12 <- function() { noArgFunc <- function() 1 needArgFunc <- function(i) if(i>100) stop('too high') else i y <- iter(noArgFunc, checkFunc=function(i) i==1) checkEquals(nextElem(y), 1) nextElem(y) y <- iter(needArgFunc, checkFunc=function(i) i%%10==0) checkEquals(nextElem(y), 10) for(i in 1:9) nextElem(y) checkException(nextElem(y)) } iterators/inst/unitTests/icountnTest.R0000644000176200001440000000126514171060105017706 0ustar liggesuserstest01 <- function() { if (require(foreach, quietly=TRUE)) { xcountn <- function(x) { iter(do.call('expand.grid', lapply(x, seq_len)), by='row') } vv <- list(0, 1, 2, 10, 100, c(0, 1), c(0, 2), c(3, 0), c(1, 1), c(1, 2), c(1, 3), c(2, 1), c(2, 2), c(2, 3), c(10, 10, 0, 10), c(1, 1, 2, 1, 1, 3, 1, 1, 1, 2, 1, 1, 1), c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), c(10, 10, 10, 10)) for (v in vv) { ait <- icountn(v) xit <- xcountn(v) foreach(actual=ait, expected=xit) %do% { checkEquals(actual, unname(unlist(expected))) } } } }