rle/0000755000176200001440000000000013733326342011042 5ustar liggesusersrle/NAMESPACE0000644000176200001440000000075413713401231012254 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method("$",rle) S3method("$<-",rle) S3method("[",rle) S3method("[<-",rle) S3method("[[",rle) S3method("[[<-",rle) S3method(Math,rle) S3method(Ops,rle) S3method(Summary,rle) S3method(as.rle,default) S3method(as.rle,rle) S3method(c,rle) S3method(compress,rle) S3method(is.na,rle) S3method(length,rle) S3method(mean,rle) S3method(rep,rle) S3method(str,rle) export(as.rle) export(compact.rle) export(compress) importFrom(methods,is) useDynLib(rle) rle/man/0000755000176200001440000000000013713401160011603 5ustar liggesusersrle/man/compress.rle.Rd0000644000176200001440000000236013702014102014501 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rle_utils.R \name{compress.rle} \alias{compress.rle} \title{Compress the \code{\link{rle}} object by merging adjacent runs} \usage{ \method{compress}{rle}(x, ...) } \arguments{ \item{x}{an \code{\link{rle}} object.} \item{...}{additional objects; if given, all arguments are concatenated.} } \description{ Compress the \code{\link{rle}} object by merging adjacent runs } \note{ Since \code{\link{rle}} stores run lengths as integers, \code{\link{compress.rle}} will not merge runs that add up to lengths greater than what can be represented by a 32-bit signed integer (\Sexpr{.Machine$integer.max}). } \examples{ x <- rle(as.logical(rbinom(10,1,.7))) y <- rle(as.logical(rbinom(10,1,.3))) stopifnot(identical(rle(inverse.rle(x)&inverse.rle(y)),compress(x&y))) big <- structure(list(lengths=as.integer(rep(.Machine$integer.max/4,6)), values=rep(TRUE,6)), class="rle") stopifnot(all(aggregate(as.numeric(lengths)~values, data=as.data.frame(unclass(big)),FUN=sum) == aggregate(as.numeric(lengths)~values, data=as.data.frame(unclass(compress(big))), FUN=sum))) } rle/man/rle-deprecated.Rd0000644000176200001440000000053213702014206014751 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rle-deprecated.R \name{rle-deprecated} \alias{rle-deprecated} \alias{compact.rle} \title{Deprecated functions from \code{rle}} \usage{ compact.rle(...) } \arguments{ \item{...}{arguments to deprecated functions.} } \description{ Deprecated functions from \code{rle} } rle/man/rle-package.Rd0000644000176200001440000000265113713401160014251 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/AAA.R \name{rle-package} \alias{rle-package} \title{The \code{rle} Package} \description{ Common \code{\link{base}} and \code{\link{stats}} methods for \code{\link{rle}} objects, aiming to make it possible to treat them transparently as vectors. } \section{History}{ This package grew out of the needs of the \code{ergm} package for a run-length encoded representation of extremely long vectors with a small number of contiguous runs, and these functions were originally implemented in the \code{statnet.common} package. It has been split out into its own package to enable others to use this functionality without installing any unnecessary dependencies and to facilitate contributions under a simplified license. } \section{What works and what doesn't}{ The long-run aim of this package is to make it possible to treat \code{\link{rle}} objects transparently as unnamed vectors. As of this writing, the biggest unimplemented feature are: \itemize{ \item The indexing (\code{[} and \code{[[}) operators. It is not possible to extract or replace individual elements of the vector represented by an \code{rle} object, though it is possible to access its underlying representation (i.e., \verb{$lenths} and \verb{$values}) by name using any of the above operators or the \code{$} operator. \item Method \code{\link{rep.rle}} currently has limited functionality. } } rle/man/compress.Rd0000644000176200001440000000057313701735714013746 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rle_utils.R \name{compress} \alias{compress} \title{A generic function for compressing a data structure.} \usage{ compress(x, ...) } \arguments{ \item{x}{the object to be compressed.} \item{...}{additional arguments to methods.} } \description{ A generic function for compressing a data structure. } rle/man/Summary.rle.Rd0000644000176200001440000000337613710733247014334 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rle_utils.R \name{Summary.rle} \alias{Summary.rle} \title{Summary methods for \code{\link{rle}} objects.} \usage{ \method{Summary}{rle}(..., na.rm) } \arguments{ \item{...}{\code{\link{rle}} objects or objects that can be coerced to \code{rle}.} \item{na.rm}{Whether the missing values should be ignored (\code{TRUE}) or propagated (\code{FALSE}).} } \value{ In every supported case, the call should produce the same result as what would have resulted had the call been applied to the original (uncompressed) vector. (At no point in the calculation is the uncompressed vector actually constructed, of course.) The exception is that if \code{values} are of class \code{integer}, the result will nonetheless always be upcast to \code{numeric} to avert overflows. This behaviour may change in the future. } \description{ Summarisation functions for vectors described in \link{Summary} are implemented for \code{\link{rle}} objects. } \details{ Supported functions include all elements of the S3 \link{Summary} group. As of this writing, functions supported include (from R help) \code{all}, \code{any}, \code{max}, \code{min}, \code{prod}, \code{range}, and \code{sum}. } \examples{ x <- rle(as.logical(rbinom(20,1,.7))) y <- rle(as.logical(rbinom(20,1,.3))) stopifnot(isTRUE(all.equal(any(x, y),any(inverse.rle(x), inverse.rle(y))))) stopifnot(isTRUE(all.equal(any(y),any(inverse.rle(y))))) stopifnot(isTRUE(all.equal(sum(inverse.rle(x),inverse.rle(y)),sum(x,y)))) stopifnot(isTRUE(all.equal(sum(inverse.rle(y)),sum(y)))) y$values[2:3] <- NA stopifnot(isTRUE(all.equal(sum(inverse.rle(y), na.rm=TRUE),sum(y, na.rm=TRUE)))) stopifnot(isTRUE(all.equal(sum(inverse.rle(y), na.rm=FALSE),sum(y, na.rm=FALSE)))) } rle/man/rep.rle.Rd0000644000176200001440000000302313713401160013437 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rle_utils.R \name{rep.rle} \alias{rep.rle} \title{A \code{\link{rep}} method for \code{\link{rle}} objects} \usage{ \method{rep}{rle}( x, ..., scale = c("element", "run"), doNotCompact = FALSE, doNotCompress = doNotCompact ) } \arguments{ \item{x}{an \code{\link{rle}} object.} \item{...}{see documentation for \code{\link{rep}}.} \item{scale}{whether to replicate the elements of the RLE-compressed vector or the runs.} \item{doNotCompress, doNotCompact}{whether the method should call \code{\link{compress.rle}} the results before returning. Methods liable to produce very long output vectors, like \code{\link{rep}}, have this set \code{FALSE} by default. \code{doNotCompact} is an old name for this argument.} } \description{ A \code{\link{rep}} method for \code{\link{rle}} objects } \note{ The \code{\link{rep}} method for \code{\link{rle}} objects is very limited at this time. Even though the default setting is to replicate elements of the vector, only the run-replicating functionality is implemented at this time except for the simplest case (scalar \code{times} argument). } \examples{ x <- rle(sample(c(-1,+1), 10, c(.7,.3), replace=TRUE)) y <- rpois(length(x$lengths), 2) stopifnot(isTRUE(all.equal(rep(inverse.rle(x), rep(y, x$lengths)), inverse.rle(rep(x, y, scale="run"))))) stopifnot(isTRUE(all.equal(rep(inverse.rle(x), max(y)), inverse.rle(rep(x, max(y), scale="element"))))) } rle/man/Extract.rle.Rd0000644000176200001440000000312113713401160014262 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rle_future.R \name{Extract.rle} \alias{Extract.rle} \alias{[.rle} \alias{[<-.rle} \alias{[[.rle} \alias{[[<-.rle} \alias{$.rle} \alias{$<-.rle} \title{Indexing Methods for \code{rle} Objects} \usage{ \method{[}{rle}(x, i, ...) \method{[}{rle}(x, i, ...) <- value \method{[[}{rle}(x, i, ...) \method{[[}{rle}(x, i, ...) <- value \method{$}{rle}(x, name) \method{$}{rle}(x, name) <- value } \arguments{ \item{x, i, name, value, ...}{Arguments to indexing operators. See \link{Extract} documentation in the \code{base} package.} } \value{ At this time, all functions raise an error except for \code{\link{character}} indices. This behaviour can be overridden by setting \code{options(rle.unclass_index=TRUE)}, which effectively \code{\link{unclass}}es the objects before indexing. } \description{ These methods are defined and produce an error (except for \code{\link{character}} input) to future-proof code that depends on the \code{rle} package by preventing their use. } \details{ At this time, the \code{rle} package does not support indexing operations by \code{\link{logical}} or \code{\link{numeric}} indices, but it is likely to do so in the future. Therefore, we reserve the syntax now to prevent users of this package from relying on the default behaviour of the indexing operators. } \examples{ # Indexing by character or by $ works, including sub-indexing. x <- rle(1:5) x[["values"]] <- 2:6 x x$values[2:3] <- 7:8 x \dontrun{ # Numerical indexing doesn't, unless `options(rle.unclass_index=TRUE)` is set. x[1] x[[1]] } } rle/man/Math.rle.Rd0000644000176200001440000000361413713401160013550 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rle_utils.R \name{Math.rle} \alias{Math.rle} \title{Mathematical functions for \code{\link{rle}} Objects} \usage{ \method{Math}{rle}(x, ...) } \arguments{ \item{x}{An \code{\link{rle}} object.} \item{...}{Additional arguments.} } \value{ In every supported case, the call should result in an \code{\link{rle}} that would have resulted had the call been applied to the original (uncompressed) vector, then compressed using \code{\link{rle}}. (At no point in the calculation is the uncompressed vector actually constructed, of course.) By default, the functions do not merge adjacent runs with the same value. This must be done explicitly with \code{\link{compress.rle}}. } \description{ Mathematical functions that work independently elementwise on vectors described in \link{Math} are implemented for \code{\link{rle}} objects. See Details for list of exceptions. } \details{ Supported functions include all elements of the S3 \link{Math} group excluding the "cumulative" ones, which are not supported at this time and will raise an error. As of this writing, functions supported include (from R help) \code{abs}, \code{sign}, \code{sqrt}, \code{floor}, \code{ceiling}, \code{trunc}, \code{round}, \code{signif}, \code{exp}, \code{log}, \code{expm1}, \code{log1p}, \code{cos}, \code{sin}, \code{tan}, \code{cospi}, \code{sinpi}, \code{tanpi}, \code{acos}, \code{asin}, \code{atan}, \code{cosh}, \code{sinh}, \code{tanh}, \code{acosh}, \code{asinh}, \code{atanh}, \code{lgamma}, \code{gamma}, \code{digamma}, and \code{trigamma}. Functions \code{cumsum}, \code{cumprod}, \code{cummax}, and \code{cummin} are not supported at this time and will raise an error. } \examples{ x <- rle(sample(runif(2), 10, c(.7,.3), replace=TRUE)) stopifnot(isTRUE(all.equal(sin(inverse.rle(x)),inverse.rle(sin(x))))) stopifnot(inherits(try(cumprod(x)), "try-error")) } rle/man/as.rle.Rd0000644000176200001440000000070313701735714013272 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rle_utils.R \name{as.rle} \alias{as.rle} \alias{as.rle.rle} \alias{as.rle.default} \title{Coerce to \code{\link{rle}} if not already an \code{\link{rle}} object} \usage{ as.rle(x) \method{as.rle}{rle}(x) \method{as.rle}{default}(x) } \arguments{ \item{x}{the object to be coerced.} } \description{ Coerce to \code{\link{rle}} if not already an \code{\link{rle}} object } rle/man/rle-methods.Rd0000644000176200001440000000326413713401160014322 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rle_utils.R \name{rle-methods} \alias{rle-methods} \alias{c.rle} \alias{mean.rle} \alias{length.rle} \alias{is.na.rle} \alias{str.rle} \title{Miscellaneous Common Methods for \code{\link{rle}} Objects} \usage{ \method{c}{rle}(...) \method{mean}{rle}(x, na.rm = FALSE, ...) \method{length}{rle}(x) \method{is.na}{rle}(x) \method{str}{rle}(object, ...) } \arguments{ \item{...}{For \code{c}, objects to be concatenated. The first object must be of class \code{\link{rle}}.} \item{x, object}{An \code{\link{rle}} object.} \item{na.rm}{Whether missing values are to be ignored (\code{TRUE}) or propagated (\code{FALSE}).} } \description{ Miscellaneous Common Methods for \code{\link{rle}} Objects } \note{ The \code{\link{length}} method returns the length of the vector represented by the object, obtained by summing the lengths of individual runs. This can be overridden by setting \code{options(rle.unclass_index = FALSE)}, which causes it to return the length of the underlying representation (usually 2) instead. } \examples{ x <- rle(as.logical(rbinom(10,1,.7))) y <- rle(as.logical(rbinom(10,1,.3))) stopifnot(isTRUE(all.equal(c(inverse.rle(x),inverse.rle(y)),inverse.rle(c(x,y))))) stopifnot(isTRUE(all.equal(mean(inverse.rle(x)),mean(x)))) stopifnot(isTRUE(all.equal(mean(inverse.rle(y)),mean(y)))) stopifnot(isTRUE(all.equal(length(inverse.rle(x)),length(x)))) stopifnot(isTRUE(all.equal(length(inverse.rle(y)),length(y)))) x$values[1] <- NA y$values[1] <- NA stopifnot(isTRUE(all.equal(is.na(inverse.rle(x)),inverse.rle(is.na(x))))) stopifnot(isTRUE(all.equal(is.na(inverse.rle(y)),inverse.rle(is.na(y))))) str(x) } rle/man/Ops.rle.Rd0000644000176200001440000000547613713401160013430 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/rle_utils.R \name{Ops.rle} \alias{Ops.rle} \title{Unary and Binary Operations for \code{\link{rle}} Objects} \usage{ \method{Ops}{rle}(e1, e2) } \arguments{ \item{e1, e2}{Arguments to unary (\code{e1}) and binary (\code{e1} and \code{e2}) operators.} } \value{ In every supported case, the operation should result in an \code{\link{rle}} that would have resulted had the operation been applied to the original (uncompressed) vectors, then compressed using \code{\link{rle}}, with the proviso that if the resulting function creates adjacent runs of the same value, they are \emph{not} merged. This must be done explicitly with \code{\link{compress.rle}}. (At no point in the calculation are the uncompressed vectors actually constructed, of course.) An operation between an \code{rle} and a zero-length object produces an empty \code{rle}. } \description{ Unary and binary \link{Arithmetic} and \link{Logic} operators (with exceptions given below) are implemented between two \code{\link{rle}} objects and between an \code{\link{rle}} object and a scalar. } \details{ Supported operations include all elements of the \code{Ops} group, as well as \code{\link{xor}}. Within the \link{Arithmetic} and \link{Logic} operators, this includes (taken from the R help): \code{+}, \code{-}, \code{*}, \code{/}, \code{^}, \code{<} , \code{>}, \code{<=}, \code{>=}, \code{!=}, \code{==}, \code{\%\%}, \code{\%/\%}, \code{&}, \code{|}, \code{!}, and \code{xor}; but excludes non-vector logical functions and operators such as \code{\link{isTRUE}} and \code{\link{&&}}. } \examples{ x <- rle(as.logical(rbinom(10,1,.7))) y <- rle(as.logical(rbinom(10,1,.3))) stopifnot(isTRUE(all.equal((!inverse.rle(x)),inverse.rle(!x)))) stopifnot(isTRUE(all.equal((inverse.rle(x)|inverse.rle(y)),inverse.rle(x|y)))) stopifnot(isTRUE(all.equal((inverse.rle(x)&inverse.rle(y)),inverse.rle(x&y)))) x <- rle(sample(c(-1,+1), 10, c(.7,.3), replace=TRUE)) y <- rle(sample(c(-1,+1), 10, c(.3,.7), replace=TRUE)) stopifnot(isTRUE(all.equal((inverse.rle(x)*inverse.rle(y)),inverse.rle(x*y)))) stopifnot(isTRUE(all.equal((2*inverse.rle(y)),inverse.rle(2*y)))) stopifnot(isTRUE(all.equal((inverse.rle(x)*2),inverse.rle(x*2)))) stopifnot(isTRUE(all.equal((inverse.rle(x)/inverse.rle(y)),inverse.rle(x/y)))) stopifnot(isTRUE(all.equal((2/inverse.rle(y)),inverse.rle(2/y)))) stopifnot(isTRUE(all.equal((inverse.rle(x)/2),inverse.rle(x/2)))) stopifnot(isTRUE(all.equal((-inverse.rle(y)),inverse.rle(-y)))) stopifnot(isTRUE(all.equal((inverse.rle(x)-inverse.rle(y)),inverse.rle(x-y)))) stopifnot(isTRUE(all.equal((inverse.rle(x)\%/\%inverse.rle(y)),inverse.rle(x\%/\%y)))) stopifnot(isTRUE(all.equal(inverse.rle(x)==inverse.rle(y),inverse.rle(x==y)))) stopifnot(isTRUE(all.equal((inverse.rle(x)>inverse.rle(y)),inverse.rle(x>y)))) } rle/DESCRIPTION0000644000176200001440000000144013733326342012547 0ustar liggesusersPackage: rle Version: 0.9.2 Date: 2020-09-21 Title: Common Functions for Run-Length Encoded Vectors Authors@R: person("Pavel N.", "Krivitsky", role=c("aut","cre"), email="pavel@statnet.org", comment=c(ORCID="0000-0002-9101-3362")) Description: Common 'base' and 'stats' methods for 'rle' objects, aiming to make it possible to treat them transparently as vectors. Depends: R (>= 3.5) Imports: methods Copyright: file inst/COPYRIGHT BugReports: https://github.com/statnet/rle/issues License: GPL-3 RoxygenNote: 7.1.1 Encoding: UTF-8 Suggests: covr NeedsCompilation: yes Packaged: 2020-09-21 03:24:29 UTC; pavel Author: Pavel N. Krivitsky [aut, cre] () Maintainer: Pavel N. Krivitsky Repository: CRAN Date/Publication: 2020-09-25 08:40:02 UTC rle/build/0000755000176200001440000000000013732016355012140 5ustar liggesusersrle/build/rle.pdf0000644000176200001440000035034613732016355013430 0ustar liggesusers%PDF-1.5 % 66 0 obj << /Length 1027 /Filter /FlateDecode >> stream xYn6Sn20<Y`hd5pC;`ZDK~HQ B MC/wq_.O{([x8dУ1To-35CO$Sމf/CC = pwעQ\b@ 9-GFVh #(BV'm E+zL1 NxT1<\%tP:;F@r_}bvZF|SJ!vH/6Up)\JLdvD[`;dLۢQ{@CI_ Wf$Uے*QrW };zGJr;WܚTvY\(;6E`r@ɹ.;1Z8^eaR&iE 3D`>IwU&p(q^P/vNtBq~_6uFu]YH8yZ7mը p[_ }`J釫/~[i1|[O!0ʠ꥛.@87iT#y֛Hrn2ju^HOT`e'u"{zd۞wqu}=r1Z!0½B*jef S?W.Yg}Μ?NjYon`\uG1\`[fwPܹ乐Ŝ֦w|may($d>S;-%~L!e)Rך:ݔe<th>KcA_b`P}&OBwa?f⦺xD =am"AkZAxu8vDx_e c2~<ɫwe #4ð?7TY)'̏A#Qk? '܏zP>4`6":Ԋ"BQbT{B&&<: Mϱ}^ӥ󃠿ޔe>" )R;#xЛ{ q0L;g5/i"&8sw?X6? endstream endobj 97 0 obj << /Length 1679 /Filter /FlateDecode >> stream xڵXm6~)JY/` ҤIR\|o-\w1qmuٌxg6^ELr_R""$).Br{IOEFI XƩ(CJ[33]q]$Y.Р eipTA['n*t۸޼uƋxFX %#20k}PWad)sx D4:*W_Պpk%2p|E4ASi+z∣Ck~?N?6c!2d6̝?ًsTMqTg)!A}]S՚',lڇoS$r 6=JKyiw*eE ۽QCcLbffa=յZynPfm4\@,hAkP!R V,ʦ5c|_k<}Tн~B\JgC‡ ^8¡|[8 ZBʔYk"q:'q6TᷮЅԀΡ<\ "@i:=ǿ{iX5.0w J16f u'Mݕ۾|0.ۜ f4v/:v4m-kA *# eHDn;D3C'l.\AYaܗ;躀`,db`{iE%:2mUpw.2 qR>@\% 3JO{0{"^ ӌ8u^(p> stream xVMo@WCm)7ҴC6)ِn߁]8c'*e۷KIB(28iJ4dvM &cE@f1G0e9)ѳT9zk,Em2׈y@*FW'wH I%}mM(hɈV|}uuL\q2atl2S]^gQ{ ;i"L7(iqXYYZ[ Sch2ڎD%? ŷ4SSL['SFEzTAOB }Q Zuh!*G&fkΏkb6TTQ:|dqRԴH+U|~=6V0|~cΫ܎s3İyԹ@0e`gqZ7<\""~ y\ (T|(Q8rW"!#ؕFEZgυ@ ><&XgӘ OmE >o"/V_(O;5wS,6wV.FvI z$(c{k2'twnzA)w92!A'xҫWjfK Vl,Rm}JݱN/'&;r_>a=YV&0=sk^EE|we#gBdIpӬjt)ʣh0q0 (2~~u6,9e]"t&Hua}aTn/;%>Fwg}lhڛIa꺐7& >2M֬]3I_h[_^ endstream endobj 138 0 obj << /Length 1115 /Filter /FlateDecode >> stream xWKo6W D -,Z`[t990#åԹw-ydCoof8^އeH͝Qy1(ɽ%[l~:F<b${3dtw|zWnr&^#f&c%k X~Pe+KޖM[a?M 8@i?΁R`l@;ʻULF,~ ~5ŇY;)l}۲3K[UPn RFBHO>l[6j?ggс&Fx{^[;ͧ)C'x׭߀7 yeȋB!LM_ Yf#EoKABc9W\k#6}c)xuG)z=/|;ΑcN~$iK݁Qʼ^\^42[kAMy}^7U *a% 1?Ws"<9KPRbEl 0X~jqJ[& S;1b4rTXL,՚TkBbDrʶ-_PY.7[ K1\* zl>ê]RC͒:rZoO04 9-űQ|ReIcc]..|>h여ͅ$a!9ahaԖ+{2; j;I8EQHi(t aώg9pW$\kG1$1-{|{1&!h Qd괉۷pvc:ǪM7Ca|p73c;|0)ԏ4s]9tK Mf^4gDlؔ!'6;yW}=wk9/|2-E?/\gnԜԐqsȻr>xH19Pȵ:vn Ev'$Wʧ,O /35mflsd2Vڟ!KwsݜĎ)䈞<* R1 endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 797 /Length 1803 /Filter /FlateDecode >> stream xYMoGW>lOWUB$덁 $]Cؤ@ )db$ hNW]U$\r1Ru||OvTUD$„rt8 M2d?+ZLV+]4dgr *-\@!:& T+ZXOit15E6 Mo2AHeB@Pk"”0WRUdΠH0o,BN-t-D@Q2Q`$X`!+rvo &'GI6-TB T61ZS 1)B9A*~d@dm24à,0`WX3`b6U\CLmY5'G䊉l^(55߻֟_MWv:}[ ۺ֑U?x #gv`7ϠGǧn9uAc~voQZ?n.1v \r6ګzWuw?N>s3j?0 gw:MwiI5&wyλ<݀]-ve~gDr j>_`wFmIѾC&M:479 8aTkrO]"qXQ"sH՗NA#5FvS#P#b=k=--؄}HC<!`cn U6HvsGPV~l8Q=P!a[Pc7zƇ@A_zHy>P=@G.G/px%G_t/V)r 5ÇPz,JPCcQ{EC/k$e~ٔ8C!cxr1h9!߿vS4?OC@TCEq1)Ӛ匿pK} ?ʞhpA}&,m~U Yz<W'}*TY 'lj8"i7p6 Jqծ]@ cJ|"IIH^OJP]Ɣ<߻@!|48 -] f OzE88V{ae5JXVXB8 >XBRv&Qlj]d]gquPB2vUHڲnCf|""GQo xRD7MpN`dރDvl"D7$$zpsh|},NvO:3+H=pzvLB9S9rxt8e!hCQPstؓF WG N%~`KS dwqW]gcoo_e l0LK*}-"N\" |v=7! }|@ f@ dihhc. ۼpnD-OcG endstream endobj 162 0 obj << /Length 1394 /Filter /FlateDecode >> stream xڝWmo6_!t&5ClZw_`-:*K%Iɒu ȻҮV+djHۢ+M}yjǴ0M${C(18dt9OT4ژΥ"lӢptBNԹ@i]91kGAo3A6Q'FdA(]gB_9k*TBF#¦bIZdQ; :{8哑YU"~zDBŸoj X^unp5؇"N>Q٦8~a+Hj3, /Kxa'{W*d]wgd#yZrl q5dL$ϐS5@7Wuz]̦f<%) HBh?8~qW|]x/SͶ~ӵ~J0zC #^a~׍M\`0!e!d0W]+hC<\|}KH$MyEq 5 ƀ$;iB(e?˜,]%NqPr֣P(&3 endstream endobj 193 0 obj << /Length 2191 /Filter /FlateDecode >> stream xڭZ۸BCrug{)%-K6 hm֝,)z|J 0E~ 祥Ƣ/wo]a$gݭ-F)gOd{G;" 9hwyID*5;o,W܇I/,(Nދo`@:ϳBpntYYZGf2Wע$L̖;V%Ndk /VX_f'MϨ86"ss8e89w/V>3 Q-ovB @ Mdm\Q m%P|ũ^B˨f}a۬N e!:p|=BKu/R9TbF.zQ‚5 g { g t1~˰!nb!"J5Dxg@YwٛӦڶ^f~ ր"kʝ=JQu_s%<=X=M?QY0.WZ569]&9|6XyBrS$MT>DBm岈sq/H+ Q'ەqUOd9ez>FN &> B5ƣOi_凒s51J/'] 75~b8%3{+J~|[bdvK5\цZ.- P32n =w.t@@qMry$0|:ķH 7xCw}0J2i>QwHk2cA7$Q(ќ6Aԟt% lQ9m>a|Z5#|* `2TCО80pvEu7X9 ^1}4*C~| M%F uZӀ:{a/>#"z^sT癸1xu=ϟ_…d_n2#X yn~;8qO //* hofDyLRSA_@>Z?aħD ½e,OEG Ĵ (|ŋSl f Pl盕y endstream endobj 213 0 obj << /Length 1219 /Filter /FlateDecode >> stream xڵXsF_AA8wԙqI}k%Fg ‡-uwlV޲/;;g?f;!# '  ?rVk[UY82-(AdNأ0}s˟q=}s$1 |QrN{7'ܕ,kLZ.)f+ܢUܤURo6╬۬1tj"?:hO pRta;Up9m<غه)ࡧBX {FJMa7.,U:) STJ7ig͓bWZaM4EUC}QY F|3=>21 [,in 9 #^V.!4]rJo;4ID/o!.`T2ndmk**xg;UKTG\UXބlj ;i`2՜F s6,6UkP7\En) pMvP9ď`Q+/ ݅|]k^4e斥\]MYf]Cx( 6"h0>ӱ)08i8SQjj;mUK[K`$Dgun{O3X^6)xFOM?vO[gbs[V|I .zg&>BW+@ zY;Ƨ!B"b$]WW%BC}g؏PUZqbBըUuNQ/*yD bxJ1kuS-'WxfZT^T%f;G}Op Y,f27N+SQƈTB2a.Mre:32`Rx;9oOfXdG@=/݋_^6 G9%ǛN^zz21,WWcP:t[wXfWo3nr> stream xڭXKoFWNJ_@}H9@hj%HwfwI4mm`\ggv^̊::','׷p"wkQJ1YOpyO;“$YL+/Ujj6;]Qxz۞z^ߊ{qYHyfzNyT-Vf.JHM^O XcӏN(dǤ qDF>,NꞬ۷z-wNwH'qXxs&\nL 9QI:-rC2҈(Zګl 9hb+mUi̪ 3f)%oVFeފ݇ؼӴ3M!ZU?lʩ5CDX'a~ ? -"Nق:0?OƚPD2w 8\1t|1,1 SlTu+1qy4-2JSdr@jR6D NLߛ.Ƽa)eªFb':zT6Ҏ٨(b5i,ᢃ˒b ƦEs;άn#\ C`?>Rjuѭ{9FyÂ꘨}(mWZze'qe8aˑ:dAEH°-9ڭ%1Fד5bq/C˶(1 _z05OamV+=l3btޙgI0'C'fyqfԱ }V(/SYW+ChE.:/З4v /8;ާWUVXk#d_{'8LGo@tz|ig῭F7p۠m)&˄i`em 胾&>Sg P/Ms H̹d.@/uk\}λWwiÑh•k@=oZưB:M tS!^s90ŇAcC^8^ߙߝ6nG/}䃛a"1Qp[kSr(/59a endstream endobj 243 0 obj << /Length 1197 /Filter /FlateDecode >> stream xXo6_!!)!ےźa>ŠȌA\QJ~/ER)0 y/׋+2o}Q2/& Ӳ)_vWoU Q`SEV}b`\4+ۮ⢕*H&O!4>T4f(Mz=3B}e[q ϳom'򶨅4/׋ |Gz D)NZ| l`+MoBi0/O2`B1^KlTV32:Kl~WȜe&xYf24v׍ ("Lb';U rĿsy)}wGs"I,f~2o ,& fDNk7G"C2iwZz#ׁ 8\'yI! H\8ıȔ Є1&>D S(2ga(0u84@)!/޴gBYwfj*3}c_/^ J.N;B"mm,uE{ m\jESpĩz+̽Qr>jQnZFEf]gi#!3:ԷCi CKNF:t QL"8dN܏qz<.sX[7Ȩu,S!, l/ol$ ) 5w+-+YASlEݸVVch@Hέ+)o}]Z?c =!4# š2h\ ~[ JÛ)q[X`p8zW)]#T [:ars;Uvx9D_U) |G+RR aV7q`BtYiN|h=gœUVIMSl6(y+4MC jKpi鐸m|3BDe-)D]g Jux ]L9 ζuR>͵,P;HX}MNt#7-aPGgߔMM endstream endobj 152 0 obj << /Type /ObjStm /N 100 /First 876 /Length 2079 /Filter /FlateDecode >> stream xZ]o[}ׯcBq~ݦ- ,,ȃU2C]'vlEw닢6p> %$U Cs:I\@foc{Њ%̕F9nNtR('@_7*)XyC 4tSM| _uje3'V Bm* ŀm@SŨujrѸj.Hb$..6IFMռf.)i3)Dڨ(G u$$ix5ែe2HC vJcjWHsFCqlRgԶ hrqŪ1δ6[gZ>@ҰU2U1U1ӕc4 ~X3PMc%-p* jUUBP2ʼnȞo6[p:Qan0a 5pTWI[aΰ 䑠1ܧ/GH1SI 2@&KeY>EzyՇ.m=xHbU 61q17O@5ºcPg18;9X2k^^LzvRʐʐʐJƁaaaeeՁ_-&I=),|E}3[&?f >Y2VH)c2v`,SzZiPkyVP,G4JZ0.EXQl|Prz?%B|>R *,?RNi%(<#&D\jAJWC G 1޲T7xvJ$oj2)5G5EF )VP8u&D~fTc(F._ ! (A#a$gD֔V?ǔMcʻ'1cĆ #!"N=oS] tq*88X#o6ZT`N`N9lAـ> stream xڭWY6~5C'З- ZuڇMU )eCdn,1{>nj.`^jC/",VkaNw!Po" HBa'N>d>5G4EfMY5p3'jɑ,:t96~[ xmuEo^"?:~&CJk$< ]Ao(宐N+!.jµ<Bv!v6Be&#b1QdsBN¿;B!;1ETVn;HvvUg۲:M8ҾXMzQ˪h\(~Jh(nѣ~#ELzJZd04oNmaT!e`4gjkX6=G5]4 50M.`Yv~v"h2p{]KUfңl~{9PtU˭Z%76`\Ov?Pxȝ IqHAifpm g^䪞\ Ԗ]uh;z^oSG*^;~bFJ<0N_ 9Ŋ]*Ү3@S Jf۬]U ]5UbmWEOy@$2䷍%(+˰-e0P/msׂ u*࠘ 0s6v5MAlcʚc:_܄>v1,f"uTvxqx:1[!O.)f,vRVnrpl .5ޭ[Jk-& [=Sʆ({\҉id @:e+=sK0fGޡd|b֫'Ht WpLwG͸ٴM+x6 endstream endobj 275 0 obj << /Length 360 /Filter /FlateDecode >> stream xڵO0=xZ: =diP-$&Puqfk>i@`nbkQBRx 0B)1 ~2V!pߍ"lC?PM=ƺBujS츾:#dZl Pb:n! W=t<WN3q+_ҼE6 =s䐩aS)2/6Ziڸr5eԡzmsI)hh&6Jߜ' ; DX_ۈj[k{oƖWd}Z`p@*rڈf:=;˴k'HV endstream endobj 330 0 obj << /Length 916 /Filter /FlateDecode >> stream xYn@+f" B*aUX$yvqcǎЪ"^ܹs}93E`@Jb00B2P2 Sp{a=_ܭ hY #qn~ e_\ \"RwQn丢bY\ާq8Ikq%87 A Kys=5 H` ۠&@jxU^5^̖uRcR#e1#Ϻ1Pw z\}Y{v5mvNuӌ-c rlw"t14T7(ہvs!&ե4qk0'}3'c G+&:7T<;yMoAEɁ%حsވc6DśF8i4JjfJ18J&Ow؞6noywn$E6iy;cs/fM@h `O}BQꫮNٗY?:݂;(/rF \uԐ4`$/ƿE2v|nf7SeţSOO b]$m`m ln,r}̼ҪjB9E Ǣ*ފ]90ʒ kD+5Zij;3ׯp=3ûgrϬVQS7}։>7>:Gc4A7y]nlw10!ԧQ ukn5Jq0r]tޭl=~[~"*`ؿ Ÿ&4LZ Ix7''8Ko\>ޭVaX\Z&yRF4UtO[Oj! ȪM|#AxyU`a@ j;  endstream endobj 257 0 obj << /Type /ObjStm /N 100 /First 886 /Length 2329 /Filter /FlateDecode >> stream xZMϯ1pbM$!d"O!Z{=왑zbc ]껊bRDspU *P`5*1;J轅!'эԊIAK90,Wŕ0qk9R] s 虗4Щ\ӰbMiNМt3p" :N@.@np+pa E+"6OlJ0s(9`TvW! H3n*ooAa7̻Y|q}u= 8,lm1(| ?to߾݆˰Eؾ||O;濻;<wuǛOݛo|^k< ~7WW u9E#ba4ƚƘǸW7ۗ};6oo~LNueN-ĆXE4K vGh뾙d2l|:@Ezx~p[`Wsؽ^~77,CP9pHo?dQadX |9GXZ D#8+*Rs4Bzti I7vv0FO.F@ŒcC-Ξ! Oi\?bam,l Ooa8YUݖJk0avh#;}d.c,c1>烞z>烞z> yXۏ22Fq˃^m wҶש^F|8:<8^W Q{̭GM2pweO%%?bwsgw`vY0șmu0BY OP:MI@iFks0ZC}9f0c0c{{1rZ=XP7Icۢ f%x^~x}Rގ/։lk %mh+=:Pp҂eR1d@&[G0CmD~cSQXXu-W+|e۴SZ]W1$/ `I߃[[. =4":MxY擀fE *s^pS1Ttǧ SyLN5_>V^<}wx >?̸79t>B;(L|ax{>QޜW٧ͦ'Oux+?4ܰk endstream endobj 344 0 obj << /Length1 2801 /Length2 19512 /Length3 0 /Length 20924 /Filter /FlateDecode >> stream xڜvP[& Aww57yoٷdkoȉ腌m M>x@#[dcf''Wp6UM-l<884N0eg; `ab@dn`gO.bk`af@eD dE &.& 2pptؘ0XCšֆdf'guf _[S$+_* F & &madt418MJSй9M&Q 'P9&ddeP;902gєhH X00rYRv 061,c`bb`bb0hƶ@kՅd4i,,ld3srؙ\7~JMm*_ xPN~6;C8O+O /:͞1?h/+Aƛ|c"O?;?};?9[[Td`caŀBS䟅w@JUTo' 7cy '#s?*5cm4u;ؔ-&21P@3 ; ,Of `u윝Atk8B)qE~K\F7Qo `-qK LS”[b0*@J%6o T7(+(Z0 oPzf28YXgcKd`hmG(tmfFV&鷞o?o}%v5 wsLTE0.j}HhoI9;oP} X1&PQ@.eu3-w쯇OP;濛 T"蜭Ah0mo;htz;:@gÿ^?*`Mw [fP_v H;7iYAՃX phgG omA Z1ifPwL\4;T#7TBAo jG7A9q_;:9@С!F@AY 0qg@vǿ_61q31_5 ls^yK^dHa,FNYV|W;Axv鮮Hq &dtl(JcۜC]zCH uG7CDkBXrZUQwX8);@J~#YHfG9q̺avO#7l$~TׄH h- wf" -/4fXB^"JOq(܆;]FԢ&mLb8rP;wEu}d*[axTՎR4d0Y&*Ra2fV%tWڭނMb>^i'>RbI &nH &E%]qח߯jO-FG{"N襹uSx#ˎ&>{Ǩܽp"MWz;(bŷC& ։@WvQM2M5L"GU8mM\Fv@#b`XCb+ljp (UyDj Gz"z]OVm9kU \Tq"! ߪUI 0Y5 {0;Jә"g7S‹';<}avufNVYCcEO@ <Т1p:M6;/e+q9/Qg؉9[a*Ucۻlba~ZT{BwZ-o'ld1~]w[ZzA^<5Kֲ;hRh%67]]u].us0}z"}~p*`x.to;,Tr@ f?ֈ$# ezfYPcZMw'F=6…[+4|V? }o!!oh|{OMmmz+ AV-}uʌ̇eg|mF":8/ =/7˃Ɍ 2x 尅#< NX. >iaH 9_I5M*7P>60R Jje1^Z$#\Wrv l~-4jN! }Y3=t ؉r3wa#?MC Ǣ!L5T<]"09jMgN)ԩihf: ZpD{ FW㵦f~4%I bp77`Ţ=5Q-$1Zُ%8*>lWMq7Gm_u;N*Ho,6ݩ pI?&rkۤ֓BI*E%g6Uclw>fրz'k_rOHq4p՗$Lߕ IܣrGsKN_pQ81lK!Ho>t+Ӷ`{1U)Fv"2UEO.ԋ-ʽPKg+5ι ,:bNrM"бC6nsd5Hdd#ԡok[_AUnUNhX3ʇ.IgTtṚTPgҞ^ҟr~&w/c O8l8ƫ-9`5pҞVUeo]|H.yEFōG v.p$4$Pz\>bGW\;x gP~|B*PFD0-OpSy"7k+d<)du A|3&"xV>2LMܯ>fOfͬLgsl`, Y/Μ֗&dlޏmqafs [k6M4?Ce>-@~SIJcbTָL]X wn1L]FL;ڑ&(>UR)i%3qj*%֯TXpO&ϋM1cx1"Y1*^Ŀ|#v9"Q_jpكU'ܡcg;g7@%[<H3Drh-r|F5!j9!)/O( p& ºǐ:] ֙2j{u!Y% +FV~, hQqOi٬ކ yB|Adybpv@XKnd$R*Z,pU%=ZtyW[j]}coRX1\S_jX]‹bKCJ3}r׬OrΦQSߏXin[x/= .֮s|W֝vۥPC:7W(N]r PRz '&eGLް;=Z1dL1f] L>Կ8A۟8DȻpš@jvWVO_\7*VȶS'R#Kф%2:L(3k2(+,TbicaGvѕt!C kbcC[uD[[[N1j&ҵrLĸsA 2_3A;IA>̎4rw Fw16&" &zᅣ #QsR<(_3“ylXR(]Mkz F-Ӿ͐~aCOjfofptPԿ"jVlsAk`NZNO7ZˠC@[kUz>W1O5Pp%"jo/y4;aдGօ<=b"޺?MtNY@I^;~1 58o^5HN$! -1ޛ퉠*f"XV2@Óǯ73Ӟ( ]cގZl={g.敞v:|j+5ցfn`+tQ\U}8%]%>~xRkK0y ]s+0sv+}Z&>- r_WVV3y9C3Jb:0VΗk6_p(CL'Ьh/*h u3hn7&mʬž1׏^a˙\2zusL=,l[o ;vh0HdȏL_L2JAvFoysrbDL?,~8x4T;B 0'vp%5f]t ["s+2rzUe?\=t}\I]K mGڑֹ ]HEb1xcUuweHw>g՚7f|h} `|KGŽ}Qy9 a29=D5vKx`2EACXl.5fZcqRY)F̻uӓ/bNScӏ?R`ʒp_e zym`ص`'O ӤIn5½\1Nhbگn=.=APȟʄX_2i|yEi`*ef)F@a>]>֡*z Q8F6@}]XꌂwM1a)Cxs&|>3Ao:~F% i̚M&BGdeFI!)ݾ5/l,#ЃQX4 tե(^D9%*)_uPu[#hp{,Z[~m"whY`d X\mKv{|!0 %J}nr7-zUܟ})s%7^t5 -plVEiy}ݩ0opX},XRx숞0qyfΟK0EZO% )F H3h[>dwIO~9Z<'yabbqt Z)-wAf}Hqڛ |_Uox\*a-0Ue6fjVܐeTEF|0IڌYI>hAn[З̷eYFU ZT YTRCtfX_A7XvGYj,T{.KuCŢfsGJ0Ce~|FOh^ ~~?bkCfQ_q%/V2uV)"a Ԑ{"p\@@KOX-I%Z>sG]I5@%y@}k:eS&&ŧk_SGi$͆T.$s=))e's׊c(RLIQ~a7%5=6+>) 9i * e,{)%3kԗH2Q~!ݽ:BB`fwea\R<$ΎrБQz"` I 8g9E"٬8 c] Ф&z/RiwEqտoC&uvߣFDΔg':1zj\1ӆ1Y\>pc\(6 ĤϯZ!+bb\FKEwuB(n('^< tV KY45~`(%yQ;}(Ι&<ޯ5Gg XBHQ`{i }m|_yEaթe>&juƵZwDOfsfcFa$J5Zk~x ZGMFp9$~ͽK?E8yiPA}2kV~ 5ŹWFNg\ӲǣcjľA3u:i"0v3#m3L kǼ G%^?yd4ʼnN9mk aWFӉ6yЛZTP^Ä?KyNFoc=!?Ρ:`I^IQ"}Ψ>. G*WOF-wϢ[(EVrUBU!_+7[Ȧ͈fŃ\W6}$ V]ae;wˌ{DMXAD-;/Ld?oHdw:,s`P!e<;jF ^ޙe><+ɿ77@GűaUYt?͓@* >cr,T\NtV0.&>fdoxe6<אJ_7zЉԍ:12Df7t(8#N>2w`LoSgdW%/{+TZFLTMDfpH:[vP]29pazXWs\[h)Y%n>}'0UfLQvvWK[B7^nܲHӢ*h7+]R.N%k1ڿMn3lx@wh])R©wT '=> LUJJyS->(瘪:)[x5[ˀ$fċ`e•+r`)T[E ]j1P׉"E0pB!.w5%cwvOnI:2OP =gXDܟAPuW^*P*!M4[\dn@\-X4Zpֿp/J׬oT\s" x'{ J60e.={P+0Sd(ȭ(I)Ҋ_q[DCgV k%ȍ/g}xv"MbpVڊ$x;i*Iz(7扎YE2MBV>iOh܋īBL<,=4G,'.Rb/Uq)(@>6{x\}|#rã~6 k#Q}{O=LyS +@z&؟A÷v;q:!%6W Wwty,D*l*fS՟sܟf}QEGJILٔb ٴsDU%`橝9 eNdNmP|:fFO+yԐ`A^%Wqou4(֧Cf)IF7HI?& PO>fe#ߧ֗ٷֳ*$gY U6O'] ( WuV~sUte,a]GLDO}-hC]X ~ζiEZdVQ fPH#ڂU26 "zs1MY݌]6-=\ԖOFmS|ÂhD_>'f}T({X  K*$xwDtˊbXzC#3?v uDLtw OG(.mdS }zBO"zj%_ e@nwqyxۆUYICq=q3&z2.h nZ]8.{úɦv|G\#ÝD$|SByUA8e}@f(dJgX>pS0P底t0f\֍$#ܢq `S2^Gv+ˣW=3y~8.+)tnBv}pG,92Skrm嚓\K!n8В:?1 =2alRH6CeVyNkyz`Wf8$[`˖Yw理1L[.$F[4=:vdDsfڷ'$FU?_$^[>委.Hʣ!y2H 7 ]$FO>f% =j2owRڡo1)ksN*Du,x>ª;<@w)h-0Q>*8qkg HElT= (nqgp&=02{=4eïQaJ|T &h\/t CuF a~ijptͮmvO؏C0hf/cP~S2q8)GI~Q7vȲu5D)@`T˔Bֶ鞵SC۱b+OpD٨pz["s U ؍A|Ace +/6+Nu >LT^NE?X%鯇vJ xՈ5'lhܪG%ק`|}yOZ@p#.廀{dSѵ\YyEyKBnCpV@1\g]TP'"b^ȡaNv9W=-ıl H>~-XԜ Rt,„jLn]Uu'b/.1DžJ$zG55vʈqk2^ӗYlmi< ܗH^cP5[3/p_я\H;EcsE3A<6eGv:/f$Uo>a~-FA s^\hu*x(3埣mX׊|L|ia}EW SR{@cTEx|C _%*y]dw@+ 5DwvXq!ˌ i|>Y:+3O7dL.0U$vqmh!+cGļ%*vكKjxC/ZҔsǬDCW+n)koˈ醛̯W-#L/^?+c۾|)`%8kA8l$1L2g6a}D*P}Y i J @9:p/R,5}ׇL7CYK3+JpN&`<=;y y촱Ì@]Xrw)I8Bpk $ds>PiYNMq.F>qПAsD1S5R Lopdv]:o#r5~wP9*/]<ۥ%),8YhSYd3Ϯf;^w0{f~!Bs= B`ۂKoj~-m=+GR&gIڳk0cxm3Im+1|'[z!bVCs{ 'pU_Y[ٯ<`|syNah<&3 ieYE&M1zjQ 5NŔ([:]NZG~Įj{Y$ve])ueh( ko5eE no5.B*V:\ 1⧣+">b(jh,S+䡇m =t=%GxķM8jҼVkNZ;D#NXǵ>3>(UQji_2Y(!{]*3;||缷EH#U"l=V\=JMh~p.E{:)1l8%}* gvjğgDLg҆q4C;usffc;N{,[_`бI~S}ΑdC{z_jɨѥ2_̱}I:KRSp=.좼*þ0w:NU$D~HrȻDdߴFAWiϧ3G]hMt&jrNC/ Mλ&) p;G|mR)`*ŢG, @Lp{PH1'd3"^ꛔ?D~ӡuN1nZk_ŷ[ܱ?=`qmE>jmts"XB&pX47bsuk|Lݜ4Ƹ}@u$EV^X*joG@Ub& uz؎GڛB[VA#l)tyb2Y:A#^G]xbBr Ҳ^pZl7qcnM CUX4>4>[ӈ,mz(&V''fB{ZNnͮ :ȇ9o( u`i)bf (rYFF^7nOM64E#cw{@J6L ӛ3;}ac3Ė]v_IȬUZ zK}s$Ӫ~ʈPE rtu_,q8P+ͅ/ n{meGʟ,]CCc0"%p]U#HYVߊeq`N ;2㏦k%J &hoPsP; $#@3xY~ǀDQ[cW.롥tohW,6ɂJ4MћIvP~wh|TmH5=_E{B>|[9+1:-3'9(O2=_43=RWg)dž h& jUuDs|OIJ>kGܵKڭhhOOqW:R? ڠ%R9և}o@~u{˾vROr]!Iөv5Z߾`@9S++~?`7a? Raɮ@!4}.rX|`R2\y@aMRHBe%OInp+qfJ'"Ojpɭ{uwzjc]lD=r+B;kUSJz|k 7 _;-D_S3=mߦP﹨/&Xɝ%ɛ:?B"A:!<,9MZVFG&,&߸u~|n-4V_̄S&/1Fԃ(avĨJv?,n :Yp$NB%ԯ'=Nza֮muthtpA~j']K6mpi(D L|  r#652ǣSjK}܊EH1Nc#8GJlÇKıiL<  s8N?:eCp|+]NO[ |/3an6צ=a0W sLw`}e/T~wVدa9epo*&Yޫ >: dxܜM0ܰƂBY6=|>;Ĩ2PI~ÏTHnYx\0MZ_5DZӁ" Q&ꞘFvϻy DyvG[>wK`ZUxB}l-b%|9 w–_Z]tJDӃ|EZs %M-.<G\ޏB;SSZ||F[M8?rV$]j{&Cft-!łWX]nkHK}*l˞w1>AZe(7OʔI= ŝ ao]Ncڽ,DԮ+_ga}WGZg+A*CcE!4QܲIG@qG`q׋foLPqboDܶPHsv]u՝Q`"zbh ]̞ ?!@@7w;B`Hk K!FYF6~ {7GVZUyň- ʛ"^7yc޶ 9t uy CnIo[y)%12L6%ؒNq@R8 ǮkztQԣ' d1y$.9;\׺kۣ<[*]eJ!nz&p5,kj޸a4:% c#oԓ t'uh ҀF˪xLgš p%sU>AߜQ6'1h|'2s癟zةFџ(Lc0emK>"s-'[82qMb|p,WLRj*n#V` ٓ5yr"|ۢ\ =+pdB.V{šY"ӷCoSK'bfvmfOJTȽگ(XQފ)"/S"2*Cq=mZon\ ܩmtHaCI3Sjm/prғJei!pJ (1⼑L2#\7OW}ѭOHoy%_M7k[)2LI1^A5mCo=l''PAž6BjGѡ_ҍ#}j1oMә`PPuQϊR.gsL/ L1z]ܨV#ߦ.bcXM.+v |[lWCe/]~NS+P"FP ;>.? [l=='4HP y=oX`*A|#QꑃS\J0i:NۖCI!S9!'o}r:&W֥C$(mJ3k56;J)z @%.H^ruj8zxN-\cQAt uqD6~C%h S@Xtv% HNa}BBJ]u|Va@F 8vג.=Z@ aʅegGDŽYWzުjaE`Ͽ]\,ϕ\ U_G01k0R,մ14DIp]4%zv$l:笛9Ac#1k-z)z ]%Dqavǧ@c%~KS%Ff~ԯ]u 45tXdDPJe`(lvuߖ&?b$ayV ibh Ű **z1%He_$.wopNr)\Oe #: ߉; c 3lD)=RD%Qu 2hxL2w܃+]Z5vخ+!9HW[3+$D%0>ZX @ɁP [T"&0" :``ECfNoG{+AOJ*tRD7]`ƦK PVUT8RT ռ6/ĭ]uz\էA[O,@D3)’"{{$CU NNlt!\e@TaYHxPH3'^'g'slJC@a3uT!h1fsKњ"aS(.uP0qhP-"Q"_"EU?)a5J OgfKlVnoGTGUjW-<{#xvy$ئZo҂$N ;D5VW!s1e$֥r9nQWGX +;e[G{;@ZjBgTm:F5CūP_OА;pϊ1S5NAAA {&ف-B Qڝg5dX r=vX{{g˜kBRep_fDSz-ҏO_0G-$H!d@mQmaVKO-Eqmq&Îq yC;h"ϸR5Fl+qFrNua^#ko:ڎ;jcv|"Z2L75sv[cYZZ$$Bb,> )7RBàzE/fB/"m̈́ j ?[4qa:+jIԎ 5Lof :z?iPaL I^E $,7߃C2[öȷ 9NJ?o#4X>#$]`[Ms3\GXJT1/je߂"L%a=X‡U;Gk)]83;t>BF.WOz\oNn,e"ADjS>?Ak؛r.ZW xӀoh%54蝕u:z b[/HcE*]:Y8e f/B /vLGoc()" f\w HP^WʦUPjdw| CYI8(HP!+Cm+g"+t@=M/i%"1L^H7.<9d%qz !N~v }W"xU#m~+ZÎoȉyڸD]p^Reg'ThKYU dGxmZBHN'Olе:EN9ʚ ؗ y XK9 E~'@Nݨ{cR" 'i3DY\m/Fs-zzga/o3uyÈ^VBRݪ)a?it5n: +,SXZ,?\ GcɆ 9QaAD*NpA&5Rg1y3 ǜQA.5{{x_UPj>OQg1qu鷽]Qz8#ۄ9HGXU,\g鶥"dɜ;cxZMTєlfK(oD5x1,ߗ_bgܙIo݇P*:61>>):_h؉x*pV޿l_*Ry[!PžgQhnLT2c^ߵX8y\S%rx, PFފ͚$p.'xlusnjJ NLe'`U^QnK% ҕy շxUlTEAİ`6v)Xţezqٖqu^Z.׏]q0'ȵ%A%Qz%9RaYJ~$;x/rn[Nba~O4F "Liٓ>H,N>>#Y0 ^@Wq1ܹf~&C|*ܿ%2ˎ ?%t,F`FQdžTDwP*Ρg;1v⪎Y~h'5*ax!Xbz)+'h0 -Rpg |;_\žAD P>E5)nGZ N-ҙ'麟{OBj^`ohuC|2='?3 Jո3,'usp{d+4obbF QOzDy[4dYҩ.w6R{ǼPuRx;"p^-zmTfcUh'we3cDFG<+ D1G &]*= ұ-JKGQ(`^rƱ_H؞T΁*V נe4e6Z&x9y,4ˌvJyqfco,5 }@""1ba0)qElQs{v>E3-WmC*L>74\], endstream endobj 346 0 obj << /Length1 725 /Length2 14862 /Length3 0 /Length 15411 /Filter /FlateDecode >> stream xmspe-mc6;ضmtl[ӱm[;~{[ﭯ?SO1֪z(H$A.j@Ff^333 B hbe7v4fUOwttP;а56rhڻYZ܄ݜ]\9 \,s+[ @LQI[FA @-Nƶ%W[+S) ;lLAfVo 7?̝j" j 1&511 'q3?@SMGp,'`fe0ZXś Srif@]mmj1{;W@ {w'"-5-?2.!>%'ﴒ_,U.NV]fI_-[%*j ``qq}\SW'' ߤ3 ¯.ٛXUITBL-|[EmifxpH4h"s-sBjD<!_.!|U.xi03Uq\[ R`=u,@b1*BJXISg|"jPg,C LwWw) - +u .tf9kFڊ]KZsL8^iqw}Hϐ J9%)w4Z^2UnJ;C"P5"ҦާRtqM+;tVb,ke^)lFI Z,!&rgGa|n$뷦_7O\4x{ػDi_(,beQ Kc iUa7׻y3mI0k (_9 3Uh@S;Ců⓻O0d6*D|ĐȰA.Y2Y 'sK>Nnt$ [_fhIsze69`&wzt|7 bӼ"ƕȮE媙f iӯ?= ∜`nCh1y>w,v%nVɺI/g>ą ;4--C1ޡebDuyUWLO4QʩJеjt_d/LH 3ڥ$!NLrhB67g׏ ֿZj^f25B0F~߶5 ه$?x{4LeG0G^vPهH=X{j2ޙW֭ :d9Wh% v)qm w:?;7ҼK &WNras;y DFbqyɐv&?EVpK@z43ǧګHcb_%76~ohͥzz'=6>%X8 duN,&S*F`+~ ?$m89弸'g{Y0-B(N$!ʰuu+q[C=Я ta/)S^r=0[#*ge`&,}4m<÷c,e.Э% q>Gj ΁tj:Z M8mQUKn@F^;L)'$s[l_wEA6DF!X*m~J5&gn悩SMhXa<^<è@b_!vO+ZKCGz9=b3R4S:ޮ@ 0DÂyCkuzbn) T9v|" Dqѕzy@GrD<1uJ$V`y^({?nΓ²]P8:`Ț3>* :+sg t-FOw+{?5kKCI3.w#D`I raN ɗ>В) 8\{e}rϤo +$C\Ål q4&5Brc['zɞJHx]ZlU#V9=!&.RJTфioSg5{v3Ls<8/+>uFyɾ3KL_煷 ܗ$\P4=^%d86B#\ztt g\Qqi!+y[᪮W"I4MNy9 "߲"g 8p[\e}b ڠL6HV R_lo$vbhh[Wy˜w^]&C<\}ER'Vv8U75E(`V,Q_bk0Ƚ*ٌĄWջYF.q4y& -qc`k=~Xi!VC }xMwWf|,^LV9@#JR1}2$w:~MQrOyn ZF#ydo`j6n>jMEL.%riaȸNZu 5{2d)f}#s$T`s"{.}b1Ϗ,c,:!DYqד~D;Ni.o1 XXi$R h[J-amٚs!KЇ'\ЪwcRf̘Iwz:L˒N&ѠAQxIζJޔ¬tL^A\/7%t8}FJp9FMh, 5gn7ЁSBdc;lrzNj:hƈ7CEwhgfzAB_ c.smo@S֊hڮ؀60ϳ{:;ӌ'XKt^˅.`chtڋ^#1ZNQ`|! ϐd5N5;S]Y[De\I 7 ҜۤAE&FqQV+֋jWަZvzoX\1/a\:6CKNu'ycܑ9͈r<*qܦr)L#B"!JZCʼns2ŁFE)MkR[FITߑo&)8o#TDEpl?E, VbW^\mYg$&+c) ?ذF!7^aUSzrUfKJLMf$FiZqQoxkiUV+L\ER]J҇%"aW_|}i7Lb8{Kd8):|#X'wwVCKW.R*n E'E \| ɀ  |2R0ΒyZ72=1L¼z\u` `Yk{{TdBߪTՏZ>$6c?gεřSWN+{0A6±2yax)Q,=A>d  Io%5Ħϵe[vx]Sc}tEL9Ca['t3)!n.h@v%^|uqiC/t!Q`/i\_Àp1uI~H؃ ;9{Ѥ8s*M}}r{vêel?g&_>h܃[$\~QPzl8-a6R^aqmM!woo>8uu܎E tBkƴk\,YlP&POx<.#O+;LԆ)Zx1lqxTǿ\V,OXQLA/ӚIp%S[WM7+YcC/(AB.%)2׬,'G7`i \(>h+Ry5cʌu=mfYnʡe cLG{˟(375 HITʡEL:lf,,+A{*a &e(6OuWjӌf0gA;]KشAC)v ^Wt\Wq[c^Lf~[d펶7#Bpd&&͔6V-7HG#K8aPNleoH_1G5,BG?5-Z-78 .C>V-;^nZj? cGjp&(49'^7\mS37Մ4votB5W.@ qunL4kVG PH' kPwiWRcX7@ӎM˧"WUA,<:/p]"k|ѵnB0&R}H7#ja|BTmPs?sY(S@8]!53W]V[(j,?C);OGWMgz0QF ABuʘ)ל'Tޱ=y{JpʖK5D&Y^IkLg2O$q59F8FJ 9+=OCWm2pveǐ{6r~JSi|؈MNJfs7 6T.z= cͭ (l\L(gr ϒr;]?a7dfFOj:ש} dwP;uBJ9z8OQ{jCNL#nV\,y I'O6SKT}gUUfv޾*#JRfA7` 2U i;낒jAG*Ϥ:U(b)|ݫ88ʰ5u^{vx_IC4Se,.A2̃Hšt Vy)9k= G"K/μb>*E u9kO#41`9X*Jw?/g?$sR X뒉_aH|* -T ~u{0F܊% "FW |cY/U_6Q1P٦eʃw[*M"<ßR@F6DF1/k0IJ"󫈏 Fg7,NTl. 1vǰ[xp16<="&p7z. qҹ aҀ>#@[ I ̒W9M?He;¬wyC= %Shm#?"ײ{Q[5EiUپoUwǬ%O\Q*-l% i> ˸@ ׏0#F|{Vy1S3LO *QкjLVU)g5ZcaQ9EjL])q ;an4`{dWؾPRKHXe*wmћF% n%ӫ'W1a20V]6F6SWr;=5RcjWtY5\P5Q\r:˹)mۯOj IHYR4]2:3a]hƶfc\lչ!K:N5v'1PnWσ4Us>ffv`c<Ǯ?3H>N2p1Eܵd}!Ln$2^`Tdh=BWss-04KELbn~ӽI^ r@*dO~,拵w 5cAi?Ⱥș{^:Hkw+`L8kS?Ea?1mcʸ-T0v(Ov2P/<1ֲrV'$T %EF4g(sS@A^<|b0(7@ĿKB+k(|a8}}N7Q 3b˝O%뾵-1YA“=@mUAŕB9Z#VM;%]`ҘJQk[ZpYBW=dEF.y-)lۭio#-3am2jzX@1 Qjj.oaԃtJjfI^-U+%9@I=PՄ\tIt3C ;vbXQ&9p}_qe]{rY|A Cx)B '9,+L qA\}Z^^f~ra8ͱ{i3\2ET@ bA{=MOUSC+-zXd ŅR_3t p_[HǎPxaRkmQoj*EB?MB<#"+;BÿIIK_jWL󩈥[B"|>Lw#ʹ߆N?xwv6 {83{&n)+MJCswr(!sG>X?+%j}cw ь:. 81M,K}YMf_9%Ԏ44Ad{s;nvXd+!<,h[솰~ WwڬdԶĞ_|֢ {_T-qSeX""jJ6OJD;Bx  s:`+<-L'[#K`S#cќBAGT"S+wǦT 5ɝT3yʕBy]*RA;ɌM׌@ѹ cЖD(Oq۰fj2@#~^HAn0 9ӫq9si=[Op&ʁ~J 9,fO+y ۖrkI?G`X5B \[UOBhhZy3)weK"`."6[a=`H8'1 m<߼έUIJheowZ}=.})z{ ZB*ĎJ:ȵYߖn)NTq;\W -Xwd1]S$9%܏jLֺ$qrj-M;*k*ȹH9]w YoG *߉ީ Ln;kP@7@lCg E,@]&#Y}.DuS?𖌦OisXSQ]rE?Þ.ȸrH?ww2QŊTaďP}DfE`qJK:c.̐Zs@T}Uë9o~\m|g g=H%0$rTIj꤈/3=gϊn_xO.ỽjL4mFyAGB7uIѩj ҿ=9`;6c\L5{u_SwSL=U|xnPTzy ASxJ-1;3ddikއ@Vi/ot[\Wg lUŦ}kRj!V}s%x@GC!=l4Ԭq@54(H%wrLwf0*>\0Ca$+= $zY=ˤ8[O0`{ ӵ;NI^x9E\N/gjN!EL(*6Z*z /L7%Up3^Q+cdaVL);gpy3)r %1ܣtb`:j:kuuVbGbAur,az+v>Oo5gæeP.&ڪ1Ze.-' 7 gBZ-v׮Q~xoݲ-TQ(V]XYUo-Ya6N_GD5nl.n>L:P^ڝ_ݷ @\2MK.>$#.dz}Nyиa)Q9m’8S[8;TL_戮'+_J2,ƌEC;ӷbmuɑ6G{l+"DR4.~LT:({uxNНdYKKᾒ"L`F?Vӿ?n!Z V\H5Ȋ츬 ԫfF'oǦ\tX7 )ZU[#7`*B3["zu#]?{Gѩ̆NP7h_z1a-œU{q~l+I.Ҵ4cgq W`THo̢2Q4'nc't9m1o kϻϤVVWmR3j&5fۯbcw;T鳜\чT{+ڎ)U5ܻ~:#f&6qdjr-[FԑFn37u1ܒ#pANoF{Iz-{L0;Y7YK7J|A\+Bo,wKa IҮsdu0YT K#zh3@U' 5F 40rM16?Xz@ zNH9\ėG=2"dPv p{iîT4U{L"*g&׵6{Qj#aDʋ 5hDrIǃn_s7ތ:4" [:+9נbwn4r{ݖ_>S/I nbĪSpa:[(Op\k5UB"oAԔv#}ˠu>~Ƃ8aYbzl9u[ef@3C(uߺ(匿βx[⯋:>hڻ)ֱl3[n H+i)_jeU6a.K( ]rTfXLg"&tK_pU~>u'p\h:.m&%ۼG fuv@PLeۮ'~БLj,s€Ip8A=;8\g<rJ++]kG>sk/B[dl,s'J!o֗{',EPuٙ!᪦i?ڴ^0xL2eiOwPG?[ҬD@= S@mR0sGE\bgV#kv1s!8Z?E!n;IBŷ/[>m+BtIm =5㘸r8ͱ'> stream xuSyQa"AXHx\dDg"B+1+|&WY#]AĆ#t rt&TA>Z4s:¢gBvP#X4L,SB ]3i̜!>@͝[q?,fδ6Ptw'alPXp+c62@gH4Lx`Ѹp;џb B;E`B !@5|SGa5 V ku^(o>H0fn_T06x)"o1WB;Blľ  îWALd3Ep?5wO-47˝dq\xӽsiiWsYw! 10uL 2)5,fμ87 `px.1"`P @7C0sN0aB0 Q̯4xf.=eςAp+P/AIg'ϐc0nYXm,Zn+t^fD6r)m`9o9L{c" j湥i0=gCT~Ф5EkcϝWFWO;T&#񺓛Qz|%1͏(u#%[҅S.x^Ѡ[ꨂJvU}E*&6޼d(۴dzt̬]ӣ뫻5S^ّX}Dkm60dx0t~zli^Kɚv󶞆{k'֩#%ILf=?x$6wjVurhu(237k<]iu4Mтָ'" ^&?S^PZo#fn=q-ޞ'IS 6Ɖg'v5+:+E-%F#/7삯O$1w_H\W8PAݓҨ@BT9>2hZJ?U7[qf*L&\꺪#oXl-Aih\Fѹw)}ʭDءx5{b 2+: M%w:~uxe[ؤ=j*/ާ z:V]q[e"Y)sa@&YDtd[~Lwp[:eMY1uX|ƹڪ~9qluL,a$+o[{$mr>[4|x~p7>Qi\XZT< 0\8e@<2}llDUޭ\Q=D-)p#1ve9k|U\3)J)}AؾގWuЉ<گ4kli3[}!FW7=81&A[%E R9etI犓%?Hd)g֍{}:drވ>~s@ҞhReQ? {#nq69WxKKԇn7r겜p=*VmI.xu$ #c|?M>ՙe:Y`{Yt2C eͺiۍ{6i8U捞5 K֭^]%+ ڍ#VE\~E"Pk~%lLs+ęyoj UVHF`iͶ8QO 6kKZ$M sSC] ąhv~B1Ja:`:>LcKRa-4&w([nR(UK}5*a㧬'R4>o R:`4V̷(2語rnxjo \s͓T҅ اPPhy`#qRãvEjA fR[SiNuC%eNy՝թsG9޷h{cdE>!Gm,)hi|-M7Q21dՈDZêhEm 쩒\h endstream endobj 350 0 obj << /Length1 1626 /Length2 11423 /Length3 0 /Length 12270 /Filter /FlateDecode >> stream xڭweTܒ-ww@c t5w'n-8=HwgκoޟyGէd׮uꦧa[Pvn.: vQ mAW;?= ZA"-@hp dn {(IOۀퟖB־ÿ́] _`7+@4RRW0)@+g3 B; WkW,) qڀ^Ӏ>6@\l7 yAV@_^v y_#\^}``br^j' Wm ۽FڂmݭVMFCAN̛cû[ơ/#ýd VDiGԩP_KF^n0z_<݌We8l;j7Yr8Yk 9v}rQK5v-;:411^b]\3![YA.~zDeޚ6h>0T*>|_xfJB>[?[gŠHG ea[#VEk\$b Q-^c:6f= _IZ4)a|X-Mӷ"fQ}шAkKY k7Y#x%_,Se=zǖVZp=ʉQT1&X&B(oRUZf7 aw@ ţ'?)9 Xj|7i?uC}C@g5ixP~݉KT_ H!;77ZpnZ0Ur^[H|31yϜoP}h­,hG鼻^ u"dhbuwR|uq8:?7nNP=xbSdX!EKŋ][F͸KvuV)xϦ֟l!zɺǛ[ؠ`h;)e0*ْ";ّLLnNWZg'$߭6sTX/MRKPBa4oR(C( ܋nBx7=FRABad9& (3/!p 0ܯ* Vp:鳂;"_ErJ6L%6հD{BgB)FjElR2| =%]%:z}[+Hx$7C$re:j WmPT#@-'9aMݷ\~_><)ʐ Ng& $X^?G ;g#9#E]LH\Z/i 9< uvGn .&f8x|MmvگB zdPDPu!:CUv8V1%.X3C0  Q {T9 ŲɳE6Qb?:ĶZ^em 껢Zp<ɯ1GK AV}Nl]QZvE+N=' 804ʩtEk|ҔYSʩncp~~ĺs4?XkYMoG#{@I77h kk2c\eT\ќ$x[Ga/n +=o^y)zNX oS"Uҝ C&~`d 61Z&_ ]]S4rKxeNuqpscl{5E(-G|6!kX2&U|?c C7oZ|dK?6mKt*/R >ٞ-SJ o"=✑ Rzy"%;jU  lo""^ʹSee y[VPO.S==cZXkˏYi chtfH )[XZMK'Q;= '݌Sy.$lm+IHЬ.]n%fC89K!B] K Z)Ef Ӻ4A4' lR_'J.+O`+j>ANcR$r2߶{-qU,~*y7הr5ǘA&C׃DK5{~$#rE,4RF%}GIyC {N݃.\ mƘ%⏷MC%4%Sg]@Ne9Ԣ9Ct;FJLcp7, !ʫ!7E/G]\MOF/= w\kVTvN{ո0P䪓& XXC*bgYZ ,Ao ٌ g4y:gha^W;kaXge<+iǧ Q ^xȠZoYi/g*ٱ/zǷݐłg BQ$x.jcC˕02$vWFQr1J*z3.J' d<]zAU]~ m"ӧKDY=+ex^Ay< 4` POQ!A)҄tJ4:6f+K.fjN~sS";jg#Ĕ+O9qޢJ/eeB h|C+HGJ,UbkAga8G2o"g: z{_Uabq9R&5% ;j׽i#O9G_nLX,.n 0TzpҭyUNdzᥖjj-'̊&]O"Uz{oVK'VH(/?vI?SJ;t G.ya!#K8ގ {1%-zg2Y>ό' Eoc?#- 3KT^#Ik0Q\IޞU$`9 %bƨ_=4}Rquٲ'_i:a3lyEr:He}q<~*FB,zb:u68Feg_ 5 ?o?4U#m1#BU33 uY8&!&@+ D>jGWQPrRO(mN\I[hï>IC(bŞrsH3Qf$(kKÙD1/Mi(4Oh)z3|7[z/X83x<{3…5H5!'hȹ- اڋ"uwp1H 꿖ƙsmD@#<>eD:g҃0,+1 ʿh)$e`9i"d)nጄWI\C?VL4yEy ,Ʋ݁L)JOO$bh_b ] Df-iQ\5:;`|jvN4!h!96T}G8дlĄ:M1ٺˬW尸EBXYEt7&6t @̦GS֡ǔ۞l8Du{FQy\%"W取w%IQy}u?G7P$J^ ?"SlЭ(ڸiпZ -B#c 곮oD8ڇZU-C4ŅҎ2lyR?!gyv^n4$QAhD MgED!cƔ)k&?6F9{Q;0iٱ=%W͵w+gnO`:qwЮI9d1)7i+ &F>K n\d mdd.lk8K{--m-P-Z`[@H+oAjQ[  q.Z3|޻l2/ ~/-AAMxIkQkه`#t4~(Oxˣ|n͐3R!H\We7Ch,UB%bCWf0rJnu<$SK2ĂRT*0E*U†C\lկ%>iv+Xds}|׽-  @k3ٱh\9\3K')Ǝn-r;(U'_4a2TvJ20"\q3o: . 6KbO吓X]RD3qКR!Fј5D[gVKQ` =x#De:a2!)آadO]a±Wo~^Tibee_hۃP{{@XF($y(\ņ-q3_dAI򫈕 !BTIqq/-U`Tf<<9q.dZv<IcO{՛t?>ȃ_^o!㏘g^c,53mc!cdi,|#Uc7d]4>tSV1iK?@ *s05J.bƸM]aJ{=4DDK,Xh-%YJÑ)4ox J ;o% 0]kOd{ e T)mahD O)YC ͣvx%t!*z'FK6jF[P?Wj K~~9~[>M9] 5lcT[xS]-4Ǻl|ioޠK[EIchdV.Wٖey8{Kbu+_^>Az؈k\nXXKgU )28׸C?dز)|Kժ3Z67 +X#?%~~ sq}!d$͚qB UQXtrǫ<:[KSNO; ~щn`7Sϊ4dd}4PBuRY$\~ !tϓ]Civ~͊KwrLup)bﮥ/g;qƾQ f}?K d362Q8*m1xY`͸kC٘Bǣ&}H<-}6kL5ɓ @b.M07W'+Md3 Դ?Ngd`\K qB^i]n GwmfmJj|19{ 桃؎O}ۼ RXV yɥ^޶RdLgm; *ncHCԳP}#$N-%E|"; lǚl߫[\Pu`cDN$wGL0 ⨫m@ #E:aaY"*K=u7|v)(4Sd%/! aspAwN ʽu1̾#}^bwpU$֫g'`TxtVsUHͣ4%@͉| Fb Vs-X?9,[]3bºqrLjC'6}XdCqҭibw؋0RCGXm\{o`=[A8i|*ĚIE6< "mWoszcWi? {s4HaK{pMT*84y.kpvڙcoswTV[_3Kг8wϽ7Z'ʮA0vnL}3`1,8(mmz@ Y^sؾ)kS'?;n.5vz@n64T*Ċ'Aj49?CM60QIg&5b}b宾sjF_^Bl}q4|dG.{FanW/cv4Ⲟ|8>Ӻ˫!Y`P z_oCޫWGM!yf#?@pne=uìц}Sρ=;W5egݸh[R4/F3b_N޳wOy /POx`OԩFd0)eaH^PBV# E \:k> stream xڬcp}&8;v:mcsǶtl'۶m'y̙:̗aWkV&'VT232:310r-m\ldM]lp"Ζv@QCgSn @ `#{8Z[8Ԕ5iiS ?,#,́6v@ׁ*g S)@DAQKJ^@%!0:]l,Ʀ@'Sj#hbOkN '{Sc˿aƦNNNsGC8,6.&WofzSsrv2vwͪ(*:- d 3ibgOKku6:Mݝed 0t1/pqgtGSsCGS'0 _7Wݿg N6f pLs;mn ϮHL֛_ggahb}s@2 B -bc#ohw}c!dC_)zk߱RoW:XMrM l6MkW%i7_Yom9;)#,lgb3s2} bfߤrΎfdWۙ:*Ά@?]pKvQUX(|,sQ?јȴ^]ǒ E=?wu W%QcԒDi':Bvh:#'Jz4k?R`hyҮ`q^! _HjZ]"%8} ӑ[^FAA-PGW2X=^\F,IʹUHhN7}rW0TMF"h\{d]ibl}2va<$.AJe`c|Y?j~DTeNdK!<^bQ 姌!GZ#֢I>7g9քkGa0Ώ3Z}܀ySKpk ߇vu\[II MkXǾ!~c*k=Eq5F ($R4^{֣lҸ,F47mw i栟d}lh-m@h~{:ʣ{=C""&(es :d$%2~pΞ I/Dkc}^Ջ+Inź-qnkE TdЛ/䯂9 ѹk== +] ^oAIӓd*pٝ0mhmί^oIm~M^4?dkU2tc+jdM}z:=p2hVcoH C\PZO9E]i]c6YXŬSpC5M<`lji}̧^6l4 nw%e&1wՐ0M_g2TT?u\Lnڟb԰NAf~s̝1]}eM:cGYț,bl8K9Ƌw%H(8k3RcS>_i\*@ȡW9'{,+ Tb?q<͠H'7* IAw@%yd%0""6ݓ̣)Nx+]˯W2Tkݳ| 4_FDXXK'OKๆzoym #kR0C}G H9!F.Sf9ZC&SOSk" sMj4 rBfbǼwbT]G߼/! TVUO D[y,IF"ONu,rI{;HE 3Ƥ_J,3Cĕ[ǪWlK"F#ep;Ѳ bXwO!#C*\K5{G bZجS9e/f/f8RP ^/w1:ޕV%f × ELtm0j3* pFI|&Li ]ĐrK*b$K?䁡j38N =[z/喉S[IEpu2æEpc7N D3ډ2f6ѵט6 zd.yHީenw>Wؑ+ǟKՎT{qȺ TuS(xqZ Hm+ԞLCK{ne ,ءt]%}ByԤ1e D!zk@ $4di?6N|p—DЗ0luɓQhwc|#mfqG)꽻Zxe*ihp<^8.┸@g]u;(/L3z\쥒JWq) #S9Ci.uεwEW )QA"³koKCۼeġ^v7'au|1A(~+z@\Cڄ.K`9UT [W$]R"z5PF8eYaѦ_ܲe!E!vc(k_ix]]9`gNBBclN+?陙A 喊F 0 _=\lg6=K]t?\qg[C)QDzp/pU'M?΂ _S&WvPz 3\`ڡt\Ḭ0h r]ؓbRyS;tX͒K68\`5"{_1ƇgQT7֩5dSXD&b,oIj~C.|Tu{^zL%~Tt1P1Z˱}TwziIk<\I]ݮ;b'Ҳ鮾]6EC S. 3vSay娣uKZ+7%M92>f̷nf^d?9{QџEp;b,8,^ 6E&g1WFZ)]c1^/q{=#EعSICbBb*J p{y%8#`- N8n6ۉ=qʺ7͘30@iEJ!q&SEuI.Nm=:Ho֣ hv{ Moq01es,Y xhN7t{wAw}"2P#'NbF)C2ZTd=[jp!4%Op $'nuOJj"}тCQ,-˧o*!vwǦ51B1}|t94Xo:ʆnzkL}q8A> 蝧6=hnS y!ofmd:X@VhX uEhBz ct̳1hD0/,KU߸0QgR3bb3MH!C`*3XjUf dkՅQ; dK~<>^/SǙBS`Y+ǧVqO3ErU34@uḭדFρ+6jX;G*!zqoS#U A,/Nf6 ;}';?Aȟ=pP&PE˘=HKh8_N9kLj$><4Z*f*֎ʿ]Z5.*IKM@h{=]2+}{~ |[}&J7ΘZSgE,F0j.u+iQrݺpVQ(j1%ArN?>`МqlG42|AM-L7P̼S CqA,+7FhmQN/VfR(u6TtPVQoқF1H / ~5h'1̯u&`7{('~0}ߚdd)9Ϫ2]'ŇmX够יPjݿӯ3H.{Nlh6tF}ߍ.dz~jiPn}D ݟCg3X^\'^=z>ۜ, >UZ@vC_J>@|p\'쭤}޴t#<D!J=B:"x ZrLY}G`f{o(<[vA`;5$iR`F>dx;Lfo-'R uӹxToΩŭʆֹ '${J1 0'#p#L\=hg 1rC"&!|GI sHlyzzB~)p!(sWr%]U)/`. B4+>2'Z[̅)PVz8֥gV}$4R(c"tnu'lZcm+!yb^ֵq!h߆BLܘ2 aLjfxQ-r*2yY$yL,zg^((aSjcnذK/R_੥@5} Nit՞o8Q.B Iwk=^#)yCZ`c90. ((;pTadh2j1F0Q30xUOT'-<1RxDC^Svj`Q0TώRk~'xU5}.iqωxguPz*Rp% v i.Y%=? l#]hvV4mC_}+c+xgsBӊ#VDž ٌ] B.ʼn:ͅz fXd 3 qQ-YO2f *R7nU'}Gh#>DŽ{|\ℙ8eoiS&TM&!!*p":iƨ;8aR 필u!Uf0,R'~ VPӿ4 _xy՟{CK5c=Ōצ :L)=xNRlh0V0Ăfr/2³Y9i#bˢ۲{ 3Xoԡ".UbDrރڧfESK+ <?671jfmF,3)-zo}yA;-_\h@8"k}<"fCurV6)'Šȁkoԭ Au 7+*d[l4b >RL׏ā\‘UŠ+0=6:4Jhr ?z5QuC0]IG !#?Q&|# {gľqVhbvV6scUടQB.α*;@1mUe# %~%RU9f<3U%*-wȄ#Fhj>%@~JW|OUxc9^z4Wׯ>x:\&PLRHM^)g$W,һ`Z 3`ؗ}2MaI,gqr> $ad2h8o%һ3r겨<5?W7X Vwx풫3`5$jey܍>iQ H?ͣ?3f[C$+{42 W鶲y7K`T ͦf?Ͼg ~2pEҖȬp/#DΖ$>KGTOxV`j]EF>pjE0J nj|dNE#Y9M+4>h+l,-*VPeƐ`LԪߒX+G념(V8\OXjI2U' Ir4h];o׸^r,mϊ*δ %,u_?#Ôt`B |Bh9l8" 龘i -do"t|/ RA"-? H,V}ƀEgbNETpPŜ`%q3)?&bq6Gbe< aAvvPO>0AO/mcO Hv>lF2C9.AĢlꉃҔ]ƥ6Fc!~g;²r~Kh'lR۶Cu3fuzgςwR@щg 1jl ^e~[`Y~uMiٜV|6O$"5@hI^Pۼ Fy`tӧw*?Ig.0c HWmkѻM,/]4K{hűk ,j#yaO&$ojⲆ,k Noz`6kಘ5DQ fT FC{!(ŐLee8L7B,ӦnyK VY䷯fw&V! .{o{Gy)3IrٿبTi7;u7}}ts` 8vL[L7D`4Ε[{gs)b7FtzOP3sb<%QMlߌ9fF&W0k]e[űẁ50*- :.~˨̶mZH3]m9{^rӒs1$υn cq c6?+8dvB&,8j˦o|!Ε")L)uMt(nNk<yftCaR+_SmzCB Ķ?B<br5mE+m ϱ|:푲?-9s1V6|%<\dWÙ::e}<8J8Rc|ɛ&.̽ =vnRH_Mmb>x!/Sy䢻܀)ho_Zδph` w<6ߧ&+qT"i' ^b\ V ^_)z~"uļt2I%c9\hfA! oiߒ꾚Co5:y –$=4VVV1ߋriucW! sMpzs,l$*uot^x,}!&x:(*Vd+83KX,[Xд+*+pTO)]FIよ& @.N)fibN/w0Y&y2:YeRg8@>:?522:Q+#Ǧ 6mJ~\0!󶎈:cfZ/ge0\t١5s]2r[ypk'@uydv?~A$W<=?:@~i^`|wTfE hrTAu𸗥EHĨ ,8m]=cSKXޙun&no>SM,1ii`?8|Puɍ =ːŅfA9**qJ-"'vyfO, R.n#S=U8kl`Xf@̶CP_+c 1}7F3FG˂R7a6eyTej+˅:5g/=L }^gNo.gi`7+9T9=Ua ,){ 0nm~qbfYj̰ "!|Ғ_gBXpzH6<*鏊T(D-li&w%¹ʽnMNȲ _g7x8t/8Yr3' oHN7 #ى.Bգ/'f5 'urO {(%3tVWy .=v "وkX[زrpEypbCe(_(lzΆ .dOwL'k$1PUSUP 7&ٷd72iʹB,dGIH^ ѽrҸ:_EXS=[w&Sf(i[.D9EZ`u[za^@g-j=zGASu9RB&ɰ+{Fg$RcRܐ8)TI*9O0y̏B]!*|lhðWO>SKU66 닱5nHq2feX!3 7r M"D% ahj Bܣ$X) e-eA'g-tźY[~dK6o'X +t$76Cϲ((rp}Я^dEo6€; x4t;pMw>+Tww8qN=cܘ)j,y냥=Q׹SF]+ 4yW2wnOuKo hq2/AO ]6!Q%B4r8S:xXP\hbފx1H2á?:iwu mj1⎈ ✊$>mU<.q~ -ĢXJ1ȥh/X/u-{PpI5[ц*x璤p9t[L0fZ,b Hj]ƋltnAQO%ajPfi< e=|ΌJ5/O$5VWUꄘ\mQ8 @ 5>i@auʊsɤ2l8lQa.y>_pkJ{TK=dmR[rY9%j *lJBlUFn ]>6gvܢ/2ͩDTk*b5oMG``qtl"FU܏dBEFpXX+ԜD)Vze%ni;qHsJ/<#8ry?Ym-ܰd]׍RJ)neL*i^L2f1jNƌ,"p7 TX PasnМXa <>/99p'G3l)Eb>+W"=TNJ[0&%O*֤)UVSI^%/D(j6d~$!-'tsТ\{%9.(#t!'-E XFࣞ*EOߡl"cl#11 U$ܒfC- OtTXI}ǂt|[3"]ѧ:2Bak`gh0ח*2\Yj#j+"1i#Pi P[,nΎ\9J܍Μc K"~NIGxlM4S\f.FhOU^4H U6G;4m9Amӣ]RjRurRxit22MMH#/OuJ+ $AoazV wڋF`0 RP k뜲I=XpgΨ{f W;zpb(&q` эbP N0KHTވS9*n;;me-2ύZhNz-ޫޗճχw]bTKXR;9]Ԁ+;Cܿ1 m"(P0HAD8 ʉm UH=?,[,\[4S> .ߊĒ9eƶpKVɷ|s4$$}NT?pZ~8Uu(jb,En݇Mb^XaryK"(L$V`MxKk%֑O\/x8 g%8OҤw!8!OgԷ$uie&̢#&˒ ^'K Zgeݺc6\[|wsy] -cѬpOT`x<1 yj/ns[wĪ VMP^>iȋ4TdA=r᡺ǚx zq#ZΦL,$o^:vR?)oFab剚g^@]&F;""Z4& 2#c5n:tSO(%".|L=ϴl8,W=p+%+P8R{CB@oaPб:]*se['n̄޼O Cn|_u7zcxh=ؿW5ewzXXJ&12 t,zPOS9ZS:u-90]\u YKo^ZG^qupSRE1Ȱݏ[=Olxʡtn`>0z*B+|P⠑u|#9A1l]ʹl,d% >aocM f@~֠%Swg[TqCv4k1D oN[pWO[OpsTsTܓfYƜF}M&߆j lXfK!+ӷm. %78cP3Zw0/g./F(fWkq >ks=oU|_qHFW b$P9wx(`c\I(LCQOEjXJ%ݬQ&_2qҝQ_F,3,Y⏟[Hc['"JQ^}J:JF;3s͠ª͟'Y,)߼VJ3[:[usRe$rrjT1+PZ|@jy2OWȣ#R)&9>ioN^<Ɵr9Rc6cZv>ܣ&T_aYӊ犕_]M װbTvnJJ>iݙ!F?(-F>nEuA R9i ("S9aR:U6j B-a ߌܠ`.\)ArE9c7xr p󱦦'皷9V? B;,ȍ8aʟtz҆X;qEvzgh I$ ȱ$}fpt1w0sj([)yg`P"2fzKR,}b\*ϊgJ v=MƯZ vT# !zohj/ABw5k};"t7D:t^7`W'*#7*G *@~kU/4RïwimYA%;qZ[@cd/qYS@gs k[A(WGv[ȋmQn?BeT)hqϕ"-fac© @I E44@ oV({c`6$H)6a'OW](M%nd%Uxo$5MZD:(o;J6y篛o˅%8i.Xq \m2^Rd9rL]a #ݒ aE F&yҵ9n+h5wh&e0/?؁l~e> P߹lSAPRhROː&VmwIunMM+cs9cC,&P.Us$Om" endstream endobj 354 0 obj << /Length1 1644 /Length2 8804 /Length3 0 /Length 9656 /Filter /FlateDecode >> stream xڭwUT\-n n;PRK@ wwA  ,M9=N~>O{K撹5fJ07/7P q҃iD5>' '*z`@lb1aG'o1?%Lvy8BO/`WvN` 1UR*kP+@bЀ؃^`6` J~’'7=txy= ^GO[Sa''쯄=aOnO'0'UGAZnO<-[(i4uO^jm ;L-P'jDD+ ^J0Hmpu}_rC( .^ _tN{"V≲jѕӖKKiجyvy ow03քq('r DxnSj|i @'?O,Fj$}o[(i!|uT`?kyf/HZ0<`y8½Š8)Zcs:%0mĕ7*`S[UN֡q|ɜքU=T''5[(oqs+wܗI]%̩߯X? Pr'a2ےХyxlD}k\Ojn2q7똟,6Pf.IGTD7RcjVM] KB+GRb.9Kgq ʙ F2*s9f) #~Q䴰@4nLc-N` :́CaI2W_O s$a^@W VI˨ҙm ~?oɣTZiU ..Vo{ͻ{2pfm>oa #TcJ%j>5 r}ج}/+5M:pu"@Wڰ(} '?w6qP#5#u_ iGf|S膔dq?.dVZ侍3\XPG̰M3G$5)por_ETj2j_OmHd0)խۦFY_o~;k0Njq)jLBT4^EVZG7y_v{Y/hiw!{\j|SGOAYՕACjDyp|F(5B"/pQߙSH{kH*UJQ2_#7ݨUKfsZl}Vj"$\qQ>q$dsvqd]5F҃W-{}yFf Z}⫞h*d2G[ zۊ^"&$eʸɛx՗U/< S^L:o'kR yċOW?&)QO"Qy~Y=nFFLb)S kje[a4vhDOĭ CӀZmS$n6 KjO/unqԎɐ_PnsMf}:}/m&hJ^q8I ߜ,k'6% Bt N1 N  zGOC:Go2?)͗8f"0ҟ1WDEqjkPe#Eš.@ J*HiIxE+G7R.jꢑrr% VGԖLHF@l=$=!R_L2|yv^ʘ[y-ip~yw«^߉2; seL94EcURLriVXc(I_:I 10b˜ P|!<\3,S|vb캈&M1U%VD.$Zd ~+B\kCyZ]: ,ZjFcz\<9hc.B|R̓o($XiY。M+-oԙ5k~l dhznmKR'yp % [É1M&侔>,^!)q8QZ(U|]"4~URaU앨'DafB(H\zR+Uǂ lRیfMTHdQwCwJ/q )VQKިH}9?ҔR0̆YTC <\$D掘pJ}+l9#ߙ/YW)˻mQFeqyCd3{fOAcGbT9 ۓA GeQ- S(j/LdkMsnU娗M柔ym' Lr(| dcЈgQT_+μU:&ND Vb$Q[vܶKLgGfCKӆVDb^n3aLDJuPB2+M8=?0xqS!O?^CiPlR*UVIv^ˌԼ+(aKqyMd]] %FI 3vΥBe' _*yH}NS/ 4_HM(lvB2eۍ!~(@ٿO"^#1ⴤ*[zAe T4(٦2iK7ƕT Ella0î }v U+T8-ay:K&9s{d(3){XHcY(LaӃ]]v9)7ajZq΋iD4܀vu[F/%ue9 9:L% ɤ(=ّݑǸm|QX!\վI ̽4=d4_lS/{&?ð^D\wIzn՝j-FӞgɸ1|kvVʓhI6k][gc:o+J\{!bLqMł{l Qߘq7kaTwS,$Ds=ܢ2[ڢ?dKqk*JQvB\a/KV/tAl=|pԑP1kNe>lΜYW G \G4#-v^g3T7St ~'u\ˏ g4Eh Eܠ43Iņăw n'._M&+_ lBBEk z$&C)nC]0&,:!a(=.6 zR ڂ "~$?GdnX(b}IZ{Nl),N}fXA޼|uoG[́^+$@"CvӰP-f{yO궰Vԏ/2ZbJeܦXXu?'.do;b6JƠUևYWk5ʃKT q3);D3r>膋 Qyg ^WTd6S9]o(S8ՊXYٗ멨G wD6zY) |y_GmY}*`9iA=ƎI5^83W7d떸R6eRĄ0jL# BczӤS2w0DmXJHEt;8yR';fgX\E/Ed%]s(krI'e ܚ'wA 'ڑxwcƎ:9)ZQe6d}!Jwurgx'xJDpҔ-C/I6die )C$|[r+.?x_ հ25of̏ÓMx"rMoK*̀ϢfzJ$8HmیX7WqM(ij5Fv}X+Up6Zw|yO& 1"7}oߔ"萵H^UoPVt\}sbj@NT24x"W.wDf4tq[%L6Iz1nkRsJ*agcȥdY#Шה傯m#} xpnٍvԛP< BQW1gy|̆?눼qi;6y10;Ey+!+ba+Z(S*@׽Qɷ(,@Hۛ"̥wN|U^MNJFR"rn򻃫!>JV.ԯ^raFq_",1$zϺ'E7mU }K(ubg43^Km&i"w$rKXe CH fЗNjg,K%ى}r%d9M>\dU[Axs:C"RkCR 6KMujvIFƷF4>7^jq̰8Ns糌1T7>y՜k$+tJʽBma%zh"HO o4G_.} gaVN '0ԟeSdJ$B*<=M& !QFK>qp~KC zu@ 4Fo揌Rq5`SCˎB0ҼlQN# z ߎoTئs`J_k]WPR\%dp~ŽR&M '}Ӕk>D!Si5r^@p-TS\8:ٞskE '^w\t`00SFKZЂY5Q2VngsO>12>:T+{RFGnŢauMgsc08ęg*(O-{wrv'|9anNF~^Z ]T^@(Df[UɈϘq 55GZBv= x O6R.Յij-dmqs;uH'Qx e;MN U(Y{>$U:T(8沇/UKȕ2؇[+/ ]RӖ~5vȽuow"IeJo9^{FI7*>G, 'Ռ\umb62$ endstream endobj 356 0 obj << /Length1 1647 /Length2 12437 /Length3 0 /Length 13283 /Filter /FlateDecode >> stream xڭweT\.]ww ܂7wwNpww@p].w̙u?sGoSUSU{mJReUFS[c#+ @dmbkh+Ϩ4wq2|8))FN [q#' @h 1[;wF]E_L|x:mT.@+[;kQ8Yf + @LIY[FQ @#>Pv6A&@G -`WiLX"#t3bA#l +gӿ퇅Ld,.<,Pl>,MmM*ȯdp909Ys#_0FV@Gn_uKFvvV{m9VfLl1M>bl3[+?vԹ z# #S[+w) Y#$2 BywhIg++E#Ǟ|,#ǮZ6VFr5Ywn G1`b$ h r2Y}\ruSAo:5 7 hc5|w̪_UmGW8IS?Aں<Yxl,1l`r0>HؘؚGNF6& >*!݀& &AiN58Cc}=Cvjy~Uݾa/L |oGvt{?{g䴽yhT{HiǚQsP:\,{[c_T^`&`i]0)}LRb:Pk򏎩F/{w b(p|H nMޠ\\<1^mRmj=fhڋ'DS-X<·n,>B _ҹ%kȿ\]ߢ&UOt_JFdaO?q24h\QY%@Put苏cil(w;NF:9&odPKaXm*#.݉JQjKQrԕKτ fF.ƌL%}3kSUuNҬJ.,:/7{4G_Tm<%jn^pZqp'gB`MRb-¿ lCn /Y苭یű9N *GPmc,x$fn3$BDVUIYR{' #_ߵ u21n"~X}CΛ^j aުXE&IB?BtwW$^|92 IFեmxJ`y^{ݏBJE!VYK+\=ʆn7F,|9^X ^Rf"jb%ܨK^lWuUaW8Tc3rCx\4e.n- 3(dn>3 DcCVK.|6y;|јtTu(7, sLȈ)sGvҏ|있F"irX|:l"KMSag`tR]LP/{$t7c0dxWY0yPy7RYAȧL.Țg`LŝXp]r^H*"+ Smx9Ὡ(=v6wKH813qgf f-n;{u媭]J(eU:U17c 'i? udI n'tkqSϳX@Ad 5m=-!Mw5J[w$yer38psul cݦ \u6ټ( eυKfNth?D=pէgJw4l[DmՄ5$MF])p=hywHRNWz Z(uZh#L;X(>޵izߢ7 ZQ\{tN1-gF82zDS;Fi/2&a5FBR]idZ k|%{J*P7bqN8+6ݻT9Q*NO= 2Ns~''`2ŕo\ھ1"0ɿͧO=Oiv4&!,(- G߇u?%[@"5:6 't+rx,%mwnx)x-h-o>>9bi']XeSB͓\辻2EQx^6OT3tN1s*,eηa$p5p9*Lcp/X!}yȶ%Gކ1}>p-SgAQJIq憕1+뼕I7\ <~#6ۓ0yd|)^k„<3fU^P[9iyʒ3\fiٻqxTh?[ !K>_6: X½Q>ڈs&[Y9Z5-l+y Łn+y54Bf%^OpHEN汋sc[T+ō{z# ;-&wf$/.cLFp)+.4Ϊ ǡtUD5ʅN JTOD_9vH}bLafgYk)Njyp)nO} 0 i;BtTc}`O¹a*^]Th܊;97ͣ5Rn.AkT 1\G?B{vf)}k˱2GL*"ʗD;l4 '+%_Wv0*lg:.ɳ)8՟xNyTl2fqpy QK0'K!ƔP6̅>Ih9 d+nu_&Y LA)ߏq<$|0{uT"䋿"|'']TU=".cMyUS݃;'zsJ"a_>\T܀6/Ӑi&3ۋ7ˌ/phy `s`71?Fm`RrLvɟ7*]6OD7m_C2EL<]5`{/ǫ*Hx%¯g dZp9VЁ4V"^ nmRZFQ;R6Whr0VeM'#p$?u ͽdͭ~DcmH aqxqD,6XQw_7t󵛭_/T>4:^ |\^k݁ҘgmMlW6.H*eVo(+ktXf#[ Y&$o܍&  ћ8I*ͼ_N(pa~"H~Xb0A=0H qڼ"Ӧ=z&v,5LP.\N<<05B-a&YbcJ%cڞAC ԑM0#%!㟡辱b.A,pu _Ȧ۸D2L^Q9ջ=6\1r߫SZ5c Vie[98\1W'yS4ƃd{`b1},7 vG= Q"rR 1u*)ndsxXLCN?\vpzIjmB6Kτ/jfSFdAaJ UK΢xtg*2tƏNjdIŊ3wm$~FT}=F~6EiPʄN: u7 ew<|mWf K/μU;1 vcdd"%]Hdք-S6nGV:Fl*9_Q(ɛs<?\UFq0}RY$АKBއFZ~פ0a콧(a[Kž ;&Gv>kg6$ tn;/,*,#(ab8.|>|Gw =`EPAiSCػUHPE;>7-.#ZEM9 $P5xOMUAd_VХBΉe Cj_XR_3uwyX_yB;1 㞌W-כg:"ƥK(Y`jpmi8 '*dz4 p p@ R88a/rVn0rFfnCfxJH@f h >LgE8W`^_7ڻ<+, xSH3s" Z /GwO7y|@7j@a.'fZ`΅^` 1QX:CɐOOL @co!H~D=.;+d:|ËSUD>UeX ߚ~NLvjljnc:VF!*/~VʚCCM½ `᷼\1Ii⟶3dSiy4u߸w!O"uu&M:rvzȆԇ:nGǤ Yi֮lEP3TN!.䴠-ds!e{l; :ih\a ^ZpvK_FD!>1,švs'.ͤEMR' ? _Ex5؜qHVʑ>a& U UQ}@O3Հ W _R[4ۖHsq~ =$0& 9+AD<;!Bd _*]rp͑A8v0ٚbЁjk3gUZ)6hVw)gދcՋ}bcB4 r_=R:N X$:`[w ^ȓPm#̗C{3 aox-pzk=Ea(>#&* ZDŽ[+958 vgC7OPiۢdJDDjsl TkJ{)꒦{(s:)[FD"K#:+~B*X[NtL'ΓJ}0Z dSJGN:?\z?/fVy޿ &ѣA)Q& Wd  b(KW3ɱǢ&F h|儣Ha`a6nxݪP`8Bnc<|fzE9} qĝ{+?1ygƉR:ik{it3VBi8 ?teCd8Hu6!4+>to fGE WX&i[k~2"Z@F}Ӈ7'aY,{_zD& .vğ"9Dyы$ qQYRp$6beZQE@kp85ܥ*dT@GN?DnbY^8sFoţesH+Q u7='q0o;e X0ݽpgmΟzA*) 󎟖ad'ٓ†׼yHu7-u( -b[pH.oڋY $cBK_&܌INϪRը V;hPPaԝ.PMB 3B>0};IߎݤJ-I:AyH.A Xq\!㝄׻%tVZM=>0 Ƽxe y|v;mSg)mс0B(z Ldrjf`S 9 _Apn̏N/Zjyzn ;u+f)/$(;OШ53QyEs:  q0T ڹŪf-aC([-<{Op+N{W:URpX?]1]/,s6l夻Ӣkg%rTU9'a vŹnKDyRu;&XF{D{R{R*Sr:Ɉ sKKE-Oo\iM7ry(և}Ox`]J֔0rMF@ُβt{5⎘'}ix|< 4LcsCTREGf`]#iR&Id FQSET*Yz7 =@͑YIx8h ϕ,N2H sS~N[+K*} i,-L>ʙBf{@K7⡤/\ tYoY84m|8$tk)a=yrsw;nelK\Uv^mm<, .Da0;+}wtknF_#IM]UyYUWBbVIBg4PQUkCfoz(/6P2ߟHHzV/9*ܿ%<1f}tx "q\_54FV7\y][#)cc N+Dò ft琨D֏C7iݩ,Uʢ2!+7E@g4٣{ /h-棛zW.eSg夥|$ǝws9OY\׾?ќlTb?@T)ͼג*tٕjxeISv,#Z^K3,ut:* 8x+hW2֫@]IՏ.;)7άD 8:`e e9i}̍5 8js lؔ8upUQǐ9{YXN]bCg ь|M3]kdA7ۺf}ѓgf)$X$$GQ Méγg}bRJh"Kݏ 'fH-` 4:?F/nS)Tf"]8s!I!6w6MZd#TD}y6f)Ub()>?T}c}n[=a}>wl]dE5Rfnn )RZ?^|\wu 1r1YI!i>$;)x˨&?<2WH6ڕ|# 5=SWO/&_<…Cllq~qm?*y<^;ON]$H0IAM*z` LM{V&MFSO1W}<'1N&٘ݥBlHBy@|99v yDvN48Xu? Rdl7/Ko=rnr֛͐7=4}sQin j Erg@u=)OL<ϐ窅gK%G8E 3X4y,OhIsH kfCmo翉qY獨IRL+unW &İu܉IAnwbOʕ՝)"޲J`(׮b6}i'!6'Q=%G$p.[?i<ܢ|9Ƕ2cX ~ģ&%)֎;l*]ڄ#SrS|u/*ld+ |/8dgCLՅox,p0Ƒ/_HKZ]JUdߎ⭅ EhXʤrz+TW3ЎWWs!&Nu OP.[:I^aJ^ZDR+/٠ 5ƀ '܁jMTq+φiafHü]\<}Cɷ٣@"v֙-Kuv<;QjIw{xa9L~E?sښτnd ''\% yYztZ:+.bS4) 6L4eFmHrU {/Ct/Cg$vSWKqp4fDLbZHw"00^0>|z={=MFw(Ĉbƿ"Gֽ2|z*vTG o\ p"nփjy!UdVڃ5e<@%]1$Id=Ip%%1;UFR mq|:Fj []ĨG'ӓԈT_1R#z{ ^,c<:'usU<78 ׺E+0'5jć;Fb^VBPw[ ( Nî3|møo5ͰuUm.&hEg $OhtrDe6ؔ8kzqb]aIEjq&:d~lf-H5!o/B- 3Ve9 +;Ws[vRٟ  nVjBi :[^f`GDɬ ?T53V}z` JE^nSt>Rw#@LOGq9BHYN4BXq5x>k|k.#w> %yOSƋXɐxځ <cQ&q1xL]-{*HUa] Jdl/ȥ߷*_q:ﳷu۫6xP&ٸtgwp('=\ƭPrc=c+}Z7 IC> C|Edƅ&f{f˭ZO.Ƕ\6s|s+5ߒPî$n F*.5?Nehlnu.Śllm)pv\+s x%'sMf%\j*"KcS`T'p"n=3k =N;Nִ',r9;hRהJrٷӼrѣ^TBkMB%Gʇja 9. ;H:1WB:^HfK›)ڇC|Z%Dn6wC}z}YgfСqi蔒ڈnK1c"fyk8{-93IC-? P0" a: Il%l5M@hΤ9k$B~=]b1g,T9 /ށ,[}mMMs'?y1B'ESJq,EdR Y!.sI霅ePY n±CEW$I+S6c{Ѧ8A;aFwD O:b ȟrKw6![BnWKRw~P6*"\Y@5WáH-l^V@U`MBc  Go> endobj 343 0 obj << /Type /ObjStm /N 63 /First 546 /Length 3011 /Filter /FlateDecode >> stream xZms6_u;6Ng78vj'K&sCK %$: R}PH,v "$""D ISOMXj"$#LD 0cxGZKBH FcLT z$0PqMJ`4E"GZKENZ2AC8,$NuD8KHS\DFEb  gDRBG$''c9s8)^bK:(&NQUXMJ8 zBI0vQ%bІ $~]xH.! J "MRDGE$ 0IxMb@zh|ae`_k+HgpT7%f&ɓ?ϓD5N8${WǟB]|> luA[`R ~qF~Bu*4e5l=x/r]EdYn lYIyO>D䘁HTȏ3zZͺ!ь>6/L \_6YO`1uFsL`]V]|GOS>g%=WhFTu^Ь`΋`?.x2ӎAJ w_<|z9EnT?c-~n7FAO?_"-oU)7ׯ.'HA`PPt(==LɾH=>ɜ9zwXn}whxD3C\Nw w?MAU m8!Pk/boXlY+[-=]XBץ Ǚ}H$w8]n nh cq} Ewy돏V Ǎr.v%[_oڧBԖufADm9$HP.D 6"_hX;Clp͍*Gn<)e{& !lr=o*Eڡ u~a{0yX7OwtLev <]3yfxf>|g&hY>$Ix[Y9?n9"*n''WP|wA|rRdaǏʷW;*oV8 6<_Mp1֎FK` >:/-"Κ;rU2\G1f\njVrR'B>p&{pسCGܤ=*Ow<?kH_fQ 2.m-Л"9eGI!D̋#7de=ׄ.İ v-pĤ]6^{eyۖ'34o=Lj ^bLJhןVVy+;e/W9*{S t qĴFG30uӅjYcXN@+5pN :ms #m!&k0eR?yxIe8y1#[ 7#> sA"uqA,| QFlL(czm myڣ[SPM66&/[JsxxR4 I`8¹^¹%JY(U(ա4#+ )JG5JGh~r$UHyR$UTH FbnB$V":t7@y?lpFq#8JCϕD44QH@p`BG$(32G44wUP{?!11R$H!Dj"R+%8hpV9"FjG%RNqK6 IHmhB!kڂBPɖlS uеO]&"[@ Lݳ_%`=8ye\)\w5L\$# /5D?Gt@nwTwjg=NӬɠzw$O޷ "ݧy]. }WwˍYZd"7;q endstream endobj 388 0 obj << /Type /XRef /Index [0 389] /Size 389 /W [1 3 1] /Root 386 0 R /Info 387 0 R /ID [<890B264642EEDFD755D1371AD12A711D> <890B264642EEDFD755D1371AD12A711D>] /Length 869 /Filter /FlateDecode >> stream xVUG+` b"bD<@Vi^ 2J0 dy&䣪N]SJ)uJZF/ZWvT/MimA;Ջ><36a%FNcg!2flBw#^ۯ;n7Owƌ=0Wwʟ9i-˅f 8p'p2;Sv "{Zk'v^|9 ѝZ-k[ Rru]uQ52Ry(X^~LcG0888MuTGiY"7 #include #include // for NULL #include extern SEXP sync_RLEs(SEXP, SEXP); extern SEXP compress_RLE(SEXP, SEXP, SEXP); static const R_CallMethodDef CallEntries[] = { {"sync_RLEs", (DL_FUNC) &sync_RLEs, 2}, {"compress_RLE", (DL_FUNC) &compress_RLE, 3}, {NULL, NULL, 0} }; void R_init_statnet_common(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } rle/src/rle_utils.c0000644000176200001440000000715413713375011014001 0ustar liggesusers/* File src/rle_utils.c in package rle, currently hosted at https://github.com/statnet/rle . * * This software is distributed under the GNU General Public License Version 3 or later. * A copy of this license may be found at https://www.gnu.org/licenses/gpl-3.0.en.html . * * Copyright 2017-2020 Pavel N. Krivitsky and others (see inst/COPYRIGHT). */ #include #include #include SEXP sync_RLEs(SEXP lens1, SEXP lens2){ const char *names[] = {"lengths", "val1i", "val2i", "nruns", ""}; SEXP out = PROTECT(mkNamed(VECSXP, names)); SEXP lengths = PROTECT(allocVector(INTSXP, length(lens1)+length(lens2))); SEXP v1i = PROTECT(allocVector(INTSXP, length(lens1)+length(lens2))); SEXP v2i = PROTECT(allocVector(INTSXP, length(lens1)+length(lens2))); SEXP nruns = PROTECT(allocVector(INTSXP, 1)); // Leftover lengths of the current run in each vector: unsigned int left1 = 0, left2 = 0; // Positions in the RLE length vectors: unsigned int opos = 0, pos1 = 0, pos2 = 0; /* Iteratate through the length vectors. Note that we increment the position as soon as we read from a vector, so it's already in "R" indexing (from 1). */ while(pos1 < length(lens1)){ left1 += INTEGER(lens1)[pos1]; pos1++; while(left1 > left2){ /* Now, we know that left1 > left2. So, we flush from both rle1 and rle2 by the left2's amount, and add on to left2 until left2 is the one "sticking out". */ if(left2 != 0){ INTEGER(lengths)[opos] = left2; INTEGER(v1i)[opos] = pos1; INTEGER(v2i)[opos] = pos2; left1 -= left2; left2 = 0; // I.e., subtract left2 from left2. opos++; } if(pos2 >= length(lens2)) break; left2 += INTEGER(lens2)[pos2]; pos2++; } /* Now, left1 <= left2. (If lens2 has run out, then this should still hold, since the uncompressed lengths of the input vectors must be equal.) So, we flush from both by the left1's amount. */ if(left1 != 0){ INTEGER(lengths)[opos] = left1; INTEGER(v1i)[opos] = pos1; INTEGER(v2i)[opos] = pos2; left2 -= left1; left1 = 0; // I.e., subtract left1 from left1. opos++; } } *INTEGER(nruns) = opos; SET_VECTOR_ELT(out, 0, lengths); SET_VECTOR_ELT(out, 1, v1i); SET_VECTOR_ELT(out, 2, v2i); SET_VECTOR_ELT(out, 3, nruns); UNPROTECT(5); return(out); } SEXP compress_RLE(SEXP lR, SEXP vR, SEXP remapR){ Rboolean remap = asLogical(remapR); unsigned int *l = (unsigned int *) INTEGER(lR), *v = (unsigned int *) INTEGER(vR); const char *names[] = {"lengths", "vali", "nruns", ""}; SEXP outR = PROTECT(mkNamed(VECSXP, names)); SEXP lengthsR = PROTECT(allocVector(INTSXP, length(lR))); SEXP voR = PROTECT(allocVector(TYPEOF(vR), length(lR))); SEXP nrunsR = PROTECT(allocVector(INTSXP, 1)); unsigned int *lengths = (unsigned int *) INTEGER(lengthsR), *vo = (unsigned int *) INTEGER(voR), *nruns = (unsigned int *) INTEGER(nrunsR); lengths[0] = l[0]; vo[0] = remap? 1 : v[0]; unsigned int o = 0; for(unsigned int i = 1; i < length(lR); i++){ unsigned int nextl = l[i]; if(lengths[o] > INT_MAX-nextl || // If cumulative run is too long or (remap? v[vo[o]-1] : vo[o]) != v[i]){ // the value is not the same as the current one... // advance the output vector; o++; lengths[o] = nextl; vo[o] = remap ? i+1 : v[i]; }else{ // otherwise... // stay put and add to the run length. lengths[o] += nextl; } } *nruns = o+1; SET_VECTOR_ELT(outR, 0, lengthsR); SET_VECTOR_ELT(outR, 1, voR); SET_VECTOR_ELT(outR, 2, nrunsR); UNPROTECT(4); return(outR); } rle/NEWS0000644000176200001440000000011513701735714011540 0ustar liggesusersrle 1.0 ======= Initial release, split out of the `statnet.common` package. rle/R/0000755000176200001440000000000013713401160011231 5ustar liggesusersrle/R/zzz.R0000644000176200001440000000077113713374324012231 0ustar liggesusers# File R/zzz.R in package rle, currently hosted at https://github.com/statnet/rle . # # This software is distributed under the GNU General Public License Version 3 or later. # A copy of this license may be found at https://www.gnu.org/licenses/gpl-3.0.en.html . # # Copyright 2017-2020 Pavel N. Krivitsky and others (see inst/COPYRIGHT). ####################################################################### #' @useDynLib rle .onUnload <- function(libpath){ library.dynam.unload("rle",libpath) } rle/R/rle_future.R0000644000176200001440000000537613713401160013543 0ustar liggesusers# File R/rle_future.R in package rle, currently hosted at https://github.com/statnet/rle . # # This software is distributed under the GNU General Public License Version 3 or later. # A copy of this license may be found at https://www.gnu.org/licenses/gpl-3.0.en.html . # # Copyright 2017-2020 Pavel N. Krivitsky and others (see inst/COPYRIGHT). ####################################################################### #' @name Extract.rle #' #' @title Indexing Methods for `rle` Objects #' #' @description These methods are defined and produce an error (except #' for [`character`] input) to future-proof code that depends on the #' `rle` package by preventing their use. #' #' @details At this time, the `rle` package does not support indexing #' operations by [`logical`] or [`numeric`] indices, but it is #' likely to do so in the future. Therefore, we reserve the syntax #' now to prevent users of this package from relying on the default #' behaviour of the indexing operators. #' #' @param x,i,name,value,... Arguments to indexing operators. See #' [Extract] documentation in the `base` package. #' #' @return At this time, all functions raise an error except for #' [`character`] indices. This behaviour can be overridden by #' setting `options(rle.unclass_index=TRUE)`, which effectively #' [`unclass`]es the objects before indexing. #' #' @examples #' #' # Indexing by character or by $ works, including sub-indexing. #' x <- rle(1:5) #' x[["values"]] <- 2:6 #' x #' x$values[2:3] <- 7:8 #' x #' #' #' \dontrun{ #' # Numerical indexing doesn't, unless `options(rle.unclass_index=TRUE)` is set. #' x[1] #' x[[1]] #' } NULL IDXERR <- paste("Indexing of",sQuote("rle"),"objects by numeric or logical indexes is not implemented at this time.") #' @rdname Extract.rle #' @export `[.rle` <- function(x, i, ...){ if(is.character(i) || (!is.null(rle_unclass_index <- getOption("rle.unclass_index")) && rle_unclass_index)) NextMethod() else stop(IDXERR) } #' @rdname Extract.rle #' @export `[<-.rle` <- function(x, i, ..., value){ if(is.character(i) || (!is.null(rle_unclass_index <- getOption("rle.unclass_index")) && rle_unclass_index)) NextMethod() else stop(IDXERR) } #' @rdname Extract.rle #' @export `[[.rle` <- function(x, i, ...){ if(is.character(i) || (!is.null(rle_unclass_index <- getOption("rle.unclass_index")) && rle_unclass_index)) NextMethod() else stop(IDXERR) } #' @rdname Extract.rle #' @export `[[<-.rle` <- function(x, i, ..., value){ if(is.character(i) || (!is.null(rle_unclass_index <- getOption("rle.unclass_index")) && rle_unclass_index)) NextMethod() else stop(IDXERR) } #' @rdname Extract.rle #' @export `$.rle` <- function(x, name){ NextMethod() } #' @rdname Extract.rle #' @export `$<-.rle` <- function(x, name, value){ NextMethod() } rle/R/rle_utils.R0000644000176200001440000004154213713401160013364 0ustar liggesusers# File R/rle_utils.R in package rle, currently hosted at https://github.com/statnet/rle . # # This software is distributed under the GNU General Public License Version 3 or later. # A copy of this license may be found at https://www.gnu.org/licenses/gpl-3.0.en.html . # # Copyright 2017-2020 Pavel N. Krivitsky and others (see inst/COPYRIGHT). ####################################################################### .check_lengths <- function(rle1, rle2){ if(sum(as.numeric(rle1$lengths))!=sum(as.numeric(rle2$lengths))) stop("At this time, binary rle operators require the vectors represented by the encoding to have equal lengths.") } #' Safe multiplication of integer run lengths. #' #' Return a vector of run lengths each no larger than maximum #' representable integer that sum to the product of the arguments. If #' the product is 0, an empty integer vector is returned. #' #' @param e1,e2 arguments to multiply, both `<=.Machine$integer.max`. #' #' @noRd .run_mul <- function(e1, e2){ o <- as.numeric(e1)*as.numeric(e2) if(o > .Machine$integer.max){ # Integer overflow. c(as.integer(rep.int(.Machine$integer.max, o %/% .Machine$integer.max)), as.integer(o %% .Machine$integer.max)) }else if(o==0){ integer(0) }else as.integer(o) } #' @name rle-methods #' #' @title Miscellaneous Common Methods for [`rle`] Objects #' #' @param x,object An [`rle`] object. #' @param na.rm Whether missing values are to be ignored (`TRUE`) or propagated (`FALSE`). #' @param ... For `c`, objects to be concatenated. The first object #' must be of class [`rle`]. #' #' @examples #' x <- rle(as.logical(rbinom(10,1,.7))) #' y <- rle(as.logical(rbinom(10,1,.3))) #' #' stopifnot(isTRUE(all.equal(c(inverse.rle(x),inverse.rle(y)),inverse.rle(c(x,y))))) #' #' @export c.rle <- function(...){ l <- list(...) l <- lapply(l, as.rle) structure(list( lengths = do.call(c, lapply(l, `[[`, "lengths")), values = do.call(c, lapply(l, `[[`, "values")) ), class = "rle") } #' Unary and Binary Operations for [`rle`] Objects #' #' Unary and binary [Arithmetic] and [Logic] operators (with #' exceptions given below) are implemented between two [`rle`] objects #' and between an [`rle`] object and a scalar. #' #' @param e1,e2 Arguments to unary (`e1`) and binary (`e1` and `e2`) #' operators. #' #' @details Supported operations include all elements of the `Ops` #' group, as well as [`xor`]. Within the [Arithmetic] and [Logic] #' operators, this includes (taken from the R help): `+`, `-`, `*`, #' `/`, `^`, `<` , `>`, `<=`, `>=`, `!=`, `==`, `%%`, `%/%`, `&`, #' `|`, `!`, and `xor`; but excludes non-vector logical functions #' and operators such as [`isTRUE`] and [`&&`]. #' #' @return In every supported case, the operation should result in an #' [`rle`] that would have resulted had the operation been applied #' to the original (uncompressed) vectors, then compressed using #' [`rle`], with the proviso that if the resulting function creates #' adjacent runs of the same value, they are *not* merged. This must #' be done explicitly with [`compress.rle`]. (At no point in the #' calculation are the uncompressed vectors actually constructed, of #' course.) #' #' An operation between an `rle` and a zero-length object produces #' an empty `rle`. #' #' @examples #' #' x <- rle(as.logical(rbinom(10,1,.7))) #' y <- rle(as.logical(rbinom(10,1,.3))) #' #' stopifnot(isTRUE(all.equal((!inverse.rle(x)),inverse.rle(!x)))) #' #' stopifnot(isTRUE(all.equal((inverse.rle(x)|inverse.rle(y)),inverse.rle(x|y)))) #' #' stopifnot(isTRUE(all.equal((inverse.rle(x)&inverse.rle(y)),inverse.rle(x&y)))) #' #' x <- rle(sample(c(-1,+1), 10, c(.7,.3), replace=TRUE)) #' y <- rle(sample(c(-1,+1), 10, c(.3,.7), replace=TRUE)) #' #' stopifnot(isTRUE(all.equal((inverse.rle(x)*inverse.rle(y)),inverse.rle(x*y)))) #' stopifnot(isTRUE(all.equal((2*inverse.rle(y)),inverse.rle(2*y)))) #' stopifnot(isTRUE(all.equal((inverse.rle(x)*2),inverse.rle(x*2)))) #' #' stopifnot(isTRUE(all.equal((inverse.rle(x)/inverse.rle(y)),inverse.rle(x/y)))) #' stopifnot(isTRUE(all.equal((2/inverse.rle(y)),inverse.rle(2/y)))) #' stopifnot(isTRUE(all.equal((inverse.rle(x)/2),inverse.rle(x/2)))) #' #' stopifnot(isTRUE(all.equal((-inverse.rle(y)),inverse.rle(-y)))) #' stopifnot(isTRUE(all.equal((inverse.rle(x)-inverse.rle(y)),inverse.rle(x-y)))) #' #' stopifnot(isTRUE(all.equal((inverse.rle(x)%/%inverse.rle(y)),inverse.rle(x%/%y)))) #' #' stopifnot(isTRUE(all.equal(inverse.rle(x)==inverse.rle(y),inverse.rle(x==y)))) #' #' stopifnot(isTRUE(all.equal((inverse.rle(x)>inverse.rle(y)),inverse.rle(x>y)))) #' @export Ops.rle <- function(e1, e2){ FUN <- match.fun(.Generic) if(missing(e2)){ # Unary operation structure(list(lengths = e1$lengths, values = FUN(e1$values)), class = "rle") }else if(!nzchar(.Method[1L])){ # e1 is not an rle but e2 is l <- length(e1) if(l == 0L){ structure(list(lengths = integer(0), values = FUN(e1, e2$values)), class = "rle") }else if(l == 1L){ structure(list(lengths = e2$lengths, values = FUN(e1, e2$values)), class = "rle") }else{ stop("Binary operations between a non-scalar and an ", sQuote("rle"), " object are not supported at this time.") } }else if(!nzchar(.Method[2L])){ # e2 is not an rle but e1 is l <- length(e2) if(l == 0L){ structure(list(lengths = integer(0), values = FUN(e1$values, e2)), class = "rle") }else if(l == 1L){ structure(list(lengths = e1$lengths, values = FUN(e1$values, e2)), class = "rle") }else{ stop("Binary operations between an ", sQuote("rle"), " object and a non-scalar are not supported at this time.") } }else{ # Both are rle. .check_lengths(e1, e2) syncinfo <- .Call("sync_RLEs", e1$lengths, e2$lengths) structure(list(lengths = syncinfo$lengths[seq_len(syncinfo$nruns)], values = FUN(e1$values[syncinfo$val1i[seq_len(syncinfo$nruns)]], e2$values[syncinfo$val2i[seq_len(syncinfo$nruns)]])), class = "rle") } } #' Mathematical functions for [`rle`] Objects #' #' Mathematical functions that work independently elementwise on vectors described in [Math] are implemented for [`rle`] objects. See Details for list of exceptions. #' #' @param x An [`rle`] object. #' @param ... Additional arguments. #' #' @details Supported functions include all elements of the S3 [Math] #' group excluding the "cumulative" ones, which are not supported at #' this time and will raise an error. As of this writing, functions #' supported include (from R help) `abs`, `sign`, `sqrt`, `floor`, #' `ceiling`, `trunc`, `round`, `signif`, `exp`, `log`, `expm1`, #' `log1p`, `cos`, `sin`, `tan`, `cospi`, `sinpi`, `tanpi`, `acos`, #' `asin`, `atan`, `cosh`, `sinh`, `tanh`, `acosh`, `asinh`, #' `atanh`, `lgamma`, `gamma`, `digamma`, and `trigamma`. #' #' Functions `cumsum`, `cumprod`, `cummax`, and `cummin` are not #' supported at this time and will raise an error. #' #' @return In every supported case, the call should result in an #' [`rle`] that would have resulted had the call been applied to the #' original (uncompressed) vector, then compressed using #' [`rle`]. (At no point in the calculation is the uncompressed #' vector actually constructed, of course.) #' #' By default, the functions do not merge adjacent #' runs with the same value. This must be done explicitly with #' [`compress.rle`]. #' #' @examples #' #' x <- rle(sample(runif(2), 10, c(.7,.3), replace=TRUE)) #' #' stopifnot(isTRUE(all.equal(sin(inverse.rle(x)),inverse.rle(sin(x))))) #' stopifnot(inherits(try(cumprod(x)), "try-error")) #' @export Math.rle <- function(x, ...){ if(.Generic %in% c("cumsum", "cumprod", "cummax", "cummin")) stop(sQuote(paste0(.Generic,"()")), " method is not yet implemented for ", sQuote("rle"), " objects.") FUN <- match.fun(.Generic) structure(list(lengths = x$lengths, values = FUN(x$values, ...)), class = "rle") } #' Summary methods for [`rle`] objects. #' #' Summarisation functions for vectors described in [Summary] are implemented for [`rle`] objects. #' #' @param ... [`rle`] objects or objects that can be coerced to `rle`. #' @param na.rm Whether the missing values should be ignored (`TRUE`) or propagated (`FALSE`). #' #' @details Supported functions include all elements of the S3 #' [Summary] group. As of this writing, functions supported include #' (from R help) `all`, `any`, `max`, `min`, `prod`, `range`, and #' `sum`. #' #' @return In every supported case, the call should produce the same #' result as what would have resulted had the call been applied to #' the original (uncompressed) vector. (At no point in the #' calculation is the uncompressed vector actually constructed, of #' course.) The exception is that if `values` are of class #' `integer`, the result will nonetheless always be upcast to #' `numeric` to avert overflows. This behaviour may change in the #' future. #' #' @examples #' #' x <- rle(as.logical(rbinom(20,1,.7))) #' y <- rle(as.logical(rbinom(20,1,.3))) #' #' stopifnot(isTRUE(all.equal(any(x, y),any(inverse.rle(x), inverse.rle(y))))) #' stopifnot(isTRUE(all.equal(any(y),any(inverse.rle(y))))) #' #' stopifnot(isTRUE(all.equal(sum(inverse.rle(x),inverse.rle(y)),sum(x,y)))) #' stopifnot(isTRUE(all.equal(sum(inverse.rle(y)),sum(y)))) #' #' y$values[2:3] <- NA #' stopifnot(isTRUE(all.equal(sum(inverse.rle(y), na.rm=TRUE),sum(y, na.rm=TRUE)))) #' stopifnot(isTRUE(all.equal(sum(inverse.rle(y), na.rm=FALSE),sum(y, na.rm=FALSE)))) #' #' @export Summary.rle <- function(..., na.rm){ FUN <- match.fun(.Generic) inl <- list(...) # If it's just one, strip the length-zero runs and evaluate. if(length(inl) == 1L){ x <- as.rle(inl[[1L]]) keep <- x$lengths!=0L # TODO: Benchmark whether it's better to first check if # any(!keep) or, better yet, write a .Call() function that # returns a flag indicating that as a part of calculating keep. x$values <- x$values[keep] x$lengths <- x$lengths[keep] switch(.Generic, sum = sum(x$values*as.numeric(x$lengths), na.rm = na.rm), prod = prod(x$values^as.numeric(x$lengths), na.rm = na.rm), FUN(x$values, na.rm=na.rm)) # The rest only test existence. }else{ # Otherwise, break up, evaluate individually, and recombine. do.call(FUN, c(lapply(inl, FUN, na.rm=na.rm), na.rm=na.rm)) } } #' A generic function for compressing a data structure. #' #' @param x the object to be compressed. #' #' @param ... additional arguments to methods. #' #' @export compress <- function(x, ...){ UseMethod("compress") } #' Compress the [`rle`] object by merging adjacent runs #' #' @param x an [`rle`] object. #' #' @param ... additional objects; if given, all arguments are #' concatenated. #' #' @note Since [`rle`] stores run lengths as integers, [`compress.rle`] #' will not merge runs that add up to lengths greater than what can #' be represented by a 32-bit signed integer #' (\Sexpr{.Machine$integer.max}). #' #' @examples #' #' x <- rle(as.logical(rbinom(10,1,.7))) #' y <- rle(as.logical(rbinom(10,1,.3))) #' #' stopifnot(identical(rle(inverse.rle(x)&inverse.rle(y)),compress(x&y))) #' #' big <- structure(list(lengths=as.integer(rep(.Machine$integer.max/4,6)), #' values=rep(TRUE,6)), class="rle") #' #' stopifnot(all(aggregate(as.numeric(lengths)~values, #' data=as.data.frame(unclass(big)),FUN=sum) #' == #' aggregate(as.numeric(lengths)~values, #' data=as.data.frame(unclass(compress(big))), #' FUN=sum))) #' @export compress.rle <- function(x, ...){ # First, strip the 0-length runs. x$values <- x$values[x$lengths!=0L] x$lengths <- x$lengths[x$lengths!=0L] # Second, code distinct values as integers if they are not already. remap <- ! storage.mode(x$values) %in% c("integer","logical") if(remap){ vf <- as.integer(as.factor(x$values)) vf[is.na(vf)] <- 0L # NA runs get coded 0. }else vf <- x$values # Third, call the C code to produce the mapping onto the compressed vector. compinfo <- .Call("compress_RLE", x$lengths, vf, remap) # Lastly, rebuild the rle with the combined lengths and remapped values. structure(list(lengths = compinfo$lengths[seq_len(compinfo$nruns)], values = if(remap) x$values[compinfo$vali[seq_len(compinfo$nruns)]] else compinfo$vali[seq_len(compinfo$nruns)]), class = "rle") } #' @rdname rle-methods #' #' @examples #' #' stopifnot(isTRUE(all.equal(mean(inverse.rle(x)),mean(x)))) #' stopifnot(isTRUE(all.equal(mean(inverse.rle(y)),mean(y)))) #' #' @export mean.rle <- function(x, na.rm = FALSE, ...){ if(na.rm) sum(x$values*as.numeric(x$lengths), na.rm = TRUE, ...)/sum(!is.na(x)) else sum(x$values*as.numeric(x$lengths), na.rm = FALSE, ...)/length(x) } #' @rdname rle-methods #' #' @note The [`length`] method returns the length of the vector #' represented by the object, obtained by summing the lengths of #' individual runs. This can be overridden by setting #' `options(rle.unclass_index = FALSE)`, which causes it to #' return the length of the underlying representation (usually 2) instead. #' #' @examples #' #' stopifnot(isTRUE(all.equal(length(inverse.rle(x)),length(x)))) #' stopifnot(isTRUE(all.equal(length(inverse.rle(y)),length(y)))) #' #' @export length.rle <- function(x){ if(!is.null(rle_unclass_index <- getOption("rle.unclass_index")) && rle_unclass_index) length(unclass(x)) else sum(as.numeric(x$lengths)) } #' @rdname rle-methods #' #' @examples #' x$values[1] <- NA #' y$values[1] <- NA #' stopifnot(isTRUE(all.equal(is.na(inverse.rle(x)),inverse.rle(is.na(x))))) #' stopifnot(isTRUE(all.equal(is.na(inverse.rle(y)),inverse.rle(is.na(y))))) #' #' @export is.na.rle <- function(x){ x$values <- is.na(x$values) x } #' A [`rep`] method for [`rle`] objects #' #' @param x an [`rle`] object. #' #' @param ... see documentation for [`rep`]. #' #' @param scale whether to replicate the elements of the #' RLE-compressed vector or the runs. #' #' @param doNotCompress,doNotCompact whether the method should call #' [`compress.rle`] the results before returning. Methods liable to #' produce very long output vectors, like [`rep`], have this set #' `FALSE` by default. `doNotCompact` is an old name for this argument. #' #' @note The [`rep`] method for [`rle`] objects is very limited at #' this time. Even though the default setting is to replicate #' elements of the vector, only the run-replicating functionality is #' implemented at this time except for the simplest case (scalar #' `times` argument). #' #' @examples #' #' x <- rle(sample(c(-1,+1), 10, c(.7,.3), replace=TRUE)) #' y <- rpois(length(x$lengths), 2) #' #' stopifnot(isTRUE(all.equal(rep(inverse.rle(x), rep(y, x$lengths)), #' inverse.rle(rep(x, y, scale="run"))))) #' #' stopifnot(isTRUE(all.equal(rep(inverse.rle(x), max(y)), #' inverse.rle(rep(x, max(y), scale="element"))))) #' #' @export rep.rle <- function(x, ..., scale = c("element", "run"), doNotCompact = FALSE, doNotCompress = doNotCompact){ if(!missing(doNotCompact)) .Deprecated(msg=paste("Argument", sQuote("doNotCompact="), "to", sQuote("rep.rle()"), "is deprecated and has been renamed to", sQuote("doNotCompress="), ".")) scale <- match.arg(scale) ddd <- list(...) if(is.null(names(ddd)) && length(ddd)==1) names(ddd) <- "times" if(scale=="element" && length(ddd$times)!=1) stop("RLE on element scale is not supported at this time for vector ",sQuote("times")," argument.") if(length(x$lengths)==length(ddd$times)){ # This handles the specific scale="run" AND times is vector of appropriate length case. tmp <- mapply(function(v, l, times){ newl <- .run_mul(l, times) newv <- rep(v, length(newl)) list(l = newl, v = newv) }, x$values, x$lengths, ddd$times, SIMPLIFY=FALSE) x$values <- as.vector(unlist(sapply(tmp, `[[`, "v"))) x$lengths <- as.integer(unlist(sapply(tmp, `[[`, "l"))) }else{ # This handles the scale="run" OR times is scalar case. x$values <- rep(x$values, ...) x$lengths <- rep(x$lengths, ...) } if(doNotCompress) x else compress(x) } #' Coerce to [`rle`] if not already an [`rle`] object #' #' @param x the object to be coerced. #' #' @export as.rle <- function(x){ UseMethod("as.rle") } #' @rdname as.rle #' @export as.rle.rle <- function(x) x #' @rdname as.rle #' @export as.rle.default <- function(x){ #' @importFrom methods is if(is(x, "rle")) x else rle(x) } #' @rdname rle-methods #' #' @examples #' #' str(x) #' #' @export str.rle <- function(object, ...){ # This is needed because `str` needs the length of the underlying # list rather than that represented by the RLE. op <- options(rle.unclass_index = TRUE) on.exit(options(op)) NextMethod("str") } rle/R/rle-deprecated.R0000644000176200001440000000122113713374324014243 0ustar liggesusers# File R/rle-deprecated.R in package rle, currently hosted at https://github.com/statnet/rle . # # This software is distributed under the GNU General Public License Version 3 or later. # A copy of this license may be found at https://www.gnu.org/licenses/gpl-3.0.en.html . # # Copyright 2017-2020 Pavel N. Krivitsky and others (see inst/COPYRIGHT). ####################################################################### #' @name rle-deprecated #' @title Deprecated functions from `rle` #' @param ... arguments to deprecated functions. NULL #' @rdname rle-deprecated #' @export compact.rle <- function(...){ .Deprecated("compress") compress(...) } rle/R/AAA.R0000644000176200001440000000330213713401160011734 0ustar liggesusers# File R/AAA.R in package rle, currently hosted at https://github.com/statnet/rle . # # This software is distributed under the GNU General Public License Version 3 or later. # A copy of this license may be found at https://www.gnu.org/licenses/gpl-3.0.en.html . # # Copyright 2017-2020 Pavel N. Krivitsky and others (see inst/COPYRIGHT). ####################################################################### #' @name rle-package #' @title The `rle` Package #' @description Common [`base`] and [`stats`] #' methods for [`rle`] objects, aiming to make it possible to treat #' them transparently as vectors. #' #' @section History: #' #' This package grew out of the needs of the `ergm` package for a #' run-length encoded representation of extremely long vectors with a #' small number of contiguous runs, and these functions were originally #' implemented in the `statnet.common` package. #' #' It has been split out into its own package to enable others to use #' this functionality without installing any unnecessary dependencies #' and to facilitate contributions under a simplified license. #' #' @section What works and what doesn't: #' #' The long-run aim of this package is to make it possible to treat #' [`rle`] objects transparently as unnamed vectors. As of this #' writing, the biggest unimplemented feature are: #' #' * The indexing (`[` and `[[`) operators. It is not possible to #' extract or replace individual elements of the vector represented #' by an `rle` object, though it is possible to access its #' underlying representation (i.e., `$lenths` and `$values`) by #' name using any of the above operators or the `$` operator. #' * Method [`rep.rle`] currently has limited functionality. NULL rle/NEWS.md0000644000176200001440000000010713701735714012140 0ustar liggesusers# rle 1.0 Initial release, split out of the `statnet.common` package. rle/MD50000644000176200001440000000221513733326342011352 0ustar liggesusersadfb8b8683e6594a419dbf084ef48350 *DESCRIPTION e4f98991edeab94ff23da6c3385e715b *NAMESPACE c3f3aab4e21a398d20b1dfb0fb040efc *NEWS 2f878f644aadea90527a5beb6b34a84f *NEWS.md bb751e0465165cd2677fd81cd903c2b5 *R/AAA.R 9310514a0286a7e760812bdecbddf7af *R/rle-deprecated.R 8498a8195926a8daa01d36e492992737 *R/rle_future.R fd76fffd08c8b50aee9ee5bb899366f1 *R/rle_utils.R bb3741d9a47ca8300310857c044123a9 *R/zzz.R 66b3b2f057d6cbb312a8f6ed53357c5b *build/rle.pdf fdc4e9cdaf79dda3ac4dcc3735cce668 *inst/COPYRIGHT f88e9776da9f1c20ebd352b135d4a9dc *man/Extract.rle.Rd 3f39cc47a560e0901a87cf07ccd374b6 *man/Math.rle.Rd 7c151e3a58f890df910a37621820b262 *man/Ops.rle.Rd 9b28be5fb83fb558f83ed668bdc65c08 *man/Summary.rle.Rd c0a14a655b3c6a49502121cbd6581bae *man/as.rle.Rd ff3ab13a1ab7611d675d8dfab20b3832 *man/compress.Rd 32b104b56211ddd3639cab15e6f28b4d *man/compress.rle.Rd 6ac030618d1243a535718d2deefd2921 *man/rep.rle.Rd 9790e53b10cf887e68ae0e5af39781b2 *man/rle-deprecated.Rd c8020c8f589b55b23a66b3253b82b178 *man/rle-methods.Rd de6adddc467f88f3a7d99a1f6a74efe8 *man/rle-package.Rd 221bb4ad434e9c9ae233d3ded814c982 *src/init.c a8ad6d7ca70c31622de5fcf48972a096 *src/rle_utils.c rle/inst/0000755000176200001440000000000013732016214012010 5ustar liggesusersrle/inst/COPYRIGHT0000644000176200001440000000037413732016214013307 0ustar liggesusersCopyright 2017-2020 * Pavel N. Krivitsky * The following institutions, as a part of their intellectual property policies, may assert copyright over parts of the code in this package: * University of Wollongong (2017-2019) * UNSW Sydney (2019-2020)